123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- using System.Collections;
- namespace FPER
- {
- // cyim 2015.8.3 수신반 연동기능 추가
- // 수신반에서 개별 수신기의 DB 로 부터 현재 연동상태 정보를 가져온다
- // 특이한점은 TB_EVENT_TYPE 과 TB_DEVICE_TYPE 테이블의 경우 수신기 아이디가 필드에 존재하지 않는다
- // 현장기준으로 전체 네트워크 수신기는 동일한 연동을 구성하도록 하고,
- // 지금 연동 상태는 결국 각각 수신기의 DB 를 이용해야 한다.
- // 아래는 참고로 디바이스 타입 약자와 타입명을 정리한것이다, 그리고 실제로 Seq 필드와 UseFlag 필드 예시이다
- //OA 주경종 0 Y
- //OB 지구경종 1 Y
- //OC 비상방송 2 Y
- //OD 시각경보기 0 Y
- //OE 전자사이렌 3 Y
- //OF 프리액션벨브 4 Y
- //OG 알람밸브 0 Y
- //OH 제연댐퍼 5 Y
- //OI 전실급기FAN 6 Y
- //OJ 상가급기댐퍼 7 Y
- //OK 상가배기댐퍼 8 Y
- //OL 상가급기FAN 9 Y
- //OM 상가배기FAN 10 Y
- //ON 방화샷다 11 Y
- //OO 방화문 12 Y
- //OP 자동폐쇄장치 13 Y
- //OQ 소화전기동램프 0 Y
- //OR 옥상개폐장치 14 Y
- //OS 자동문 0 Y
- //OT 배연창 15 Y
- //OU 유도등 16 Y
- //OZ 출력기타 0 Y
- public partial class FireDesk_Operation : Form
- {
- // 타이머
- public _Timer_WindowBase Timer_WindowBase_FireDesk_Operation = new _Timer_WindowBase();
- // 생성자
- public FireDesk_Operation()
- {
- InitializeComponent();
- //
- // 이벤트
- //
- // 폼닫기 이벤트 핸들러 등록
- this.FormClosing += new FormClosingEventHandler(FireDesk_Operation_FormClosing);
- //
- // UI
- //
- // 데이타그리드뷰 셋팅
- this.dataGridView_Main.Dock = DockStyle.Fill;
- this.dataGridView_Main.RowHeadersVisible = false; // 열의 첫번째 헤더는 필요 없다
- this.dataGridView_Main.AllowUserToAddRows = false;// 마지막에 행이 추가될 필요가 없다
- this.dataGridView_Main.Font = new System.Drawing.Font("굴림", 11F, System.Drawing.FontStyle.Bold);
- this.dataGridView_Main.Columns.Add("0", "연동타입");
- //this.dataGridView_Main.Columns[0].Width = 100;
- foreach (string id in _Data.Hash_Receiver_keys)
- {
- this.dataGridView_Main.Columns.Add(id, "수신기" + id);
- //this.dataGridView_Main.Columns[id].Width = 140;
- this.dataGridView_Main.Columns[id].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
- }
- this.dataGridView_Main.Columns[0].FillWeight = 170;// 채우기 모드에서만 적용
- this.dataGridView_Main.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 데이타 그리드 뷰의 채우기 모드
- this.dataGridView_Main.ScrollBars = ScrollBars.Both;
- // this 셋팅
- // 팝업창은 수신기의 개수에 의해 가로 사이즈가 결정된다
- this.Width = 170 + _Data.Hash_Receiver_keys.Length * 100;
- this.StartPosition = FormStartPosition.CenterScreen;
- this.TopMost = true;
- //
- // 타이머
- //
- Timer_WindowBase_FireDesk_Operation.Create("FireDesk_Operation_Timer", 5000, FireDesk_Operation_Timer_Tick, true);
- //
- // 기타
- //
- // 활성화
- _Data.FireDesk_Operation_Enable = true;
- // 값을 가져온다
- GetOeprationCurrentStatus();
- }
- // 소멸자
- public void FireDesk_Operation_FormClosing(object sender, FormClosingEventArgs e)
- {
- // 숨김
- this.Hide();
- // 비활성화
- _Data.FireDesk_Operation_Enable = false;
- // 타이머 해제
- Timer_WindowBase_FireDesk_Operation.Delete("FireDesk_Operation_Timer");
- }
- // 리스트뷰에 데이타값 반영
- public void GetOeprationCurrentStatus()
- {
- this.dataGridView_Main.Rows.Clear();
- // 행의 기준
- ArrayList DeviceTypeNames = new ArrayList();
- // 컬럼(열)은 수신기별로 생성하였다
- // 데이터 (행) 의 값은 출력타입으로서 데이타베이스를 기초로 해서 읽어들여야한다
- // 이때는, DB 를 양쪽에서 전부 읽고 OR 조건으로 컬럼값을 추출한다
- // 중복을 제거하고 준비하면 되겠다. 중요한 점은 네트워크 수신기의 경우 분명 동일한 출력타입을 모두 가지고 있다는 점이다.
- // 어차피 소방 설정 프로그램의 엑셀 Import 포맷의 경우 코드 시트가 1개뿐이므로 그렇게 예상할 수 있다
- Hashtable ReceiverDeviceTypeNames = new Hashtable();
- // 연동구성표를 위한 기초 데이터 수집
- foreach (string id in _Data.Hash_Receiver_keys)
- {
- // 테이블값을 통째로 해쉬테이블에 대입
- _DacFireDesk DacFireDesk = new _DacFireDesk(id);
- DataTable dt = DacFireDesk.TB_DEVICE_TYPE_From_SelectAll();
- foreach (DataRow dr in dt.Rows)
- {
- // DEVICE_TYPE,DEVICE_TYPE_NAME,USE_FLAG,SEQ_NO
- string temp = dr["DEVICE_TYPE"].ToString();
- // 별도로 중복방지하여 출력타입명만 가져온다 (문구가 틀릴수도 있다)
- if (DeviceTypeNames.Contains(temp) == false)
- DeviceTypeNames.Add(temp);
- }
- if (ReceiverDeviceTypeNames.ContainsKey(id) == false)
- ReceiverDeviceTypeNames.Add(id, dt);
- }
- // 컬럼값을 폼생성자에서 추가하였으므로 데이터, 즉 행을 추가하면 된다
- // 컬럼아이디, 데이타
- // 0 : 출력 타입, 1 ~ 16 : 수신기1
- foreach (string DeviceTypeName in DeviceTypeNames)
- {
- // 한행당 수신기개수 + 1 의 개수값이 존재한다
- string[] data = new string[ReceiverDeviceTypeNames.Count + 1];
- //
- // cyim 2017.01.03 : 연동기능 보완 - 기존코드로는 중간에 사용안하는 수신기가 있다면 대응불가이다
- //
- int i = 0;
- // 수신기
- foreach (string id in _Data.Hash_Receiver_keys)
- {
- DataTable dt = (DataTable)ReceiverDeviceTypeNames[id];
- DataRow[] result = dt.Select(string.Format("DEVICE_TYPE='{0}'", DeviceTypeName));
- // 하단은 수신기 별 데이터
- if (result.Length != 0)
- {
- // 출력타입
- data[0] = result[0]["DEVICE_TYPE_NAME"].ToString();
- string use_flag = result[0]["USE_FLAG"].ToString();
- string seq_no = result[0]["SEQ_NO"].ToString();
- string device_type = result[0]["DEVICE_TYPE"].ToString();
- i++;
- if (device_type == "OA") // 주경종
- {
- data[i] = (use_flag == "Y") ? "O" : "X";
- }
- else if (seq_no != "0")
- {
- data[i] = (use_flag == "Y") ? "O" : "X";
- }
- else
- data[i] = ""; // data[i] = "-"; // (- 표시는 해당 수신기에는 항목이 없다는 뜻)
- }
- }
- // 데이터가 있는 경우에만 표시
- int Cnt = 0;
- foreach (string id in _Data.Hash_Receiver_keys)
- {
- if (data[i] == null || data[i].Length == 0)
- {
- Cnt++;
- }
- }
- // 데이타그리드뷰 표시 (모두 널값이면 표시하지 않는다)
- if (Cnt != ReceiverDeviceTypeNames.Count)
- {
- this.dataGridView_Main.Rows.Add(data);
- }
- }
- }
- //
- // 타이머 (5초)
- //
- public void FireDesk_Operation_Timer_Tick(object sender, EventArgs e)
- {
- // cyim 2015.8.3 수신반 연동기능 추가
- // 데이터를 갱신하는 것은 사용자가 설비연동과 관련된 액션을 취할때 이벤트를 발생시켜서
- // 처리하고 하였지만, 데이타베이스를 5초마다 갱신하는것으로 일단 연동상태 조회 기능은 종료한다
- GetOeprationCurrentStatus();
- }
- // 아래는 차후 필요한 소스이므로 삭제 유보 (리스트용)
- //// 컬럼값 추가
- //this.listView_OperationStatus.Columns.Add("0", "연동타입");
- //this.listView_OperationStatus.Columns["0"].Width = 140;
- //foreach (string id in _Data.Hash_Receiver_keys)
- //{
- // this.listView_OperationStatus.Columns.Add(id, "수신기" + id);
- // this.listView_OperationStatus.Columns[id].Width = 140;
- // this.listView_OperationStatus.Columns[id].TextAlign = HorizontalAlignment.Center;
- //}
- // 데이터 생성
- //string[] data = new string[ReceiverDeviceTypeNames.Count + 1];
- //data[0]="a";
- // 리스트 추가
- //ListViewItem item = new ListViewItem(data);
- //item.Font = new System.Drawing.Font("굴림", 12F, System.Drawing.FontStyle.Bold);
- //listView_OperationStatus.Items.Add(item);
- }
- }
|