package open.dolphin.touch;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import open.dolphin.infomodel.*;
import open.dolphin.touch.session.IPhoneServiceBean;
/**
* REST Web Service
*
* @author kazushi Minagawa, Digital Globe, Inc.
*/
@Path("/demo")
public class DemoResourceASP 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";
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 ELEMENT_BUNDLE_MED_START = "<bundleMed>";
private static final String ELEMENT_BUNDLE_MED_END = "</bundleMed>";
//private static final String ELEMENT_BUNDLE_START = "<bundle>";
//private static final String ELEMENT_BUNDLE_END = "</bundle>";
//private static final String ELEMENT_BUNDLE_NAME = "name";
//private static final String ELEMENT_BUNDLE_ENTITY = "entity";
//private static final String ELEMENT_BUNDLE_NUMBER = "bundleNumber";
//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_END_DATE = "endDate";
private static final String ELEMENT_SCHEMA_START = "<schema>";
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 TEST_FACILITY_ID = "2.100";
private static final String TEST_FACILITY_NAME = "EHR クリニック";
private static final String TEST_USER_ID = "ehrTouch";
private static final String TEST_USER_NAME = "EHR";
private static final String TEST_PASSWORD = "098f6bcd4621d373cade4e832627b4f6";
private static final String TEST_MEMBER_TYPE = "touchTester";
private static final String ELEMENT_MEMBER_TYPE = "memberType";
private static final String SYLK_FACILITY_ID = "1.3.6.1.4.1.9414.2.100";
private static final String TEST_PATIENT_PK1 = "33809";
private static final String TEST_PATIENT_PK2 = "33813";
private static final String TEST_PATIENT_PK3 = "33817";
private static final String TEST_PATIENT_PK4 = "33821";
private static final String TEST_PATIENT_PK5 = "33826";
private static final String TEST_DEMO_FACILITY_ID = "1.3.6.1.4.1.9414.2.1";
private static final String TEST_DEMO_PATIENT_ID = "00001";
//private static int FIRST_RESULT = 0;
@Inject
private IPhoneServiceBean iPhoneServiceBean;
/** Creates a new instance of DolphinResource */
public DemoResourceASP() {
}
@GET
@Path("/user/{param}")
@Produces("application/xml")
public String getUser(@PathParam("param") String param) {
String [] params = param.split(",");
if (params.length < 3) {
debug("params < 3, return");
return null;
}
String userId = params[0];
String facilityId = params[1];
String password = params[2];
System.err.println(userId);
System.err.println(facilityId);
System.err.println(password);
boolean pad = params.length == 4 && params[3].equals("pad") ? true : false;
String retXML;
StringBuilder sb = new StringBuilder();
sb.append(XML);
sb.append(RESOURCE_START);
// 2.1 ehrTouch test の組
if ( (!facilityId.equals(TEST_FACILITY_ID)) ||
(!userId.equals(TEST_USER_ID)) ||
(!password.equals(TEST_PASSWORD)) ) {
sb.append(RESOURCE_END);
retXML = sb.toString();
System.err.println(retXML);
return retXML;
}
sb.append(USER_START);
propertyString(ELEMENT_USER_ID, userId, sb);
propertyString(ELEMENT_COMMON_NAME, TEST_USER_NAME, sb);
propertyString(ELEMENT_MEMBER_TYPE, TEST_MEMBER_TYPE, sb);
sb.append(FACILITY_START);
if (pad) {
propertyString(ELEMENT_FACILITY_ID, SYLK_FACILITY_ID, sb); // 2.1 をデモに使用する
} else {
propertyString(ELEMENT_FACILITY_ID, TEST_FACILITY_ID, sb);
}
propertyString(ELEMENT_FACILITY_NAME, TEST_FACILITY_NAME, sb);
sb.append(FACILITY_END);
sb.append(USER_END);
sb.append(RESOURCE_END);
retXML = sb.toString();
System.err.println(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;
}
String facilityId = params[0];
//int firstResult = Integer.parseInt(params[1]);
//int maxResult = Integer.parseInt(params[2]);
boolean pad = params.length == 4 && params[3].equals("pad") ? true : false;
// 新患リストは 150 が firstResult
int firstResult = 150;
int maxResult = 50;
List<DemoPatient> list = iPhoneServiceBean.getFirstVisitorsDemo(firstResult, maxResult);
StringBuilder sb = new StringBuilder();
sb.append(XML);
sb.append(RESOURCE_START);
GregorianCalendar gc = new GregorianCalendar();
int cnt = 0;
int cicle = 5;
String pk = null;
String patientId = null;
for (DemoPatient patient : list) {
sb.append(PATIENT_START);
if (pad) {
int mod = cnt % cicle;
cnt++;
switch (mod) {
case 0:
pk = TEST_PATIENT_PK1;
patientId = "00001";
break;
case 1:
pk = TEST_PATIENT_PK2;
patientId = "00002";
break;
case 2:
pk = TEST_PATIENT_PK3;
patientId = "00003";
break;
case 3:
pk = TEST_PATIENT_PK4;
patientId = "00004";
break;
case 4:
pk = TEST_PATIENT_PK5;
patientId = "00005";
break;
}
} else {
pk = String.valueOf(patient.getId());
switch (pk.length()) {
case 1:
patientId = "00000" + pk;
break;
case 2:
patientId = "0000" + pk;
break;
case 3:
patientId = "000" + pk;
break;
}
}
propertyString(ELEMENT_PK, pk, sb);
propertyString(ELEMENT_PATIENT_ID, patientId, sb);
propertyString(ELEMENT_NAME, patient.getName(), sb);
propertyString(ELEMENT_KANA, patient.getKana(), sb);
String sex = sexValueToDesc(patient.getSex());
propertyString(ELEMENT_SEX, sex, sb);
propertyString(ELEMENT_BIRTHDAY, toIsoBirtday(patient.getBirthday()), sb);
gc.add(Calendar.DAY_OF_MONTH, -1);
propertyString(ELEMENT_FIRST_VISIT, simpleFormat(gc.getTime()), 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]);
// 直近の来院
int firstResult = 0;
int maxResult = 30;
List<DemoPatient> list = iPhoneServiceBean.getPatientVisitDemo(firstResult, maxResult);
StringBuilder sb = new StringBuilder();
sb.append(XML);
sb.append(RESOURCE_START);
Date now = new Date();
String nowStr = simpleFormat(now);
for (DemoPatient patient : list) {
sb.append(ELEMENT_PATIENT_VISIT_START);
propertyString(ELEMENT_PVT_DATE, nowStr, sb);
sb.append(PATIENT_START);
String id = String.valueOf(patient.getId());
String patientId = null;
switch (id.length()) {
case 1:
patientId = "00000" + id;
break;
case 2:
patientId = "0000" + id;
break;
case 3:
patientId = "000" + id;
break;
}
propertyString(ELEMENT_PK, id, sb);
propertyString(ELEMENT_PATIENT_ID, patientId, sb);
propertyString(ELEMENT_NAME, patient.getName(), sb);
propertyString(ELEMENT_KANA, patient.getKana(), sb);
String sex = sexValueToDesc(patient.getSex());
propertyString(ELEMENT_SEX, sex, sb);
propertyString(ELEMENT_BIRTHDAY, toIsoBirtday(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;
}
String facilityId = params[0];
String start = params[1];
String end = params[2];
// 無条件に設定
int firstResult = 0;
int maxResult = 60;
boolean pad = false;
if (params.length==6) {
firstResult = Integer.parseInt(params[3]);
//maxResult = Integer.parseInt(params[4]);
maxResult = firstResult == 0 ? maxResult : 1; // refresh
pad = params[5].equals("pad") ? true : false;
}
start = start.replaceAll(" ", MML_DATE_TIME_SEPARATOR);
//end = end.replaceAll(" ", MML_DATE_TIME_SEPARATOR);
// getPatientVisitRangeDemo
List<DemoPatient> list = iPhoneServiceBean.getPatientVisitRangeDemo(firstResult, maxResult);
StringBuilder sb = new StringBuilder();
sb.append(XML);
sb.append(RESOURCE_START);
int index = start.indexOf(MML_DATE_TIME_SEPARATOR);
String dummyDate = start.substring(0, index);
int dummyH = 9;
int dummyM = 0;
String hStr;
String mStr;
StringBuilder timeSb;
String done;
int cnt = 0;
int cicle = 5;
String pk = null;
String patientId = null;
for (DemoPatient patient : list) {
timeSb = new StringBuilder();
timeSb.append(dummyDate);
timeSb.append(MML_DATE_TIME_SEPARATOR);
hStr = String.valueOf(dummyH);
if (hStr.length()==1) {
timeSb.append("0");
}
timeSb.append(hStr);
timeSb.append(":");
mStr = String.valueOf(dummyM);
if (mStr.length()==1) {
timeSb.append("0");
}
timeSb.append(mStr);
timeSb.append(":00");
sb.append(ELEMENT_PATIENT_VISIT_START);
propertyString(ELEMENT_PVT_DATE, timeSb.toString(), sb);
// 始めの30人に診察終了フラグをセットする
done = index++ < 30 ? "1" : "0";
propertyString(ELEMENT_PVT_STATUS, done, sb);
sb.append(PATIENT_START);
if (pad) {
int mod = cnt % cicle;
cnt++;
switch (mod) {
case 0:
pk = TEST_PATIENT_PK1;
patientId = "00001";
break;
case 1:
pk = TEST_PATIENT_PK2;
patientId = "00002";
break;
case 2:
pk = TEST_PATIENT_PK3;
patientId = "00003";
break;
case 3:
pk = TEST_PATIENT_PK4;
patientId = "00004";
break;
case 4:
pk = TEST_PATIENT_PK5;
patientId = "00005";
break;
}
} else {
pk = String.valueOf(patient.getId());
patientId = null;
switch (pk.length()) {
case 1:
patientId = "00000" + pk;
break;
case 2:
patientId = "0000" + pk;
break;
case 3:
patientId = "000" + pk;
break;
}
}
propertyString(ELEMENT_PK, pk, sb);
propertyString(ELEMENT_PATIENT_ID, patientId, sb);
propertyString(ELEMENT_NAME, patient.getName(), sb);
propertyString(ELEMENT_KANA, patient.getKana(), sb);
String sex = sexValueToDesc(patient.getSex());
propertyString(ELEMENT_SEX, sex, sb);
propertyString(ELEMENT_BIRTHDAY, toIsoBirtday(patient.getBirthday()),sb);
sb.append(PATIENT_END);
sb.append(ELEMENT_PATIENT_VISIT_END);
// 5分 進める
dummyM+=5;
if (dummyM == 60) {
dummyH++;
dummyM = 0;
}
}
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;
}
String facilityId = params[0];
String start = params[1];
String end = params[2];
boolean pad = (params.length== 4 && params[3].equals("pad")) ? true : false;
// 無条件に設定
int firstResult = 60;
int maxResult = 70;
int examDone = 0; // to 30
start = start.replaceAll(" ", MML_DATE_TIME_SEPARATOR);
//end = end.replaceAll(" ", MML_DATE_TIME_SEPARATOR);
// getPatientVisitRangeDemo
List<DemoPatient> list = iPhoneServiceBean.getPatientVisitRangeDemo(firstResult, maxResult);
StringBuilder sb = new StringBuilder();
sb.append(XML);
sb.append(RESOURCE_START);
int index = start.indexOf(MML_DATE_TIME_SEPARATOR);
String dummyDate = start.substring(0, index);
int dummyH = 9;
int dummyM = 0;
String hStr;
String mStr;
StringBuilder timeSb;
String done;
int cnt = 0;
int cicle = 5;
String pk = null;
String patientId = null;
for (DemoPatient patient : list) {
timeSb = new StringBuilder();
timeSb.append(dummyDate);
timeSb.append(MML_DATE_TIME_SEPARATOR);
hStr = String.valueOf(dummyH);
if (hStr.length()==1) {
timeSb.append("0");
}
timeSb.append(hStr);
timeSb.append(":");
mStr = String.valueOf(dummyM);
if (mStr.length()==1) {
timeSb.append("0");
}
timeSb.append(mStr);
timeSb.append(":00");
sb.append(ELEMENT_PATIENT_VISIT_START);
propertyString(ELEMENT_PVT_DATE, timeSb.toString(), sb);
// 始めの30人に診察終了フラグをセットする
done = index++ < 30 ? "1" : "0";
propertyString(ELEMENT_PVT_STATUS, done, sb);
sb.append(PATIENT_START);
if (pad) {
int mod = cnt % cicle;
cnt++;
switch (mod) {
case 0:
pk = TEST_PATIENT_PK1;
patientId = "00001";
break;
case 1:
pk = TEST_PATIENT_PK2;
patientId = "00002";
break;
case 2:
pk = TEST_PATIENT_PK3;
patientId = "00003";
break;
case 3:
pk = TEST_PATIENT_PK4;
patientId = "00004";
break;
case 4:
pk = TEST_PATIENT_PK5;
patientId = "00005";
break;
}
} else {
pk = String.valueOf(patient.getId());
patientId = null;
switch (pk.length()) {
case 1:
patientId = "00000" + pk;
break;
case 2:
patientId = "0000" + pk;
break;
case 3:
patientId = "000" + pk;
break;
}
}
propertyString(ELEMENT_PK, pk, sb);
propertyString(ELEMENT_PATIENT_ID, patientId, sb);
propertyString(ELEMENT_NAME, patient.getName(), sb);
propertyString(ELEMENT_KANA, patient.getKana(), sb);
String sex = sexValueToDesc(patient.getSex());
propertyString(ELEMENT_SEX, sex, sb);
propertyString(ELEMENT_BIRTHDAY, toIsoBirtday(patient.getBirthday()),sb);
sb.append(PATIENT_END);
sb.append(ELEMENT_PATIENT_VISIT_END);
// 5分 進める
dummyM+=5;
if (dummyM == 60) {
dummyH++;
dummyM = 0;
}
}
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) {
Long id = Long.parseLong(pk);
DemoPatient patient = iPhoneServiceBean.getPatientDemo(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);
String ppk = String.valueOf(patient.getId());
String patientId = null;
switch (ppk.length()) {
case 1:
patientId = "00000" + ppk;
break;
case 2:
patientId = "0000" + ppk;
break;
case 3:
patientId = "000" + ppk;
break;
}
propertyString(ELEMENT_PK, ppk, sb);
propertyString(ELEMENT_PATIENT_ID, patientId, sb);
propertyString(ELEMENT_NAME, patient.getName(), sb);
propertyString(ELEMENT_KANA, patient.getKana(), sb);
String sex = sexValueToDesc(patient.getSex());
propertyString(ELEMENT_SEX, sex, sb);
propertyString(ELEMENT_BIRTHDAY, toIsoBirtday(patient.getBirthday()), sb);
if (patient.getAddress()!=null) {
sb.append(ELEMENT_ADDRESS_START);
propertyString(ELEMENT_FULL_ADDRESS, patient.getAddress(), sb);
sb.append(ELEMENT_ADDRESS_END);
}
propertyString(ELEMENT_TELEPHONE, patient.getTelephone(), sb);
propertyString(ELEMENT_MOBILE_PHONE, patient.getMobile(), 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("/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]);
boolean pad = params.length == 5 && params[4].equals("pad") ? true : false;
List<DemoPatient> list;
// ひらがなで始まっている場合
if (KanjiHelper.isHiragana(name.charAt(0))) {
list = iPhoneServiceBean.getPatientsByKanaDemo(name, firstResult, maxResult);
}
else {
// 漢字で検索
list = iPhoneServiceBean.getPatientsByNameDemo(name, firstResult, maxResult);
}
StringBuilder sb = new StringBuilder();
sb.append(XML);
sb.append(RESOURCE_START);
int cnt = 0;
int cicle = 5;
String pk = null;
String patientId = null;
for (DemoPatient patient : list) {
sb.append(PATIENT_START);
if (pad) {
int mod = cnt % cicle;
cnt++;
switch (mod) {
case 0:
pk = TEST_PATIENT_PK1;
patientId = "00001";
break;
case 1:
pk = TEST_PATIENT_PK2;
patientId = "00002";
break;
case 2:
pk = TEST_PATIENT_PK3;
patientId = "00003";
break;
case 3:
pk = TEST_PATIENT_PK4;
patientId = "00004";
break;
case 4:
pk = TEST_PATIENT_PK5;
patientId = "00005";
break;
}
} else {
pk = String.valueOf(patient.getId());
patientId = null;
switch (pk.length()) {
case 1:
patientId = "00000" + pk;
break;
case 2:
patientId = "0000" + pk;
break;
case 3:
patientId = "000" + pk;
break;
}
}
propertyString(ELEMENT_PK, pk, sb);
propertyString(ELEMENT_PATIENT_ID, patientId, sb);
propertyString(ELEMENT_NAME, patient.getName(), sb);
propertyString(ELEMENT_KANA, patient.getKana(), sb);
String sex = sexValueToDesc(patient.getSex());
propertyString(ELEMENT_SEX, sex, sb);
propertyString(ELEMENT_BIRTHDAY, toIsoBirtday(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;
List<DemoRp> retList = iPhoneServiceBean.getRpDemo();
Collections.shuffle(retList);
StringBuilder sb = new StringBuilder();
sb.append(XML);
sb.append(RESOURCE_START);
if (retList==null || retList.isEmpty()) {
sb.append(RESOURCE_END);
return sb.toString();
}
int index = 0;
GregorianCalendar gc = new GregorianCalendar();
for (int i = 0; i < 5; i++) {
gc.add(Calendar.DAY_OF_MONTH, -14);
Date date = gc.getTime();
sb.append(ELEMENT_BUNDLE_MED_START);
propertyString(ELEMENT_RP_DATE, new SimpleDateFormat("yyyy-MM-dd").format(date), sb);
String bundleNumber = String.valueOf(i+3);
String admin = null;
switch (i) {
case 0:
admin = "医師の指示通りに";
break;
case 1:
admin = "1日3回毎食後に";
break;
case 2:
admin = "就寝前に";
break;
case 3:
admin = "1日3回食間に";
break;
case 4:
admin = "1日1回朝食後に";
break;
}
for (int j = 0; j < 3; j++) {
DemoRp rp = retList.get(index++);
sb.append(ELEMENT_CLAIM_ITEM_START);
propertyString(ELEMENT_CLAIM_ITEM_NAME, rp.getName(), sb);
propertyString(ELEMENT_CLAIM_ITEM_QUANTITY, rp.getQuantity(), sb);
propertyString(ELEMENT_CLAIM_ITEM_UNIT, rp.getUnit(), sb);
propertyString(ELEMENT_CLAIM_ITEM_NUM_DAYS, bundleNumber, sb);
propertyString(ELEMENT_CLAIM_ITEM_ADMINI, admin, 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/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]);
facilityId = TEST_DEMO_FACILITY_ID;
patientId = TEST_DEMO_PATIENT_ID;
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);
GregorianCalendar gc = new GregorianCalendar();
for (NLaboModule module : list) {
sb.append(ELEMENT_MODULE_START);
propertyString(ELEMENT_LABO_CODE, module.getLaboCenterCode(), sb);
gc.add(Calendar.DAY_OF_MONTH, -14);
propertyString(ELEMENT_SAMPLE_DATE, simpleFormat(gc.getTime()), 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];
facilityId = TEST_DEMO_FACILITY_ID;
patientId = TEST_DEMO_PATIENT_ID;
// 結果を 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);
// 基準値
if (item.getNormalValue()!=null) {
propertyString(ELEMENT_NORMAL_VALUE, item.getNormalValue(), sb);
}
// 単位
if (item.getUnit()!=null) {
propertyString(ELEMENT_UNIT, item.getUnit(), sb);
}
GregorianCalendar gc = new GregorianCalendar();
// sampleDate の逆順で結果データを出力する
for (int k = 0; k < cnt; k++) {
item = list.get(k);
sb.append(ELEMENT_RESULT_START);
// sampleDate
gc.add(Calendar.DAY_OF_MONTH, -14);
propertyString(ELEMENT_SAMPLE_DATE, simpleFormat(gc.getTime()), 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) {
}
List<DemoDisease> list = iPhoneServiceBean.getDiagnosisDemo();
Collections.shuffle(list);
int cnt = list.size();
if (cnt == 0) {
sb.append(RESOURCE_END);
String ret = sb.toString();
debug(ret);
return ret;
}
cnt = 0;
int index = firstResult;
GregorianCalendar gc = new GregorianCalendar();
GregorianCalendar gc2 = new GregorianCalendar();
while (cnt < maxResult) {
DemoDisease model = list.get(index++);
sb.append(ELEMENT_DIAGNOSIS_START);
if (model.getDisease()!=null) {
propertyString(ELEMENT_DIAGNOSIS, model.getDisease(), sb);
}
propertyString(ELEMENT_CATEGORY, "主病名", sb);
// 最初の二つはアクティブとする
if (cnt < 2) {
gc.add(Calendar.DAY_OF_MONTH, -14);
gc2.add(Calendar.DAY_OF_MONTH, -7);
// 開始日のみ
propertyString(ELEMENT_START_DATE, new SimpleDateFormat("yyyy-MM-dd").format(gc.getTime()), sb);
} else {
if (cnt % 3 != 0) {
propertyString(ELEMENT_OUTCOME, "治癒", sb);
} else {
propertyString(ELEMENT_OUTCOME, "中止", sb);
}
// 開始日
gc.add(Calendar.DAY_OF_MONTH, -14);
propertyString(ELEMENT_START_DATE, new SimpleDateFormat("yyyy-MM-dd").format(gc.getTime()), sb);
// 終了日
gc2.add(Calendar.DAY_OF_MONTH, -7);
propertyString(ELEMENT_END_DATE, new SimpleDateFormat("yyyy-MM-dd").format(gc2.getTime()), sb);
}
sb.append(ELEMENT_DIGNOSIS_END);
cnt++;
}
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);
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("/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);
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("/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("/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 = ServiceLocator.getWebService().getDocumentCount(patientPk);
// sb.append(ELEMENT_PAGE_INFO_START);
// propertyString(ELEMENT_NUM_RECORDS, count.toString(), sb);
// sb.append(ELEMENT_PAGE_INFO_END);
int count = 0;
if (patientPk == Integer.parseInt(TEST_PATIENT_PK1)) {
// patientId = "00001";
count = 9;
} else if (patientPk == Integer.parseInt(TEST_PATIENT_PK2)) {
// patientId = "00002";
count = 8;
} else if (patientPk == Integer.parseInt(TEST_PATIENT_PK3)) {
// patientId = "00003";
count = 7;
} else if (patientPk == Integer.parseInt(TEST_PATIENT_PK4)) {
// patientId = "00004";
count = 6;
} else if (patientPk == Integer.parseInt(TEST_PATIENT_PK5)) {
// patientId = "00005";
count = 5;
}
sb.append(ELEMENT_PAGE_INFO_START);
propertyString(ELEMENT_NUM_RECORDS, String.valueOf(count), sb);
sb.append(ELEMENT_PAGE_INFO_END);
}
// 検索する
List<DocumentModel> list = iPhoneServiceBean.getDocuments(patientPk, firstResult, maxResult);
for (DocumentModel doc : list) {
sb.append(ELEMENT_DOCUMENT_START);
// 確定日、記載者
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();
}
}
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);
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;
}
}