package open.dolphin.impl.falco;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import open.dolphin.client.Chart;
import open.dolphin.client.IKarteSender;
import open.dolphin.exception.DolphinException;
import open.dolphin.infomodel.*;
import open.dolphin.project.Project;
/**
*
* @author Kazushi Minagawa. Digital Globe, Inc.
*/
public final class FalcoSender implements IKarteSender {
private static final String SDF_FORMAT = "yyyyMMddHHmmssSSS";
private Chart context;
private String insuranceFacilityId;
private String path;
private List<BundleDolphin> sendList;
private String orderNumber;
//s.oh^ 2013/12/12 予定カルテのオーダー対応
private Date orderDate;
//s.oh$
private static String createOrderNumber() {
StringBuilder sb = new StringBuilder();
sb.append("DL");
sb.append(new SimpleDateFormat(SDF_FORMAT).format(new Date()));
return sb.toString();
}
@Override
public Chart getContext() {
return context;
}
@Override
public void setContext(Chart context) {
this.context = context;
}
@Override
public void prepare(DocumentModel data) {
if (data==null || (!data.getDocInfoModel().isSendLabtest())) {
return;
}
// 保健医療機関コード
insuranceFacilityId = Project.getString(Project.SEND_LABTEST_FACILITY_ID);
if (insuranceFacilityId==null || insuranceFacilityId.length()<10) {
throw new DolphinException("保険医療機関コードが設定されていません。");
}
insuranceFacilityId+="00";
// 検査オーダーの出力先パス
path = Project.getString(Project.SEND_LABTEST_PATH);
if (path==null) {
throw new DolphinException("検体検査オーダーの出力先パスが設定されていません。");
}
// 検体検査オーダーを抽出する
List<ModuleModel> modules = data.getModules();
if (modules==null || modules.isEmpty()) {
return;
}
sendList = new ArrayList<>();
for (ModuleModel module : modules) {
//s.oh^ 2014/10/07 検体検査オーダー条件変更
//ModuleInfoBean info = module.getModuleInfoBean();
//if (info.getEntity().equals(IInfoModel.ENTITY_LABO_TEST)) {
// BundleDolphin send = (BundleDolphin)module.getModel();
// ClaimItem[] items = send.getClaimItem();
// if (items!=null && items.length>0) {
// sendList.add(send);
// }
//}
if(module.getModel() instanceof BundleDolphin) {
BundleDolphin send = (BundleDolphin)module.getModel();
if(send.getOrderName() != null && send.getOrderName().startsWith("検体検査")) {
ClaimItem[] items = send.getClaimItem();
if (items!=null && items.length>0) {
sendList.add(send);
}
}
}
//s.oh$
}
// オーダー番号を docInfo へ設定する
if (data.getDocInfoModel().getLabtestOrderNumber()==null) {
orderNumber = createOrderNumber();
data.getDocInfoModel().setLabtestOrderNumber(orderNumber);
} else {
// 修正の場合は設定されている
orderNumber = data.getDocInfoModel().getLabtestOrderNumber();
}
//s.oh^ 2013/12/12 予定カルテのオーダー対応
boolean tmp = IInfoModel.STATUS_TMP.equals(data.getDocInfoModel().getStatus());
boolean scheduled = data.getDocInfoModel().getFirstConfirmDate().after(data.getDocInfoModel().getConfirmDate());
if(tmp && scheduled) {
orderDate = data.getDocInfoModel().getFirstConfirmDate();
}
//s.oh$
}
@Override
public void send(DocumentModel data) {
if (data==null ||
(!data.getDocInfoModel().isSendLabtest()) ||
sendList.isEmpty() ||
insuranceFacilityId==null ||
path==null) {
return;
}
// 送信する
PatientModel patient = context.getPatient();
UserModel user = Project.getUserModel();
HL7Falco falco = new HL7Falco();
//s.oh^ 2013/12/12 予定カルテのオーダー対応
//falco.order(patient, user, sendList, insuranceFacilityId, orderNumber, path);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
falco.order(patient, user, sendList, insuranceFacilityId, orderNumber, path, (orderDate == null) ? null : sdf.format(orderDate));
//s.oh$
}
}