package open.dolphin.client;
import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.*;
import java.beans.EventHandler;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import open.dolphin.delegater.DocumentDelegater;
import open.dolphin.delegater.OrcaDelegater;
import open.dolphin.delegater.OrcaDelegaterFactory;
import open.dolphin.delegater.StampDelegater;
import open.dolphin.helper.DBTask;
import open.dolphin.infomodel.*;
import open.dolphin.order.StampEditor;
import open.dolphin.project.Project;
import open.dolphin.stampbox.StampTreeNode;
import open.dolphin.table.ListTableModel;
import open.dolphin.table.StripeTableCellRenderer;
import open.dolphin.util.BeanUtils;
import open.dolphin.util.MMLDate;
/**
* DiagnosisDocument
*
* @author Kazushi Minagawa, Digital Globe, Inc.
*/
public final class DiagnosisDocument extends AbstractChartDocument implements PropertyChangeListener {
// 傷病名テーブルのカラム番号定義
private static final int DIAGNOSIS_COL = 0;
private static final int CATEGORY_COL = 1;
private static final int OUTCOME_COL = 2;
private static final int START_DATE_COL = 3;
private static final int END_DATE_COL = 4;
// GUI コンポーネント定義
private static final String ORCA_RECORD = "ORCA";
private static final String DORCA_RECORD = "DORCA";
private static final String DORCA_UPDATED = "DORCA_UPDATED";
private final String[] columnToolTips;
private static final Color ORCA_BACK = ClientContext.getColor("color.CALENDAR_BACK");
//s.oh^ 2013/05/10 傷病名対応
// 傷病名手入力時につけるコード
private static final String HAND_CODE = "0000999";
//s.oh$
private JTable diagTable; // 病歴テーブル
private ListTableModel<RegisteredDiagnosisModel> tableModel; // TableModel
private JComboBox extractionCombo; // 抽出期間コンボ
private JTextField countField; // 件数フィールド
private AbstractAction addAction; // 新規病名エディタ
private AbstractAction deleteAction; // 既存傷病名の削除
private AbstractAction updateAction; // 既存傷病名の転帰等の更新
private AbstractAction orcaAction; // ORCA action
private AbstractAction activeAction; // active病名のみ表示
private AbstractAction copyAction; // copy
private AbstractAction copyAsTextAction; // copyAsText
private AbstractAction pasteAction; // paste
// 昇順降順フラグ
private boolean ascend;
// アクティブ病名のみ表示
private boolean activeOnly;
// 検索開始日
private Date searchFrom;
// 新規に追加された傷病名リスト
List<RegisteredDiagnosisModel> addedDiagnosis;
// 更新された傷病名リスト
List<RegisteredDiagnosisModel> updatedDiagnosis;
// このドキュメントがオープンされた時の Dolphinの傷病名件数
private int diagnosisCount;
private boolean DEBUG;
// 制御 Flag
private boolean orcaDiceaseHasImported;
private boolean underPopup;
//s.oh^ 2014/04/08 傷病名対応
private boolean saveOnly;
//s.oh$
/**
* Creates new DiagnosisDocument
*/
public DiagnosisDocument() {
// Resource injection
java.util.ResourceBundle bundle = ClientContext.getMyBundle(DiagnosisDocument.class);
String title = bundle.getString("title.diagnosisDocument");
setTitle(title);
// カラムのToolTipText
String toolTip0 = bundle.getString("column1ToolTips");
String toolTip1 = bundle.getString("column2ToolTips");
String toolTip2 = bundle.getString("column3ToolTips");
String toolTip3 = bundle.getString("column4ToolTips");
columnToolTips = new String[]{null,toolTip0,toolTip1,toolTip2,toolTip3};
}
/**
* GUI コンポーネントを生成初期化する。
*/
private void initialize() {
// Project から昇順降順を設定する
ascend = Project.getBoolean(Project.DIAGNOSIS_ASCENDING, false);
// Projectからアクティブ病名のみを表示するかどうか設定する
activeOnly = Project.getBoolean("diagnosis.activeOnly");
// コマンドボタンパネルを生成する
JPanel cmdPanel = createButtonPanel2();
// Dolphin 傷病歴パネルを生成する
JPanel dolphinPanel = createDignosisPanel();
// 抽出期間パネルを生成する
JPanel filterPanel = createFilterPanel();
JPanel content = new JPanel(new BorderLayout(0, 7));
content.add(cmdPanel, BorderLayout.NORTH);
content.add(dolphinPanel, BorderLayout.CENTER);
content.add(filterPanel, BorderLayout.SOUTH);
// 全体をレイアウトする
JPanel myPanel = getUI();
myPanel.setLayout(new BorderLayout(0, 7));
myPanel.add(content);
myPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 11, 11));
}
/**
* コマンドボタンパネルをする。
*/
private JPanel createButtonPanel2() {
//Deleted minagawa comments to make clear
// 更新ボタン
final java.util.ResourceBundle bundle = ClientContext.getMyBundle(DiagnosisDocument.class);
String actionText = bundle.getString("actionText.save");
String toolTipText = bundle.getString("toolTipText.action.save");
updateAction = new AbstractAction(actionText, ClientContext.getImageIconArias("icon_save_small")) {
@Override
public void actionPerformed(ActionEvent ae) {
save();
}
};
updateAction.setEnabled(false);
JButton updateButton = new JButton(updateAction);
updateButton.setToolTipText(toolTipText);
// 削除ボタン
actionText = bundle.getString("actionText.delete");
toolTipText = bundle.getString("toolTipText.action.delete");
deleteAction = new AbstractAction(actionText, ClientContext.getImageIconArias("icon_delete_small")) {
@Override
public void actionPerformed(ActionEvent ae) {
delete2();
}
};
deleteAction.setEnabled(false);
JButton deleteButton = new JButton(deleteAction);
deleteButton.setToolTipText(toolTipText);
// 新規登録ボタン
actionText = bundle.getString("actionText.add");
toolTipText = bundle.getString("toolTipText.action.add");
addAction = new AbstractAction(actionText, ClientContext.getImageIconArias("icon_add_small")) {
@Override
public void actionPerformed(ActionEvent ae) {
}
};
JButton addButton = new JButton(addAction);
if (!getContext().isReadOnly()) {
addButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (!e.isPopupTrigger()) {
// ASP StampBox が選択されていて傷病名Treeがない場合がある
if (getContext().getChartMediator().hasTree(IInfoModel.ENTITY_DIAGNOSIS)) {
JPopupMenu popup = new JPopupMenu();
getContext().getChartMediator().addDiseaseMenu(popup);
popup.show(e.getComponent(), e.getX(), e.getY());
} else {
Toolkit.getDefaultToolkit().beep();
String msg1 = bundle.getString("warning.stampbox.0");
String msg2 = bundle.getString("warning.stampBox.1");
Object obj = new String[]{msg1, msg2};
String title = bundle.getString("dialogTile.add");
Component comp = getUI();
JOptionPane.showMessageDialog(comp, obj, ClientContext.getFrameTitle(title), JOptionPane.INFORMATION_MESSAGE);
}
}
}
});
}
// Depends on readOnly prop
addAction.setEnabled(!getContext().isReadOnly());
addButton.setToolTipText(toolTipText);
// ORCA View
actionText = bundle.getString("actionText.orca");
toolTipText = bundle.getString("toolTipText.action.Orca");
orcaAction = new AbstractAction(actionText, ClientContext.getImageIconArias("icon_import_orca_diagnosis")) {
@Override
public void actionPerformed(ActionEvent ae) {
viewOrca();
}
};
orcaAction.setEnabled(!getContext().isReadOnly());
JButton orcaButton = new JButton(orcaAction);
orcaButton.setToolTipText(toolTipText);
// ボタンパネル
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
// 評価の場合でServer-ORCAのケース^
if (Project.canAccessToOrca()) {
p.add(Box.createHorizontalStrut(5));
p.add(orcaButton);
}
// 評価の場合$
p.add(Box.createHorizontalGlue());
p.add(deleteButton);
p.add(Box.createHorizontalStrut(5));
p.add(addButton);
p.add(Box.createHorizontalStrut(5));
p.add(updateButton);
return p;
}
/**
* 既傷病歴テーブルを生成する。
*/
private JPanel createDignosisPanel() {
// Table 仕様
String[] columnNames = ClientContext.getStringArray("diagnosis.columnNames");
String[] methodNames = ClientContext.getStringArray("diagnosis.methodNames");
Class[] columnClasses = new Class[]{String.class, String.class, String.class, String.class, String.class};
int startNumRows = 0;
// Diagnosis テーブルモデルを生成する
tableModel = new ListTableModel<RegisteredDiagnosisModel>(columnNames, startNumRows, methodNames, columnClasses) {
// Diagnosisは編集不可
@Override
public boolean isCellEditable(int row, int col) {
// licenseCodeで制御
if (isReadOnly()) {
return false;
}
// 病名レコードが存在しない場合は false
RegisteredDiagnosisModel entry = getObject(row);
if (entry == null) {
return false;
}
// ORCA に登録されている病名の場合
if (isOrcaDisease(entry)) {
return false;
}
// それ以外はカラムに依存する
boolean editable = true;
editable = editable && (col == CATEGORY_COL || col == OUTCOME_COL || col == START_DATE_COL || col == END_DATE_COL);
return editable;
}
// オブジェクトの値を設定する
@Override
public void setValueAt(Object value, int row, int col) {
RegisteredDiagnosisModel entry = getObject(row);
if (entry == null || value == null) {
return;
}
switch (col) {
case DIAGNOSIS_COL:
break;
case CATEGORY_COL:
// JComboBox から選択
String saveCategory = entry.getCategory();
DiagnosisCategoryModel dcm = (DiagnosisCategoryModel) value;
String test = dcm.getDiagnosisCategory();
test = test != null && (!test.equals("")) ? test : null;
if (saveCategory == null && test != null) {
entry.setCategory(dcm.getDiagnosisCategory());
entry.setCategoryDesc(dcm.getDiagnosisCategoryDesc());
entry.setCategoryCodeSys(dcm.getDiagnosisCategoryCodeSys());
fireTableRowsUpdated(row, row);
addUpdatedList(entry);
} else if (saveCategory != null && test == null) {
entry.setDiagnosisCategoryModel(null);
fireTableRowsUpdated(row, row);
addUpdatedList(entry);
} else if (saveCategory != null && test != null && (!saveCategory.equals(test))) {
entry.setCategory(dcm.getDiagnosisCategory());
entry.setCategoryDesc(dcm.getDiagnosisCategoryDesc());
entry.setCategoryCodeSys(dcm.getDiagnosisCategoryCodeSys());
fireTableRowsUpdated(row, row);
addUpdatedList(entry);
}
break;
case OUTCOME_COL:
// JComboBox から選択
String saveOutcome = entry.getOutcome();
DiagnosisOutcomeModel dom = (DiagnosisOutcomeModel) value;
test = dom.getOutcome();
test = (test != null && !test.equals("") && !test.startsWith("-")) ? test : null;
if (saveOutcome == null && test != null) {
entry.setOutcome(dom.getOutcome());
entry.setOutcomeDesc(dom.getOutcomeDesc());
entry.setOutcomeCodeSys(dom.getOutcomeCodeSys());
// 疾患終了日を入れる
if (Project.getBoolean("autoOutcomeInput", false)) {
String val = entry.getEndDate();
if (val == null || val.equals("")) {
GregorianCalendar gc = new GregorianCalendar();
int offset = Project.getInt(Project.OFFSET_OUTCOME_DATE, -7);
gc.add(Calendar.DAY_OF_MONTH, offset);
String today = MMLDate.getDate(gc);
entry.setEndDate(today);
}
}
fireTableRowsUpdated(row, row);
addUpdatedList(entry);
} else if (saveOutcome != null && test == null) {
entry.setDiagnosisOutcomeModel(null);
fireTableRowsUpdated(row, row);
addUpdatedList(entry);
} else if (saveOutcome != null && test != null && (!saveOutcome.equals(test))) {
entry.setOutcome(dom.getOutcome());
entry.setOutcomeDesc(dom.getOutcomeDesc());
entry.setOutcomeCodeSys(dom.getOutcomeCodeSys());
// 疾患終了日を入れる
if (Project.getBoolean("autoOutcomeInput", false)) {
String val = entry.getEndDate();
if (val == null || val.equals("")) {
GregorianCalendar gc = new GregorianCalendar();
int offset = Project.getInt(Project.OFFSET_OUTCOME_DATE, -7);
gc.add(Calendar.DAY_OF_MONTH, offset);
String today = MMLDate.getDate(gc);
entry.setEndDate(today);
}
}
fireTableRowsUpdated(row, row);
addUpdatedList(entry);
}
break;
case START_DATE_COL:
String strVal = (String) value;
if (!strVal.trim().equals("")) {
entry.setStartDate(strVal);
fireTableRowsUpdated(row, row);
addUpdatedList(entry);
}
break;
case END_DATE_COL:
strVal = ((String) value).trim();
System.err.println(strVal);
strVal = strVal.equals("") ? null : strVal;
entry.setEndDate(strVal);
fireTableRowsUpdated(row, row);
addUpdatedList(entry);
break;
}
}
};
// 傷病歴テーブルを生成する
diagTable = new JTable(tableModel) {
@Override
protected JTableHeader createDefaultTableHeader() {
return new JTableHeader(columnModel) {
@Override
public String getToolTipText(MouseEvent e) {
//String tip = null;
java.awt.Point p = e.getPoint();
int index = columnModel.getColumnIndexAtX(p.x);
int realIndex = columnModel.getColumn(index).getModelIndex();
return columnToolTips[realIndex];
}
};
}
};
// 奇数、偶数行の色分けをする
DolphinOrcaRenderer rederer = new DolphinOrcaRenderer();
rederer.setTable(diagTable);
rederer.setDefaultRenderer();
// 行高
diagTable.setRowHeight(ClientContext.getMoreHigherRowHeight());
// ??
diagTable.setSurrendersFocusOnKeystroke(true);
// 行選択が起った時のリスナを設定する
diagTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
diagTable.setRowSelectionAllowed(true);
ListSelectionModel m = diagTable.getSelectionModel();
m.addListSelectionListener((ListSelectionEvent e) -> {
if (!e.getValueIsAdjusting()) {
controllActions();
}
});
FocusListener fl = new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
// 編集が開始された
disableActions();
}
@Override
public void focusLost(FocusEvent e) {
// 編集が終了もしくは esc
if (!underPopup) {
controllActions();
}
}
};
// Category comboBox 入力を設定する
String[] values = ClientContext.getStringArray("diagnosis.category");
String[] descs = ClientContext.getStringArray("diagnosis.categoryDesc");
String[] codeSys = ClientContext.getStringArray("diagnosis.categoryCodeSys");
DiagnosisCategoryModel[] categoryList = new DiagnosisCategoryModel[values.length + 1];
DiagnosisCategoryModel dcm = new DiagnosisCategoryModel();
dcm.setDiagnosisCategory("");
dcm.setDiagnosisCategoryDesc("");
dcm.setDiagnosisCategoryCodeSys("");
categoryList[0] = dcm;
for (int i = 0; i < values.length; i++) {
dcm = new DiagnosisCategoryModel();
dcm.setDiagnosisCategory(values[i]);
dcm.setDiagnosisCategoryDesc(descs[i]);
dcm.setDiagnosisCategoryCodeSys(codeSys[i]);
categoryList[i + 1] = dcm;
}
JComboBox categoryCombo = new JComboBox(categoryList);
TableColumn column = diagTable.getColumnModel().getColumn(CATEGORY_COL);
column.setCellEditor(new DefaultCellEditor(categoryCombo));
categoryCombo.addFocusListener(fl);
// Outcome comboBox 入力を設定する
String[] ovalues = ClientContext.getStringArray("diagnosis.outcome2");
String[] odescs = ClientContext.getStringArray("diagnosis.outcomeDesc2");
String ocodeSys = ClientContext.getString("diagnosis.outcomeCodeSys");
DiagnosisOutcomeModel[] outcomeList = new DiagnosisOutcomeModel[ovalues.length + 1];
DiagnosisOutcomeModel dom = new DiagnosisOutcomeModel();
dom.setOutcome("");
dom.setOutcomeDesc("");
dom.setOutcomeCodeSys("");
outcomeList[0] = dom;
for (int i = 0; i < ovalues.length; i++) {
dom = new DiagnosisOutcomeModel();
dom.setOutcome(ovalues[i]);
dom.setOutcomeDesc(odescs[i]);
dom.setOutcomeCodeSys(ocodeSys);
outcomeList[i + 1] = dom;
}
JComboBox outcomeCombo = new JComboBox(outcomeList);
column = diagTable.getColumnModel().getColumn(OUTCOME_COL);
column.setCellEditor(new DefaultCellEditor(outcomeCombo));
outcomeCombo.addFocusListener(fl);
// Start Date && EndDate Col にポップアップカレンダーを設定する
// IME を OFF にする
String datePattern = ClientContext.getString("common.pattern.mmlDate");
column = diagTable.getColumnModel().getColumn(START_DATE_COL);
JTextField tf = new JTextField();
tf.addFocusListener(AutoRomanListener.getInstance());
tf.addFocusListener(fl);
PopupListener pl1 = new PopupListener(tf, new int[]{-12, 0});
tf.setDocument(new RegexConstrainedDocument(datePattern));
DefaultCellEditor de = new DefaultCellEditor(tf);
column.setCellEditor(de);
int clickCountToStart = Project.getInt("diagnosis.table.clickCountToStart", 1);
de.setClickCountToStart(clickCountToStart);
column = diagTable.getColumnModel().getColumn(END_DATE_COL);
tf = new JTextField();
tf.addFocusListener(AutoRomanListener.getInstance());
tf.addFocusListener(fl);
tf.setDocument(new RegexConstrainedDocument(datePattern));
PopupListener pl2 = new PopupListener(tf, new int[]{-2, 2});
de = new DefaultCellEditor(tf);
column.setCellEditor(de);
de.setClickCountToStart(clickCountToStart);
//-----------------------------------------------
// TransferHandler を設定する
//-----------------------------------------------
if (!getContext().isReadOnly()) {
diagTable.setTransferHandler(new DiagnosisTransferHandler(this));
diagTable.setDragEnabled(true);
}
//-----------------------------------------------
// Copy,Paste,CopyAsText 機能を実装する
// Copy,Paste: 日本語で表示するため proxy actionが必要
//-----------------------------------------------
java.util.ResourceBundle bundle = ClientContext.getMyBundle(DiagnosisDocument.class);
String actionText = bundle.getString("actionText.copy");
copyAction = new AbstractAction(actionText) {
@Override
public void actionPerformed(ActionEvent ae) {
Action a = diagTable.getActionMap().get(TransferHandler.getCopyAction().getValue(Action.NAME));
if (a != null) {
a.actionPerformed(new ActionEvent(diagTable,
ActionEvent.ACTION_PERFORMED,
null));
}
}
};
diagTable.getActionMap().put("Copy", copyAction);
actionText = bundle.getString("actionText.paste");
pasteAction = new AbstractAction(actionText) {
@Override
public void actionPerformed(ActionEvent ae) {
Action a = diagTable.getActionMap().get(TransferHandler.getPasteAction().getValue(Action.NAME));
if (a != null) {
a.actionPerformed(new ActionEvent(diagTable,
ActionEvent.ACTION_PERFORMED,
null));
}
}
};
diagTable.getActionMap().put("Paste", pasteAction);
actionText = bundle.getString("actionText.copyAsText");
copyAsTextAction = new AbstractAction(actionText) {
@Override
public void actionPerformed(ActionEvent ae) {
copyAsText();
}
};
//-------------------------------------------------
// Copy menu を加える
//-------------------------------------------------
diagTable.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent me) {
}
@Override
public void mouseEntered(MouseEvent me) {
}
@Override
public void mouseExited(MouseEvent me) {
}
@Override
public void mousePressed(MouseEvent me) {
mabeShowPopup(me);
}
@Override
public void mouseReleased(MouseEvent me) {
mabeShowPopup(me);
}
public void mabeShowPopup(MouseEvent e) {
if (!e.isPopupTrigger()) {
return;
}
int row = diagTable.rowAtPoint(e.getPoint());
RegisteredDiagnosisModel obj = tableModel.getObject(row);
int selected = diagTable.getSelectedRow();
JPopupMenu contextMenu = new JPopupMenu();
if (row < 0 || row != selected || obj == null) {
contextMenu.add(new JMenuItem(pasteAction));
pasteAction.setEnabled(canPaste());
} else {
// ORCA 病名かどうか
boolean selectedIsOrca = true;
selectedIsOrca = selectedIsOrca && (obj.getStatus()!=null && obj.getStatus().equals(ORCA_RECORD));
//s.oh^ 2013/03/22 不要機能の削除(すぐに対応できないため)
//contextMenu.add(new JMenuItem(copyAction));
//s.oh$
contextMenu.add(new JMenuItem(pasteAction));
contextMenu.addSeparator();
contextMenu.add(new JMenuItem(copyAsTextAction));
contextMenu.addSeparator();
contextMenu.add(new JMenuItem(deleteAction));
pasteAction.setEnabled(canPaste());
deleteAction.setEnabled(!selectedIsOrca);
}
//s.oh^ 2014/04/02 閲覧権限の制御
if(isReadOnly()) {
deleteAction.setEnabled(false);
}
//s.oh$
contextMenu.show(e.getComponent(), e.getX(), e.getY());
}
});
// Layout
JScrollPane scroller = new JScrollPane(diagTable,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
JPanel p = new JPanel(new BorderLayout());
p.add(scroller, BorderLayout.CENTER);
return p;
}
/**
* 抽出期間パネルを生成する。
*/
private JPanel createFilterPanel() {
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p.add(Box.createHorizontalStrut(7));
// 抽出期間コンボボックス
java.util.ResourceBundle bundle = ClientContext.getMyBundle(DiagnosisDocument.class);
String labelTextExtraction = bundle.getString("labelText.extraction");
p.add(new JLabel(labelTextExtraction));
NameValuePair[] extractionObjects = ClientContext.getNameValuePair("diagnosis.combo.period");
extractionCombo = new JComboBox(extractionObjects);
//s.oh^ 2014/08/13 コントロールサイズ調整
String nimbus = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";
String laf = UIManager.getLookAndFeel().getClass().getName();
if(!laf.equals(nimbus)) {
extractionCombo.setPreferredSize(new Dimension(80, 20));
}
//s.oh$
int currentDiagnosisPeriod = Project.getInt(Project.DIAGNOSIS_PERIOD, 0);
int selectIndex = NameValuePair.getIndex(String.valueOf(currentDiagnosisPeriod), extractionObjects);
extractionCombo.setSelectedIndex(selectIndex);
extractionCombo.addItemListener((ItemListener) EventHandler.create(ItemListener.class, this, "extPeriodChanged", ""));
JPanel comboPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
comboPanel.add(extractionCombo);
// Active 病名のみ表示 ToDo
String actionText = bundle.getString("actionText.activeDiceaseOnly");
activeAction = new AbstractAction(actionText) {
@Override
public void actionPerformed(ActionEvent ae) {
activeOnly = !activeOnly;
getDiagnosisHistory();
}
};
JCheckBox activeBox = new JCheckBox();
activeBox.setSelected(activeOnly);
activeBox.setAction(activeAction);
comboPanel.add(activeBox);
p.add(comboPanel);
p.add(Box.createHorizontalGlue());
// 件数フィールド
countField = new JTextField(2);
countField.setEditable(false);
JPanel countPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 0));
String labelTextNumRecords = bundle.getString("labelText.numrecords");
countPanel.add(new JLabel(labelTextNumRecords));
countPanel.add(countField);
p.add(countPanel);
p.add(Box.createHorizontalStrut(7));
p.setBorder(BorderFactory.createEmptyBorder(0, 0, 7, 0));
return p;
}
/**
* 抽出期間を変更した場合に再検索を行う。
* ORCA 病名ボタンが disable であれば検索後に enable にする。
* @param e
*/
public void extPeriodChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
getDiagnosisHistory();
}
}
public JTable getDiagnosisTable() {
return diagTable;
}
@Override
public void start() {
// GUI 初期化
initialize();
super.enter();
getDiagnosisHistory();
}
@Override
public void stop() {
if (tableModel != null) {
tableModel.clear();
}
}
@Override
public void enter() {
super.enter();
// pPaneに汎用スタンプに病名がセットされていた場合を追加する
// 病名<->KarteEditorの切替を想定しその都度 addDroppedDiagnosisを実行する
addDroppedDiagnosis();
}
/**
* 新規傷病名リストに追加する。
* @param added 追加されたRegisteredDiagnosisModel
*/
private void addAddedList(RegisteredDiagnosisModel added) {
if (addedDiagnosis == null) {
addedDiagnosis = new ArrayList<>(5);
}
addedDiagnosis.add(added);
controllActions();
}
private void addAllAddedList(List<RegisteredDiagnosisModel> list) {
if (addedDiagnosis == null) {
addedDiagnosis = new ArrayList<>(5);
}
addedDiagnosis.addAll(list);
controllActions();
}
private boolean isOrcaDisease(RegisteredDiagnosisModel test) {
return (test!=null && test.getStatus()!=null && test.getStatus().equals(ORCA_RECORD));
}
private boolean isDorcaDisease(RegisteredDiagnosisModel test) {
return (test!=null && test.getStatus()!=null && test.getStatus().equals(DORCA_RECORD));
}
private boolean isDorcaUpdatedDisease(RegisteredDiagnosisModel test) {
return (test!=null && test.getStatus()!=null && test.getStatus().equals(DORCA_UPDATED));
}
private boolean isPureDisease(RegisteredDiagnosisModel test) {
return (test!=null && test.getStatus()!=null && test.getStatus().equals(IInfoModel.STATUS_FINAL));
}
/**
* 更新リストに追加する。
* @param updated 更新されたRegisteredDiagnosisModel
*/
private void addUpdatedList(RegisteredDiagnosisModel updated) {
// ディタッチオブジェクトの時
if (updated.getId() != 0L) {
// 更新リストに追加する
if (updatedDiagnosis == null) {
updatedDiagnosis = new ArrayList<>(5);
}
// 同じものが再度更新されているケースを除く
if (!updatedDiagnosis.contains(updated)) {
updatedDiagnosis.add(updated);
}
controllActions();
} // 新規に追加された病名(まだ保存されていない)のケース
// addedDiagnosis に追加されているので updatedDiagnosisには入れない
else if (isDorcaDisease(updated)) {
// DORCA 病名の場合 -> DORCA_UPDATED -> CLAIM送信
//System.err.println(updated.getDiagnosis());
updated.setStatus(DORCA_UPDATED);
}
}
/**
* 追加及び更新リストをクリアする。
*/
private void clearDiagnosisList() {
if (addedDiagnosis != null && addedDiagnosis.size() > 0) {
while (addedDiagnosis.size() > 0) {
addedDiagnosis.remove(0);
}
}
if (updatedDiagnosis != null && updatedDiagnosis.size() > 0) {
while (updatedDiagnosis.size() > 0) {
updatedDiagnosis.remove(0);
}
}
controllActions();
}
private void controllActions() {
controllUpdateAction();
controllDeleteAction();
controllOrcaAction();
controllAddAction();
}
/**
* 更新ボタンを制御する。
*/
// 傷病名の削除(ORCA送信) 2013/06/24
private void controllUpdateAction() {
if (isReadOnly()) {
updateAction.setEnabled(false);
return;
}
boolean hasAdded = (addedDiagnosis != null && addedDiagnosis.size() > 0);
boolean hasUpdated = (updatedDiagnosis != null && updatedDiagnosis.size() > 0);
boolean newDirty = (hasAdded || hasUpdated);
setDirty(newDirty);
updateAction.setEnabled(isDirty());
}
// 削除ボタンをコントロールする
private void controllDeleteAction() {
// licenseCode 制御を追加
if (isReadOnly()) {
deleteAction.setEnabled(false);
return;
}
// 選択された行のオブジェクトを得る
int row = diagTable.getSelectedRow();
RegisteredDiagnosisModel rd = tableModel.getObject(row);
// ヌルの場合
if (rd == null) {
deleteAction.setEnabled(false);
return;
}
// ORCA の場合
if (isOrcaDisease(rd)) {
deleteAction.setEnabled(false);
return;
}
// Dolphin の場合
deleteAction.setEnabled(true);
}
private void controllAddAction() {
addAction.setEnabled(!isReadOnly());
}
private void controllOrcaAction() {
if (isReadOnly() || orcaDiceaseHasImported) {
orcaAction.setEnabled(false);
} else {
orcaAction.setEnabled(true);
}
}
private void disableActions() {
orcaAction.setEnabled(false);
deleteAction.setEnabled(false);
addAction.setEnabled(false);
updateAction.setEnabled(false);
}
/**
* 傷病名件数を返す。
* @return 傷病名件数
*/
public int getDiagnosisCount() {
return diagnosisCount;
}
/**
* 傷病名件数を設定する。
* @param cnt 傷病名件数
*/
public void setDiagnosisCount(int cnt) {
diagnosisCount = cnt;
try {
String val = String.valueOf(diagnosisCount);
countField.setText(val);
} catch (RuntimeException e) {
countField.setText("");
}
}
/**
* 傷病名スタンプを取得する worker を起動する。
* @param stampList
* @param insertRow
*/
public void importStampList(final List<ModuleInfoBean> stampList, final int insertRow) {
final StampDelegater sdl = new StampDelegater();
DBTask task = new DBTask<List<StampModel>, Void>(getContext()) {
@Override
protected List<StampModel> doInBackground() throws Exception {
List<StampModel> result = sdl.getStamp(stampList);
return result;
}
@Override
protected void succeeded(List<StampModel> list) {
trace("importStampList succeeded");
if (list != null) {
for (int i = list.size() - 1; i > -1; i--) {
insertStamp((StampModel) list.get(i), insertRow);
}
}
}
};
task.execute();
}
/**
* 傷病名スタンプをデータベースから取得しテーブルへ挿入する。
* Worker Thread で実行される。
* @param stampInfo
*/
private void insertStamp(StampModel sm, int row) {
if (sm != null) {
RegisteredDiagnosisModel module = (RegisteredDiagnosisModel) BeanUtils.xmlDecode(sm.getStampBytes());
//s.oh^ 2014/04/08 傷病名対応
boolean added = false;
if(tableModel != null && tableModel.getRowCount() > 0) {
for(int i = 0; i < tableModel.getRowCount(); i++) {
RegisteredDiagnosisModel model = tableModel.getObject(i);
if(module.getDiagnosis().equals(model.getDiagnosis())) {
SimpleDateFormat frmt = new SimpleDateFormat("yyyy-MM-dd");
String today = frmt.format(new Date());
String started = frmt.format(model.getStarted());
if(today.equals(started)) {
added = true;
break;
}
}
}
}
if(added) {
java.util.ResourceBundle bundle = ClientContext.getMyBundle(DiagnosisDocument.class);
String title = bundle.getString("title.optionPane.addDiagnosis");
String msgFmt = bundle.getString("messageFormat.dupuricateDiagnosis");
MessageFormat msf = new MessageFormat(msgFmt);
String msg = msf.format(new Object[]{module.getDiagnosis()});
title = ClientContext.getFrameTitle(title);
JOptionPane.showMessageDialog(getContext().getFrame(), msg, title, JOptionPane.INFORMATION_MESSAGE);
return;
}
//s.oh$
// 今日の日付を疾患開始日として設定する
GregorianCalendar gc = new GregorianCalendar();
String today = MMLDate.getDate(gc);
module.setStartDate(today);
row = tableModel.getObjectCount() == 0 ? 0 : row;
int cnt = tableModel.getObjectCount();
if (row == 0 && cnt == 0) {
tableModel.addObject(module);
} else if (row < cnt) {
tableModel.addObject(row, module);
} else {
tableModel.addObject(module);
}
//s.oh^ 2014/03/13 傷病名削除診療科対応
String deptCode = null;
String deptName = null;
if(getContext().getPatientVisit() != null && getContext().getPatientVisit().getDeptCode() != null && getContext().getPatientVisit().getDeptName() != null) {
deptCode = getContext().getPatientVisit().getDeptCode();
deptName = getContext().getPatientVisit().getDeptName();
}else if(Project.getUserModel() != null && Project.getUserModel().getDepartmentModel() != null && Project.getUserModel().getDepartmentModel().getDepartment() != null && Project.getUserModel().getDepartmentModel().getDepartmentDesc() != null) {
deptCode = Project.getUserModel().getDepartmentModel().getDepartment();
deptName = Project.getUserModel().getDepartmentModel().getDepartmentDesc();
}else{
}
module.setDepartment(deptCode);
module.setDepartmentDesc(deptName);
//s.oh$
// row を選択する
diagTable.getSelectionModel().setSelectionInterval(row, row);
addAddedList(module);
}
}
/**
* 傷病名エディタを開く。
*/
public void openEditor2() {
Window lock = SwingUtilities.getWindowAncestor(this.getUI());
StampEditor editor = new StampEditor("diagnosis", this, lock);
}
/**
* 傷病名エディタからデータを受け取りテーブルへ追加する。
* @param e
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
ArrayList list = (ArrayList) e.getNewValue();
if (list == null || list.isEmpty()) {
return;
}
int len = list.size();
// 今日の日付を疾患開始日として設定する
GregorianCalendar gc = new GregorianCalendar();
String today = MMLDate.getDate(gc);
if (ascend) {
// 昇順なのでテーブルの最後へ追加する
for (int i = 0; i < len; i++) {
RegisteredDiagnosisModel module = (RegisteredDiagnosisModel) list.get(i);
module.setStartDate(today);
tableModel.addObject(module);
addAddedList(module);
}
} else {
// 降順なのでテーブルの先頭へ追加する
for (int i = len - 1; i > -1; i--) {
RegisteredDiagnosisModel module = (RegisteredDiagnosisModel) list.get(i);
module.setStartDate(today);
tableModel.addObject(0, module);
addAddedList(module);
}
}
}
private boolean isValidOutcome(RegisteredDiagnosisModel rd) {
if (rd.getOutcome() == null) {
return true;
}
String start = rd.getStartDate();
String end = rd.getEndDate();
java.util.ResourceBundle bundle = ClientContext.getMyBundle(DiagnosisDocument.class);
if (start == null) {
String warning = bundle.getString("warning.noStartDate");
String title = bundle.getString("dialogText.checkDiagnosis");
JOptionPane.showMessageDialog(
getContext().getFrame(),
warning,
ClientContext.getFrameTitle(title),
JOptionPane.WARNING_MESSAGE);
return false;
}
if (end == null) {
String warning = bundle.getString("warning.noEndDate");
String title = bundle.getString("dialogText.checkDiagnosis");
JOptionPane.showMessageDialog(
getContext().getFrame(),
warning,
ClientContext.getFrameTitle(title),
JOptionPane.WARNING_MESSAGE);
return false;
}
Date startDate = null;
Date endDate = null;
boolean formatOk = true;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
start = start.replaceAll("/", "-");
end = end.replaceAll("/", "-");
startDate = sdf.parse(start);
endDate = sdf.parse(end);
} catch (Exception e) {
String warning = bundle.getString("message.inputDateFormat");
String title = bundle.getString("dialogText.checkDiagnosis");
JOptionPane.showMessageDialog(
getContext().getFrame(),
warning,
ClientContext.getFrameTitle(title),
JOptionPane.WARNING_MESSAGE);
formatOk = false;
}
if (!formatOk) {
return false;
}
if (endDate.before(startDate)) {
String warning = bundle.getString("warning.endDateIsBeforeStart");
String title = bundle.getString("dialogText.checkDiagnosis");
JOptionPane.showMessageDialog(
getContext().getFrame(),
warning,
ClientContext.getFrameTitle(title),
JOptionPane.WARNING_MESSAGE);
return false;
}
return true;
}
/**
* 新規及び変更された傷病名を保存する。
*/
@Override
public void save() {
// 空の場合
if ((addedDiagnosis == null || addedDiagnosis.isEmpty()) &&
(updatedDiagnosis == null || updatedDiagnosis.isEmpty())) {
//minagawa^ この処理が必要な場合はバグ
if (boundSupport!=null) {
setChartDocDidSave(true);
return;
}
//minagawa$
return;
}
//final boolean sendDiagnosis = Project.getBoolean(Project.SEND_DIAGNOSIS) && ((ChartImpl) getContext()).getCLAIMListener() != null ? true : false;
// 2012-07 Client送信|サーバー送信のケースがあるので変更
// 評価でServer-ORCAのケースがある->Context側で考慮
final boolean sendDiagnosis = getContext().isSendClaim();
trace("sendDiagnosis = " + sendDiagnosis);
// continue to save
Date confirmed = new Date();
trace("confirmed = " + confirmed);
String confirmedStr = ModelUtils.getDateTimeAsString(confirmed);
boolean go = true;
//s.oh^ 2014/03/13 傷病名削除診療科対応
String deptCode = null;
String deptName = null;
if(getContext().getPatientVisit() != null && getContext().getPatientVisit().getDeptCode() != null && getContext().getPatientVisit().getDeptName() != null) {
deptCode = getContext().getPatientVisit().getDeptCode();
deptName = getContext().getPatientVisit().getDeptName();
}else if(Project.getUserModel() != null && Project.getUserModel().getDepartmentModel() != null && Project.getUserModel().getDepartmentModel().getDepartment() != null && Project.getUserModel().getDepartmentModel().getDepartmentDesc() != null) {
deptCode = Project.getUserModel().getDepartmentModel().getDepartment();
deptName = Project.getUserModel().getDepartmentModel().getDepartmentDesc();
}else{
}
//s.oh$
if (addedDiagnosis != null && addedDiagnosis.size() > 0) {
for (RegisteredDiagnosisModel rd : addedDiagnosis) {
trace("added rd = " + rd.getDiagnosis());
trace("id = " + rd.getId());
// 開始日、終了日はテーブルから取得している
// TODO confirmed, recorded
rd.setKarteBean(getContext().getKarte()); // Karte
rd.setUserModel(Project.getUserModel()); // Creator
rd.setConfirmed(confirmed); // 確定日
rd.setRecorded(confirmed); // 記録日
//minagawa^ 2013/04/17 ORCAから取り込んだ病名を保存できない(副作用ありそう...)
// // DORCA || DORCA_UPDATE 病名の status は変えない
// if ((!isDorcaDisease(rd)) && (!isDorcaUpdatedDisease(rd))) {
// // Status Final を設定する
// rd.setStatus(IInfoModel.STATUS_FINAL);
// }
//s.oh^ 2013/05/07 副作用があるため元に戻した。
//rd.setStatus(IInfoModel.STATUS_FINAL);
if ((!isDorcaDisease(rd)) && (!isDorcaUpdatedDisease(rd))) {
// Status Final を設定する
rd.setStatus(IInfoModel.STATUS_FINAL);
//s.oh^ 2013/05/10 傷病名対応
}else{
rd.setStatus(IInfoModel.STATUS_FINAL);
//s.oh$
}
//s.oh$
//minagawa$
// 開始日=適合開始日 not-null
if (rd.getStarted() == null) {
rd.setStarted(confirmed);
}
// TODO トラフィック
rd.setPatientLiteModel(getContext().getPatient().patientAsLiteModel());
rd.setUserLiteModel(Project.getUserModel().getLiteModel());
//s.oh^ 2014/03/13 傷病名削除診療科対応
// if(rd.getDepartment() != null && rd.getDepartmentDesc() == null) {
// if(Project.getDeptInfo() == null || Project.getDeptInfo().size() <= 0) {
// JOptionPane.showMessageDialog(getContext().getFrame(), "ORCAから診療科の取得に失敗したため、診療科は保存されません。", "傷病名の保存", JOptionPane.INFORMATION_MESSAGE);
// Log.outputFuncLog(Log.LOG_LEVEL_0, Log.FUNCTIONLOG_KIND_WARNING, "ORCAから診療科の取得に失敗したため、診療科は保存されません。", "傷病名の保存");
// }else{
// for(int i = 0; i < Project.getDeptInfo().size(); i++) {
// String tmp = Project.getDeptInfo().get(i);
// if(tmp.equals(rd.getDepartment())) {
// rd.setDepartmentDesc(Project.getDeptInfo().get(i+1));
// break;
// }
// }
// }
// }else if(rd.getDepartment() != null && rd.getDepartmentDesc() != null) {
// // 既に傷病名に登録されているため何もしない
// }else{
// rd.setDepartment(deptCode);
// rd.setDepartmentDesc(deptName);
// }
rd.setDepartment(deptCode);
rd.setDepartmentDesc(deptName);
//s.oh$
// 転帰をチェックする
if (!isValidOutcome(rd)) {
go = false;
break;
}
}
}
if (!go) {
return;
}
if (updatedDiagnosis != null && updatedDiagnosis.size() > 0) {
for (RegisteredDiagnosisModel rd : updatedDiagnosis) {
trace("updated rd = " + rd.getDiagnosis());
trace("id = " + rd.getId());
// 現バージョンは上書きしている
rd.setKarteBean(getContext().getKarte()); // Karte
rd.setUserModel(Project.getUserModel()); // Creator
rd.setConfirmed(confirmed);
rd.setRecorded(confirmed);
// updatedList へ入っているのは detuched object のみ
rd.setStatus(IInfoModel.STATUS_FINAL);
// TODO トラフィック
rd.setPatientLiteModel(getContext().getPatient().patientAsLiteModel());
rd.setUserLiteModel(Project.getUserModel().getLiteModel());
//s.oh^ 2014/03/13 傷病名削除診療科対応
// if(rd.getDepartment() != null && rd.getDepartmentDesc() == null) {
// if(Project.getDeptInfo() == null || Project.getDeptInfo().size() <= 0) {
// JOptionPane.showMessageDialog(getContext().getFrame(), "ORCAから診療科の取得に失敗したため、診療科は保存されません。", "傷病名の保存", JOptionPane.INFORMATION_MESSAGE);
// Log.outputFuncLog(Log.LOG_LEVEL_0, Log.FUNCTIONLOG_KIND_WARNING, "ORCAから診療科の取得に失敗したため、診療科は保存されません。", "傷病名の保存");
// }else{
// for(int i = 0; i < Project.getDeptInfo().size(); i++) {
// String tmp = Project.getDeptInfo().get(i);
// if(tmp.equals(rd.getDepartment())) {
// rd.setDepartmentDesc(Project.getDeptInfo().get(i+1));
// }
// }
// }
// }else if(rd.getDepartment() != null && rd.getDepartmentDesc() != null) {
// // 既に傷病名に登録されているため何もしない
// }else{
// rd.setDepartment(deptCode);
// rd.setDepartmentDesc(deptName);
// }
rd.setDepartment(deptCode);
rd.setDepartmentDesc(deptName);
//s.oh$
// 転帰をチェックする
if (!isValidOutcome(rd)) {
go = false;
break;
}
}
}
if (!go) {
return;
}
DocumentDelegater ddl = new DocumentDelegater();
//s.oh^ 2014/04/08 傷病名対応
//DiagnosisPutTask task = new DiagnosisPutTask(confirmedStr, getContext(), addedDiagnosis, updatedDiagnosis, sendDiagnosis, ddl);
DiagnosisPutTask task = new DiagnosisPutTask(confirmedStr, getContext(), addedDiagnosis, updatedDiagnosis, (saveOnly) ? false : sendDiagnosis, ddl);
//s.oh$
task.execute();
}
/**
* PPane病名をインポートする。
*/
public void addDroppedDiagnosis() {
List<ModuleInfoBean> list = getContext().getDroppedDiagnosisList();
if (list!=null && list.size()>0) {
// clone
List<ModuleInfoBean> list2;
synchronized (list) {
list2 = new ArrayList<>(list.size());
while (list.size()>0) {
list2.add(list.remove(0));
}
}
importStampList(list2, 0);
// 傷病名の削除(GUI) 2013/06/24
} else {
// call されないので
controllActions();
}
}
/**
* 指定期間以降の傷病名を検索してテーブルへ表示する。
* バッググランドスレッドで実行される。
*/
//public void getDiagnosisHistory(final Date past) {
public void getDiagnosisHistory() {
NameValuePair pair = (NameValuePair) extractionCombo.getSelectedItem();
int past = Integer.parseInt(pair.getValue());
if (past != 0) {
GregorianCalendar today = new GregorianCalendar();
today.add(GregorianCalendar.MONTH, past);
today.clear(Calendar.HOUR_OF_DAY);
today.clear(Calendar.MINUTE);
today.clear(Calendar.SECOND);
today.clear(Calendar.MILLISECOND);
searchFrom = today.getTime();
} else {
searchFrom = new Date(0L);
}
// clear
if (addedDiagnosis!=null && addedDiagnosis.size()>0) {
addedDiagnosis.clear();
}
if (updatedDiagnosis!=null && updatedDiagnosis.size()>0) {
updatedDiagnosis.clear();
}
orcaDiceaseHasImported=false;
if (tableModel.getDataProvider()!=null) {
tableModel.getDataProvider().clear();
}
disableActions();
DBTask task = new DBTask<List<RegisteredDiagnosisModel>, Void>(getContext()) {
@Override
protected List<RegisteredDiagnosisModel> doInBackground() throws Exception {
DocumentDelegater ddl = new DocumentDelegater();
List<RegisteredDiagnosisModel> result = ddl.getDiagnosisList(getContext().getKarte().getId(), searchFrom, activeOnly);
return result;
}
@Override
protected void succeeded(List<RegisteredDiagnosisModel> list) {
if (list != null) {
if (ascend) {
Collections.sort(list);
} else {
Collections.sort(list, Collections.reverseOrder());
}
tableModel.setDataProvider(list);
setDiagnosisCount(list.size());
for(RegisteredDiagnosisModel rdm : list) {
}
} else {
tableModel.setDataProvider(new ArrayList<>(2));
}
addDroppedDiagnosis();
}
};
task.execute();
}
/**
* 選択されている行をコピーする。
*/
public void copyAsText() {
StringBuilder sb = new StringBuilder();
int numRows = diagTable.getSelectedRowCount();
int[] rowsSelected = diagTable.getSelectedRows();
int numColumns = diagTable.getColumnCount();
for (int i = 0; i < numRows; i++) {
if (tableModel.getObject(rowsSelected[i]) != null) {
StringBuilder s = new StringBuilder();
for (int col = 0; col < numColumns; col++) {
Object o = diagTable.getValueAt(rowsSelected[i], col);
if (o!=null) {
s.append(o.toString());
}
s.append(",");
}
if (s.length()>0) {
s.setLength(s.length()-1);
}
sb.append(s.toString()).append("\n");
}
}
if (sb.length() > 0) {
StringSelection stsel = new StringSelection(sb.toString());
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stsel, stsel);
}
}
private boolean canPaste() {
// Clipboard内のTransferable
Transferable tr = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
if (tr==null) {
return false;
}
// 病名ペースト
if (tr.isDataFlavorSupported(InfoModelTransferable.infoModelFlavor)) {
return true;
}
// StampTreeNodeペースト
if (tr.isDataFlavorSupported(LocalStampTreeNodeTransferable.localStampTreeNodeFlavor)) {
try {
StampTreeNode node = (StampTreeNode)tr.getTransferData(LocalStampTreeNodeTransferable.localStampTreeNodeFlavor);
boolean ok = node.isLeaf();
ok = ok && (((ModuleInfoBean)node.getUserObject()).getEntity().equals(IInfoModel.ENTITY_DIAGNOSIS));
return ok;
} catch (UnsupportedFlavorException | IOException ex) {
ex.printStackTrace(System.err);
}
}
return false;
}
//minagawa^ LSC 1.4 傷病名の削除(GUI) 2013/06/24
public void delete2() {
// 選択された行のオブジェクトを取得する
final int row = diagTable.getSelectedRow();
final RegisteredDiagnosisModel model = (RegisteredDiagnosisModel)tableModel.getObject(row);
if (model==null) {
return;
}
//s.oh^ 2014/04/08 傷病名対応
// String yes = "はい";
// String no = "いいえ";
// String title = "傷病名削除";
// Object[] options = new Object[]{yes, no};
// String msg = "この傷病名を削除しますか? \n" + model.getDiagnosisName();
java.util.ResourceBundle bundle = ClientContext.getMyBundle(DiagnosisDocument.class);
String optionDelete = bundle.getString("optionText.delete");
String optionCancel = GUIFactory.getCancelButtonText();
Object[] options = new Object[]{optionDelete, optionCancel};
String title = bundle.getString("title.optionPane.delete");
title = ClientContext.getFrameTitle(title);
String msgFormat = bundle.getString("messageFormat.deleteDiagnosis");
MessageFormat msf = new MessageFormat(msgFormat);
String msg = msf.format(new Object[]{model.getDiagnosisName()});
int select = JOptionPane.showOptionDialog(
getContext().getFrame(),
msg,
title,
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
optionCancel);
if(select != 0) {
return;
}
//s.oh$
//s.oh^ 2014/03/13 傷病名削除診療科対応
// if(model.getDepartment() == null || model.getDepartmentDesc() == null) {
// if(Project.getDeptInfo() != null && Project.getDeptInfo().size() > 0) {
// Object[] deptNames = Project.getDeptInfo().toArray();
// Object dept = JOptionPane.showInputDialog(getContext().getFrame(), "診療科を選択してください。", "傷病名の削除", JOptionPane.INFORMATION_MESSAGE, null, deptNames, deptNames[0]);
// if(dept == null || dept.toString().length() <= 0) {
// //JOptionPane.showMessageDialog(getContext().getFrame(), "", "傷病名の削除", JOptionPane.INFORMATION_MESSAGE);
// Log.outputFuncLog(Log.LOG_LEVEL_0, Log.FUNCTIONLOG_KIND_INFORMATION, "診療科を選択してください", "傷病名の削除", "キャンセルを押されました");
// return;
// }
// Log.outputFuncLog(Log.LOG_LEVEL_0, Log.FUNCTIONLOG_KIND_INFORMATION, "診療科を選択してください", "傷病名の削除", dept.toString());
// String[] deptInfo = dept.toString().split(":");
// model.setDepartment(deptInfo[0]);
// model.setDepartmentDesc(deptInfo[1]);
// }else{
// JOptionPane.showMessageDialog(getContext().getFrame(), "ORCAから診療科の取得に失敗したため、ログインユーザーの診療科で送信されます。", "傷病名の削除", JOptionPane.INFORMATION_MESSAGE);
// Log.outputFuncLog(Log.LOG_LEVEL_0, Log.FUNCTIONLOG_KIND_WARNING, "ORCAから診療科の取得に失敗したため、ログインユーザーの診療科で送信されます。", "傷病名の削除");
// model.setDepartment(Project.getUserModel().getDepartmentModel().getDepartment());
// model.setDepartmentDesc(Project.getUserModel().getDepartmentModel().getDepartmentDesc());
// }
// }
//s.oh$
// まだデータベースに登録されていないデータの場合
if (model.getId()==0L) {
int indexToremove = -1;
for (int i = 0; i <addedDiagnosis.size(); i++) {
RegisteredDiagnosisModel r = addedDiagnosis.get(i);
if (r==model) {
indexToremove = i;
break;
}
}
if (indexToremove>=0 && indexToremove<addedDiagnosis.size()) {
addedDiagnosis.remove(indexToremove);
}
tableModel.deleteAt(row);
controllActions();
return;
}
// ディタッチオブジェクトの場合はデータベースから削除する
// && 転帰を delete にして ORCA へ 送信する
Date confirmed = new Date();
final String confirmedStr = ModelUtils.getDateTimeAsString(confirmed);
model.setOutcome("delete");
model.setOutcomeDesc("delete");
model.setOutcomeCodeSys(ClientContext.getString("diagnosis.outcomeCodeSys"));
//s.oh^ 2014/01/28 傷病名削除不具合
//model.setEndDate(confirmedStr);
//s.oh$
model.setKarteBean(getContext().getKarte()); // Karte
model.setUserModel(Project.getUserModel()); // Creator
model.setConfirmed(confirmed); // 確定日
model.setRecorded(confirmed); // 記録日
final List<RegisteredDiagnosisModel> list = new ArrayList(1);
//s.oh^ 2014/01/28 傷病名削除不具合
model.setPatientLiteModel(getContext().getPatient().patientAsLiteModel());
//s.oh$
list.add(model);
DBTask task = new DBTask<Void, Void>(getContext()) {
@Override
protected Void doInBackground() throws Exception {
// 送信ラッパーを生成する
DiagnosisSendWrapper wrapper = new DiagnosisSendWrapper();
wrapper.setDeletedDiagnosis(list);
//s.oh^ 2014/03/13 傷病名削除診療科対応(送信しないように変更)
//boolean sendDiagnosis = getContext().isSendClaim();
boolean sendDiagnosis = false;
//s.oh$
// 全てのモジュールで共通に使用するマスターのDocInfoを生成する
// 病名は複数あるので個々にDocInfoが必要。これはJMS側で生成する。
if (sendDiagnosis) {
// 送信フラグ & 確定日
wrapper.setSendClaim(true);
wrapper.setConfirmDate(confirmedStr);
// 生成目的
java.util.ResourceBundle mBundle = ClientContext.getBundle();
wrapper.setTitle(mBundle.getString("DEFAULT_DIAGNOSIS_TITLE"));
wrapper.setPurpose(IInfoModel.PURPOSE_RECORD);
//-------------------------------------------------------------------
// 2012-05 クレーム送信をJMS+MDB化: ChartImplの新規カルテモデルの生成と同じ
//-------------------------------------------------------------------
// 診療科関連
wrapper.setDepartment(getContext().getPatientVisit().getDeptCode());
wrapper.setDepartmentDesc(getContext().getPatientVisit().getDeptName());
// 担当医関連
wrapper.setCreatorName(Project.getUserModel().getCommonName()); // 担当医名
if (Project.getUserModel().getOrcaId()!=null) {
wrapper.setCreatorId(Project.getUserModel().getOrcaId()); // 担当医コード: ORCA ID がある場合
} else if (getContext().getPatientVisit().getDoctorId()!=null) {
wrapper.setCreatorId(getContext().getPatientVisit().getDoctorId());// 担当医コード: 受付でIDがある場合
} else {
wrapper.setCreatorId(Project.getUserModel().getUserId()); // 担当医コード: ログインユーザーID
}
wrapper.setCreatorLicense(Project.getUserModel().getLicenseModel().getLicense()); // 医療資格
// 施設関連
wrapper.setFacilityName(Project.getUserModel().getFacilityModel().getFacilityName());
wrapper.setJamariCode(getContext().getPatientVisit().getJmariNumber());
// ログ情報のために追加
String pid = getContext().getPatientVisit().getPatientId();
wrapper.setPatientId(pid);
wrapper.setPatientName(getContext().getPatient().getFullName());
wrapper.setPatientGender(getContext().getPatient().getGender());
}
// 保存 & claimSender=server の場合はこれで送信される
new DocumentDelegater().postPutSendDiagnosis(wrapper);
// Clientで送信する場合を追加
if (Project.claimSenderIsClient() && sendDiagnosis) {
IDiagnosisSender sender = new DiagnosisSender();
sender.setContext(getContext());
sender.prepare(list);
sender.send(list);
}
return null;
}
@Override
protected void succeeded(Void result) {
// 更新リストにある場合取り除く
if (updatedDiagnosis != null) {
int indexToremove = -1;
for (int i = 0; i <updatedDiagnosis.size(); i++) {
RegisteredDiagnosisModel r = updatedDiagnosis.get(i);
if (r==model) {
indexToremove = i;
break;
}
}
if (indexToremove>=0 && indexToremove<updatedDiagnosis.size()) {
updatedDiagnosis.remove(indexToremove);
}
}
// tableから remove
tableModel.deleteAt(row);
// action 更新
controllActions();
}
};
task.execute();
}
// /**
// * 選択された行のデータを削除する。
// */
// public void delete() {
//
// // 選択された行のオブジェクトを取得する
// final int row = diagTable.getSelectedRow();
// final RegisteredDiagnosisModel model = (RegisteredDiagnosisModel)tableModel.getObject(row);
// if (model==null) {
// return;
// }
//
// // まだデータベースに登録されていないデータの場合
// // テーブルから削除してリターンする
// if (model.getId()==0L) {
// //----------------------------------------------------
// // ???? addedDiagnosis.remove(model)!=valid
// //----------------------------------------------------
// int indexToremove = -1;
// for (int i = 0; i <addedDiagnosis.size(); i++) {
// RegisteredDiagnosisModel r = addedDiagnosis.get(i);
// if (r==model) {
// indexToremove = i;
// break;
// }
// }
//
// trace("indexToremove=" + indexToremove);
//
// if (indexToremove>=0 && indexToremove<addedDiagnosis.size()) {
// addedDiagnosis.remove(indexToremove);
// }
// tableModel.deleteAt(row);
////minagawa^ LSC 1.4 bug fix
// //controlUpdateAction();
// controllActions();
////minagawa$
// return;
// }
//
// // ディタッチオブジェクトの場合はデータベースから削除する
// // 削除の場合はその場でデータベースの更新を行う 2006-03-25
// final List<Long> list = new ArrayList(1);
// list.add(new Long(model.getId()));
//
// DBTask task = new DBTask<Void, Void>(getContext()) {
//
// @Override
// protected Void doInBackground() throws Exception {
// DocumentDelegater ddl = new DocumentDelegater();
// ddl.removeDiagnosis(list);
// return null;
// }
//
// @Override
// protected void succeeded(Void result) {
// // 更新リストにある場合
// // 更新リストから取り除く
// if (updatedDiagnosis != null) {
// //----------------------------------------------------
// // ???? updatedDiagnosis.remove(model)!=valid
// //----------------------------------------------------
// int indexToremove = -1;
// for (int i = 0; i <updatedDiagnosis.size(); i++) {
// RegisteredDiagnosisModel r = updatedDiagnosis.get(i);
// if (r==model) {
// indexToremove = i;
// break;
// }
// }
//
// trace("indexToremove=" + indexToremove);
//
// if (indexToremove>=0 && indexToremove<updatedDiagnosis.size()) {
// updatedDiagnosis.remove(indexToremove);
// }
// }
// tableModel.deleteAt(row);
// //minagawa^ LSC 1.4 bug fix
// //controlUpdateAction();
// controllActions();
////minagawa$
// }
// };
//
// task.execute();
// }
// /**
// * ORCAに登録されている病名を取り込む。(テーブルへ追加する)
// * 検索後、ボタンを disabled にする。
// */
// public void viewOrca() {
//
// // 患者IDを取得する
// final String patientId = getContext().getPatient().getPatientId();
//
// // 抽出期間から検索範囲の最初の日を取得する
// NameValuePair pair = (NameValuePair) extractionCombo.getSelectedItem();
// int past = Integer.parseInt(pair.getValue());
//
// // 検索開始日
// Date date = null;
// if (past != 0) {
// GregorianCalendar today = new GregorianCalendar();
// today.add(GregorianCalendar.MONTH, past);
// today.clear(Calendar.HOUR_OF_DAY);
// today.clear(Calendar.MINUTE);
// today.clear(Calendar.SECOND);
// today.clear(Calendar.MILLISECOND);
// date = today.getTime();
// } else {
// // 増田内科
// date = new Date(0L);
// }
// SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
// final String from = sdf.format(date);
//
// // 検索終了日=今日
// final String to = sdf.format(new Date());
// ClientContext.getBootLogger().debug("from = " + from);
// ClientContext.getBootLogger().debug("to = " + to);
//
// DBTask task = new DBTask<List<RegisteredDiagnosisModel>, Void>(getContext()) {
//
// @Override
// protected List<RegisteredDiagnosisModel> doInBackground() throws Exception {
// SqlOrcaView dao = new SqlOrcaView();
// List<RegisteredDiagnosisModel> result = dao.getOrcaDisease(patientId, from, to, ascend);
// if (dao.isNoError()) {
// return result;
// } else {
// throw new Exception(dao.getErrorMessage());
// }
// }
//
// @Override
// protected void succeeded(List<RegisteredDiagnosisModel> result) {
//
// // 空ならリターーンするしかない
// if (result==null || result.isEmpty()) {
// orcaAction.setEnabled(true);
// return;
// }
//
// // Dolphinに病名が登録されている場合は単純に参照として追加する
// if (diagnosisCount!=0) {
// refferenceAddOrca(result);
// return;
// }
//
// //-------------------------------------------
// // diagnosisCount==0 && !result.isEmpty()
// // ORCAに登録してある病名を取り込むかどうかを選択させる
// // 取り込む場合は status をクリアし + または DnD された
// // 新規病名として扱う
// // 取り込まない場合はそのままtableに追加する。
// //-------------------------------------------
// if (diagnosisCount==0) {
// String importYes = "取り込む";
// String importNo = "参照のみ";
// String title = "病名取り込み";
// Object[] cstOptions = new Object[]{importYes, importNo};
//
// String msg = "ORCAに登録してある病名を取り込みますか?";
// int select = JOptionPane.showOptionDialog(
// getContext().getFrame(),
// msg,
// ClientContext.getFrameTitle(title),
// JOptionPane.YES_NO_CANCEL_OPTION,
// JOptionPane.QUESTION_MESSAGE,
// ClientContext.getImageIcon("impt_32.gif"),
// cstOptions,
// importYes);
//
// if (select == 0) {
// // 取り込む -> DORCA 病名にする
// for (RegisteredDiagnosisModel rdm : result) {
// rdm.setStatus(DORCA_RECORD);
// }
// // 新規病名リストに追加する
// addAllAddedList(result);
// // disabledにする
// orcaAction.setEnabled(false);
// extractionCombo.setEnabled(false);
// //--------------------------------------------------------
// // もしtableに病名レコードがあれば(+ or DnD diagCount=0 で追加)
// // 全体をソートする
// //--------------------------------------------------------
// List<RegisteredDiagnosisModel> data = tableModel.getDataProvider();
// if (data!=null) {
// data.addAll(result);
// sortDiasease(data);
// tableModel.fireTableDataChanged();
//
// } else {
// sortDiasease(result);
// tableModel.setDataProvider(result);
// }
//
// } else {
// // 参照追加する
// refferenceAddOrca(result);
// }
// }
// }
// };
//
// task.execute();
// }
public void viewOrca() {
// 患者IDを取得する
final String patientId = getContext().getPatient().getPatientId();
DBTask task = new DBTask<List<RegisteredDiagnosisModel>, Void>(getContext()) {
@Override
protected List<RegisteredDiagnosisModel> doInBackground() throws Exception {
//SqlOrcaView dao = new SqlOrcaView();
OrcaDelegater dao = OrcaDelegaterFactory.create();
List<RegisteredDiagnosisModel> result = dao.getActiveOrcaDisease(patientId,ascend);
return result;
}
@Override
protected void succeeded(List<RegisteredDiagnosisModel> result) {
// 空ならリターーンするしかない
if (result==null || result.isEmpty()) {
orcaDiceaseHasImported = true;
controllActions();
return;
}
// Dolphinに病名が登録されている場合は単純に参照として追加する
if (diagnosisCount!=0) {
refferenceAddOrca(result);
return;
}
//-------------------------------------------
// diagnosisCount==0 && !result.isEmpty()
// ORCAに登録してある病名を取り込むかどうかを選択させる
// 取り込む場合は status をクリアし + または DnD された
// 新規病名として扱う
// 取り込まない場合はそのままtableに追加する。
//-------------------------------------------
if (diagnosisCount==0) {
java.util.ResourceBundle bundle = ClientContext.getMyBundle(DiagnosisDocument.class);
String importYes = bundle.getString("optionText.import");
String importNo = bundle.getString("optionText.reference");
String title = bundle.getString("dialogText.importDiagnosis");
Object[] cstOptions = new Object[]{importYes, importNo};
String msg = bundle.getString("message.importOrcaDiagnosis");
int select = JOptionPane.showOptionDialog(
getContext().getFrame(),
msg,
ClientContext.getFrameTitle(title),
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
cstOptions,
importYes);
if (select == 0) {
// 取り込む -> DORCA 病名にする
for (RegisteredDiagnosisModel rdm : result) {
rdm.setStatus(DORCA_RECORD);
//s.oh^ 2014/03/13 傷病名削除診療科対応
// ArrayList<String> deptInfo = Project.getDeptInfo();
// if(deptInfo != null && deptInfo.size() > 0) {
// for(int i = 0; i < deptInfo.size(); i++) {
// String[] dept = deptInfo.get(i).split(":");
// if(dept.length == 2) {
// if(rdm.getDepartment().equals(dept[0])) {
// rdm.setDepartmentDesc(dept[1]);
// break;
// }
// }
// }
// }
// Log.outputFuncLog(Log.LOG_LEVEL_3, Log.FUNCTIONLOG_KIND_INFORMATION, "ORCAから追加した傷病名の診療科情報:", rdm.getDepartment(), rdm.getDepartmentDesc());
//s.oh$
}
// 新規病名リストに追加する
addAllAddedList(result);
extractionCombo.setEnabled(false);
//--------------------------------------------------------
// もしtableに病名レコードがあれば(+ or DnD diagCount=0 で追加)
// 全体をソートする
//--------------------------------------------------------
List<RegisteredDiagnosisModel> data = tableModel.getDataProvider();
if (data!=null) {
data.addAll(result);
sortDiasease(data);
tableModel.fireTableDataChanged();
} else {
//sortDiasease(result);
tableModel.setDataProvider(result);
}
//s.oh^ 2014/04/08 傷病名対応
//JOptionPane.showMessageDialog(getContext().getFrame(), "取り込みが完了しました、傷病名を保存してください。", "傷病名の取り込み", JOptionPane.INFORMATION_MESSAGE);
//Log.outputFuncLog(Log.LOG_LEVEL_0, Log.FUNCTIONLOG_KIND_INFORMATION, "傷病名の取り込み", "取り込みが完了しました、傷病名を保存してください。");
saveOnly = true;
save();
saveOnly = false;
msg = bundle.getString("message.savingDiagnsosis");
title = bundle.getString("dialogText.importDicease");
title = ClientContext.getFrameTitle(title);
JOptionPane.showMessageDialog(getContext().getFrame(), msg, title, JOptionPane.INFORMATION_MESSAGE);
//s.oh$
} else if (select == 1){
// 参照追加する
refferenceAddOrca(result);
} else {
}
}
}
};
task.execute();
}
// ORCA病名を傷病名テーブルに参照追加する
private void refferenceAddOrca(List<RegisteredDiagnosisModel> result) {
tableModel.addAll(result);
orcaDiceaseHasImported=true;
controllActions();
}
private void sortDiasease(List<RegisteredDiagnosisModel> data) {
if (ascend) {
Collections.sort(data);
} else {
Collections.sort(data, Collections.reverseOrder());
}
}
/**
* 選択された診断を CLAIM 送信する
* 元町皮ふ科
*/
public void sendClaim() {
// 選択された診断を CLAIM 送信する
RegisteredDiagnosisModel rd;
List diagList = new ArrayList();
Date confirmed = new Date();
int rows[] = diagTable.getSelectedRows();
for (int row : rows) {
rd = (RegisteredDiagnosisModel) tableModel.getObject(row);
rd.setKarteBean(getContext().getKarte()); // Karte
rd.setUserModel(Project.getUserModel()); // Creator
rd.setConfirmed(confirmed); // 確定日
rd.setRecorded(confirmed); // 記録日
// 開始日=適合開始日 not-null
if (rd.getStarted() == null) {
rd.setStarted(confirmed);
}
rd.setPatientLiteModel(getContext().getPatient().patientAsLiteModel());
rd.setUserLiteModel(Project.getUserModel().getLiteModel());
// 転帰をチェックする
if (!isValidOutcome(rd)) return;
diagList.add(rd);
}
if (!diagList.isEmpty()) {
IDiagnosisSender sender = new DiagnosisSender();
sender.setContext(getContext());
sender.prepare(diagList);
sender.send(diagList);
}
}
private void trace(String msg) {
if (DEBUG) {
System.err.println(msg);
}
}
/**
* PopupListener
*/
class PopupListener extends MouseAdapter implements PropertyChangeListener {
private JPopupMenu popup;
private final JTextField tf;
private final int[] range;
public PopupListener(JTextField tf, int[] range) {
this.tf = tf;
this.range = range;
tf.addMouseListener(PopupListener.this);
}
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup = new JPopupMenu();
popup.addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
underPopup=true;
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
underPopup=false;
}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {
underPopup=false;
}
});
CalendarCardPanel cc = new CalendarCardPanel(ClientContext.getEventColorTable());
cc.addPropertyChangeListener(CalendarCardPanel.PICKED_DATE, this);
cc.setCalendarRange(range);
popup.insert(cc, 0);
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
@Override
public void propertyChange(PropertyChangeEvent e) {
if (e.getPropertyName().equals(CalendarCardPanel.PICKED_DATE)) {
SimpleDate sd = (SimpleDate) e.getNewValue();
tf.setText(SimpleDate.simpleDateToMmldate(sd));
popup.setVisible(false);
popup = null;
}
}
}
/**
* DiagnosisPutTask
*/
class DiagnosisPutTask extends DBTask<List<Long>, Void> {
// 確定日
private final String confirmedStr;
// 新規に追加された病名のリスト
private final List<RegisteredDiagnosisModel> added;
// 転帰等、更新された病名のリスト
private final List<RegisteredDiagnosisModel> updated;
// CLAIM送信を行う時 true
private final boolean sendClaim;
// Delegater
private final DocumentDelegater ddl;
public DiagnosisPutTask(
String confirmedStr,
Chart chart,
List<RegisteredDiagnosisModel> added,
List<RegisteredDiagnosisModel> updated,
boolean sendClaim,
DocumentDelegater ddl) {
super(chart);
this.confirmedStr = confirmedStr;
this.added = added;
this.updated = updated;
this.sendClaim = sendClaim;
this.ddl = ddl;
}
@Override
protected List<Long> doInBackground() throws Exception {
boolean hasAdded = (addedDiagnosis!=null && addedDiagnosis.size()>0);
boolean hasUpdated = (updatedDiagnosis!=null && updatedDiagnosis.size()>0);
if ( (!hasAdded) && (!hasUpdated)) {
String err = ClientContext.getMyBundle(DiagnosisDocument.class).getString("errMessage.noDiagnosis.toSend");
throw new RuntimeException(err);
}
// 送信ラッパーを生成する
DiagnosisSendWrapper wrapper = new DiagnosisSendWrapper();
if (hasAdded) {
wrapper.setAddedDiagnosis(addedDiagnosis);
}
if (hasUpdated) {
wrapper.setUpdatedDiagnosis(updatedDiagnosis);
}
// 全てのモジュールで共通に使用するマスターのDocInfoを生成する
// 病名は複数あるので個々にDocInfoが必要。これはJMS側で生成する。
if (sendClaim) {
// 送信フラグ & 確定日
wrapper.setSendClaim(true);
wrapper.setConfirmDate(confirmedStr);
// 生成目的
java.util.ResourceBundle mBundle = ClientContext.getBundle();
wrapper.setTitle(mBundle.getString("DEFAULT_DIAGNOSIS_TITLE"));
wrapper.setPurpose(IInfoModel.PURPOSE_RECORD);
//-------------------------------------------------------------------
// 2012-05 クレーム送信をJMS+MDB化: ChartImplの新規カルテモデルの生成と同じ
//-------------------------------------------------------------------
// 診療科関連
wrapper.setDepartment(getContext().getPatientVisit().getDeptCode());
wrapper.setDepartmentDesc(getContext().getPatientVisit().getDeptName());
// 担当医関連
wrapper.setCreatorName(Project.getUserModel().getCommonName()); // 担当医名
if (Project.getUserModel().getOrcaId()!=null) {
wrapper.setCreatorId(Project.getUserModel().getOrcaId()); // 担当医コード: ORCA ID がある場合
} else if (getContext().getPatientVisit().getDoctorId()!=null) {
wrapper.setCreatorId(getContext().getPatientVisit().getDoctorId());// 担当医コード: 受付でIDがある場合
} else {
wrapper.setCreatorId(Project.getUserModel().getUserId()); // 担当医コード: ログインユーザーID
}
wrapper.setCreatorLicense(Project.getUserModel().getLicenseModel().getLicense()); // 医療資格
// 施設関連
wrapper.setFacilityName(Project.getUserModel().getFacilityModel().getFacilityName());
wrapper.setJamariCode(getContext().getPatientVisit().getJmariNumber());
// ログ情報のために追加
String pid = getContext().getPatientVisit().getPatientId();
wrapper.setPatientId(pid);
wrapper.setPatientName(getContext().getPatient().getFullName());
wrapper.setPatientGender(getContext().getPatient().getGender());
}
// 保存 & claimSender=server の場合はこれで送信される
List<Long> result = ddl.postPutSendDiagnosis(wrapper);
// 2012-07 Clientで送信する場合を追加
if (Project.claimSenderIsClient() && sendClaim) {
sendDiagnosisClaim();
}
return result;
}
private void sendDiagnosisClaim() {
// CLAIM 送信の sender を作成
//ClaimSender sender = new ClaimSender(((ChartImpl) getContext()).getCLAIMListener());
//sender.setPatientVisitModel(getContext().getPatientVisit());
IDiagnosisSender sender = new DiagnosisSender();
sender.setContext(getContext());
// 元町皮ふ科
// 追加病名を CLAIM 送信する
// その際、DORCA病名を覗く(これはORCAにあってDolphinにインポートされ、転帰等の変更がないもの)
if (sendClaim && addedDiagnosis != null && addedDiagnosis.size() > 0) {
List<RegisteredDiagnosisModel> actualList = new ArrayList<>();
for (RegisteredDiagnosisModel rdm : addedDiagnosis) {
if (isDorcaUpdatedDisease(rdm) || isPureDisease(rdm)) {
//s.oh^ 2013/05/10 傷病名対応
rdm.setDiagnosisCode(HAND_CODE); // ORCAから取り込んだ場合、コードに0000999を設定する
//s.oh$
actualList.add(rdm);
}
}
if (!actualList.isEmpty()) {
if (DEBUG) {
trace("-------- Send Diagnosis List ----------------");
for (RegisteredDiagnosisModel r : actualList) {
trace(r.getDiagnosis());
}
}
//s.oh^ 2014/11/11 傷病名送信順番の変更
Collections.sort(actualList, new DiagnosisSendComparator());
//s.oh$
sender.prepare(actualList);
sender.send(actualList);
}
}
// 更新された病名を CLAIM 送信する
// detuched object のみ
if (sendClaim && updatedDiagnosis != null && updatedDiagnosis.size() > 0) {
List<RegisteredDiagnosisModel> actualList = new ArrayList<>();
if (DEBUG) {
trace("-------- Send Diagnosis List ----------------");
for (RegisteredDiagnosisModel r : updatedDiagnosis) {
trace(r.getDiagnosis());
}
}
//s.oh^ 2013/05/10 傷病名対応
for (RegisteredDiagnosisModel rdm : updatedDiagnosis) {
rdm.setDiagnosisCode(HAND_CODE); // ORCAから取り込んだ場合、コードに0000999を設定する
actualList.add(rdm);
}
//s.oh$
//s.oh^ 2014/11/11 傷病名送信順番の変更
//sender.prepare(updatedDiagnosis);
//sender.send(updatedDiagnosis);
Collections.sort(actualList, new DiagnosisSendComparator());
sender.prepare(actualList);
sender.send(actualList);
//s.oh$
}
}
// protected List<Long> doInBackgroundOld() throws Exception {
//
// // 更新病名を更新する
// if (updated != null && updated.size() > 0) {
// ddl.updateDiagnosis(updated);
// }
//
// List<Long> result = null;
//
// // 新規病名を保存する
// if (added != null && added.size() > 0) {
// result = ddl.putDiagnosis(added);
// for (int i = 0; i < added.size(); i++) {
// long pk = result.get(i).longValue();
// RegisteredDiagnosisModel rd = (RegisteredDiagnosisModel) added.get(i);
// rd.setId(pk);
// }
// }
//
// // CLAIM 送信の sender を作成
// //ClaimSender sender = new ClaimSender(((ChartImpl) getContext()).getCLAIMListener());
// //sender.setPatientVisitModel(getContext().getPatientVisit());
// IDiagnosisSender sender = new DiagnosisSender();
// sender.setContext(getContext());
//
// // 元町皮ふ科
// // 追加病名を CLAIM 送信する
// // その際、DORCA病名を覗く(これはORCAにあってDolphinにインポートされ、転帰等の変更がないもの)
// if (sendClaim && addedDiagnosis != null && addedDiagnosis.size() > 0) {
// List<RegisteredDiagnosisModel> actualList = new ArrayList<RegisteredDiagnosisModel>();
// for (RegisteredDiagnosisModel rdm : addedDiagnosis) {
// if (isDorcaUpdatedDisease(rdm) || isPureDisease(rdm)) {
// actualList.add(rdm);
// }
// }
// if (!actualList.isEmpty()) {
// if (DEBUG) {
// trace("-------- Send Diagnosis List ----------------");
// for (RegisteredDiagnosisModel r : actualList) {
// trace(r.getDiagnosis());
// }
// }
// sender.prepare(actualList);
// sender.send(actualList);
// }
// }
//
// // 更新された病名を CLAIM 送信する
// // detuched object のみ
// if (sendClaim && updatedDiagnosis != null && updatedDiagnosis.size() > 0) {
// if (DEBUG) {
// trace("-------- Send Diagnosis List ----------------");
// for (RegisteredDiagnosisModel r : updatedDiagnosis) {
// trace(r.getDiagnosis());
// }
// }
// sender.prepare(updatedDiagnosis);
// sender.send(updatedDiagnosis);
// }
//
// return result;
// }
@Override
protected void succeeded(List<Long> list) {
clearDiagnosisList();
//minagawa^ Chartの close box 押下で保存する場合、保存終了を通知しておしまい。
if (boundSupport!=null) {
setChartDocDidSave(true);
}
//minagawa$
//s.oh^ 2013/10/25 傷病名削除されない
// 保存したらidを取得するように再読込
getDiagnosisHistory();
//s.oh$
}
}
/**
* 傷病名用のTable Cell Renderer
* 奇数・偶数 の色分け
* ORCA病名の背景が green
*/
class DolphinOrcaRenderer extends StripeTableCellRenderer {
/** Creates new IconRenderer */
public DolphinOrcaRenderer() {
super();
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean isFocused,
int row, int col) {
super.getTableCellRendererComponent(table, value, isSelected, isFocused, row, col);
RegisteredDiagnosisModel rd = (RegisteredDiagnosisModel) tableModel.getObject(row);
if (isOrcaDisease(rd)) {
setBackground(ORCA_BACK);
if(isSelected) {
setBackground(table.getSelectionBackground());
setForeground(table.getSelectionForeground());
}
}
if (value != null) {
if (value instanceof String) {
this.setText((String) value);
} else {
this.setText(value.toString());
}
} else {
this.setText("");
}
return this;
}
}
//s.oh^ 2014/11/11 傷病名送信順番の変更
class DiagnosisSendComparator implements Comparator {
public DiagnosisSendComparator() {}
@Override
public int compare(Object o1, Object o2) {
if(o1 == null && o2 == null) {
return 0;
}else if(o1 == null) {
return 1;
}else if(o2 == null) {
return -1;
}
RegisteredDiagnosisModel val1 = (RegisteredDiagnosisModel)o1;
RegisteredDiagnosisModel val2 = (RegisteredDiagnosisModel)o2;
if(val1.getDiagnosisOutcomeModel() == null && val2.getDiagnosisOutcomeModel() == null) {
return 0;
}else if(val1.getDiagnosisOutcomeModel() == null) {
return 1;
}else if(val2.getDiagnosisOutcomeModel() == null) {
return -1;
}
if(val1.getDiagnosisCategoryModel() == null && val2.getDiagnosisCategoryModel() == null) {
return 0;
}else if(val1.getDiagnosisCategoryModel() == null) {
return 1;
}else if(val2.getDiagnosisCategoryModel() == null) {
return -1;
}
if(val1.getEnded() == null && val2.getEnded() == null) {
return 0;
}else if(val1.getEnded() == null) {
return 1;
}else if(val2.getEnded() == null) {
return -1;
}
return 0;
}
}
//s.oh$
}