0fb66a43a36462f63ce1e37f7842cd3883c8c4c8.svn-base 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10. using System.Collections;
  11. namespace IControls_FireManager
  12. {
  13. public partial class Form_PointConfig : Form
  14. {
  15. // 대화 팝업용
  16. Form DialogPopup = new Form();
  17. // 크로스 스레드 해결
  18. delegate void Cross_Thread();
  19. // 수신기 ID를 저장하기 위해서
  20. string ReceiverID = null;
  21. // 엑셀 임포팅 타입
  22. string Type = null;
  23. // UI 갱신 타이머
  24. bool ui_renew = false;
  25. public Form_PointConfig(_RECEIVER RECEIVER, string Info)
  26. {
  27. InitializeComponent();
  28. ///
  29. /// 폼이 생성되는 위치
  30. ///
  31. this.StartPosition = FormStartPosition.Manual;
  32. this.Location = new System.Drawing.Point(MousePosition.X, MousePosition.Y);
  33. // 수신기 ID 저장
  34. ReceiverID = RECEIVER.ID;
  35. // 엑셀 임포팅 타입
  36. Type = Info;
  37. // 폼 텍스트 쿄체
  38. this.Text = Info + " 정보 불러오기";
  39. ///
  40. /// 이벤트
  41. ///
  42. // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용)
  43. this.FormClosing += new FormClosingEventHandler(CreateForm_FormClosing);
  44. }
  45. // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용)
  46. public void CreateForm_FormClosing(object sender, FormClosingEventArgs e)
  47. {
  48. }
  49. // 엑셀파일 경로 지정
  50. private void uiButton_ProjectPath_Click(object sender, EventArgs e)
  51. {
  52. OpenFileDialog openFileDialog = new OpenFileDialog();
  53. // 엑셀파일 연동시에 다이얼로그창은 프로젝트 경로에 따라서 Field 폴더에 곧바로 접근할 수있도록 함
  54. openFileDialog.InitialDirectory = _Data.Project_Path + "\\" + _Data.Project_Name;
  55. // 필터 처리 안함 (사용자가 xml
  56. //openFileDialog.Filter = "(*.xls)|*.xls|(*.xlsx)|*.xlsx";
  57. openFileDialog.Filter = "(*.xls*)|*.xls*";
  58. if (openFileDialog.ShowDialog() == DialogResult.OK)
  59. {
  60. if (_Excel.OpenTest(openFileDialog.FileName) == true)
  61. {
  62. this.editBox_ProjectPath.Text = openFileDialog.FileName;
  63. }
  64. else
  65. this.editBox_ProjectPath.Text = null;
  66. }
  67. }
  68. // UiProgressBar 크로스 스레드 해결
  69. private void Delegate_UiProgressBar()
  70. {
  71. if (this.InvokeRequired)
  72. {
  73. Cross_Thread d = new Cross_Thread(Delegate_UiProgressBar);
  74. this.Invoke(d, new object[] { });
  75. }
  76. else
  77. {
  78. UiProgressBar_ExcelImport.Value++;
  79. }
  80. }
  81. // UiButton 크로스 스레드 해결
  82. private void Delegate_UiButton_good()
  83. {
  84. if (this.InvokeRequired)
  85. {
  86. Cross_Thread d = new Cross_Thread(Delegate_UiButton_good);
  87. this.Invoke(d, new object[] { });
  88. }
  89. else
  90. {
  91. label1.Text = "※ 완료되었습니다.";
  92. UiButton_Apply.Enabled = true;
  93. UiButton_Close.Enabled = true;
  94. }
  95. }
  96. private void Delegate_UiButton_bad()
  97. {
  98. if (this.InvokeRequired)
  99. {
  100. Cross_Thread d = new Cross_Thread(Delegate_UiButton_bad);
  101. this.Invoke(d, new object[] { });
  102. }
  103. else
  104. {
  105. label1.Text = "※ 실패하였습니다.";
  106. UiButton_Apply.Enabled = true;
  107. UiButton_Close.Enabled = true;
  108. }
  109. }
  110. // 닫기 버튼
  111. private void UiButton_Close_Click(object sender, EventArgs e)
  112. {
  113. // 폼을 닫음
  114. this.Close();
  115. }
  116. // 저장 버튼
  117. private void UiButton_Apply_Click(object sender, EventArgs e)
  118. {
  119. // 파일을 아무것도 선택하지 않았을 경우
  120. if (editBox_ProjectPath.Text.Length == 0)
  121. {
  122. // 파일을 선택해 주세요
  123. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.NotFileChoice, 0);
  124. return;
  125. }
  126. // 엑셀 Import 중에는 엑셀 파일을 열수가 없는지 구분가능하도록 옵션조절
  127. if (_Data.Project_ExcelOpenCheck == "1")
  128. {
  129. // 엑셀 Import 중에는 엑셀 파일을 열수가 없다
  130. if (_Diagnostics.Process_Excute("EXCEL") == true || _Diagnostics.Process_Excute("excel") == true)
  131. {
  132. // 파일을 선택해 주세요
  133. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 450, 150, _Text.ExcelProcessNotuse, 0);
  134. return;
  135. }
  136. }
  137. // 버튼 연속으로 입력은 안됨
  138. if (_Data.Enable_Button == false)
  139. return;
  140. else
  141. _Data.Enable_Button = false;
  142. // 파일 읽기가 성공한다면 곧바로 _Excel.Import_Point 작업을 수행하는데
  143. // 지정된 경로에 있는 엑셀파일을 읽은후 5가지 작업을 함
  144. // 1. 코드값 저장
  145. // -> _Data.HASH_CodePosition 및 _Data.LIST_CodePosition_NAME 에 저장
  146. // 2. 포인트 정보 저장
  147. // -> _Data.List_ExcelPoint 에 저장
  148. // 3. 포인트 위치 정보에 따라 실제로 사용한는 위치 코드값을 재정리
  149. // -> _Data.HASH_CodePosition 및 _Data.LIST_CodePosition_NAME 수정
  150. // ##수정 - 여기서 Import 하지 않음
  151. // 4. 그룹 정보 저장
  152. // -> _Data.List_ExcelGroup 에 저장
  153. // 5. 맵연동 정보 저장
  154. // -> _Data.List_ExcelMap 에 저장
  155. // 포인트(디바이스) 정보 임포팅
  156. if (Type == _Text.UI_TREE_POINT)
  157. {
  158. if (_Excel.Import_Point(this.editBox_ProjectPath.Text) == true)
  159. {
  160. // 엑셀 Import 실제 진행
  161. // 저장되어 있는 디바이스 정보는 모두 삭제됩니다. 계속 진행하시겠습니까?
  162. DialogPopup = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 500, 150, _Text.DeviceInfoDelete_Continue, 0);
  163. // 대화 팝업은 특별처리
  164. _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_PopupClose_SendMessage_Event);
  165. }
  166. else
  167. _Data.Enable_Button = true;
  168. }
  169. else if (Type == _Text.UI_TREE_OPER_GROUP) // 그룹 정보 임포팅
  170. {
  171. if (_Excel.Import_Group(this.editBox_ProjectPath.Text) == true)
  172. {
  173. // 엑셀 Import 실제 진행
  174. // 저장되어 있는 그룹 정보는 모두 삭제됩니다. 계속 진행하시겠습니까?
  175. DialogPopup = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 500, 150, _Text.GroupInfoDelete_Continue, 0);
  176. // 대화 팝업은 특별처리
  177. _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_PopupClose_SendMessage_Event);
  178. }
  179. else
  180. _Data.Enable_Button = true;
  181. }
  182. else // 연동설정 정보 임포팅
  183. {
  184. if (_Excel.Import_Map(this.editBox_ProjectPath.Text, ReceiverID) == true)
  185. {
  186. // 엑셀 Import 실제 진행
  187. // 저장되어 있는 연동설정 정보는 모두 삭제됩니다. 계속 진행하시겠습니까?
  188. DialogPopup = _Popup.Create(Popup_Type.Dialog, Popup_Style.Normal, _Text.OK, 500, 150, _Text.MapInfoDelete_Continue, 0);
  189. // 대화 팝업은 특별처리
  190. _Event.PopupClose_SendMessage_Event += new _Event.PopupClose_SendMessage_Handler(_Event_PopupClose_SendMessage_Event);
  191. }
  192. else
  193. _Data.Enable_Button = true;
  194. }
  195. }
  196. // 스레드
  197. public void Excel_Import()
  198. {
  199. // 포인트(디바이스) 정보 임포팅
  200. if (Type == _Text.UI_TREE_POINT)
  201. {
  202. //
  203. // TB_POSITION_CODE 처리 (삽입)
  204. //
  205. // 이미 _Excel.Import_Point 루틴에서 먼저 실제 사용하는 것만 리스트로 구성하도록 만들었다
  206. // 1개만 존재하는 경우 무조건 삭제한다, 결국 데이타 삽입도 조건 없이 삽입이다
  207. if (_Data.LIST_XMLRECEIVER_ID.Count == 1)
  208. {
  209. // TB_POSITION_CODE 테이블에 데이터 삽입
  210. foreach (string CodePosition_NAME in _Data.LIST_CodePosition_NAME)
  211. {
  212. _Db.ADD("TB_POSITION_CODE",
  213. "POSITION_NAME=" + CodePosition_NAME +
  214. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") +
  215. ";POSITION_CODE=" + ((_Code_Position)_Data.HASH_CodePosition[CodePosition_NAME]).Code_Position_ID);
  216. }
  217. }
  218. // 수신기가 2개이상이라면 기존에 데이타가 있는지 검색하고 삽입해야한다
  219. else
  220. {
  221. // TB_POSITION_CODE 테이블에 데이터 삽입
  222. foreach (string CodePosition_NAME in _Data.LIST_CodePosition_NAME)
  223. {
  224. string TEMP_Code_Position_ID = ((_Code_Position)_Data.HASH_CodePosition[CodePosition_NAME]).Code_Position_ID;
  225. DataRowCollection DB_TABLE_TB_POSITION_CODE = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_POSITION_CODE", "POSITION_CODE", TEMP_Code_Position_ID, null));
  226. // cyim 2016.07.12 : TB_POSITION_CODE 테이블 삭제하고 다시 생성하는 코드 원복, 확인결과 하나하나 중계기 입출력 포인트 별 개별적으로 위치코드가 추가된다
  227. // 기존의 데이타가 있다면 중복될 우려가 있으므로 삭제 해야한다
  228. if (DB_TABLE_TB_POSITION_CODE != null || DB_TABLE_TB_POSITION_CODE.Count != 0)
  229. {
  230. // 있다면 삭제하고
  231. _Db.Execute(_Sql.Delete_Table("TB_POSITION_CODE", "POSITION_CODE", TEMP_Code_Position_ID, null));
  232. // 삽입
  233. _Db.ADD("TB_POSITION_CODE",
  234. "POSITION_NAME=" + CodePosition_NAME +
  235. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") +
  236. ";POSITION_CODE=" + TEMP_Code_Position_ID);
  237. }
  238. else
  239. {
  240. // 삽입
  241. _Db.ADD("TB_POSITION_CODE",
  242. "POSITION_NAME=" + CodePosition_NAME +
  243. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") +
  244. ";POSITION_CODE=" + TEMP_Code_Position_ID);
  245. }
  246. }
  247. }
  248. // TB_EVENT_TYPE 테이블에 데이터 삽입
  249. foreach (_Code_Event_Type Code_Event_Type in _Data.LIST_CodeEventType)
  250. {
  251. _Db.ADD("TB_EVENT_TYPE",
  252. "EVENT_TYPE=" + Code_Event_Type.EVENT_TYPE +
  253. ";EVENT_TYPE_NAME=" + Code_Event_Type.EVENT_TYPE_NAME +
  254. ";UPDATE_USER_ID=" + "FireManager" +
  255. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  256. }
  257. // TB_DEVICE_TYPE 테이블에 데이터 삽입
  258. foreach (_Code_Device_Type Table_Device_Type in _Data.LIST_CodeDeviceType)
  259. {
  260. _Db.ADD("TB_DEVICE_TYPE",
  261. "DEVICE_TYPE=" + Table_Device_Type.DEVICE_TYPE +
  262. ";DEVICE_TYPE_NAME=" + Table_Device_Type.DEVICE_TYPE_NAME +
  263. ";SYMBOL_TYPE=" + Table_Device_Type.SYMBOL_TYPE +
  264. ";SEQ_NO=" + Table_Device_Type.SEQ_NO +
  265. ";USE_FLAG=" + Table_Device_Type.USE_FLAG +
  266. ";UPDATE_USER_ID=" + "FireManager" +
  267. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  268. }
  269. // TB_POSITION_CODE 테이블에 전체데이터를 삽입하고 Value값 1증가
  270. if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum)
  271. Delegate_UiProgressBar(); //크로스 스레드 해결
  272. // 2015.6.16
  273. // 아래부터 아날로그 감지기를 위한 루틴이 추가되었다
  274. // 아날로그 감지기를 위한 테이블은 총 4개이다.
  275. // TB_REPEATER, TB_DEVICE, TB_DAYTIME, TB_ANALOG_DEVICE_2
  276. // 아날로그 감지기 화재 (FireDay 모드) 시간이 있는 경우에만
  277. if (_Data.LIST_CodeFireDayTime.Count != 0)
  278. {
  279. _Db.ADD("TB_DAYTIME",
  280. "START_HOUR=" + _Data.LIST_CodeFireDayTime[0].ToString() +
  281. ";START_MIN=" + _Data.LIST_CodeFireDayTime[1].ToString() +
  282. ";END_HOUR=" + _Data.LIST_CodeFireDayTime[2].ToString() +
  283. ";END_MIN=" + _Data.LIST_CodeFireDayTime[3].ToString());
  284. }
  285. // cyim 2017.01.19 반드시 통신보드 1번에 0번루프 중계기126번 127번 중계기가 있어야한다
  286. // cyim 2017.01.23 반드시 통신보드 1번에 0번루프 중계기124번 125번 중계기가 있어야한다
  287. int RePeater_Special = 0;
  288. int RePeater_Special_Point = 0;
  289. // 3개 테이블 동시 삽입
  290. // TB_REPEATER 테이블에 데이터 삽입
  291. // TB_DEVICE 테이블에 데이터 삽입
  292. // TB_EMERGENCY_BROADCASTION 테이블에 데이터 삽입
  293. foreach (_Excel_Sheet Excel_Sheet in _Data.List_ExcelPoint)
  294. {
  295. foreach (_Excel_Repeater Excel_Repeater in Excel_Sheet.List_Repeater)
  296. {
  297. // 중계기 타입을 확인하여 코드 생성
  298. // 중계기 타입은 아래와 같다
  299. // '1' = A : 2X2
  300. // '2' = B : 4X4
  301. // '4' = C : 아날로그연감지기
  302. // '5' = D : 아날로그열감지기
  303. string RepeaterType = null;
  304. if (Excel_Repeater.TYPE.ToString() == POINT_TYPE.REPEATER_2_2.ToString())
  305. RepeaterType = "1";
  306. else if (Excel_Repeater.TYPE.ToString() == POINT_TYPE.REPEATER_4_4.ToString())
  307. RepeaterType = "2";
  308. else if (Excel_Repeater.TYPE.ToString() == POINT_TYPE.ANALOG_SMOKE.ToString())
  309. RepeaterType = "4";
  310. else if (Excel_Repeater.TYPE.ToString() == POINT_TYPE.ANALOG_HEAT.ToString())
  311. RepeaterType = "5";
  312. // cyim 2017.01.19 반드시 통신보드 1번에 0번루프 중계기126번 127번 중계기가 있어야한다
  313. // cyim 2017.01.23 반드시 통신보드 1번에 0번루프 중계기124번 125번 중계기가 있어야한다
  314. if (Excel_Sheet.BOARD_ID == "1" &&
  315. (Excel_Repeater.REPEATER_ID == "124"
  316. || Excel_Repeater.REPEATER_ID == "125"
  317. || Excel_Repeater.REPEATER_ID == "126"
  318. || Excel_Repeater.REPEATER_ID == "127")
  319. )
  320. RePeater_Special++;
  321. // TB_REPEATER 테이블에 데이터 삽입
  322. _Db.ADD("TB_REPEATER",
  323. "RECEIVER_ID=" + ReceiverID +
  324. ";COMM_ID=" + "1" +
  325. ";BOARD_ID=" + Excel_Sheet.BOARD_ID +
  326. ";LOOP_NO=" + (Int32.Parse(Excel_Sheet.LOOP_NO) - 1) + // 채널값은 엑셀에 나와 있는 값에서 -1
  327. ";REPEATER_ID=" + Excel_Repeater.REPEATER_ID +
  328. ";REPEATER_TYPE=" + RepeaterType +
  329. ";REPEATER_NAME=" + Excel_Repeater.NAME +
  330. ";CUT_FLAG=" + "N" +
  331. ";USE_FLAG=" + "Y" +
  332. ";POSITION_CODE=" + ((_Code_Position)_Data.HASH_CodePosition[_Excel.Code_Position_Name_Create(Excel_Repeater.Excel_Position.Building, Excel_Repeater.Excel_Position.Stair, Excel_Repeater.Excel_Position.Floor)]).Code_Position_ID +
  333. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  334. foreach (_Excel_Point Excel_Point in Excel_Repeater.List_Point)
  335. {
  336. // cyim 2017.01.23 반드시 통신보드 1번에 0번루프 중계기124번 125번 중계기가 있어야한다
  337. if (Excel_Sheet.BOARD_ID == "1" &&
  338. (Excel_Repeater.REPEATER_ID == "124"
  339. || Excel_Repeater.REPEATER_ID == "125"
  340. || Excel_Repeater.REPEATER_ID == "126"
  341. || Excel_Repeater.REPEATER_ID == "127")
  342. )
  343. RePeater_Special_Point++;
  344. // TB_DEVICE 테이블에 데이터 삽입
  345. _Db.ADD("TB_DEVICE",
  346. "RECEIVER_ID=" + ReceiverID +
  347. ";COMM_ID=" + "1" +
  348. ";BOARD_ID=" + Excel_Sheet.BOARD_ID +
  349. ";LOOP_NO=" + (Int32.Parse(Excel_Sheet.LOOP_NO) - 1) + // 채널값은 엑셀에 나와 있는 값에서 -1
  350. ";REPEATER_ID=" + Excel_Repeater.REPEATER_ID +
  351. ";DEVICE_ID=" + Excel_Point.PortNum +
  352. ";INOUT_TYPE=" + Excel_Point.TYPE +
  353. ";DEVICE_NAME=" + Excel_Point.NAME +
  354. ";DEVICE_TYPE=" + Excel_Point.Code_Type +
  355. ";POSITION_CODE=" + ((_Code_Position)_Data.HASH_CodePosition[_Excel.Code_Position_Name_Create(Excel_Point.Excel_Position.Building, Excel_Point.Excel_Position.Stair, Excel_Point.Excel_Position.Floor)]).Code_Position_ID +
  356. ";CUT_FLAG=" + "N" +
  357. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  358. // TB_EMERGENCY_BROADCASTION 테이블에 데이터 삽입
  359. if (Excel_Point.Code_Name == "일반화재입력" || Excel_Point.Code_Name == "축적화재입력" || Excel_Point.Code_Name == "열감지기입력" || Excel_Point.Code_Name == "연감지기입력")
  360. {
  361. // 포지션코드 확인해서 분리
  362. //string Position_Code = ((_Code_Position)_Data.HASH_CodePosition[_Excel.Code_Position_Name_Create(Excel_Point.Excel_Position.Building, Excel_Point.Excel_Position.Stair, Excel_Point.Excel_Position.Floor)]).Code_Position_ID;
  363. //string AREA_CODE = Position_Code.Substring(0, 2);
  364. //string STAIR_CODE = Position_Code.Substring(2, 2);
  365. //string FLOOR_CODE = Position_Code.Substring(4, 2);
  366. //// 지하층일 경우 무조건 FLOOR_CODE는 "00"
  367. //if (FLOOR_CODE == "36" || FLOOR_CODE == "37" || FLOOR_CODE == "38" || FLOOR_CODE == "39" || FLOOR_CODE == "40" || FLOOR_CODE == "41" || FLOOR_CODE == "42")
  368. // FLOOR_CODE = "00";
  369. string Emergency_Code = ((_Code_Position)_Data.HASH_CodePosition[_Excel.Code_Position_Name_Create(Excel_Point.Excel_Position.Building, Excel_Point.Excel_Position.Stair, Excel_Point.Excel_Position.Floor)]).Code_Emergency_ID;
  370. string AREA_CODE = Emergency_Code.Substring(0, 2);
  371. string STAIR_CODE = Emergency_Code.Substring(2, 2);
  372. string FLOOR_CODE = Emergency_Code.Substring(4, 2);
  373. _Db.ADD("TB_EMERGENCY_BROADCASTION",
  374. "RECEIVER_ID=" + ReceiverID +
  375. ";COMM_ID=" + "1" +
  376. ";BOARD_ID=" + Excel_Sheet.BOARD_ID +
  377. ";LOOP_NO=" + (Int32.Parse(Excel_Sheet.LOOP_NO) - 1) + // 채널값은 엑셀에 나와 있는 값에서 -1
  378. ";REPEATER_ID=" + Excel_Repeater.REPEATER_ID +
  379. ";DEVICE_ID=" + Excel_Point.PortNum +
  380. ";INOUT_TYPE=" + Excel_Point.TYPE +
  381. ";AREA_CODE=" + AREA_CODE +
  382. ";STAIR_CODE=" + STAIR_CODE +
  383. ";FLOOR_CODE=" + FLOOR_CODE +
  384. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  385. }
  386. // cyim 2016.07.27 : 아날로그 감지기 레벨 감지기 타입별 설정 기능
  387. // 아날로그 감지기 레벨값이 있는 경우에만
  388. if (RepeaterType == "4" && _Data.LIST_CodeAnalogLevel_Smoke.Count == 4)
  389. {
  390. // TB_ANALOG_DEVICE_2 테이블에 데이터 삽입
  391. _Db.ADD("TB_ANALOG_DEVICE_2",
  392. "RECEIVER_ID=" + ReceiverID +
  393. ";COMM_ID=" + "1" +
  394. ";BOARD_ID=" + Excel_Sheet.BOARD_ID +
  395. ";LOOP_NO=" + (Int32.Parse(Excel_Sheet.LOOP_NO) - 1) + // 채널값은 엑셀에 나와 있는 값에서 -1
  396. ";REPEATER_ID=" + Excel_Repeater.REPEATER_ID +
  397. ";DEVICE_ID=" + Excel_Point.PortNum +
  398. ";INOUT_TYPE=" + Excel_Point.TYPE +
  399. ";FAULT_VALUE=" + _Data.LIST_CodeAnalogLevel_Smoke[0].ToString() +
  400. ";PREFIRE_VALUE=" + _Data.LIST_CodeAnalogLevel_Smoke[1].ToString() +
  401. ";FIRED_VALUE=" + _Data.LIST_CodeAnalogLevel_Smoke[2].ToString() +
  402. ";FIREN_VALUE=" + _Data.LIST_CodeAnalogLevel_Smoke[3].ToString() +
  403. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  404. }
  405. if (RepeaterType == "5" && _Data.LIST_CodeAnalogLevel_Heat.Count == 4)
  406. {
  407. // TB_ANALOG_DEVICE_2 테이블에 데이터 삽입
  408. _Db.ADD("TB_ANALOG_DEVICE_2",
  409. "RECEIVER_ID=" + ReceiverID +
  410. ";COMM_ID=" + "1" +
  411. ";BOARD_ID=" + Excel_Sheet.BOARD_ID +
  412. ";LOOP_NO=" + (Int32.Parse(Excel_Sheet.LOOP_NO) - 1) + // 채널값은 엑셀에 나와 있는 값에서 -1
  413. ";REPEATER_ID=" + Excel_Repeater.REPEATER_ID +
  414. ";DEVICE_ID=" + Excel_Point.PortNum +
  415. ";INOUT_TYPE=" + Excel_Point.TYPE +
  416. ";FAULT_VALUE=" + _Data.LIST_CodeAnalogLevel_Heat[0].ToString() +
  417. ";PREFIRE_VALUE=" + _Data.LIST_CodeAnalogLevel_Heat[1].ToString() +
  418. ";FIRED_VALUE=" + _Data.LIST_CodeAnalogLevel_Heat[2].ToString() +
  419. ";FIREN_VALUE=" + _Data.LIST_CodeAnalogLevel_Heat[3].ToString() +
  420. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  421. }
  422. }
  423. // TB_REPEATER 테이블에 데이터 삽입할때마다 Value값을 1 증가시킴
  424. if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum)
  425. Delegate_UiProgressBar(); //크로스 스레드 해결
  426. }
  427. }
  428. // cyim 2017.02.02 : IFC 3300 에서는 엑셀입출력표 제한을 걸지 않는다
  429. // hoon 2020-01-08 사업부(장재연)의 요청으로 다 허용으로 수정
  430. //if (((_RECEIVER)_Data.HASH_RECEIVER[ReceiverID]).MODEL != "IFC3300")
  431. //{
  432. // // cyim 2017.01.23 반드시 통신보드 1번에 0번루프 중계기124번 125번 중계기가 있어야한다
  433. // // cyim 2017.01.19 반드시 통신보드 1번에 0번루프 중계기126번 127번 중계기가 있어야한다
  434. // if ((RePeater_Special == 4 || RePeater_Special == 8) && (RePeater_Special_Point == 13 || RePeater_Special_Point == 26))
  435. // {
  436. // ;
  437. // }
  438. // else
  439. // {
  440. // // UI를 갱신하라
  441. // ui_renew = true;
  442. // // 저장버튼 및 닫기버튼 사용하게...
  443. // Delegate_UiButton_bad();
  444. // // 프로젝트 수정
  445. // _Data.ProJect_Save_Complete = false;
  446. // // 버튼은 사용가능함
  447. // _Data.Enable_Button = true;
  448. // _Popup.MessageBoxPopup(MessageBoxButtons.OK, _Text.ExceptionError6, _Text.OK);
  449. // return;
  450. // }
  451. //}
  452. //
  453. // GridEx 출력
  454. //
  455. // 그리드에 출력이 끝나면 Value값을 1 증가시킴
  456. if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum)
  457. Delegate_UiProgressBar(); //크로스 스레드 해결
  458. //** IO 보드 디바이스 추가 (엑셀연동 루틴 추가)
  459. bool result = Add_IOBoard_Device();
  460. // cyim 2016.12.22 모델별 엑셀임포트 오류 방지
  461. if (result == false)
  462. {
  463. // UI를 갱신하라
  464. ui_renew = true;
  465. // 저장버튼 및 닫기버튼 사용하게...
  466. Delegate_UiButton_bad();
  467. // 프로젝트 수정
  468. _Data.ProJect_Save_Complete = false;
  469. // 버튼은 사용가능함
  470. _Data.Enable_Button = true;
  471. //if (((_RECEIVER)_Data.HASH_RECEIVER[ReceiverID]).MODEL == "IFC3300")
  472. // _Popup.MessageBoxPopup(MessageBoxButtons.OK, _Text.ExceptionError4,_Text.OK);
  473. //else
  474. if (((_RECEIVER)_Data.HASH_RECEIVER[ReceiverID]).MODEL != "IFC3300")
  475. _Popup.MessageBoxPopup(MessageBoxButtons.OK, _Text.ExceptionError5, _Text.OK);
  476. if (((_RECEIVER)_Data.HASH_RECEIVER[ReceiverID]).MODEL == "IFC3300")
  477. _Popup.MessageBoxPopup(MessageBoxButtons.OK, _Text.ExceptionError7, _Text.OK);
  478. return;
  479. }
  480. // 그리드에 출력이 끝나면 Value값을 1 증가시킴
  481. if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum)
  482. Delegate_UiProgressBar(); //크로스 스레드 해결
  483. //
  484. // 입력 및 출력 디바이스의 빠른 출력을 위해서 미리 정리(추가된 작업 - 2013.07.03)
  485. // 상위 루틴은 데이타베이스에 저장이 목표였다면 하위 부분은 포인트 입출력 정보가 너무 화면이 늦게 나타나므로 미리 SQL 결과를 저장하기 위한 용도입니다.
  486. //
  487. // 먼저 클리어
  488. _Data.Hash_ImportPoint.Clear();
  489. // 해당 수신기 아이디만큼 루틴을 돌린다
  490. foreach (string pRECEIVER_ID in _Data.LIST_XMLRECEIVER_ID)
  491. {
  492. _ImportPoint ImportPoint = new _ImportPoint();
  493. // cyim 2016.12.05 : 수신기 모델별 내부 로직 변경
  494. if (((_RECEIVER)_Data.HASH_RECEIVER[pRECEIVER_ID]).MODEL == "IFC3300")
  495. {
  496. // 해당 수신기 아이디 값을 이용해서 입력용 데이타를 만들자
  497. ImportPoint.IN_Points = _Db.ExecuteRead_SqlDataAdapter(
  498. _Sql.Search_DEVICETable_With_EMERGENCY_BigReceiver("1", "I", "", "", "", "", "", "", pRECEIVER_ID, "", "", "", false));
  499. // 해당 수신기 아이디 값을 이용해서 출력용 데이타를 만들자
  500. ImportPoint.OUT_Points = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_DEVICETable_NoneBoardID_BigReceiver("1", "O", "", "", "", "", "", pRECEIVER_ID));
  501. }
  502. else
  503. {
  504. // 해당 수신기 아이디 값을 이용해서 입력용 데이타를 만들자
  505. ImportPoint.IN_Points = _Db.ExecuteRead_SqlDataAdapter(
  506. _Sql.Search_DEVICETable_With_EMERGENCY("1", "I", "15", "", "", "", "", "", pRECEIVER_ID, "", "", "", false));
  507. // 해당 수신기 아이디 값을 이용해서 출력용 데이타를 만들자
  508. ImportPoint.OUT_Points = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_DEVICETable("1", "O", "15", "", "", "", "", "", pRECEIVER_ID));
  509. }
  510. // 해쉬테이블에 삽입
  511. _Hash.Add(_Data.Hash_ImportPoint, pRECEIVER_ID, ImportPoint);
  512. }
  513. // 이 루틴은 상위 루틴이 오래걸려서 프로그레스바가 멈추는 것처럼 보일수도 있으므로 일단 프로그레스바 진행바 총 카운터를 50만큼 늘인것이다
  514. for (int i = 0; i < 50; i++)
  515. {
  516. // 그리드에 출력이 끝나면 Value값을 1 증가시킴
  517. if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum)
  518. Delegate_UiProgressBar(); //크로스 스레드 해결
  519. }
  520. }
  521. else if (Type == _Text.UI_TREE_OPER_GROUP) // 그룹 정보 임포팅
  522. {
  523. //
  524. // TB_GROUP 정보추가
  525. //
  526. foreach (_Excel_Group Excel_Group in _Data.List_ExcelGroup)
  527. {
  528. // "TB_GROUP"에 DB 삽입
  529. _Db.ADD("TB_GROUP",
  530. "RECEIVER_ID=" + ReceiverID + // 그룹 임포팅때는 모든 그룹이 자기 관할 그룹이다.
  531. ";GROUP_ID=" + Excel_Group.Group_ID +
  532. ";GROUP_NAME=" + Excel_Group.Group_Name +
  533. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  534. if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum)
  535. Delegate_UiProgressBar(); //크로스 스레드 해결
  536. }
  537. }
  538. else // 연동설정 정보 임포팅
  539. {
  540. // 엑셀에는 타수신기의 그룹정보가 있을수 있으므로 전체 그룹에 대한 그룹아이디를 키값으로 갇고 수신기아이디로 데이타를 가지고 있는 특별한 해쉬테이블을 구성한다
  541. Hashtable Group_ReceiverID_Table = new Hashtable();
  542. DataRowCollection DB_TABLE_GROUP = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_GROUP", null));
  543. if (DB_TABLE_GROUP != null && DB_TABLE_GROUP.Count != 0)
  544. {
  545. foreach (DataRow dr in DB_TABLE_GROUP) // 네트워크 수신기에서 그룹 아이디는 유일하다
  546. {
  547. if (Group_ReceiverID_Table.ContainsKey(dr["GROUP_ID"].ToString()) == false)
  548. Group_ReceiverID_Table.Add(dr["GROUP_ID"].ToString(), dr["RECEIVER_ID"].ToString());
  549. }
  550. }
  551. //
  552. // TB_MAP 정보추가
  553. //
  554. foreach (_Excel_Map Excel_Map in _Data.List_ExcelMap)
  555. {
  556. //
  557. // "TB_MAP"에 DB 삽입
  558. //
  559. _Db.ADD("TB_MAP",
  560. "RECEIVER_ID=" + ReceiverID +
  561. ";MAP_NO=" + Excel_Map.Map_ID.Remove(0, 1) +
  562. ";MAP_ID=" + Excel_Map.Map_ID +
  563. ";MAP_NAME=" + Excel_Map.Map_Name +
  564. ";USE_FLAG=" + "Y" +
  565. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  566. //
  567. // "TB_MAP_PROCESS"에 DB 삽입
  568. //
  569. // 그룹이 몇개 들어 있는지 조사해서 그만큼 "TB_MAP_PROCESS"에 저장한다
  570. if (Excel_Map.Groups != _Text.Null)
  571. {
  572. string[] Group = Excel_Map.Groups.Split(':');
  573. for (int i = 0; i < Group.Count(); i++)
  574. {
  575. // 타수신기 그룹 정보를 먼저 임포트작업을 완료해야만, 연동설정을 임포트해야 그룹아이디 정보를 설정 프로그램에서 추출할수 있습니다
  576. try
  577. {
  578. //
  579. // 그룹 정보 저장
  580. //
  581. _Db.ADD("TB_MAP_PROCESS",
  582. "MAP_RECEIVER_ID=" + ReceiverID + // 현재 ReceiverID 저장
  583. ";MAP_NO=" + Excel_Map.Map_ID.Remove(0, 1) +
  584. ";MAP_TYPE=" + "O" +
  585. ";SEQ_NO=" + (i + 1) +
  586. ";PROCESS_TYPE=" + "G" +
  587. ";GROUP_ID=" + Group[i] +
  588. ";RECEIVER_ID=" + Group_ReceiverID_Table[Group[i]].ToString() + // 출력해야되는 회로 혹은 그룹의 수신기 아이디 : 엑셀로 Import 할때는 그룹 정보가 반드시 수신기 아이디에 해당하지 않는 타 수신기에 그룹일수도 있다.
  589. ";COMM_ID=" + null +
  590. ";BOARD_ID=" + null +
  591. ";LOOP_NO=" + null +
  592. ";REPEATER_ID=" + null +
  593. ";DEVICE_ID=" + null +
  594. ";INOUT_TYPE=" + null +
  595. ";USE_FLAG=" + "Y");
  596. }
  597. catch
  598. {
  599. // UI를 갱신하라
  600. ui_renew = true;
  601. // 저장버튼 및 닫기버튼 사용하게...
  602. Delegate_UiButton_bad();
  603. // 프로젝트 수정
  604. _Data.ProJect_Save_Complete = false;
  605. // 버튼은 사용가능함
  606. _Data.Enable_Button = true;
  607. MessageBox.Show(_Text.ExceptionError1);
  608. return;
  609. }
  610. }
  611. }
  612. // 입력디바이스가 몇개 들어 있는지 조사해서 그만큼 "TB_MAP_PROCESS"에 저장한다
  613. if (Excel_Map.InDevices != _Text.Null)
  614. {
  615. string[] InDevice = Excel_Map.InDevices.Split(':');
  616. for (int i = 0; i < InDevice.Count(); i++)
  617. {
  618. // BOARD_ID, LOOP_NO, REPEATER_ID, DEVICE_ID
  619. string[] Value = InDevice[i].Split('-');
  620. //
  621. // 입력 디바이스 정보 저장
  622. //
  623. _Db.ADD("TB_MAP_PROCESS",
  624. "MAP_RECEIVER_ID=" + ReceiverID + // 현재 ReceiverID 저장
  625. ";MAP_NO=" + Excel_Map.Map_ID.Remove(0, 1) +
  626. ";MAP_TYPE=" + "I" +
  627. ";SEQ_NO=" + (i + 1) +
  628. ";PROCESS_TYPE=" + "D" +
  629. ";GROUP_ID=" + null +
  630. ";RECEIVER_ID=" + ReceiverID + // 현재 ReceiverID 저장 // 입력회로는 반드시 자기 수신기의 입력 회로이다
  631. ";COMM_ID=" + "1" +
  632. ";BOARD_ID=" + Int32.Parse(Value[1]) +
  633. ";LOOP_NO=" + Int32.Parse(Value[2]) +
  634. ";REPEATER_ID=" + Int32.Parse(Value[3]) +
  635. ";DEVICE_ID=" + Int32.Parse(Value[4]) +
  636. ";INOUT_TYPE=" + "I" +
  637. ";USE_FLAG=" + "Y");
  638. }
  639. }
  640. if (UiProgressBar_ExcelImport.Value <= UiProgressBar_ExcelImport.Maximum)
  641. Delegate_UiProgressBar(); //크로스 스레드 해결
  642. }
  643. }
  644. // UI를 갱신하라
  645. ui_renew = true;
  646. // 저장버튼 및 닫기버튼 사용하게...
  647. Delegate_UiButton_good();
  648. // 프로젝트 수정
  649. _Data.ProJect_Save_Complete = false;
  650. // 버튼은 사용가능함
  651. _Data.Enable_Button = true;
  652. }
  653. // IO보드 디바이스 추가
  654. public bool Add_IOBoard_Device()
  655. {
  656. foreach (_Code_IO_Board Code_IO_Board in _Data.LIST_CodeIOBoard)
  657. {
  658. // cyim 2017.01.12 모델별 엑셀임포트 오류 방지 버그 수정
  659. // 통신보드는 0번,15번 으로 구분해야한다
  660. // cyim 2017.01.23 예외처리 부분은 일단 제외한다
  661. // cyim 2016.12.22 모델별 엑셀임포트 오류 방지
  662. if (((_RECEIVER)_Data.HASH_RECEIVER[ReceiverID]).MODEL == "IFC3300")
  663. {
  664. if (Code_IO_Board.IOBOARD_COM_PORT == "1") // 엑셀 시트의 IO 보드 입출력표 내용중 통신보드 별도 추가건에 대해서는
  665. if (Code_IO_Board.IOBOARD_BOARD_ID != "0") // 반드시 0 이 들어가야한다 (다른 아이디는 허용안함)
  666. return false;
  667. }
  668. // cyim 2017.02.02 : IFC 3300 에서는 엑셀입출력표 제한을 걸지 않는다
  669. // 단, IFC3300 이하 모델에서는 IO 보드는 15번 보드는 무조건 강제로 사용하도록 한다
  670. if (((_RECEIVER)_Data.HASH_RECEIVER[ReceiverID]).MODEL != "IFC3300")
  671. {
  672. if (Code_IO_Board.IOBOARD_COM_PORT == "1") // 엑셀 시트의 IO 보드 입출력표 내용중 통신보드 별도 추가건에 대해서는
  673. if (Code_IO_Board.IOBOARD_BOARD_ID != "15") // 반드시 15 가 들어가야한다 (다른 아이디는 허용안함)
  674. return false;
  675. }
  676. // I/O 보드의 각 디바이스 아이디를 추가한다. 즉 TB_DEVICE 에 추가
  677. DB_ADD_IOBoard_Device(ReceiverID,
  678. Code_IO_Board.IOBOARD_COM_PORT,
  679. Code_IO_Board.IOBOARD_BOARD_ID,
  680. Code_IO_Board.IOBOARD_LOOP_NO,
  681. Code_IO_Board.IOBOARD_REPEATER_ID,
  682. Code_IO_Board.IOBOARD_DEVICE_ID,
  683. Code_IO_Board.IOBOARD_INOUT,
  684. Code_IO_Board.IOBOARD_NAME,
  685. "000000",
  686. "N");
  687. // 별도 펌프에 관련된 중계기를 추가한다. 즉 TB_REPEATER 에 추가
  688. if (Code_IO_Board.IOBOARD_ADDREPEATER_YN == "Y")
  689. {
  690. // 중계기 추가
  691. DB_ADD_Repeater(ReceiverID,
  692. Code_IO_Board.IOBOARD_COM_PORT,
  693. Code_IO_Board.IOBOARD_BOARD_ID,
  694. Code_IO_Board.IOBOARD_LOOP_NO,
  695. Code_IO_Board.IOBOARD_REPEATER_ID,
  696. Code_IO_Board.IOBOARD_ADDREPEATER_TYPE == "2*2" ? "1" : "2", // 중계기타입 1 : 2*2 , 2 : 4*4
  697. "중계기");
  698. }
  699. }
  700. return true;
  701. // cyim : 임시코드 (주석코드는 지우지 마십시오, 원본보관용입니다)
  702. //// I/O 추가
  703. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "9", "I", "주펌프 스위치주의", "000000", "N");
  704. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "10", "I", "보조펌프 스위치주의", "000000", "N");
  705. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "11", "I", "충압펌프 스위치주의", "000000", "N");
  706. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "12", "I", "주스프링클러 스위치주의", "000000", "N");
  707. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "13", "I", "보조스프링클러 스위치주의", "000000", "N");
  708. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "14", "I", "충압스프링클러 스위치주의", "000000", "N");
  709. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "1", "I", "발신기", "000000", "N");
  710. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "2", "I", "전화", "000000", "N");
  711. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "3", "I", "교류전원", "000000", "N");
  712. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "4", "I", "예비전원이상", "000000", "N");
  713. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "1", "O", "표시등", "000000", "N");
  714. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "2", "O", "유도등", "000000", "N");
  715. //DB_ADD_IOBoard_Device(ReceiverID, "3", "15", "0", "0", "3", "O", "전원릴레이", "000000", "N");
  716. //DB_ADD_IOBoard_Device(ReceiverID, "1", "15", "0", "1", "1", "I", "주펌프", "000000", "N");
  717. //DB_ADD_IOBoard_Device(ReceiverID, "1", "15", "0", "2", "1", "I", "보조펌프", "000000", "N");
  718. //DB_ADD_IOBoard_Device(ReceiverID, "1", "15", "0", "3", "1", "I", "충압펌프", "000000", "N");
  719. //DB_ADD_IOBoard_Device(ReceiverID, "1", "15", "0", "4", "1", "I", "주스프링클러", "000000", "N");
  720. //DB_ADD_IOBoard_Device(ReceiverID, "1", "15", "0", "5", "1", "I", "보조스프링클러", "000000", "N");
  721. //DB_ADD_IOBoard_Device(ReceiverID, "1", "15", "0", "6", "1", "I", "충압스프링클러", "000000", "N");
  722. //// 중계기 추가
  723. //DB_ADD_Repeater(ReceiverID, "1", "15", "0", "1", "2", "중계기");
  724. //DB_ADD_Repeater(ReceiverID, "1", "15", "0", "2", "2", "중계기");
  725. //DB_ADD_Repeater(ReceiverID, "1", "15", "0", "3", "1", "중계기");
  726. //DB_ADD_Repeater(ReceiverID, "1", "15", "0", "4", "2", "중계기");
  727. //DB_ADD_Repeater(ReceiverID, "1", "15", "0", "5", "2", "중계기");
  728. //DB_ADD_Repeater(ReceiverID, "1", "15", "0", "6", "1", "중계기");
  729. // cyim : 임시코드 (주석코드는 지우지 마십시오, 테스트용입니다)
  730. //DB_ADD_IOBoard_Device(ReceiverID, "3", "1", "0", "0", "1", "O", "표시등", "000000", "N");
  731. //DB_ADD_IOBoard_Device(ReceiverID, "3", "1", "0", "0", "2", "O", "유도등", "000000", "N");
  732. }
  733. // IO보드 디바이스 추가
  734. public void DB_ADD_IOBoard_Device(string RECEIVER_ID, string COMM_ID, string BOARD_ID, string LOOP_NO, string REPEATER_ID, string DEVICE_ID, string INOUT_TYPE, string DEVICE_NAME, string POSITION_CODE, string CUT_FLAG)
  735. {
  736. _Db.ADD("TB_DEVICE",
  737. "RECEIVER_ID=" + ReceiverID +
  738. ";COMM_ID=" + COMM_ID +
  739. ";BOARD_ID=" + BOARD_ID +
  740. ";LOOP_NO=" + LOOP_NO +
  741. ";REPEATER_ID=" + REPEATER_ID +
  742. ";DEVICE_ID=" + DEVICE_ID +
  743. ";INOUT_TYPE=" + INOUT_TYPE +
  744. ";DEVICE_NAME=" + DEVICE_NAME +
  745. ";POSITION_CODE=" + POSITION_CODE +
  746. ";CUT_FLAG=" + CUT_FLAG +
  747. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  748. }
  749. // 중계기 6개 추가
  750. public void DB_ADD_Repeater(string RECEIVER_ID, string COMM_ID, string BOARD_ID, string LOOP_NO, string REPEATER_ID, string REPEATER_TYPE, string REPEATER_NAME)
  751. {
  752. _Db.ADD("TB_REPEATER",
  753. "RECEIVER_ID=" + ReceiverID +
  754. ";COMM_ID=" + COMM_ID +
  755. ";BOARD_ID=" + BOARD_ID +
  756. ";LOOP_NO=" + LOOP_NO +
  757. ";REPEATER_ID=" + REPEATER_ID +
  758. ";REPEATER_TYPE=" + REPEATER_TYPE +
  759. ";REPEATER_NAME=" + REPEATER_NAME +
  760. ";CUT_FLAG=" + "N" +
  761. ";USE_FLAG=" + "Y" +
  762. ";POSITION_CODE=" + "000000" +
  763. ";UPDATE_TIME=" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  764. }
  765. // 팝업에서 Yes, NO 에서 받은 이벤트 처리 (실제 엑셀연동 적용여부)
  766. public void _Event_PopupClose_SendMessage_Event(object sender, object etc)
  767. {
  768. // 대화 팝업 주체
  769. Form popup = (Form)sender;
  770. if (DialogPopup.Name == popup.Name && etc.ToString() == _Text.OK)
  771. {
  772. // UI 갱신 타이머 스타트
  773. Timer_Renew.Start();
  774. int ProgressBar_TotalCount = 0;
  775. // 저장버튼 및 닫기버튼 실행 중에는 사용 못하게
  776. UiButton_Apply.Enabled = false;
  777. UiButton_Close.Enabled = false;
  778. // 포인트(디바이스) 정보 임포팅
  779. if (Type == _Text.UI_TREE_POINT)
  780. {
  781. // 먼저 4개 테이블 삭제하고 데이터 Importing
  782. // TB_POSITION_CODE 테이블 모든 데이터 삭제
  783. // cyim 2013.06.14 이렇게 만약 엑셀연동할때마다 테이블을 삭제하고 마지막에 엑셀 연동한 데이타만 들어가므로 문제의 요지가 있다
  784. //if (_Data.LIST_XMLRECEIVER_ID.Count == 1) // 1개만 존재하는 경우 무조건 삭제한다
  785. // cyim 2016.07.11 : 네트워크 수신기도 무조건 삭제한다. 단, 1번수신기의엑셀,2번 수신기의 엑셀 내용중 코드탭의 건물,계단,층 정보는 동일해야한다
  786. // cyim 2016.07.12 : TB_POSITION_CODE 테이블 삭제하고 다시 생성하는 코드 원복, 확인결과 하나하나 중계기 입출력 포인트 별 개별적으로 위치코드가 추가된다
  787. if (_Data.LIST_XMLRECEIVER_ID.Count == 1)
  788. _Db.Execute(_Sql.Delete_Table("TB_POSITION_CODE", null));
  789. // TB_EVENT_TYPE 모든 데이타 삭제
  790. _Db.Execute(_Sql.Delete_Table("TB_EVENT_TYPE", null));
  791. // TB_DEVICE_TYPE 모든 데이타 삭제
  792. _Db.Execute(_Sql.Delete_Table("TB_DEVICE_TYPE", null));
  793. // TB_DEVICE 테이블 모든 데이터 삭제 (수신기 아이디별)
  794. _Db.Execute(_Sql.Delete_Table("TB_DEVICE", ReceiverID));
  795. // TB_REPEATER 테이블 모든 데이터 삭제 (수신기 아이디별)
  796. _Db.Execute(_Sql.Delete_Table("TB_REPEATER", ReceiverID));
  797. // TB_EMERGENCY_BROADCASTION 테이블 모든 데이터 삭제 (수신기 아이디별)
  798. _Db.Execute(_Sql.Delete_Table("TB_EMERGENCY_BROADCASTION", ReceiverID));
  799. //
  800. // 아날로그감지기용 테이블 2개가 없다면 새로 생성한다
  801. //
  802. // 중계기 타입은 아래와 같다, 아날로그 감지기를 위한 테이블은 총 4개이다. TB_DEVICE, TB_REPEATER, TB_DAYTIME, TB_ANALOG_DEVICE_2
  803. // '1' = A : 2X2
  804. // '2' = B : 4X4
  805. // '4' = C : 아날로그연감지기
  806. // '5' = D : 아날로그열감지기
  807. // TB_DAYTIME
  808. DataRowCollection DB_TABLE_TB_DAYTIME = _Db.ExecuteRead_SqlDataAdapter(_Sql.Table_Exist("TB_DAYTIME"));
  809. if (DB_TABLE_TB_DAYTIME != null && DB_TABLE_TB_DAYTIME.Count != 0)
  810. {
  811. // 존재하면 테이블 내용을 삭제
  812. _Db.Execute(_Sql.Delete_Table("TB_DAYTIME", null));
  813. }
  814. else
  815. {
  816. // 존재하지 않는 경우에는 테이블 신규 생성
  817. _Db.Execute(_Sql.Create_TB_DAYTIME());
  818. }
  819. // TB_ANALOG_DEVICE_2
  820. DataRowCollection DB_TABLE_TB_ANALOG_DEVICE_2 = _Db.ExecuteRead_SqlDataAdapter(_Sql.Table_Exist("TB_ANALOG_DEVICE_2"));
  821. if (DB_TABLE_TB_ANALOG_DEVICE_2 != null && DB_TABLE_TB_ANALOG_DEVICE_2.Count != 0)
  822. {
  823. // 존재하면 테이블 내용을 삭제
  824. _Db.Execute(_Sql.Delete_Table("TB_ANALOG_DEVICE_2", ReceiverID));
  825. }
  826. else
  827. {
  828. // 존재하지 않는 경우에는 테이블 신규 생성
  829. _Db.Execute(_Sql.Create_TB_ANALOG_DEVICE_2());
  830. }
  831. // ProgressBar Total 카운트 (3를 주는 이유는 포지션 테이블이 추가될때 1 증가, 그리드에 출력 올릴 때 1 증가, IO보드 디바이스 추가될때 1 증가)
  832. ProgressBar_TotalCount = 3 + 50; // 이 루틴은 상위 루틴이 오래걸려서 프로그레스바가 멈추는 것처럼 보일수도 있으므로 일단 프로그레스바 진행바 총 카운터를 50만큼 늘인것이다
  833. // ProgressBar의 Maximum값을 구하기 위해서
  834. foreach (_Excel_Sheet Excel_Sheet in _Data.List_ExcelPoint)
  835. {
  836. ProgressBar_TotalCount = ProgressBar_TotalCount + Excel_Sheet.List_Repeater.Count;
  837. }
  838. }
  839. else if (Type == _Text.UI_TREE_OPER_GROUP) // 그룹 정보 임포팅
  840. {
  841. // TB_GROUP 테이블 모든 데이터 삭제
  842. _Db.Execute(_Sql.Delete_Table("TB_GROUP", ReceiverID));
  843. //_Db.Execute(_Sql.Delete_Table("TB_GROUP_DEVICE", ReceiverID)); // 주석 처리(강과장님의 요구) - 힘들게 설정한 정보를 삭제하기 싫어서
  844. // 프로그레스바 계산
  845. // ProgressBar의 Maximum값을 구하기 위해서
  846. ProgressBar_TotalCount = _Data.List_ExcelGroup.Count;
  847. }
  848. else // 연동설정 정보 임포팅
  849. {
  850. // TB_MAP 테이블 모든 데이터 삭제
  851. _Db.Execute(_Sql.Delete_Table("TB_MAP", ReceiverID));
  852. _Db.Execute(_Sql.Delete_Table("TB_MAP_PROCESS", "MAP_RECEIVER_ID", ReceiverID, null)); // 네트워크 연동을 생각하여 삭제
  853. // 프로그레스바 계산
  854. // ProgressBar의 Maximum값을 구하기 위해서
  855. ProgressBar_TotalCount = _Data.List_ExcelMap.Count;
  856. }
  857. // ProgressBar의 Maximum값 저장
  858. UiProgressBar_ExcelImport.Maximum = ProgressBar_TotalCount;
  859. // UiProgressBar 초기값 셋팅
  860. UiProgressBar_ExcelImport.Value = 0;
  861. // 스레드 생성
  862. Thread WorkingThread = new Thread(new ThreadStart(Excel_Import));
  863. // 스레드시작
  864. WorkingThread.Start();
  865. }
  866. else
  867. _Data.Enable_Button = true;
  868. // 대화 팝업은 특별처리(이벤트 해제)
  869. _Event.PopupClose_SendMessage_Event -= new _Event.PopupClose_SendMessage_Handler(_Event_PopupClose_SendMessage_Event);
  870. }
  871. // UI 개신 타이머
  872. private void Timer_Renew_Tick(object sender, EventArgs e)
  873. {
  874. if (ui_renew == true)
  875. {
  876. if (Type == _Text.UI_TREE_POINT)
  877. {
  878. _Event.WorkViewPageName_SendMessage_Write(ReceiverID, Object_Type.POINT, null, null);
  879. }
  880. else if (Type == _Text.UI_TREE_OPER_GROUP) // 그룹 정보 임포팅
  881. {
  882. // 폼을 다시 갱신
  883. _Event.WorkViewPageName_SendMessage_Write(ReceiverID, Object_Type.OPER_GROUP, null, null);
  884. }
  885. else // 연동설정 정보 임포팅
  886. {
  887. // 폼을 다시 갱신
  888. _Event.WorkViewPageName_SendMessage_Write(ReceiverID, Object_Type.OPER_SET, null, null);
  889. }
  890. // 다시 변수 복귀
  891. ui_renew = false;
  892. // 타이머 스탑
  893. Timer_Renew.Stop();
  894. }
  895. }
  896. }
  897. }