package open.dolphin.touch; import java.beans.XMLDecoder; import java.io.*; import java.util.*; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import open.dolphin.infomodel.*; import open.dolphin.touch.converter.IDocument; import open.dolphin.touch.converter.IPriscription; import open.dolphin.touch.session.IPhoneServiceBean; //import open.dolphin.msg.ServerPrescriptionPDFMaker; import open.dolphin.session.KarteServiceBean; import open.dolphin.touch.converter.IDocument2; import org.codehaus.jackson.map.ObjectMapper; /** * REST Web Service * * @author kazushi Minagawa, Digital Globe, Inc. */ @Path("/touch") public class DolphinResource extends AbstractResource { private static final String ELEMENT_PATIENT_VISIT_START = "<patientVisit>"; private static final String ELEMENT_PATIENT_VISIT_END = "</patientVisit>"; private static final String ELEMENT_PVT_DATE = "pvtDate"; private static final String ELEMENT_PVT_STATUS = "pvtStatus"; //s.oh^ 2013/11/05 iPhone/iPadの受付リストに保険を追加 private static final String ELEMENT_PVT_F_INS = "pvtFirstInsurance"; // add funabashi 20131103 //s.oh$ private static final String ELEMENT_ADDRESS_START = "<address>"; private static final String ELEMENT_ADDRESS_END = "</address>"; private static final String ELEMENT_ZIP_CODE = "zipCode"; private static final String ELEMENT_FULL_ADDRESS = "fullAddress"; private static final String ELEMENT_TELEPHONE = "telephone"; private static final String ELEMENT_MOBILE_PHONE = "mobilePhone"; private static final String ELEMENT_E_MAIL = "email"; //private static final String ENTITY_MED_ORDER = "medOrder"; private static final String ELEMENT_BUNDLE_MED_START = "<bundleMed>"; private static final String ELEMENT_BUNDLE_MED_END = "</bundleMed>"; //private static final String ELEMENT_CLAIM_ITEM_START = "<claimItem>"; //private static final String ELEMENT_CLAIM_ITEM_END = "</claimItem>"; private static final String ELEMENT_RP_DATE = "rpDate"; private static final String ELEMENT_CLAIM_ITEM_NAME = "name"; private static final String ELEMENT_CLAIM_ITEM_QUANTITY = "quantity"; private static final String ELEMENT_CLAIM_ITEM_UNIT = "unit"; private static final String ELEMENT_CLAIM_ITEM_NUM_DAYS = "numDays"; private static final String ELEMENT_CLAIM_ITEM_ADMINI = "administration"; //private static final String ELEMENT_MODULE_START = "<module>"; //private static final String ELEMENT_MODULE_END = "</module>"; private static final String ELEMENT_LAB_ITEM_START = "<laboItem>"; private static final String ELEMENT_LAB_ITEM_END = "</laboItem>"; private static final String ELEMENT_LABO_CODE = "laboCode"; private static final String ELEMENT_SAMPLE_DATE = "sampleDate"; private static final String ELEMENT_GROUP_CODE = "groupCode"; private static final String ELEMENT_GROUP_NAME = "groupName"; private static final String ELEMENT_PARENT_CODE = "parentCode"; private static final String ELEMENT_ITEM_CODE = "itemCode"; private static final String ELEMENT_ITEM_MEDIS_CODE = "medisCode"; private static final String ELEMENT_ITEM_NAME = "itemName"; private static final String ELEMENT_NORMAL_VALUE = "normalValue"; //private static final String ELEMENT_UNIT = "unit"; //private static final String ELEMENT_VALUE = "value"; private static final String ELEMENT_OUT_FLAG = "outFlag"; private static final String ELEMENT_COMMENT_1 = "comment1"; private static final String ELEMENT_COMMENT_2 = "comment2"; private static final String ELEMENT_TEST_ITEM_START = "<testItem>"; private static final String ELEMENT_TEST_ITEM_END = "</testItem>"; private static final String ELEMENT_RESULT_START = "<result>"; private static final String ELEMENT_RESULT_END = "</result>"; private static final String ELEMENT_DIAGNOSIS_START = "<registeredDiagnosis>"; private static final String ELEMENT_DIGNOSIS_END = "</registeredDiagnosis>"; private static final String ELEMENT_DIAGNOSIS = "diagnosis"; private static final String ELEMENT_CATEGORY = "category"; private static final String ELEMENT_OUTCOME = "outcome"; //private static final String ELEMENT_START_DATE = "startDate"; private static final String ELEMENT_END_DATE = "endDate"; private static final String ELEMENT_SCHEMA_START = "<schema>"; private static final String ELEMENT_BUCKET = "bucket"; private static final String ELEMENT_SOP = "sop"; private static final String ELEMENT_BASE64 = "base64"; private static final String ELEMENT_SCHEMA_END = "</schema>"; private static final String MML_DATE_TIME_SEPARATOR = "T"; private static final String USER_ALLOWED_TYPE = "ASP_MEMBER"; private static final String ASP_TEST_USER = "ASP_TESTER"; // S3 parameters private static final String ELEMENT_S3_URL = "s3URL"; private static final String ELEMENT_S3_ACCESS_KEY = "s3AccessKey"; private static final String ELEMENT_S3_SECRET_KEY = "s3SecretKey"; // S3 parameters @Inject private IPhoneServiceBean iPhoneServiceBean; @Inject private KarteServiceBean karteService; /** Creates a new instance of DolphinResource */ public DolphinResource() { } @GET @Path("/user/{param}") @Produces("application/xml") public String getUser(@Context HttpServletRequest servletReq, @PathParam("param") String param) { debug(servletReq.getHeader("userName")); debug(servletReq.getHeader("password")); String [] params = param.split(","); if (params.length !=3) { debug("params!=3, return"); return null; } // userId, 医療機関ID, パスワード String userId = params[0]; String facilityId = params[1]; String password = params[2]; // OID 1.3.6.1.4.1.9414.2.xxx:userId を構築する StringBuilder sb = new StringBuilder(); sb.append(DOLPHIN_ASP_OID); sb.append(facilityId); sb.append(":"); sb.append(userId); String qid = sb.toString(); debug(qid); // 戻り値のXMLを構築する String retXML = null; sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); UserModel user = null; try { // User を検索する user = iPhoneServiceBean.getUser(qid, password); debug("got user"); // ASP Member 以外の時は評価期間中かどうかを判定する if (user.getMemberType().equals(ASP_TEST_USER)) { Date registered = user.getRegisteredDate(); GregorianCalendar gc = new GregorianCalendar(); gc.setTime(registered); gc.add(Calendar.MONTH, 5); GregorianCalendar now = new GregorianCalendar(); if (gc.before(now)) { user = null; } } } catch (Exception e) { debug("Exception at get user"); sb.append(RESOURCE_END); retXML = sb.toString(); } // 登録なし、認証不可、MEMBER 以外 if (user == null) { debug("user == null, return"); return retXML; } // ローカルuserId int index = user.getUserId().indexOf(":"); userId = user.getUserId().substring(index+1); sb.append(USER_START); //minagawa^ VisitTouch propertyString(ELEMENT_USER_PK, String.valueOf(user.getId()), sb); // PK //minagawa$ propertyString(ELEMENT_USER_ID, userId, sb); // userId propertyString(ELEMENT_COMMON_NAME, user.getCommonName(), sb); // commonName //minagawa^ VisitTouch propertyString(ELEMENT_LICENSE, user.getLicenseModel().getLicense(), sb); // 医療資格 propertyString(ELEMENT_LICENSE_DESC, user.getLicenseModel().getLicenseDesc(), sb); // 医療資格名称(説明) propertyString(ELEMENT_DEPARTMENT, user.getDepartmentModel().getDepartment(), sb); // 診療科 01 propertyString(ELEMENT_DEPARTMENT_DESC, user.getDepartmentModel().getDepartmentDesc(), sb); // 診療科名称 内科 propertyString(ELEMENT_ORCA_ID, user.getOrcaId(), sb); // ORCA ID //minagawa$ sb.append(FACILITY_START); propertyString(ELEMENT_FACILITY_ID, user.getFacilityModel().getFacilityId(), sb); // 施設ID propertyString(ELEMENT_FACILITY_NAME, user.getFacilityModel().getFacilityName(), sb); // 施設名称 //minagawa^ VisitTouch propertyString(ELEMENT_FACILITY_ZIP, user.getFacilityModel().getZipCode(), sb); // 郵便番号 propertyString(ELEMENT_FACILITY_ADDRESS, user.getFacilityModel().getAddress(), sb); // 住所 propertyString(ELEMENT_FACILITY_TELEPHONE, user.getFacilityModel().getTelephone(), sb); // 電話 propertyString(ELEMENT_FACILITY_FAX, user.getFacilityModel().getFacsimile(), sb); // FAC //minagawa$ //-------- s3 params -----------// propertyString(ELEMENT_S3_URL, user.getFacilityModel().getS3URL(), sb); propertyString(ELEMENT_S3_ACCESS_KEY, user.getFacilityModel().getS3AccessKey(), sb); propertyString(ELEMENT_S3_SECRET_KEY, user.getFacilityModel().getS3SecretKey(), sb); //-------- s3 params -----------// sb.append(FACILITY_END); sb.append(USER_END); sb.append(RESOURCE_END); retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/patient/firstVisitors/{param}") @Produces("application/xml") public String getFirstVisitors(@PathParam("param") String param) { String [] params = param.split(","); if (params.length !=3) { debug("params!=3, return"); return null; } // 医療機関ID、最初の結果、最大件数 String facilityId = params[0]; int firstResult = Integer.parseInt(params[1]); int maxResult = Integer.parseInt(params[2]); // 新患リストを取得する List<KarteBean> list = iPhoneServiceBean.getFirstVisitors(facilityId, firstResult, maxResult); StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); for (KarteBean karte : list) { // ManyToOne で取得されている PatientModel patient = karte.getPatientModel(); sb.append(PATIENT_START); propertyString(ELEMENT_PK, String.valueOf(patient.getId()), sb); propertyString(ELEMENT_PATIENT_ID, patient.getPatientId(), sb); propertyString(ELEMENT_NAME, patient.getFullName(), sb); propertyString(ELEMENT_KANA, patient.getKanaName(), sb); String sex = sexValueToDesc(patient.getGender()); propertyString(ELEMENT_SEX, sex, sb); propertyString(ELEMENT_BIRTHDAY, patient.getBirthday(), sb); propertyString(ELEMENT_FIRST_VISIT, simpleFormat(karte.getCreated()), sb); sb.append(PATIENT_END); } sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/patient/visit/{param}") @Produces("application/xml") public String getPatientVisit(@PathParam("param") String param) { String [] params = param.split(","); if (params.length !=3) { debug("params!=3, return"); return null; } String facilityId = params[0]; int firstResult = Integer.parseInt(params[1]); int maxResult = Integer.parseInt(params[2]); List<PatientVisitModel> list = iPhoneServiceBean.getPatientVisit(facilityId, firstResult, maxResult); StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); for (PatientVisitModel visit : list) { sb.append(ELEMENT_PATIENT_VISIT_START); //minagawa^ VisitTouch propertyString(ELEMENT_PK, String.valueOf(visit.getId()), sb); // 受付のPK //minagawa$ propertyString(ELEMENT_PVT_DATE, visit.getPvtDate(), sb); PatientModel patient = visit.getPatientModel(); sb.append(PATIENT_START); propertyString(ELEMENT_PK, String.valueOf(patient.getId()), sb); propertyString(ELEMENT_PATIENT_ID, patient.getPatientId(), sb); propertyString(ELEMENT_NAME, patient.getFullName(), sb); propertyString(ELEMENT_KANA, patient.getKanaName(), sb); String sex = sexValueToDesc(patient.getGender()); propertyString(ELEMENT_SEX, sex, sb); propertyString(ELEMENT_BIRTHDAY, patient.getBirthday(), sb); sb.append(PATIENT_END); sb.append(ELEMENT_PATIENT_VISIT_END); } sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/patient/visitRange/{param}") @Produces("application/xml") public String getPatientVisitRange(@PathParam("param") String param) { String [] params = param.split(","); if (params.length < 3) { debug("params!>=3, return"); return null; } // 医療機関ID、検索の開始日と終了日 String facilityId = params[0]; String start = params[1]; String end = params[2]; start = start.replaceAll(" ", MML_DATE_TIME_SEPARATOR); end = end.replaceAll(" ", MML_DATE_TIME_SEPARATOR); int firstResult = 0; int maxResult = 1000; if (params.length==5) { firstResult = Integer.parseInt(params[3]); maxResult = Integer.parseInt(params[4]); } // start ~ end 間のPVTを検索する List<PatientVisitModel> list = iPhoneServiceBean.getPatientVisitRange(facilityId, start, end, firstResult, maxResult); StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); for (PatientVisitModel visit : list) { sb.append(ELEMENT_PATIENT_VISIT_START); //minagawa^ VisitTouch propertyString(ELEMENT_PK, String.valueOf(visit.getId()), sb); // 受付のPK //minagawa$ // 来院日 propertyString(ELEMENT_PVT_DATE, visit.getPvtDate(),sb); // 診察終了 or Not propertyString(ELEMENT_PVT_STATUS, String.valueOf(visit.getState()), sb); //s.oh^ 2013/11/05 iPhone/iPadの受付リストに保険を追加 propertyString(ELEMENT_PVT_F_INS, String.valueOf(visit.getFirstInsurance()), sb); // add funabashi 20131103 //s.oh$ PatientModel patient = visit.getPatientModel(); sb.append(PATIENT_START); propertyString(ELEMENT_PK, String.valueOf(patient.getId()),sb); propertyString(ELEMENT_PATIENT_ID, patient.getPatientId(),sb); propertyString(ELEMENT_NAME, patient.getFullName(),sb); propertyString(ELEMENT_KANA, patient.getKanaName(),sb); String sex = sexValueToDesc(patient.getGender()); propertyString(ELEMENT_SEX, sex, sb); propertyString(ELEMENT_BIRTHDAY, patient.getBirthday(),sb); sb.append(PATIENT_END); sb.append(ELEMENT_PATIENT_VISIT_END); } sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/patient/visitLast/{param}") @Produces("application/xml") public String getPatientVisitLast(@PathParam("param") String param) { String [] params = param.split(","); if (params.length != 3) { debug("params!=3, return"); return null; } // 医療機関ID、検索範囲の開始日、終了日 String facilityId = params[0]; String start = params[1]; String end = params[2]; start = start.replaceAll(" ", MML_DATE_TIME_SEPARATOR); end = end.replaceAll(" ", MML_DATE_TIME_SEPARATOR); List<PatientVisitModel> list = iPhoneServiceBean.getPatientVisitRange(facilityId, start, end, 0, 1000); // 検索結果が空で前日検索の場合はその日以降で最初に結果のあるものを返す int tryCnt = 0; while (list.isEmpty() && tryCnt++ < 6) { // startの日付を取り出す int index = start.indexOf(MML_DATE_TIME_SEPARATOR); start = start.substring(0, index); Date last = simpleParse(start); // それを1日前に戻す GregorianCalendar gc = new GregorianCalendar(); gc.setTime(last); gc.add(Calendar.DAY_OF_MONTH, -1); String lastStr = simpleFormat(gc.getTime()); // 日の始めと終わりにする start = lastStr + "T00:00:00"; end = lastStr + "T23:59:59"; // 検索する list = iPhoneServiceBean.getPatientVisitRange(facilityId, start, end, 0, 1000); } StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); for (PatientVisitModel visit : list) { sb.append(ELEMENT_PATIENT_VISIT_START); //minagawa^ VisitTouch propertyString(ELEMENT_PK, String.valueOf(visit.getId()), sb); // 受付のPK //minagawa$ propertyString(ELEMENT_PVT_DATE, visit.getPvtDate(),sb); PatientModel patient = visit.getPatientModel(); sb.append(PATIENT_START); propertyString(ELEMENT_PK, String.valueOf(patient.getId()),sb); propertyString(ELEMENT_PATIENT_ID, patient.getPatientId(),sb); propertyString(ELEMENT_NAME, patient.getFullName(),sb); propertyString(ELEMENT_KANA, patient.getKanaName(),sb); String sex = sexValueToDesc(patient.getGender()); propertyString(ELEMENT_SEX, sex, sb); propertyString(ELEMENT_BIRTHDAY, patient.getBirthday(),sb); sb.append(PATIENT_END); sb.append(ELEMENT_PATIENT_VISIT_END); } sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/patient/{pk}") @Produces("application/xml") public String getPatientById(@PathParam("pk") String pk) { // PK Long id = Long.parseLong(pk); PatientModel patient = iPhoneServiceBean.getPatient(id); StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); if (patient == null) { sb.append(RESOURCE_END); return sb.toString(); } sb.append(PATIENT_START); propertyString(ELEMENT_PK, String.valueOf(patient.getId()),sb); propertyString(ELEMENT_PATIENT_ID, patient.getPatientId(),sb); propertyString(ELEMENT_NAME, patient.getFullName(),sb); propertyString(ELEMENT_KANA, patient.getKanaName(),sb); String sex = sexValueToDesc(patient.getGender()); propertyString(ELEMENT_SEX, sex, sb); propertyString(ELEMENT_BIRTHDAY, patient.getBirthday(), sb); if (patient.getSimpleAddressModel()!=null) { sb.append(ELEMENT_ADDRESS_START); propertyString(ELEMENT_ZIP_CODE, patient.getSimpleAddressModel().getZipCode(), sb); propertyString(ELEMENT_FULL_ADDRESS, patient.getSimpleAddressModel().getAddress(), sb); sb.append(ELEMENT_ADDRESS_END); } propertyString(ELEMENT_TELEPHONE, patient.getTelephone(), sb); propertyString(ELEMENT_MOBILE_PHONE, patient.getMobilePhone(), sb); propertyString(ELEMENT_E_MAIL, patient.getEmail(), sb); sb.append(PATIENT_END); sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/patientPackage/{pk}") @Produces("application/xml") public String getPatientPackage(@PathParam("pk") String pk) { // PK Long id = Long.parseLong(pk); PatientPackage pack = iPhoneServiceBean.getPatientPackage(id); PatientModel patient = pack.getPatient(); StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); if (patient == null) { sb.append(RESOURCE_END); return sb.toString(); } sb.append("<patientPackage>"); // 患者情報 sb.append(PATIENT_START); propertyString(ELEMENT_PK, String.valueOf(patient.getId()),sb); propertyString(ELEMENT_PATIENT_ID, patient.getPatientId(),sb); propertyString(ELEMENT_NAME, patient.getFullName(),sb); propertyString(ELEMENT_KANA, patient.getKanaName(),sb); String sex = sexValueToDesc(patient.getGender()); propertyString(ELEMENT_SEX, sex, sb); propertyString(ELEMENT_BIRTHDAY, patient.getBirthday(), sb); if (patient.getSimpleAddressModel()!=null) { sb.append(ELEMENT_ADDRESS_START); propertyString(ELEMENT_ZIP_CODE,patient.getSimpleAddressModel().getZipCode(), sb); propertyString(ELEMENT_FULL_ADDRESS, patient.getSimpleAddressModel().getAddress(), sb); sb.append(ELEMENT_ADDRESS_END); } propertyString(ELEMENT_TELEPHONE, patient.getTelephone(), sb); propertyString(ELEMENT_MOBILE_PHONE, patient.getMobilePhone(), sb); propertyString(ELEMENT_E_MAIL, patient.getEmail(), sb); //s.oh^ 2014/08/29 患者情報の追加 propertyString("reserve1", patient.getReserve1(), sb); propertyString("reserve2", patient.getReserve2(), sb); propertyString("reserve3", patient.getReserve3(), sb); propertyString("reserve4", patient.getReserve4(), sb); propertyString("reserve5", patient.getReserve5(), sb); propertyString("reserve6", patient.getReserve6(), sb); //s.oh$ sb.append(PATIENT_END); // 健康保険 // Health Insurance を変換をする beanXML2PVT List<HealthInsuranceModel> c = pack.getInsurances(); for (HealthInsuranceModel model : c) { try { // byte[] を XMLDecord PVTHealthInsuranceModel hModel = (PVTHealthInsuranceModel)xmlDecode(model.getBeanBytes()); PVTPublicInsuranceItemModel[] publicItems = hModel.getPVTPublicInsuranceItem(); sb.append("<healthInsurance>"); propertyString("insuranceClass", hModel.getInsuranceClass(),sb); propertyString("insuranceClassCode", hModel.getInsuranceClassCode(),sb); propertyString("insuranceClassCodeSys", hModel.getInsuranceClassCodeSys(),sb); propertyString("insuranceNumber", hModel.getInsuranceNumber(),sb); propertyString("clientGroup", hModel.getClientGroup(),sb); propertyString("clientNumber", hModel.getClientNumber(),sb); propertyString("familyClass", hModel.getFamilyClass(),sb); propertyString("startDate", hModel.getStartDate(),sb); propertyString("expiredDate", hModel.getExpiredDate(),sb); propertyString("payInRatio", hModel.getPayInRatio(),sb); propertyString("payOutRatio", hModel.getPayOutRatio(),sb); if (publicItems != null && publicItems.length > 0) { for (PVTPublicInsuranceItemModel pb : publicItems) { sb.append("<publicInsurance>"); propertyString("priority", pb.getPriority(),sb); propertyString("providerName", pb.getProviderName(),sb); propertyString("provider", pb.getProvider(),sb); propertyString("recipient", pb.getRecipient(),sb); propertyString("startDate", pb.getStartDate(),sb); propertyString("expiredDate", pb.getExpiredDate(),sb); propertyString("paymentRatio", pb.getPaymentRatio(),sb); propertyString("paymentRatioType", pb.getPaymentRatioType(),sb); sb.append("</publicInsurance>"); } } sb.append("</healthInsurance>"); } catch (Exception e) { e.printStackTrace(System.err); } } // Allergy List<AllergyModel> list = pack.getAllergies(); for (AllergyModel allergy : list) { sb.append("<allergy>"); propertyString("factor", allergy.getFactor(), sb); propertyString("severity", allergy.getSeverity(), sb); propertyString("identifiedDate", allergy.getIdentifiedDate(), sb); sb.append("</allergy>"); } sb.append("</patientPackage>"); sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/patients/name/{param}") @Produces("application/xml") public String getPatientsByName(@PathParam("param") String param) { String [] params = param.split(","); if (params.length !=4) { debug("params!=4, return"); return null; } String facilityId = params[0]; String name = params[1]; int firstResult = Integer.parseInt(params[2]); int maxResult = Integer.parseInt(params[3]); List<PatientModel> list; // ひらがなで始まっている場合はカナに変換する if (KanjiHelper.isHiragana(name.charAt(0))) { name = KanjiHelper.hiraganaToKatakana(name); } if (KanjiHelper.isKatakana(name.charAt(0))) { list = iPhoneServiceBean.getPatientsByKana(facilityId, name, firstResult, maxResult); } else { // 漢字で検索 list = iPhoneServiceBean.getPatientsByName(facilityId, name, firstResult, maxResult); } StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); for (PatientModel patient : list) { sb.append(PATIENT_START); propertyString(ELEMENT_PK, String.valueOf(patient.getId()), sb); propertyString(ELEMENT_PATIENT_ID, patient.getPatientId(), sb); propertyString(ELEMENT_NAME, patient.getFullName(), sb); propertyString(ELEMENT_KANA, patient.getKanaName(), sb); String sex = sexValueToDesc(patient.getGender()); propertyString(ELEMENT_SEX, sex, sb); propertyString(ELEMENT_BIRTHDAY, patient.getBirthday(), sb); sb.append(PATIENT_END); } sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/module/rp/{param}") @Produces("application/xml") public String getRp(@PathParam("param") String param) { String [] params = param.split(","); if (params.length !=3) { debug("params!=3, return"); return null; } long pk = Long.parseLong(params[0]); int firstResult = Integer.parseInt(params[1]); int maxResult = Integer.parseInt(params[2]); String entity = ENTITY_MED_ORDER; StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); if (firstResult == 0) { Long count = iPhoneServiceBean.getModuleCount(pk, entity); sb.append(ELEMENT_PAGE_INFO_START); propertyString(ELEMENT_NUM_RECORDS, count.toString(), sb); sb.append(ELEMENT_PAGE_INFO_END); } List<ModuleModel> retList = iPhoneServiceBean.getModules(pk, entity, firstResult, maxResult); if (retList==null || retList.isEmpty()) { sb.append(RESOURCE_END); return sb.toString(); } for (ModuleModel module : retList) { module.setModel((InfoModel)xmlDecode(module.getBeanBytes())); BundleMed med = (BundleMed)module.getModel(); ClaimItem[] items = med.getClaimItem(); sb.append(ELEMENT_BUNDLE_MED_START); propertyString(ELEMENT_RP_DATE, simpleFormat(module.getStarted()), sb); for (ClaimItem item : items) { sb.append(ELEMENT_CLAIM_ITEM_START); propertyString(ELEMENT_CLAIM_ITEM_NAME, item.getName(), sb); propertyString(ELEMENT_CLAIM_ITEM_QUANTITY, item.getNumber(), sb); propertyString(ELEMENT_CLAIM_ITEM_UNIT, item.getUnit(), sb); propertyString(ELEMENT_CLAIM_ITEM_NUM_DAYS, med.getBundleNumber(), sb); propertyString(ELEMENT_CLAIM_ITEM_ADMINI, med.getAdmin(), sb); sb.append(ELEMENT_CLAIM_ITEM_END); } sb.append(ELEMENT_BUNDLE_MED_END); } sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/module/{param}") @Produces("application/xml") public String getModule(@PathParam("param") String param) { String [] params = param.split(","); if (params.length !=4) { debug("params!=4, return"); return null; } long pk = Long.parseLong(params[0]); String entity = params[1]; int firstResult = Integer.parseInt(params[2]); int maxResult = Integer.parseInt(params[3]); StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); if (firstResult == 0) { Long count = iPhoneServiceBean.getModuleCount(pk, entity); sb.append(ELEMENT_PAGE_INFO_START); propertyString(ELEMENT_NUM_RECORDS, count.toString(), sb); sb.append(ELEMENT_PAGE_INFO_END); } List<ModuleModel> retList = iPhoneServiceBean.getModules(pk, entity, firstResult, maxResult); if (retList==null || retList.isEmpty()) { sb.append(RESOURCE_END); return sb.toString(); } for (ModuleModel module : retList) { module.setModel((InfoModel)xmlDecode(module.getBeanBytes())); BundleDolphin bundle = (BundleDolphin) module.getModel(); bundle.setOrderName(module.getModuleInfoBean().getEntity()); ClaimItem[] items = bundle.getClaimItem(); entity = bundle.getOrderName(); boolean orderIsRp = (entity != null && entity.equals(ENTITY_MED_ORDER)) ? true : false; String bundleNumber = bundle.getBundleNumber(); String admin = orderIsRp ? bundle.getAdmin() : null; sb.append(ELEMENT_MODULE_START); // order|entity Name propertyString(ELEMENT_ENTITY, entity, sb); propertyString(ELEMENT_NAME, entityToName(entity), sb); propertyString(ELEMENT_START_DATE, simpleFormat(module.getStarted()), sb); // ClaimItem for (ClaimItem cl : items) { sb.append(ELEMENT_CLAIM_ITEM_START); propertyString(ELEMENT_NAME, cl.getName(), sb); // 名称 propertyString(ELEMENT_QUANTITY, cl.getNumber(), sb); // 数量 propertyString(ELEMENT_UNIT, cl.getUnit(), sb); // 単位 if (orderIsRp) { propertyString(ELEMENT_CLAIM_ITEM_NUM_DAYS, bundleNumber, sb); // 日数/回数 propertyString(ELEMENT_CLAIM_ITEM_ADMINI, admin, sb); // 用法 } sb.append(ELEMENT_CLAIM_ITEM_END); } sb.append(ELEMENT_MODULE_END); } sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/module/laboTest/{param}") @Produces("application/xml") public String getLaboTest(@PathParam("param") String param) { String [] params = param.split(","); if (params.length != 4) { debug("params!=4, return"); return null; } String facilityId = params[0]; String patientId = params[1]; int firstResult = Integer.parseInt(params[2]); int maxResult = Integer.parseInt(params[3]); StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); if (firstResult == 0) { Long count = iPhoneServiceBean.getLabTestCount(facilityId, patientId); sb.append(ELEMENT_PAGE_INFO_START); propertyString(ELEMENT_NUM_RECORDS, count.toString(), sb); sb.append(ELEMENT_PAGE_INFO_END); } List<NLaboModule> list = iPhoneServiceBean.getLaboTest(facilityId, patientId, firstResult, maxResult); for (NLaboModule module : list) { sb.append(ELEMENT_MODULE_START); propertyString(ELEMENT_LABO_CODE, module.getLaboCenterCode(), sb); propertyString(ELEMENT_SAMPLE_DATE, module.getSampleDate(), sb); propertyString(ELEMENT_PATIENT_ID, module.getPatientId(), sb); Collection<NLaboItem> items = module.getItems(); // LaboItemをイテレートする for (NLaboItem item : items) { // <laboItem groupCode=...... /> sb.append(ELEMENT_LAB_ITEM_START); // グループコード propertyString(ELEMENT_GROUP_CODE, item.getGroupCode(), sb); // グループ名称 propertyString(ELEMENT_GROUP_NAME, item.getGroupName(), sb); // 親コード propertyString(ELEMENT_PARENT_CODE, item.getParentCode(), sb); // 検査項目コード propertyString(ELEMENT_ITEM_CODE, item.getItemCode(), sb); // MEDIS propertyString(ELEMENT_ITEM_MEDIS_CODE, item.getMedisCode(), sb); // 検査項目名 propertyString(ELEMENT_ITEM_NAME, item.getItemName(), sb); // 基準値 propertyString(ELEMENT_NORMAL_VALUE, item.getNormalValue(), sb); // 単位 propertyString(ELEMENT_UNIT, item.getUnit(), sb); // 検査結果 propertyString(ELEMENT_VALUE, item.getValue(), sb); // 異常値フラグ propertyString(ELEMENT_OUT_FLAG, item.getAbnormalFlg(), sb); // コメント1 propertyString(ELEMENT_COMMENT_1, item.getComment1(), sb); // コメント2 propertyString(ELEMENT_COMMENT_2, item.getComment2(), sb); sb.append(ELEMENT_LAB_ITEM_END); } sb.append(ELEMENT_MODULE_END); } sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/item/laboItem/{param}") @Produces("application/xml") public String getLaboGraph(@PathParam("param") String param) { String [] params = param.split(","); if (params.length != 5) { debug("params!=5, return"); return null; } String facilityId = params[0]; String patientId = params[1]; int firstResult = Integer.parseInt(params[2]); int maxResult = Integer.parseInt(params[3]); String itemCode = params[4]; // 結果を XML にエンコードする StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); List<NLaboItem> list = iPhoneServiceBean.getLaboTestItem(facilityId, patientId, firstResult, maxResult, itemCode); int cnt = list.size(); if (cnt == 0) { sb.append(RESOURCE_END); String ret = sb.toString(); debug(ret); return ret; } // この検査項目の共通情報を出力する NLaboItem item = list.get(cnt-1); // TestItem sb.append(ELEMENT_TEST_ITEM_START); // 検査項目コード propertyString(ELEMENT_ITEM_CODE, item.getItemCode(), sb); // 検査項目名 propertyString(ELEMENT_ITEM_NAME, item.getItemName(), sb); // 基準値 propertyString(ELEMENT_NORMAL_VALUE, item.getNormalValue(), sb); // 単位 propertyString(ELEMENT_UNIT, item.getUnit(), sb); // sampleDate の逆順で結果データを出力する for (int k = 0; k < cnt; k++) { item = list.get(k); sb.append(ELEMENT_RESULT_START); // sampleDate propertyString(ELEMENT_SAMPLE_DATE, item.getSampleDate(), sb); // value propertyString(ELEMENT_VALUE, item.getValue(), sb); // comment1 propertyString(ELEMENT_COMMENT_1, item.getComment1(), sb); // comment2 propertyString(ELEMENT_COMMENT_2, item.getComment1(), sb); sb.append(ELEMENT_RESULT_END); } sb.append(ELEMENT_TEST_ITEM_END); sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/module/diagnosis/{param}") @Produces("application/xml") public String getDiagnosis(@PathParam("param") String param) { String [] params = param.split(","); if (params.length !=3) { debug("params!=3, return"); return null; } long pk = Long.parseLong(params[0]); int firstResult = Integer.parseInt(params[1]); int maxResult = Integer.parseInt(params[2]); // 結果を XML にエンコードする StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); if (firstResult == 0) { Long count = iPhoneServiceBean.getDiagnosisCount(pk); sb.append(ELEMENT_PAGE_INFO_START); propertyString(ELEMENT_NUM_RECORDS, count.toString(), sb); sb.append(ELEMENT_PAGE_INFO_END); } List<RegisteredDiagnosisModel> list = iPhoneServiceBean.getDiagnosis(pk, firstResult, maxResult); int cnt = list.size(); if (cnt == 0) { sb.append(RESOURCE_END); String ret = sb.toString(); debug(ret); return ret; } for (RegisteredDiagnosisModel model : list) { sb.append(ELEMENT_DIAGNOSIS_START); propertyString(ELEMENT_DIAGNOSIS, model.getAliasOrName(), sb); propertyString(ELEMENT_CATEGORY, model.getCategoryDesc(), sb); propertyString(ELEMENT_OUTCOME, model.getOutcomeDesc(), sb); propertyString(ELEMENT_START_DATE, model.getStartDate(), sb); propertyString(ELEMENT_END_DATE, model.getEndDate(), sb); sb.append(ELEMENT_DIGNOSIS_END); } sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/module/schema/{param}") @Produces("application/xml") public String getSchema(@PathParam("param") String param) { String [] params = param.split(","); if (params.length !=3) { debug("params!=3, return"); return null; } long pk = Long.parseLong(params[0]); int firstResult = Integer.parseInt(params[1]); int maxResult = Integer.parseInt(params[2]); // 結果を XML にエンコードする StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); List<SchemaModel> list = iPhoneServiceBean.getSchema(pk, firstResult, maxResult); int cnt = list.size(); if (cnt == 0) { sb.append(RESOURCE_END); String ret = sb.toString(); debug(ret); return ret; } String retXML = null; try { for (SchemaModel schema : list) { sb.append(ELEMENT_SCHEMA_START); // bucket if (schema.getExtRefModel().getBucket()!=null) { propertyString(ELEMENT_BUCKET, schema.getExtRefModel().getBucket(), sb); } // sop if (schema.getExtRefModel().getSop()!=null) { propertyString(ELEMENT_SOP, schema.getExtRefModel().getSop(), sb); } byte[] bytes = schema.getJpegByte(); String base64Str = new String(Base64Utils.encode(bytes)); propertyString(ELEMENT_BASE64, base64Str, sb); sb.append(ELEMENT_SCHEMA_END); } sb.append(RESOURCE_END); retXML = sb.toString(); debug(retXML); } catch (Exception e) { } return retXML; } @GET @Path("/document/progressCourse/{param}") @Produces("application/xml") public String getProgressCource(@PathParam("param") String param) { String [] params = param.split(","); if (params.length != 3) { debug("params!=3, return"); return null; } long patientPk = Long.parseLong(params[0]); int firstResult = Integer.parseInt(params[1]); int maxResult = Integer.parseInt(params[2]); StringBuilder sb = new StringBuilder(); sb.append(XML); sb.append(RESOURCE_START); // 全件数を取得する if (firstResult == 0) { Long count = iPhoneServiceBean.getDocumentCount(patientPk); sb.append(ELEMENT_PAGE_INFO_START); propertyString(ELEMENT_NUM_RECORDS, count.toString(), sb); sb.append(ELEMENT_PAGE_INFO_END); } // 検索する List<DocumentModel> list = iPhoneServiceBean.getDocuments(patientPk, firstResult, maxResult); for (DocumentModel doc : list) { sb.append(ELEMENT_DOCUMENT_START); //minagawa^ VisitTouch propertyString(ELEMENT_PK, String.valueOf(doc.getId()), sb); // DocumentのPK //minagawa$ // 確定日、記載者 Date started = doc.getStarted(); UserModel u = doc.getUserModel(); propertyString("started", simpleFormat(started), sb); propertyString("responsibility", u.getCommonName(), sb); List<ModuleModel> soaModules = new ArrayList<ModuleModel>(); List<BundleDolphin> bundles = new ArrayList<BundleDolphin>(); String soaSpec = null; String pSpec = null; Collection<ModuleModel> modules = doc.getModules(); for (ModuleModel bean : modules) { bean.setModel((InfoModel) xmlDecode(bean.getBeanBytes())); String role = bean.getModuleInfoBean().getStampRole(); if (role.equals(IInfoModel.ROLE_SOA)) { soaModules.add(bean); } else if (role.equals(IInfoModel.ROLE_SOA_SPEC)) { soaSpec = ((ProgressCourse) bean.getModel()).getFreeText(); } else if (role.equals(IInfoModel.ROLE_P)) { BundleDolphin b = (BundleDolphin) bean.getModel(); b.setOrderName(bean.getModuleInfoBean().getEntity()); bundles.add(b); } else if (role.equals(IInfoModel.ROLE_P_SPEC)) { pSpec = ((ProgressCourse) bean.getModel()).getFreeText(); } //------------------------------------------------------- // goody else if (bean.getModel() instanceof ProgressCourse) { if (soaSpec==null) { soaSpec = ((ProgressCourse) bean.getModel()).getFreeText(); } else if (pSpec==null) { pSpec = ((ProgressCourse) bean.getModel()).getFreeText(); } } else { BundleDolphin b = (BundleDolphin) bean.getModel(); b.setOrderName(bean.getModuleInfoBean().getEntity()); bundles.add(b); } //-------------------------------------------------------- } if (soaSpec != null && pSpec != null) { int index = soaSpec.indexOf(NAME_STAMP_HOLDER); if (index > 0) { String sTmp = soaSpec; String pTmp = pSpec; soaSpec = pTmp; pSpec = sTmp; } } // soa text if (soaSpec != null && (!soaSpec.equals(""))) { sb.append(ELEMENT_MODULE_START); propertyString(ELEMENT_ENTITY, "progressCourse", sb); sb.append(ELEMENT_TEXT_ITEM_START); propertyString(ELEMENT_NAME, "soaText", sb); StringBuilder text = new StringBuilder(); renderPane(text, soaSpec); propertyString(ELEMENT_VALUE, text.toString(), sb); sb.append(ELEMENT_TEXT_ITEM_END); sb.append(ELEMENT_MODULE_END); } // schema Collection<SchemaModel> images = doc.getSchema(); try { for (SchemaModel schema : images) { sb.append(ELEMENT_SCHEMA_START); // bucket if (schema.getExtRefModel().getBucket()!=null) { propertyString(ELEMENT_BUCKET, schema.getExtRefModel().getBucket(), sb); } // sop if (schema.getExtRefModel().getSop()!=null) { propertyString(ELEMENT_SOP, schema.getExtRefModel().getSop(), sb); } // image bytes byte[] bytes = schema.getJpegByte(); String base64Str = new String(Base64Utils.encode(bytes)); propertyString(ELEMENT_BASE64, base64Str, sb); sb.append(ELEMENT_SCHEMA_END); } } catch (Exception e) { } // if (pSpec != null) { // sb.append("<module>"); // propertyString("entity", "progressCourse")); // sb.append("<textItem>"); // propertyString("name", "pText")); // StringBuilder text = new StringBuilder(); // renderPane(text, pSpec); // propertyString("value", text.toString())); // sb.append("</textItem>"); // sb.append("</module>"); // } // p modules for (BundleDolphin pmodule : bundles) { String entity = pmodule.getOrderName(); boolean orderIsRp = (entity != null && entity.equals(ENTITY_MED_ORDER)) ? true : false; String bundleNumber = pmodule.getBundleNumber(); String admin = orderIsRp ? pmodule.getAdmin() : null; sb.append(ELEMENT_MODULE_START); // order|entity Name propertyString(ELEMENT_ENTITY, entity, sb); propertyString(ELEMENT_NAME, entityToName(entity), sb); // ClaimItem ClaimItem[] items = pmodule.getClaimItem(); for (ClaimItem cl : items) { sb.append(ELEMENT_CLAIM_ITEM_START); propertyString(ELEMENT_NAME, cl.getName(), sb); // 名称 propertyString(ELEMENT_QUANTITY, cl.getNumber(), sb); // 数量 propertyString(ELEMENT_UNIT, cl.getUnit(), sb); // 単位 if (orderIsRp) { propertyString(ELEMENT_CLAIM_ITEM_NUM_DAYS, bundleNumber, sb); // 日数/回数 propertyString(ELEMENT_CLAIM_ITEM_ADMINI, admin, sb); // 用法 } sb.append(ELEMENT_CLAIM_ITEM_END); } sb.append(ELEMENT_MODULE_END); } sb.append(ELEMENT_DOCUMENT_END); } sb.append(RESOURCE_END); String retXML = sb.toString(); debug(retXML); return retXML; } @GET @Path("/stampTree/{param}") @Produces("application/json") public String getStampTree(@PathParam("param") String param) { long pk = Long.parseLong(param); IStampTreeModel treeModel = iPhoneServiceBean.getTrees(pk); try { String treeXml = new String(treeModel.getTreeBytes(), "UTF-8"); BufferedReader reader = new BufferedReader(new StringReader(treeXml)); JSONStampTreeBuilder builder = new JSONStampTreeBuilder(); StampTreeDirector director = new StampTreeDirector(builder); String json = director.build(reader); reader.close(); //System.err.println(json); return json; } catch (UnsupportedEncodingException ex) { } catch (IOException ex) { } return null; } @GET @Path("/stamp/{param}") @Produces("application/json") public String getStamp(@PathParam("param") String param) { StampModel stampModel = iPhoneServiceBean.getStamp(param); if (stampModel!=null) { XMLDecoder d = new XMLDecoder( new BufferedInputStream( new ByteArrayInputStream(stampModel.getStampBytes()))); InfoModel model = (InfoModel)d.readObject(); JSONStampBuilder builder = new JSONStampBuilder(); String json = builder.build(model); return json; } return null; } //-------------------------------------------------------------------------- @POST @Path("/idocument") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String postDocument(String json) throws IOException { // JSON to IDocument ObjectMapper mapper = new ObjectMapper(); IDocument document = mapper.readValue(json, IDocument.class); // IDocument to DocumentModel DocumentModel model = document.toModel(); // 追加 long pk = karteService.addDocument(model); // pkを返却 return String.valueOf(pk); } // S.Oh 2014/02/06 iPadのFreeText対応 Add Start @POST @Path("/idocument2") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String postDocument2(String json) throws IOException { // JSON to IDocument2 ObjectMapper mapper = new ObjectMapper(); IDocument2 document = mapper.readValue(json, IDocument2.class); // IDocument to DocumentModel DocumentModel model = document.toModel(); // 追加 long pk = karteService.addDocument(model); // pkを返却 return String.valueOf(pk); } // S.Oh 2014/02/06 Add End // @POST // @Path("/priscription") // @Consumes(MediaType.APPLICATION_JSON) // @Produces(MediaType.TEXT_PLAIN) // public String postPriscription(String json) throws IOException { // // // JSON to IPriscription // ObjectMapper mapper = new ObjectMapper(); // IPriscription document = mapper.readValue(json, IPriscription.class); // // // IPriscriptionModel to PriscriptionModel // PriscriptionModel model = document.toModel(); // // // create PDF // ServerPrescriptionPDFMaker maker = new ServerPrescriptionPDFMaker(model); // String filename = maker.output(); // // return filename; // } }