SPMMO10500.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. /*
  2. - ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩
  3. 치식 ( SPMMO10500_치식.xrw - JScript )
  4. - ▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩▩
  5. */
  6. var teethArray = new Array(8);
  7. var sTOOTFACT = ""; //치식사항
  8. var bRIGHT_TOP = false;
  9. var bRIGHT_YOUTH_TOP = false;
  10. var bLEFT_TOP = false;
  11. var bLEFT_YOUTH_TOP = false;
  12. var bRIGHT_BOTTOM = false;
  13. var bRIGHT_YOUTH_BOTTOM = false;
  14. var bLEFT_BOTTOM = false;
  15. var bLEFT_YOUTH_BOTTOM = false;
  16. var bRIGHT_TOP_THIRD = false;
  17. var bRIGHT_TOP_YOUTH_THIRD = false;
  18. var bRIGHT_BOTTOM_THIRD = false;
  19. var bRIGHT_BOTTOM_YOUTH_THIRD = false;
  20. var bMIDDLE_TOP_THIRD = false;
  21. var bMIDDLE_TOP_YOUNG_THIRD = false;
  22. var bMIDDLE_BOTTOM_THIRD = false;
  23. var bMIDDLE_BOTTOM_YOUNG_THIRD= false;
  24. var bLEFT_TOP_THIRD = false;
  25. var bLEFT_TOP_THIRD_YOUTH = false;
  26. var bLEFT_BOTTOM_THIRD = false;
  27. var bLEFT_BOTTOM_THIRD_YOUTH = false;
  28. var bTOTAL = false;
  29. var bTOTAL_YOUTH = false;
  30. var sRIGHT_TOP_TEETH = "#11#12#13#14#15#16#17#18"; //우상
  31. var sRIGHT_TOP_YOUNG_TEETH = "#51#52#53#54#55"; //우상유치
  32. var sLEFT_TOP_TEETH = "#21#22#23#24#25#26#27#28"; //좌상
  33. var sLEFT_TOP_YOUNG_TEETH = "#61#62#63#64#65"; //좌상유치
  34. var sRIGHT_BOTTOM_YOUNG_TEETH = "#81#82#83#84#85"; //우하유치
  35. var sRIGHT_BOTTOM_TEETH = "#41#42#43#44#45#46#47#48"; //우하
  36. var sLEFT_BOTTOM_YOUNG_TEETH = "#71#72#73#74#75"; //좌하유치
  37. var sLEFT_BOTTOM_TEETH = "#31#32#33#34#35#36#37#38"; //좌하
  38. var sRIGHT_TOP_THIRD_TEETH = "#14#15#16#17#18"; //영구치(1/3)
  39. var sRIGHT_TOP_THIRD_YOUNG_TEETH = "#54#55"; //유치(1/3)
  40. var sRIGHT_BOTTOM_THIRD_YOUNG_TEETH = "#84#85"; //유치(1/3)
  41. var sRIGHT_BOTTOM_THIRD_TEETH = "#44#45#46#47#48"; //영구치(1/3)
  42. var sMIDDLE_TOP_THIRD_TEETH = "#11#12#13#21#22#23";
  43. var sMIDDLE_TOP_THIRD_YOUNG_TEETH = "#51#52#53#61#62#63";
  44. var sMIDDLE_BOTTOM_THIRD_YOUNG_TEETH = "#81#82#83#71#72#73";
  45. var sMIDDLE_BOTTOM_THIRD_TEETH = "#41#42#43#31#32#33";
  46. var sLEFT_TOP_THIRD_TEETH = "#24#25#26#27#28";
  47. var sLEFT_BOTTOM_THIRD_TEETH = "#34#35#36#37#38";
  48. var sLEFT_TOP_THIRD_YOUTH_TEETH = "#64#65";
  49. var sLEFT_BOTTOM_THIRD_YOUTH_TEETH = "#74#75";
  50. var objDiagGrdID = ""; //global grid object
  51. var objPrcpGrdID = ""; //global grid object
  52. var objCurGrdID = ""; //현재 focus가 설정된 grid
  53. var iDiagBfRow = 0; //이전 diaglist row의 위치
  54. var iPrcpBfRow = 0; //이전 prcplist row의 위치
  55. /**
  56. * @desc : 화면 초기화
  57. * @
  58. * @param :
  59. * @return :
  60. * @author : 오지훈
  61. * @---------------------------------------------------
  62. */
  63. function fInitialize(){
  64. reqHardCodeInfo("/root/send/reqdata", "/root/init/hardcd", 20);
  65. var hardcd = model.getValue("/root/init/hardcd/hardcd/hardcd");
  66. var dutplcecd = getUserInfo("dutplcecd");
  67. //alert(dutplcecd + "," + hardcd);
  68. /*
  69. if(hardcd != dutplcecd){ //치과의사가 아닌 경우 window종료
  70. messageBox("치과 의사 선생님 이외에는 치식을 등록", "E001");
  71. window.close();
  72. return;
  73. }*/
  74. model.removeNodeset("/root/main/prcplist/prcplist");
  75. model.removeNodeset("/root/main/diaglist/diaglist");
  76. fMakeSndArray();
  77. objDiagGrdID = grd_diaglist;
  78. objPrcpGrdID = grd_prcplist;
  79. if(checkOpener()){
  80. sTOOTFACT = opener.javascript.getParameter("param_tootfact"); //치식사항
  81. sDIAGLIST = opener.javascript.getParameter("param_diaglist"); //진단내용
  82. sPRCPLIST = opener.javascript.getParameter("param_prcplist"); //처방내용
  83. if(sDIAGLIST.length > 1){
  84. setCSVToNode("/root/main/diaglist", sDIAGLIST, "diaglist");
  85. model.refresh();
  86. for(var i = 1; i < objDiagGrdID.rows; i++){
  87. fInitLoadTootFact(model.getValue("/root/main/diaglist/diaglist[" + i + "]/rtntootfact"), i, objDiagGrdID);
  88. }
  89. fShowTootFact(model.getValue("/root/main/diaglist/diaglist/rtntootfact")); //첫번째 row값을 화면에 뿌린다.
  90. //objDiagGrdID.select(1,2,1,2) = true; //기본 focus를 진단 첫번째 row에 잡는다.
  91. objCurGrdID = objDiagGrdID;
  92. objCurGrdID.row = 1;
  93. iDiagBfRow = objDiagGrdID.row; //이전 row값을 기억해서 다른 row가 클릭된 경우 clear할 수 있도록한다.
  94. }
  95. if(sPRCPLIST.length > 1){
  96. setCSVToNode("/root/main/prcplist", sPRCPLIST, "prcplist");
  97. model.refresh();
  98. for(var i = 1; i < objPrcpGrdID.rows; i++){
  99. fInitLoadTootFact(model.getValue("/root/main/prcplist/prcplist[" + i + "]/rtntootfact"), i, objPrcpGrdID);
  100. }
  101. if(objDiagGrdID.rows < 2){ //진단이 없는 경우, default로 처방에 focus를 set한다.
  102. objCurGrdID = objPrcpGrdID;
  103. objCurGrdID.row = 1;
  104. iPrcpBfRow = objPrcpGrdID.row; //이전 row값을 기억해서 다른 row가 클릭된 경우 clear할 수 있도록한다.
  105. fShowTootFact(model.getValue("/root/main/prcplist/prcplist/rtntootfact")); //첫번째 row값을 화면에 뿌린다.
  106. }
  107. }
  108. objDiagGrdID.sort(1, objDiagGrdID.colRef("rowcnt"), objDiagGrdID.rows - 1, objDiagGrdID.colRef("rowcnt")) = "asc";
  109. objPrcpGrdID.sort(1, objPrcpGrdID.colRef("rowcnt"), objPrcpGrdID.rows - 1, objPrcpGrdID.colRef("rowcnt")) = "asc";
  110. objDiagGrdID.refresh();
  111. objPrcpGrdID.refresh();
  112. }else{
  113. messageBox("메인 화면을 찾는데", "E009");
  114. window.close();
  115. }
  116. //2008. 07. 04 opener에서 진단, 처방의 치식정보가 설정된 경우, 자동으로 처방선택 또는 진단선택하게 하기 위해 추가 오지훈
  117. var isVal = sDIAGLIST.split("▩");
  118. var isVal2 = sPRCPLIST.split("▩");
  119. if(isVal2.length > 1){
  120. grd_prcplist.row = 1;
  121. grd_prcplist.col = 1;
  122. grd_prcplist.select(grd_prcplist.row, grd_prcplist.col) = true;
  123. grd_prcplist.dispatch("onclick");
  124. grd_prcplist.refresh();
  125. }else if(isVal.length > 1){
  126. grd_diaglist.row = 1;
  127. grd_diaglist.col = 1;
  128. grd_diaglist.select(grd_diaglist.row, grd_diaglist.col) = true;
  129. grd_diaglist.dispatch("onclick");
  130. grd_diaglist.refresh();
  131. }
  132. }
  133. /**
  134. * @desc : tootfact를 ','로 구분자를 두어 화면에 표시한다.
  135. * @
  136. * @param :
  137. * @return :
  138. * @author : 오지훈
  139. * @---------------------------------------------------
  140. */
  141. function fInitLoadTootFact(sTootFact, curRow, grdObj){
  142. var loadStr = sTootFact.replaceAll(',', '').replaceAll('#', ', #').replaceAll('ⓘ', ', ⓘ');
  143. grdObj.valueMatrix(curRow, 1) = loadStr.substr(2, loadStr.length); //grid의 첫번째 cell에 setting!!
  144. model.refresh();
  145. }
  146. /**
  147. * @desc : 진단화면에서 load..치식data로 초기화
  148. * @
  149. * @param :
  150. * @return :
  151. * @author : 오지훈
  152. * @---------------------------------------------------
  153. */
  154. function fShowTootFact(sTootFact){
  155. if(sTootFact.length < 1){ //opener에서 넘어온 치식이 없는 경우
  156. return;
  157. }else{
  158. fFillColorCaption(sTootFact, "#99ccff");
  159. }
  160. }
  161. /**
  162. * @desc : 치식데이터에 따라 화면에 선택된 값을 칠한다.
  163. * @
  164. * @param :
  165. * @return :
  166. * @author : 오지훈
  167. * @---------------------------------------------------
  168. */
  169. function fFillColorCaption(sTeeth, sColor){
  170. var sCls;
  171. var iRow;
  172. var iCol;
  173. var tmp;
  174. var capObj;
  175. if(sColor == "#99ccff")
  176. val = 1;
  177. else
  178. val = 0;
  179. var sTempTootFact = sTeeth.replaceAll(',', '').replaceAll('#', ',#').replaceAll('ⓘ', ',ⓘ');
  180. teethPos = sTempTootFact.split(",");
  181. for(var i=1; i < teethPos.length; i ++ ){
  182. tmp = teethPos[i];
  183. if(!isNull(tmp)) {
  184. capObj = document.controls("caption" + tmp.substr(1,2)); //by sonjy 전환데이터 관련 수정 20080905
  185. sCls = tmp.substr(0,1);
  186. iRow = tmp.substr(1,1);
  187. iCol = tmp.substr(2,1);
  188. iRow--;
  189. iCol--;
  190. if(fChkValidTeeth(iRow, iCol) == true){
  191. if(sCls == "ⓘ") { // 임플란트 치식이면
  192. teethArray[iRow][iCol] = 2;
  193. capObj.attribute("background-color") = "#ff9090";
  194. } else {
  195. teethArray[iRow][iCol] = val;
  196. capObj.attribute("background-color") = sColor;
  197. }
  198. }else{
  199. messageBox("영구치와 유치를 동시에 선택할 수", "I004");
  200. return;
  201. }
  202. }
  203. }
  204. }
  205. /**
  206. * @desc : 2차원배열 생성
  207. * @
  208. * @param :
  209. * @return :
  210. * @author : 오지훈
  211. * @---------------------------------------------------
  212. */
  213. function fMakeSndArray(){
  214. for(var i = 0; i < 8; i++){
  215. teethArray[i] = new Array(8);
  216. }
  217. //배열의 초기값을 0로 setting한다.
  218. for(var i = 0; i < 8; i++){
  219. for(var j = 0; j < 8; j++){
  220. teethArray[i][j] = 0;
  221. }
  222. }
  223. }
  224. /**
  225. * @desc : Drag Mode에서의 치식 선택
  226. * @
  227. * @param : Caption Object - 캡션객체
  228. * : pos - output값
  229. * @return :
  230. * @author : 오지훈
  231. * @---------------------------------------------------
  232. */
  233. function fDragChoiTeeth(grdObj){
  234. if(grdObj.row < 1)
  235. return;
  236. var capObj = document.controls(event.target);
  237. var capVal = capObj.attribute("_value");
  238. if(capVal != ""){
  239. if(event.button == 1){
  240. var row = capVal.substr(0,1);
  241. var col = capVal.substr(1,2);
  242. row--;
  243. col--;
  244. //alert(row + "," + col);
  245. if(fChkValidTeeth(row, col) == true){
  246. var choiYN = teethArray[row][col];
  247. if(choiYN == 1 || choiYN == 2){
  248. capObj.attribute("background-color") = "#ffffff";
  249. teethArray[row][col] = 0;
  250. }else{
  251. var implantyn = model.getValue("/root/main/cond/implantyn");
  252. if(implantyn == "Y") {
  253. capObj.attribute("background-color") = "#ff9090";
  254. teethArray[row][col] = 2; // 임플란트치식
  255. model.setValue("/root/main/cond/implantyn", "N");
  256. } else {
  257. capObj.attribute("background-color") = "#99ccff";
  258. teethArray[row][col] = 1; // 일반치식
  259. }
  260. }
  261. }else{
  262. messageBox("영구치와 유치를 동시에 선택할 수", "I004");
  263. return;
  264. }
  265. }
  266. }
  267. fGrdInptVal(objCurGrdID);
  268. }
  269. /**
  270. * @desc : 선택된 치식값을 grd에 표시한다.
  271. * @
  272. * @param : Caption Object - 캡션객체
  273. * : pos - output값
  274. * @return :
  275. * @author : 오지훈
  276. * @---------------------------------------------------
  277. */
  278. function fGrdInptVal(grdObj){
  279. var iRow = grdObj.row;
  280. var iTotRow = grdObj.rows;
  281. if(iRow < 1){
  282. return;
  283. }
  284. for(var iRow = 1; iRow < iTotRow ; iRow++){ //멀티선택된 경우를 감안하여 전체를 검사
  285. if(grdObj.isSelected(iRow) == true){ //grd가 선택된 경우
  286. var toothcd = grdObj.valueMatrix(iRow, 0);
  287. if( toothcd == "" && isNull(opener.javascript.getParameter( "SPMMO10500_open" ))){ continue; } //grd에 진단코드가 맵핑 안된 경우 skip
  288. grdObj.valueMatrix(iRow, 1) = fMakeSaveData(2); // 치식사항(user보기용)
  289. grdObj.valueMatrix(iRow, 2) = fMakeSaveData(0); // 치식사항(data저장용)
  290. }
  291. }
  292. model.refresh();
  293. }
  294. /**
  295. * @desc : 치식저장될 SaveData instance를 생성함
  296. * @
  297. * @param : iPFlag : 2 - user보기용
  298. : iPFlag : 0 - data저장용
  299. * @return :
  300. * @author : 오지훈
  301. * @---------------------------------------------------
  302. */
  303. function fMakeSaveData(iPFlag){
  304. var saveStr = "";
  305. var tmpStr = "";
  306. var concatStr = "";
  307. if(iPFlag == 2){ //user보기용
  308. var concatStr = ", ";
  309. }else{ //data저장용
  310. var concatStr = "";
  311. }
  312. for(var i = 0; i < 8; i++){
  313. for(var j = 0; j < 8 ; j++){
  314. if(teethArray[i][j] == 1){ // 일반치식
  315. row = i + 1;
  316. col = j + 1;
  317. tmpStr = "#" + row + col;
  318. saveStr += tmpStr.concat(concatStr);
  319. } else if(teethArray[i][j] == 2){ // 임플란트 치식
  320. row = i + 1;
  321. col = j + 1;
  322. tmpStr = "ⓘ" + row + col;
  323. saveStr += tmpStr.concat(concatStr);
  324. }
  325. }
  326. }
  327. saveStr = saveStr.substr(0,saveStr.length-iPFlag);
  328. return saveStr;
  329. }
  330. /**
  331. * @desc : 치식데이터 init
  332. * @
  333. * @param : bPFlag : 1 - user보기용
  334. : bPFlag : 2 - data저장용
  335. * @return :
  336. * @author : 오지훈
  337. * @---------------------------------------------------
  338. */
  339. function fInitToothfact(grdObj){
  340. fFillColorCaption(grdObj.valueMatrix(grdObj.row, 2), "#ffffff");
  341. fGrdInptVal(grdObj);
  342. }
  343. /**
  344. * @desc : 치식데이터 확인버튼 click
  345. * @
  346. * @param :
  347. * @return :
  348. * @author : 오지훈
  349. * @---------------------------------------------------
  350. */
  351. function fCnfm_SPMMO10500(){
  352. iRow = objDiagGrdID.row;
  353. if(checkOpener()){
  354. opener.javascript.setParameter("rtn_diagtootfact", fMakeRtnTootFact(grd_diaglist, "diagcd▦tootfact▦rtntootfact▦rowcnt▩")); //진단치식사항
  355. opener.javascript.setParameter("rtn_prcptootfact", fMakeRtnTootFact(grd_prcplist, "prcpcd▦tootfact▦rtntootfact▦rowcnt▩")); //처방치식사항
  356. opener.javascript.setParameter("rtn_useyn", "Y");
  357. }else{
  358. opener.javascript.setParameter("rtn_useyn", "N");
  359. messageBox("메인 화면을 찾는데", "E009");
  360. }
  361. window.close();
  362. return;
  363. }
  364. /**
  365. * @desc : 치식데이터 취소버튼 click
  366. * @
  367. * @param :
  368. * @return :
  369. * @author : 오지훈
  370. * @---------------------------------------------------
  371. */
  372. function fCncl_SPMMO010500(){
  373. if(checkOpener()){
  374. opener.javascript.setParameter("rtn_useyn", "N");
  375. }else{
  376. messageBox("메인 화면을 찾는데", "E009");
  377. }
  378. window.close();
  379. return;
  380. }
  381. /**
  382. * @desc : 치식전달 데이터 생성
  383. * @
  384. * @param : grdObj - 그리드객체
  385. * @return :
  386. * @author : 오지훈
  387. * @---------------------------------------------------
  388. */
  389. function fMakeRtnTootFact(grdObj, header){
  390. var rtnparam = header;
  391. for(var i = 1; i < grdObj.rows; i++){
  392. rtnparam += grdObj.valueMatrix(i, 0) + "▦" + //diagcd
  393. grdObj.valueMatrix(i, 1) + "▦" + //tootfact
  394. grdObj.valueMatrix(i, 2) + "▦" + //rtntootfact
  395. grdObj.valueMatrix(i, 3) + "▩"; //rowcnt
  396. }
  397. return rtnparam;
  398. }
  399. /**
  400. * @desc : 유효한 치식 선택 검사(동일한 위치의 영구치와 유치는 선택될 수 없다.)
  401. * 치식을 저장하는 array의 row에 +3을 한 row위치에 값이
  402. * 동일하게 1로 적용되는 것을 막는다.
  403. *
  404. * ex) 11 - 51, 21 - 61, 31 - 71, 41 - 81(x)
  405. * @
  406. * @param : row - Array row값
  407. * : col - Array col값
  408. * @return :
  409. * @author : 오지훈
  410. * @---------------------------------------------------
  411. */
  412. function fChkValidTeeth(row, col){
  413. if(row < 4)
  414. tmprow = row + 4; //영구치가 선택된 경우
  415. else
  416. tmprow = row - 4; //유치가 선택된 경우
  417. /*
  418. if(col < 3){ // 3이하로 선택된 경우
  419. startcol = 0;
  420. endcol = 3;
  421. }else{ // 4이상으로 선택된 경우
  422. startcol = 3;
  423. endcol = 8;
  424. }*/
  425. //alert(tmprow + "," + col + "," + teethArray[tmprow][col]);
  426. //for(var i = startcol; i < endcol; i++){
  427. if(teethArray[tmprow][col] == 1){return false;}
  428. //}
  429. return true;
  430. }