package open.dolphin.adm20.rest; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; 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.converter.UserModelConverter; import open.dolphin.infomodel.ChartEventModel; import open.dolphin.infomodel.DiagnosisSendWrapper; import open.dolphin.infomodel.DocInfoModel; import open.dolphin.infomodel.DocumentModel; import open.dolphin.infomodel.PVTHealthInsuranceModel; import open.dolphin.infomodel.PVTPublicInsuranceItemModel; import open.dolphin.infomodel.PatientList; import open.dolphin.infomodel.PatientModel; import open.dolphin.infomodel.UserModel; import open.dolphin.infomodel.VisitPackage; import open.dolphin.adm20.converter.IPatientList; import open.dolphin.adm20.converter.ISendPackage; import open.dolphin.adm20.converter.IVisitPackage; import open.dolphin.adm20.session.ADM20_IPhoneServiceBean; import open.dolphin.session.ChartEventServiceBean; import open.dolphin.session.KarteServiceBean; import open.dolphin.adm20.converter.ISendPackage2; import open.orca.rest.ORCAConnection; import org.codehaus.jackson.map.ObjectMapper; /** * * @author Kazushi Minagawa. */ @Path("/20/adm/jtouch") public class JsonTouchResource extends open.dolphin.rest.AbstractResource { private static final String QUERY_FACILITYID_BY_1001 ="select kanritbl from tbl_syskanri where kanricd='1001'"; @Inject private ADM20_IPhoneServiceBean iPhoneService; @Inject private KarteServiceBean karteService; @Inject private ChartEventServiceBean chartService; //minagawa^ 2013/08/29 //@Resource(mappedName="java:jboss/datasources/OrcaDS") //private DataSource ds; //minagawa$ @GET @Path("/user/{uid}") @Produces(MediaType.APPLICATION_JSON) public UserModelConverter getUserById(@PathParam("uid") String uid) { // 検索 UserModel user = iPhoneService.getUserById(uid); // Converter UserModelConverter conv = new UserModelConverter(); conv.setModel(user); return conv; } @GET @Path("/patients/name/{param}") @Produces(MediaType.APPLICATION_JSON) public IPatientList getPatientsByNameOrId(@Context HttpServletRequest servletReq, @PathParam("param") String param) { //System.err.println("getPatientsByNameOrId"); String [] params = param.split(","); String fid = getRemoteFacility(servletReq.getRemoteUser()); String name = params[0]; //System.err.println(name); int firstResult = params.length==3 ? Integer.parseInt(params[1]) : 0; int maxResult = params.length==3 ? Integer.parseInt(params[2]) :100; List<PatientModel> list; // ひらがなで始まっている場合はカナに変換する if (KanjiHelper.isHiragana(name.charAt(0))) { name = KanjiHelper.hiraganaToKatakana(name); } if (KanjiHelper.isKatakana(name.charAt(0))) { list = iPhoneService.getPatientsByKana(fid, name, firstResult, maxResult); } else { // 漢字で検索 list = iPhoneService.getPatientsByName(fid, name, firstResult, maxResult); } //System.err.println(list.size()); PatientList patients = new PatientList(); patients.setList(list); IPatientList ipatients = new IPatientList(); ipatients.setModel(patients); return ipatients; } @GET @Path("/visitpackage/{param}") @Produces(MediaType.APPLICATION_JSON) public IVisitPackage getVisitPackage(@PathParam("param") String param) { String[] params = param.split(","); long pvtPK = Long.parseLong(params[0]); long patientPK = Long.parseLong(params[1]); long docPK = Long.parseLong(params[2]); int mode = Integer.parseInt(params[3]); // VisitTouchでカルテ作成に必要なwrapperオブジェクト VisitPackage visit = iPhoneService.getVisitPackage(pvtPK, patientPK, docPK, mode); if (visit.getDocumenModel()!=null) { visit.getDocumenModel().toDetuch(); } // 保健医療機関コードとJMARI番号 String number = getFacilityCodeBy1001(); visit.setNumber(number); // Converter IVisitPackage conv = new IVisitPackage(); conv.setModel(visit); return conv; } @POST @Path("/sendPackage") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String postSendPackage(String json) throws IOException { //System.err.println(json); ObjectMapper mapper = new ObjectMapper(); ISendPackage pkg = mapper.readValue(json, ISendPackage.class); long retPk = 0L; // カルテ文書 DocumentModel model = pkg.documentModel(); if (model!=null) { //minagawa^ VisitTouch 公費保険不具合 DocInfoModel docInfo = model.getDocInfoModel(); PVTHealthInsuranceModel pvtIns = docInfo.getPVTHealthInsuranceModel(); if (pvtIns!=null) { PVTPublicInsuranceItemModel[] arr; arr = pvtIns.getPVTPublicInsuranceItem(); if (arr!=null && arr.length>0) { List<PVTPublicInsuranceItemModel> list = new ArrayList(arr.length); list.addAll(Arrays.asList(arr)); pvtIns.setPublicItems(list); } } //minagawa$ retPk = karteService.addDocument(model); } // 病名Wrapper DiagnosisSendWrapper wrapper = pkg.diagnosisSendWrapperModel(); if (wrapper!=null) { karteService.postPutSendDiagnosis(wrapper); } // 削除病名 List<String> deleted = pkg.deletedDiagnsis(); if (deleted!=null) { List<Long> list = new ArrayList(deleted.size()); for (String str : deleted) { list.add(Long.parseLong(str)); } karteService.removeDiagnosis(list); } // Status更新 ChartEventModel cvt = pkg.chartEventModel(); if (cvt!=null) { chartService.processChartEvent(cvt); } return String.valueOf(retPk); } // S.Oh 2014/02/06 iPadのFreeText対応 Add Start @POST @Path("/sendPackage2") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public String postSendPackage2(String json) throws IOException { ObjectMapper mapper = new ObjectMapper(); ISendPackage2 pkg = mapper.readValue(json, ISendPackage2.class); long retPk = 0L; // カルテ文書 DocumentModel model = pkg.documentModel(); if (model!=null) { retPk = karteService.addDocument(model); } // 病名Wrapper DiagnosisSendWrapper wrapper = pkg.diagnosisSendWrapperModel(); if (wrapper!=null) { karteService.postPutSendDiagnosis(wrapper); } // 削除病名 List<String> deleted = pkg.deletedDiagnsis(); if (deleted!=null) { List<Long> list = new ArrayList(deleted.size()); for (String str : deleted) { list.add(Long.parseLong(str)); } karteService.removeDiagnosis(list); } // Status更新 ChartEventModel cvt = pkg.chartEventModel(); if (cvt!=null) { chartService.processChartEvent(cvt); } return String.valueOf(retPk); } // S.Oh 2014/02/06 Add End /** * 保健医療機関コードとJMARIコードを取得する。 * @return */ private String getFacilityCodeBy1001() { //s.oh^ 2013/10/17 ローカルORCA対応 try { // custom.properties から 保健医療機関コードとJMARIコードを読む Properties config = new Properties(); // コンフィグファイルを読み込む StringBuilder sb = new StringBuilder(); sb.append(System.getProperty("jboss.home.dir")); sb.append(File.separator); sb.append("custom.properties"); File f = new File(sb.toString()); FileInputStream fin = new FileInputStream(f); InputStreamReader r = new InputStreamReader(fin, "JISAutoDetect"); config.load(r); r.close(); // JMARI code String jmari = config.getProperty("jamri.code"); String hcfacility = config.getProperty("healthcarefacility.code"); if(jmari != null && jmari.length() == 12 && hcfacility != null && hcfacility.length() == 10) { StringBuilder ret = new StringBuilder(); ret.append(hcfacility); ret.append("JPN"); ret.append(jmari); return ret.toString(); } } catch (FileNotFoundException ex) { Logger.getLogger(JsonTouchResource.class.getName()).log(Level.SEVERE, null, ex); } catch (UnsupportedEncodingException ex) { Logger.getLogger(JsonTouchResource.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(JsonTouchResource.class.getName()).log(Level.SEVERE, null, ex); } //s.oh$ // SQL 文 StringBuilder buf = new StringBuilder(); buf.append(QUERY_FACILITYID_BY_1001); String sql = buf.toString(); Connection con = null; PreparedStatement ps; StringBuilder ret = new StringBuilder(); try { //minagawa^ 2013/08/29 //con = ds.getConnection(); con = ORCAConnection.getInstance().getConnection(); //minagawa$ ps = con.prepareStatement(sql); ResultSet rs = ps.executeQuery(); if (rs.next()) { String line = rs.getString(1); // 保険医療機関コード 10桁 ret.append(line.substring(0, 10)); // JMARIコード JPN+12桁 (total 15) int index = line.indexOf("JPN"); if (index>0) { ret.append(line.substring(index, index+15)); } } rs.close(); ps.close(); con.close(); con = null; } catch (Exception e) { e.printStackTrace(System.err); } finally { if (con != null) { try { con.close(); } catch (Exception e) { } } } return ret.toString(); } //minagawa^ private void log(String msg) { Logger.getLogger("open.dolphin").info(msg); } private void warn(String msg) { Logger.getLogger("open.dolphin").info(msg); } //minagawa$ }