FireDesk_Operation.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Collections;
  9. namespace FPER
  10. {
  11. // cyim 2015.8.3 수신반 연동기능 추가
  12. // 수신반에서 개별 수신기의 DB 로 부터 현재 연동상태 정보를 가져온다
  13. // 특이한점은 TB_EVENT_TYPE 과 TB_DEVICE_TYPE 테이블의 경우 수신기 아이디가 필드에 존재하지 않는다
  14. // 현장기준으로 전체 네트워크 수신기는 동일한 연동을 구성하도록 하고,
  15. // 지금 연동 상태는 결국 각각 수신기의 DB 를 이용해야 한다.
  16. // 아래는 참고로 디바이스 타입 약자와 타입명을 정리한것이다, 그리고 실제로 Seq 필드와 UseFlag 필드 예시이다
  17. //OA 주경종 0 Y
  18. //OB 지구경종 1 Y
  19. //OC 비상방송 2 Y
  20. //OD 시각경보기 0 Y
  21. //OE 전자사이렌 3 Y
  22. //OF 프리액션벨브 4 Y
  23. //OG 알람밸브 0 Y
  24. //OH 제연댐퍼 5 Y
  25. //OI 전실급기FAN 6 Y
  26. //OJ 상가급기댐퍼 7 Y
  27. //OK 상가배기댐퍼 8 Y
  28. //OL 상가급기FAN 9 Y
  29. //OM 상가배기FAN 10 Y
  30. //ON 방화샷다 11 Y
  31. //OO 방화문 12 Y
  32. //OP 자동폐쇄장치 13 Y
  33. //OQ 소화전기동램프 0 Y
  34. //OR 옥상개폐장치 14 Y
  35. //OS 자동문 0 Y
  36. //OT 배연창 15 Y
  37. //OU 유도등 16 Y
  38. //OZ 출력기타 0 Y
  39. public partial class FireDesk_Operation : Form
  40. {
  41. // 타이머
  42. public _Timer_WindowBase Timer_WindowBase_FireDesk_Operation = new _Timer_WindowBase();
  43. // 생성자
  44. public FireDesk_Operation()
  45. {
  46. InitializeComponent();
  47. //
  48. // 이벤트
  49. //
  50. // 폼닫기 이벤트 핸들러 등록
  51. this.FormClosing += new FormClosingEventHandler(FireDesk_Operation_FormClosing);
  52. //
  53. // UI
  54. //
  55. // 데이타그리드뷰 셋팅
  56. this.dataGridView_Main.Dock = DockStyle.Fill;
  57. this.dataGridView_Main.RowHeadersVisible = false; // 열의 첫번째 헤더는 필요 없다
  58. this.dataGridView_Main.AllowUserToAddRows = false;// 마지막에 행이 추가될 필요가 없다
  59. this.dataGridView_Main.Font = new System.Drawing.Font("굴림", 11F, System.Drawing.FontStyle.Bold);
  60. this.dataGridView_Main.Columns.Add("0", "연동타입");
  61. //this.dataGridView_Main.Columns[0].Width = 100;
  62. foreach (string id in _Data.Hash_Receiver_keys)
  63. {
  64. this.dataGridView_Main.Columns.Add(id, "수신기" + id);
  65. //this.dataGridView_Main.Columns[id].Width = 140;
  66. this.dataGridView_Main.Columns[id].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
  67. }
  68. this.dataGridView_Main.Columns[0].FillWeight = 170;// 채우기 모드에서만 적용
  69. this.dataGridView_Main.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 데이타 그리드 뷰의 채우기 모드
  70. this.dataGridView_Main.ScrollBars = ScrollBars.Both;
  71. // this 셋팅
  72. // 팝업창은 수신기의 개수에 의해 가로 사이즈가 결정된다
  73. this.Width = 170 + _Data.Hash_Receiver_keys.Length * 100;
  74. this.StartPosition = FormStartPosition.CenterScreen;
  75. this.TopMost = true;
  76. //
  77. // 타이머
  78. //
  79. Timer_WindowBase_FireDesk_Operation.Create("FireDesk_Operation_Timer", 5000, FireDesk_Operation_Timer_Tick, true);
  80. //
  81. // 기타
  82. //
  83. // 활성화
  84. _Data.FireDesk_Operation_Enable = true;
  85. // 값을 가져온다
  86. GetOeprationCurrentStatus();
  87. }
  88. // 소멸자
  89. public void FireDesk_Operation_FormClosing(object sender, FormClosingEventArgs e)
  90. {
  91. // 숨김
  92. this.Hide();
  93. // 비활성화
  94. _Data.FireDesk_Operation_Enable = false;
  95. // 타이머 해제
  96. Timer_WindowBase_FireDesk_Operation.Delete("FireDesk_Operation_Timer");
  97. }
  98. // 리스트뷰에 데이타값 반영
  99. public void GetOeprationCurrentStatus()
  100. {
  101. this.dataGridView_Main.Rows.Clear();
  102. // 행의 기준
  103. ArrayList DeviceTypeNames = new ArrayList();
  104. // 컬럼(열)은 수신기별로 생성하였다
  105. // 데이터 (행) 의 값은 출력타입으로서 데이타베이스를 기초로 해서 읽어들여야한다
  106. // 이때는, DB 를 양쪽에서 전부 읽고 OR 조건으로 컬럼값을 추출한다
  107. // 중복을 제거하고 준비하면 되겠다. 중요한 점은 네트워크 수신기의 경우 분명 동일한 출력타입을 모두 가지고 있다는 점이다.
  108. // 어차피 소방 설정 프로그램의 엑셀 Import 포맷의 경우 코드 시트가 1개뿐이므로 그렇게 예상할 수 있다
  109. Hashtable ReceiverDeviceTypeNames = new Hashtable();
  110. // 연동구성표를 위한 기초 데이터 수집
  111. foreach (string id in _Data.Hash_Receiver_keys)
  112. {
  113. // 테이블값을 통째로 해쉬테이블에 대입
  114. _DacFireDesk DacFireDesk = new _DacFireDesk(id);
  115. DataTable dt = DacFireDesk.TB_DEVICE_TYPE_From_SelectAll();
  116. foreach (DataRow dr in dt.Rows)
  117. {
  118. // DEVICE_TYPE,DEVICE_TYPE_NAME,USE_FLAG,SEQ_NO
  119. string temp = dr["DEVICE_TYPE"].ToString();
  120. // 별도로 중복방지하여 출력타입명만 가져온다 (문구가 틀릴수도 있다)
  121. if (DeviceTypeNames.Contains(temp) == false)
  122. DeviceTypeNames.Add(temp);
  123. }
  124. if (ReceiverDeviceTypeNames.ContainsKey(id) == false)
  125. ReceiverDeviceTypeNames.Add(id, dt);
  126. }
  127. // 컬럼값을 폼생성자에서 추가하였으므로 데이터, 즉 행을 추가하면 된다
  128. // 컬럼아이디, 데이타
  129. // 0 : 출력 타입, 1 ~ 16 : 수신기1
  130. foreach (string DeviceTypeName in DeviceTypeNames)
  131. {
  132. // 한행당 수신기개수 + 1 의 개수값이 존재한다
  133. string[] data = new string[ReceiverDeviceTypeNames.Count + 1];
  134. //
  135. // cyim 2017.01.03 : 연동기능 보완 - 기존코드로는 중간에 사용안하는 수신기가 있다면 대응불가이다
  136. //
  137. int i = 0;
  138. // 수신기
  139. foreach (string id in _Data.Hash_Receiver_keys)
  140. {
  141. DataTable dt = (DataTable)ReceiverDeviceTypeNames[id];
  142. DataRow[] result = dt.Select(string.Format("DEVICE_TYPE='{0}'", DeviceTypeName));
  143. // 하단은 수신기 별 데이터
  144. if (result.Length != 0)
  145. {
  146. // 출력타입
  147. data[0] = result[0]["DEVICE_TYPE_NAME"].ToString();
  148. string use_flag = result[0]["USE_FLAG"].ToString();
  149. string seq_no = result[0]["SEQ_NO"].ToString();
  150. string device_type = result[0]["DEVICE_TYPE"].ToString();
  151. i++;
  152. if (device_type == "OA") // 주경종
  153. {
  154. data[i] = (use_flag == "Y") ? "O" : "X";
  155. }
  156. else if (seq_no != "0")
  157. {
  158. data[i] = (use_flag == "Y") ? "O" : "X";
  159. }
  160. else
  161. data[i] = ""; // data[i] = "-"; // (- 표시는 해당 수신기에는 항목이 없다는 뜻)
  162. }
  163. }
  164. // 데이터가 있는 경우에만 표시
  165. int Cnt = 0;
  166. foreach (string id in _Data.Hash_Receiver_keys)
  167. {
  168. if (data[i] == null || data[i].Length == 0)
  169. {
  170. Cnt++;
  171. }
  172. }
  173. // 데이타그리드뷰 표시 (모두 널값이면 표시하지 않는다)
  174. if (Cnt != ReceiverDeviceTypeNames.Count)
  175. {
  176. this.dataGridView_Main.Rows.Add(data);
  177. }
  178. }
  179. }
  180. //
  181. // 타이머 (5초)
  182. //
  183. public void FireDesk_Operation_Timer_Tick(object sender, EventArgs e)
  184. {
  185. // cyim 2015.8.3 수신반 연동기능 추가
  186. // 데이터를 갱신하는 것은 사용자가 설비연동과 관련된 액션을 취할때 이벤트를 발생시켜서
  187. // 처리하고 하였지만, 데이타베이스를 5초마다 갱신하는것으로 일단 연동상태 조회 기능은 종료한다
  188. GetOeprationCurrentStatus();
  189. }
  190. // 아래는 차후 필요한 소스이므로 삭제 유보 (리스트용)
  191. //// 컬럼값 추가
  192. //this.listView_OperationStatus.Columns.Add("0", "연동타입");
  193. //this.listView_OperationStatus.Columns["0"].Width = 140;
  194. //foreach (string id in _Data.Hash_Receiver_keys)
  195. //{
  196. // this.listView_OperationStatus.Columns.Add(id, "수신기" + id);
  197. // this.listView_OperationStatus.Columns[id].Width = 140;
  198. // this.listView_OperationStatus.Columns[id].TextAlign = HorizontalAlignment.Center;
  199. //}
  200. // 데이터 생성
  201. //string[] data = new string[ReceiverDeviceTypeNames.Count + 1];
  202. //data[0]="a";
  203. // 리스트 추가
  204. //ListViewItem item = new ListViewItem(data);
  205. //item.Font = new System.Drawing.Font("굴림", 12F, System.Drawing.FontStyle.Bold);
  206. //listView_OperationStatus.Items.Add(item);
  207. }
  208. }