« byomeiCount の永続化 | トップページ | CLAIM だけ送る »

2010年7月29日 (木)

生年月日検索

患者検索のキーワード入力で,検索キーワードの頭にアルファベット+スペースを付けると,それぞれ下記のような検索ができるようになっている。この機能を拡張して,B 年-月-日 で生年月日検索ができるようにした。なお,年号で入力する場合は,最初の B を省略できるようにした。
例)B H12-3-4 または H12-3-4 または B 2000-03-04 などと入力する。
N 名前検索
K カナ検索
A 住所検索
Z 郵便番号検索
T 電話番号検索
I ID 検索
E メールアドレス検索
O その他 ID 検索(コーディングされていない)
B 生年月日検索(今回作成)

 

dto/PatientSearchSpec.java

//pns^
public static final int BIRTHDAY_SEARCH         = 12;
private String birthday;

public void setBirthday(String birthday) {
  this.birthday = birthday;
}
public String getBirthday() {
  return birthday;
}
//pns$

ejb/RemotePatientServiceImpl.java

public Collection getPatients(PatientSearchSpec spec) {
 ・
 ・
//pns^
  case PatientSearchSpec.BIRTHDAY_SEARCH:
    String birthday = spec.getBirthday();
    if (!birthday.endsWith("%")) {
      birthday += "%";
    }
    ret = em.createQuery("from PatientModel p where p.facilityId = :fid and p.birthday like :birthday")
    .setMaxResults(50)
    .setParameter("fid", fid)
    .setParameter("birthday", birthday)
    .getResultList();
//pns$

infomodel/ModelUtils.java

/** 年号=>西暦変換 H22-7-26 => 2010-07-26 by pns
 * @param nengoBirthday
 * @return mmlBirthday
 */
public static String toSeireki(String nengoBirthday) {

  try {
    StringTokenizer st = new StringTokenizer(nengoBirthday, "-");
    String yearStr = st.nextToken();
    String monthStr = st.nextToken();
    String dateStr = st.nextToken();

    String nengo = yearStr.substring(0,1);
    int year = Integer.valueOf(yearStr.substring(1));

    if ("M".equals(nengo) || "m".equals(nengo)) year = year + 1867;
    else if ("T".equals(nengo) || "t".equals(nengo)) year = year + 1911;
    else if ("S".equals(nengo) || "s".equals(nengo)) year = year + 1925;
    else if ("H".equals(nengo) || "h".equals(nengo)) year = year + 1988;
    else year = Integer.valueOf(yearStr); // 西暦で入ってきた場合

    if (monthStr.length() == 1) monthStr = "0" + monthStr;
    if (dateStr.length() == 1) dateStr = "0" + dateStr;

    StringBuilder mmlBirthday = new StringBuilder();
    mmlBirthday.append(Integer.toString(year));
    mmlBirthday.append("-");
    mmlBirthday.append(monthStr);
    mmlBirthday.append("-");
    mmlBirthday.append(dateStr);

    return mmlBirthday.toString();

  } catch (Exception ex) {
    System.out.println("ModelUtils.java: " + ex);
    return null;
  }
}

plugin/PatientSearchImpl.java

private void find(String text) {
 ・
 ・
  } else if (text.startsWith("O ") || text.startsWith("o ")) {
    spec.setCode(PatientSearchSpec.OTHERID_SEARCH);
    text = text.substring(2);
    spec.setOtherId(text);
//pns^      誕生日検索
  } else if (text.startsWith("B ") || text.startsWith("b ")) {
    spec.setCode(PatientSearchSpec.BIRTHDAY_SEARCH);
    text = text.substring(2);
    spec.setBirthday(ModelUtils.toSeireki(text));

  } else if (isNengoDate(text)) {
    spec.setCode(PatientSearchSpec.BIRTHDAY_SEARCH);
    spec.setBirthday(ModelUtils.toSeireki(text));
//pns$
 ・
 ・
private boolean isNengoDate(String text) {
  return text==null? false: text.matches("[MmTtSsHh][0-9]+-[0-9]+-[0-9]+");
}

« byomeiCount の永続化 | トップページ | CLAIM だけ送る »

OpenDolphin」カテゴリの記事