ENRSignEngine.xjs 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Script type="xscript4.0"><![CDATA[/***************************************************************************************
  3. * System Name :
  4. * Job Name :
  5. * File Name : ENRSignEngine.xjs
  6. * Creator :
  7. * Make Date :
  8. *
  9. * Description :
  10. *---------------------------------------------------------------------------------------
  11. * Modify Date Modifier Modify Description
  12. *---------------------------------------------------------------------------------------
  13. *---------------------------------------------------------------------------------------
  14. ****************************************************************************************/
  15. //=======================================================================================
  16. // xjs Include
  17. //---------------------------------------------------------------------------------------
  18. include "com_commodulexp::SSZFM01001.xjs";
  19. //---------------------------------------------------------------------------------------
  20. var Sign = new ENRSign;
  21. //Sign.init();
  22. var lgv_tabSpace = ' ';
  23. /****************************************************************************************
  24. * Argument :
  25. * Description : 간호 인증 모듈 객체 선언
  26. ****************************************************************************************/
  27. function ENRSign(){
  28. this.certreload = true;
  29. this.debug = false;
  30. this.CERT_YEAR = 1970;
  31. this.CERT_MONTH = 1;
  32. this.CERT_DATE = 1;
  33. this.CERT_UID = "";
  34. this.CERT_DN = "";
  35. this.errmsg = "[전자서명 에러]";
  36. this.errcode = new Array;
  37. this.certchkflag = "Y";
  38. this.tempstr = "";
  39. this.signedInfos = new Array; // 외부용
  40. this.signData = ""; // 내부용
  41. this.signedData = ""; // 내부용
  42. this.emptyattname = "xml:"; // XML Text 변환시 Attribute 빈값에 대한 prefix name
  43. this.nulldatastring = "-"; // Topinfo 및 Session 데이터가 null 일때 인증데이터에 표기할 String
  44. this.ATTRNAME_PATINFO = "환자정보";
  45. this.ATTRNAME_SIGNINFO = "인증정보";
  46. this.ATTRNAME_SESSIONINFO = "Session정보";
  47. this.DSNAME_BASICINFO = "ds_enrsign_basicinfo";
  48. this.DSNAME_SIGNINFO = "ds_enrsign_signinfo";
  49. this.DSNAME_SIGNINFO_TEMP = "ds_enrsign_tempinfo";
  50. // Sign KMI Communication & Verify Function
  51. this.init = enrfSign_Init;
  52. this.makesigndata = enrfSign_MakeSignData;
  53. this.verifysign = enrfSign_VerifySign;
  54. // ENR Sign Create Funtion
  55. this.getcommoninfo = enrfSign_GetCommonInfo;
  56. this.settaginfos = enrfSign_SetTagInfos;
  57. this.setsigninstance = enrfSign_SetSignInstance;
  58. this.addnode = enrfSign_addSignInfoTotal;
  59. this.addnodeset = enrfSign_addSignInfoTotalSet;
  60. this.addnodes = enrfSign_addSignInfo;
  61. this.addnode_dstoxml = enrfSign_addSignInfo_dstoxml;
  62. this.getsigndata = enrfSign_makeSignInfo;
  63. this.getsigndataArray = enrfSign_GetSignDataArray;
  64. this.signprocess = enrfSign_SignProcess; // core
  65. this.view_signprocess = enrfSign_ViewSignProcess; // core
  66. }
  67. /****************************************************************************************
  68. * Argument :
  69. * Description : 전자 인증 모듈 초기화
  70. ****************************************************************************************/
  71. function enrfSign_Init(){
  72. return zesf_InitSign(); // 전자서명관련 모듈 생성 및 초기화 [comm_inf.xjs 내 함수 호출]
  73. }
  74. /****************************************************************************************
  75. * Argument :
  76. * Description : 전자 서명 실행
  77. ****************************************************************************************/
  78. function enrfSign_MakeSignData(pOrgData, pUid, pReload) {
  79. if (this.certload == "true" || this.certload == true)
  80. {
  81. pReload = false;
  82. }
  83. // 로그인 시 지정한 인증서로드 체크
  84. if(gv_bCertLoad == "true"){
  85. pReload = false; //인증서 타지 않도록
  86. }
  87. // 로드된 인증서를 가지고 전자서명을 수행 [comm_inf.xjs 내 함수 호출]
  88. var m_signedData = zesf_SignData( pOrgData, pUid, pReload);
  89. this.signData = pOrgData;
  90. this.signedData = m_signedData;
  91. return m_signedData;
  92. }
  93. /****************************************************************************************
  94. * Argument :
  95. * Description : 전자서명된 데이터 복원검증 Process
  96. ****************************************************************************************/
  97. function enrfSign_VerifySign(pSignedData){
  98. var orgData = "";
  99. //if (this.version == "TF4"){
  100. if (pSignedData == null) pSignedData = this.signedData;
  101. if (pSignedData != ""){
  102. orgData = CertManX.VerifyDataB64(pSignedData, 0 );
  103. if( orgData == "" ) {
  104. var msg = "전자서명 검증에";
  105. messageBox( msg, "E009", this.errmsg + CertManX.GetLastErrorMsg());
  106. }
  107. }
  108. //}
  109. return orgData;
  110. }
  111. /****************************************************************************************
  112. * Argument :
  113. * Description : 전자 인증 데이터셋 구성
  114. ****************************************************************************************/
  115. function enrfSign_SetSignInstance()
  116. {
  117. var m_topinfo = "pid▦환자번호▩pname▦환자이름▩age▦나이성별▩body▦키몸무게▩btype▦혈액형▩insukind▦보험유형▩orddept▦진료과▩apntdr▦지정의▩attndr▦주치의▩";
  118. var m_sessioninfo = "userid▦사용자번호▩usernm▦사용자이름▩posinstnm▦소속기관명▩posdeptnm▦소속부서명▩dutplceinstnm▦근무지기관명▩dutplcenm▦근무지부서명▩jobkindnm▦직종명▩jobposnm▦직위명▩jobrespnm▦직책명▩prfshipflagnm▦교직구분명▩deptabbr▦부서약어▩systemnm▦시스템명칭▩systeminstnm▦시스템소속기관명▩logindt▦로그인시간▩";
  119. if(utlf_isNull(form.all[this.DSNAME_BASICINFO])){
  120. enrfSign_createDs(this.DSNAME_BASICINFO);
  121. form.all[this.DSNAME_BASICINFO].addColumn("taginfo1", "string");
  122. form.all[this.DSNAME_BASICINFO].addColumn("taginfo3", "string");
  123. form.all[this.DSNAME_BASICINFO].addColumn("taginfo4", "string");
  124. form.all[this.DSNAME_BASICINFO].addColumn("taginfo5", "string");
  125. }
  126. if(form.all[this.DSNAME_BASICINFO].rowcount > 0) form.all[this.DSNAME_BASICINFO].clearData();
  127. form.all[this.DSNAME_BASICINFO].enableevent = false;
  128. // Topinfo - 0th row
  129. dsf_addRow(form.all[this.DSNAME_BASICINFO],
  130. [{col:"taginfo1", val:this.settaginfos(1, m_topinfo, "TopInfo", false)} // 인증할 데이터 정보 (미기록 노드 제거된 정보)
  131. ,{col:"taginfo3", val:this.settaginfos(1, m_topinfo, "TopInfo", true)} // 인증할 데이터 정보 (미기록 노드 제거 전 원본 정보)
  132. ,{col:"taginfo4", val:this.settaginfos(2, m_topinfo, "TopInfo", true)} // [3]데이터(없는 노드 포함된)를 text 형태로 추출보기
  133. ,{col:"taginfo5", val:this.settaginfos(2, m_topinfo, "TopInfo", false)}]); // [1]데이터(없는 노드 제거된)를 text 형태로 추출보기
  134. // SessionInfo - 1th row
  135. dsf_addRow(form.all[this.DSNAME_BASICINFO],
  136. [{col:"taginfo1", val:this.settaginfos(1, m_sessioninfo, "SessionInfo", false)} // 인증할 데이터 정보 (미기록 노드 제거된 정보)
  137. ,{col:"taginfo3", val:this.settaginfos(1, m_sessioninfo, "SessionInfo", true)} // 인증할 데이터 정보 (미기록 노드 제거 전 원본 정보)
  138. ,{col:"taginfo4", val:this.settaginfos(2, m_sessioninfo, "SessionInfo", true)} // [3]데이터(없는 노드 포함된)를 text 형태로 추출보기
  139. ,{col:"taginfo5", val:this.settaginfos(2, m_sessioninfo, "SessionInfo", false)}]); // [1]데이터(없는 노드 제거된)를 text 형태로 추출보기
  140. form.all[this.DSNAME_BASICINFO].enableevent = true;
  141. // SignInfo
  142. if(utlf_isNull(form.all[this.DSNAME_SIGNINFO])){
  143. enrfSign_createDs(this.DSNAME_SIGNINFO);
  144. form.all[this.DSNAME_SIGNINFO].addColumn("taginfo1", "string");
  145. form.all[this.DSNAME_SIGNINFO].addColumn("taginfo3", "string");
  146. form.all[this.DSNAME_SIGNINFO].addColumn("taginfo4", "string");
  147. form.all[this.DSNAME_SIGNINFO].addColumn("taginfo5", "string");
  148. }
  149. if(form.all[this.DSNAME_SIGNINFO].rowcount > 0) form.all[this.DSNAME_SIGNINFO].clearData();
  150. }
  151. /****************************************************************************************
  152. * Argument : 1. pMode
  153. * 2. pKeyInfo
  154. * Description : 환자 (상단정보), 사용자 (세션정보) 조회
  155. ****************************************************************************************/
  156. function enrfSign_GetCommonInfo(pMode, pKeyInfo){
  157. var m_return = "";
  158. if (pMode == "TopInfo"){
  159. m_return = appf_getPatientInfo(pKeyInfo); // 환자정보
  160. if (utlf_isNull(m_return) || m_return == "null") m_return = this.nulldatastring;
  161. return m_return;
  162. } else if (pMode == "SessionInfo"){
  163. m_return = sysf_getUserInfo(pKeyInfo); // 사용자정보
  164. if(utlf_isNull(m_return) || m_return == "null") m_return = this.nulldatastring;
  165. return m_return;
  166. }
  167. }
  168. /****************************************************************************************
  169. * Argument : 1. bClearDs : DS 초기화 여부
  170. * Description : 전자 인증 실행
  171. ****************************************************************************************/
  172. function enrfSign_SignProcess(bClearDs){
  173. this.errcode[0] = 0;
  174. this.errcode[1] = 0;
  175. this.errcode[2] = 0;
  176. this.errcode[3] = 0;
  177. this.errcode[4] = 0;
  178. var bCheck = true;
  179. // var bResultArr = null; // (20140206) 사용하지 않는 변수 주석처리함
  180. // 인증결과 Clear Setting
  181. this.signedInfos[0] = false;
  182. this.signedInfos[1] = "";
  183. this.signedInfos[2] = "";
  184. this.signedInfos[3] = "";
  185. this.signedInfos[4] = "";
  186. this.signedInfos[5] = "";
  187. // model.removeNodeset(this.XPATH_SIGNBASE); // TF3,4
  188. enrfSign_clearDs(); // 전자 인증 데이터셋 초기화
  189. this.setsigninstance();
  190. try{
  191. // 인증 Process "fMake_SignData" CallBack 함수 : 사용자정의
  192. fMake_SignData();
  193. } catch(E){
  194. bCheck = false;
  195. sysf_messageBox("[Debug Mode] : ENR 인증데이터 생성함수(fMake_SignData)에 문제가 있습니다.", 'E');
  196. }
  197. this.errcode[0] = 300;
  198. if (bCheck == true){
  199. bCheck = this.getsigndataArray(this.CERT_UID, this.certreload); // Array 구조로 생성된 데이터를 돌려줌 : this.signedInfos
  200. }
  201. if (bClearDs == true){
  202. // 3. 인증을 위해 생성된 데이터 삭제
  203. enrfSign_clearDs();
  204. }
  205. return bCheck;
  206. }
  207. /****************************************************************************************
  208. * Argument : 1. bClearDs : DS 초기화 여부
  209. * Description : 전자 인증 실행 (통합기록조회용)
  210. ****************************************************************************************/
  211. function enrfSign_ViewSignProcess(bClearDs){
  212. //
  213. this.errcode[0] = 0;
  214. this.errcode[1] = 0;
  215. this.errcode[2] = 0;
  216. this.errcode[3] = 0;
  217. this.errcode[4] = 0;
  218. var bCheck = true;
  219. // 인증결과 Clear Setting
  220. this.signedInfos[0] = false;
  221. this.signedInfos[1] = "";
  222. this.signedInfos[2] = "";
  223. this.signedInfos[3] = "";
  224. this.signedInfos[4] = "";
  225. this.signedInfos[5] = "";
  226. //model.removeNodeset(this.XPATH_SIGNBASE); // TF3,4
  227. enrfSign_clearDs();
  228. this.setsigninstance();
  229. try{
  230. // 인증 Process "fMake_SignData" CallBack 함수 : 사용자정의
  231. fMake_ViewSignData();
  232. } catch(E){
  233. bCheck = false;
  234. sysf_messageBox("[Debug Mode] : ENR 인증데이터 생성함수(fMake_ViewSignData)에 문제가 있습니다.", "E");
  235. }
  236. this.errcode[0] = 300;
  237. if (bCheck == true){
  238. bCheck = this.getsigndataArray(this.CERT_UID, this.certreload); // Array 구조로 생성된 데이터를 돌려줌 : this.signedInfos
  239. }
  240. if (bClearDs == true){
  241. // 3. 인증을 위해 생성된 데이터 삭제
  242. enrfSign_clearDs();
  243. }
  244. return bCheck;
  245. }
  246. /****************************************************************************************
  247. * Argument : 1. pUid : User ID
  248. 2. pReload : User ID 초기화 여부
  249. * Description : 전자 인증 실행 (통합기록조회용)
  250. ****************************************************************************************/
  251. function enrfSign_GetSignDataArray(pUid, pReload) {
  252. var ls_enrinptsavetime = lf_getEMRHardCDList("Y", 450, 3);
  253. var ll_enrinptsavetime = utlf_isNull(ls_enrinptsavetime) ? 0 : parseInt(ls_enrinptsavetime) * -1;
  254. var mstatecheck = false;
  255. var mSignData1 = "";
  256. var mSignedData = "";
  257. var mSignData3 = "";
  258. var mViewData4 = "";
  259. var mViewData5 = "";
  260. this.errcode[1] = 300;
  261. try {
  262. this.errcode[1] = 310;
  263. mSignData3 = this.getsigndata(3); // 변경 xml 데이터저장패턴으로...
  264. this.errcode[1] = 320;
  265. mViewData4 = this.getsigndata(4); // 전자서명할 원문 데이터
  266. this.errcode[1] = 340;
  267. mSignData1 = this.getsigndata(1); // 변경 xml 데이터저장패턴으로...
  268. this.errcode[1] = 350;
  269. mViewData5 = this.getsigndata(5); // 전자서명할 원문 데이터
  270. this.errcode[1] = 360;
  271. // -----------------------(2010.08.18 센터)start--------------------
  272. //운영서버는 인증모듈 타고 그외서버는 인증모듈제외
  273. // 리허설로 인한 주석 해제 ( 2015.03.27 )
  274. } catch(E){
  275. sysf_messageBox("ENR 인증모듈 작업에 문제가 있습니다. 관리자에게 문의하세요 Code(" + this.errcode + ")...\n\n" + E, "E");
  276. return mstatecheck;
  277. }
  278. //if(sysf_getSystemInfo("devsystem") != 'true' && sysf_getSystemInfo("devsystem") != '1') {
  279. if(this.certchkflag == "Y") {
  280. if(ll_enrinptsavetime < 0 && sysf_getGlobalVariable("enrinptsavetime") >= utlf_getCurrentDateTime().toDate("YYYYMMDD hhmmss").getAddDate(ll_enrinptsavetime, "m").getDateFormat("YYYYMMDD hhmmss")){
  281. mSignedData = this.makesigndata(mSignData1, pUid, false);
  282. }else{
  283. mSignedData = this.makesigndata(mSignData1, pUid, pReload); //전자서명 popup호출
  284. }
  285. } else {
  286. mSignedData = mSignData1; //전자서명 없이 저장처리할 경우 설정 부분
  287. }
  288. //} else {
  289. // mSignedData = mSignData1; //전자서명 없이 저장처리할 경우 설정 부분
  290. // }
  291. // -----------------------(2010.08.18 센터)start--------------------
  292. try {
  293. this.errcode[1] = 370;
  294. if (utlf_isNull(mSignedData)) {
  295. this.signedInfos[0] = mstatecheck;
  296. this.signedInfos[1] = mSignData1; // 인증할 데이터 정보
  297. this.signedInfos[2] = mSignedData;
  298. this.signedInfos[3] = mSignData3;
  299. this.signedInfos[4] = mViewData4;
  300. this.signedInfos[5] = mViewData5;
  301. return false;
  302. }
  303. this.errcode[1] = 0;
  304. mstatecheck = true;
  305. } catch(E){
  306. sysf_messageBox("ENR 인증모듈 작업에 문제가 있습니다. 관리자에게 문의하세요 Code(" + this.errcode + ")...\n\n" + E, "E");
  307. return mstatecheck;
  308. }
  309. this.signedInfos[0] = mstatecheck; // [0] : 인증성공여부
  310. this.signedInfos[1] = mSignData1; // [1] : 인증할 데이터 정보 (미기록 노드 제거된 정보)
  311. this.signedInfos[2] = mSignedData; // [2] : 공인인증 처리후 데이터
  312. this.signedInfos[3] = mSignData3; // [3] : 인증할 데이터 정보 (미기록 노드 제거전 원본 노드)
  313. this.signedInfos[4] = mViewData4; // [4] : [3]데이터(없는 노드 포함된)를 text 형태로 추출보기
  314. this.signedInfos[5] = mViewData5; // [5] : [1]데이터(없는 노드 제거된)를 text 형태로 추출보기
  315. if(mstatecheck == true){
  316. if(ll_enrinptsavetime < 0 && sysf_getGlobalVariable("enrinptsavetime") >= utlf_getCurrentDateTime().toDate("YYYYMMDD hhmmss").getAddDate(ll_enrinptsavetime, "m").getDateFormat("YYYYMMDD hhmmss")){
  317. }else{
  318. sysf_setGlobalVariable("enrinptsavetime", utlf_getCurrentDateTime());
  319. }
  320. }
  321. return mstatecheck;
  322. }
  323. /****************************************************************************************
  324. * Argument : 1. pFlag : (1) xml 구조 return
  325. : (2) string 구조 return
  326. 2. sParStr : parsing될 데이터
  327. 3. pMode : 환자/사용자 정보 구분
  328. 4. bNullFlag : null value node 포함 여부
  329. * Description : 환자 상단정보 (TopInfo), 사용자 세션정보 (SessionInfo) 생성
  330. ****************************************************************************************/
  331. function enrfSign_SetTagInfos(pFlag, sParStr, pMode, bNullFlag){
  332. switch(pFlag){
  333. case 1: // xml구조
  334. var sHead = "";
  335. var sHeadEnd = "";
  336. var sAttrStr = ' name=';
  337. if(pMode == "TopInfo"){
  338. sHead = lgv_tabSpace + '<PatientInfo' + sAttrStr + "\"" + this.ATTRNAME_PATINFO + "\"" + '>\n';
  339. sHeadEnd = lgv_tabSpace + '</PatientInfo>' + '\n';
  340. }
  341. else if(pMode == "SessionInfo"){
  342. sHead = lgv_tabSpace + '<SessionInfo' + sAttrStr + "\"" + this.ATTRNAME_SESSIONINFO + "\"" + '>\n';
  343. sHeadEnd = lgv_tabSpace + '</SessionInfo>';
  344. }
  345. var sXML ="";
  346. sXML += sHead;
  347. var sGab = lgv_tabSpace + lgv_tabSpace;
  348. var arrParseInfo = sParStr.split("▩");
  349. for (var iCnt =0; iCnt < arrParseInfo.length; iCnt++){
  350. m_KeyName = arrParseInfo[iCnt].split("▦");
  351. if (!utlf_isNull(m_KeyName)){
  352. sXML+= sGab + '<' + m_KeyName[0] + sAttrStr + "\"" + m_KeyName[1] + "\"" + '>'
  353. + enrfSign_setCDATA(utlf_transNullToEmpty(this.getcommoninfo(pMode, m_KeyName[0], iCnt)))
  354. //+ "테스트중" + iCnt
  355. + '</' + m_KeyName[0] + '>\n';
  356. }
  357. }
  358. sXML += sHeadEnd;
  359. break;
  360. case 2: // str 구조
  361. var sHead = "";
  362. if(pMode == "TopInfo"){
  363. sHead = this.ATTRNAME_PATINFO + '\n';
  364. }
  365. else if(pMode == "SessionInfo"){
  366. sHead = this.ATTRNAME_SESSIONINFO + '\n';
  367. }
  368. var sXML = "";
  369. sXML += sHead;
  370. var sGab = lgv_tabSpace;
  371. var arrParseInfo = sParStr.split("▩");
  372. for (var iCnt =0; iCnt < arrParseInfo.length; iCnt++){
  373. m_KeyName = arrParseInfo[iCnt].split("▦");
  374. if (!utlf_isNull(m_KeyName)){
  375. if(!bNullFlag && utlf_isNull(this.getcommoninfo(pMode, m_KeyName[0], iCnt)))
  376. continue;
  377. sXML+= sGab + m_KeyName[1] + ": "
  378. + utlf_transNullToEmpty(this.getcommoninfo(pMode, m_KeyName[0], iCnt));
  379. //+ "테스트중" + iCnt
  380. if(iCnt < arrParseInfo.length-1) sXML += '\n';
  381. }
  382. }
  383. break;
  384. }
  385. return sXML;
  386. }
  387. /****************************************************************************************
  388. * Argument : 1. sType : (1) 인증할 데이터 정보 (미기록 노드 제거된 정보)
  389. (3) 인증할 데이터 정보 (미기록 노드 제거 전 원본 정보)
  390. (4) 데이터(없는 노드 포함된)를 text 형태로 추출보기
  391. (5) 데이터(없는 노드 제거된)를 text 형태로 추출보기
  392. * Description : 전체 인증 정보 (SignData) 생성
  393. ****************************************************************************************/
  394. function enrfSign_makeSignInfo(sType){
  395. if(utlf_isNull(sType)) return;
  396. var sAttrStr = ' name=';
  397. var sTotalHead = '<SignData>\n';
  398. var sTotalHeadEnd = '\n</SignData>';
  399. var sSignHead = lgv_tabSpace + '<SignInfo' + sAttrStr + "\"" + this.ATTRNAME_SIGNINFO + "\"" + '>\n';
  400. var sSignHeadEnd = lgv_tabSpace + '</SignInfo>\n';
  401. var sXML = "";
  402. if(sType < 4) sXML += sTotalHead;
  403. // patinfo
  404. sXML += utlf_transNullToEmpty(form.all[this.DSNAME_BASICINFO].getColumn(0, "taginfo" + sType));
  405. // signinfo
  406. if(sType < 4) sXML += sSignHead;
  407. else sXML += this.ATTRNAME_SIGNINFO + '\n';
  408. for(var i=0; i<form.all[this.DSNAME_SIGNINFO].rowcount; i++){
  409. sXML += utlf_transNullToEmpty(form.all[this.DSNAME_SIGNINFO].getColumn(i, "taginfo" + sType));
  410. }
  411. if(sType < 4) sXML += sSignHeadEnd;
  412. // sessioninfo
  413. sXML += utlf_transNullToEmpty(form.all[this.DSNAME_BASICINFO].getColumn(1, "taginfo" + sType));
  414. if(sType < 4) sXML += sTotalHeadEnd;
  415. return sXML;
  416. }
  417. /****************************************************************************************
  418. * Argument : 1. sDepth : xml path (Array or String)
  419. 2. sSaveXML : dataset.saveXML() return data (Array or String)
  420. 3. flagCData : CData 사용여부(false:미사용, 그외:사용)
  421. * Description : 데이터 정보 (SignInfo) 생성
  422. ****************************************************************************************/
  423. function enrfSign_addSignInfoTotal(sDepth, sSaveXML, flagCData){
  424. if( utlf_isNull(flagCData) ){
  425. flagCData = true;
  426. }
  427. //try{
  428. form.all[this.DSNAME_SIGNINFO].enableevent = false;
  429. if(sSaveXML instanceof Array){
  430. for(var i in sSaveXML){
  431. dsf_addRow(form.all[this.DSNAME_SIGNINFO],
  432. [{col:"taginfo1", val:this.addnodes(1, false, sDepth[i], sSaveXML[i], false, flagCData)} // 인증할 데이터 정보 (미기록 노드 제거된 정보)
  433. ,{col:"taginfo3", val:this.addnodes(1, false, sDepth[i], sSaveXML[i], true, flagCData)} // 인증할 데이터 정보 (미기록 노드 제거 전 원본 정보)
  434. ,{col:"taginfo4", val:this.addnodes(2, false, sDepth[i], sSaveXML[i], true, flagCData)} // [3]데이터(없는 노드 포함된)를 text 형태로 추출보기
  435. ,{col:"taginfo5", val:this.addnodes(2, false, sDepth[i], sSaveXML[i], false, flagCData)}]); // [1]데이터(없는 노드 제거된)를 text 형태로 추출보기
  436. }
  437. }
  438. else{
  439. dsf_addRow(form.all[this.DSNAME_SIGNINFO],
  440. [{col:"taginfo1", val:this.addnodes(1, false, sDepth, sSaveXML, false, flagCData)} // 인증할 데이터 정보 (미기록 노드 제거된 정보)
  441. ,{col:"taginfo3", val:this.addnodes(1, false, sDepth, sSaveXML, true, flagCData)} // 인증할 데이터 정보 (미기록 노드 제거 전 원본 정보)
  442. ,{col:"taginfo4", val:this.addnodes(2, false, sDepth, sSaveXML, true, flagCData)} // [3]데이터(없는 노드 포함된)를 text 형태로 추출보기
  443. ,{col:"taginfo5", val:this.addnodes(2, false, sDepth, sSaveXML, false, flagCData)}]); // [1]데이터(없는 노드 제거된)를 text 형태로 추출보기
  444. }
  445. form.all[this.DSNAME_SIGNINFO].enableevent = true;
  446. //} catch(E){
  447. // sysf_messageBox("Sign.addnoode()의 파라미터를 확인하십시오.", 'E');
  448. //}
  449. }
  450. /****************************************************************************************
  451. * Argument : 1. sDepth : xml path (Array)
  452. 2. sSaveXML : dataset.saveXML() return data (Array)
  453. 3. flagCData : CData 사용여부(false:미사용, 그외:사용)
  454. * Description : 데이터 정보 (SignInfo) 생성
  455. ****************************************************************************************/
  456. function enrfSign_addSignInfoTotalSet(sDepth, sSaveXML, flagCData){
  457. if( utlf_isNull(flagCData) ){
  458. flagCData = true;
  459. }
  460. //try{
  461. form.all[this.DSNAME_SIGNINFO].enableevent = false;
  462. dsf_addRow(form.all[this.DSNAME_SIGNINFO],
  463. [{col:"taginfo1", val:this.addnodes(1, true, sDepth , sSaveXML, false, flagCData)} // 인증할 데이터 정보 (미기록 노드 제거된 정보)
  464. ,{col:"taginfo3", val:this.addnodes(1, true, sDepth , sSaveXML, true, flagCData)} // 인증할 데이터 정보 (미기록 노드 제거 전 원본 정보)
  465. ,{col:"taginfo4", val:this.addnodes(2, true, sDepth , sSaveXML, true, flagCData)} // [3]데이터(없는 노드 포함된)를 text 형태로 추출보기
  466. ,{col:"taginfo5", val:this.addnodes(2, true, sDepth , sSaveXML, false, flagCData)}]); // [1]데이터(없는 노드 제거된)를 text 형태로 추출보기
  467. form.all[this.DSNAME_SIGNINFO].enableevent = true;
  468. //} catch(E){
  469. // sysf_messageBox("Sign.addnoodeset()의 파라미터를 확인하십시오.", 'E');
  470. //}
  471. }
  472. /****************************************************************************************
  473. * Argument : 1. pFlag : (1) xml 구조 return
  474. : (2) string 구조 return
  475. 2. bAppendFlag : nodeset append 여부
  476. 2. sDepth : xml path
  477. 3. sSaveXML : dataset.saveXML() return data
  478. 4. bNullFlag : null value node 포함 여부
  479. * Description : 데이터 정보 (SignInfo) 생성
  480. ****************************************************************************************/
  481. var sBefDepthNm;
  482. var sAtfDepthNm;
  483. function enrfSign_addSignInfo(pFlag, bAppendFlag, sDepth, sSaveXML, bNullFlag, flagCData){
  484. if(utlf_isNull(sDepth)) return;
  485. if(utlf_isNull(sSaveXML)) return;
  486. var ds_enrsign_tempinfo = new Dataset;
  487. ds_enrsign_tempinfo.name = this.DSNAME_SIGNINFO_TEMP;
  488. form.addChild(this.DSNAME_SIGNINFO_TEMP, ds_enrsign_tempinfo);
  489. var sXML ="";
  490. var sGab = "";
  491. var sColumInfo = "";
  492. switch (bAppendFlag){
  493. case true: // addnodeset (서로 다른 depth의 dataset n개 이상 add할 경우)
  494. sBefDepthNm = "";
  495. sAtfDepthNm = "";
  496. var depth = sDepth;
  497. var sSttDepth = enrfSign_signDepth(pFlag, false, depth[0], "S");
  498. sXML += sSttDepth;
  499. // -----------------------------------------------------------
  500. //실질 컬럼정보생성
  501. var nArray, nLen;
  502. for(var i in sSaveXML){
  503. nArray = depth[i].split("/");
  504. nLen = nArray.length;
  505. sGab = enrfSign_getGab(pFlag, (utlf_isNull(nArray[nLen-1]) ? nLen-2 : nLen-1));
  506. ds_enrsign_tempinfo.clearData();
  507. ds_enrsign_tempinfo.loadXML(sSaveXML[i]);
  508. if(i>0) sBefDepthNm = depth[i-1].split("/")[nLen-2];
  509. if(i<sSaveXML.length-1) sAtfDepthNm = depth[Number(i)+1].split("/")[nLen-2];
  510. else sAtfDepthNm = "";
  511. if(sBefDepthNm != nArray[nLen-2]) sXML += enrfSign_signDepth(pFlag, bAppendFlag, depth[i], "S");
  512. sColumInfo = enrfSign_signColumnInfo(pFlag,ds_enrsign_tempinfo,nArray[nLen-1],sGab, bNullFlag, flagCData);
  513. sXML += sColumInfo;
  514. //if(sAtfDepthNm != "" && sAtfDepthNm != nArray[nLen-2]) sXML += enrfSign_signDepth(pFlag, bAppendFlag, depth[i], "E");
  515. // sAtfDepthNm 가 없는 마지막일경우 endflag 누락문제 차후 확인 필요
  516. // sAtfDepthNm != "" 조건삭제에 따른 문제 발생 시 MMR03700 마취기록지 인증저장기록 데이터 확인 필요
  517. if(sAtfDepthNm != nArray[nLen-2]) sXML += enrfSign_signDepth(pFlag, bAppendFlag, depth[i], "E");
  518. }
  519. // -----------------------------------------------------------
  520. if(pFlag == 1){
  521. var sEndDepth = enrfSign_signDepth(pFlag, false, depth[0], "E");
  522. sXML += sEndDepth;
  523. }
  524. break;
  525. case false: // addnode
  526. var depth = sDepth;
  527. var sSttDepth = enrfSign_signDepth(pFlag, bAppendFlag, depth, "S");
  528. sXML += sSttDepth;
  529. // -----------------------------------------------------------
  530. //실질 컬럼정보생성
  531. var nArray = depth.split("/");
  532. var nLen = nArray.length;
  533. sGab = enrfSign_getGab(pFlag, nLen-1);
  534. ds_enrsign_tempinfo.clearData();
  535. ds_enrsign_tempinfo.loadXML(sSaveXML);
  536. sColumInfo = enrfSign_signColumnInfo(pFlag,ds_enrsign_tempinfo,nArray[nLen-1],sGab, bNullFlag, flagCData);
  537. sXML += sColumInfo;
  538. // -----------------------------------------------------------
  539. if(pFlag == 1){
  540. var sEndDepth = enrfSign_signDepth(pFlag, bAppendFlag, depth, "E");
  541. sXML += sEndDepth;
  542. }
  543. break;
  544. }
  545. var rtn = form.all[this.DSNAME_SIGNINFO_TEMP];
  546. if(rtn) {
  547. var objDs = form.removeChild(this.DSNAME_SIGNINFO_TEMP);
  548. delete objDs;
  549. objDs = null;
  550. }
  551. return sXML;
  552. }
  553. /****************************************************************************************
  554. * Argument :
  555. * Description : depth 생성
  556. ****************************************************************************************/
  557. function enrfSign_signDepth(pFlag, bAppendFlag, sDepth, gb){
  558. if(utlf_isNull(sDepth)) return "";
  559. var nArray = sDepth.split("/");
  560. if(nArray.length == 0) return "";
  561. var sDepthInfo = "";
  562. var sGab="";
  563. if(gb == "S"){
  564. for(var i=1; i<nArray.length-1; i++){
  565. if(bAppendFlag && i==1) continue;
  566. if(bAppendFlag && utlf_isNull(nArray[nArray.length-1])) continue;
  567. sGab = enrfSign_getGab(pFlag,i);
  568. if(pFlag == 1) sDepthInfo += sGab +'<'+ nArray[i] +'>\n' ;
  569. else if(pFlag == 2) sDepthInfo += sGab + 'xml:' + nArray[i] +'\n' ;
  570. }
  571. }else{
  572. //alert(nArray + " : " + bAppendFlag + " : " + sDepth + " : " + gb);
  573. for(var i=nArray.length-2; i>0; i--){
  574. if(bAppendFlag && i==1) continue;
  575. if(bAppendFlag && utlf_isNull(nArray[nArray.length-1])) continue;
  576. sGab = enrfSign_getGab(pFlag,i);
  577. if(pFlag == 1) sDepthInfo += sGab + '</'+ nArray[i] +'>\n';
  578. }
  579. }
  580. return sDepthInfo;
  581. }
  582. /****************************************************************************************
  583. * Argument :
  584. * Description : 간격 (공백) 생성
  585. ****************************************************************************************/
  586. function enrfSign_getGab(pFlag, nLength){
  587. if(utlf_isNull(nLength)) return "";
  588. nLength = nLength+1;
  589. var nGab;
  590. if(pFlag == 1) nGab = lgv_tabSpace;
  591. else nGab = "";
  592. for(var i=0; i<nLength-1; i++){
  593. nGab += lgv_tabSpace;
  594. }
  595. return nGab;
  596. }
  597. //
  598. /****************************************************************************************
  599. * Argument :
  600. * Description : 인증 dataset 정보로 xml data 생성 (column)
  601. ****************************************************************************************/
  602. function enrfSign_signColumnInfo(pFlag, ds_sign,sEndDepth,sGab, bNullFlag, flagCData){
  603. var colCount = ds_sign.colcount;
  604. if (colCount == 0 ) return "";
  605. var rowCount = ds_sign.rowcount;
  606. if (rowCount == 0 ) return "";
  607. var objColumnInfo ="";
  608. var strColID = "";
  609. for(var i=0; i<ds_sign.rowcount; i++){
  610. if(!utlf_isNull(sEndDepth)){
  611. if(pFlag==1) objColumnInfo += sGab + '<'+sEndDepth + '>\n';
  612. else if(pFlag==2) objColumnInfo += sGab + 'xml:' + sEndDepth + '\n';
  613. }
  614. for(var ii=0; ii<colCount; ii++){
  615. strColID = ds_sign.getColID(ii);
  616. var tmp = ds_sign.getColumn(i,strColID);
  617. if(!bNullFlag && utlf_isNull(ds_sign.getColumn(i,strColID)))
  618. continue;
  619. if( ds_sign.getColumn(i,strColID) == "[object Binary]" )
  620. continue;
  621. if(pFlag==1){
  622. //CData 사용여부(false:미사용, 그외:사용)
  623. if( !utlf_isNull(flagCData) && flagCData == false ){
  624. objColumnInfo += sGab+ lgv_tabSpace + '<'+ strColID + '>' + utlf_transNullToEmpty(ds_sign.getColumn(i,strColID)) + '</'+strColID+'> \n';
  625. }else{
  626. objColumnInfo += sGab+ lgv_tabSpace + '<'+ strColID + '>' + enrfSign_setCDATA(utlf_transNullToEmpty(ds_sign.getColumn(i,strColID))) + '</'+strColID+'> \n';
  627. //objColumnInfo += sGab+ lgv_tabSpace + '<'+ strColID + '>' + enrfSign_setCDATA(utlf_trim(utlf_transNullToEmpty(ds_sign.getColumn(i,strColID)))) + '</'+strColID+'> \n';
  628. }
  629. }else if(pFlag==2){
  630. objColumnInfo += sGab+ lgv_tabSpace + 'xml:' + strColID + ': ' + utlf_transNullToEmpty(ds_sign.getColumn(i,strColID)) + '\n';
  631. }
  632. }
  633. if(!utlf_isNull(sEndDepth)){
  634. if(pFlag==1) objColumnInfo += sGab + '</' + sEndDepth + '>\n';
  635. //else if(pFlag==2) objColumnInfo += sGab + 'xml:' + sEndDepth + '\n';
  636. }
  637. }
  638. return objColumnInfo;
  639. }
  640. /****************************************************************************************
  641. * Argument :
  642. * Description : 인증 dataset 정보 clear
  643. ****************************************************************************************/
  644. function enrfSign_clearDs(){
  645. if(!utlf_isNull(form.all[this.DSNAME_BASICINFO])) form.all[this.DSNAME_BASICINFO].clearData(); // 환자, 사용자 정보
  646. if(!utlf_isNull(form.all[this.DSNAME_SIGNINFO])) form.all[this.DSNAME_SIGNINFO].clearData(); // 데이터 정보
  647. }
  648. function enrfSign_createDs(sDsName){
  649. //var objParam = utlf_args2Object(sParam);
  650. if(form.all[sDsName] != null){
  651. form.all[sDsName].clear();
  652. }else{
  653. var objDs = new Dataset;
  654. form.addChild(sDsName, objDs);
  655. objDs.name = sDsName;
  656. }
  657. return objDs;
  658. }
  659. function enrfSign_setCDATA(sVal){
  660. var sRetVal = sVal;
  661. var domParser = new DomParser;
  662. var sTmpChkXmlType = domParser.parseFromString(sRetVal);
  663. //특수문자가 있으면서 컬럼 데이터가 XML TYPE 아닌 경우
  664. if(lf_checkSpecialChar(sVal) && sTmpChkXmlType == null && !utlf_isNull(sVal))
  665. sRetVal = "<![CDATA[" + sRetVal + "]]]]><![CDATA[>"; //cdata 처리
  666. //2018-03-13 yjh
  667. //인증저장데이터 특정컬럼에 xml데이터가 있을경우
  668. //특정데이터는 최상위노드가 없는경우가 있는데,
  669. //이때 CData를 싸지않기위해 처리
  670. //반드시!! <EXCEPTCDATA>와 </EXCEPTCDATA>는 사용하지 말도록!!!
  671. if( sRetVal.indexOf("<EXCEPTCDATA>") > -1 ) sRetVal = sRetVal.replace("<EXCEPTCDATA>", "");
  672. if( sRetVal.indexOf("</EXCEPTCDATA>") > -1 ) sRetVal = sRetVal.replace("</EXCEPTCDATA>", "");
  673. return sRetVal;
  674. }
  675. /****************************************************************************************
  676. * Argument : lf_convertDsToXml (biz module 사용 - com/commodulexp/SSZFM01001.xjs 참조)
  677. * Description : 데이터 정보 (SignInfo) 생성
  678. ****************************************************************************************/
  679. function enrfSign_addSignInfo_dstoxml(sParamObjArr, lgv_sXML){
  680. //try{
  681. var sOptionObj = new Object(); // option용
  682. form.all[this.DSNAME_SIGNINFO].enableevent = false;
  683. sOptionObj.nullNodeYN = 'N';
  684. var sXML_DelNoVal = lf_convertDsToXml(sParamObjArr, lgv_sXML, sOptionObj); // 값 없는 노드 제거 후
  685. if('error' == sXML_DelNoVal) throw "";
  686. sXML_DelNoVal = lf_delLineBreakChr(sXML_DelNoVal);
  687. sOptionObj.nullNodeYN = 'Y';
  688. var sXML_All = lf_convertDsToXml(sParamObjArr, lgv_sXML, sOptionObj); // 값 없는 노드 제거 전
  689. if('error' == sXML_All) throw "";
  690. sXML_All = lf_delLineBreakChr(sXML_All);
  691. dsf_addRow(form.all[this.DSNAME_SIGNINFO],
  692. [{col:"taginfo1", val:sXML_DelNoVal} // 인증할 데이터 정보 (미기록 노드 제거된 정보)
  693. ,{col:"taginfo3", val:sXML_All} // 인증할 데이터 정보 (미기록 노드 제거 전 원본 정보)
  694. ,{col:"taginfo4", val:""} // [3]데이터(없는 노드 포함된)를 text 형태로 추출보기 - 추후 구현 필요
  695. ,{col:"taginfo5", val:""}]); // [1]데이터(없는 노드 제거된)를 text 형태로 추출보기 - 추후 구현 필요
  696. form.all[this.DSNAME_SIGNINFO].enableevent = true;
  697. //} catch(E){
  698. // sysf_messageBox("Sign.addnoode_dstoxml()의 파라미터를 확인하십시오.", 'E');
  699. //}
  700. }
  701. // 개행문자 제거 (첫 idx)
  702. function lf_delLineBreakChr(sStr){
  703. if(utlf_isNull(sStr)) return sStr;
  704. var sTmpStr = sStr.charAt(0);
  705. if(sTmpStr == '\n' ) sStr = (""+sStr).substring(1, sStr.length);
  706. return sStr;
  707. }
  708. /***************************************************************************************************
  709. * Function : lf_getEMRHardCDList
  710. * Description : 조회된 하드코드 리스트를 조회한다.
  711. * Argument : sOption [Stirng : Y/값을 리턴한다, N/데이터셋을 반환한다.]
  712. * : sHardCdNo [String : 하드코드 번호]
  713. * : sRtnValue [String : 변환형태 Flag]- sOption이 "Y"일 때만 관련있음.
  714. * : oDsRsltRef [Dataset : 대상 데이타셋]
  715. * return type : option = "N" 일 경우: 데이터셋 복사
  716. "Y" 일 경우: sRtnValue 변환형태플래그 [0:리턴값 반환하지 않음 (하드코드 값이 여러개일 때 선택, 1:hardcdno를 리턴, 2:hardcodenm 을 리턴
  717. 3:hardcd 를 리턴 4:hardcdnm를 리턴, 5:cdseqno를 리턴, 9:hardcd+ "|" + hardcdnm + "|" + cdseqno 형태로 리턴]
  718. * Creator :
  719. * ex) : lf_getEMRHardCDList("N", 60, null, oDsRsltRef);
  720. var rtnHardcd = lf_getEMRHardCDList("Y", 60, 1, null);
  721. ***************************************************************************************************/
  722. function lf_getEMRHardCDList(sOption, sHardCdNo, sRtnValue, oDsRsltRef)
  723. {
  724. var oDsHardCd = agv_objAppTopPath.form.dv_orderbasicinfo.lf_getHardcodeTable(sHardCdNo);
  725. var sHardCd;
  726. var sHardCdNm;
  727. var nCdSeqNo;
  728. if (!utlf_isNull(oDsHardCd)) {
  729. if (sOption == "Y") {
  730. try {
  731. var sHardCdNo = oDsHardCd[0].hardcdno;
  732. var sHardCodeNm = oDsHardCd[0].hardcodenm;
  733. sHardCd = oDsHardCd[0].hardcd;
  734. sHardCdNm = oDsHardCd[0].hardcdnm;
  735. nCdSeqNo = oDsHardCd[0].cdseqno;
  736. }
  737. catch(e) {
  738. trace("lf_getHardCDList Error : " + e);
  739. }
  740. if (sRtnValue == 1) {
  741. return sHardCdNo;
  742. }
  743. else if (sRtnValue == 2) {
  744. return hardcodenm;
  745. }
  746. else if (sRtnValue == 3) {
  747. return sHardCd;
  748. }
  749. else if (sRtnValue == 4) {
  750. return sHardCdNm;
  751. }
  752. else if (sRtnValue == 5) {
  753. return nCdSeqNo;
  754. }
  755. else if (sRtnValue == 9) {
  756. return sHardCd+ "|" + sHardCdNm + "|" + nCdSeqNo;
  757. }
  758. }
  759. else {
  760. var destListLen = oDsRsltRef.rowcount;
  761. // 한번이라도 복사된 내용이 있으면 다시 안하도록 수정 2011. 01.20 김영학
  762. if (destListLen < 1 ) {
  763. if (!utlf_isNull(oDsHardCd)) {
  764. // 하드코드 Object 갯수 만큼 loop 작업
  765. for (var i = 0; i < oDsHardCd.length; i++)
  766. {
  767. var nAddRow = oDsRsltRef.addRow();
  768. // Object의 property 갯수 만큼 loop 작업을 하면 Dataset의 컬럼생성 및 Row 값 설정
  769. for (var j in oDsHardCd[i])
  770. {
  771. oDsRsltRef.addColumn(j, "STRING");
  772. oDsRsltRef.setColumn(nAddRow, j, oDsHardCd[i][j]);
  773. }
  774. }
  775. oDsRsltRef.applyChange();
  776. }
  777. }
  778. }
  779. }
  780. }
  781. ]]></Script>