浏览代码

first commit 20250123

HANTE 7 月之前
当前提交
c02778b69f
共有 100 个文件被更改,包括 26816 次插入0 次删除
  1. 75 0
      .gitignore
  2. 277 0
      COMMON/AcesPlayer/FrmCamViewF.cpp
  3. 118 0
      COMMON/AcesPlayer/FrmCamViewF.dfm
  4. 75 0
      COMMON/AcesPlayer/FrmCamViewF.h
  5. 617 0
      COMMON/CDS/CDSAtrdF.cpp
  6. 123 0
      COMMON/CDS/CDSAtrdF.h
  7. 23 0
      COMMON/CDS/CDSBaseF.cpp
  8. 30 0
      COMMON/CDS/CDSBaseF.h
  9. 274 0
      COMMON/CDS/CDSCodeF.cpp
  10. 111 0
      COMMON/CDS/CDSCodeF.h
  11. 123 0
      COMMON/CDS/CDSColSysF.cpp
  12. 66 0
      COMMON/CDS/CDSColSysF.h
  13. 128 0
      COMMON/CDS/CDSColtSysF.cpp
  14. 62 0
      COMMON/CDS/CDSColtSysF.h
  15. 143 0
      COMMON/CDS/CDSCompanyF.cpp
  16. 76 0
      COMMON/CDS/CDSCompanyF.h
  17. 22 0
      COMMON/CDS/CDSCoordF.cpp
  18. 43 0
      COMMON/CDS/CDSCoordF.h
  19. 107 0
      COMMON/CDS/CDSDatabaseF.cpp
  20. 56 0
      COMMON/CDS/CDSDatabaseF.h
  21. 167 0
      COMMON/CDS/CDSEventF.cpp
  22. 79 0
      COMMON/CDS/CDSEventF.h
  23. 311 0
      COMMON/CDS/CDSFacilityCodeF.cpp
  24. 107 0
      COMMON/CDS/CDSFacilityCodeF.h
  25. 2616 0
      COMMON/CDS/CDSFacilityF.cpp
  26. 607 0
      COMMON/CDS/CDSFacilityF.h
  27. 2275 0
      COMMON/CDS/CDSFacilityF_back.cpp
  28. 581 0
      COMMON/CDS/CDSFacilityF_back.h
  29. 399 0
      COMMON/CDS/CDSFacilityFailF.cpp
  30. 128 0
      COMMON/CDS/CDSFacilityFailF.h
  31. 113 0
      COMMON/CDS/CDSHolidayF.cpp
  32. 62 0
      COMMON/CDS/CDSHolidayF.h
  33. 424 0
      COMMON/CDS/CDSIfscF.cpp
  34. 87 0
      COMMON/CDS/CDSIfscF.h
  35. 218 0
      COMMON/CDS/CDSIfsc_VMSF.cpp
  36. 69 0
      COMMON/CDS/CDSIfsc_VMSF.h
  37. 1089 0
      COMMON/CDS/CDSIncidentF.cpp
  38. 359 0
      COMMON/CDS/CDSIncidentF.h
  39. 396 0
      COMMON/CDS/CDSLinkF.cpp
  40. 97 0
      COMMON/CDS/CDSLinkF.h
  41. 320 0
      COMMON/CDS/CDSNodeF.cpp
  42. 145 0
      COMMON/CDS/CDSNodeF.h
  43. 481 0
      COMMON/CDS/CDSObjectF.cpp
  44. 102 0
      COMMON/CDS/CDSObjectF.h
  45. 137 0
      COMMON/CDS/CDSOrganF.cpp
  46. 69 0
      COMMON/CDS/CDSOrganF.h
  47. 650 0
      COMMON/CDS/CDSParkingF.cpp
  48. 116 0
      COMMON/CDS/CDSParkingF.h
  49. 429 0
      COMMON/CDS/CDSPrcsParamF.cpp
  50. 95 0
      COMMON/CDS/CDSPrcsParamF.h
  51. 229 0
      COMMON/CDS/CDSProcessF.cpp
  52. 87 0
      COMMON/CDS/CDSProcessF.h
  53. 357 0
      COMMON/CDS/CDSRepeatCongestF.cpp
  54. 150 0
      COMMON/CDS/CDSRepeatCongestF.h
  55. 427 0
      COMMON/CDS/CDSRoadF.cpp
  56. 81 0
      COMMON/CDS/CDSRoadF.h
  57. 497 0
      COMMON/CDS/CDSServiceLinkF.cpp
  58. 182 0
      COMMON/CDS/CDSServiceLinkF.h
  59. 63 0
      COMMON/CDS/CDSStaIncidentF.cpp
  60. 62 0
      COMMON/CDS/CDSStaIncidentF.h
  61. 219 0
      COMMON/CDS/CDSTrafficF.cpp
  62. 95 0
      COMMON/CDS/CDSTrafficF.h
  63. 287 0
      COMMON/CDS/CDSTrafficGradeF.cpp
  64. 108 0
      COMMON/CDS/CDSTrafficGradeF.h
  65. 297 0
      COMMON/CDS/CDSTrafficOprLinkF.cpp
  66. 112 0
      COMMON/CDS/CDSTrafficOprLinkF.h
  67. 173 0
      COMMON/CDS/CDSUserF.cpp
  68. 77 0
      COMMON/CDS/CDSUserF.h
  69. 372 0
      COMMON/CDS/CDSUtisF.cpp
  70. 82 0
      COMMON/CDS/CDSUtisF.h
  71. 583 0
      COMMON/CDS/CDSVilgFrcsF.cpp
  72. 224 0
      COMMON/CDS/CDSVilgFrcsF.h
  73. 1639 0
      COMMON/CDS/CDSVmsCtlrF.cpp
  74. 283 0
      COMMON/CDS/CDSVmsCtlrF.h
  75. 688 0
      COMMON/CDS/CDSVmsIfscF.cpp
  76. 112 0
      COMMON/CDS/CDSVmsIfscF.h
  77. 149 0
      COMMON/CDS/CDSVmsObjTypeF.cpp
  78. 98 0
      COMMON/CDS/CDSVmsObjTypeF.h
  79. 122 0
      COMMON/CDS/CDSVmsTrafficF.cpp
  80. 64 0
      COMMON/CDS/CDSVmsTrafficF.h
  81. 129 0
      COMMON/CDS/CDSWebUserF.cpp
  82. 72 0
      COMMON/CDS/CDSWebUserF.h
  83. 378 0
      COMMON/CDS/LibSTLF.hpp
  84. 48 0
      COMMON/DM/DBDbF.cpp
  85. 7 0
      COMMON/DM/DBDbF.dfm
  86. 35 0
      COMMON/DM/DBDbF.h
  87. 392 0
      COMMON/DM/DMDbF.cpp
  88. 7 0
      COMMON/DM/DMDbF.dfm
  89. 54 0
      COMMON/DM/DMDbF.h
  90. 80 0
      COMMON/DataTypesF.h
  91. 49 0
      COMMON/Flash--/CommFlashF.cpp
  92. 49 0
      COMMON/Flash--/CommFlashF.h
  93. 124 0
      COMMON/JavaScript/UJSExec.pas
  94. 298 0
      COMMON/Lib/CommLogF.cpp
  95. 91 0
      COMMON/Lib/CommLogF.h
  96. 91 0
      COMMON/WindowMsgF.h
  97. 780 0
      COMMON/XiMapUtilF.cpp
  98. 57 0
      COMMON/XiMapUtilF.h
  99. 338 0
      COMMON/XnsWebCamera--/XnsCommon.h
  100. 541 0
      COMMON/XnsWebCamera--/XnsDeviceInterface.h

+ 75 - 0
.gitignore

@@ -0,0 +1,75 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### DUMMY ###
+*.lib
+*.exe
+*.dll
+*.zip
+*.bak
+*.~*
+*.log
+*.obj
+*.cgl
+*.ilc
+*.ild
+*.ilf
+*.ils
+*.tds
+*.pch
+*.map
+*.#*
+*.tds
+twfiles.@@@
+*.twfd
+*.twopts
+*.local
+*.skincfg
+TMP*.$$$
+*.zip
+
+### LOG ###
+/logs/
+/images/
+/fonts/
+/REAL-RUN/
+/ftp/
+/RUN/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+*.jar
+*.exe
+
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+*.exe
+*.jar
+*.run

+ 277 - 0
COMMON/AcesPlayer/FrmCamViewF.cpp

@@ -0,0 +1,277 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "FrmCamViewF.h"
+#include "FrmCctvMonitoringF.h"
+#include "AppGlobalF.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma link "AcesTechXPlayer2Lib_OCX"
+#pragma link "cxContainer"
+#pragma link "cxControls"
+#pragma link "cxEdit"
+#pragma link "cxGraphics"
+#pragma link "cxLabel"
+#pragma link "cxLookAndFeelPainters"
+#pragma link "cxLookAndFeels"
+#pragma resource "*.dfm"
+TFrmCamera *FrmCamera = NULL;
+//---------------------------------------------------------------------------
+__fastcall TFrmCamera::TFrmCamera(TComponent* Owner)
+    : TForm(Owner)
+{
+    FPlay = false;
+    FAutoPlay = true;
+    FConHandle = 0;
+    FInstalled = false;
+
+    AcesTechXPlayer21->DoubleBuffered = true;
+
+    InitCamera(NULL, FAutoPlay);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::MnuConnectClick(TObject *Sender)
+{
+    FAutoPlay = true;
+    Connect();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::MnuDisconnectClick(TObject *Sender)
+{
+    FAutoPlay = false;
+    Disconnect();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::MnuReleaseClick(TObject *Sender)
+{
+    CameraRelease();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::Connect()
+{
+    Disconnect();
+
+    if (FId.IsEmpty()) return;
+    if (FViewAddress.IsEmpty()) return;
+
+    PnlCamera->Caption = "¿¬°áÁß...";
+    AcesTechXPlayer21->Visible = true;
+
+    try
+    {
+Log(FTitle + "  " + FName + "  Connect");
+        AcesTechXPlayer21->URL = FViewAddress;
+        FConHandle = AcesTechXPlayer21->ConnectAsync();
+Log(FTitle + "  " + FName + "  Handle: " + String(FConHandle));
+    }
+    catch(...)
+    {
+    }
+    FPlay = true;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::Disconnect()
+{
+    if (!FPlay) return;
+
+    try
+    {
+        //if (FConHandle)
+        {
+Log(FTitle + "  " + FName + "  Disconnect");
+            AcesTechXPlayer21->Close();
+        }
+        FConHandle = 0;
+    }
+    catch(...)
+    {
+    }
+
+    PnlCamera->Caption = "Disconnected";
+    AcesTechXPlayer21->Visible = false;
+    FConHandle = 0;
+    FPlay = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::CameraRelease()
+{
+    Disconnect();
+    InitCamera(NULL, FAutoPlay);
+
+    PnlCamera->Caption = "";
+    AcesTechXPlayer21->Visible = false;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::PnlCameraDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept)
+
+{
+    Accept = true;
+
+    if (!g_Drag.Id.IsEmpty())
+    {
+#if 0
+        int x_gap = Top;
+        int y_gap = Left;
+        FrmMain->StDrag->Top  = (Y-10-FrmMain->StDrag->Height) - y_gap;
+        FrmMain->StDrag->Left = (X) - x_gap;
+
+        if (!FrmMain->StDrag->Visible)
+        {
+            FrmMain->StDrag->Visible = true;
+        }
+#endif
+    }
+    else
+    {
+        Accept = false;
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::PnlCameraDragDrop(TObject *Sender, TObject *Source, int X, int Y)
+{
+    if (!g_Drag.Id.IsEmpty())
+    {
+        FId            = g_Drag.Id;
+        FGroup         = g_Drag.Group;
+        FName          = g_Drag.Name;
+        FStreamingType = g_Drag.StreamingType;
+        FViewAddress   = g_Drag.ViewAddress;
+        FFullAddress   = g_Drag.FullAddress;
+
+        PnlCamera->Caption = "Disconnected";
+        DisplayName(FName);
+
+        FInstalled     = true;
+
+        if (FAutoPlay || FPlay)
+        {
+            Connect();
+        }
+    }
+    g_Drag.Id = "";
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::InitCamera(TXCctv *ACctv, bool AAutoPlay/*=true*/)
+{
+    FAutoPlay = AAutoPlay;
+
+    if (!ACctv)
+    {
+        FId            = "";
+        FGroup         = "";
+        FName          = "";
+        FStreamingType = "";
+        FViewAddress   = "";
+        FFullAddress   = "";
+
+        DisplayName(" ");
+
+        FInstalled     = false;
+    }
+    else
+    {
+        FId            = ACctv->Id;
+        FGroup         = ACctv->Group;
+        FName          = ACctv->Name;
+        FStreamingType = ACctv->StreamingType;
+        FViewAddress   = ACctv->ViewAddress;
+        FFullAddress   = ACctv->FullAddress;
+
+        PnlCamera->Caption = "Disconnected";
+        DisplayName(FName);
+
+        FInstalled     = true;
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::DisplayName(String AName)
+{
+    LblName->Visible = false;
+    LblName->Caption = FName;
+    LblName->Transparent = false;
+    LblName->Transparent = true;
+    LblName->Visible = true;
+    LblName->Refresh();
+    LblName->BringToFront();
+
+    //::SetWindowLong(LblName->Handle, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_TRANSPARENT);
+    //::SetLayeredWindowAttributes(LblName->Handle, 0, 80, LWA_ALPHA);
+//  long            __fastcall DrawText(BSTR text, long x, long y, BSTR fontname, long fontsize,
+//                                      long underline, long fontcolor, long bordercolor, long bkcolor);
+//    AcesTechXPlayer21->DrawTextW(AName.c_str(), 10, 10, L"¸¼Àº °íµñ", 10, 0, 0, 0, 0);
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::UpdateCctvMasterInfo()
+{
+    if (!FInstalled) return;
+
+    TXCctv *pCctv = XCctvManager->FLists.Find(FId);
+    if (pCctv)
+    {
+        if (pCctv->EditMode == DB_DELETE ||
+            pCctv->DEL_YN   == "Y")
+        {
+            CameraRelease();
+            return;
+        }
+        bool bReconnect = false;
+        if (FViewAddress != pCctv->ViewAddress ||
+            FFullAddress != pCctv->FullAddress)
+        {
+            bReconnect = true;
+        }
+        InitCamera(pCctv, FAutoPlay);
+        if (bReconnect)
+        {
+            if (FPlay)
+            {
+                Connect();
+            }
+        }
+    }
+    else
+    {
+        CameraRelease();
+    }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::TmrPlayTimer(TObject *Sender)
+{
+    TmrStop->Enabled = false;
+    TmrPlay->Enabled = false;
+    Connect();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::TmrStopTimer(TObject *Sender)
+{
+    TmrPlay->Enabled = false;
+    TmrStop->Enabled = false;
+    Disconnect();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TFrmCamera::LblNameClick(TObject *Sender)
+{
+return;
+LblName->Parent = AcesTechXPlayer21;
+LblName->Transparent = false;
+LblName->Transparent = true;
+//AcesTechXPlayer21->Visible = !AcesTechXPlayer21->Visible;
+}
+//---------------------------------------------------------------------------
+

+ 118 - 0
COMMON/AcesPlayer/FrmCamViewF.dfm

@@ -0,0 +1,118 @@
+object FrmCamera: TFrmCamera
+  Left = 0
+  Top = 0
+  Align = alCustom
+  BorderIcons = []
+  BorderStyle = bsNone
+  Caption = 'FrmCamera'
+  ClientHeight = 212
+  ClientWidth = 380
+  Color = clSilver
+  DragMode = dmAutomatic
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = #47569#51008' '#44256#46357
+  Font.Style = []
+  OldCreateOrder = False
+  PopupMenu = PopupMenu1
+  Position = poDesigned
+  DesignSize = (
+    380
+    212)
+  PixelsPerInch = 96
+  TextHeight = 15
+  object PnlCamera: TPanel
+    Left = 1
+    Top = 0
+    Width = 379
+    Height = 211
+    Anchors = [akLeft, akTop, akRight, akBottom]
+    BevelOuter = bvNone
+    Color = clBlack
+    Font.Charset = DEFAULT_CHARSET
+    Font.Color = clWhite
+    Font.Height = -12
+    Font.Name = #47569#51008' '#44256#46357
+    Font.Style = [fsBold]
+    ParentBackground = False
+    ParentFont = False
+    PopupMenu = PopupMenu1
+    TabOrder = 0
+    OnDragDrop = PnlCameraDragDrop
+    OnDragOver = PnlCameraDragOver
+    object AcesTechXPlayer21: TAcesTechXPlayer2
+      Left = 0
+      Top = 0
+      Width = 379
+      Height = 211
+      ParentCustomHint = False
+      Align = alClient
+      TabOrder = 0
+      Visible = False
+      OnDragDrop = PnlCameraDragDrop
+      OnDragOver = PnlCameraDragOver
+      ExplicitTop = -16
+      ControlData = {000001002C270000CF15000000000000}
+    end
+  end
+  object LblName: TcxLabel
+    Left = 5
+    Top = 5
+    ParentCustomHint = False
+    Caption = #52852#47700#46972' '#47749#52845
+    ParentColor = False
+    ParentFont = False
+    ParentShowHint = False
+    ShowHint = False
+    Style.Font.Charset = DEFAULT_CHARSET
+    Style.Font.Color = clWhite
+    Style.Font.Height = -13
+    Style.Font.Name = #47569#51008' '#44256#46357
+    Style.Font.Style = [fsBold]
+    Style.LookAndFeel.NativeStyle = False
+    Style.TransparentBorder = False
+    Style.IsFontAssigned = True
+    StyleDisabled.LookAndFeel.NativeStyle = False
+    StyleFocused.LookAndFeel.NativeStyle = False
+    StyleHot.LookAndFeel.NativeStyle = False
+    Properties.Alignment.Vert = taVCenter
+    Transparent = True
+    OnClick = LblNameClick
+    AnchorY = 14
+  end
+  object PopupMenu1: TPopupMenu
+    AutoHotkeys = maManual
+    Left = 108
+    Top = 124
+    object MnuConnect: TMenuItem
+      Caption = #50672#44208
+      OnClick = MnuConnectClick
+    end
+    object MnuDisconnect: TMenuItem
+      Caption = #50672#44208#54644#51228
+      OnClick = MnuDisconnectClick
+    end
+    object N2: TMenuItem
+      Caption = '-'
+    end
+    object MnuRelease: TMenuItem
+      Caption = #54624#45817#54644#51228
+      OnClick = MnuReleaseClick
+    end
+  end
+  object TmrPlay: TTimer
+    Enabled = False
+    Interval = 500
+    OnTimer = TmrPlayTimer
+    Left = 136
+    Top = 104
+  end
+  object TmrStop: TTimer
+    Enabled = False
+    Interval = 500
+    OnTimer = TmrStopTimer
+    Left = 232
+    Top = 152
+  end
+end

+ 75 - 0
COMMON/AcesPlayer/FrmCamViewF.h

@@ -0,0 +1,75 @@
+//---------------------------------------------------------------------------
+
+#ifndef FrmCamViewFH
+#define FrmCamViewFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+//---------------------------------------------------------------------------
+#include "CDSCctvF.h"
+#include <ExtCtrls.hpp>
+#include "AcesTechXPlayer2Lib_OCX.h"
+#include <OleCtrls.hpp>
+#include <Menus.hpp>
+#include "cxContainer.hpp"
+#include "cxControls.hpp"
+#include "cxEdit.hpp"
+#include "cxGraphics.hpp"
+#include "cxLabel.hpp"
+#include "cxLookAndFeelPainters.hpp"
+#include "cxLookAndFeels.hpp"
+//---------------------------------------------------------------------------
+class TFrmCamera : public TForm
+{
+__published:	// IDE-managed Components
+    TPanel *PnlCamera;
+    TPopupMenu *PopupMenu1;
+    TMenuItem *MnuConnect;
+    TMenuItem *MnuDisconnect;
+    TMenuItem *MnuRelease;
+    TMenuItem *N2;
+    TAcesTechXPlayer2 *AcesTechXPlayer21;
+    TcxLabel *LblName;
+    TTimer *TmrPlay;
+    TTimer *TmrStop;
+    void __fastcall MnuConnectClick(TObject *Sender);
+    void __fastcall MnuDisconnectClick(TObject *Sender);
+    void __fastcall MnuReleaseClick(TObject *Sender);
+    void __fastcall PnlCameraDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept);
+    void __fastcall PnlCameraDragDrop(TObject *Sender, TObject *Source, int X, int Y);
+    void __fastcall TmrPlayTimer(TObject *Sender);
+    void __fastcall TmrStopTimer(TObject *Sender);
+    void __fastcall LblNameClick(TObject *Sender);
+
+private:	// User declarations
+public:		// User declarations
+    __fastcall TFrmCamera(TComponent* Owner);
+
+    String  FTitle;
+    bool    FAutoPlay;
+    bool    FPlay;
+    long    FConHandle;
+
+    bool    FInstalled;
+    String  FId;
+    String  FGroup;
+    String  FName;
+    String  FStreamingType;
+    String  FViewAddress;
+    String  FFullAddress;
+
+    void __fastcall InitCamera(TXCctv *ACctv, bool AAutoPlay=true);
+    void __fastcall DisplayName(String AName);
+    void __fastcall UpdateCctvMasterInfo();
+
+    void __fastcall Connect();
+    void __fastcall Disconnect();
+    void __fastcall CameraRelease();
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TFrmCamera *FrmCamera;
+//---------------------------------------------------------------------------
+#endif
+

+ 617 - 0
COMMON/CDS/CDSAtrdF.cpp

@@ -0,0 +1,617 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSAtrdF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsAtrdRoad::TItsAtrdRoad()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+    //Clear();
+}
+//---------------------------------------------------------------------------
+void TItsAtrdRoad::Clear()
+{
+    ATRD_ID  = "";
+    ROAD_ID  = "";
+    ORD      = 0;
+    MEM_DEL  = "";
+}
+//---------------------------------------------------------------------------
+TItsAtrdRoad::~TItsAtrdRoad()
+{
+}
+//---------------------------------------------------------------------------
+
+TItsAtrd::TItsAtrd()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+
+    LENGTH = 0;
+    //Clear();
+}
+//---------------------------------------------------------------------------
+void TItsAtrd::Clear()
+{
+    ATRD_ID = "";
+    ATRD_NM = "";
+    DRCT_CD = "";
+    AREA_CD = "";
+    DEL_YN  = "";
+    MEM_DEL = "";
+
+    LENGTH = 0;
+}
+//---------------------------------------------------------------------------
+TItsAtrd::~TItsAtrd()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsAtrdManager *ItsAtrdManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Atrd Manager
+*/
+TItsAtrdManager::TItsAtrdManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsAtrdManager::~TItsAtrdManager()
+{
+    FLists.RemoveAll();
+    FNameLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TItsAtrdManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    LoadFromAtrdDb(ADbConn);
+    LoadFromAtrdRoadDb(ADbConn);
+    return true;
+}
+
+bool TItsAtrdManager::LoadFromAtrdDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT ATRD_ID,                     \r\n"
+           "       TRIM(ATRD_NM) AS ATRD_NM,    \r\n"
+           "       DRCT_CD,                     \r\n"
+           "       TRIM(DRCT_NM) AS DRCT_NM,    \r\n"
+           "       AREA_CD,                     \r\n"
+           "       DEL_YN                       \r\n"
+           "  FROM TB_ATRD                      \r\n";
+           //" WHERE DEL_YN = 'N' \r\n";
+           //" ORDER BY ATRD_ID   \r\n";
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+
+        FNameLists.Lock();
+        FNameLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsAtrd *pObj = new TItsAtrd();
+
+                pObj->ATRD_ID = pADO->FieldByName("ATRD_ID")->AsString;
+                pObj->ATRD_NM = pADO->FieldByName("ATRD_NM")->AsString;
+                pObj->DRCT_CD = pADO->FieldByName("DRCT_CD")->AsString;
+                pObj->DRCT_NM = pADO->FieldByName("DRCT_NM")->AsString;
+                pObj->AREA_CD = pADO->FieldByName("AREA_CD")->AsString;
+                pObj->DEL_YN  = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->LENGTH  = 0;
+
+				FLists.Push(pObj->ATRD_ID, pObj);
+
+                pObj->Completed = true;
+                pObj->MEM_DEL   = "N";
+
+//////////////////////////////////////////////
+                String AtrdName = pObj->ATRD_NM;
+
+                TItsAtrdName *pAtrd = FNameLists.Find(AtrdName);
+                if (pAtrd)
+                {
+                    if (pObj->DRCT_CD.Trim() == "0")
+                    {
+                        pAtrd->UpAtrdNm = pObj->DRCT_NM;
+                        pAtrd->UpAtrdId = pObj->ATRD_ID;
+                        pAtrd->IsUpAtrd = true;
+                    }
+                    else
+                    {
+                        pAtrd->DnAtrdNm = pObj->DRCT_NM;
+                        pAtrd->DnAtrdId = pObj->ATRD_ID;
+                        pAtrd->IsDnAtrd = true;
+                    }
+                }
+                else
+                {
+                    pAtrd = new TItsAtrdName();
+                    pAtrd->Name = AtrdName;
+                    pAtrd->RowNo = FNameLists.Size();
+
+                    if (pObj->DRCT_CD.Trim() == "0")
+                    {
+                        pAtrd->UpAtrdNm = pObj->DRCT_NM;
+                        pAtrd->UpAtrdId = pObj->ATRD_ID;
+                        pAtrd->IsUpAtrd = true;
+                    }
+                    else
+                    {
+                        pAtrd->DnAtrdNm = pObj->DRCT_NM;
+                        pAtrd->DnAtrdId = pObj->ATRD_ID;
+                        pAtrd->IsDnAtrd = true;
+                    }
+                    FNameLists.Push(AtrdName, pAtrd);
+                }
+//////////////////////////////////////////////
+
+
+
+
+
+
+
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::LoadFromAtrdDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::LoadFromAtrdDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+        FNameLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::LoadFromAtrdRoadDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT ATRD_ID,           \r\n"
+           "       ROAD_ID,           \r\n"
+           "       ORD                \r\n"
+           "  FROM TB_ATRD_ROAD_RLTN  \r\n";
+           " ORDER BY ATRD_ID, ORD    \r\n";
+    try
+    {
+        TItsAtrd *pAtrd;
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String ATRD_ID = pADO->FieldByName("ATRD_ID")->AsString;
+                pAtrd = FLists.Find(ATRD_ID);
+                if (!pAtrd) continue;
+
+				TItsAtrdRoad *pObj = new TItsAtrdRoad();
+
+                pObj->ATRD_ID   = ATRD_ID;
+                pObj->ROAD_ID   = pADO->FieldByName("ROAD_ID")->AsString;
+                pObj->ORD       = pADO->FieldByName("ORD")->AsInteger;
+
+				pAtrd->FSubLists.Push(pObj->ORD, pObj);
+
+                pObj->Completed = true;
+                pObj->MEM_DEL   = "N";
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::LoadFromAtrdRoadDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::LoadFromAtrdRoadDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::LoadAtrdLength(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.ATRD_ID, SUM(B.SECT_LNGT) AS ATRD_LNGT  \r\n"
+           "  FROM TB_ATRD_ROAD_RLTN A, TB_ROAD B            \r\n"
+           " WHERE A.ROAD_ID = B.ROAD_ID                     \r\n"
+           " GROUP BY A.ATRD_ID                              \r\n";
+
+    try
+    {
+        TItsAtrd *pAtrd;
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String ATRD_ID = pADO->FieldByName("ATRD_ID")->AsString;
+                pAtrd = FLists.Find(ATRD_ID);
+                if (!pAtrd) continue;
+
+                pAtrd->LENGTH = pADO->FieldByName("ATRD_LNGT")->AsInteger;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::LoadAtrdLength", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::LoadAtrdLength", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::DeleteAtrdRoad(TItsAtrd *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "DELETE TB_ATRD_ROAD_RLTN  \r\n"
+           " WHERE ATRD_ID = :p01     \r\n";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->ATRD_ID;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::DeleteAtrdRoad", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::DeleteAtrdRoad", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::DeleteAtrd(TItsAtrd *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_ATRD        \r\n"
+           "   SET DEL_YN = 'Y'   \r\n"
+           " WHERE ATRD_ID = :p01 \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->ATRD_ID;
+			pADO->ExecSQL();
+
+            DeleteAtrdRoad(AObj, ADbConn);
+            
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::DeleteAtrd", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::DeleteAtrd", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::InsertAtrdRoad(TItsAtrd *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    //¸µÅ©±¸¼ºÁ¤º¸ ÀÔ·Â
+    sQry = "INSERT INTO TB_ATRD_ROAD_RLTN (ATRD_ID, ROAD_ID, ORD ) \r\n"
+           "                       VALUES (:p01,    :p02,    :p03) \r\n";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            FOR_STL(TItsAtrdRoad *, pObj, AObj->FSubLists)
+            {
+                pADO->Parameters->ParamByName("p01")->Value = AObj->ATRD_ID;
+                pADO->Parameters->ParamByName("p02")->Value = pObj->ROAD_ID;
+                pADO->Parameters->ParamByName("p03")->Value = pObj->ORD;
+                pADO->ExecSQL();
+            }
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::InsertAtrdRoad", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::InsertAtrdRoad", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::UpdateAtrd(TItsAtrd *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+
+    sQry = "UPDATE TB_ATRD          \r\n"
+           "   SET ATRD_NM  = :p02, \r\n"
+           "       DRCT_CD  = :p03, \r\n"
+           "       AREA_CD  = :p04, \r\n"
+           "       DEL_YN   = :p05, \r\n"
+           "       DRCT_NM  = :p06  \r\n"
+           " WHERE ATRD_ID  = :p01  \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Parameters->ParamByName("p01")->Value = AObj->ATRD_ID;
+			pADO->Parameters->ParamByName("p02")->Value = AObj->ATRD_NM;
+			pADO->Parameters->ParamByName("p03")->Value = AObj->DRCT_CD;
+			pADO->Parameters->ParamByName("p04")->Value = AObj->AREA_CD;
+			pADO->Parameters->ParamByName("p05")->Value = AObj->DEL_YN;
+			pADO->Parameters->ParamByName("p06")->Value = AObj->DRCT_NM;
+
+			pADO->ExecSQL();
+
+            DeleteAtrdRoad(AObj, ADbConn);
+            InsertAtrdRoad(AObj, ADbConn);
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::UpdateAtrd", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::UpdateAtrd", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::InsertAtrd(TItsAtrd *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "INSERT INTO TB_ATRD(ATRD_ID, ATRD_NM, DRCT_CD, AREA_CD, DEL_YN, DRCT_CD) \r\n"
+           "             VALUES(:p01,    :p02,    :p03,    :p04,    :p05,   :p06)    \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Parameters->ParamByName("p01")->Value = AObj->ATRD_ID;
+			pADO->Parameters->ParamByName("p02")->Value = AObj->ATRD_NM;
+			pADO->Parameters->ParamByName("p03")->Value = AObj->DRCT_CD;
+			pADO->Parameters->ParamByName("p04")->Value = AObj->AREA_CD;
+			pADO->Parameters->ParamByName("p05")->Value = AObj->DEL_YN;
+			pADO->Parameters->ParamByName("p06")->Value = AObj->DRCT_CD;
+
+			pADO->ExecSQL();
+
+            DeleteAtrdRoad(AObj, ADbConn);
+            InsertAtrdRoad(AObj, ADbConn);
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::InsertAtrd", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::InsertAtrd", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+

+ 123 - 0
COMMON/CDS/CDSAtrdF.h

@@ -0,0 +1,123 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSAtrdFH
+#define CDSAtrdFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+
+/*
+*  TItsAtrdRoad class
+*/
+class TItsAtrdRoad
+{
+public:
+    TItsAtrdRoad();
+    virtual ~TItsAtrdRoad();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+
+    String ATRD_ID;     //VARCHAR2(10)	N			간선도로 ID
+    String ROAD_ID;     //NUMBER(10)	N			도로 ID
+    int    ORD;         //NUMBER(3)	Y	0		순서
+    String MEM_DEL;
+
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Atrd class
+*/
+class TItsAtrd
+{
+public:
+    TItsAtrd();
+    virtual ~TItsAtrd();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+
+    String ATRD_ID;     //VARCHAR2(10)	N			간선도로 ID
+    String ATRD_NM;     //VARCHAR2(30)	Y			간선도로 명
+    String DRCT_CD;     //VARCHAR2(7)	Y			방향 코드
+    String AREA_CD;     //VARCHAR2(7)	Y			지역 코드
+    String DEL_YN;      //CHAR(1)	    Y	'N'		삭제 여부
+    String DRCT_NM;     //VARCHAR2(50)	Y			방향 명칭
+    String MEM_DEL;
+
+    int    LENGTH;
+
+    IntMap<TItsAtrdRoad>   FSubLists;
+    
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+class TItsAtrdName
+{
+public:
+    TItsAtrdName() { RowNo = 0; };
+    virtual ~TItsAtrdName() {};
+public:
+    String  Name;
+    int     RowNo;
+    bool    IsUpAtrd;
+    bool    IsDnAtrd;
+    String  UpAtrdId;
+    String  DnAtrdId;
+    String  UpAtrdNm;
+    String  DnAtrdNm;
+};
+
+/*
+* Atrd Manager
+*/
+class TItsAtrdManager
+{
+public:
+    TItsAtrdManager();
+    virtual ~TItsAtrdManager();
+
+public:
+    ListMap<TItsAtrd>       FLists;
+    ListMap<TItsAtrdName>   FNameLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadFromAtrdDb(TADOConnection *ADbConn=NULL);
+    bool LoadFromAtrdRoadDb(TADOConnection *ADbConn=NULL);
+    bool LoadAtrdLength(TADOConnection *ADbConn=NULL);
+
+    bool DeleteAtrdRoad(TItsAtrd *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertAtrdRoad(TItsAtrd *AObj, TADOConnection *ADbConn=NULL);
+    bool DeleteAtrd(TItsAtrd *AObj, TADOConnection *ADbConn=NULL);
+    bool UpdateAtrd(TItsAtrd *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertAtrd(TItsAtrd *AObj, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsAtrdManager *ItsAtrdManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 23 - 0
COMMON/CDS/CDSBaseF.cpp

@@ -0,0 +1,23 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSBaseF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsBaseId::TItsBaseId()
+{
+    FModified = false;
+    FCompleted= false;
+}
+//---------------------------------------------------------------------------
+
+TItsBaseId::~TItsBaseId()
+{
+}
+//---------------------------------------------------------------------------
+

+ 30 - 0
COMMON/CDS/CDSBaseF.h

@@ -0,0 +1,30 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSBaseFH
+#define CDSBaseFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+//---------------------------------------------------------------------------
+
+class TItsBaseId
+{
+public:
+    TItsBaseId();
+    virtual ~TItsBaseId();
+
+private:
+    bool    FModified;
+    bool    FCompleted;
+    String  FID;
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    __property String ID      = {read = FID, write = FID};
+    __property String LINK_ID = {read = FID, write = FID};
+    __property String IFSC_ID = {read = FID, write = FID};
+    __property String ROAD_ID = {read = FID, write = FID};
+};
+
+#endif

+ 274 - 0
COMMON/CDS/CDSCodeF.cpp

@@ -0,0 +1,274 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSCodeF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsSubCode::TItsSubCode()
+{
+    TItsSubCode("", "");
+}
+//---------------------------------------------------------------------------
+TItsSubCode::TItsSubCode(String ACd, String AClsfCd)
+{
+    CMMN_CD      = ACd;
+    CMMN_CLSF_CD = AClsfCd;
+    Clear();
+    FModified = false;
+    FCompleted= false;
+}
+//---------------------------------------------------------------------------
+void TItsSubCode::Clear()
+{
+#if 0
+    CMMN_CD_KOR_NM  = "";
+    CMMN_CD_ENGL_NM = "";
+    CMMN_CD_ABBR    = "";
+    RMRK            = "";
+    ATRB1           = "";
+    ATRB2           = "";
+    USE_YN          = "";
+    FRST_REGR_NMBR  = "";
+    FRST_RGST_DT    = "";
+    LAST_CRPR_NMBR  = "";
+    LAST_CRCT_DT    = "";
+#endif
+}
+//---------------------------------------------------------------------------
+TItsSubCode::~TItsSubCode()
+{
+}
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+TItsCode::TItsCode()
+{
+    TItsCode("");
+}
+//---------------------------------------------------------------------------
+TItsCode::TItsCode(String AClsfCd)
+{
+    CMMN_CLSF_CD = AClsfCd;
+    Clear();
+    FModified = false;
+    FCompleted= false;
+}
+//---------------------------------------------------------------------------
+void TItsCode::Clear()
+{
+#if 0
+    MSG_TYPE_CD       = "";
+    CMMN_CLSF_KOR_NM  = "";
+    CMMN_CLSF_ENGL_NM = "";
+    USE_SYST_CD       = "";
+    RMRK              = "";
+    USE_YN            = "";
+    FRST_REGR_NMBR    = "";
+    FRST_RGST_DT      = "";
+    LAST_CRPR_NMBR    = "";
+    LAST_CRCT_DT      = "";
+#endif
+}
+//---------------------------------------------------------------------------
+TItsCode::~TItsCode()
+{
+    FSubLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsCodeManager *ItsCodeManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Link Manager
+*/
+TItsCodeManager::TItsCodeManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsCodeManager::~TItsCodeManager()
+{
+}
+//---------------------------------------------------------------------------
+bool TItsCodeManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    FLists.RemoveAll();
+
+    return (LoadCode(ADbConn) && LoadSubCode(ADbConn));
+}
+//---------------------------------------------------------------------------
+bool TItsCodeManager::LoadCode(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT CMMN_CLSF_CD      ,          \r\n"
+           "       MSG_TYPE_CD       ,          \r\n"
+           "       CMMN_CLSF_KOR_NM  ,          \r\n"
+           "       CMMN_CLSF_ENGL_NM ,          \r\n"
+           "       USE_SYST_CD       ,          \r\n"
+           "       RMRK              ,          \r\n"
+           "       USE_YN            ,          \r\n"
+           "       FRST_REGR_NMBR    ,          \r\n"
+           "       FRST_RGST_DT      ,          \r\n"
+           "       LAST_CRPR_NMBR    ,          \r\n"
+           "       LAST_CRCT_DT                 \r\n"
+           "  FROM TB_CMMN_CLSF_CD              \r\n"
+           " WHERE USE_YN = 'Y'                 \r\n";
+//           " ORDER BY MSG_TYPE_CD, CMMN_CLSF_CD \r\n";
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsCode *pCode = new TItsCode();
+
+                pCode->CMMN_CLSF_CD      = pADO->FieldByName("CMMN_CLSF_CD")->AsString;        //'공통 분류 코드';
+                pCode->MSG_TYPE_CD       = pADO->FieldByName("MSG_TYPE_CD")->AsString;         //''메시지 유형 코드';
+                pCode->CMMN_CLSF_KOR_NM  = pADO->FieldByName("CMMN_CLSF_KOR_NM")->AsString;    //''공통 분류 한글 명';
+                pCode->CMMN_CLSF_ENGL_NM = pADO->FieldByName("CMMN_CLSF_ENGL_NM")->AsString;   //''공통 분류 영문 명';
+                pCode->USE_SYST_CD       = pADO->FieldByName("USE_SYST_CD")->AsString;         //''사용 시스템 코드';
+                pCode->RMRK              = pADO->FieldByName("RMRK")->AsString;                //''비고';
+                pCode->USE_YN            = pADO->FieldByName("USE_YN")->AsString;              //''사용 여부';
+                pCode->FRST_REGR_NMBR    = pADO->FieldByName("FRST_REGR_NMBR")->AsString;      //''최초 등록자 번호';
+                pCode->FRST_RGST_DT      = pADO->FieldByName("FRST_RGST_DT")->AsString;        //''최초 등록 일시';
+                pCode->LAST_CRPR_NMBR    = pADO->FieldByName("LAST_CRPR_NMBR")->AsString;      //''최종 수정자 번호';
+                pCode->LAST_CRCT_DT      = pADO->FieldByName("LAST_CRCT_DT")->AsString;        //''최종 수정 일시';
+
+				FLists.Push(pCode->CMMN_CLSF_CD, pCode);
+                pCode->Completed = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsCodeManager::LoadCode", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsCodeManager::LoadCode", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsCodeManager::LoadSubCode(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT CMMN_CD         ,        \r\n"
+           "       CMMN_CLSF_CD    ,        \r\n"
+           "       CMMN_CD_KOR_NM  ,        \r\n"
+           "       CMMN_CD_ENGL_NM ,        \r\n"
+           "       CMMN_CD_ABBR    ,        \r\n"
+           "       RMRK            ,        \r\n"
+           "       ATRB1           ,        \r\n"
+           "       ATRB2           ,        \r\n"
+           "       USE_YN          ,        \r\n"
+           "       FRST_REGR_NMBR  ,        \r\n"
+           "       FRST_RGST_DT    ,        \r\n"
+           "       LAST_CRPR_NMBR  ,        \r\n"
+           "       LAST_CRCT_DT             \r\n"
+           "  FROM TB_CMMN_CD               \r\n"
+           " WHERE USE_YN = 'Y'             \r\n";
+//           " ORDER BY CMMN_CLSF_CD, CMMN_CD \r\n";
+    try
+    {
+        TItsCode *pCode = NULL;
+
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sClsfCd = pADO->FieldByName("CMMN_CLSF_CD")->AsString;
+                pCode = ItsCodeManager->FLists.Find(sClsfCd);
+                if (!pCode) continue;
+
+				TItsSubCode *pSubCode = new TItsSubCode();
+
+                pSubCode->CMMN_CD          = pADO->FieldByName("CMMN_CD")->AsString;
+                pSubCode->CMMN_CLSF_CD     = pADO->FieldByName("CMMN_CLSF_CD")->AsString;
+                pSubCode->CMMN_CD_KOR_NM   = pADO->FieldByName("CMMN_CD_KOR_NM")->AsString;
+                pSubCode->CMMN_CD_ENGL_NM  = pADO->FieldByName("CMMN_CD_ENGL_NM")->AsString;
+                pSubCode->CMMN_CD_ABBR     = pADO->FieldByName("CMMN_CD_ABBR")->AsString;
+                pSubCode->RMRK             = pADO->FieldByName("RMRK")->AsString;
+                pSubCode->ATRB1            = pADO->FieldByName("ATRB1")->AsString;
+                pSubCode->ATRB2            = pADO->FieldByName("ATRB2")->AsString;
+                pSubCode->USE_YN           = pADO->FieldByName("USE_YN")->AsString;
+                pSubCode->FRST_REGR_NMBR   = pADO->FieldByName("FRST_REGR_NMBR")->AsString;
+                pSubCode->FRST_RGST_DT     = pADO->FieldByName("FRST_RGST_DT")->AsString;
+                pSubCode->LAST_CRPR_NMBR   = pADO->FieldByName("LAST_CRPR_NMBR")->AsString;
+                pSubCode->LAST_CRCT_DT     = pADO->FieldByName("LAST_CRCT_DT")->AsString;
+
+                pCode->FSubLists.Push(pSubCode->CMMN_CD, pSubCode);
+                pSubCode->Completed = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsCodeManager::LoadSubCode", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsCodeManager::LoadSubCode", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 111 - 0
COMMON/CDS/CDSCodeF.h

@@ -0,0 +1,111 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSCodeFH
+#define CDSCodeFH
+//---------------------------------------------------------------------------
+
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  SubCode Detail
+*/
+class TItsSubCode
+{
+public:
+    TItsSubCode();
+    TItsSubCode(String ACd, String AClsfCd);
+    virtual ~TItsSubCode();
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+    
+public:
+    String  CMMN_CD;           // VARCHAR(7 BYTE) NOT NULL,        '공통 코드';
+    String  CMMN_CLSF_CD;      // VARCHAR(3 BYTE) NOT NULL,  '공통 분류 코드';
+    String  CMMN_CD_KOR_NM;    // VARCHAR(60 BYTE),        '공통 코드 한글 명';
+    String  CMMN_CD_ENGL_NM;   // VARCHAR(60 BYTE),       '공통 코드 영문 명';
+    String  CMMN_CD_ABBR;      // VARCHAR(20 BYTE),          '공통 코드 약어';
+    String  RMRK;              // VARCHAR(600 BYTE),                 '비고';
+    String  ATRB1;             // VARCHAR(60 BYTE),                 '속성1';
+    String  ATRB2;             // VARCHAR(60 BYTE),                 '속성2';
+    String  USE_YN;            // CHAR(1 BYTE) DEFAULT 'N',        '사용 여부';
+    String  FRST_REGR_NMBR;    // VARCHAR(20 BYTE),        '최초 등록자 번호';
+    String  FRST_RGST_DT;      // VARCHAR(14 BYTE),          '최초 등록 일시';
+    String  LAST_CRPR_NMBR;    // VARCHAR(20 BYTE),        '최종 수정자 번호';
+    String  LAST_CRCT_DT;      // VARCHAR(14 BYTE)           '최종 수정 일시';
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+};
+
+/*
+*  Code class
+*/
+class TItsCode
+{
+public:
+    TItsCode();
+    TItsCode(String AClsfCd);
+    virtual ~TItsCode();
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+    
+public:
+    String  CMMN_CLSF_CD;          // VARCHAR(3 BYTE) NOT NULL,                                        '공통 분류 코드';
+    String  MSG_TYPE_CD;           // VARCHAR(7 BYTE),                                                '메시지 유형 코드';
+    String  CMMN_CLSF_KOR_NM;      // VARCHAR(60 BYTE),                                          '공통 분류 한글 명';
+    String  CMMN_CLSF_ENGL_NM;     // VARCHAR(60 BYTE),                                         '공통 분류 영문 명';
+    String  USE_SYST_CD;           // VARCHAR(7 BYTE),                                                '사용 시스템 코드';
+    String  RMRK;                  // VARCHAR(600 BYTE),                                                     '비고';
+    String  USE_YN;                // CHAR(1 BYTE) DEFAULT 'N',                                            '사용 여부';
+    String  FRST_REGR_NMBR;        // VARCHAR(20 BYTE) DEFAULT NULL,                               '최초 등록자 번호';
+    String  FRST_RGST_DT;          // VARCHAR(14 BYTE) DEFAULT TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS'),  '최초 등록 일시';
+    String  LAST_CRPR_NMBR;        // VARCHAR(20 BYTE) DEFAULT NULL,                               '최종 수정자 번호';
+    String  LAST_CRCT_DT;          // VARCHAR(14 BYTE) DEFAULT TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')   '최종 수정 일시';
+
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    ListMap<TItsSubCode>   FSubLists;
+};
+//---------------------------------------------------------------------------
+
+/*
+* Code Manager
+*/
+class TItsCodeManager
+{
+public:
+    TItsCodeManager();
+    virtual ~TItsCodeManager();
+
+public:
+    ListMap<TItsCode>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadCode(TADOConnection *ADbConn=NULL);
+    bool LoadSubCode(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsCodeManager *ItsCodeManager;
+//---------------------------------------------------------------------------
+
+
+#endif
+

+ 123 - 0
COMMON/CDS/CDSColSysF.cpp

@@ -0,0 +1,123 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSColSysF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsColSys::TItsColSys()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+    //Clear();
+}
+//---------------------------------------------------------------------------
+void TItsColSys::Clear()
+{
+    CLCT_SYST_CD   = "";    //VARCHAR2(7)	N			수집 시스템 코드
+    CLCT_SYST_NMBR = "";    //NUMBER(2)	Y			수집 시스템 번호
+    CLCT_SYST_NM   = "";    //VARCHAR2(30)	N			수집 시스템 명
+    CLCT_SYST_EXPL = "";    //VARCHAR2(100)	Y			수집 시스템 설명
+    CLCT_MAX_NUM   = "";    //NUMBER(7)	Y	0		수집 최대 개수
+    USE_YN         = "Y";   //CHAR(1)	Y	'N'		사용 여부
+}
+//---------------------------------------------------------------------------
+TItsColSys::~TItsColSys()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsColSysManager *ItsColSysManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* ColSys Manager
+*/
+TItsColSysManager::TItsColSysManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsColSysManager::~TItsColSysManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TItsColSysManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT CLCT_SYST_CD,     \r\n"
+           "       CLCT_SYST_NMBR,   \r\n"
+           "       CLCT_SYST_NM,     \r\n"
+           "       CLCT_SYST_EXPL,   \r\n"
+           "       CLCT_MAX_NUM,     \r\n"
+           "       USE_YN            \r\n"
+           "  FROM TB_CLCT_SYST_STUP \r\n"
+           " WHERE USE_YN = 'Y'      \r\n";
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsColSys *pObj = new TItsColSys();
+
+                pObj->CLCT_SYST_CD   = pADO->FieldByName("CLCT_SYST_CD")->AsString;
+                pObj->CLCT_SYST_NMBR = pADO->FieldByName("CLCT_SYST_NMBR")->AsString;
+                pObj->CLCT_SYST_NM   = pADO->FieldByName("CLCT_SYST_NM")->AsString;
+                pObj->CLCT_SYST_EXPL = pADO->FieldByName("CLCT_SYST_EXPL")->AsString;
+                pObj->CLCT_MAX_NUM   = pADO->FieldByName("CLCT_MAX_NUM")->AsString;
+                pObj->USE_YN         = pADO->FieldByName("USE_YN")->AsString;
+
+				FLists.Push(pObj->CLCT_SYST_CD, pObj);
+
+                pObj->Completed = true;
+                pObj->MEM_DEL   = "N";
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsColSysManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsColSysManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 66 - 0
COMMON/CDS/CDSColSysF.h

@@ -0,0 +1,66 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSColSysFH
+#define CDSColSysFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+#define MAX_COLSYS  15
+
+/*
+*  ColSys class
+*/
+class TItsColSys
+{
+public:
+    TItsColSys();
+    virtual ~TItsColSys();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+    String  CLCT_SYST_CD;   //VARCHAR2(7)	N 수집 시스템 코드
+    String  CLCT_SYST_NMBR; //NUMBER(2)	    Y 수집 시스템 번호
+    String  CLCT_SYST_NM;   //VARCHAR2(30)	N 수집 시스템 명
+    String  CLCT_SYST_EXPL; //VARCHAR2(100)	Y 수집 시스템 설명
+    String  CLCT_MAX_NUM;   //NUMBER(7)	Y	0 수집 최대 개수
+    String  USE_YN;         //CHAR(1)	Y	'N'		사용 여부
+
+    String  MEM_DEL;
+    
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+* ColSys Manager
+*/
+class TItsColSysManager
+{
+public:
+    TItsColSysManager();
+    virtual ~TItsColSysManager();
+
+public:
+    ListMap<TItsColSys>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsColSysManager *ItsColSysManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 128 - 0
COMMON/CDS/CDSColtSysF.cpp

@@ -0,0 +1,128 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSColtSysF.h"
+#include "ITSDbF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsColtSys::TItsColtSys()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+    //Clear();
+}
+//---------------------------------------------------------------------------
+void TItsColtSys::Clear()
+{
+    ColtSys_ID      = "";  //VARCHAR2(20)	N			사용자ID
+    PWD          = "";  //VARCHAR2(64)	Y			암호
+    NAME         = "";  //VARCHAR2(30)	Y			성명
+    COMP         = "";  //VARCHAR2(50)	Y			회사
+    TEL          = "";  //VARCHAR2(128)	Y			전화번호
+    ADDR         = "";  //VARCHAR2(200)	Y			주소
+    RESD_NMBR    = "";  //VARCHAR2(14)	Y			주민번호
+    MOBILE       = "";  //VARCHAR2(128)	Y			이동전화
+    EMAL         = "";  //VARCHAR2(128)	Y			이메일
+    DEL_YN       = "";  //CHAR(1)	Y	'N'		삭제 여부
+    RGSTYMD      = "";  //VARCHAR2(14)	Y			등록일자
+    CRCTYMD      = "";  //VARCHAR2(14)	Y			수정일자
+    HINT_QUES    = "";  //VARCHAR2(7)	Y			힌트질문
+    HINT_ANS     = "";  //VARCHAR2(100)	Y			힌트질문답
+    GROP_ID      = "";  //VARCHAR2(30)	Y			그룹ID
+    OPER_SYST_ID = "";  //VARCHAR2(30)	Y			운영시스템ID
+}
+//---------------------------------------------------------------------------
+TItsColtSys::~TItsColtSys()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsColtSysManager *ItsColtSysManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* ColtSys Manager
+*/
+TItsColtSysManager::TItsColtSysManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsColtSysManager::~TItsColtSysManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TItsColtSysManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT ROWNUM AS ORDSEQ, \r\n"
+           "       CLCT_SYST_CD,     \r\n"
+           "       CLCT_SYST_NM,     \r\n"
+           "       USE_YN            \r\n"
+           "  FROM TB_CLCT_SYST_STUP \r\n"
+           " WHERE USE_YN = 'Y'      \r\n";
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsColtSys *pObj = new TItsColtSys();
+
+                pObj->ORDSEQ        = pADO->FieldByName("ORDSEQ")->AsString;
+                pObj->CLCT_SYST_CD  = pADO->FieldByName("CLCT_SYST_CD")->AsString; 
+                pObj->CLCT_SYST_NM  = pADO->FieldByName("CLCT_SYST_NM")->AsString;
+                pObj->USE_YN        = pADO->FieldByName("USE_YN")->AsString;
+				
+				FLists.Push(pObj->ORDSEQ, pObj);
+
+                pObj->Completed = true;
+                pObj->MEM_DEL   = "N";
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+        catch(...)
+        {
+            throw Exception("[ItsColtSysManager] 알수없는 DB 오류가 발생하였습니다.");
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 62 - 0
COMMON/CDS/CDSColtSysF.h

@@ -0,0 +1,62 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSColtSysFH
+#define CDSColtSysFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+/*
+*  ColtSys class
+*/
+class TItsColtSys
+{
+public:
+    TItsColtSys();
+    virtual ~TItsColtSys();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+    String ORDSEQ; 
+    String CLCT_SYST_CD; 
+    String CLCT_SYST_NM;
+    String USE_YN;
+
+    String  MEM_DEL;
+    
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+* ColtSys Manager
+*/
+class TItsColtSysManager
+{
+public:
+    TItsColtSysManager();
+    virtual ~TItsColtSysManager();
+
+public:
+    ListMap<TItsColtSys>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsColtSysManager *ItsColtSysManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 143 - 0
COMMON/CDS/CDSCompanyF.cpp

@@ -0,0 +1,143 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSCompanyF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsCompany::TItsCompany()
+{
+	FGridIndex  = -1;         // 그리드 인덱스
+    //Clear();
+}
+//---------------------------------------------------------------------------
+void TItsCompany::Clear()
+{
+    CMPY_ID      = "";
+    CMPY_NM      = "";
+    BRNO         = "";
+    ADDR         = "";
+    TEL          = "";
+    FCSM_NMBR    = "";
+    RPRV_NM      = "";
+    CHGR_NM      = "";
+    CHGR_HP_NMBR = "";
+    CHGR_EMAL    = "";
+    ADTN_NM      = "";
+    ADTN_DT      = "";
+    CHNG_NM      = "";
+    CHNG_DT      = "";
+    DEL_YN       = "";
+	GridIndex    = -1;
+}
+//---------------------------------------------------------------------------
+TItsCompany::~TItsCompany()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsCompanyManager *ItsCompanyManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Company Manager
+*/
+TItsCompanyManager::TItsCompanyManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsCompanyManager::~TItsCompanyManager()
+{
+}
+//---------------------------------------------------------------------------
+bool TItsCompanyManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.CMPY_ID      , \r\n"
+           "       A.CMPY_NM      , \r\n"
+           "       A.BRNO         , \r\n"
+           "       A.ADDR         , \r\n"
+           "       A.TEL          , \r\n"
+           "       A.FCSM_NMBR    , \r\n"
+           "       A.RPRV_NM      , \r\n"
+           "       A.CHGR_NM      , \r\n"
+           "       A.CHGR_HP_NMBR , \r\n"
+           "       A.CHGR_EMAL    , \r\n"
+           "       A.ADTN_NM      , \r\n"
+           "       A.ADTN_DT      , \r\n"
+           "       A.CHNG_NM      , \r\n"
+           "       A.CHNG_DT      , \r\n"
+           "       A.DEL_YN         \r\n"
+           "  FROM TB_FCLT_CMPY A   \r\n";
+//           " ORDER BY A.CMPY_ID     \r\n";
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsCompany *pCompany = new TItsCompany();
+
+                pCompany->CMPY_ID      = pADO->FieldByName("CMPY_ID")->AsString;        //업체 ID
+                pCompany->CMPY_NM      = pADO->FieldByName("CMPY_NM")->AsString;        //업체 명
+                pCompany->BRNO         = pADO->FieldByName("BRNO")->AsString;           //사업자 등록 번호
+                pCompany->ADDR         = pADO->FieldByName("ADDR")->AsString;           //주소
+                pCompany->TEL          = pADO->FieldByName("TEL")->AsString;            //전화번호
+                pCompany->FCSM_NMBR    = pADO->FieldByName("FCSM_NMBR")->AsString;      //팩스 번호
+                pCompany->RPRV_NM      = pADO->FieldByName("RPRV_NM")->AsString;        //대표자 명
+                pCompany->CHGR_NM      = pADO->FieldByName("CHGR_NM")->AsString;        //담당자 명
+                pCompany->CHGR_HP_NMBR = pADO->FieldByName("CHGR_HP_NMBR")->AsString;   //담당자 연락처
+                pCompany->CHGR_EMAL    = pADO->FieldByName("CHGR_EMAL")->AsString;      //담당자 이메일
+                pCompany->ADTN_NM      = pADO->FieldByName("ADTN_NM")->AsString;        //추가자 명
+                pCompany->ADTN_DT      = pADO->FieldByName("ADTN_DT")->AsString;        //추가 일시
+                pCompany->CHNG_NM      = pADO->FieldByName("CHNG_NM")->AsString;        //변경자 명
+                pCompany->CHNG_DT      = pADO->FieldByName("CHNG_DT")->AsString;        //변경 일시
+                pCompany->DEL_YN       = pADO->FieldByName("DEL_YN")->AsString;         //삭제 여부
+                
+				FLists.Push(pCompany->CMPY_ID, pCompany);
+                pCompany->Completed = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsCompanyManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsCompanyManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------

+ 76 - 0
COMMON/CDS/CDSCompanyF.h

@@ -0,0 +1,76 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSCompanyFH
+#define CDSCompanyFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  Company class
+*/
+class TItsCompany
+{
+public:
+    TItsCompany();
+    virtual ~TItsCompany();
+    void Clear();
+private:
+    int     FEditMode;
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String  CMPY_ID;
+    String  CMPY_NM;
+    String  BRNO;
+    String  ADDR;
+    String  TEL;
+    String  FCSM_NMBR;
+    String  RPRV_NM;
+    String  CHGR_NM;
+    String  CHGR_HP_NMBR;
+    String  CHGR_EMAL;
+    String  ADTN_NM;
+    String  ADTN_DT;
+    String  CHNG_NM;
+    String  CHNG_DT;
+    String  DEL_YN;
+	int     FGridIndex;	    // 메인폼에 뿌려지는 그리드 인덱스
+
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+ 	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex  = {read = FGridIndex,  write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+* Company Manager
+*/
+class TItsCompanyManager
+{
+public:
+    TItsCompanyManager();
+    virtual ~TItsCompanyManager();
+
+public:
+    ListMap<TItsCompany>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsCompanyManager *ItsCompanyManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 22 - 0
COMMON/CDS/CDSCoordF.cpp

@@ -0,0 +1,22 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSCoordF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsCoord::TItsCoord()
+{
+}
+//---------------------------------------------------------------------------
+TItsCoord::~TItsCoord()
+{
+}
+//---------------------------------------------------------------------------
+

+ 43 - 0
COMMON/CDS/CDSCoordF.h

@@ -0,0 +1,43 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSCoordFH
+#define CDSCoordFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+/*
+*  Coord class
+*/
+class TItsCoord
+{
+public:
+    TItsCoord();
+    virtual ~TItsCoord();
+private:
+public:
+    double X;
+    double Y;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Bounds Coord class
+*/
+typedef struct _ItsBounds
+{
+    double minX, minY;
+    double maxX, maxY;
+    _ItsBounds()
+    {
+        minX = minY = 999999;
+        maxX = maxY = -999999;
+    }
+} TItsBounds;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 107 - 0
COMMON/CDS/CDSDatabaseF.cpp

@@ -0,0 +1,107 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSDatabaseF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsDatabase::TItsDatabase()
+{
+	FCompleted = false;
+}
+//---------------------------------------------------------------------------
+void TItsDatabase::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsDatabase::~TItsDatabase()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsDatabaseManager *ItsDatabaseManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Database Manager
+*/
+TItsDatabaseManager::TItsDatabaseManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsDatabaseManager::~TItsDatabaseManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TItsDatabaseManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT TABLESPACE_NAME, TOTAL_MB, USED_MB, FREE_MB, USED_PERCENT  \r\n"
+           "  FROM VW_TABLESPACE_USAGE                                        \r\n"
+           " ORDER BY TABLESPACE_NAME                                         \r\n";
+
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsDatabase *pObj = new TItsDatabase();
+
+                pObj->TABLESPACE_NAME = pADO->FieldByName("TABLESPACE_NAME")->AsString;
+                pObj->TOTAL_MB        = pADO->FieldByName("TOTAL_MB")->AsInteger;
+                pObj->USED_MB         = pADO->FieldByName("USED_MB")->AsInteger;
+                pObj->FREE_MB         = pADO->FieldByName("FREE_MB")->AsInteger;
+                pObj->USED_PERCENT    = pADO->FieldByName("USED_PERCENT")->AsInteger;
+
+				FLists.Push(pObj->TABLESPACE_NAME, pObj);
+
+                pObj->Completed = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsDatabaseManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsDatabaseManager::LoadFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 56 - 0
COMMON/CDS/CDSDatabaseF.h

@@ -0,0 +1,56 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSDatabaseFH
+#define CDSDatabaseFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+/*
+*  Database class
+*/
+class TItsDatabase
+{
+public:
+    TItsDatabase();
+    virtual ~TItsDatabase();
+    void Clear();
+private:
+    bool    FCompleted;
+
+public:
+    String  TABLESPACE_NAME;
+    int     TOTAL_MB;
+    int     USED_MB;
+    int     FREE_MB;
+    int     USED_PERCENT;
+
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+};
+//---------------------------------------------------------------------------
+
+/*
+* Database Manager
+*/
+class TItsDatabaseManager
+{
+public:
+    TItsDatabaseManager();
+    virtual ~TItsDatabaseManager();
+
+public:
+    ListMap<TItsDatabase>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsDatabaseManager *ItsDatabaseManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 167 - 0
COMMON/CDS/CDSEventF.cpp

@@ -0,0 +1,167 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSEventF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsEvent::TItsEvent()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+
+    //Clear();
+}
+//---------------------------------------------------------------------------
+void TItsEvent::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsEvent::~TItsEvent()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsEventManager *ItsEventManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Event Manager
+*/
+TItsEventManager::TItsEventManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsEventManager::~TItsEventManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+bool TItsEventManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    try
+    {
+        FLists.Lock();
+        FEventId = 0;
+        FLists.RemoveAll();
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+    LoadBlackBoxEvent(ADbConn);
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsEventManager::LoadBlackBoxEvent(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.*,                                                      \r\n"
+           "       B.OCRR_DT,                                                \r\n"
+           "       B.TRMN_ID,                                                \r\n"
+           "       B.EVT_TYPE,                                               \r\n"
+           "       DECODE(B.EVT_TYPE, '1', '1.주기보고',                     \r\n"
+           "                          '2', '2.사용자전송',                   \r\n"
+           "                          '3', '3.긴급전송',                     \r\n"
+           "                          '---') AS EVT_DESC,                    \r\n"
+           "       B.X_CRDN,                                                 \r\n"
+           "       B.Y_CRDN,                                                 \r\n"
+           "       B.GPS_DRCT,                                               \r\n"
+           "       B.SPED,                                                   \r\n"
+           "       B.VHRN_MODE,                                              \r\n"
+           "       DECODE(B.VHRN_MODE, '1', '1.주행모드',                    \r\n"
+           "                           '2', '2.주차모드',                    \r\n"
+           "                           '---') AS VHRN_DESC,                  \r\n"
+           "       B.TRMN_VER,                                               \r\n"
+           "       B.IMGN_PATH, B.LINK_ID                                    \r\n"
+           "  FROM TB_BDS_TRMN     A,                                        \r\n"
+           "       TB_BDS_INCD_CLCT B                                        \r\n"
+           " WHERE A.BDS_MNGM_NMBR = B.BDS_MNGM_NMBR                         \r\n"
+           "   AND B.OCRR_DT >= TO_CHAR(SYSDATE-10/1440, 'YYYYMMDDHH24MISS') \r\n"
+           " ORDER BY B.OCRR_DT DESC                                         \r\n";
+
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsEvent *pObj = new TItsEvent();
+
+                pObj->BDS_MNGM_NMBR = pADO->FieldByName("BDS_MNGM_NMBR")->AsString;
+                pObj->OPNC_NMBR     = pADO->FieldByName("OPNC_NMBR")->AsString;
+                pObj->MDM_NMBR      = pADO->FieldByName("MDM_NMBR")->AsString;
+                pObj->USIM_NMBR     = pADO->FieldByName("USIM_NMBR")->AsString;
+                pObj->VHCL_NMBR     = pADO->FieldByName("VHCL_NMBR")->AsString;
+                pObj->OWNR_NM       = pADO->FieldByName("OWNR_NM")->AsString;
+                pObj->PRCT_NM       = pADO->FieldByName("PRCT_NM")->AsString;
+
+                pObj->OCRR_DT       = pADO->FieldByName("OCRR_DT")->AsString;
+                //String BDS_MNGM_NMBR;   //	N	VARCHAR2(20)	N			블랙박스 관리 번호
+                pObj->TRMN_ID       = pADO->FieldByName("TRMN_ID")->AsString;
+                pObj->EVT_TYPE      = pADO->FieldByName("EVT_DESC")->AsString;
+                pObj->X_CRDN        = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN        = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->GPS_DRCT      = pADO->FieldByName("GPS_DRCT")->AsString;
+                pObj->SPED          = pADO->FieldByName("SPED")->AsString;
+                pObj->VHRN_MODE     = pADO->FieldByName("VHRN_DESC")->AsString;
+                pObj->TRMN_VER      = pADO->FieldByName("TRMN_VER")->AsString;
+                pObj->IMGN_PATH     = pADO->FieldByName("IMGN_PATH")->AsString;
+                pObj->LINK_ID       = pADO->FieldByName("LINK_ID")->AsString;
+                if (pObj->LINK_ID.Trim() == "0") pObj->LINK_ID = "";
+
+                pObj->ID.printf(L"%05d", ++FEventId);
+				FLists.Push(pObj->ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsEventManager::LoadBlackBoxEvent", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsEventManager::LoadBlackBoxEvent", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+

+ 79 - 0
COMMON/CDS/CDSEventF.h

@@ -0,0 +1,79 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSEventFH
+#define CDSEventFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+
+class TItsEvent
+{
+public:
+    TItsEvent();
+    virtual ~TItsEvent();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+    String MEM_DEL;
+
+    String ID;
+
+    String BDS_MNGM_NMBR;   //	N	VARCHAR2(20)	N			블랙박스 관리 번호
+    String OPNC_NMBR;       //	N	VARCHAR2(128)	Y			개통 번호
+    String MDM_NMBR;        //	N	VARCHAR2(10)	Y			모뎀 번호
+    String USIM_NMBR;       //	N	VARCHAR2(10)	Y			유심 번호
+    String VHCL_NMBR;       //	N	VARCHAR2(15)	Y			차량 번호
+    String OWNR_NM;         //	N	VARCHAR2(30)	Y			소유자 명
+    String PRCT_NM;         //	N	VARCHAR2(30)	Y			제품 명
+
+    String OCRR_DT;         //	N	VARCHAR2(14)	N			발생 일시
+    //String BDS_MNGM_NMBR;   //	N	VARCHAR2(20)	N			블랙박스 관리 번호
+    String TRMN_ID;         //	N	VARCHAR2(128)	Y			단말기 ID
+    String EVT_TYPE;        //	N	VARCHAR2(7)	Y			이벤트 유형(1 : 주기보고, 2 : 사용자 전송, 3 : 긴급 전송)
+    String X_CRDN;          //	N	NUMBER(11,8)	Y			x 좌표
+    String Y_CRDN;          //	N	NUMBER(10,8)	Y			Y 좌표
+    String GPS_DRCT;        //	N	NUMBER(3)	Y	0		GPS 방향(GPS의 방위각을 10으로 나눈 값)
+    String SPED;            //	N	NUMBER(3)	Y	0		속도
+    String VHRN_MODE;       //	N	VARCHAR2(7)	Y			운행 모드(1 : 주행모드, 2 : 주차모드)
+    String TRMN_VER;        //	N	VARCHAR2(20)	Y			단말기 버전
+    String IMGN_PATH;       //	N	VARCHAR2(200)	Y			영상 경로
+    String LINK_ID;
+
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+* Event Manager
+*/
+class TItsEventManager
+{
+public:
+    TItsEventManager();
+    virtual ~TItsEventManager();
+
+public:
+    int                     FEventId;
+    ListMap<TItsEvent>      FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+
+    bool LoadBlackBoxEvent(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsEventManager *ItsEventManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 311 - 0
COMMON/CDS/CDSFacilityCodeF.cpp

@@ -0,0 +1,311 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSFacilityCodeF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TFacilityCodeManager *FacilityCodeManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* TFacilityCodeManager Manager
+*/
+TFacilityCodeManager::TFacilityCodeManager()
+{
+}
+//---------------------------------------------------------------------------
+TFacilityCodeManager::~TFacilityCodeManager()
+{
+}
+//---------------------------------------------------------------------------
+
+bool TFacilityCodeManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    LoadEqpmTypeDb(ADbConn);
+    LoadFailOccrDb(ADbConn);
+    LoadFailCodeDb(ADbConn);
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TFacilityCodeManager::LoadHndlTypeDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT FAIL_HNDL_CD,     \r\n"
+           "       FAIL_HNDL_CD_NM   \r\n"
+           "  FROM TB_FAIL_HNDL_TYPE \r\n";
+
+    try
+    {
+        FHndlLists.Lock();
+        FHndlLists.RemoveAll();
+
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TFacilityHndlType *pCode = new TFacilityHndlType();
+
+                pCode->FAIL_HNDL_CD    = pADO->FieldByName("FAIL_HNDL_CD")->AsString;       //장애 처리 코드
+                pCode->FAIL_HNDL_CD_NM = pADO->FieldByName("FAIL_HNDL_CD_NM")->AsString;    //장애 처리 코드 명
+                pCode->Completed = true;
+                pCode->Modified  = false;
+
+				FHndlLists.Push(pCode->FAIL_HNDL_CD, pCode);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TFacilityCodeManager::LoadHndlTypeDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TFacilityCodeManager::LoadHndlTypeDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FHndlLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TFacilityCodeManager::LoadEqpmTypeDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT EQPM_TYPE_CD,     \r\n"
+           "       EQPM_TYPE_CD_NM,  \r\n"
+           "       FCLT_TYPE         \r\n"
+           "  FROM TB_FAIL_EQPM_TYPE \r\n";
+
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TFacilityEqpmType *pEqpm = new TFacilityEqpmType();
+
+                pEqpm->EQPM_TYPE_CD    = pADO->FieldByName("EQPM_TYPE_CD")->AsString;       //장비 유형 코드
+                pEqpm->EQPM_TYPE_CD_NM = pADO->FieldByName("EQPM_TYPE_CD_NM")->AsString;    //장비 유형 코드 명
+                pEqpm->FCLT_TYPE       = pADO->FieldByName("FCLT_TYPE")->AsString;          //시설물 유형
+                pEqpm->Completed = true;
+                pEqpm->Modified  = false;
+
+				FLists.Push(pEqpm->EQPM_TYPE_CD, pEqpm);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TFacilityCodeManager::LoadEqpmTypeDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TFacilityCodeManager::LoadEqpmTypeDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TFacilityCodeManager::LoadFailOccrDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.EQPM_TYPE_CD, B.FAIL_OCRR_CD,            \r\n"
+           "       MIN(C.FAIL_OCRR_CD_NM) AS FAIL_OCRR_CD_NM  \r\n"
+           "  FROM TB_FAIL_EQPM_TYPE A,                       \r\n"
+           "       TB_FAIL_DETL_CD   B,                       \r\n"
+           "       TB_FAIL_OCRR_DVSN C                        \r\n"
+           " WHERE A.EQPM_TYPE_CD = B.EQPM_TYPE_CD            \r\n"
+           "   AND B.FAIL_OCRR_CD = C.FAIL_OCRR_CD            \r\n"
+           " GROUP BY A.EQPM_TYPE_CD, B.FAIL_OCRR_CD          \r\n";
+
+    try
+    {
+        FLists.Lock();
+
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String EQPM_TYPE_CD = pADO->FieldByName("EQPM_TYPE_CD")->AsString;          //장비 유형 코드
+
+                TFacilityEqpmType *pEqpm = FLists.Find(EQPM_TYPE_CD);
+                if (!pEqpm) continue;
+
+				TFacilityFailOccr *pOccr = new TFacilityFailOccr();
+
+                pOccr->EQPM_TYPE_CD    = EQPM_TYPE_CD;                                      //장비 유형 코드
+                pOccr->FAIL_OCRR_CD    = pADO->FieldByName("FAIL_OCRR_CD")->AsString;       //장애 발생 코드
+                pOccr->FAIL_OCRR_CD_NM = pADO->FieldByName("FAIL_OCRR_CD_NM")->AsString;    //장애 발생 코드 명
+                pOccr->Completed = true;
+                pOccr->Modified  = false;
+
+				pEqpm->FLists.Push(pOccr->FAIL_OCRR_CD, pOccr);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TFacilityCodeManager::LoadFailOccrDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TFacilityCodeManager::LoadFailOccrDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TFacilityCodeManager::LoadFailCodeDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.EQPM_TYPE_CD, B.FAIL_OCRR_CD, B.FAIL_CD,    \r\n"
+           "       MIN(C.FAIL_CD_NM) AS FAIL_CD_NM               \r\n"
+           "  FROM TB_FAIL_EQPM_TYPE A,                          \r\n"
+           "       TB_FAIL_DETL_CD   B,                          \r\n"
+           "       TB_FAIL_TYPE      C                           \r\n"
+           " WHERE A.EQPM_TYPE_CD = B.EQPM_TYPE_CD               \r\n"
+           "   AND B.FAIL_CD      = C.FAIL_CD                    \r\n"
+           " GROUP BY A.EQPM_TYPE_CD, B.FAIL_OCRR_CD, B.FAIL_CD  \r\n";
+
+    try
+    {
+        FLists.Lock();
+
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String EQPM_TYPE_CD = pADO->FieldByName("EQPM_TYPE_CD")->AsString;          //장비 유형 코드
+                TFacilityEqpmType *pEqpm = FLists.Find(EQPM_TYPE_CD);
+                if (!pEqpm) continue;
+
+                String FAIL_OCRR_CD = pADO->FieldByName("FAIL_OCRR_CD")->AsString;          //장비 유형 코드
+				TFacilityFailOccr *pOccr = pEqpm->FLists.Find(FAIL_OCRR_CD);
+                if (!pOccr) continue;
+
+				TFacilityFailCode *pCode = new TFacilityFailCode();
+
+                pCode->EQPM_TYPE_CD = EQPM_TYPE_CD;                              //장비 유형 코드
+                pCode->FAIL_OCRR_CD = FAIL_OCRR_CD;                              //장애 발생 코드
+                pCode->FAIL_CD      = pADO->FieldByName("FAIL_CD")->AsString;    //장애 코드 명
+                pCode->FAIL_CD_NM   = pADO->FieldByName("FAIL_CD_NM")->AsString; //장애 코드 명
+                pCode->Completed = true;
+                pCode->Modified  = false;
+
+				pOccr->FLists.Push(pCode->FAIL_CD, pCode);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TFacilityCodeManager::LoadFailCodeDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TFacilityCodeManager::LoadFailCodeDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 107 - 0
COMMON/CDS/CDSFacilityCodeF.h

@@ -0,0 +1,107 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSFacilityCodeFH
+#define CDSFacilityCodeFH
+//---------------------------------------------------------------------------
+
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+
+// 장애 유형(TB_FAIL_TYPE)
+class TFacilityFailCode
+{
+public:
+    TFacilityFailCode() {};
+    virtual ~TFacilityFailCode() {};
+public:
+    bool   Modified;
+    bool   Completed;
+
+    String EQPM_TYPE_CD;        // 장비 유형 코드
+    String FAIL_OCRR_CD;        // 장애 발생 코드
+    String FAIL_CD;             // 장애 코드
+    String FAIL_CD_NM;          // 장애 코드명
+};
+
+// 장애 발생 구분(TB_FAIL_OCRR_DVSN)
+class TFacilityFailOccr
+{
+public:
+    TFacilityFailOccr() {};
+    virtual ~TFacilityFailOccr() {};
+public:
+    bool   Modified;
+    bool   Completed;
+
+    String EQPM_TYPE_CD;        // 장비 유형 코드
+    String FAIL_OCRR_CD;        // 장애 발생 코드
+    String FAIL_OCRR_CD_NM;     // 장애 발생 코드 명
+
+    ListMap<TFacilityFailCode>   FLists;
+};
+
+// 장애 장비 유형(TB_FAIL_EQPM_TYPE)
+class TFacilityEqpmType
+{
+public:
+    TFacilityEqpmType() {};
+    virtual ~TFacilityEqpmType() {};
+public:
+    bool   Modified;
+    bool   Completed;
+
+    String EQPM_TYPE_CD;        // 장비 유형 코드
+    String EQPM_TYPE_CD_NM;     // 장비 유형 코드 명
+    String FCLT_TYPE;           // 시설물 유형
+
+    ListMap<TFacilityFailOccr>   FLists;
+};
+
+// 장애 처리 유형(TB_FAIL_HNDL_TYPE)
+class TFacilityHndlType
+{
+public:
+    TFacilityHndlType() {};
+    virtual ~TFacilityHndlType() {};
+public:
+    bool   Modified;
+    bool   Completed;
+
+    String FAIL_HNDL_CD;        // 장애 처리 코드
+    String FAIL_HNDL_CD_NM;     // 장애 처리 코드 명
+};
+
+
+/*
+* Code Manager
+*/
+class TFacilityCodeManager
+{
+public:
+    TFacilityCodeManager();
+    virtual ~TFacilityCodeManager();
+
+public:
+    ListMap<TFacilityEqpmType>  FLists;
+    ListMap<TFacilityHndlType>  FHndlLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadHndlTypeDb(TADOConnection *ADbConn=NULL);
+    bool LoadEqpmTypeDb(TADOConnection *ADbConn=NULL);
+    bool LoadFailOccrDb(TADOConnection *ADbConn=NULL);
+    bool LoadFailCodeDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TFacilityCodeManager *FacilityCodeManager;
+//---------------------------------------------------------------------------
+
+
+#endif
+

+ 2616 - 0
COMMON/CDS/CDSFacilityF.cpp

@@ -0,0 +1,2616 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSFacilityF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsRegFacility::TItsRegFacility()
+{
+    UnRegisterd = "N";
+    GridIndex   = -1;
+    Clear();
+}
+//---------------------------------------------------------------------------
+TItsRegFacility::~TItsRegFacility()
+{
+}
+//---------------------------------------------------------------------------
+void TItsRegFacility::Clear()
+{
+#if 0
+    Type        = "";
+    Id          = "";
+    Name        = "";
+    DelYn       = ""
+    UnRegisterd = "N";
+#endif
+}
+//---------------------------------------------------------------------------
+
+
+TItsFacility::TItsFacility()
+{
+    FCommStatus = "CMS2";     // 장비 통신상태값
+    FDoorStatus = "CMS2";     // 장비 Door상태값
+	GridIndex  = -1;         // 그리드 인덱스
+    StatusGridIndex = -1;
+    Deleted = "N";
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsFacility::Clear()
+{
+#if 0
+    FCLT_ID      = "";		// FCLT_ID VARCHAR(50 BYTE) NOT NULL,	'시설물 ID';
+    RFID_ID      = "";		// RFID_ID VARCHAR(50 BYTE) NOT NULL,	'시설물 ID';
+    FCLT_TYPE    = "";		// FCLT_TYPE VARCHAR(7 BYTE) NOT NULL, '시설물유형';
+    FCLT_LCTN    = "";		// FCLT_LCTN VARCHAR(100 BYTE),        '시설물 위치';
+    RSCE_YN      = "";		// RSCE_YN CHAR(1 BYTE) DEFAULT 'N',   '현장자산유무';
+    MDL_NM       = "";     // MDL_NM VARCHAR(30 BYTE),            '모델명';
+    USE_YEAR     = "";		// USE_YEAR NUMBER(3),                 '사용년수';
+    INWR_DT      = "";		// INWR_DT VARCHAR(14 BYTE),           '입고일시';
+    OTWR_DT      = "";		// OTWR_DT VARCHAR(14 BYTE),           '출고일시';
+    ISTL_DT      = "";		// ISTL_DT VARCHAR(14 BYTE),           '설치일시';
+    TAKT_DT      = "";		// TAKT_DT VARCHAR(14 BYTE),           '반출일시';
+    TAKT_RESN    = "";		// TAKT_RESN VARCHAR(100 BYTE),        '반출사유';
+    TAKN_DT      = "";		// TAKN_DT VARCHAR(14 BYTE),           '반입일시';
+    ABDN_DT      = "";		// ABDN_DT VARCHAR(14 BYTE),           '폐기일시';
+    ADTN_NM      = "";		// ADTN_NM VARCHAR(30 BYTE),           '추가자명';
+    ADTN_DT      = "";		// ADTN_DT VARCHAR(14 BYTE),           '추가일시';
+    CHNG_NM      = "";		// CHNG_NM VARCHAR(30 BYTE),           '변경자명';
+    CHNG_DT      = "";		// CHNG_DT VARCHAR(14 BYTE),           '변경일시';
+    AMT          = "";     // AMT NUMBER(15),                     '금액';
+    DEL_YN       = "";     // DEL_YN CHAR(1 BYTE) DEFAULT 'N',    '삭제여부';
+    ISTL_CMPY_ID = "";     // ISTL_CMPY_ID VARCHAR(30 BYTE),      '설치업체ID';
+    MNFC_CMPY_ID = "";     // PRDC_CMPY_ID VARCHAR(30 BYTE)       '제조업체ID';
+    ISTL_LCTN_ADDR = "";
+
+    CommStatus = "CMS2";   // 장비 통신상태값
+    DoorStatus = "CMS2";   // 장비 Door상태값
+
+	GridIndex  = -1;	    // 메인폼에 뿌려지는 그리드 인덱스
+
+#endif
+}
+//---------------------------------------------------------------------------
+TItsFacility::~TItsFacility()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsFacilityManager *ItsFacilityManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Facility Manager
+*/
+TItsFacilityManager::TItsFacilityManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsFacilityManager::~TItsFacilityManager()
+{
+    FRegLists.RemoveAll();
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TItsFacilityManager::SetCenterId(String ACenterId)
+{
+    CenterId = ACenterId;
+}
+//---------------------------------------------------------------------------
+bool TItsFacilityManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    try
+    {
+        FLocalCctvCnt = 0;
+
+        FWebCamLists.Lock();
+        FCctvLists.Lock();
+        FVmsLists.Lock();
+        FRseLists.Lock();
+
+        FVdsLists.Lock();
+        FAviLists.Lock();
+        FDsrcLists.Lock();
+
+        FBitLists.Lock();
+        FSigLists.Lock();
+        FSigDetLists.Lock();
+
+        FPisLists.Lock();
+        FPcsLists.Lock();
+        FParkLists.Lock();
+
+        FRegLists.Lock();
+        FLists.Lock();
+
+        FWebCamLists.RemoveAll();
+        FCctvLists.RemoveAll();
+        FVmsLists.RemoveAll();
+        FRseLists.RemoveAll();
+
+        FVdsLists.RemoveAll();
+        FAviLists.RemoveAll();
+        FDsrcLists.RemoveAll();
+
+        FBitLists.RemoveAll();
+        FSigLists.RemoveAll();
+        FSigDetLists.RemoveAll();
+
+        FPisLists.RemoveAll();
+        FPcsLists.RemoveAll();
+        FParkLists.RemoveAll();
+
+        FRegLists.RemoveAll();
+        FLists.RemoveAll();
+    }
+    __finally
+    {
+        FWebCamLists.UnLock();
+        FCctvLists.UnLock();
+        FVmsLists.UnLock();
+        FRseLists.UnLock();
+
+        FVdsLists.UnLock();
+        FAviLists.UnLock();
+        FDsrcLists.UnLock();
+
+        FBitLists.UnLock();
+        FSigLists.UnLock();
+        FSigDetLists.UnLock();
+
+        FPisLists.UnLock();
+        FPcsLists.UnLock();
+        FParkLists.UnLock();
+
+        FRegLists.UnLock();
+        FLists.UnLock();
+    }
+
+    LoadFacilityReg(ADbConn);
+    LoadFacilityMaster(ADbConn);
+#ifdef USE_WCAM
+    LoadFacilityWebCam(ADbConn);
+#endif
+#ifdef USE_CCTV
+    LoadFacilityCctv(ADbConn);
+#endif
+#ifdef USE_VMS
+    LoadFacilityVms(ADbConn);
+#endif
+#ifdef USE_RSE
+    LoadFacilityRse(ADbConn);
+#endif
+#ifdef USE_VDS
+    LoadFacilityVds(ADbConn);
+#endif
+#ifdef USE_AVI
+    LoadFacilityAvi(ADbConn);
+#endif
+#ifdef USE_DSRC
+    LoadFacilityDsrc(ADbConn);
+#endif
+#ifdef USE_BIT
+    LoadFacilityBit(ADbConn);
+#endif
+#ifdef USE_SIG
+    LoadFacilitySig(ADbConn);
+#endif
+#ifdef USE_SIGDET
+    LoadFacilitySigDet(ADbConn);
+#endif
+#ifdef USE_PVMS
+    LoadFacilityPvms(ADbConn);
+#endif
+#ifdef USE_PVDS
+    LoadFacilityPvds(ADbConn);
+#endif
+#ifdef USE_PARK
+    LoadFacilityPark(ADbConn);
+#endif
+
+    CheckFacility();
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsFacilityManager::CheckFacility()
+{
+    try
+    {
+        FLists.Lock();
+        FOR_STL(TItsFacility *, pFacility, FLists)
+        {
+            TItsRegFacility *pRegFacility = FRegLists.Find(pFacility->FCLT_TYPE + pFacility->FCLT_ID);
+            if (!pRegFacility)
+            {
+                pFacility->Deleted = "Y";
+            }
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+    try
+    {
+        FRegLists.Lock();
+        FOR_STL(TItsRegFacility *, pRegFacility, FRegLists)
+        {
+            TItsFacility *pFacility = FLists.Find(pRegFacility->Id);
+            if (!pFacility)
+            {
+                pRegFacility->UnRegisterd = "Y";
+            }
+        }
+    }
+    __finally
+    {
+        FRegLists.UnLock();
+    }
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityReg(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+            sQry = "SELECT '' AS FAC_TYPE, '' AS FAC_ID, '' AS FAC_NM, '' AS DEL_YN                             \r\n"
+                   "  FROM DUAL                                                                                 \r\n"
+                   " WHERE 1 = 0                                                                                \r\n"
+#ifdef USE_CCTV
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'CCTV' AS FAC_TYPE, CCTV_CTLR_ID AS FAC_ID, ISTL_LCTN_NM AS FAC_NM, DEL_YN           \r\n"
+                   "  FROM TB_CCTV_CTLR                                                                         \r\n"
+                   " WHERE DEL_YN = 'N'                                                                         \r\n"
+#endif
+#ifdef USE_WCAM
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'WCAM' AS FAC_TYPE, WEB_CMRA_ID AS FAC_ID, ISTL_LCTN_NM AS FAC_NM, DEL_YN            \r\n"
+                   "  FROM TB_WEB_CMRA                                                                          \r\n"
+                   " WHERE DEL_YN = 'N'                                                                         \r\n"
+#endif
+#ifdef USE_VMS
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'VMS'  AS FAC_TYPE, VMS_CTLR_ID  AS FAC_ID, VMS_NM AS FAC_NM, DEL_YN                 \r\n"
+                   "  FROM TB_VMS_CTLR                                                                          \r\n"
+                   " WHERE DEL_YN = 'N'                                                                         \r\n"
+#endif
+#ifdef USE_AVI
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'AVI' AS FAC_TYPE, AVI_ID AS FAC_ID, AVI_LCTN_NM AS FAC_NM, DEL_YN                   \r\n"
+                   "  FROM TB_AVI_CTLR                                                                          \r\n"
+                   " WHERE DEL_YN = 'N'                                                                         \r\n"
+#endif
+#ifdef USE_VDS
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'VDS' AS FAC_TYPE, VDS_CTLR_ID AS FAC_ID, LCTN AS FAC_N, DEL_YN                      \r\n"
+                   "  FROM TB_VDS_CTLR                                                                          \r\n"
+                   " WHERE DEL_YN = 'N'                                                                         \r\n"
+#endif
+#ifdef USE_DSRC
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'DSRC' AS FAC_TYPE, RSE_ID AS FAC_ID, ISTL_LCTN_NM AS FAC_NM, DEL_YN                 \r\n"
+                   "  FROM TB_RSE_MSTR                                                                          \r\n"
+                   " WHERE DEL_YN = 'N'                                                                         \r\n"
+#endif
+#ifdef USE_BIT
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'BIT' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID, FCLT_LCTN AS FAC_NM, 'N' AS DEL_YN    \r\n"
+                   "  FROM VW_BIT                                                                               \r\n"
+#if 0
+                   "SELECT 'BIT' AS FAC_TYPE, TO_CHAR(A.BIT_ID) AS FAC_ID, B.STOP_NAME AS FAC_NM,               \r\n"
+                   "       'N' AS DEL_YN                                                                        \r\n"
+                   "  FROM BIT A, BUSSTOP B                                                                     \r\n"
+                   " WHERE 1=1                                                                                  \r\n"
+                   "   AND A.INSTALL_STOP_ID = B.STOP_ID                                                        \r\n"
+                   "   AND B.USE_FLAG = '1'                                                                     \r\n"
+#endif
+#endif
+#ifdef USE_SIG
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'SIG' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID, FCLT_LCTN AS FAC_NM, 'N' AS DEL_YN    \r\n"
+                   "  FROM VW_SIG_CTLR                                                                          \r\n"
+#endif
+#ifdef USE_PVMS
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'PVMS' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID, FCLT_LCTN AS FAC_NM, 'N' AS DEL_YN   \r\n"
+                   "  FROM VW_PIS_VMS                                                                           \r\n"
+#endif
+#ifdef USE_PVDS
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'PVDS' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID, FCLT_LCTN AS FAC_NM, 'N' AS DEL_YN   \r\n"
+                   "  FROM VW_PIS_CONT                                                                          \r\n"
+#endif
+#ifdef USE_SIGDET
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'LVD' AS FAC_TYPE, FCLT_ID AS FAC_ID, FCLT_LCTN AS FAC_NM, 'N' AS DEL_YN             \r\n"
+                   "  FROM VW_SIG_LVDS                                                                          \r\n"
+#endif
+#ifdef USE_RSE
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'RSE' AS FAC_TYPE, RSEID AS FAC_ID, LOCATION AS FAC_NM, 'N' AS DEL_YN                \r\n"
+                   "  FROM RSEMST                                                                               \r\n"
+#endif
+#ifdef USE_PARK
+                   "UNION                                                                                       \r\n"
+                   "SELECT 'PARK' AS FAC_TYPE, CTLR_MNGM_NMBR AS FAC_ID, CTLR_MNGM_NM AS FAC_NM, DEL_YN         \r\n"
+                   "  FROM TB_PRLT_CTLR                                                                         \r\n"
+                   " WHERE DEL_YN = 'N'                                                                         \r\n"
+#endif
+                    ;
+    try
+    {
+        FRegLists.Lock();
+        //FRegLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsRegFacility *pRegFacility = new TItsRegFacility();
+
+                pRegFacility->Type  = pADO->FieldByName("FAC_TYPE")->AsString;
+                pRegFacility->Id    = pADO->FieldByName("FAC_ID")->AsString;
+                pRegFacility->Name  = pADO->FieldByName("FAC_NM")->AsString;
+                pRegFacility->DelYn = pADO->FieldByName("DEL_YN")->AsString;
+
+                pRegFacility->GridIndex = -1;
+
+				FRegLists.Push(pRegFacility->Type + pRegFacility->Id, pRegFacility);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityReg", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityReg", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FRegLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsFacilityManager::LoadFacilityMaster(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                     \r\n"
+           "  FROM TB_FCLT_INFR          \r\n"
+           " WHERE DEL_YN = 'N'          \r\n";
+//           " ORDER BY FCLT_TYPE, FCLT_ID \r\n";
+    try
+    {
+        TFacilityStatus *pStatus;
+        FListStatus.Lock();
+        FListStatus.RemoveAll();
+
+        FLists.Lock();
+        //FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsFacility *pFacility = new TItsFacility();
+
+                pFacility->FCLT_ID         = pADO->FieldByName("FCLT_ID")->AsString;
+                pFacility->RFID_ID         = pADO->FieldByName("RFID_ID")->AsString;
+                pFacility->FCLT_TYPE       = pADO->FieldByName("FCLT_TYPE")->AsString;
+                pFacility->FCLT_LCTN       = pADO->FieldByName("FCLT_LCTN")->AsString;
+                pFacility->RSCE_YN         = pADO->FieldByName("RSCE_YN")->AsString;
+                pFacility->MDL_NM          = pADO->FieldByName("MDL_NM")->AsString;
+                pFacility->USE_YEAR        = pADO->FieldByName("USE_YEAR")->AsString;
+                if (pFacility->USE_YEAR == "") pFacility->USE_YEAR = "0";
+                pFacility->INWR_DT         = pADO->FieldByName("INWR_DT")->AsString;
+                pFacility->OTWR_DT         = pADO->FieldByName("OTWR_DT")->AsString;
+                pFacility->ISTL_DT         = pADO->FieldByName("ISTL_DT")->AsString;
+                pFacility->TAKT_DT         = pADO->FieldByName("TAKT_DT")->AsString;
+                pFacility->TAKT_RESN       = pADO->FieldByName("TAKT_RESN")->AsString;
+                pFacility->TAKN_DT         = pADO->FieldByName("TAKN_DT")->AsString;
+                pFacility->ABDN_DT         = pADO->FieldByName("ABDN_DT")->AsString;
+                pFacility->ADTN_NM         = pADO->FieldByName("ADTN_NM")->AsString;
+                pFacility->ADTN_DT         = pADO->FieldByName("ADTN_DT")->AsString;
+                pFacility->CHNG_NM         = pADO->FieldByName("CHNG_NM")->AsString;
+                pFacility->CHNG_DT         = pADO->FieldByName("CHNG_DT")->AsString;
+                pFacility->AMT             = pADO->FieldByName("AMT")->AsString;
+                pFacility->DEL_YN          = pADO->FieldByName("DEL_YN")->AsString;
+                pFacility->ISTL_CMPY_ID    = pADO->FieldByName("ISTL_CMPY_ID")->AsString;
+                pFacility->MNFC_CMPY_ID    = pADO->FieldByName("MNFC_CMPY_ID")->AsString;
+
+                pFacility->ISTL_LCTN_ADDR  = pADO->FieldByName("ISTL_LCTN_ADDR")->AsString;
+
+                pFacility->Sts00 = "-";
+
+                pFacility->GridIndex       = -1;	    // 메인폼에 뿌려지는 그리드 인덱스
+                pFacility->StatusGridIndex = -1;
+
+				FLists.Push(pFacility->FCLT_ID, pFacility);
+                pFacility->Completed = true;
+
+                pStatus = FListStatus.Find(pFacility->FCLT_TYPE);
+                if (!pStatus)
+                {
+                    pStatus = new TFacilityStatus();
+                    pStatus->Type   = pFacility->FCLT_TYPE;
+                    pStatus->Total  = 0;
+                    pStatus->Normal = 0;
+                    pStatus->Error  = 0;
+                    pStatus->Module = 0;
+                    pStatus->Collect= 0;
+
+                    FListStatus.Push(pFacility->FCLT_TYPE, pStatus);
+                }
+                pStatus->Total++;   /* 전체 갯수를 증가 시킴 */
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityMaster", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityMaster", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+
+        FListStatus.UnLock();
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityWebCam(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_WCAM
+    return true;
+#endif
+    sQry = "SELECT A.WEB_CMRA_NMBR,                     \r\n"
+           "       A.WEB_CMRA_ID,                       \r\n"
+           "       A.CMRA_IP,                           \r\n"
+           "       A.CMRA_PORT,                         \r\n"
+           "       A.STRM_SVR_IP,                       \r\n"
+           "       A.STRM_SVR_PORT,                     \r\n"
+           "       A.STRM_SESN_NM,                      \r\n"
+           "       A.X_CRDN,                            \r\n"
+           "       A.Y_CRDN,                            \r\n"
+           "       A.ISTL_LCTN_NM,                      \r\n"
+           "       A.ISTL_LCTN_ADDR,                    \r\n"
+           "       A.EQPM_KIND,                         \r\n"
+           "       A.DEL_YN,                            \r\n"
+           "       A.LINK_ID,                           \r\n"
+           "       B.STRM_RTSP_ADDR,                    \r\n"
+           "       B.STRM_RTMP_ADDR,                    \r\n"
+           "       B.STRM_HTTP_ADDR,                    \r\n"
+           "       B.STRM_STOR_ADDR                     \r\n"
+           "  FROM TB_WEB_CMRA A,                       \r\n"
+           "       TB_WEB_CMRA_STRM B                   \r\n"
+           " WHERE DEL_YN = 'N'                         \r\n"
+           "   AND A.WEB_CMRA_NMBR = B.WEB_CMRA_NMBR(+) \r\n";
+           //" ORDER BY A.WEB_CMRA_NMBR  \r\n";
+    try
+    {
+        FWebCamLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsWebCam *pObj = new TItsWebCam();
+
+                pObj->WEB_CMRA_NMBR     = pADO->FieldByName("WEB_CMRA_NMBR")->AsString;
+                pObj->WEB_CMRA_ID       = pADO->FieldByName("WEB_CMRA_ID")->AsString;
+                pObj->CMRA_IP           = pADO->FieldByName("CMRA_IP")->AsString;
+                pObj->CMRA_PORT         = pADO->FieldByName("CMRA_PORT")->AsString;
+                pObj->STRM_SVR_IP       = pADO->FieldByName("STRM_SVR_IP")->AsString;
+                pObj->STRM_SVR_PORT     = pADO->FieldByName("STRM_SVR_PORT")->AsString;
+                pObj->STRM_SESN_NM      = pADO->FieldByName("STRM_SESN_NM")->AsString;
+                pObj->X_CRDN            = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN            = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->ISTL_LCTN_NM      = pADO->FieldByName("ISTL_LCTN_NM")->AsString;
+                pObj->ISTL_LCTN_ADDR    = pADO->FieldByName("ISTL_LCTN_ADDR")->AsString;
+                pObj->EQPM_KIND         = pADO->FieldByName("EQPM_KIND")->AsString;
+                pObj->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->LINK_ID           = pADO->FieldByName("LINK_ID")->AsString;
+                pObj->STRM_RTSP_ADDR    = pADO->FieldByName("STRM_RTSP_ADDR")->AsString;
+                pObj->STRM_RTMP_ADDR    = pADO->FieldByName("STRM_RTMP_ADDR")->AsString;
+                pObj->STRM_HTTP_ADDR    = pADO->FieldByName("STRM_HTTP_ADDR")->AsString;
+                pObj->STRM_STOR_ADDR    = pADO->FieldByName("STRM_STOR_ADDR")->AsString;
+
+                pObj->ID                = "admin";
+                pObj->PSWD              = "4321";
+
+                pObj->FData1            = NULL;
+                pObj->FData2            = NULL;
+
+				FWebCamLists.Push(pObj->WEB_CMRA_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityWebCam", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityWebCam", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FWebCamLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityCctv(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_CCTV
+    return true;
+#endif
+    sQry = "SELECT CCTV_MNGM_NMBR,         \r\n"
+           "       CCTV_CTLR_ID,           \r\n"
+           "       CCTV_CTLR_IP,           \r\n"
+           "       CCTV_CTLR_PORT,         \r\n"
+           "       CCTV_CAPT_IP,           \r\n"
+           "       CCTV_CAPT_PORT,         \r\n"
+           "       CCTV_FIBR_IP,           \r\n"
+           "       CCTV_ENCD_IP,           \r\n"
+           "       STRM_SVR_IP,            \r\n"
+           "       STRM_SVR_PORT,          \r\n"
+           "       STRM_SESN_NM,           \r\n"
+           "       NVL(X_CRDN, 0) X_CRDN,  \r\n"
+           "       NVL(Y_CRDN, 0) Y_CRDN,  \r\n"
+           "       ISTL_LCTN_NM,           \r\n"
+           "       ISTL_LCTN_ADDR,         \r\n"
+           "       CCTV_CHNL,              \r\n"
+           "       DEL_YN,                 \r\n"
+           "       FRST_REGR_NMBR,         \r\n"
+           "       FRST_RGST_DT,           \r\n"
+           "       LAST_CRPR_NMBR,         \r\n"
+           "       LAST_CRCT_DT,           \r\n"
+           "       LINK_ID,                \r\n"
+           "       CCTV_ID,                \r\n"
+           "       RELY_PORT,              \r\n"
+           "       STRM_RTSP_ADDR,         \r\n"
+           "       STRM_RTMP_ADDR,         \r\n"
+           "       STRM_HTTP_ADDR,         \r\n"
+           "       CCTV_TYPE               \r\n"
+           "  FROM TB_CCTV_CTLR            \r\n"
+           " WHERE DEL_YN = 'N'            \r\n";
+           //" ORDER BY CCTV_CTLR_ID         \r\n";
+    try
+    {
+        FLocalCctvCnt = 0;
+        FCctvLists.Lock();
+        //FCctvLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsCctv *pObj = new TItsCctv();
+
+                pObj->CCTV_MNGM_NMBR    = pADO->FieldByName("CCTV_MNGM_NMBR")->AsString;
+                pObj->CCTV_CTLR_ID      = pADO->FieldByName("CCTV_CTLR_ID")->AsString;
+                pObj->CCTV_CTLR_IP      = pADO->FieldByName("CCTV_CTLR_IP")->AsString;
+                pObj->CCTV_CTLR_PORT    = pADO->FieldByName("CCTV_CTLR_PORT")->AsString;
+                pObj->CCTV_CAPT_IP      = pADO->FieldByName("CCTV_CAPT_IP")->AsString;
+                pObj->CCTV_CAPT_PORT    = pADO->FieldByName("CCTV_CAPT_PORT")->AsString;
+                pObj->CCTV_FIBR_IP      = pADO->FieldByName("CCTV_FIBR_IP")->AsString;
+                pObj->CCTV_ENCD_IP      = pADO->FieldByName("CCTV_ENCD_IP")->AsString;
+                pObj->STRM_SVR_IP       = pADO->FieldByName("STRM_SVR_IP")->AsString;
+                pObj->STRM_SVR_PORT     = pADO->FieldByName("STRM_SVR_PORT")->AsString;
+                pObj->STRM_SESN_NM      = pADO->FieldByName("STRM_SESN_NM")->AsString;
+                pObj->X_CRDN            = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN            = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->ISTL_LCTN_NM      = pADO->FieldByName("ISTL_LCTN_NM")->AsString;
+                pObj->ISTL_LCTN_ADDR    = pADO->FieldByName("ISTL_LCTN_ADDR")->AsString;
+                pObj->CCTV_CHNL         = pADO->FieldByName("CCTV_CHNL")->AsString;
+                pObj->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->FRST_REGR_NMBR    = pADO->FieldByName("FRST_REGR_NMBR")->AsString;
+                pObj->FRST_RGST_DT      = pADO->FieldByName("FRST_RGST_DT")->AsString;
+                pObj->LAST_CRPR_NMBR    = pADO->FieldByName("LAST_CRPR_NMBR")->AsString;
+                pObj->LAST_CRCT_DT      = pADO->FieldByName("LAST_CRCT_DT")->AsString;
+                pObj->LINK_ID           = pADO->FieldByName("LINK_ID")->AsString;
+                pObj->CCTV_ID           = pADO->FieldByName("CCTV_ID")->AsString;
+                pObj->RELY_PORT         = pADO->FieldByName("RELY_PORT")->AsString;
+                pObj->STRM_RTSP_ADDR    = pADO->FieldByName("STRM_RTSP_ADDR")->AsString;
+                pObj->STRM_RTMP_ADDR    = pADO->FieldByName("STRM_RTMP_ADDR")->AsString;
+                pObj->STRM_HTTP_ADDR    = pADO->FieldByName("STRM_HTTP_ADDR")->AsString;
+                pObj->CCTV_TYPE         = pADO->FieldByName("CCTV_TYPE")->AsString;
+
+                pObj->FData1            = NULL;
+                pObj->FData2            = NULL;
+
+				FCctvLists.Push(pObj->CCTV_CTLR_ID, pObj);
+
+                if (pObj->CCTV_CTLR_ID.Pos(CenterId)) 
+                {
+                    pObj->LOCAL_YN = "Y";
+                    FLocalCctvCnt++;
+                }
+                else
+                {
+                    pObj->LOCAL_YN = "N";
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityCctv", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityCctv", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FCctvLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityVms(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_VMS
+    return true;
+#endif
+
+#if 0
+           "       scp.dec_b64('DAMO','SCP','ARIA_256.SCPS', WEB_CMRA_PWD) AS WEB_CMRA_PWD,               \r\n"
+#endif
+
+#if 0
+    sQry = "SELECT A.*,                                        \r\n"
+           "       (SELECT NVL(ATRB1, '320')                   \r\n"
+           "          FROM TB_CMMN_CD                          \r\n"
+           "         WHERE CMMN_CLSF_CD = 'VMP'                \r\n"
+           "           AND CMMN_CD = A.VMS_TYPE_CD) AS FORMW,  \r\n"
+           "       (SELECT NVL(ATRB2,  '64')                   \r\n"
+           "          FROM TB_CMMN_CD                          \r\n"
+           "         WHERE CMMN_CLSF_CD = 'VMP'                \r\n"
+           "           AND CMMN_CD = A.VMS_TYPE_CD) AS FORMH   \r\n"
+           "  FROM TB_VMS_CTLR A                               \r\n";
+           " WHERE DEL_YN = 'N'                                \r\n";
+#else
+    #if 0
+        //FOR 남양주???
+        sQry = "SELECT A.*,                                             \r\n"
+               "       (SELECT NVL(VMS_WDTH, 320)                       \r\n"
+               "          FROM TB_VMS_TYPE                              \r\n"
+               "         WHERE VMS_TYPE_CD = A.VMS_TYPE_CD) AS FORMW,   \r\n"
+               "       (SELECT NVL(VMS_HGHT,  64)                       \r\n"
+               "          FROM TB_VMS_TYPE                              \r\n"
+               "         WHERE VMS_TYPE_CD = A.VMS_TYPE_CD) AS FORMH,   \r\n"
+               "       (SELECT NVL(MODL_ROW_NUM, 2)                     \r\n"
+               "          FROM TB_VMS_TYPE                              \r\n"
+               "         WHERE VMS_TYPE_CD = A.VMS_TYPE_CD) AS MODV,    \r\n"
+               "       (SELECT NVL(MODL_COL_NUM,  12)                   \r\n"
+               "          FROM TB_VMS_TYPE                              \r\n"
+               "         WHERE VMS_TYPE_CD = A.VMS_TYPE_CD) AS MODH     \r\n"
+               "  FROM TB_VMS_CTLR A                                    \r\n";
+               " WHERE DEL_YN = 'N'                                     \r\n";
+    #else
+        sQry = "SELECT A.*,                           \r\n"
+               "       B.VMS_WDTH AS FORMW,           \r\n"
+               "       B.VMS_HGHT AS FORMH,           \r\n"
+               "       B.MODL_ROW_NUM AS MODV,        \r\n"
+               "       B.MODL_COL_NUM AS MODH         \r\n"
+               "  FROM TB_VMS_CTLR A, TB_VMS_TYPE B   \r\n"
+               " WHERE A.DEL_YN = 'N'                 \r\n"
+               "   AND A.VMS_TYPE_CD = B.VMS_TYPE_CD  \r\n";
+    #endif
+#endif
+    try
+    {
+        FVmsLists.Lock();
+        //FVmsLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsVms *pObj = new TItsVms();
+
+                pObj->VMS_CTLR_NMBR         = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
+                pObj->VMS_ID                = pADO->FieldByName("VMS_ID")->AsString;
+                pObj->VMS_CTLR_ID           = pADO->FieldByName("VMS_CTLR_ID")->AsString;
+                pObj->VMS_NM                = pADO->FieldByName("VMS_NM")->AsString;
+                pObj->VMS_CTLR_IP           = pADO->FieldByName("VMS_CTLR_IP")->AsString;
+                pObj->VMS_USAG_TYPE_CD      = pADO->FieldByName("VMS_USAG_TYPE_CD")->AsString;
+                pObj->VMS_FRM_TYPE_CD       = pADO->FieldByName("VMS_FRM_TYPE_CD")->AsString;
+                pObj->VMS_TYPE_CD           = pADO->FieldByName("VMS_TYPE_CD")->AsString;
+                pObj->VMS_MODL_TYPE_CD      = pADO->FieldByName("VMS_MODL_TYPE_CD")->AsString;
+                pObj->VMS_CMNC_PORT         = pADO->FieldByName("VMS_CMNC_PORT")->AsString;
+                pObj->OPER_MODE             = pADO->FieldByName("OPER_MODE")->AsString;
+                pObj->VMS_CMNC_ERR_BASS_VAL = pADO->FieldByName("VMS_CMNC_ERR_BASS_VAL")->AsString;
+                pObj->VMS_NGHT_BRGH_STEP    = pADO->FieldByName("VMS_NGHT_BRGH_STEP")->AsString;
+                pObj->VMS_WEEK_BRGH_STEP    = pADO->FieldByName("VMS_WEEK_BRGH_STEP")->AsString;
+                pObj->VMS_PHSE_CHNG_CYCL    = pADO->FieldByName("VMS_PHSE_CHNG_CYCL")->AsString;
+                pObj->VMS_MODL_ERR_RATE     = pADO->FieldByName("VMS_MODL_ERR_RATE")->AsString;
+                pObj->CMNCFAIL_SLOT_NMBR    = pADO->FieldByName("CMNCFAIL_SLOT_NMBR")->AsString;
+                pObj->PWER_FAIL_SLOT_NMBR   = pADO->FieldByName("PWER_FAIL_SLOT_NMBR")->AsString;
+                pObj->DEL_YN                = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->CMTRINFR_CNCT_YN      = pADO->FieldByName("CMTRINFR_CNCT_YN")->AsString;
+                pObj->WTHRINFR_CNCT_YN      = pADO->FieldByName("WTHRINFR_CNCT_YN")->AsString;
+                pObj->ENVRINFR_CNCT_YN      = pADO->FieldByName("ENVRINFR_CNCT_YN")->AsString;
+                pObj->VMS_MAX_PHSE_NUM      = pADO->FieldByName("VMS_MAX_PHSE_NUM")->AsString;
+                pObj->FRST_REGR_NMBR        = pADO->FieldByName("FRST_REGR_NMBR")->AsString;
+                pObj->FRST_RGST_DT          = pADO->FieldByName("FRST_RGST_DT")->AsString;
+                pObj->LAST_CRPR_NMBR        = pADO->FieldByName("LAST_CRPR_NMBR")->AsString;
+                pObj->LAST_CRCT_DT          = pADO->FieldByName("LAST_CRCT_DT")->AsString;
+                pObj->PANL_ON_TIME          = pADO->FieldByName("PANL_ON_TIME")->AsString;
+                pObj->PANL_OFF_TIME         = pADO->FieldByName("PANL_OFF_TIME")->AsString;
+                pObj->PANL_PWER_MODE        = pADO->FieldByName("PANL_PWER_MODE")->AsString;
+                pObj->BRGH_MODE             = pADO->FieldByName("BRGH_MODE")->AsString;
+                pObj->WEB_CMRA_IP           = pADO->FieldByName("WEB_CMRA_IP")->AsString;
+                pObj->X_CRDN                = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN                = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->ISTL_LCTN_NM          = pADO->FieldByName("ISTL_LCTN_NM")->AsString;
+                pObj->TRFC_STRG_USE_YN      = pADO->FieldByName("TRFC_STRG_USE_YN")->AsString;
+
+#if 1
+                //FOR 남양주???
+                pObj->VMS_LOC_IFSC_ID = pADO->FieldByName("WEB_CMRA_PORT")->AsString.Trim();
+                pObj->FAN_MTNS_TMPR   = pADO->FieldByName("WEB_CMRA_PORT")->AsString.Trim();
+                pObj->HETR_MTNS_TMPR  = pADO->FieldByName("WEB_CMRA_PORT")->AsString.Trim();
+#endif
+                pObj->WEB_CMRA_PORT = pADO->FieldByName("WEB_CMRA_PORT")->AsString.Trim();
+                pObj->WEB_CMRA_ID   = pADO->FieldByName("WEB_CMRA_ID")->AsString.Trim();
+                pObj->WEB_CMRA_PWD  = pADO->FieldByName("WEB_CMRA_PWD")->AsString.Trim();
+                pObj->STRM_SESN_NM  = pADO->FieldByName("STRM_SESN_NM")->AsString.Trim();
+
+                pObj->WIDTH  = pADO->FieldByName("FORMW")->AsInteger;
+                pObj->HEIGHT = pADO->FieldByName("FORMH")->AsInteger;
+
+                pObj->ModVerCnt = pADO->FieldByName("MODV")->AsInteger;
+                pObj->ModHorCnt = pADO->FieldByName("MODH")->AsInteger;
+
+                pObj->FData1 = NULL;
+                pObj->FData2 = NULL;
+
+
+				//FVmsLists.Push(pObj->VMS_CTLR_NMBR, pObj);
+				FVmsLists.Push(pObj->VMS_CTLR_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityVms", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityVms", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FVmsLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityRse(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_RSE
+    return true;
+#endif
+    sQry = "SELECT RSEID,                    \r\n"
+           "       INSTDT,                   \r\n"
+           "       CITYCD,                   \r\n"
+           "       REGIONCD,                 \r\n"
+           "       AREACD,                   \r\n"
+           "       RSEIP,                    \r\n"
+           "       (COORDX/10000000) COORDX, \r\n"
+           "       (COORDY/10000000) COORDY, \r\n"
+           "       RADIUS1,                  \r\n"
+           "       RADIUS2,                  \r\n"
+           "       COMPCD,                   \r\n"
+           "       LOCATION,                 \r\n"
+           "       RSECONFIGID,              \r\n"
+           "       OBEPARAMID,               \r\n"
+           "       PORT,                     \r\n"
+           "       BRIDGE,                   \r\n"
+           "       COMYN                     \r\n"
+           "  FROM RSEMST                    \r\n";
+           //" ORDER BY RSEID                  \r\n";
+
+    try
+    {
+        FRseLists.Lock();
+        //FRseLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsRse *pObj = new TItsRse();
+
+                pObj->RSEID		    = pADO->FieldByName("RSEID")->AsString;
+                //pObj->INSTDT		= pADO->FieldByName("INSTDT")->AsString;
+                pObj->CITYCD		= pADO->FieldByName("CITYCD")->AsString;
+                pObj->REGIONCD		= pADO->FieldByName("REGIONCD")->AsString;
+                pObj->AREACD		= pADO->FieldByName("AREACD")->AsString;
+                pObj->RSEIP		    = pADO->FieldByName("RSEIP")->AsString;
+                pObj->COORDX		= pADO->FieldByName("COORDX")->AsString;
+                pObj->COORDY		= pADO->FieldByName("COORDY")->AsString;
+                pObj->RADIUS1		= pADO->FieldByName("RADIUS1")->AsString;
+                pObj->RADIUS2		= pADO->FieldByName("RADIUS2")->AsString;
+                //pObj->COMPCD		= pADO->FieldByName("COMPCD")->AsString;
+                pObj->LOCATION		= pADO->FieldByName("LOCATION")->AsString;
+                //pObj->RSECONFIGID	= pADO->FieldByName("RSECONFIGID")->AsString;
+                //pObj->OBEPARAMID	= pADO->FieldByName("OBEPARAMID")->AsString;
+                //pObj->PORT		    = pADO->FieldByName("PORT")->AsString;
+                //pObj->BRIDGE		= pADO->FieldByName("BRIDGE")->AsString;
+                pObj->COMYN		    = pADO->FieldByName("COMYN")->AsString;
+
+				FRseLists.Push(pObj->RSEID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityRse", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityRse", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FRseLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityVds(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_VDS
+    return true;
+#endif
+    sQry = "SELECT CTLR_MNGM_NMBR,   \r\n"
+           "       CTLR_TYPE_CD,     \r\n"
+           "       VALD_YN,          \r\n"
+           "       X_CRDN,           \r\n"
+           "       Y_CRDN,           \r\n"
+           "       LCTN,             \r\n"
+           "       TRMN_IP,          \r\n"
+           "       TRMN_PORT,        \r\n"
+           "       CTLR_CLCT_CYCL,   \r\n"
+           "       CTLR_STTS_CYCL,   \r\n"
+           "       LOOP_BORD_NUM,    \r\n"
+           "       DLTR_NMBR,        \r\n"
+           "       DEL_DT,           \r\n"
+           "       DEL_YN,           \r\n"
+           "       FRST_REGR_NMBR,   \r\n"
+           "       FRST_RGST_DT,     \r\n"
+           "       LAST_CRPR_NMBR,   \r\n"
+           "       LAST_CRCT__DT,    \r\n"
+           "       VDS_CTLR_ID       \r\n"
+           "  FROM TB_VDS_CTLR       \r\n";
+           //" ORDER BY CTLR_MNGM_NMBR \r\n";
+
+    try
+    {
+        FVdsLists.Lock();
+        //FVdsLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsVds *pObj = new TItsVds();
+
+                pObj->CTLR_MNGM_NMBR    = pADO->FieldByName("CTLR_MNGM_NMBR")->AsString;
+                pObj->CTLR_TYPE_CD      = pADO->FieldByName("CTLR_TYPE_CD")->AsString;
+                pObj->VALD_YN           = pADO->FieldByName("VALD_YN")->AsString;
+                pObj->X_CRDN            = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN            = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->LCTN              = pADO->FieldByName("LCTN")->AsString;
+                pObj->TRMN_IP           = pADO->FieldByName("TRMN_IP")->AsString;
+                pObj->TRMN_PORT         = pADO->FieldByName("TRMN_PORT")->AsString;
+                pObj->CTLR_CLCT_CYCL    = pADO->FieldByName("CTLR_CLCT_CYCL")->AsString;
+                pObj->CTLR_STTS_CYCL    = pADO->FieldByName("CTLR_STTS_CYCL")->AsString;
+                pObj->LOOP_BORD_NUM     = pADO->FieldByName("LOOP_BORD_NUM")->AsString;
+                pObj->DLTR_NMBR         = pADO->FieldByName("DLTR_NMBR")->AsString;
+                pObj->DEL_DT            = pADO->FieldByName("DEL_DT")->AsString;
+                pObj->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->FRST_REGR_NMBR    = pADO->FieldByName("FRST_REGR_NMBR")->AsString;
+                pObj->FRST_RGST_DT      = pADO->FieldByName("FRST_RGST_DT")->AsString;
+                pObj->LAST_CRPR_NMBR    = pADO->FieldByName("LAST_CRPR_NMBR")->AsString;
+                pObj->LAST_CRCT__DT     = pADO->FieldByName("LAST_CRCT__DT")->AsString;
+                pObj->VDS_CTLR_ID       = pADO->FieldByName("VDS_CTLR_ID")->AsString;
+
+				//FVdsLists.Push(pObj->CTLR_MNGM_NMBR, pObj);
+				FVdsLists.Push(pObj->VDS_CTLR_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityVds", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityVds", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FVdsLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityAvi(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_AVI
+    return true;
+#endif
+    sQry = "SELECT AVI_CTLR_MNGM_NMBR,   \r\n"
+           "       AVI_ID,               \r\n"
+           "       LINK_ID,              \r\n"
+           "       AVI_LCTN_NM,          \r\n"
+           "       AVI_VALD_YN,          \r\n"
+           "       AVI_CTLR_IP,          \r\n"
+           "       AVI_CTLR_CMNC_PORT,   \r\n"
+           "       AVI_MAIN_CTLR_YN,     \r\n"
+           "       AVI_MNGM_LANE_NUM,    \r\n"
+           "       AVI_CMRA_NUM,         \r\n"
+           "       AVI_DTCT_NUM,         \r\n"
+           "       AVI_DTCT_NM,          \r\n"
+           "       AVI_CLCT_CYCL,        \r\n"
+           "       AVI_LAMP_AUTO_YN,     \r\n"
+           "       AVI_LAMP_ON_HMS,      \r\n"
+           "       AVI_LAMP_OFF_HMS,     \r\n"
+           "       AVI_LAMP_ON_YN,       \r\n"
+           "       X_CRDN,               \r\n"
+           "       Y_CRDN,               \r\n"
+           "       RMRK,                 \r\n"
+           "       DEL_YN,               \r\n"
+           "       FRST_REGR_NMBR,       \r\n"
+           "       FRST_RGST_DT,         \r\n"
+           "       LAST_CRPR_NMBR,       \r\n"
+           "       LAST_CRCT_DT          \r\n"
+           "  FROM TB_AVI_CTLR           \r\n";
+           //" ORDER BY AVI_CTLR_MNGM_NMBR \r\n";
+
+    try
+    {
+        FAviLists.Lock();
+        //FAviLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsAvi *pObj = new TItsAvi();
+
+                pObj->AVI_CTLR_MNGM_NMBR= pADO->FieldByName("AVI_CTLR_MNGM_NMBR")->AsString;
+                pObj->AVI_ID            = pADO->FieldByName("AVI_ID")->AsString;
+                pObj->LINK_ID           = pADO->FieldByName("LINK_ID")->AsString;             
+                pObj->AVI_LCTN_NM       = pADO->FieldByName("AVI_LCTN_NM")->AsString;         
+                pObj->AVI_VALD_YN       = pADO->FieldByName("AVI_VALD_YN")->AsString;         
+                pObj->AVI_CTLR_IP       = pADO->FieldByName("AVI_CTLR_IP")->AsString;         
+                pObj->AVI_CTLR_CMNC_PORT= pADO->FieldByName("AVI_CTLR_CMNC_PORT")->AsString;  
+                pObj->AVI_MAIN_CTLR_YN  = pADO->FieldByName("AVI_MAIN_CTLR_YN")->AsString;    
+                pObj->AVI_MNGM_LANE_NUM = pADO->FieldByName("AVI_MNGM_LANE_NUM")->AsString;   
+                pObj->AVI_CMRA_NUM      = pADO->FieldByName("AVI_CMRA_NUM")->AsString;        
+                pObj->AVI_DTCT_NUM      = pADO->FieldByName("AVI_DTCT_NUM")->AsString;        
+                pObj->AVI_DTCT_NM       = pADO->FieldByName("AVI_DTCT_NM")->AsString;         
+                pObj->AVI_CLCT_CYCL     = pADO->FieldByName("AVI_CLCT_CYCL")->AsString;       
+                pObj->AVI_LAMP_AUTO_YN  = pADO->FieldByName("AVI_LAMP_AUTO_YN")->AsString;    
+                pObj->AVI_LAMP_ON_HMS   = pADO->FieldByName("AVI_LAMP_ON_HMS")->AsString;     
+                pObj->AVI_LAMP_OFF_HMS  = pADO->FieldByName("AVI_LAMP_OFF_HMS")->AsString;    
+                pObj->AVI_LAMP_ON_YN    = pADO->FieldByName("AVI_LAMP_ON_YN")->AsString;      
+                pObj->X_CRDN            = pADO->FieldByName("X_CRDN")->AsString;              
+                pObj->Y_CRDN            = pADO->FieldByName("Y_CRDN")->AsString;              
+                pObj->RMRK              = pADO->FieldByName("RMRK")->AsString;                
+                pObj->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;              
+                pObj->FRST_REGR_NMBR    = pADO->FieldByName("FRST_REGR_NMBR")->AsString;      
+                pObj->FRST_RGST_DT      = pADO->FieldByName("FRST_RGST_DT")->AsString;        
+                pObj->LAST_CRPR_NMBR    = pADO->FieldByName("LAST_CRPR_NMBR")->AsString;      
+                pObj->LAST_CRCT_DT      = pADO->FieldByName("LAST_CRCT_DT")->AsString;        
+
+				//FAviLists.Push(pObj->AVI_CTLR_MNGM_NMBR, pObj);
+				FAviLists.Push(pObj->AVI_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityAvi", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityAvi", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FAviLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityDsrc(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_DSRC
+    return true;
+#endif
+    sQry = "SELECT ID,              \r\n"
+           "       RSE_ID,          \r\n"
+           "       ROAD_SPOT_ID,    \r\n"
+           "       LOG_CNNC_ID,     \r\n"
+           "       LOG_CNNC_PW,     \r\n"
+           "       ISTL_LCTN_NM,    \r\n"
+           "       LCTN_X,          \r\n"
+           "       LCTN_Y,          \r\n"
+           "       IP,              \r\n"
+           "       PORT,            \r\n"
+           "       MNFC_CMPY_CD,    \r\n"
+           "       DEL_YN,          \r\n"
+           "       CLCT_ABNR_BASI   \r\n"
+           "  FROM TB_RSE_MSTR      \r\n";
+           //" ORDER BY ID            \r\n";
+
+    try
+    {
+        FDsrcLists.Lock();
+        //FDsrcLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsDsrc *pObj = new TItsDsrc();
+
+                pObj->ID             = pADO->FieldByName("ID")->AsString;
+                pObj->RSE_ID         = pADO->FieldByName("RSE_ID")->AsString;
+                pObj->ROAD_SPOT_ID   = pADO->FieldByName("ROAD_SPOT_ID")->AsString;
+                pObj->LOG_CNNC_ID    = pADO->FieldByName("LOG_CNNC_ID")->AsString;
+                pObj->LOG_CNNC_PW    = pADO->FieldByName("LOG_CNNC_PW")->AsString;
+                pObj->ISTL_LCTN_NM   = pADO->FieldByName("ISTL_LCTN_NM")->AsString;
+                pObj->LCTN_X         = pADO->FieldByName("LCTN_X")->AsString;
+                pObj->LCTN_Y         = pADO->FieldByName("LCTN_Y")->AsString;
+                pObj->IP             = pADO->FieldByName("IP")->AsString;
+                pObj->PORT           = pADO->FieldByName("PORT")->AsString;
+                pObj->MNFC_CMPY_CD   = pADO->FieldByName("MNFC_CMPY_CD")->AsString;
+                pObj->DEL_YN         = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->CLCT_ABNR_BASI = pADO->FieldByName("CLCT_ABNR_BASI")->AsInteger;
+
+				//FDsrcLists.Push(pObj->ID, pObj);
+				FDsrcLists.Push(pObj->RSE_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityDsrc", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityDsrc", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FDsrcLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityBit(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_BIT
+    return true;
+#endif
+#if 0
+    sQry = "SELECT A.BIT_ID,                      \r\n"
+           "       A.BIT_TYPE,                    \r\n"
+           "       A.FAN_MIN_TEMPERATURE,         \r\n"
+           "       A.FAN_MAX_TEMPERATURE,         \r\n"
+           "       A.HEATER_MIN_TEMPERATURE,      \r\n"
+           "       A.HEATER_MAX_TEMPERATURE,      \r\n"
+           "       A.INSTALL_STOP_ID,             \r\n"
+           "       B.STOP_ID,                     \r\n"
+           "       B.SERVICE_ID,                  \r\n"
+           "       B.STOP_TYPE,                   \r\n"
+           "       B.STOP_NAME,                   \r\n"
+           "       B.STOP_SHORTNAME,              \r\n"
+           "       B.STOP_EXPLAIN,                \r\n"
+           "       B.LAT AS COORDY,               \r\n"
+           "       B.LNG AS COORDX,               \r\n"
+           "       B.LINK_ID,                     \r\n"
+           "       B.USE_FLAG                     \r\n"
+           "  FROM BIT A, BUSSTOP B               \r\n"
+           " WHERE 1=1                            \r\n"
+           "   AND A.INSTALL_STOP_ID = B.STOP_ID  \r\n"
+           "   AND B.USE_FLAG        = '1'        \r\n";
+#else
+    sQry = "SELECT * FROM VW_BIT \r\n";
+#endif
+
+
+    try
+    {
+        FBitLists.Lock();
+        //FBitLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsBit *pObj = new TItsBit();
+
+                pObj->FCLT_ID                = pADO->FieldByName("FCLT_ID")->AsString;
+                pObj->FCLT_LCTN              = pADO->FieldByName("FCLT_LCTN")->AsString;
+                pObj->BIT_ID                 = pADO->FieldByName("BIT_ID")->AsString;
+                pObj->X_CRDN                 = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN                 = pADO->FieldByName("Y_CRDN")->AsString;
+
+                pObj->STOP_ID                = pADO->FieldByName("STOP_ID")->AsString;
+#if 0
+                pObj->BIT_TYPE               = pADO->FieldByName("BIT_TYPE")->AsString;
+                pObj->FAN_MIN_TEMPERATURE    = pADO->FieldByName("FAN_MIN_TEMPERATURE")->AsInteger;
+                pObj->FAN_MAX_TEMPERATURE    = pADO->FieldByName("FAN_MAX_TEMPERATURE")->AsInteger;
+                pObj->HEATER_MIN_TEMPERATURE = pADO->FieldByName("HEATER_MIN_TEMPERATURE")->AsInteger;
+                pObj->HEATER_MAX_TEMPERATURE = pADO->FieldByName("HEATER_MAX_TEMPERATURE")->AsInteger;
+                pObj->INSTALL_STOP_ID        = pADO->FieldByName("INSTALL_STOP_ID")->AsString;
+                pObj->SERVICE_ID             = pADO->FieldByName("SERVICE_ID")->AsString;
+                pObj->STOP_TYPE              = pADO->FieldByName("STOP_TYPE")->AsString;
+                pObj->STOP_NAME              = pADO->FieldByName("STOP_NAME")->AsString;
+                pObj->STOP_SHORTNAME         = pADO->FieldByName("STOP_SHORTNAME")->AsString;
+#endif
+                pObj->STOP_EXPLAIN           = pADO->FieldByName("REMARK")->AsString;
+                pObj->LINK_ID                = pADO->FieldByName("LINK_ID")->AsString;
+
+                pObj->DEL_YN  = "N";
+
+				FBitLists.Push(pObj->FCLT_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityBit", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityBit", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FBitLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilitySig(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_SIG
+    return true;
+#endif
+    sQry = "SELECT * FROM VW_SIG_CTLR      \r\n";
+
+    try
+    {
+        FSigLists.Lock();
+        //FSigLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsSig *pObj = new TItsSig();
+
+                pObj->FCLT_ID       = pADO->FieldByName("FCLT_ID")->AsString;
+                pObj->FCLT_LCTN     = pADO->FieldByName("FCLT_LCTN")->AsString;
+                pObj->SIG_ID        = pADO->FieldByName("FACIL_ID")->AsString;
+                pObj->X_CRDN        = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN        = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->MDL_NM        = pADO->FieldByName("MDL_NM")->AsString;
+
+                pObj->DEL_YN  = "N";
+
+				FSigLists.Push(pObj->FCLT_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilitySig", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilitySig", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FSigLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilitySigDet(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_SIGDET
+    return true;
+#endif
+    sQry = "SELECT * FROM VW_SIG_LVDS      \r\n";
+
+    try
+    {
+        FSigDetLists.Lock();
+        //FSigDetLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsSigDet *pObj = new TItsSigDet();
+
+                pObj->FCLT_ID       = pADO->FieldByName("FCLT_ID")->AsString;
+                pObj->FCLT_LCTN     = pADO->FieldByName("FCLT_LCTN")->AsString;
+                pObj->SDET_ID       = pADO->FieldByName("FACIL_ID")->AsString;
+                pObj->X_CRDN        = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN        = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->MDL_NM        = pADO->FieldByName("MDL_NM")->AsString;
+                pObj->SIG_ID        = pADO->FieldByName("ASSETS_CODE")->AsString;
+
+                pObj->DEL_YN  = "N";
+
+				FSigDetLists.Push(pObj->FCLT_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilitySigDet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilitySigDet", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FSigDetLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityPvms(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_PVMS
+    return true;
+#endif
+    sQry = "SELECT * FROM VW_PIS_VMS \r\n";
+
+
+    try
+    {
+        FPisLists.Lock();
+        //FPisLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsPis *pObj = new TItsPis();
+
+                pObj->FCLT_ID   = pADO->FieldByName("FCLT_ID")->AsString;
+                pObj->FCLT_LCTN = pADO->FieldByName("FCLT_LCTN")->AsString;
+                pObj->PIS_ID    = pADO->FieldByName("FACIL_ID")->AsString;
+                pObj->X_CRDN    = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN    = pADO->FieldByName("Y_CRDN")->AsString;
+
+                pObj->DEL_YN  = "N";
+
+				FPisLists.Push(pObj->FCLT_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityPvms", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityPvms", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FPisLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityPvds(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_PVDS
+    return true;
+#endif
+    sQry = "SELECT * FROM VW_PIS_CONT \r\n";
+
+
+    try
+    {
+        FPcsLists.Lock();
+        //FPcsLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsPcs *pObj = new TItsPcs();
+
+                pObj->FCLT_ID   = pADO->FieldByName("FCLT_ID")->AsString;
+                pObj->FCLT_LCTN = pADO->FieldByName("FCLT_LCTN")->AsString;
+                pObj->PCS_ID    = pADO->FieldByName("FACIL_ID")->AsString;
+                pObj->X_CRDN    = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN    = pADO->FieldByName("Y_CRDN")->AsString;
+
+                pObj->DEL_YN  = "N";
+
+				FPcsLists.Push(pObj->FCLT_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityPvds", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityManager::LoadFacilityPvds", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FPisLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityPark(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_PARK
+    return true;
+#endif
+    sQry = "SELECT A.*,                                    \r\n"
+           "       B.PRLT_MNGM_INTN_NM,                    \r\n"
+           "       B.PRLT_MNGM_INTN_TEL,                   \r\n"
+           "       B.PARK_NDSY_CD,                         \r\n"
+           "       B.PARK_OPER_DAY_CD,                     \r\n"
+           "       B.PARK_WKDY_STRT_HH,                    \r\n"
+           "       B.PARK_WKDY_END_HH,                     \r\n"
+           "       B.PARK_LHDY_STRT_HH,                    \r\n"
+           "       B.PARK_LHDY_END_HH,                     \r\n"
+           "       B.PARK_OPDR_CD,                         \r\n"
+           "       B.PARK_FARE_IMPS_CD,                    \r\n"
+           "       B.PARK_APNT_OFFR_YN                     \r\n"
+           "  FROM TB_PRLT_CTLR      A,                    \r\n"
+           "       TB_PRLT_OPER_INFR B                     \r\n"
+           " WHERE A.DEL_YN         = 'N'                  \r\n"
+           "   AND A.CTLR_MNGM_NMBR = B.CTLR_MNGM_NMBR(+)  \r\n";
+
+    try
+    {
+        FParkLists.Lock();
+        //FParkLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsParking *pObj = new TItsParking();
+
+                pObj->CTLR_MNGM_NMBR    = pADO->FieldByName("CTLR_MNGM_NMBR")->AsString;
+                pObj->PRLT_OPER_DVSN_CD = pADO->FieldByName("PRLT_OPER_DVSN_CD")->AsString;
+                pObj->PRLT_TYPE_DVSN_CD = pADO->FieldByName("PRLT_TYPE_DVSN_CD")->AsString;
+                pObj->VALD_YN           = pADO->FieldByName("VALD_YN")->AsString;
+                pObj->X_CRDN            = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN            = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->ISTL_LCTN_ADDR    = pADO->FieldByName("ISTL_LCTN_ADDR")->AsString;
+                pObj->TRMN_IP           = pADO->FieldByName("TRMN_IP")->AsString;
+                pObj->TRMN_PORT         = pADO->FieldByName("TRMN_PORT")->AsString;
+                pObj->CTLR_CLCT_CYCL    = pADO->FieldByName("CTLR_CLCT_CYCL")->AsString;
+                pObj->CTLR_STTS_CYCL    = pADO->FieldByName("CTLR_STTS_CYCL")->AsString;
+                pObj->WHOL_NPLS         = pADO->FieldByName("WHOL_NPLS")->AsString;
+                pObj->DEL_USER_ID       = pADO->FieldByName("DEL_USER_ID")->AsString;
+                pObj->DEL_DT            = pADO->FieldByName("DEL_DT")->AsString;
+                pObj->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->ADTN_USER_ID      = pADO->FieldByName("ADTN_USER_ID")->AsString;
+                pObj->ADTN_DT           = pADO->FieldByName("ADTN_DT")->AsString;
+                pObj->CHNG_USER_ID      = pADO->FieldByName("CHNG_USER_ID")->AsString;
+                pObj->CHNG_DT           = pADO->FieldByName("CHNG_DT")->AsString;
+                pObj->CTLR_MNGM_NM      = pADO->FieldByName("CTLR_MNGM_NM")->AsString;
+#ifdef USE_PARK_REAL
+                pObj->REAL_DATA_YN      = pADO->FieldByName("REAL_DATA_YN")->AsString;
+#else
+                pObj->REAL_DATA_YN      = "Y";
+#endif
+
+                pObj->PRLT_MNGM_INTN_NM = pADO->FieldByName("PRLT_MNGM_INTN_NM")->AsString;
+                pObj->PRLT_MNGM_INTN_TEL= pADO->FieldByName("PRLT_MNGM_INTN_TEL")->AsString;
+                pObj->PARK_NDSY_CD      = pADO->FieldByName("PARK_NDSY_CD")->AsString;
+                pObj->PARK_OPER_DAY_CD  = pADO->FieldByName("PARK_OPER_DAY_CD")->AsString;
+                pObj->PARK_WKDY_STRT_HH = pADO->FieldByName("PARK_WKDY_STRT_HH")->AsString;
+                pObj->PARK_WKDY_END_HH  = pADO->FieldByName("PARK_WKDY_END_HH")->AsString;
+                pObj->PARK_LHDY_STRT_HH = pADO->FieldByName("PARK_LHDY_STRT_HH")->AsString;
+                pObj->PARK_LHDY_END_HH  = pADO->FieldByName("PARK_LHDY_END_HH")->AsString;
+                pObj->PARK_OPDR_CD      = pADO->FieldByName("PARK_OPDR_CD")->AsString;
+                pObj->PARK_FARE_IMPS_CD = pADO->FieldByName("PARK_FARE_IMPS_CD")->AsString;
+                pObj->PARK_APNT_OFFR_YN = pADO->FieldByName("PARK_APNT_OFFR_YN")->AsString;
+
+				FParkLists.Push(pObj->CTLR_MNGM_NMBR, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadFacilityPark", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadFacilityPark", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FParkLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+            sQry = "SELECT '' AS FAC_TYPE, '' AS FAC_ID,                                             \r\n"
+                   "       '' AS STTS_CD,  '' AS DOOR_STTS_CD,                                       \r\n"
+                   "       DECODE('', 'CMS0', '0', 'CMS1', '1', '2') AS COMM,                        \r\n"
+                   "       DECODE('', 'CDS0', '0', 'CDS1', '1', '0') AS DOOR,                        \r\n"
+                   "       NVL(NULL, 0) AS CBOX_TMPR,                                                \r\n"
+                   "       '' AS STS00,                                                              \r\n"
+                   "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM DUAL                                                                      \r\n"
+                   " WHERE 1 = 0                                                                     \r\n"
+#ifdef USE_CCTV
+                   "UNION                                                                            \r\n"
+                   "SELECT 'CCTV' AS FAC_TYPE, B.CCTV_CTLR_ID AS FAC_ID,                             \r\n"
+                   "       CMNC_STTS_CD AS STTS_CD, CBOX_DOOR_STTS_CD AS DOOR_STTS_CD,               \r\n"
+                   "       DECODE(CMNC_STTS_CD, 'CMS0', '0', 'CMS1', '1', '2') AS COMM,              \r\n"
+                   "       DECODE(CBOX_DOOR_STTS_CD, 'CDS0', '0', 'CDS1', '1', '0') AS DOOR,         \r\n"
+                   "       NVL(A.CBOX_TMPR, 0) AS CBOX_TMPR,                                         \r\n"
+                   "       A.UPDT_DT AS STS00,                                                       \r\n"
+                   "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM TB_CCTV_STTS A, TB_CCTV_CTLR B                                            \r\n"
+                   " WHERE A.CCTV_MNGM_NMBR = B.CCTV_MNGM_NMBR                                       \r\n"
+                   "   AND A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+#endif
+#ifdef USE_WCAM
+                   "UNION                                                                            \r\n"
+                   "SELECT 'WCAM' AS FAC_TYPE, B.WEB_CMRA_ID AS FAC_ID,                              \r\n"
+                   "       CMNC_STTS_CD AS STTS_CD, 'CDS0' AS DOOR_STTS_CD,                          \r\n"
+                   "       DECODE(CMNC_STTS_CD, 'CMS0', '0', 'CMS1', '1', '0') AS COMM,              \r\n"
+                   "       '0' AS DOOR, 0 AS CBOX_TMPR,                                              \r\n"
+                   "       A.UPDT_DT AS STS00,                                                       \r\n"
+                   "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM TB_WEB_CMRA_STTS A, TB_WEB_CMRA B                                         \r\n"
+                   " WHERE A.WEB_CMRA_NMBR = B.WEB_CMRA_NMBR                                         \r\n"
+                   "   AND A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+#endif
+#ifdef USE_VMS
+                   "UNION                                                                            \r\n"
+                   "SELECT 'VMS' AS FAC_TYPE, B.VMS_CTLR_ID AS FAC_ID,                               \r\n"
+                   "       CONN_STTS_CD AS STTS_CD, CBOXDOOR_OPEN_STTS_CD AS DOOR_STTS_CD,           \r\n"
+                   "       DECODE(CONN_STTS_CD, 'CMS0', '0', 'CMS1', '1', '2') AS COMM,              \r\n"
+                   "       DECODE(CBOXDOOR_OPEN_STTS_CD, 'CDS0', '0', 'CDS1', '1', '0') AS DOOR,     \r\n"
+                   "       NVL(A.CBOX_TMPR, 0) AS CBOX_TMPR,                                         \r\n"
+                   "       A.RGST_DT AS STS00,                                                       \r\n"
+                   "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM TB_VMS_STTS_PRST A, TB_VMS_CTLR B                                         \r\n"
+                   " WHERE A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR                                         \r\n"
+                   "   AND A.RGST_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+#endif
+#ifdef USE_VDS
+                   "UNION                                                                            \r\n"
+                   "SELECT 'VDS' AS FAC_TYPE, B.VDS_CTLR_ID AS FAC_ID,                               \r\n"
+                   "       CMNC_STTS_CD AS STTS_CD, CBOX_DOOR_STTS_CD AS DOOR_STTS_CD,               \r\n"
+                   "       DECODE(CMNC_STTS_CD, 'CMS0', '0', 'CMS1', '1', '2') AS COMM,              \r\n"
+                   "       DECODE(CBOX_DOOR_STTS_CD, 'CDS0', '0', 'CDS1', '1', '0') AS DOOR,         \r\n"
+                   "       NVL(A.CBOX_TMPR, 0) AS CBOX_TMPR,                                         \r\n"
+                   "       A.UPDT_DT AS STS00,                                                       \r\n"
+                   "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM TB_VDS_CTLR_STTS A, TB_VDS_CTLR B                                         \r\n"
+                   " WHERE A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+                   "   AND A.CTLR_MNGM_NMBR = B.CTLR_MNGM_NMBR                                       \r\n"
+#endif
+#ifdef USE_AVI
+                   "UNION                                                                            \r\n"
+                   "SELECT 'AVI' AS FAC_TYPE, B.AVI_ID AS FAC_ID,                                    \r\n"
+                   "       CMNC_STTS_CD AS STTS_CD, CBOX_DOOR_STTS_CD AS DOOR_STTS_CD,               \r\n"
+                   "       DECODE(CMNC_STTS_CD, 'CMS0', '0', 'CMS1', '1', '2') AS COMM,              \r\n"
+                   "       DECODE(CBOX_DOOR_STTS_CD, 'CDS0', '0', 'CDS1', '1', '0') AS DOOR,         \r\n"
+                   "       NVL(A.CBOX_TMPR, 0) AS CBOX_TMPR,                                         \r\n"
+                   "       A.UPDT_DT AS STS00,                                                       \r\n"
+                   "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM TB_AVI_CTLR_STTS A, TB_AVI_CTLR B                                         \r\n"
+                   " WHERE A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+                   "   AND A.AVI_CTLR_MNGM_NMBR = B.AVI_CTLR_MNGM_NMBR                               \r\n"
+#endif
+#ifdef USE_DSRC
+                   "UNION                                                                            \r\n"
+                   "SELECT 'DSRC' AS FAC_TYPE, B.RSE_ID AS FAC_ID,                                   \r\n"
+                   "       DECODE(CMNC_STTS, '0', 'CMS0', 'CMS1') AS STTS_CD,                        \r\n"
+                   "       DECODE(CNTL_DEVC_STTS, '0', 'CDS0', '4', 'CDS0', 'CDS1') AS DOOR_STTS_CD, \r\n"
+                   "       DECODE(CMNC_STTS, '0', '0', '1') AS COMM,                                 \r\n"
+                   "       '0' AS DOOR, 0 AS CBOX_TMPR,                                              \r\n"
+                   "       A.CLCT_DT AS STS00,                                                       \r\n"
+                   "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM TB_RSE_STTS_PNST A, TB_RSE_MSTR B                                         \r\n"
+                   " WHERE A.CLCT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+                   "   AND A.ID = B.ID                                                               \r\n"
+#endif
+#ifdef USE_RSE
+                   "UNION                                                                            \r\n"
+                   "SELECT 'RSE' AS FAC_TYPE, B.RSEID AS FAC_ID,                                     \r\n"
+                   "       'CMS0' AS STTS_CD, 'CDS0' AS DOOR_STTS_CD,                                \r\n"
+                   "       '0' AS COMM, '0' AS DOOR, 0 AS CBOX_TMPR,                                 \r\n"
+                   "       TO_CHAR(A.COLLDT, 'YYYYMMDDHH24MISS') AS STS00,                           \r\n"
+                   "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM RSEOPSTATE A, RSEMST B                                                    \r\n"
+                   " WHERE B.RSEID = A.RSEID                                                         \r\n"
+                   "   AND A.COLLDT > SYSDATE - 30/1440                                              \r\n"
+#endif
+#ifdef USE_BIT
+                   "UNION                                                                            \r\n"
+                   "SELECT 'BIT' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID,                            \r\n"
+                   "       CONN_STATE AS STTS_CD, 'CDS0' AS DOOR_STTS_CD,                            \r\n"
+                   "       DECODE(CONN_STATE, 'CMS0', '0', '1') AS COMM,                             \r\n"
+                   "       '0' AS DOOR, 0 AS CBOX_TMPR,                                              \r\n"
+                   "       UPDATE_DT AS STS00,                                                       \r\n"
+                   "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM VW_BIT_STATUS                                                             \r\n"
+#endif
+#ifdef USE_SIG
+                   "UNION                                                                            \r\n"
+                   "SELECT 'SIG' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID,                            \r\n"
+                   "       CONN_STATE AS STTS_CD, DOOR_STATE AS DOOR_STTS_CD,                        \r\n"
+                   "       DECODE(CONN_STATE, 'CMS0', '0', '1') AS COMM,                             \r\n"
+                   "       DECODE(DOOR_STATE, 'CDS0', '0', 'CDS1', '1', '0') AS DOOR,                \r\n"
+                   "       0 AS CBOX_TMPR,                                                           \r\n"
+                   "       UPDATE_DT AS STS00,                                                       \r\n"
+                   "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM VW_SIG_CTLR_STATUS                                                        \r\n"
+#endif
+#ifdef USE_SIGDET
+                   "UNION                                                                            \r\n"
+                   "SELECT 'LVD' AS FAC_TYPE, FCLT_ID AS FAC_ID,                                     \r\n"
+                   "       DECODE(DISCONN_STATE, 'STS0', 'CMS0', 'CMS1') AS STTS_CD,                 \r\n"
+                   "       'CDS0' AS DOOR_STTS_CD,                                                   \r\n"
+                   "       DECODE(DISCONN_STATE, 'STS0', '0', '1') AS COMM,                          \r\n"
+                   "       '0' AS DOOR, 0 AS CBOX_TMPR                                               \r\n"
+                   "  FROM VW_SIG_LVDS_STATUS                                                        \r\n"
+#endif
+#ifdef USE_PVMS
+                   "UNION                                                                            \r\n"
+                   "SELECT 'PVMS' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID,                           \r\n"
+                   "       DECODE(COMM_STATE, 0, 'CMS0', 'CMS1') AS STTS_CD,                         \r\n"
+                   "       DECODE(DOOR_STATE, 0, 'CDS0', 'CDS1') AS DOOR_STTS_CD,                    \r\n"
+                   "       DECODE(COMM_STATE, 0, '0', '1') AS COMM, '0' AS DOOR,                     \r\n"
+                   "       0 AS CBOX_TMPR,                                                           \r\n"
+                   "       UPDATE_DT             AS STS00,                                           \r\n"
+                   "       '0'                   AS STS01,                                           \r\n"
+                   "       TO_CHAR(POWER_STATE)  AS STS02,                                           \r\n"
+                   "       TO_CHAR(MODULE_STATE) AS STS03,                                           \r\n"
+                   "       TO_CHAR(FAN_STATE)    AS STS04,                                           \r\n"
+                   "       TO_CHAR(HEATER_STATE) AS STS05,                                           \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM VW_PIS_VMS_STATUS                                                         \r\n"
+#endif
+#ifdef USE_PVDS
+                   "UNION                                                                            \r\n"
+                   "SELECT 'PVMS' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID,                           \r\n"
+                   "       DECODE(COMM_STATE, '0', 'CMS0', 'CMS1') AS STTS_CD,                       \r\n"
+                   "       'CDS0' AS DOOR_STTS_CD,                                                   \r\n"
+                   "       DECODE(COMM_STATE, '0', '0', '1') AS COMM, '0' AS DOOR,                   \r\n"
+                   "       0 AS CBOX_TMPR,                                                           \r\n"
+                   "       UPDATE_DT           AS STS00,                                             \r\n"
+                   "       TO_CHAR(CONT_STATE) AS STS01,                                             \r\n"
+                   "       '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,                   \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM VW_PIS_CONT_STATUS                                                        \r\n"
+#endif
+#ifdef USE_PARK
+                   "UNION                                                                            \r\n"
+                   "SELECT 'PARK' AS FAC_TYPE, B.CTLR_MNGM_NMBR AS FAC_ID,                           \r\n"
+                   "       DECODE(CMNC_STTS_CD, 'CMS0', 'CMS0', 'CMS1') AS STTS_CD,                  \r\n"
+                   "       'CDS0' AS DOOR_STTS_CD,                                                   \r\n"
+                   "       DECODE(CMNC_STTS_CD, 'CMS0', '0', 'CMS1', '1', '0') AS COMM,              \r\n"
+                   "      '0' AS DOOR,                                                               \r\n"
+                   "       0 AS CBOX_TMPR,                                                           \r\n"
+                   "       A.UPDT_DT AS STS00,                                                       \r\n"
+                   "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+                   "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+                   "  FROM TB_PRLT_CTLR_STTS A, TB_PRLT_CTLR B                                       \r\n"
+                   " WHERE A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+                   "   AND A.CTLR_MNGM_NMBR = B.CTLR_MNGM_NMBR                                       \r\n"
+#endif
+           ;
+
+    try
+    {
+        TItsFacility *pFacility = NULL;
+
+        FLists.Lock();
+
+        FOR_STL(TItsFacility*, pObj, ItsFacilityManager->FLists)
+        {
+            pObj->FCollCntBase = 0;
+            pObj->FCollCntCurr = 0;
+
+            //남양주에서 수집시간내에 조회되는것은 수집오류가 아니므로 초기에 수집오류로 설정
+            if (pObj->FCLT_TYPE == "VDS" ||
+                pObj->FCLT_TYPE == "AVI" ||
+                pObj->FCLT_TYPE == "DSRC")
+            {
+                pObj->FCollError   = true;
+            }
+            else
+            {
+                pObj->FCollError   = false;
+            }
+
+            pObj->FComm = state_error;
+            pObj->FDoor = "0";
+            pObj->FCommStatus = "CMS1";
+            pObj->FDoorStatus = "CDS0";
+
+            if (pObj->FCLT_TYPE == "CCTV" ||
+                pObj->FCLT_TYPE == "VMS"  ||
+                pObj->FCLT_TYPE == "VDS"  ||
+                pObj->FCLT_TYPE == "AVI")
+            {
+                pObj->FCBoxTmpr = "?";
+            }
+            else
+            {
+                pObj->FCBoxTmpr = "-";
+            }
+        }
+
+        //상태정보를 읽어오기전에 상태정보 통계데이터를 초기화한다.
+        FOR_STL(TFacilityStatus*, pStatus, ItsFacilityManager->FListStatus)
+        {
+            //pStatus->Total  = 0; 전체 수량은 초기화하지 않는다.
+            pStatus->Normal = 0;
+            pStatus->Error  = 0;
+            pStatus->Module = 0;
+            pStatus->Collect= 0;
+        }
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sId = pADO->FieldByName("FAC_ID")->AsString;
+                pFacility = ItsFacilityManager->FLists.Find(sId);
+                if (!pFacility) continue;
+
+                pFacility->FCommStatus = pADO->FieldByName("STTS_CD")->AsString;
+                pFacility->FDoorStatus = pADO->FieldByName("DOOR_STTS_CD")->AsString;
+
+                pFacility->FComm = pADO->FieldByName("COMM")->AsString;
+                pFacility->FDoor = pADO->FieldByName("DOOR")->AsString;
+
+                pFacility->Sts00 = pADO->FieldByName("STS00")->AsString;
+                pFacility->Sts01 = pADO->FieldByName("STS01")->AsString;
+                pFacility->Sts02 = pADO->FieldByName("STS02")->AsString;
+                pFacility->Sts03 = pADO->FieldByName("STS03")->AsString;
+                pFacility->Sts04 = pADO->FieldByName("STS04")->AsString;
+                pFacility->Sts05 = pADO->FieldByName("STS05")->AsString;
+                pFacility->Sts06 = pADO->FieldByName("STS06")->AsString;
+                pFacility->Sts07 = pADO->FieldByName("STS07")->AsString;
+                pFacility->Sts08 = pADO->FieldByName("STS08")->AsString;
+                pFacility->Sts09 = pADO->FieldByName("STS09")->AsString;
+                pFacility->Sts10 = pADO->FieldByName("STS10")->AsString;
+
+                if (pFacility->FCLT_TYPE == "CCTV" ||
+                    pFacility->FCLT_TYPE == "VMS" ||
+                    pFacility->FCLT_TYPE == "VDS" ||
+                    pFacility->FCLT_TYPE == "AVI")
+                {
+                    pFacility->FCBoxTmpr = pADO->FieldByName("CBOX_TMPR")->AsString;
+                }
+
+                if (pFacility->FComm == state_normal)
+                {
+                    //통신이 정상인데 함체문이 열려있으면 모듈이상으로 처리
+#if 0
+                    if (pFacility->FDoor == "1")
+                        pFacility->FComm = state_module; //모듈이상(함체문 열림)
+#endif
+                }
+            }
+
+            //수집데이터를 처리하구 수집오류=false로 설정함
+#ifdef USE_DSRC
+            LoadDsrcCollectStatusFromDb(ADbConn);
+#endif
+#ifdef USE_VDS
+            LoadVdsCollectStatusFromDb(ADbConn);
+#endif
+#ifdef USE_AVI
+            LoadAviCollectStatusFromDb(ADbConn);
+#endif
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadFacilityStatusFromDb", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadFacilityStatusFromDb", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        // 상태정보를 최종 체크한다.
+        TFacilityStatus *pStatus;
+        FOR_STL(TItsFacility*, pTmpObj, ItsFacilityManager->FLists)
+        {
+            pStatus = ItsFacilityManager->FListStatus.Find(pTmpObj->FCLT_TYPE);
+            if (!pStatus) continue;
+
+            if      (pTmpObj->FComm == state_error)  pStatus->Error++;
+            else if (pTmpObj->FComm == state_module) pStatus->Module++;
+
+            if (pTmpObj->FComm != state_error)
+            {
+                //통신이상이 아닌 경우 수집이상인 경우 수집이상 갯수를 증가시킨다.
+                if (pTmpObj->FCollError)
+                {
+                    pStatus->Collect++;
+                    pTmpObj->FComm = state_collect;
+                }
+            }
+        }
+
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadDsrcCollectStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_DSRC
+    return true;
+#endif
+    sQry = "SELECT DISTINCT B.RSE_ID                                     \r\n"
+           "  FROM TB_RSE_OBU_CLCT_PNST A,                               \r\n"
+           "       TB_RSE_MSTR          B                                \r\n"
+           " WHERE A.CLCT_DT > TO_CHAR(SYSDATE-1/24, 'YYYYMMDDHH24MISS') \r\n"
+           "   AND A.ID = B.ID                                           \r\n";
+
+    try
+    {
+        TItsFacility *pFacility = NULL;
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sRseId = pADO->FieldByName("RSE_ID")->AsString;
+                pFacility = ItsFacilityManager->FLists.Find(sRseId);
+                if (!pFacility) continue;
+
+                pFacility->FCollError = false;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadDsrcCollectStatusFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadDsrcCollectStatusFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadVdsCollectStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_VDS
+    return true;
+#endif
+
+    sQry = "SELECT DISTINCT C.VDS_CTLR_ID AS VDS_CTLR_ID                  \r\n"
+           "  FROM TB_VDS_DTCT_RAW_PNST A,                                \r\n"
+           "       TB_VDS_DTCT_MSTR     B,                                \r\n"
+           "       TB_VDS_CTLR          C                                 \r\n"
+           " WHERE A.OCRR_DT > TO_CHAR(SYSDATE-1/24, 'YYYYMMDDHH24MISS')  \r\n"
+           "   AND A.DTCT_NMBR = B.DTCT_NMBR                              \r\n"
+           "   AND B.CTLR_MNGM_NMBR = C.CTLR_MNGM_NMBR                    \r\n";
+
+    try
+    {
+        TItsFacility *pFacility = NULL;
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            pADO->First();
+
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sVdsId = pADO->FieldByName("VDS_CTLR_ID")->AsString;
+                pFacility = ItsFacilityManager->FLists.Find(sVdsId);
+                if (!pFacility) continue;
+
+                pFacility->FCollError = false;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadVdsCollectStatusFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadVdsCollectStatusFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadAviCollectStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_AVI
+    return true;
+#endif
+
+    sQry = "SELECT A.AVI_CTLR_MNGM_NMBR, B.AVI_ID                         \r\n"
+           "  FROM TB_AVI_PASS_VHCL_PNST A,                               \r\n"
+           "       TB_AVI_CTLR           B                                \r\n"
+           " WHERE A.CRTN_DT > TO_CHAR(SYSDATE-1/24, 'YYYYMMDDHH24MISS')  \r\n"
+           "   AND A.AVI_CTLR_MNGM_NMBR = B.AVI_CTLR_MNGM_NMBR            \r\n";
+
+    try
+    {
+        TItsFacility *pFacility = NULL;
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            pADO->First();
+
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sAviId = pADO->FieldByName("AVI_ID")->AsString;
+                pFacility = ItsFacilityManager->FLists.Find(sAviId);
+                if (!pFacility) continue;
+
+                pFacility->FCollError = false;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadAviCollectStatusFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadAviCollectStatusFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadDsrcCollectStatusFromDb_OLD(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_DSRC
+    return true;
+#endif
+    sQry = "SELECT X.ID, X.RSE_ID, X.CLCT_ABNR_BASI,                                 \r\n"
+           "       Y.STAT_DT, NVL(Y.CLCT_NUM, 0) AS CLCT_NUM                         \r\n"
+           "  FROM (SELECT M.ID, M.RSE_ID, M.CLCT_ABNR_BASI                          \r\n"
+           "          FROM TB_RSE_MSTR M                                             \r\n"
+           "         WHERE M.DEL_YN <> 'Y'                                           \r\n"
+           "       ) X,                                                              \r\n"
+           "       (SELECT P.ID, P.STAT_DT, P.CLCT_NUM                               \r\n"
+           "          FROM TB_RSE_OBU_CLCT_HH_PNST P                                 \r\n"
+           "         WHERE P.STAT_DT >= TO_CHAR(SYSDATE-2/1440, 'YYYYMMDDHH24MISS')  \r\n"
+           "       ) Y                                                               \r\n"
+           " WHERE X.ID = Y.ID(+)                                                    \r\n";
+
+#if 0
+    sQry = "SELECT X.ID, X.RSE_ID, X.CLCT_ABNR_BASI,                                                         \r\n"
+           "       Y.STAT_DT, NVL(Y.CLCT_NUM, 0) AS CLCT_NUM                                                 \r\n"
+           "  FROM (SELECT M.ID, M.RSE_ID, M.CLCT_ABNR_BASI                                                  \r\n"
+           "          FROM TB_RSE_MSTR M                                                                     \r\n"
+           "         WHERE M.DEL_YN <> 'Y'                                                                   \r\n"
+           "       ) X,                                                                                      \r\n"
+           "       (SELECT ID, STAT_DT, CLCT_NUM                                                             \r\n"
+           "          FROM TB_RSE_OBU_CLCT_HH_PNST                                                           \r\n"
+           "         WHERE (ID, STAT_DT) IN (SELECT P.ID, MAX(P.STAT_DT)                                     \r\n"
+           "                                  FROM TB_RSE_OBU_CLCT_HH_PNST P                                 \r\n"
+           "                                 WHERE P.STAT_DT >= TO_CHAR(SYSDATE-2/1440, 'YYYYMMDDHH24MISS')  \r\n"
+           "                                 GROUP BY P.ID)                                                  \r\n"
+           "       ) Y                                                                                       \r\n"
+           " WHERE X.ID = Y.ID(+)                                                                            \r\n";
+#endif
+    try
+    {
+        TItsFacility *pFacility = NULL;
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sId = pADO->FieldByName("RSE_ID")->AsString;
+                pFacility = ItsFacilityManager->FLists.Find(sId);
+                if (!pFacility) continue;
+
+                pFacility->FCollCntBase = pADO->FieldByName("CLCT_ABNR_BASI")->AsInteger;
+                pFacility->FCollCntCurr = pADO->FieldByName("CLCT_NUM")->AsInteger;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadDsrcCollectStatusFromDb_OLD", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadDsrcCollectStatusFromDb_OLD", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadVdsCollectStatusFromDb_OLD(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_VDS
+    return true;
+#endif
+#if 1
+    sQry = "SELECT A.CTLR_MNGM_NMBR, A.VDS_CTLR_ID, NVL(B.COLCNT, 0) AS COLCNT                \r\n"
+           "  FROM TB_VDS_CTLR A,                                                             \r\n"
+           "       (SELECT A.CTLR_MNGM_NMBR, MAX(B.OCRR_DT) AS OCRR_DT, COUNT(1) AS COLCNT    \r\n"
+           "          FROM TB_VDS_DTCT_MSTR A, TB_VDS_DTCT_RAW_PNST B                         \r\n"
+           "         WHERE A.DTCT_NMBR = B.DTCT_NMBR                                          \r\n"
+           "           AND B.OCRR_DT >= TO_CHAR(SYSDATE-10/1440, 'YYYYMMDDHH24MISS')          \r\n"
+           "         GROUP BY A.CTLR_MNGM_NMBR ) B                                            \r\n"
+           " WHERE A.DEL_YN = 'N'                                                             \r\n"
+           "   AND A.CTLR_MNGM_NMBR = B.CTLR_MNGM_NMBR(+)                                     \r\n";
+#else
+    sQry = "SELECT CTLR_NMBR AS CTLR_MNGM_NMBR, CTLR_ID AS VDS_CTLR_ID, COLCNT                                \r\n"
+           "  FROM (SELECT A.CTLR_MNGM_NMBR AS CTLR_NMBR, A.VDS_CTLR_ID AS CTLR_ID, A.LCTN AS CTLR_NM,        \r\n"
+           "               NVL(C.UPDT_DT, '-') AS UPDT_DT, NVL(C.CMNC_STTS_CD, 'CMS1') AS COMM_CD,            \r\n"
+           "               NVL(C.COLCNT, 0) AS COLCNT, NVL(B.COMMERRCNT, 0) AS COMMERRCNT                     \r\n"
+           "          FROM TB_VDS_CTLR A,                                                                     \r\n"
+           "               (SELECT CTLR_MNGM_NMBR, COUNT(1) AS COMMERRCNT                                     \r\n"
+           "                  FROM TB_VDS_CTLR_STTS_RAW                                                       \r\n"
+           "                 WHERE 1=1                                                                        \r\n"
+           "                   AND CMNC_STTS_CD <> 'CMS0'                                                     \r\n"
+           "                   AND OCRR_DT >= TO_CHAR(TRUNC(SYSDATE), 'YYYYMMDD') || '000000'                 \r\n"
+           "                 GROUP BY CTLR_MNGM_NMBR                                                          \r\n"
+           "               ) B,                                                                               \r\n"
+           "               (SELECT X.CTLR_MNGM_NMBR, X.UPDT_DT, X.CMNC_STTS_CD, NVL(Y.COLCNT, 0) AS COLCNT    \r\n"
+           "                  FROM TB_VDS_CTLR_STTS X,                                                        \r\n"
+           "                       (SELECT A.CTLR_MNGM_NMBR, COUNT(1) AS COLCNT                               \r\n"
+           "                          FROM TB_VDS_DTCT_MSTR A, TB_VDS_DTCT_RAW_PNST B                         \r\n"
+           "                         WHERE 1=1                                                                \r\n"
+           "                           AND A.DTCT_NMBR = B.DTCT_NMBR                                          \r\n"
+           "                           AND B.OCRR_DT >= TO_CHAR(SYSDATE-10/1440, 'YYYYMMDDHH24MISS')          \r\n"
+           "                         GROUP BY A.CTLR_MNGM_NMBR ) Y                                            \r\n"
+           "                 WHERE 1=1                                                                        \r\n"
+           "                   AND X.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                   \r\n"
+           "                   AND X.CTLR_MNGM_NMBR = Y.CTLR_MNGM_NMBR(+)                                     \r\n"
+           "               ) C                                                                                \r\n"
+           "         WHERE 1=1                                                                                \r\n"
+           "           AND A.DEL_YN = 'N'                                                                     \r\n"
+           "           AND A.CTLR_MNGM_NMBR = B.CTLR_MNGM_NMBR(+)                                             \r\n"
+           "           AND A.CTLR_MNGM_NMBR = C.CTLR_MNGM_NMBR(+)                                             \r\n"
+           "       )                                                                                          \r\n"
+           " WHERE 1=1                                                                                        \r\n"
+           "   AND (COMM_CD = 'CMS0' AND COLCNT = 0)                                                          \r\n";
+#endif
+
+    try
+    {
+        TItsFacility *pFacility = NULL;
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            pADO->First();
+
+            String sVdsId;
+            int    nColCnt;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                sVdsId = pADO->FieldByName("VDS_CTLR_ID")->AsString;
+                pFacility = ItsFacilityManager->FLists.Find(sVdsId);
+                if (!pFacility)
+                {
+                    continue;
+                }
+
+                nColCnt = pADO->FieldByName("COLCNT")->AsInteger;
+                if (nColCnt == 0)
+                {
+                    if (pFacility->FComm != state_error)
+                    {
+                        pFacility->FCollError = true;
+                    }
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadVdsCollectStatusFromDb_OLD", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadVdsCollectStatusFromDb_OLD", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadAviCollectStatusFromDb_OLD(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifndef USE_AVI
+    return true;
+#endif
+    sQry = "SELECT A.AVI_CTLR_MNGM_NMBR, A.AVI_ID, NVL(B.COLCNT, 0) AS COLCNT                \r\n"
+           "  FROM TB_AVI_CTLR A,                                                            \r\n"
+           "       (SELECT AVI_CTLR_MNGM_NMBR, MAX(CRTN_DT) AS CRTN_DT, COUNT(1) AS COLCNT   \r\n"
+           "          FROM TB_AVI_PASS_VHCL_PNST                                             \r\n"
+           "         WHERE CRTN_DT >= TO_CHAR(SYSDATE-10/1440, 'YYYYMMDDHH24MISS')           \r\n"
+           "         GROUP BY AVI_CTLR_MNGM_NMBR ) B                                         \r\n"
+           " WHERE A.DEL_YN = 'N'                                                            \r\n"
+           "   AND A.AVI_CTLR_MNGM_NMBR = B.AVI_CTLR_MNGM_NMBR(+)                            \r\n";
+
+    try
+    {
+        TItsFacility *pFacility = NULL;
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            pADO->First();
+
+            String sAviId;
+            int    nColCnt;
+
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                sAviId = pADO->FieldByName("AVI_ID")->AsString;
+                pFacility = ItsFacilityManager->FLists.Find(sAviId);
+                if (!pFacility)
+                {
+                    continue;
+                }
+
+                nColCnt = pADO->FieldByName("COLCNT")->AsInteger;
+                if (nColCnt == 0)
+                {
+                    if (pFacility->FComm != state_error)
+                    {
+                        pFacility->FCollError = true;
+                    }
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadAviCollectStatusFromDb_OLD", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsFacilityManager::LoadAviCollectStatusFromDb_OLD", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 607 - 0
COMMON/CDS/CDSFacilityF.h

@@ -0,0 +1,607 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSFacilityFH
+#define CDSFacilityFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+#include "CDSDsrcF.h"
+#include "CDSVdsF.h"
+#include "CDSAviF.h"
+#include "CDSParkingF.h"
+#include "CDSEventF.h"
+//---------------------------------------------------------------------------
+
+#define state_normal    "0"
+#define state_error     "1"
+#define state_module    "2"
+#define state_collect   "3"
+
+/*
+*  Web Camera class
+*/
+class TItsWebCam
+{
+public:
+    TItsWebCam(){}
+    virtual ~TItsWebCam(){}
+
+//COMMENT ON TABLE ITSDBA.TB_WEB_CMRA;        //'웹 카메라';
+    String	WEB_CMRA_NMBR;      //'웹 카메라 번호';
+    String	WEB_CMRA_ID;        //'웹 카메라 ID';
+    String	CMRA_IP;            //'카메라 아이피';
+    String	CMRA_PORT;          //'카메라 포트';
+    String	STRM_SVR_IP;        //'스트리밍 서버 아이피';
+    String	STRM_SVR_PORT;      //'스트리밍 서버 포트';
+    String	STRM_SESN_NM;       //'스트리밍 세션 명';
+    String	X_CRDN;             //'X 좌표';
+    String	Y_CRDN;             //'Y 좌표';
+    String	ISTL_LCTN_NM;       //'설치 위치 명';
+    String	ISTL_LCTN_ADDR;     //'설치 위치 주소';
+    String	EQPM_KIND;          //'장비 종류';
+    String	DEL_YN;             //'삭제 여부';
+    String	LINK_ID;            //'링크ID';
+
+//COMMENT ON TABLE ITSDBA.TB_WEB_CMRA_STRM IS '웹 카메라 스트리밍';
+//COMMENT ON COLUMN ITSDBA.TB_WEB_CMRA_STRM.WEB_CMRA_NMBR IS '웹 카메라 번호';
+    String	STRM_RTSP_ADDR;     //'스트리밍 RTSP 주소';
+    String	STRM_RTMP_ADDR;     //'스트리밍 RTMP 주소';
+    String	STRM_HTTP_ADDR;     //'스트리밍 HTTP 주소';
+    String	STRM_STOR_ADDR;     //'스트리밍 저장 주소';
+
+    String  ID;
+    String  PSWD;
+
+    void    *FData1;
+    void    *FData2;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Cctv class
+*/
+class TItsCctv
+{
+public:
+    TItsCctv()
+    {
+        FData1  = NULL;
+        FData2  = NULL;
+        FMarker = NULL;
+    }
+    virtual ~TItsCctv(){}
+
+    String	CCTV_MNGM_NMBR;     //CCTV 관리 번호';
+    String	CCTV_CTLR_ID;       //CCTV 제어기 ID';
+    String	CCTV_CTLR_IP;       //CCTV 제어기 아이피';
+    String	CCTV_CTLR_PORT;     //CCTV 제어기 포트';
+    String	CCTV_CAPT_IP;       //CCTV 자막기 아이피';
+    String	CCTV_CAPT_PORT;     //CCTV 자막기 포트';
+    String	CCTV_FIBR_IP;       //CCTV 광장비 아이피';
+    String	CCTV_ENCD_IP;       //CCTV 인코더 아이피';
+    String	STRM_SVR_IP;        //스트리밍 서버 아이피';
+    String	STRM_SVR_PORT;      //스트리밍 서버 포트';
+    String	STRM_SESN_NM;       //스트리밍 세션 명';
+    String	X_CRDN;             //X 좌표';
+    String	Y_CRDN;             //Y 좌표';
+    String	ISTL_LCTN_NM;       //설치 위치 명';
+    String	ISTL_LCTN_ADDR;     //설치 위치 주소';
+    String	CCTV_CHNL;          //CCTV 채널';
+    String	DEL_YN;             //삭제 여부';
+    String	FRST_REGR_NMBR;     //최초 등록자 번호';
+    String	FRST_RGST_DT;       //최초 등록 일시';
+    String	LAST_CRPR_NMBR;     //최종 수정자 번호';
+    String	LAST_CRCT_DT;       //최종 수정 일시';
+    String	LINK_ID;            //링크ID';
+    String  NODE_ID;            //노드ID
+    String	CCTV_ID;            //공단 CCTV ID';
+    String	RELY_PORT;          //연계 포트';
+    String	STRM_RTSP_ADDR;
+    String	STRM_RTMP_ADDR;
+    String	STRM_HTTP_ADDR;
+    String  LOCAL_YN;
+
+    //FOR GUMI
+    String  CCTV_TYPE;          //	N	VARCHAR2(10)	Y			CCTV유형
+
+    void    *FData1;
+    void    *FData2;
+    void    *FMarker;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Vms class
+*/
+class TItsVms
+{
+public:
+    TItsVms()
+    {
+        FData1  = NULL;
+        FData2  = NULL;
+        FMarker = NULL;
+    }
+    virtual ~TItsVms(){}
+
+    String VMS_CTLR_NMBR;           //	N	NUMBER(10)	    N			VMS 제어기 번호
+    String VMS_ID;                  //	N	VARCHAR2(4)	    Y			VMS ID
+    String VMS_CTLR_ID;             //	N	VARCHAR2(30)	Y			VMS 제어기 ID
+    String VMS_NM;                  //	N	VARCHAR2(40)	Y			VMS 명
+    String VMS_CTLR_IP;             //	N	VARCHAR2(20)	Y			VMS 제어기 아이피
+    String VMS_USAG_TYPE_CD;        //	N	VARCHAR2(7)	    Y			VMS 용도 유형 코드
+    String VMS_FRM_TYPE_CD;         //	N	VARCHAR2(7)	    Y			VMS 형식 유형 코드
+    String VMS_TYPE_CD;             //	N	VARCHAR2(7)	    Y			VMS 유형 코드
+    String VMS_MODL_TYPE_CD;        //	N	VARCHAR2(7)	    Y			VMS 모듈 유형 코드
+    String VMS_CMNC_PORT;           //	N	VARCHAR2(5)	    Y			VMS 통신 포트
+    String OPER_MODE;               //	N	VARCHAR2(7)	    Y			운영 모드
+    String VMS_CMNC_ERR_BASS_VAL;   //	N	NUMBER(3)	    Y			VMS 통신 오류 기본 값
+    String VMS_NGHT_BRGH_STEP;      //	N	NUMBER(2)	    Y			VMS 야간 휘도 단계
+    String VMS_WEEK_BRGH_STEP;      //	N	NUMBER(2)	    Y			VMS 주간 휘도 단계
+    String VMS_PHSE_CHNG_CYCL;      //	N	NUMBER(3)	    Y			VMS 표출면 변경 주기
+    String VMS_MODL_ERR_RATE;       //	N	NUMBER(3)	    Y			VMS 모듈 오류 율
+    String CMNCFAIL_SLOT_NMBR;      //	N	NUMBER(4)	    Y	0		통신장애 SLOT 번호
+    String PWER_FAIL_SLOT_NMBR;     //	N	NUMBER(4)	    Y	0		전원 장애 SLOT 번호
+    String DEL_YN;                  //	N	CHAR(1)	        Y	'N'		삭제 여부
+    String CMTRINFR_CNCT_YN;        //	N	CHAR(1)	        Y	'N'		소통정보 연계 여부
+    String WTHRINFR_CNCT_YN;        //	N	CHAR(1)	        Y	'N'		기상정보 연계 여부
+    String ENVRINFR_CNCT_YN;        //	N	CHAR(1)	        Y	'N'		환경정보 연계 여부
+    String VMS_MAX_PHSE_NUM;        //	N	NUMBER(2)	    Y			VMS 최대 표출면 개수
+    String FRST_REGR_NMBR;          //	N	VARCHAR2(20)	Y			최초 등록자 번호
+    String FRST_RGST_DT;            //	N	VARCHAR2(14)	Y			최초 등록 일시
+    String LAST_CRPR_NMBR;          //	N	VARCHAR2(20)	Y			최종 수정자 번호
+    String LAST_CRCT_DT;            //	N	VARCHAR2(14)	Y			최종 수정 일시
+    String PANL_ON_TIME;            //	N	VARCHAR2(4)	    Y			전광판 ON TIME
+    String PANL_OFF_TIME;           //	N	VARCHAR2(4)	    Y			전광판 OFF TIME
+    String PANL_PWER_MODE;          //	N	VARCHAR2(7)	    Y			전광판 전원 모드
+    String BRGH_MODE;               //	N	VARCHAR2(7)	    Y			휘도 모드
+    String WEB_CMRA_IP;             //	N	VARCHAR2(20)	Y			웹 카메라 아이피
+    String X_CRDN;                  //	N	NUMBER(11,8)	Y			X 좌표
+    String Y_CRDN;                  //	N	NUMBER(10,8)	Y			Y 좌표
+    String ISTL_LCTN_NM;            //	N	VARCHAR2(40)	Y			설치 위치 명
+    String TRFC_STRG_USE_YN;        //	N	CHAR(1)	        Y	'N'		교통 전략 사용 여부
+#if 1
+    //FOR 남양주???
+    String VMS_LOC_IFSC_ID;         //	N	NUMBER(10)	    Y			VMS 위치 정보제공구간 ID
+    String FAN_MTNS_TMPR;           //	N	NUMBER(6,3)	    Y			팬 동작 온도
+    String HETR_MTNS_TMPR;          //	N	NUMBER(6,3)	    Y			히터 동작 온도
+#endif
+    String WEB_CMRA_PORT;           //	N	VARCHAR2(5)	    Y			웹 카메라 포트
+    String WEB_CMRA_ID;             //	N	VARCHAR2(30)	Y			웹 카메라 ID
+    String WEB_CMRA_PWD;            //	N	VARCHAR2(64)	Y			웹 카메라 암호
+    String STRM_SESN_NM;            //	N	VARCHAR2(200)	Y			스트리밍 세션 명
+
+    //크기
+    int     WIDTH;
+    int     HEIGHT;
+    int     ModHorCnt;
+    int     ModVerCnt;
+
+    void    *FData1;
+    void    *FData2;
+    void    *FMarker;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Rse class
+*/
+class TItsRse
+{
+public:
+    TItsRse(){}
+    virtual ~TItsRse(){}
+
+    String RSEID;
+    String INSTDT;
+    String CITYCD;
+    String REGIONCD;
+    String AREACD;
+    String RSEIP;
+    String COORDX;
+    String COORDY;
+    String RADIUS1;
+    String RADIUS2;
+    String COMPCD;
+    String LOCATION;
+    String RSECONFIGID;
+    String OBEPARAMID;
+    String PORT;
+    String BRIDGE;
+    String COMYN;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Vds class
+*/
+class TItsFVds
+{
+public:
+    TItsFVds(){}
+    virtual ~TItsFVds(){}
+
+    String CTLR_MNGM_NMBR;  //VARCHAR2(20)	N			제어기 관리 번호
+    String CTLR_TYPE_CD;    //VARCHAR2(7)	Y			제어기 유형 코드
+    String VALD_YN;         //CHAR(1)	Y	'N'		유효 여부
+    String X_CRDN;          //NUMBER(11,8)	Y			X 좌표
+    String Y_CRDN;          //NUMBER(10,8)	Y			Y 좌표
+    String LCTN;            //VARCHAR2(100)	Y			위치
+    String TRMN_IP;         //VARCHAR2(20)	Y			단말기 아이피
+    String TRMN_PORT;       //VARCHAR2(5)	Y			단말기 포트
+    String CTLR_CLCT_CYCL;  //NUMBER(3)	Y			제어기 수집 주기
+    String CTLR_STTS_CYCL;  //NUMBER(3)	Y			제어기 상태 주기
+    String LOOP_BORD_NUM;   //NUMBER(3)	Y	0		루프 보드 개수
+    String DLTR_NMBR;       //VARCHAR2(20)	Y			삭제자 번호
+    String DEL_DT;          //VARCHAR2(14)	Y			삭제 일시
+    String DEL_YN;          //CHAR(1)	Y	'N'		삭제 여부
+    String FRST_REGR_NMBR;  //VARCHAR2(20)	Y			최초 등록자 번호
+    String FRST_RGST_DT;    //VARCHAR2(14)	Y			최초 등록 일시
+    String LAST_CRPR_NMBR;  //VARCHAR2(20)	Y			최종 수정자 번호
+    String LAST_CRCT__DT;   //VARCHAR2(14)	Y			최종 수정  일시
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Avi class
+*/
+class TItsFAvi
+{
+public:
+    TItsFAvi(){}
+    virtual ~TItsFAvi(){}
+
+    String AVI_CTLR_MNGM_NMBR;  //VARCHAR2(20)	N			AVI 제어기 관리 번호
+    String AVI_ID;              //VARCHAR2(10)	Y			AVI ID
+    String LINK_ID;             //NUMBER(10)	Y			링크 ID
+    String AVI_LCTN_NM;         //VARCHAR2(60)	Y			AVI 위치 명
+    String AVI_VALD_YN;         //CHAR(1)	Y	'N'		AVI 유효 여부
+    String AVI_CTLR_IP;         //VARCHAR2(20)	Y			AVI 제어기 아이피
+    String AVI_CTLR_CMNC_PORT;  //VARCHAR2(5)	Y			AVI 제어기 통신 포트
+    String AVI_MAIN_CTLR_YN;    //CHAR(1)	Y	'N'		AVI 주 제어기 여부
+    String AVI_MNGM_LANE_NUM;   //NUMBER(2)	Y			AVI 관리 차로 개수
+    String AVI_CMRA_NUM;        //NUMBER(2)	Y			AVI 카메라 개수
+    String AVI_DTCT_NUM;        //NUMBER(2)	Y			AVI 검지기 개수
+    String AVI_DTCT_NM;         //VARCHAR2(60)	Y			AVI 검지기 명
+    String AVI_CLCT_CYCL;       //NUMBER(3)	Y			AVI 수집 주기
+    String AVI_LAMP_AUTO_YN;    //CHAR(1)	Y	'N'		AVI 조명장치 자동 여부
+    String AVI_LAMP_ON_HMS;     //VARCHAR2(6)	Y			AVI 조명장치 ON 시각
+    String AVI_LAMP_OFF_HMS;    //VARCHAR2(6)	Y			AVI 조명장치 OFF 시각
+    String AVI_LAMP_ON_YN;      //CHAR(1)	Y	'N'		AVI 조명장치 ON 여부
+    String X_CRDN;              //NUMBER(11,8)	Y			X 좌표
+    String Y_CRDN;              //NUMBER(10,8)	Y			Y 좌표
+    String RMRK;                //VARCHAR2(600)	Y			비고
+    String DEL_YN;              //CHAR(1)	Y	'N'		삭제 여부
+    String FRST_REGR_NMBR;      //VARCHAR2(20)	Y			최초 등록자 번호
+    String FRST_RGST_DT;        //VARCHAR2(14)	Y			최초 등록 일시
+    String LAST_CRPR_NMBR;      //VARCHAR2(20)	Y			최종 수정자 번호
+    String LAST_CRCT_DT;        //VARCHAR2(14)	Y			최종 수정 일시
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Dsrc class
+*/
+class TItsFDsrc
+{
+public:
+    TItsFDsrc(){}
+    virtual ~TItsFDsrc(){}
+
+    String ID;              //VARCHAR2(3)	N			아이디
+    String RSE_ID;          //VARCHAR2(8)	N			RSE 아이디
+    String ROAD_SPOT_ID;    //VARCHAR2(30)	N			도로 지점 아이디
+    String LOG_CNNC_ID;     //VARCHAR2(64)	Y			로그 접속 아이디
+    String LOG_CNNC_PW;     //VARCHAR2(64)	Y			로그 접속 비밀번호
+    String ISTL_LCTN_NM;    //VARCHAR2(40)	Y			설치 위치 명
+    String LCTN_X;          //NUMBER(11,8)	Y			위치 X
+    String LCTN_Y;          //NUMBER(10,8)	Y			위치 Y
+    String IP;              //VARCHAR2(20)	Y			IP
+    String PORT;            //VARCHAR2(5)	Y			PORT
+    String MNFC_CMPY_CD;    //NUMBER(5)	Y			제조 업체 코드
+    String DEL_YN;          //CHAR(1)	Y	'N'		삭제 여부
+};
+//---------------------------------------------------------------------------
+
+/*
+*  EtcFacility class
+*/
+class TItsRegFacility
+{
+public:
+    TItsRegFacility();
+    virtual ~TItsRegFacility();
+    void Clear();
+private:
+public:
+    String  Type;
+    String  Id;
+    String  Name;
+    String  DelYn;
+    String  UnRegisterd;
+    int     GridIndex;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Facility class
+*/
+class TItsFacility
+{
+public:
+    TItsFacility();
+    virtual ~TItsFacility();
+    void Clear();
+private:
+    int     FEditMode;
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String FCLT_ID;		    // FCLT_ID VARCHAR(50 BYTE) NOT NULL,	'시설물 ID';
+    String RFID_ID;		    // RFID_ID VARCHAR(50 BYTE) NOT NULL,	'시설물 ID';
+    String FCLT_TYPE;		// FCLT_TYPE VARCHAR(7 BYTE) NOT NULL, '시설물유형';
+    String FCLT_LCTN;		// FCLT_LCTN VARCHAR(100 BYTE),        '시설물 위치';
+    String RSCE_YN;		    // RSCE_YN CHAR(1 BYTE) DEFAULT 'N',   '현장자산유무';
+    String MDL_NM;          // MDL_NM VARCHAR(30 BYTE),            '모델명';
+    String USE_YEAR;		// USE_YEAR NUMBER(3),                 '사용년수';
+    String INWR_DT;		    // INWR_DT VARCHAR(14 BYTE),           '입고일시';
+    String OTWR_DT;		    // OTWR_DT VARCHAR(14 BYTE),           '출고일시';
+    String ISTL_DT;		    // ISTL_DT VARCHAR(14 BYTE),           '설치일시';
+    String TAKT_DT;		    // TAKT_DT VARCHAR(14 BYTE),           '반출일시';
+    String TAKT_RESN;		// TAKT_RESN VARCHAR(100 BYTE),        '반출사유';
+    String TAKN_DT;		    // TAKN_DT VARCHAR(14 BYTE),           '반입일시';
+    String ABDN_DT;		    // ABDN_DT VARCHAR(14 BYTE),           '폐기일시';
+    String ADTN_NM;		    // ADTN_NM VARCHAR(30 BYTE),           '추가자명';
+    String ADTN_DT;		    // ADTN_DT VARCHAR(14 BYTE),           '추가일시';
+    String CHNG_NM;		    // CHNG_NM VARCHAR(30 BYTE),           '변경자명';
+    String CHNG_DT;		    // CHNG_DT VARCHAR(14 BYTE),           '변경일시';
+    String AMT;			    // AMT NUMBER(15),                     '금액';
+    String DEL_YN;		    // DEL_YN CHAR(1 BYTE) DEFAULT 'N',    '삭제여부';
+    String ISTL_CMPY_ID;	// ISTL_CMPY_ID VARCHAR(30 BYTE),      '설치업체ID';
+    String MNFC_CMPY_ID;	// PRDC_CMPY_ID VARCHAR(30 BYTE)       '제조업체ID';
+
+    String ISTL_LCTN_ADDR;  // '설치 위치 주소'
+
+    String FCommStatus;     // 장비 통신상태값
+    String FDoorStatus;     // 장비 Door상태값
+    String FComm;
+    String FDoor;
+    String FCBoxTmpr;
+
+    int    FCollCntBase;
+    int    FCollCntCurr;
+    bool   FCollError;
+
+    String Sts00;
+    String Sts01;
+    String Sts02;
+    String Sts03;
+    String Sts04;
+    String Sts05;
+    String Sts06;
+    String Sts07;
+    String Sts08;
+    String Sts09;
+    String Sts10;
+
+    String Deleted;         // 마스터정보가 삭제된것
+	int    GridIndex;	    // 메인폼에 뿌려지는 그리드 인덱스
+    int    StatusGridIndex;
+
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+ 	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+};
+//---------------------------------------------------------------------------
+
+class TFacilityStatus
+{
+public:
+    TFacilityStatus()
+    {
+        Type   = "";
+        Total  = 0;
+        Normal = 0;
+        Error  = 0;
+        Module = 0;
+        Collect= 0;
+    };
+    virtual ~TFacilityStatus() {};
+
+    String Type;
+    int    Total;
+    int    Normal;
+    int    Error;
+    int    Module;
+    int    Collect;
+};
+//---------------------------------------------------------------------------
+
+
+class TItsBit
+{
+public:
+    TItsBit(){}
+    virtual ~TItsBit(){}
+
+    String FCLT_ID;
+    String FCLT_LCTN;
+    String BIT_ID;
+    String X_CRDN;
+    String Y_CRDN;
+
+    String STOP_ID;
+    String STOP_EXPLAIN;
+    String LINK_ID;
+
+    String BIT_TYPE;
+    int    FAN_MIN_TEMPERATURE;
+    int    FAN_MAX_TEMPERATURE;
+    int    HEATER_MIN_TEMPERATURE;
+    int    HEATER_MAX_TEMPERATURE;
+    String INSTALL_STOP_ID;
+    String SERVICE_ID;
+    String STOP_TYPE;
+    String STOP_NAME;
+    String STOP_SHORTNAME;
+
+    String DEL_YN;
+};
+//---------------------------------------------------------------------------
+
+class TItsSig
+{
+public:
+    TItsSig(){}
+    virtual ~TItsSig(){}
+
+    String FCLT_ID;
+    String FCLT_LCTN;
+    String SIG_ID;
+    String X_CRDN;
+    String Y_CRDN;
+
+    String MDL_NM;
+    String DEL_YN;
+};
+//---------------------------------------------------------------------------
+
+class TItsSigDet
+{
+public:
+    TItsSigDet(){}
+    virtual ~TItsSigDet(){}
+
+    String FCLT_ID;
+    String FCLT_LCTN;
+    String SDET_ID;
+    String X_CRDN;
+    String Y_CRDN;
+    String SIG_ID;
+
+    String MDL_NM;
+    String DEL_YN;
+};
+//---------------------------------------------------------------------------
+
+class TItsPis
+{
+public:
+    TItsPis(){}
+    virtual ~TItsPis(){}
+
+    String FCLT_ID;
+    String FCLT_LCTN;
+    String PIS_ID;
+    String X_CRDN;
+    String Y_CRDN;
+    String SIG_ID;
+
+    String MDL_NM;
+    String DEL_YN;
+};
+//---------------------------------------------------------------------------
+
+class TItsPcs
+{
+public:
+    TItsPcs(){}
+    virtual ~TItsPcs(){}
+
+    String FCLT_ID;
+    String FCLT_LCTN;
+    String PCS_ID;
+    String X_CRDN;
+    String Y_CRDN;
+    String SIG_ID;
+
+    String MDL_NM;
+    String DEL_YN;
+};
+//---------------------------------------------------------------------------
+
+/*
+* Facility Manager
+*/
+class TItsFacilityManager
+{
+public:
+    TItsFacilityManager();
+    virtual ~TItsFacilityManager();
+
+public:
+    String                      CenterId;
+    int                         FLocalCctvCnt;
+
+    ListMap<TItsWebCam>         FWebCamLists;
+    ListMap<TItsCctv>           FCctvLists;
+    ListMap<TItsVms>            FVmsLists;
+    ListMap<TItsRse>            FRseLists;
+
+    ListMap<TItsVds>            FVdsLists;
+    ListMap<TItsAvi>            FAviLists;
+    ListMap<TItsDsrc>           FDsrcLists;
+
+    ListMap<TItsBit>            FBitLists;
+    ListMap<TItsSig>            FSigLists;
+    ListMap<TItsSigDet>         FSigDetLists;
+
+    ListMap<TItsPis>            FPisLists;
+    ListMap<TItsPcs>            FPcsLists;
+
+    ListMap<TItsParking>        FParkLists;
+
+    ListMap<TItsRegFacility>    FRegLists;
+    ListMap<TItsFacility>       FLists;
+
+    ListMap<TFacilityStatus>    FListStatus;
+
+public:
+    void SetCenterId(String ACenterId);
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    
+    bool LoadFacilityReg(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityMaster(TADOConnection *ADbConn=NULL);
+
+    bool LoadFacilityWebCam(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityCctv(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityVms(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityRse(TADOConnection *ADbConn=NULL);
+
+    bool LoadFacilityVds(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityAvi(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityDsrc(TADOConnection *ADbConn=NULL);
+
+    bool LoadFacilityBit(TADOConnection *ADbConn=NULL);
+    bool LoadFacilitySig(TADOConnection *ADbConn=NULL);
+    bool LoadFacilitySigDet(TADOConnection *ADbConn=NULL);
+
+    bool LoadFacilityPvms(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityPvds(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityPark(TADOConnection *ADbConn=NULL);
+
+    bool CheckFacility();
+
+    bool LoadFacilityStatusFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadDsrcCollectStatusFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadVdsCollectStatusFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadAviCollectStatusFromDb(TADOConnection *ADbConn=NULL);
+
+    bool LoadDsrcCollectStatusFromDb_OLD(TADOConnection *ADbConn=NULL);
+    bool LoadVdsCollectStatusFromDb_OLD(TADOConnection *ADbConn=NULL);
+    bool LoadAviCollectStatusFromDb_OLD(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsFacilityManager *ItsFacilityManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 2275 - 0
COMMON/CDS/CDSFacilityF_back.cpp

@@ -0,0 +1,2275 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSFacilityF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsRegFacility::TItsRegFacility()
+{
+    UnRegisterd = "N";
+    GridIndex   = -1;
+    Clear();
+}
+//---------------------------------------------------------------------------
+TItsRegFacility::~TItsRegFacility()
+{
+}
+//---------------------------------------------------------------------------
+void TItsRegFacility::Clear()
+{
+#if 0
+    Type        = "";
+    Id          = "";
+    Name        = "";
+    DelYn       = ""
+    UnRegisterd = "N";
+#endif
+}
+//---------------------------------------------------------------------------
+
+
+TItsFacility::TItsFacility()
+{
+    FCommStatus = "CMS2";     // 장비 통신상태값
+    FDoorStatus = "CMS2";     // 장비 Door상태값
+	GridIndex  = -1;         // 그리드 인덱스
+    StatusGridIndex = -1;
+    Deleted = "N";
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsFacility::Clear()
+{
+#if 0
+    FCLT_ID      = "";		// FCLT_ID VARCHAR(50 BYTE) NOT NULL,	'시설물 ID';
+    RFID_ID      = "";		// RFID_ID VARCHAR(50 BYTE) NOT NULL,	'시설물 ID';
+    FCLT_TYPE    = "";		// FCLT_TYPE VARCHAR(7 BYTE) NOT NULL, '시설물유형';
+    FCLT_LCTN    = "";		// FCLT_LCTN VARCHAR(100 BYTE),        '시설물 위치';
+    RSCE_YN      = "";		// RSCE_YN CHAR(1 BYTE) DEFAULT 'N',   '현장자산유무';
+    MDL_NM       = "";     // MDL_NM VARCHAR(30 BYTE),            '모델명';
+    USE_YEAR     = "";		// USE_YEAR NUMBER(3),                 '사용년수';
+    INWR_DT      = "";		// INWR_DT VARCHAR(14 BYTE),           '입고일시';
+    OTWR_DT      = "";		// OTWR_DT VARCHAR(14 BYTE),           '출고일시';
+    ISTL_DT      = "";		// ISTL_DT VARCHAR(14 BYTE),           '설치일시';
+    TAKT_DT      = "";		// TAKT_DT VARCHAR(14 BYTE),           '반출일시';
+    TAKT_RESN    = "";		// TAKT_RESN VARCHAR(100 BYTE),        '반출사유';
+    TAKN_DT      = "";		// TAKN_DT VARCHAR(14 BYTE),           '반입일시';
+    ABDN_DT      = "";		// ABDN_DT VARCHAR(14 BYTE),           '폐기일시';
+    ADTN_NM      = "";		// ADTN_NM VARCHAR(30 BYTE),           '추가자명';
+    ADTN_DT      = "";		// ADTN_DT VARCHAR(14 BYTE),           '추가일시';
+    CHNG_NM      = "";		// CHNG_NM VARCHAR(30 BYTE),           '변경자명';
+    CHNG_DT      = "";		// CHNG_DT VARCHAR(14 BYTE),           '변경일시';
+    AMT          = "";     // AMT NUMBER(15),                     '금액';
+    DEL_YN       = "";     // DEL_YN CHAR(1 BYTE) DEFAULT 'N',    '삭제여부';
+    ISTL_CMPY_ID = "";     // ISTL_CMPY_ID VARCHAR(30 BYTE),      '설치업체ID';
+    MNFC_CMPY_ID = "";     // PRDC_CMPY_ID VARCHAR(30 BYTE)       '제조업체ID';
+    ISTL_LCTN_ADDR = "";
+
+    CommStatus = "CMS2";   // 장비 통신상태값
+    DoorStatus = "CMS2";   // 장비 Door상태값
+
+	GridIndex  = -1;	    // 메인폼에 뿌려지는 그리드 인덱스
+
+#endif
+}
+//---------------------------------------------------------------------------
+TItsFacility::~TItsFacility()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsFacilityManager *ItsFacilityManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Facility Manager
+*/
+TItsFacilityManager::TItsFacilityManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsFacilityManager::~TItsFacilityManager()
+{
+    FRegLists.RemoveAll();
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TItsFacilityManager::SetCenterId(String ACenterId)
+{
+    CenterId = ACenterId;
+}
+//---------------------------------------------------------------------------
+bool TItsFacilityManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    try
+    {
+        FLocalCctvCnt = 0;
+
+        FWebCamLists.Lock();
+        FCctvLists.Lock();
+        FVmsLists.Lock();
+        FRseLists.Lock();
+
+        FVdsLists.Lock();
+        FAviLists.Lock();
+        FDsrcLists.Lock();
+
+        FBitLists.Lock();
+        FSigLists.Lock();
+        FSigDetLists.Lock();
+
+        FPisLists.Lock();
+        FPcsLists.Lock();
+
+        FRegLists.Lock();
+        FLists.Lock();
+
+        FWebCamLists.RemoveAll();
+        FCctvLists.RemoveAll();
+        FVmsLists.RemoveAll();
+        FRseLists.RemoveAll();
+
+        FVdsLists.RemoveAll();
+        FAviLists.RemoveAll();
+        FDsrcLists.RemoveAll();
+
+        FBitLists.RemoveAll();
+        FSigLists.RemoveAll();
+        FSigDetLists.RemoveAll();
+
+        FPisLists.RemoveAll();
+        FPcsLists.RemoveAll();
+
+        FRegLists.RemoveAll();
+        FLists.RemoveAll();
+    }
+    __finally
+    {
+        FWebCamLists.UnLock();
+        FCctvLists.UnLock();
+        FVmsLists.UnLock();
+        FRseLists.UnLock();
+
+        FVdsLists.UnLock();
+        FAviLists.UnLock();
+        FDsrcLists.UnLock();
+
+        FBitLists.UnLock();
+        FSigLists.UnLock();
+        FSigDetLists.UnLock();
+
+        FRegLists.UnLock();
+        FLists.UnLock();
+    }
+
+    LoadFacilityReg(ADbConn);
+    LoadFacilityMaster(ADbConn);
+    LoadFacilityWebCam(ADbConn);
+    LoadFacilityCctv(ADbConn);
+    LoadFacilityVms(ADbConn);
+    LoadFacilityRse(ADbConn);
+
+    LoadFacilityVds(ADbConn);
+
+#ifdef USE_AVI
+    LoadFacilityAvi(ADbConn);
+#endif
+
+#ifdef USE_DSRC
+    LoadFacilityDsrc(ADbConn);
+#endif
+
+#ifdef USE_BIT
+    LoadFacilityBit(ADbConn);
+#endif
+
+#ifdef USE_SIG
+    LoadFacilitySig(ADbConn);
+#endif
+
+#ifdef USE_SIGDET
+    LoadFacilitySigDet(ADbConn);
+#endif
+
+#ifdef USE_PVMS
+    LoadFacilityPvms(ADbConn);
+#endif
+#ifdef USE_PVDS
+    LoadFacilityPvds(ADbConn);
+#endif
+
+    CheckFacility();
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsFacilityManager::CheckFacility()
+{
+    try
+    {
+        FLists.Lock();
+        FOR_STL(TItsFacility *, pFacility, FLists)
+        {
+            TItsRegFacility *pRegFacility = FRegLists.Find(pFacility->FCLT_TYPE + pFacility->FCLT_ID);
+            if (!pRegFacility)
+            {
+                pFacility->Deleted = "Y";
+            }
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+    try
+    {
+        FRegLists.Lock();
+        FOR_STL(TItsRegFacility *, pRegFacility, FRegLists)
+        {
+            TItsFacility *pFacility = FLists.Find(pRegFacility->Id);
+            if (!pFacility)
+            {
+                pRegFacility->UnRegisterd = "Y";
+            }
+        }
+    }
+    __finally
+    {
+        FRegLists.UnLock();
+    }
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityReg(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT 'CCTV' AS FAC_TYPE, CCTV_CTLR_ID AS FAC_ID, ISTL_LCTN_NM AS FAC_NM, DEL_YN \r\n"
+           "  FROM TB_CCTV_CTLR                                                               \r\n"
+           " WHERE DEL_YN = 'N'                                                               \r\n"
+#ifdef USE_WCAM
+           "UNION                                                                             \r\n"
+           "SELECT 'WCAM' AS FAC_TYPE, WEB_CMRA_ID AS FAC_ID, ISTL_LCTN_NM AS FAC_NM, DEL_YN  \r\n"
+           "  FROM TB_WEB_CMRA                                                                \r\n"
+           " WHERE DEL_YN = 'N'                                                               \r\n"
+#endif
+           "UNION                                                                             \r\n"
+           "SELECT 'VMS'  AS FAC_TYPE, VMS_CTLR_ID  AS FAC_ID, VMS_NM AS FAC_NM, DEL_YN       \r\n"
+           "  FROM TB_VMS_CTLR                                                                \r\n"
+           " WHERE DEL_YN = 'N'                                                               \r\n"
+#ifdef USE_AVI
+           "UNION                                                                             \r\n"
+           "SELECT 'AVI' AS FAC_TYPE, AVI_ID AS FAC_ID, AVI_LCTN_NM AS FAC_NM, DEL_YN         \r\n"
+           "  FROM TB_AVI_CTLR                                                                \r\n"
+           " WHERE DEL_YN = 'N'                                                               \r\n"
+#endif
+
+           "UNION                                                                             \r\n"
+           "SELECT 'VDS' AS FAC_TYPE, VDS_CTLR_ID AS FAC_ID, LCTN AS FAC_N, DEL_YN            \r\n"
+           "  FROM TB_VDS_CTLR                                                                \r\n"
+           " WHERE DEL_YN = 'N'                                                               \r\n"
+#ifdef USE_DSRC
+           "UNION                                                                             \r\n"
+           "SELECT 'DSRC' AS FAC_TYPE, RSE_ID AS FAC_ID, ISTL_LCTN_NM AS FAC_NM, DEL_YN       \r\n"
+           "  FROM TB_RSE_MSTR                                                                \r\n"
+           " WHERE DEL_YN = 'N'                                                               \r\n"
+#endif
+
+#ifdef USE_BIT
+           "UNION                                                                                       \r\n"
+           "SELECT 'BIT' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID, FCLT_LCTN AS FAC_NM, 'N' AS DEL_YN    \r\n"
+           "  FROM VW_BIT                                                                               \r\n"
+#if 0
+           "SELECT 'BIT' AS FAC_TYPE, TO_CHAR(A.BIT_ID) AS FAC_ID, B.STOP_NAME AS FAC_NM,     \r\n"
+           "       'N' AS DEL_YN                                                              \r\n"
+           "  FROM BIT A, BUSSTOP B                                                           \r\n"
+           " WHERE 1=1                                                                        \r\n"
+           "   AND A.INSTALL_STOP_ID = B.STOP_ID                                              \r\n"
+           "   AND B.USE_FLAG = '1'                                                           \r\n"
+#endif
+#endif
+
+#ifdef USE_SIG
+           "UNION                                                                                       \r\n"
+           "SELECT 'SIG' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID, FCLT_LCTN AS FAC_NM, 'N' AS DEL_YN    \r\n"
+           "  FROM VW_SIG_CTLR                                                                          \r\n"
+#endif
+
+#ifdef USE_PVMS
+           "UNION                                                                                       \r\n"
+           "SELECT 'PVMS' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID, FCLT_LCTN AS FAC_NM, 'N' AS DEL_YN   \r\n"
+           "  FROM VW_PIS_VMS                                                                           \r\n"
+#endif
+
+#ifdef USE_PVDS
+           "UNION                                                                                       \r\n"
+           "SELECT 'PVDS' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID, FCLT_LCTN AS FAC_NM, 'N' AS DEL_YN   \r\n"
+           "  FROM VW_PIS_CONT                                                                          \r\n"
+#endif
+
+#ifdef USE_SIGDET
+           "UNION                                                                             \r\n"
+           "SELECT 'LVD' AS FAC_TYPE, FCLT_ID AS FAC_ID, FCLT_LCTN AS FAC_NM, 'N' AS DEL_YN   \r\n"
+           "  FROM VW_SIG_LVDS                                                                \r\n"
+#endif
+
+#ifdef USE_RSE
+           "UNION                                                                             \r\n"
+           "SELECT 'RSE' AS FAC_TYPE, RSEID AS FAC_ID, LOCATION AS FAC_NM, 'N' AS DEL_YN      \r\n"
+           "  FROM RSEMST                                                                     \r\n"
+#endif
+
+           ;
+    try
+    {
+        FRegLists.Lock();
+        //FRegLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsRegFacility *pRegFacility = new TItsRegFacility();
+
+                pRegFacility->Type  = pADO->FieldByName("FAC_TYPE")->AsString;
+                pRegFacility->Id    = pADO->FieldByName("FAC_ID")->AsString;
+                pRegFacility->Name  = pADO->FieldByName("FAC_NM")->AsString;
+                pRegFacility->DelYn = pADO->FieldByName("DEL_YN")->AsString;
+
+                pRegFacility->GridIndex = -1;
+
+				FRegLists.Push(pRegFacility->Type + pRegFacility->Id, pRegFacility);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("등록시설물정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("등록시설물정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FRegLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsFacilityManager::LoadFacilityMaster(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                     \r\n"
+           "  FROM TB_FCLT_INFR          \r\n"
+           " WHERE DEL_YN = 'N'          \r\n";
+//           " ORDER BY FCLT_TYPE, FCLT_ID \r\n";
+    try
+    {
+        TFacilityStatus *pStatus;
+        FListStatus.RemoveAll();
+
+        FLists.Lock();
+        //FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsFacility *pFacility = new TItsFacility();
+
+                pFacility->FCLT_ID         = pADO->FieldByName("FCLT_ID")->AsString;
+                pFacility->RFID_ID         = pADO->FieldByName("RFID_ID")->AsString;
+                pFacility->FCLT_TYPE       = pADO->FieldByName("FCLT_TYPE")->AsString;
+                pFacility->FCLT_LCTN       = pADO->FieldByName("FCLT_LCTN")->AsString;
+                pFacility->RSCE_YN         = pADO->FieldByName("RSCE_YN")->AsString;
+                pFacility->MDL_NM          = pADO->FieldByName("MDL_NM")->AsString;
+                pFacility->USE_YEAR        = pADO->FieldByName("USE_YEAR")->AsString;
+                if (pFacility->USE_YEAR == "") pFacility->USE_YEAR = "0";
+                pFacility->INWR_DT         = pADO->FieldByName("INWR_DT")->AsString;
+                pFacility->OTWR_DT         = pADO->FieldByName("OTWR_DT")->AsString;
+                pFacility->ISTL_DT         = pADO->FieldByName("ISTL_DT")->AsString;
+                pFacility->TAKT_DT         = pADO->FieldByName("TAKT_DT")->AsString;
+                pFacility->TAKT_RESN       = pADO->FieldByName("TAKT_RESN")->AsString;
+                pFacility->TAKN_DT         = pADO->FieldByName("TAKN_DT")->AsString;
+                pFacility->ABDN_DT         = pADO->FieldByName("ABDN_DT")->AsString;
+                pFacility->ADTN_NM         = pADO->FieldByName("ADTN_NM")->AsString;
+                pFacility->ADTN_DT         = pADO->FieldByName("ADTN_DT")->AsString;
+                pFacility->CHNG_NM         = pADO->FieldByName("CHNG_NM")->AsString;
+                pFacility->CHNG_DT         = pADO->FieldByName("CHNG_DT")->AsString;
+                pFacility->AMT             = pADO->FieldByName("AMT")->AsString;
+                pFacility->DEL_YN          = pADO->FieldByName("DEL_YN")->AsString;
+                pFacility->ISTL_CMPY_ID    = pADO->FieldByName("ISTL_CMPY_ID")->AsString;
+                pFacility->MNFC_CMPY_ID    = pADO->FieldByName("MNFC_CMPY_ID")->AsString;
+
+                pFacility->ISTL_LCTN_ADDR  = pADO->FieldByName("ISTL_LCTN_ADDR")->AsString;
+
+                pFacility->Sts00 = "-";
+
+                pFacility->GridIndex       = -1;	    // 메인폼에 뿌려지는 그리드 인덱스
+                pFacility->StatusGridIndex = -1;
+
+				FLists.Push(pFacility->FCLT_ID, pFacility);
+                pFacility->Completed = true;
+
+                pStatus = FListStatus.Find(pFacility->FCLT_TYPE);
+                if (!pStatus)
+                {
+                    pStatus = new TFacilityStatus();
+                    pStatus->Type   = pFacility->FCLT_TYPE;
+                    pStatus->Total  = 0;
+                    pStatus->Normal = 0;
+                    pStatus->Error  = 0;
+                    pStatus->Module = 0;
+                    pStatus->Collect= 0;
+
+                    FListStatus.Push(pFacility->FCLT_TYPE, pStatus);
+                }
+                pStatus->Total++;   /* 전체 갯수를 증가 시킴 */
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("시설물마스터정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("시설물마스터정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityWebCam(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.WEB_CMRA_NMBR,                     \r\n"
+           "       A.WEB_CMRA_ID,                       \r\n"
+           "       A.CMRA_IP,                           \r\n"
+           "       A.CMRA_PORT,                         \r\n"
+           "       A.STRM_SVR_IP,                       \r\n"
+           "       A.STRM_SVR_PORT,                     \r\n"
+           "       A.STRM_SESN_NM,                      \r\n"
+           "       A.X_CRDN,                            \r\n"
+           "       A.Y_CRDN,                            \r\n"
+           "       A.ISTL_LCTN_NM,                      \r\n"
+           "       A.ISTL_LCTN_ADDR,                    \r\n"
+           "       A.EQPM_KIND,                         \r\n"
+           "       A.DEL_YN,                            \r\n"
+           "       A.LINK_ID,                           \r\n"
+           "       B.STRM_RTSP_ADDR,                    \r\n"
+           "       B.STRM_RTMP_ADDR,                    \r\n"
+           "       B.STRM_HTTP_ADDR,                    \r\n"
+           "       B.STRM_STOR_ADDR                     \r\n"
+           "  FROM TB_WEB_CMRA A,                       \r\n"
+           "       TB_WEB_CMRA_STRM B                   \r\n"
+           " WHERE DEL_YN = 'N'                         \r\n"
+           "   AND A.WEB_CMRA_NMBR = B.WEB_CMRA_NMBR(+) \r\n";
+           //" ORDER BY A.WEB_CMRA_NMBR  \r\n";
+#if 0
+    sQry = "SELECT A.WEB_CMRA_NMBR,     \r\n"
+           "       A.WEB_CMRA_ID,       \r\n"
+           "       A.CMRA_IP,           \r\n"
+           "       A.CMRA_PORT,         \r\n"
+           "       A.STRM_SVR_IP,       \r\n"
+           "       A.STRM_SVR_PORT,     \r\n"
+           "       A.STRM_SESN_NM,      \r\n"
+           "       A.X_CRDN,            \r\n"
+           "       A.Y_CRDN,            \r\n"
+           "       A.ISTL_LCTN_NM,      \r\n"
+           "       A.ISTL_LCTN_ADDR,    \r\n"
+           "       A.EQPM_KIND,         \r\n"
+           "       A.DEL_YN,            \r\n"
+           "       A.LINK_ID,           \r\n"
+           "       B.STRM_RTSP_ADDR,    \r\n"
+           "       B.STRM_RTMP_ADDR,    \r\n"
+           "       B.STRM_HTTP_ADDR,    \r\n"
+           "       B.STRM_STOR_ADDR     \r\n"
+           "  FROM TB_WEB_CMRA A,       \r\n"
+           "       TB_WEB_CMRA_STRM B   \r\n"
+           " WHERE DEL_YN = 'N'         \r\n"
+           "   AND A.WEB_CMRA_NMBR = B.WEB_CMRA_NMBR(+) \r\n";
+           //" ORDER BY A.WEB_CMRA_NMBR  \r\n";
+#endif
+    try
+    {
+        FWebCamLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsWebCam *pObj = new TItsWebCam();
+
+                pObj->WEB_CMRA_NMBR     = pADO->FieldByName("WEB_CMRA_NMBR")->AsString;
+                pObj->WEB_CMRA_ID       = pADO->FieldByName("WEB_CMRA_ID")->AsString;
+                pObj->CMRA_IP           = pADO->FieldByName("CMRA_IP")->AsString;
+                pObj->CMRA_PORT         = pADO->FieldByName("CMRA_PORT")->AsString;
+                pObj->STRM_SVR_IP       = pADO->FieldByName("STRM_SVR_IP")->AsString;
+                pObj->STRM_SVR_PORT     = pADO->FieldByName("STRM_SVR_PORT")->AsString;
+                pObj->STRM_SESN_NM      = pADO->FieldByName("STRM_SESN_NM")->AsString;
+                pObj->X_CRDN            = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN            = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->ISTL_LCTN_NM      = pADO->FieldByName("ISTL_LCTN_NM")->AsString;
+                pObj->ISTL_LCTN_ADDR    = pADO->FieldByName("ISTL_LCTN_ADDR")->AsString;
+                pObj->EQPM_KIND         = pADO->FieldByName("EQPM_KIND")->AsString;
+                pObj->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->LINK_ID           = pADO->FieldByName("LINK_ID")->AsString;
+                pObj->STRM_RTSP_ADDR    = pADO->FieldByName("STRM_RTSP_ADDR")->AsString;
+                pObj->STRM_RTMP_ADDR    = pADO->FieldByName("STRM_RTMP_ADDR")->AsString;
+                pObj->STRM_HTTP_ADDR    = pADO->FieldByName("STRM_HTTP_ADDR")->AsString;
+                pObj->STRM_STOR_ADDR    = pADO->FieldByName("STRM_STOR_ADDR")->AsString;
+
+                pObj->ID                = "admin";
+                pObj->PSWD              = "4321";
+
+                pObj->FData1            = NULL;
+                pObj->FData2            = NULL;
+
+				FWebCamLists.Push(pObj->WEB_CMRA_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("웹카메라정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("웹카메라정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FWebCamLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityCctv(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT CCTV_MNGM_NMBR,         \r\n"
+           "       CCTV_CTLR_ID,           \r\n"
+           "       CCTV_CTLR_IP,           \r\n"
+           "       CCTV_CTLR_PORT,         \r\n"
+           "       CCTV_CAPT_IP,           \r\n"
+           "       CCTV_CAPT_PORT,         \r\n"
+           "       CCTV_FIBR_IP,           \r\n"
+           "       CCTV_ENCD_IP,           \r\n"
+           "       STRM_SVR_IP,            \r\n"
+           "       STRM_SVR_PORT,          \r\n"
+           "       STRM_SESN_NM,           \r\n"
+           "       NVL(X_CRDN, 0) X_CRDN,  \r\n"
+           "       NVL(Y_CRDN, 0) Y_CRDN,  \r\n"
+           "       ISTL_LCTN_NM,           \r\n"
+           "       ISTL_LCTN_ADDR,         \r\n"
+           "       CCTV_CHNL,              \r\n"
+           "       DEL_YN,                 \r\n"
+           "       FRST_REGR_NMBR,         \r\n"
+           "       FRST_RGST_DT,           \r\n"
+           "       LAST_CRPR_NMBR,         \r\n"
+           "       LAST_CRCT_DT,           \r\n"
+           "       LINK_ID,                \r\n"
+           "       CCTV_ID,                \r\n"
+           "       RELY_PORT,              \r\n"
+           "       STRM_RTSP_ADDR,         \r\n"
+           "       STRM_RTMP_ADDR,         \r\n"
+           "       STRM_HTTP_ADDR,         \r\n"
+           "       CCTV_TYPE               \r\n"
+           "  FROM TB_CCTV_CTLR            \r\n"
+           " WHERE DEL_YN = 'N'            \r\n";
+           //" ORDER BY CCTV_CTLR_ID         \r\n";
+    try
+    {
+        FLocalCctvCnt = 0;
+        FCctvLists.Lock();
+        //FCctvLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsCctv *pObj = new TItsCctv();
+
+                pObj->CCTV_MNGM_NMBR    = pADO->FieldByName("CCTV_MNGM_NMBR")->AsString;
+                pObj->CCTV_CTLR_ID      = pADO->FieldByName("CCTV_CTLR_ID")->AsString;
+                pObj->CCTV_CTLR_IP      = pADO->FieldByName("CCTV_CTLR_IP")->AsString;
+                pObj->CCTV_CTLR_PORT    = pADO->FieldByName("CCTV_CTLR_PORT")->AsString;
+                pObj->CCTV_CAPT_IP      = pADO->FieldByName("CCTV_CAPT_IP")->AsString;
+                pObj->CCTV_CAPT_PORT    = pADO->FieldByName("CCTV_CAPT_PORT")->AsString;
+                pObj->CCTV_FIBR_IP      = pADO->FieldByName("CCTV_FIBR_IP")->AsString;
+                pObj->CCTV_ENCD_IP      = pADO->FieldByName("CCTV_ENCD_IP")->AsString;
+                pObj->STRM_SVR_IP       = pADO->FieldByName("STRM_SVR_IP")->AsString;
+                pObj->STRM_SVR_PORT     = pADO->FieldByName("STRM_SVR_PORT")->AsString;
+                pObj->STRM_SESN_NM      = pADO->FieldByName("STRM_SESN_NM")->AsString;
+                pObj->X_CRDN            = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN            = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->ISTL_LCTN_NM      = pADO->FieldByName("ISTL_LCTN_NM")->AsString;
+                pObj->ISTL_LCTN_ADDR    = pADO->FieldByName("ISTL_LCTN_ADDR")->AsString;
+                pObj->CCTV_CHNL         = pADO->FieldByName("CCTV_CHNL")->AsString;
+                pObj->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->FRST_REGR_NMBR    = pADO->FieldByName("FRST_REGR_NMBR")->AsString;
+                pObj->FRST_RGST_DT      = pADO->FieldByName("FRST_RGST_DT")->AsString;
+                pObj->LAST_CRPR_NMBR    = pADO->FieldByName("LAST_CRPR_NMBR")->AsString;
+                pObj->LAST_CRCT_DT      = pADO->FieldByName("LAST_CRCT_DT")->AsString;
+                pObj->LINK_ID           = pADO->FieldByName("LINK_ID")->AsString;
+                pObj->CCTV_ID           = pADO->FieldByName("CCTV_ID")->AsString;
+                pObj->RELY_PORT         = pADO->FieldByName("RELY_PORT")->AsString;
+                pObj->STRM_RTSP_ADDR    = pADO->FieldByName("STRM_RTSP_ADDR")->AsString;
+                pObj->STRM_RTMP_ADDR    = pADO->FieldByName("STRM_RTMP_ADDR")->AsString;
+                pObj->STRM_HTTP_ADDR    = pADO->FieldByName("STRM_HTTP_ADDR")->AsString;
+                pObj->CCTV_TYPE         = pADO->FieldByName("CCTV_TYPE")->AsString;
+
+                pObj->FData1            = NULL;
+                pObj->FData2            = NULL;
+
+				FCctvLists.Push(pObj->CCTV_CTLR_ID, pObj);
+
+                if (pObj->CCTV_CTLR_ID.Pos(CenterId)) 
+                {
+                    pObj->LOCAL_YN = "Y";
+                    FLocalCctvCnt++;
+                }
+                else
+                {
+                    pObj->LOCAL_YN = "N";
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("CCTV정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("CCTV정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FCctvLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityVms(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT VMS_CTLR_NMBR,              \r\n"
+           "       VMS_ID,                     \r\n"
+           "       VMS_CTLR_ID,                \r\n"
+           "       VMS_NM,                     \r\n"
+           "       VMS_CTLR_IP,                \r\n"
+           "       VMS_USAG_TYPE_CD,           \r\n"
+           "       VMS_FRM_TYPE_CD,            \r\n"
+           "       VMS_TYPE_CD,                \r\n"
+           "       VMS_MODL_TYPE_CD,           \r\n"
+           "       VMS_CMNC_PORT,              \r\n"
+           "       OPER_MODE,                  \r\n"
+           "       VMS_CMNC_ERR_BASS_VAL,      \r\n"
+           "       VMS_NGHT_BRGH_STEP,         \r\n"
+           "       VMS_WEEK_BRGH_STEP,         \r\n"
+           "       VMS_PHSE_CHNG_CYCL,         \r\n"
+           "       VMS_MODL_ERR_RATE,          \r\n"
+           "       CMNCFAIL_SLOT_NMBR,         \r\n"
+           "       PWER_FAIL_SLOT_NMBR,        \r\n"
+           "       DEL_YN,                     \r\n"
+           "       CMTRINFR_CNCT_YN,           \r\n"
+           "       WTHRINFR_CNCT_YN,           \r\n"
+           "       ENVRINFR_CNCT_YN,           \r\n"
+           "       VMS_MAX_PHSE_NUM,           \r\n"
+           "       FRST_REGR_NMBR,             \r\n"
+           "       FRST_RGST_DT,               \r\n"
+           "       LAST_CRPR_NMBR,             \r\n"
+           "       LAST_CRCT_DT,               \r\n"
+           "       PANL_ON_TIME,               \r\n"
+           "       PANL_OFF_TIME,              \r\n"
+           "       PANL_PWER_MODE,             \r\n"
+           "       BRGH_MODE,                  \r\n"
+           "       WEB_CMRA_IP,                \r\n"
+           "       NVL(X_CRDN, 0) X_CRDN,      \r\n"
+           "       NVL(Y_CRDN, 0) Y_CRDN,      \r\n"
+           "       ISTL_LCTN_NM,               \r\n"
+           "       TRFC_STRG_USE_YN,           \r\n"
+           "       VMS_LOC_IFSC_ID,            \r\n"
+           "       WEB_CMRA_PORT,              \r\n"
+           "       WEB_CMRA_ID,                \r\n"
+           "       scp.dec_b64('DAMO','SCP','ARIA_256.SCPS', WEB_CMRA_PWD) AS WEB_CMRA_PWD,               \r\n"
+           "       STRM_SESN_NM                \r\n"
+           "  FROM TB_VMS_CTLR                 \r\n"
+           " WHERE DEL_YN = 'N'                \r\n";
+           //" ORDER BY VMS_CTLR_NMBR            \r\n";
+#else
+    sQry = "SELECT A.*,                                        \r\n"
+           "       (SELECT NVL(ATRB1, '320')                   \r\n"
+           "          FROM TB_CMMN_CD                          \r\n"
+           "         WHERE CMMN_CLSF_CD = 'VMP'                \r\n"
+           "           AND CMMN_CD = A.VMS_TYPE_CD) AS FORMW,  \r\n"
+           "       (SELECT NVL(ATRB2,  '64')                   \r\n"
+           "          FROM TB_CMMN_CD                          \r\n"
+           "         WHERE CMMN_CLSF_CD = 'VMP'                \r\n"
+           "           AND CMMN_CD = A.VMS_TYPE_CD) AS FORMH   \r\n"
+           "  FROM TB_VMS_CTLR A                               \r\n";
+           " WHERE DEL_YN = 'N'                                \r\n";
+#endif
+    try
+    {
+        FVmsLists.Lock();
+        //FVmsLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsVms *pObj = new TItsVms();
+
+                pObj->VMS_CTLR_NMBR         = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
+                pObj->VMS_ID                = pADO->FieldByName("VMS_ID")->AsString;
+                pObj->VMS_CTLR_ID           = pADO->FieldByName("VMS_CTLR_ID")->AsString;
+                pObj->VMS_NM                = pADO->FieldByName("VMS_NM")->AsString;
+                pObj->VMS_CTLR_IP           = pADO->FieldByName("VMS_CTLR_IP")->AsString;
+                pObj->VMS_USAG_TYPE_CD      = pADO->FieldByName("VMS_USAG_TYPE_CD")->AsString;
+                pObj->VMS_FRM_TYPE_CD       = pADO->FieldByName("VMS_FRM_TYPE_CD")->AsString;
+                pObj->VMS_TYPE_CD           = pADO->FieldByName("VMS_TYPE_CD")->AsString;
+                pObj->VMS_MODL_TYPE_CD      = pADO->FieldByName("VMS_MODL_TYPE_CD")->AsString;
+                pObj->VMS_CMNC_PORT         = pADO->FieldByName("VMS_CMNC_PORT")->AsString;
+                pObj->OPER_MODE             = pADO->FieldByName("OPER_MODE")->AsString;
+                pObj->VMS_CMNC_ERR_BASS_VAL = pADO->FieldByName("VMS_CMNC_ERR_BASS_VAL")->AsString;
+                pObj->VMS_NGHT_BRGH_STEP    = pADO->FieldByName("VMS_NGHT_BRGH_STEP")->AsString;
+                pObj->VMS_WEEK_BRGH_STEP    = pADO->FieldByName("VMS_WEEK_BRGH_STEP")->AsString;
+                pObj->VMS_PHSE_CHNG_CYCL    = pADO->FieldByName("VMS_PHSE_CHNG_CYCL")->AsString;
+                pObj->VMS_MODL_ERR_RATE     = pADO->FieldByName("VMS_MODL_ERR_RATE")->AsString;
+                pObj->CMNCFAIL_SLOT_NMBR    = pADO->FieldByName("CMNCFAIL_SLOT_NMBR")->AsString;
+                pObj->PWER_FAIL_SLOT_NMBR   = pADO->FieldByName("PWER_FAIL_SLOT_NMBR")->AsString;
+                pObj->DEL_YN                = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->CMTRINFR_CNCT_YN      = pADO->FieldByName("CMTRINFR_CNCT_YN")->AsString;
+                pObj->WTHRINFR_CNCT_YN      = pADO->FieldByName("WTHRINFR_CNCT_YN")->AsString;
+                pObj->ENVRINFR_CNCT_YN      = pADO->FieldByName("ENVRINFR_CNCT_YN")->AsString;
+                pObj->VMS_MAX_PHSE_NUM      = pADO->FieldByName("VMS_MAX_PHSE_NUM")->AsString;
+                pObj->FRST_REGR_NMBR        = pADO->FieldByName("FRST_REGR_NMBR")->AsString;
+                pObj->FRST_RGST_DT          = pADO->FieldByName("FRST_RGST_DT")->AsString;
+                pObj->LAST_CRPR_NMBR        = pADO->FieldByName("LAST_CRPR_NMBR")->AsString;
+                pObj->LAST_CRCT_DT          = pADO->FieldByName("LAST_CRCT_DT")->AsString;
+                pObj->PANL_ON_TIME          = pADO->FieldByName("PANL_ON_TIME")->AsString;
+                pObj->PANL_OFF_TIME         = pADO->FieldByName("PANL_OFF_TIME")->AsString;
+                pObj->PANL_PWER_MODE        = pADO->FieldByName("PANL_PWER_MODE")->AsString;
+                pObj->BRGH_MODE             = pADO->FieldByName("BRGH_MODE")->AsString;
+                pObj->WEB_CMRA_IP           = pADO->FieldByName("WEB_CMRA_IP")->AsString;
+                pObj->X_CRDN                = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN                = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->ISTL_LCTN_NM          = pADO->FieldByName("ISTL_LCTN_NM")->AsString;
+                pObj->TRFC_STRG_USE_YN      = pADO->FieldByName("TRFC_STRG_USE_YN")->AsString;
+
+                pObj->WEB_CMRA_PORT = pADO->FieldByName("WEB_CMRA_PORT")->AsString.Trim();
+                pObj->WEB_CMRA_ID   = pADO->FieldByName("WEB_CMRA_ID")->AsString.Trim();
+                pObj->WEB_CMRA_PSWD = pADO->FieldByName("WEB_CMRA_PWD")->AsString.Trim();
+                pObj->STRM_SESN_NM  = pADO->FieldByName("STRM_SESN_NM")->AsString.Trim();
+
+                pObj->WIDTH                 = pADO->FieldByName("FORMW")->AsString.Trim().ToIntDef(380);
+                pObj->HEIGHT                = pADO->FieldByName("FORMH")->AsString.Trim().ToIntDef(64);
+
+                pObj->ModVerCnt = 2;
+                pObj->ModHorCnt = 12;
+                if (pObj->VMS_TYPE_CD == "VMP0")
+                {
+                    pObj->ModVerCnt = 2;
+                    pObj->ModHorCnt = 10;
+                }
+                else
+                if (pObj->VMS_TYPE_CD == "VMP1")
+                {
+                    pObj->ModVerCnt = 10;
+                    pObj->ModHorCnt = 18;
+                }
+                else
+                if (pObj->VMS_TYPE_CD == "VMP2")
+                {
+                    pObj->ModVerCnt = 2*2;
+                    pObj->ModHorCnt = 12*2;
+                }
+                else
+                if (pObj->VMS_TYPE_CD == "VMP3")
+                {
+                    pObj->ModVerCnt = 1;
+                    pObj->ModHorCnt = 6;
+                }
+
+                pObj->FData1            = NULL;
+                pObj->FData2            = NULL;
+
+
+				//FVmsLists.Push(pObj->VMS_CTLR_NMBR, pObj);
+				FVmsLists.Push(pObj->VMS_CTLR_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("VMS정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("VMS정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FVmsLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityRse(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#ifdef USE_RSE
+    sQry = "SELECT RSEID,                    \r\n"
+           "       INSTDT,                   \r\n"
+           "       CITYCD,                   \r\n"
+           "       REGIONCD,                 \r\n"
+           "       AREACD,                   \r\n"
+           "       RSEIP,                    \r\n"
+           "       (COORDX/10000000) COORDX, \r\n"
+           "       (COORDY/10000000) COORDY, \r\n"
+           "       RADIUS1,                  \r\n"
+           "       RADIUS2,                  \r\n"
+           "       COMPCD,                   \r\n"
+           "       LOCATION,                 \r\n"
+           "       RSECONFIGID,              \r\n"
+           "       OBEPARAMID,               \r\n"
+           "       PORT,                     \r\n"
+           "       BRIDGE,                   \r\n"
+           "       COMYN                     \r\n"
+           "  FROM RSEMST                    \r\n";
+           //" ORDER BY RSEID                  \r\n";
+#else
+    return true;
+#endif
+
+    try
+    {
+        FRseLists.Lock();
+        //FRseLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsRse *pObj = new TItsRse();
+
+                pObj->RSEID		    = pADO->FieldByName("RSEID")->AsString;
+                //pObj->INSTDT		= pADO->FieldByName("INSTDT")->AsString;
+                pObj->CITYCD		= pADO->FieldByName("CITYCD")->AsString;
+                pObj->REGIONCD		= pADO->FieldByName("REGIONCD")->AsString;
+                pObj->AREACD		= pADO->FieldByName("AREACD")->AsString;
+                pObj->RSEIP		    = pADO->FieldByName("RSEIP")->AsString;
+                pObj->COORDX		= pADO->FieldByName("COORDX")->AsString;
+                pObj->COORDY		= pADO->FieldByName("COORDY")->AsString;
+                pObj->RADIUS1		= pADO->FieldByName("RADIUS1")->AsString;
+                pObj->RADIUS2		= pADO->FieldByName("RADIUS2")->AsString;
+                //pObj->COMPCD		= pADO->FieldByName("COMPCD")->AsString;
+                pObj->LOCATION		= pADO->FieldByName("LOCATION")->AsString;
+                //pObj->RSECONFIGID	= pADO->FieldByName("RSECONFIGID")->AsString;
+                //pObj->OBEPARAMID	= pADO->FieldByName("OBEPARAMID")->AsString;
+                //pObj->PORT		    = pADO->FieldByName("PORT")->AsString;
+                //pObj->BRIDGE		= pADO->FieldByName("BRIDGE")->AsString;
+                pObj->COMYN		    = pADO->FieldByName("COMYN")->AsString;
+
+				FRseLists.Push(pObj->RSEID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("RSE정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("RSE정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FRseLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityVds(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT CTLR_MNGM_NMBR,   \r\n"
+           "       CTLR_TYPE_CD,     \r\n"
+           "       VALD_YN,          \r\n"
+           "       X_CRDN,           \r\n"
+           "       Y_CRDN,           \r\n"
+           "       LCTN,             \r\n"
+           "       TRMN_IP,          \r\n"
+           "       TRMN_PORT,        \r\n"
+           "       CTLR_CLCT_CYCL,   \r\n"
+           "       CTLR_STTS_CYCL,   \r\n"
+           "       LOOP_BORD_NUM,    \r\n"
+           "       DLTR_NMBR,        \r\n"
+           "       DEL_DT,           \r\n"
+           "       DEL_YN,           \r\n"
+           "       FRST_REGR_NMBR,   \r\n"
+           "       FRST_RGST_DT,     \r\n"
+           "       LAST_CRPR_NMBR,   \r\n"
+           "       LAST_CRCT__DT,    \r\n"
+           "       VDS_CTLR_ID       \r\n"
+           "  FROM TB_VDS_CTLR       \r\n";
+           //" ORDER BY CTLR_MNGM_NMBR \r\n";
+
+    try
+    {
+        FVdsLists.Lock();
+        //FVdsLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsVds *pObj = new TItsVds();
+
+                pObj->CTLR_MNGM_NMBR    = pADO->FieldByName("CTLR_MNGM_NMBR")->AsString;
+                pObj->CTLR_TYPE_CD      = pADO->FieldByName("CTLR_TYPE_CD")->AsString;
+                pObj->VALD_YN           = pADO->FieldByName("VALD_YN")->AsString;
+                pObj->X_CRDN            = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN            = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->LCTN              = pADO->FieldByName("LCTN")->AsString;
+                pObj->TRMN_IP           = pADO->FieldByName("TRMN_IP")->AsString;
+                pObj->TRMN_PORT         = pADO->FieldByName("TRMN_PORT")->AsString;
+                pObj->CTLR_CLCT_CYCL    = pADO->FieldByName("CTLR_CLCT_CYCL")->AsString;
+                pObj->CTLR_STTS_CYCL    = pADO->FieldByName("CTLR_STTS_CYCL")->AsString;
+                pObj->LOOP_BORD_NUM     = pADO->FieldByName("LOOP_BORD_NUM")->AsString;
+                pObj->DLTR_NMBR         = pADO->FieldByName("DLTR_NMBR")->AsString;
+                pObj->DEL_DT            = pADO->FieldByName("DEL_DT")->AsString;
+                pObj->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->FRST_REGR_NMBR    = pADO->FieldByName("FRST_REGR_NMBR")->AsString;
+                pObj->FRST_RGST_DT      = pADO->FieldByName("FRST_RGST_DT")->AsString;
+                pObj->LAST_CRPR_NMBR    = pADO->FieldByName("LAST_CRPR_NMBR")->AsString;
+                pObj->LAST_CRCT__DT     = pADO->FieldByName("LAST_CRCT__DT")->AsString;
+                pObj->VDS_CTLR_ID       = pADO->FieldByName("VDS_CTLR_ID")->AsString;
+
+				//FVdsLists.Push(pObj->CTLR_MNGM_NMBR, pObj);
+				FVdsLists.Push(pObj->VDS_CTLR_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("VDS정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("VDS정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FVdsLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityAvi(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT AVI_CTLR_MNGM_NMBR,   \r\n"
+           "       AVI_ID,               \r\n"
+           "       LINK_ID,              \r\n"
+           "       AVI_LCTN_NM,          \r\n"
+           "       AVI_VALD_YN,          \r\n"
+           "       AVI_CTLR_IP,          \r\n"
+           "       AVI_CTLR_CMNC_PORT,   \r\n"
+           "       AVI_MAIN_CTLR_YN,     \r\n"
+           "       AVI_MNGM_LANE_NUM,    \r\n"
+           "       AVI_CMRA_NUM,         \r\n"
+           "       AVI_DTCT_NUM,         \r\n"
+           "       AVI_DTCT_NM,          \r\n"
+           "       AVI_CLCT_CYCL,        \r\n"
+           "       AVI_LAMP_AUTO_YN,     \r\n"
+           "       AVI_LAMP_ON_HMS,      \r\n"
+           "       AVI_LAMP_OFF_HMS,     \r\n"
+           "       AVI_LAMP_ON_YN,       \r\n"
+           "       X_CRDN,               \r\n"
+           "       Y_CRDN,               \r\n"
+           "       RMRK,                 \r\n"
+           "       DEL_YN,               \r\n"
+           "       FRST_REGR_NMBR,       \r\n"
+           "       FRST_RGST_DT,         \r\n"
+           "       LAST_CRPR_NMBR,       \r\n"
+           "       LAST_CRCT_DT          \r\n"
+           "  FROM TB_AVI_CTLR           \r\n";
+           //" ORDER BY AVI_CTLR_MNGM_NMBR \r\n";
+
+    try
+    {
+        FAviLists.Lock();
+        //FAviLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsAvi *pObj = new TItsAvi();
+
+                pObj->AVI_CTLR_MNGM_NMBR= pADO->FieldByName("AVI_CTLR_MNGM_NMBR")->AsString;
+                pObj->AVI_ID            = pADO->FieldByName("AVI_ID")->AsString;
+                pObj->LINK_ID           = pADO->FieldByName("LINK_ID")->AsString;             
+                pObj->AVI_LCTN_NM       = pADO->FieldByName("AVI_LCTN_NM")->AsString;         
+                pObj->AVI_VALD_YN       = pADO->FieldByName("AVI_VALD_YN")->AsString;         
+                pObj->AVI_CTLR_IP       = pADO->FieldByName("AVI_CTLR_IP")->AsString;         
+                pObj->AVI_CTLR_CMNC_PORT= pADO->FieldByName("AVI_CTLR_CMNC_PORT")->AsString;  
+                pObj->AVI_MAIN_CTLR_YN  = pADO->FieldByName("AVI_MAIN_CTLR_YN")->AsString;    
+                pObj->AVI_MNGM_LANE_NUM = pADO->FieldByName("AVI_MNGM_LANE_NUM")->AsString;   
+                pObj->AVI_CMRA_NUM      = pADO->FieldByName("AVI_CMRA_NUM")->AsString;        
+                pObj->AVI_DTCT_NUM      = pADO->FieldByName("AVI_DTCT_NUM")->AsString;        
+                pObj->AVI_DTCT_NM       = pADO->FieldByName("AVI_DTCT_NM")->AsString;         
+                pObj->AVI_CLCT_CYCL     = pADO->FieldByName("AVI_CLCT_CYCL")->AsString;       
+                pObj->AVI_LAMP_AUTO_YN  = pADO->FieldByName("AVI_LAMP_AUTO_YN")->AsString;    
+                pObj->AVI_LAMP_ON_HMS   = pADO->FieldByName("AVI_LAMP_ON_HMS")->AsString;     
+                pObj->AVI_LAMP_OFF_HMS  = pADO->FieldByName("AVI_LAMP_OFF_HMS")->AsString;    
+                pObj->AVI_LAMP_ON_YN    = pADO->FieldByName("AVI_LAMP_ON_YN")->AsString;      
+                pObj->X_CRDN            = pADO->FieldByName("X_CRDN")->AsString;              
+                pObj->Y_CRDN            = pADO->FieldByName("Y_CRDN")->AsString;              
+                pObj->RMRK              = pADO->FieldByName("RMRK")->AsString;                
+                pObj->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;              
+                pObj->FRST_REGR_NMBR    = pADO->FieldByName("FRST_REGR_NMBR")->AsString;      
+                pObj->FRST_RGST_DT      = pADO->FieldByName("FRST_RGST_DT")->AsString;        
+                pObj->LAST_CRPR_NMBR    = pADO->FieldByName("LAST_CRPR_NMBR")->AsString;      
+                pObj->LAST_CRCT_DT      = pADO->FieldByName("LAST_CRCT_DT")->AsString;        
+
+				//FAviLists.Push(pObj->AVI_CTLR_MNGM_NMBR, pObj);
+				FAviLists.Push(pObj->AVI_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("AVI정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("AVI정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FAviLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityDsrc(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT ID,              \r\n"
+           "       RSE_ID,          \r\n"
+           "       ROAD_SPOT_ID,    \r\n"
+           "       LOG_CNNC_ID,     \r\n"
+           "       LOG_CNNC_PW,     \r\n"
+           "       ISTL_LCTN_NM,    \r\n"
+           "       LCTN_X,          \r\n"
+           "       LCTN_Y,          \r\n"
+           "       IP,              \r\n"
+           "       PORT,            \r\n"
+           "       MNFC_CMPY_CD,    \r\n"
+           "       DEL_YN,          \r\n"
+           "       CLCT_ABNR_BASI   \r\n"
+           "  FROM TB_RSE_MSTR      \r\n";
+           //" ORDER BY ID            \r\n";
+
+    try
+    {
+        FDsrcLists.Lock();
+        //FDsrcLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsDsrc *pObj = new TItsDsrc();
+
+                pObj->ID             = pADO->FieldByName("ID")->AsString;
+                pObj->RSE_ID         = pADO->FieldByName("RSE_ID")->AsString;
+                pObj->ROAD_SPOT_ID   = pADO->FieldByName("ROAD_SPOT_ID")->AsString;
+                pObj->LOG_CNNC_ID    = pADO->FieldByName("LOG_CNNC_ID")->AsString;
+                pObj->LOG_CNNC_PW    = pADO->FieldByName("LOG_CNNC_PW")->AsString;
+                pObj->ISTL_LCTN_NM   = pADO->FieldByName("ISTL_LCTN_NM")->AsString;
+                pObj->LCTN_X         = pADO->FieldByName("LCTN_X")->AsString;
+                pObj->LCTN_Y         = pADO->FieldByName("LCTN_Y")->AsString;
+                pObj->IP             = pADO->FieldByName("IP")->AsString;
+                pObj->PORT           = pADO->FieldByName("PORT")->AsString;
+                pObj->MNFC_CMPY_CD   = pADO->FieldByName("MNFC_CMPY_CD")->AsString;
+                pObj->DEL_YN         = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->CLCT_ABNR_BASI = pADO->FieldByName("CLCT_ABNR_BASI")->AsInteger;
+
+				//FDsrcLists.Push(pObj->ID, pObj);
+				FDsrcLists.Push(pObj->RSE_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("DSRC정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("DSRC정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FDsrcLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityBit(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT A.BIT_ID,                      \r\n"
+           "       A.BIT_TYPE,                    \r\n"
+           "       A.FAN_MIN_TEMPERATURE,         \r\n"
+           "       A.FAN_MAX_TEMPERATURE,         \r\n"
+           "       A.HEATER_MIN_TEMPERATURE,      \r\n"
+           "       A.HEATER_MAX_TEMPERATURE,      \r\n"
+           "       A.INSTALL_STOP_ID,             \r\n"
+           "       B.STOP_ID,                     \r\n"
+           "       B.SERVICE_ID,                  \r\n"
+           "       B.STOP_TYPE,                   \r\n"
+           "       B.STOP_NAME,                   \r\n"
+           "       B.STOP_SHORTNAME,              \r\n"
+           "       B.STOP_EXPLAIN,                \r\n"
+           "       B.LAT AS COORDY,               \r\n"
+           "       B.LNG AS COORDX,               \r\n"
+           "       B.LINK_ID,                     \r\n"
+           "       B.USE_FLAG                     \r\n"
+           "  FROM BIT A, BUSSTOP B               \r\n"
+           " WHERE 1=1                            \r\n"
+           "   AND A.INSTALL_STOP_ID = B.STOP_ID  \r\n"
+           "   AND B.USE_FLAG        = '1'        \r\n";
+#else
+    sQry = "SELECT * FROM VW_BIT \r\n";
+#endif
+
+
+    try
+    {
+        FBitLists.Lock();
+        //FBitLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsBit *pObj = new TItsBit();
+
+                pObj->FCLT_ID                = pADO->FieldByName("FCLT_ID")->AsString;
+                pObj->FCLT_LCTN              = pADO->FieldByName("FCLT_LCTN")->AsString;
+                pObj->BIT_ID                 = pADO->FieldByName("BIT_ID")->AsString;
+                pObj->X_CRDN                 = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN                 = pADO->FieldByName("Y_CRDN")->AsString;
+
+                pObj->STOP_ID                = pADO->FieldByName("STOP_ID")->AsString;
+#if 0
+                pObj->BIT_TYPE               = pADO->FieldByName("BIT_TYPE")->AsString;
+                pObj->FAN_MIN_TEMPERATURE    = pADO->FieldByName("FAN_MIN_TEMPERATURE")->AsInteger;
+                pObj->FAN_MAX_TEMPERATURE    = pADO->FieldByName("FAN_MAX_TEMPERATURE")->AsInteger;
+                pObj->HEATER_MIN_TEMPERATURE = pADO->FieldByName("HEATER_MIN_TEMPERATURE")->AsInteger;
+                pObj->HEATER_MAX_TEMPERATURE = pADO->FieldByName("HEATER_MAX_TEMPERATURE")->AsInteger;
+                pObj->INSTALL_STOP_ID        = pADO->FieldByName("INSTALL_STOP_ID")->AsString;
+                pObj->SERVICE_ID             = pADO->FieldByName("SERVICE_ID")->AsString;
+                pObj->STOP_TYPE              = pADO->FieldByName("STOP_TYPE")->AsString;
+                pObj->STOP_NAME              = pADO->FieldByName("STOP_NAME")->AsString;
+                pObj->STOP_SHORTNAME         = pADO->FieldByName("STOP_SHORTNAME")->AsString;
+#endif
+                pObj->STOP_EXPLAIN           = pADO->FieldByName("REMARK")->AsString;
+                pObj->LINK_ID                = pADO->FieldByName("LINK_ID")->AsString;
+
+                pObj->DEL_YN  = "N";
+
+				FBitLists.Push(pObj->FCLT_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("BIT정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("BIT정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FBitLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilitySig(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT * FROM VW_SIG_CTLR      \r\n";
+
+    try
+    {
+        FSigLists.Lock();
+        //FSigLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsSig *pObj = new TItsSig();
+
+                pObj->FCLT_ID       = pADO->FieldByName("FCLT_ID")->AsString;
+                pObj->FCLT_LCTN     = pADO->FieldByName("FCLT_LCTN")->AsString;
+                pObj->SIG_ID        = pADO->FieldByName("FACIL_ID")->AsString;
+                pObj->X_CRDN        = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN        = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->MDL_NM        = pADO->FieldByName("MDL_NM")->AsString;
+
+                pObj->DEL_YN  = "N";
+
+				FSigLists.Push(pObj->FCLT_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("SIG정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("SIG정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FSigLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilitySigDet(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+return true;
+    sQry = "SELECT * FROM VW_SIG_LVDS      \r\n";
+
+    try
+    {
+        FSigDetLists.Lock();
+        //FSigDetLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsSigDet *pObj = new TItsSigDet();
+
+                pObj->FCLT_ID       = pADO->FieldByName("FCLT_ID")->AsString;
+                pObj->FCLT_LCTN     = pADO->FieldByName("FCLT_LCTN")->AsString;
+                pObj->SDET_ID       = pADO->FieldByName("FACIL_ID")->AsString;
+                pObj->X_CRDN        = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN        = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->MDL_NM        = pADO->FieldByName("MDL_NM")->AsString;
+                pObj->SIG_ID        = pADO->FieldByName("ASSETS_CODE")->AsString;
+
+                pObj->DEL_YN  = "N";
+
+				FSigDetLists.Push(pObj->FCLT_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("SIGDET정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("SIGDET정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FSigDetLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityPvms(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT * FROM VW_PIS_VMS \r\n";
+
+
+    try
+    {
+        FPisLists.Lock();
+        //FPisLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsPis *pObj = new TItsPis();
+
+                pObj->FCLT_ID   = pADO->FieldByName("FCLT_ID")->AsString;
+                pObj->FCLT_LCTN = pADO->FieldByName("FCLT_LCTN")->AsString;
+                pObj->PIS_ID    = pADO->FieldByName("FACIL_ID")->AsString;
+                pObj->X_CRDN    = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN    = pADO->FieldByName("Y_CRDN")->AsString;
+
+                pObj->DEL_YN  = "N";
+
+				FPisLists.Push(pObj->FCLT_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("PIS정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("PIS정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FPisLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityPvds(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT * FROM VW_PIS_CONT \r\n";
+
+
+    try
+    {
+        FPcsLists.Lock();
+        //FPcsLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsPcs *pObj = new TItsPcs();
+
+                pObj->FCLT_ID   = pADO->FieldByName("FCLT_ID")->AsString;
+                pObj->FCLT_LCTN = pADO->FieldByName("FCLT_LCTN")->AsString;
+                pObj->PCS_ID    = pADO->FieldByName("FACIL_ID")->AsString;
+                pObj->X_CRDN    = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN    = pADO->FieldByName("Y_CRDN")->AsString;
+
+                pObj->DEL_YN  = "N";
+
+				FPcsLists.Push(pObj->FCLT_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("PCS정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("PCS정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FPisLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT 'CCTV' AS FAC_TYPE, B.CCTV_CTLR_ID AS FAC_ID,                             \r\n"
+           "       CMNC_STTS_CD AS STTS_CD, CBOX_DOOR_STTS_CD AS DOOR_STTS_CD,               \r\n"
+           "       DECODE(CMNC_STTS_CD, 'CMS0', '0', 'CMS1', '1', '2') AS COMM,              \r\n"
+           "       DECODE(CBOX_DOOR_STTS_CD, 'CDS0', '0', 'CDS1', '1', '0') AS DOOR,         \r\n"
+           "       NVL(A.CBOX_TMPR, 0) AS CBOX_TMPR,                                         \r\n"
+           "       A.UPDT_DT AS STS00,                                                       \r\n"
+           "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+           "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+           "  FROM TB_CCTV_STTS A, TB_CCTV_CTLR B                                            \r\n"
+           " WHERE A.CCTV_MNGM_NMBR = B.CCTV_MNGM_NMBR                                       \r\n"
+           "   AND A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+           "UNION                                                                            \r\n"
+#ifdef USE_WCAM
+           "SELECT 'WCAM' AS FAC_TYPE, B.WEB_CMRA_ID AS FAC_ID,                              \r\n"
+           "       CMNC_STTS_CD AS STTS_CD, 'CDS0' AS DOOR_STTS_CD,                          \r\n"
+           "       DECODE(CMNC_STTS_CD, 'CMS0', '0', 'CMS1', '1', '0') AS COMM,              \r\n"
+           "       '0' AS DOOR, 0 AS CBOX_TMPR,                                              \r\n"
+           "       A.UPDT_DT AS STS00,                                                       \r\n"
+           "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+           "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+           "  FROM TB_WEB_CMRA_STTS A, TB_WEB_CMRA B                                         \r\n"
+           " WHERE A.WEB_CMRA_NMBR = B.WEB_CMRA_NMBR                                         \r\n"
+           "   AND A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+           "UNION                                                                            \r\n"
+#endif
+           "SELECT 'VMS' AS FAC_TYPE, B.VMS_CTLR_ID AS FAC_ID,                               \r\n"
+           "       CONN_STTS_CD AS STTS_CD, CBOXDOOR_OPEN_STTS_CD AS DOOR_STTS_CD,           \r\n"
+           "       DECODE(CONN_STTS_CD, 'CMS0', '0', 'CMS1', '1', '2') AS COMM,              \r\n"
+           "       DECODE(CBOXDOOR_OPEN_STTS_CD, 'CDS0', '0', 'CDS1', '1', '0') AS DOOR,     \r\n"
+           "       NVL(A.CBOX_TMPR, 0) AS CBOX_TMPR,                                         \r\n"
+           "       A.RGST_DT AS STS00,                                                       \r\n"
+           "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+           "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+           "  FROM TB_VMS_STTS_PRST A, TB_VMS_CTLR B                                         \r\n"
+           " WHERE A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR                                         \r\n"
+           "   AND A.RGST_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+           "UNION                                                                            \r\n"
+           "SELECT 'VDS' AS FAC_TYPE, B.VDS_CTLR_ID AS FAC_ID,                               \r\n"
+           "       CMNC_STTS_CD AS STTS_CD, CBOX_DOOR_STTS_CD AS DOOR_STTS_CD,               \r\n"
+           "       DECODE(CMNC_STTS_CD, 'CMS0', '0', 'CMS1', '1', '2') AS COMM,              \r\n"
+           "       DECODE(CBOX_DOOR_STTS_CD, 'CDS0', '0', 'CDS1', '1', '0') AS DOOR,         \r\n"
+           "       NVL(A.CBOX_TMPR, 0) AS CBOX_TMPR,                                         \r\n"
+           "       A.UPDT_DT AS STS00,                                                       \r\n"
+           "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+           "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+           "  FROM TB_VDS_CTLR_STTS A, TB_VDS_CTLR B                                         \r\n"
+           " WHERE A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+           "   AND A.CTLR_MNGM_NMBR = B.CTLR_MNGM_NMBR                                       \r\n"
+
+#ifdef USE_AVI
+           "UNION                                                                            \r\n"
+           "SELECT 'AVI' AS FAC_TYPE, B.AVI_ID AS FAC_ID,                                    \r\n"
+           "       CMNC_STTS_CD AS STTS_CD, CBOX_DOOR_STTS_CD AS DOOR_STTS_CD,               \r\n"
+           "       DECODE(CMNC_STTS_CD, 'CMS0', '0', 'CMS1', '1', '2') AS COMM,              \r\n"
+           "       DECODE(CBOX_DOOR_STTS_CD, 'CDS0', '0', 'CDS1', '1', '0') AS DOOR,         \r\n"
+           "       NVL(A.CBOX_TMPR, 0) AS CBOX_TMPR,                                         \r\n"
+           "       A.UPDT_DT AS STS00,                                                       \r\n"
+           "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+           "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+           "  FROM TB_AVI_CTLR_STTS A, TB_AVI_CTLR B                                         \r\n"
+           " WHERE A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+           "   AND A.AVI_CTLR_MNGM_NMBR = B.AVI_CTLR_MNGM_NMBR                               \r\n"
+#endif
+
+#ifdef USE_DSRC
+           "UNION                                                                            \r\n"
+           "SELECT 'DSRC' AS FAC_TYPE, B.RSE_ID AS FAC_ID,                                   \r\n"
+           "       DECODE(CMNC_STTS, '0', 'CMS0', 'CMS1') AS STTS_CD,                        \r\n"
+           "       DECODE(CNTL_DEVC_STTS, '0', 'CDS0', '4', 'CDS0', 'CDS1') AS DOOR_STTS_CD, \r\n"
+           "       DECODE(CMNC_STTS, '0', '0', '1') AS COMM,                                 \r\n"
+           "       '0' AS DOOR, 0 AS CBOX_TMPR,                                              \r\n"
+           "       A.CLCT_DT AS STS00,                                                       \r\n"
+           "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+           "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+           "  FROM TB_RSE_STTS_PNST A, TB_RSE_MSTR B                                         \r\n"
+           " WHERE A.CLCT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+           "   AND A.ID = B.ID                                                               \r\n";
+#endif
+#ifdef USE_RSE
+           "UNION                                                                            \r\n"
+           "SELECT 'RSE' AS FAC_TYPE, B.RSEID AS FAC_ID,                                     \r\n"
+           "       'CMS0' AS STTS_CD, 'CDS0' AS DOOR_STTS_CD,                                \r\n"
+           "       '0' AS COMM, '0' AS DOOR, 0 AS CBOX_TMPR,                                 \r\n"
+           "       A.COLLDT AS STS00,                                                        \r\n"
+           "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+           "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+           "  FROM RSEOPSTATE A, RSEMST B                                                    \r\n"
+           " WHERE B.RSEID = A.RSEID                                                         \r\n"
+           "   AND A.COLLDT > SYSDATE - 30/1440                                              \r\n"
+#endif
+
+#ifdef USE_BIT
+           "UNION                                                                            \r\n"
+           "SELECT 'BIT' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID,                            \r\n"
+           "       CONN_STATE AS STTS_CD, 'CDS0' AS DOOR_STTS_CD,                            \r\n"
+           "       DECODE(CONN_STATE, 'CMS0', '0', '1') AS COMM,                             \r\n"
+           "       '0' AS DOOR, 0 AS CBOX_TMPR,                                              \r\n"
+           "       UPDATE_DT AS STS00,                                                       \r\n"
+           "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+           "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+           "  FROM VW_BIT_STATUS                                                             \r\n"
+#endif
+
+#ifdef USE_SIG
+           "UNION                                                                            \r\n"
+           "SELECT 'SIG' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID,                            \r\n"
+           "       CONN_STATE AS STTS_CD, DOOR_STATE AS DOOR_STTS_CD,                        \r\n"
+           "       DECODE(CONN_STATE, 'CMS0', '0', '1') AS COMM,                             \r\n"
+           "       DECODE(DOOR_STATE, 'CDS0', '0', 'CDS1', '1', '0') AS DOOR,                \r\n"
+           "       0 AS CBOX_TMPR,                                                           \r\n"
+           "       UPDATE_DT AS STS00,                                                       \r\n"
+           "       '0' AS STS01, '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,     \r\n"
+           "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+           "  FROM VW_SIG_CTLR_STATUS                                                        \r\n"
+#endif
+
+#ifdef USE_SIGDET
+           "UNION                                                                            \r\n"
+           "SELECT 'LVD' AS FAC_TYPE, FCLT_ID AS FAC_ID,                                     \r\n"
+           "       DECODE(DISCONN_STATE, 'STS0', 'CMS0', 'CMS1') AS STTS_CD,                 \r\n"
+           "       'CDS0' AS DOOR_STTS_CD,                                                   \r\n"
+           "       DECODE(DISCONN_STATE, 'STS0', '0', '1') AS COMM,                          \r\n"
+           "       '0' AS DOOR, 0 AS CBOX_TMPR                                               \r\n"
+           "  FROM VW_SIG_LVDS_STATUS                                                        \r\n"
+#endif
+
+#ifdef USE_PVMS
+           "UNION                                                                            \r\n"
+           "SELECT 'PVMS' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID,                           \r\n"
+           "       DECODE(COMM_STATE, 0, 'CMS0', 'CMS1') AS STTS_CD,                         \r\n"
+           "       DECODE(DOOR_STATE, 0, 'CDS0', 'CDS1') AS DOOR_STTS_CD,                    \r\n"
+           "       DECODE(COMM_STATE, 0, '0', '1') AS COMM, '0' AS DOOR,                     \r\n"
+           "       0 AS CBOX_TMPR,                                                           \r\n"
+           "       UPDATE_DT             AS STS00,                                           \r\n"
+           "       '0'                   AS STS01,                                           \r\n"
+           "       TO_CHAR(POWER_STATE)  AS STS02,                                           \r\n"
+           "       TO_CHAR(MODULE_STATE) AS STS03,                                           \r\n"
+           "       TO_CHAR(FAN_STATE)    AS STS04,                                           \r\n"
+           "       TO_CHAR(HEATER_STATE) AS STS05,                                           \r\n"
+           "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10      \r\n"
+           "  FROM VW_PIS_VMS_STATUS                                                         \r\n"
+#endif
+
+#ifdef USE_PVDS
+           "UNION                                                                                           \r\n"
+           "SELECT 'PVMS' AS FAC_TYPE, TO_CHAR(FCLT_ID) AS FAC_ID,                                          \r\n"
+           "       DECODE(COMM_STATE, '0', 'CMS0', 'CMS1') AS STTS_CD,                                      \r\n"
+           "       'CDS0' AS DOOR_STTS_CD,                                                                  \r\n"
+           "       DECODE(COMM_STATE, '0', '0', '1') AS COMM, '0' AS DOOR,                                  \r\n"
+           "       0 AS CBOX_TMPR,                                                                          \r\n"
+           "       UPDATE_DT           AS STS00,                                                            \r\n"
+           "       TO_CHAR(CONT_STATE) AS STS01,                                                            \r\n"
+           "       '0' AS STS02, '0' AS STS03, '0' AS STS04, '0' AS STS05,                                  \r\n"
+           "       '0' AS STS06, '0' AS STS07, '0' AS STS08, '0' AS STS09, '0' AS STS10                     \r\n"
+           "  FROM VW_PIS_CONT_STATUS                                                                       \r\n"
+#endif
+
+           ;
+
+    try
+    {
+        TItsFacility *pFacility = NULL;
+
+        FLists.Lock();
+
+        FOR_STL(TItsFacility*, pObj, ItsFacilityManager->FLists)
+        {
+            pObj->FCollCntBase = 0;
+            pObj->FCollCntCurr = 0;
+            pObj->FCollError   = false;
+
+            pObj->FComm = state_error;
+            pObj->FDoor = "0";
+            pObj->FCommStatus = "CMS1";
+            pObj->FDoorStatus = "CDS0";
+
+            if (pObj->FCLT_TYPE == "CCTV" ||
+                pObj->FCLT_TYPE == "VMS"  ||
+                pObj->FCLT_TYPE == "VDS"  ||
+                pObj->FCLT_TYPE == "AVI")
+            {
+                pObj->FCBoxTmpr = "?";
+            }
+            else
+            {
+                pObj->FCBoxTmpr = "-";
+            }
+        }
+
+        FOR_STL(TFacilityStatus*, pStatus, ItsFacilityManager->FListStatus)
+        {
+            //pStatus->Total  = 0; 전체 수량은 초기화하지 않는다.
+            pStatus->Normal = 0;
+            pStatus->Error  = 0;
+            pStatus->Module = 0;
+            pStatus->Collect= 0;
+        }
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sId = pADO->FieldByName("FAC_ID")->AsString;
+                pFacility = ItsFacilityManager->FLists.Find(sId);
+                if (!pFacility) continue;
+
+                pFacility->FCommStatus = pADO->FieldByName("STTS_CD")->AsString;
+                pFacility->FDoorStatus = pADO->FieldByName("DOOR_STTS_CD")->AsString;
+
+                pFacility->FComm = pADO->FieldByName("COMM")->AsString;
+                pFacility->FDoor = pADO->FieldByName("DOOR")->AsString;
+
+                pFacility->Sts00 = pADO->FieldByName("STS00")->AsString;
+                pFacility->Sts01 = pADO->FieldByName("STS01")->AsString;
+                pFacility->Sts02 = pADO->FieldByName("STS02")->AsString;
+                pFacility->Sts03 = pADO->FieldByName("STS03")->AsString;
+                pFacility->Sts04 = pADO->FieldByName("STS04")->AsString;
+                pFacility->Sts05 = pADO->FieldByName("STS05")->AsString;
+                pFacility->Sts06 = pADO->FieldByName("STS06")->AsString;
+                pFacility->Sts07 = pADO->FieldByName("STS07")->AsString;
+                pFacility->Sts08 = pADO->FieldByName("STS08")->AsString;
+                pFacility->Sts09 = pADO->FieldByName("STS09")->AsString;
+                pFacility->Sts10 = pADO->FieldByName("STS10")->AsString;
+
+                //if (pFacility->FCommStatus == "CMS0") pFacility->FComm = "1";
+                //else if (pFacility->FCommStatus == "CMS1") pFacility->FComm = "0";
+                //else if (pFacility->FCommStatus == "CMS2") pFacility->FComm = "0";
+
+                //if (pFacility->FDoorStatus == "CDS1") pFacility->FDoor = "1";
+                //else if (pFacility->FDoorStatus == "CMS1") pFacility->FComm = "0";
+                //else if (pFacility->FDoorStatus == "CMS2") pFacility->FComm = "0";
+
+                if (pFacility->FCLT_TYPE == "CCTV" ||
+                    pFacility->FCLT_TYPE == "VMS" ||
+                    pFacility->FCLT_TYPE == "VDS" ||
+                    pFacility->FCLT_TYPE == "AVI")
+                {
+                    pFacility->FCBoxTmpr = pADO->FieldByName("CBOX_TMPR")->AsString;
+                }
+
+                if (pFacility->FComm == state_normal)
+                {
+                    //통신이 정상인데 함체문이 열려있으면 모듈이상으로 처리
+#if 0
+                    if (pFacility->FDoor == "1")
+                        pFacility->FComm = state_module; //모듈이상(함체문 열림)
+#endif
+                }
+
+                TFacilityStatus *pStatus = ItsFacilityManager->FListStatus.Find(pFacility->FCLT_TYPE);
+                if (pStatus)
+                {
+                    if (pFacility->FComm == state_error)
+                    {
+                        pStatus->Error++;
+                    }
+                    else
+                    if (pFacility->FComm == state_module)
+                    {
+                        //pStatus->Module++;
+                    }
+                }
+            }
+
+            //수집데이터를 처리하구 수집오류=false로 설정함
+            //LoadDsrcCollectStatusFromDb(ADbConn);
+            LoadVdsCollectStatusFromDb(ADbConn);
+#ifdef USE_AVI
+            LoadAviCollectStatusFromDb(ADbConn);
+#endif
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("시설물상태정보조회", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("시설물상태정보조회", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        // 최종 모듈이상을 체크한다.
+        FOR_STL(TItsFacility*, pTmpObj, ItsFacilityManager->FLists)
+        {
+            if (pTmpObj->FComm != state_error)
+            {
+                //통신이 정상인 경우에만(모듈이상이나 통신이상인 경우에는 이미처리가 되어있는거임...
+                if (pTmpObj->FCollError)
+                {
+                    //수집이상이 발생한 경우임. ==> 모듈이상으로 처리하고 모듈오류갯수 증가시킴
+                    TFacilityStatus *pStatus = ItsFacilityManager->FListStatus.Find(pTmpObj->FCLT_TYPE);
+                    if (pStatus)
+                    {
+                        //pStatus->Module++;
+                        pStatus->Collect++;
+                    }
+                }
+            }
+        }
+
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadDsrcCollectStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT X.ID, X.RSE_ID, X.CLCT_ABNR_BASI,                                 \r\n"
+           "       Y.STAT_DT, NVL(Y.CLCT_NUM, 0) AS CLCT_NUM                         \r\n"
+           "  FROM (SELECT M.ID, M.RSE_ID, M.CLCT_ABNR_BASI                          \r\n"
+           "          FROM TB_RSE_MSTR M                                             \r\n"
+           "         WHERE M.DEL_YN <> 'Y'                                           \r\n"
+           "       ) X,                                                              \r\n"
+           "       (SELECT P.ID, P.STAT_DT, P.CLCT_NUM                               \r\n"
+           "          FROM TB_RSE_OBU_CLCT_HH_PNST P                                 \r\n"
+           "         WHERE P.STAT_DT >= TO_CHAR(SYSDATE-2/1440, 'YYYYMMDDHH24MISS')  \r\n"
+           "       ) Y                                                               \r\n"
+           " WHERE X.ID = Y.ID(+)                                                    \r\n";
+
+#if 0
+    sQry = "SELECT X.ID, X.RSE_ID, X.CLCT_ABNR_BASI,                                                         \r\n"
+           "       Y.STAT_DT, NVL(Y.CLCT_NUM, 0) AS CLCT_NUM                                                 \r\n"
+           "  FROM (SELECT M.ID, M.RSE_ID, M.CLCT_ABNR_BASI                                                  \r\n"
+           "          FROM TB_RSE_MSTR M                                                                     \r\n"
+           "         WHERE M.DEL_YN <> 'Y'                                                                   \r\n"
+           "       ) X,                                                                                      \r\n"
+           "       (SELECT ID, STAT_DT, CLCT_NUM                                                             \r\n"
+           "          FROM TB_RSE_OBU_CLCT_HH_PNST                                                           \r\n"
+           "         WHERE (ID, STAT_DT) IN (SELECT P.ID, MAX(P.STAT_DT)                                     \r\n"
+           "                                  FROM TB_RSE_OBU_CLCT_HH_PNST P                                 \r\n"
+           "                                 WHERE P.STAT_DT >= TO_CHAR(SYSDATE-2/1440, 'YYYYMMDDHH24MISS')  \r\n"
+           "                                 GROUP BY P.ID)                                                  \r\n"
+           "       ) Y                                                                                       \r\n"
+           " WHERE X.ID = Y.ID(+)                                                                            \r\n";
+#endif
+    try
+    {
+        TItsFacility *pFacility = NULL;
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sId = pADO->FieldByName("RSE_ID")->AsString;
+                pFacility = ItsFacilityManager->FLists.Find(sId);
+                if (!pFacility) continue;
+
+                pFacility->FCollCntBase = pADO->FieldByName("CLCT_ABNR_BASI")->AsInteger;
+                pFacility->FCollCntCurr = pADO->FieldByName("CLCT_NUM")->AsInteger;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("DSRC수집상태정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("DSRC수집상태정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadVdsCollectStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 1
+    sQry = "SELECT A.CTLR_MNGM_NMBR, A.VDS_CTLR_ID, NVL(B.COLCNT, 0) AS COLCNT                \r\n"
+           "  FROM TB_VDS_CTLR A,                                                             \r\n"
+           "       (SELECT A.CTLR_MNGM_NMBR, MAX(B.OCRR_DT) AS OCRR_DT, COUNT(1) AS COLCNT    \r\n"
+           "          FROM TB_VDS_DTCT_MSTR A, TB_VDS_DTCT_RAW_PNST B                         \r\n"
+           "         WHERE A.DTCT_NMBR = B.DTCT_NMBR                                          \r\n"
+           "           AND B.OCRR_DT >= TO_CHAR(SYSDATE-10/1440, 'YYYYMMDDHH24MISS')          \r\n"
+           "         GROUP BY A.CTLR_MNGM_NMBR ) B                                            \r\n"
+           " WHERE A.DEL_YN = 'N'                                                             \r\n"
+           "   AND A.CTLR_MNGM_NMBR = B.CTLR_MNGM_NMBR(+)                                     \r\n";
+#else
+    sQry = "SELECT CTLR_NMBR AS CTLR_MNGM_NMBR, CTLR_ID AS VDS_CTLR_ID, COLCNT                                \r\n"
+           "  FROM (SELECT A.CTLR_MNGM_NMBR AS CTLR_NMBR, A.VDS_CTLR_ID AS CTLR_ID, A.LCTN AS CTLR_NM,        \r\n"
+           "               NVL(C.UPDT_DT, '-') AS UPDT_DT, NVL(C.CMNC_STTS_CD, 'CMS1') AS COMM_CD,            \r\n"
+           "               NVL(C.COLCNT, 0) AS COLCNT, NVL(B.COMMERRCNT, 0) AS COMMERRCNT                     \r\n"
+           "          FROM TB_VDS_CTLR A,                                                                     \r\n"
+           "               (SELECT CTLR_MNGM_NMBR, COUNT(1) AS COMMERRCNT                                     \r\n"
+           "                  FROM TB_VDS_CTLR_STTS_RAW                                                       \r\n"
+           "                 WHERE 1=1                                                                        \r\n"
+           "                   AND CMNC_STTS_CD <> 'CMS0'                                                     \r\n"
+           "                   AND OCRR_DT >= TO_CHAR(TRUNC(SYSDATE), 'YYYYMMDD') || '000000'                 \r\n"
+           "                 GROUP BY CTLR_MNGM_NMBR                                                          \r\n"
+           "               ) B,                                                                               \r\n"
+           "               (SELECT X.CTLR_MNGM_NMBR, X.UPDT_DT, X.CMNC_STTS_CD, NVL(Y.COLCNT, 0) AS COLCNT    \r\n"
+           "                  FROM TB_VDS_CTLR_STTS X,                                                        \r\n"
+           "                       (SELECT A.CTLR_MNGM_NMBR, COUNT(1) AS COLCNT                               \r\n"
+           "                          FROM TB_VDS_DTCT_MSTR A, TB_VDS_DTCT_RAW_PNST B                         \r\n"
+           "                         WHERE 1=1                                                                \r\n"
+           "                           AND A.DTCT_NMBR = B.DTCT_NMBR                                          \r\n"
+           "                           AND B.OCRR_DT >= TO_CHAR(SYSDATE-10/1440, 'YYYYMMDDHH24MISS')          \r\n"
+           "                         GROUP BY A.CTLR_MNGM_NMBR ) Y                                            \r\n"
+           "                 WHERE 1=1                                                                        \r\n"
+           "                   AND X.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                   \r\n"
+           "                   AND X.CTLR_MNGM_NMBR = Y.CTLR_MNGM_NMBR(+)                                     \r\n"
+           "               ) C                                                                                \r\n"
+           "         WHERE 1=1                                                                                \r\n"
+           "           AND A.DEL_YN = 'N'                                                                     \r\n"
+           "           AND A.CTLR_MNGM_NMBR = B.CTLR_MNGM_NMBR(+)                                             \r\n"
+           "           AND A.CTLR_MNGM_NMBR = C.CTLR_MNGM_NMBR(+)                                             \r\n"
+           "       )                                                                                          \r\n"
+           " WHERE 1=1                                                                                        \r\n"
+           "   AND (COMM_CD = 'CMS0' AND COLCNT = 0)                                                          \r\n";
+#endif
+
+    try
+    {
+        TItsFacility *pFacility = NULL;
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            pADO->First();
+
+            String sVdsId;
+            int    nColCnt;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                sVdsId = pADO->FieldByName("VDS_CTLR_ID")->AsString;
+                pFacility = ItsFacilityManager->FLists.Find(sVdsId);
+                if (!pFacility)
+                {
+                    continue;
+                }
+
+                nColCnt = pADO->FieldByName("COLCNT")->AsInteger;
+                if (nColCnt == 0)
+                {
+                    if (pFacility->FComm != state_error)
+                    {
+                        pFacility->FCollError = true;
+                    }
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("VDS수집상태정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("VDS수집상태정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadAviCollectStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.AVI_CTLR_MNGM_NMBR, A.AVI_ID, NVL(B.COLCNT, 0) AS COLCNT                \r\n"
+           "  FROM TB_AVI_CTLR A,                                                            \r\n"
+           "       (SELECT AVI_CTLR_MNGM_NMBR, MAX(CRTN_DT) AS CRTN_DT, COUNT(1) AS COLCNT   \r\n"
+           "          FROM TB_AVI_PASS_VHCL_PNST                                             \r\n"
+           "         WHERE CRTN_DT >= TO_CHAR(SYSDATE-10/1440, 'YYYYMMDDHH24MISS')           \r\n"
+           "         GROUP BY AVI_CTLR_MNGM_NMBR ) B                                         \r\n"
+           " WHERE A.DEL_YN = 'N'                                                            \r\n"
+           "   AND A.AVI_CTLR_MNGM_NMBR = B.AVI_CTLR_MNGM_NMBR(+)                            \r\n";
+
+    try
+    {
+        TItsFacility *pFacility = NULL;
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            pADO->First();
+
+            String sAviId;
+            int    nColCnt;
+
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                sAviId = pADO->FieldByName("AVI_ID")->AsString;
+                pFacility = ItsFacilityManager->FLists.Find(sAviId);
+                if (!pFacility)
+                {
+                    continue;
+                }
+
+                nColCnt = pADO->FieldByName("COLCNT")->AsInteger;
+                if (nColCnt == 0)
+                {
+                    if (pFacility->FComm != state_error)
+                    {
+                        pFacility->FCollError = true;
+                    }
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("AVI수집상태정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("AVI수집상태정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 581 - 0
COMMON/CDS/CDSFacilityF_back.h

@@ -0,0 +1,581 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSFacilityFH
+#define CDSFacilityFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+#include "CDSDsrcF.h"
+#include "CDSVdsF.h"
+#include "CDSAviF.h"
+//---------------------------------------------------------------------------
+
+#define state_normal    "0"
+#define state_error     "1"
+#define state_module    "2"
+#define state_collect   "3"
+
+/*
+*  Web Camera class
+*/
+class TItsWebCam
+{
+public:
+    TItsWebCam(){}
+    virtual ~TItsWebCam(){}
+
+//COMMENT ON TABLE ITSDBA.TB_WEB_CMRA;        //'웹 카메라';
+    String	WEB_CMRA_NMBR;      //'웹 카메라 번호';
+    String	WEB_CMRA_ID;        //'웹 카메라 ID';
+    String	CMRA_IP;            //'카메라 아이피';
+    String	CMRA_PORT;          //'카메라 포트';
+    String	STRM_SVR_IP;        //'스트리밍 서버 아이피';
+    String	STRM_SVR_PORT;      //'스트리밍 서버 포트';
+    String	STRM_SESN_NM;       //'스트리밍 세션 명';
+    String	X_CRDN;             //'X 좌표';
+    String	Y_CRDN;             //'Y 좌표';
+    String	ISTL_LCTN_NM;       //'설치 위치 명';
+    String	ISTL_LCTN_ADDR;     //'설치 위치 주소';
+    String	EQPM_KIND;          //'장비 종류';
+    String	DEL_YN;             //'삭제 여부';
+    String	LINK_ID;            //'링크ID';
+
+//COMMENT ON TABLE ITSDBA.TB_WEB_CMRA_STRM IS '웹 카메라 스트리밍';
+//COMMENT ON COLUMN ITSDBA.TB_WEB_CMRA_STRM.WEB_CMRA_NMBR IS '웹 카메라 번호';
+    String	STRM_RTSP_ADDR;     //'스트리밍 RTSP 주소';
+    String	STRM_RTMP_ADDR;     //'스트리밍 RTMP 주소';
+    String	STRM_HTTP_ADDR;     //'스트리밍 HTTP 주소';
+    String	STRM_STOR_ADDR;     //'스트리밍 저장 주소';
+
+    String  ID;
+    String  PSWD;
+
+    void    *FData1;
+    void    *FData2;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Cctv class
+*/
+class TItsCctv
+{
+public:
+    TItsCctv(){}
+    virtual ~TItsCctv(){}
+
+    String	CCTV_MNGM_NMBR;     //CCTV 관리 번호';
+    String	CCTV_CTLR_ID;       //CCTV 제어기 ID';
+    String	CCTV_CTLR_IP;       //CCTV 제어기 아이피';
+    String	CCTV_CTLR_PORT;     //CCTV 제어기 포트';
+    String	CCTV_CAPT_IP;       //CCTV 자막기 아이피';
+    String	CCTV_CAPT_PORT;     //CCTV 자막기 포트';
+    String	CCTV_FIBR_IP;       //CCTV 광장비 아이피';
+    String	CCTV_ENCD_IP;       //CCTV 인코더 아이피';
+    String	STRM_SVR_IP;        //스트리밍 서버 아이피';
+    String	STRM_SVR_PORT;      //스트리밍 서버 포트';
+    String	STRM_SESN_NM;       //스트리밍 세션 명';
+    String	X_CRDN;             //X 좌표';
+    String	Y_CRDN;             //Y 좌표';
+    String	ISTL_LCTN_NM;       //설치 위치 명';
+    String	ISTL_LCTN_ADDR;     //설치 위치 주소';
+    String	CCTV_CHNL;          //CCTV 채널';
+    String	DEL_YN;             //삭제 여부';
+    String	FRST_REGR_NMBR;     //최초 등록자 번호';
+    String	FRST_RGST_DT;       //최초 등록 일시';
+    String	LAST_CRPR_NMBR;     //최종 수정자 번호';
+    String	LAST_CRCT_DT;       //최종 수정 일시';
+    String	LINK_ID;            //링크ID';
+    String  NODE_ID;            //노드ID
+    String	CCTV_ID;            //공단 CCTV ID';
+    String	RELY_PORT;          //연계 포트';
+    String	STRM_RTSP_ADDR;
+    String	STRM_RTMP_ADDR;
+    String	STRM_HTTP_ADDR;
+    String  LOCAL_YN;
+
+    //FOR GUMI
+    String  CCTV_TYPE;          //	N	VARCHAR2(10)	Y			CCTV유형
+
+    void    *FData1;
+    void    *FData2;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Vms class
+*/
+class TItsVms
+{
+public:
+    TItsVms(){}
+    virtual ~TItsVms(){}
+
+    String VMS_CTLR_NMBR;           //'VMS 제어기 번호';
+    String VMS_ID;                  //'VMS ID';
+    String VMS_CTLR_ID;             //'VMS 제어기 ID';
+    String VMS_NM;                  //'VMS 명';
+    String VMS_CTLR_IP;             //'VMS 제어기 아이피';
+    String VMS_USAG_TYPE_CD;        //'VMS 용도 유형 코드';
+    String VMS_FRM_TYPE_CD;         //'VMS 형식 유형 코드';
+    String VMS_TYPE_CD;             //'VMS 유형 코드';
+    String VMS_MODL_TYPE_CD;        //'VMS 모듈 유형 코드';
+    String VMS_CMNC_PORT;           //'VMS 통신 포트';
+    String OPER_MODE;               //'운영 모드';
+    String VMS_CMNC_ERR_BASS_VAL;   // 'VMS 통신 오류 기본 값';
+    String VMS_NGHT_BRGH_STEP;      //'VMS 야간 휘도 단계';
+    String VMS_WEEK_BRGH_STEP;      //'VMS 주간 휘도 단계';
+    String VMS_PHSE_CHNG_CYCL;      //'VMS 표출면 변경 주기';
+    String VMS_MODL_ERR_RATE;       //'VMS 모듈 오류 율';
+    String CMNCFAIL_SLOT_NMBR;      //'통신장애 SLOT 번호';
+    String PWER_FAIL_SLOT_NMBR;     //'전원 장애 SLOT 번호';
+    String DEL_YN;                  //'삭제 여부';
+    String CMTRINFR_CNCT_YN;        //'소통정보 연계 여부';
+    String WTHRINFR_CNCT_YN;        //'기상정보 연계 여부';
+    String ENVRINFR_CNCT_YN;        //'환경정보 연계 여부';
+    String VMS_MAX_PHSE_NUM;        //'VMS 최대 표출면 개수';
+    String FRST_REGR_NMBR;          //'최초 등록자 번호';
+    String FRST_RGST_DT;            //'최초 등록 일시';
+    String LAST_CRPR_NMBR;          //'최종 수정자 번호';
+    String LAST_CRCT_DT;            //'최종 수정 일시';
+    String PANL_ON_TIME;            //'전광판 ON TIME';
+    String PANL_OFF_TIME;           //'전광판 OFF TIME';
+    String PANL_PWER_MODE;          //'전광판 전원 모드';
+    String BRGH_MODE;               //'휘도 모드';
+    String WEB_CMRA_IP;             //'웹 카메라 아이피';
+    String STRM_SESN_NM;            //'스트리밍 세션 명';
+    String X_CRDN;                  //'X 좌표';
+    String Y_CRDN;                  //'Y 좌표';
+    String ISTL_LCTN_NM;            //'설치 위치 명';
+    String TRFC_STRG_USE_YN;        //'교통 전략 사용 여부';
+
+    String WEB_CMRA_PORT;
+    String WEB_CMRA_ID;
+    String WEB_CMRA_PSWD;
+
+    //크기
+    int     WIDTH;
+    int     HEIGHT;
+    int     ModHorCnt;
+    int     ModVerCnt;
+
+    void    *FData1;
+    void    *FData2;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Rse class
+*/
+class TItsRse
+{
+public:
+    TItsRse(){}
+    virtual ~TItsRse(){}
+
+    String RSEID;
+    String INSTDT;
+    String CITYCD;
+    String REGIONCD;
+    String AREACD;
+    String RSEIP;
+    String COORDX;
+    String COORDY;
+    String RADIUS1;
+    String RADIUS2;
+    String COMPCD;
+    String LOCATION;
+    String RSECONFIGID;
+    String OBEPARAMID;
+    String PORT;
+    String BRIDGE;
+    String COMYN;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Vds class
+*/
+class TItsFVds
+{
+public:
+    TItsFVds(){}
+    virtual ~TItsFVds(){}
+
+    String CTLR_MNGM_NMBR;  //VARCHAR2(20)	N			제어기 관리 번호
+    String CTLR_TYPE_CD;    //VARCHAR2(7)	Y			제어기 유형 코드
+    String VALD_YN;         //CHAR(1)	Y	'N'		유효 여부
+    String X_CRDN;          //NUMBER(11,8)	Y			X 좌표
+    String Y_CRDN;          //NUMBER(10,8)	Y			Y 좌표
+    String LCTN;            //VARCHAR2(100)	Y			위치
+    String TRMN_IP;         //VARCHAR2(20)	Y			단말기 아이피
+    String TRMN_PORT;       //VARCHAR2(5)	Y			단말기 포트
+    String CTLR_CLCT_CYCL;  //NUMBER(3)	Y			제어기 수집 주기
+    String CTLR_STTS_CYCL;  //NUMBER(3)	Y			제어기 상태 주기
+    String LOOP_BORD_NUM;   //NUMBER(3)	Y	0		루프 보드 개수
+    String DLTR_NMBR;       //VARCHAR2(20)	Y			삭제자 번호
+    String DEL_DT;          //VARCHAR2(14)	Y			삭제 일시
+    String DEL_YN;          //CHAR(1)	Y	'N'		삭제 여부
+    String FRST_REGR_NMBR;  //VARCHAR2(20)	Y			최초 등록자 번호
+    String FRST_RGST_DT;    //VARCHAR2(14)	Y			최초 등록 일시
+    String LAST_CRPR_NMBR;  //VARCHAR2(20)	Y			최종 수정자 번호
+    String LAST_CRCT__DT;   //VARCHAR2(14)	Y			최종 수정  일시
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Avi class
+*/
+class TItsFAvi
+{
+public:
+    TItsFAvi(){}
+    virtual ~TItsFAvi(){}
+
+    String AVI_CTLR_MNGM_NMBR;  //VARCHAR2(20)	N			AVI 제어기 관리 번호
+    String AVI_ID;              //VARCHAR2(10)	Y			AVI ID
+    String LINK_ID;             //NUMBER(10)	Y			링크 ID
+    String AVI_LCTN_NM;         //VARCHAR2(60)	Y			AVI 위치 명
+    String AVI_VALD_YN;         //CHAR(1)	Y	'N'		AVI 유효 여부
+    String AVI_CTLR_IP;         //VARCHAR2(20)	Y			AVI 제어기 아이피
+    String AVI_CTLR_CMNC_PORT;  //VARCHAR2(5)	Y			AVI 제어기 통신 포트
+    String AVI_MAIN_CTLR_YN;    //CHAR(1)	Y	'N'		AVI 주 제어기 여부
+    String AVI_MNGM_LANE_NUM;   //NUMBER(2)	Y			AVI 관리 차로 개수
+    String AVI_CMRA_NUM;        //NUMBER(2)	Y			AVI 카메라 개수
+    String AVI_DTCT_NUM;        //NUMBER(2)	Y			AVI 검지기 개수
+    String AVI_DTCT_NM;         //VARCHAR2(60)	Y			AVI 검지기 명
+    String AVI_CLCT_CYCL;       //NUMBER(3)	Y			AVI 수집 주기
+    String AVI_LAMP_AUTO_YN;    //CHAR(1)	Y	'N'		AVI 조명장치 자동 여부
+    String AVI_LAMP_ON_HMS;     //VARCHAR2(6)	Y			AVI 조명장치 ON 시각
+    String AVI_LAMP_OFF_HMS;    //VARCHAR2(6)	Y			AVI 조명장치 OFF 시각
+    String AVI_LAMP_ON_YN;      //CHAR(1)	Y	'N'		AVI 조명장치 ON 여부
+    String X_CRDN;              //NUMBER(11,8)	Y			X 좌표
+    String Y_CRDN;              //NUMBER(10,8)	Y			Y 좌표
+    String RMRK;                //VARCHAR2(600)	Y			비고
+    String DEL_YN;              //CHAR(1)	Y	'N'		삭제 여부
+    String FRST_REGR_NMBR;      //VARCHAR2(20)	Y			최초 등록자 번호
+    String FRST_RGST_DT;        //VARCHAR2(14)	Y			최초 등록 일시
+    String LAST_CRPR_NMBR;      //VARCHAR2(20)	Y			최종 수정자 번호
+    String LAST_CRCT_DT;        //VARCHAR2(14)	Y			최종 수정 일시
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Dsrc class
+*/
+class TItsFDsrc
+{
+public:
+    TItsFDsrc(){}
+    virtual ~TItsFDsrc(){}
+
+    String ID;              //VARCHAR2(3)	N			아이디
+    String RSE_ID;          //VARCHAR2(8)	N			RSE 아이디
+    String ROAD_SPOT_ID;    //VARCHAR2(30)	N			도로 지점 아이디
+    String LOG_CNNC_ID;     //VARCHAR2(64)	Y			로그 접속 아이디
+    String LOG_CNNC_PW;     //VARCHAR2(64)	Y			로그 접속 비밀번호
+    String ISTL_LCTN_NM;    //VARCHAR2(40)	Y			설치 위치 명
+    String LCTN_X;          //NUMBER(11,8)	Y			위치 X
+    String LCTN_Y;          //NUMBER(10,8)	Y			위치 Y
+    String IP;              //VARCHAR2(20)	Y			IP
+    String PORT;            //VARCHAR2(5)	Y			PORT
+    String MNFC_CMPY_CD;    //NUMBER(5)	Y			제조 업체 코드
+    String DEL_YN;          //CHAR(1)	Y	'N'		삭제 여부
+};
+//---------------------------------------------------------------------------
+
+/*
+*  EtcFacility class
+*/
+class TItsRegFacility
+{
+public:
+    TItsRegFacility();
+    virtual ~TItsRegFacility();
+    void Clear();
+private:
+public:
+    String  Type;
+    String  Id;
+    String  Name;
+    String  DelYn;
+    String  UnRegisterd;
+    int     GridIndex;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Facility class
+*/
+class TItsFacility
+{
+public:
+    TItsFacility();
+    virtual ~TItsFacility();
+    void Clear();
+private:
+    int     FEditMode;
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String FCLT_ID;		    // FCLT_ID VARCHAR(50 BYTE) NOT NULL,	'시설물 ID';
+    String RFID_ID;		    // RFID_ID VARCHAR(50 BYTE) NOT NULL,	'시설물 ID';
+    String FCLT_TYPE;		// FCLT_TYPE VARCHAR(7 BYTE) NOT NULL, '시설물유형';
+    String FCLT_LCTN;		// FCLT_LCTN VARCHAR(100 BYTE),        '시설물 위치';
+    String RSCE_YN;		    // RSCE_YN CHAR(1 BYTE) DEFAULT 'N',   '현장자산유무';
+    String MDL_NM;          // MDL_NM VARCHAR(30 BYTE),            '모델명';
+    String USE_YEAR;		// USE_YEAR NUMBER(3),                 '사용년수';
+    String INWR_DT;		    // INWR_DT VARCHAR(14 BYTE),           '입고일시';
+    String OTWR_DT;		    // OTWR_DT VARCHAR(14 BYTE),           '출고일시';
+    String ISTL_DT;		    // ISTL_DT VARCHAR(14 BYTE),           '설치일시';
+    String TAKT_DT;		    // TAKT_DT VARCHAR(14 BYTE),           '반출일시';
+    String TAKT_RESN;		// TAKT_RESN VARCHAR(100 BYTE),        '반출사유';
+    String TAKN_DT;		    // TAKN_DT VARCHAR(14 BYTE),           '반입일시';
+    String ABDN_DT;		    // ABDN_DT VARCHAR(14 BYTE),           '폐기일시';
+    String ADTN_NM;		    // ADTN_NM VARCHAR(30 BYTE),           '추가자명';
+    String ADTN_DT;		    // ADTN_DT VARCHAR(14 BYTE),           '추가일시';
+    String CHNG_NM;		    // CHNG_NM VARCHAR(30 BYTE),           '변경자명';
+    String CHNG_DT;		    // CHNG_DT VARCHAR(14 BYTE),           '변경일시';
+    String AMT;			    // AMT NUMBER(15),                     '금액';
+    String DEL_YN;		    // DEL_YN CHAR(1 BYTE) DEFAULT 'N',    '삭제여부';
+    String ISTL_CMPY_ID;	// ISTL_CMPY_ID VARCHAR(30 BYTE),      '설치업체ID';
+    String MNFC_CMPY_ID;	// PRDC_CMPY_ID VARCHAR(30 BYTE)       '제조업체ID';
+
+    String ISTL_LCTN_ADDR;  // '설치 위치 주소'
+
+    String FCommStatus;     // 장비 통신상태값
+    String FDoorStatus;     // 장비 Door상태값
+    String FComm;
+    String FDoor;
+    String FCBoxTmpr;
+
+    int    FCollCntBase;
+    int    FCollCntCurr;
+    bool   FCollError;
+
+    String Sts00;
+    String Sts01;
+    String Sts02;
+    String Sts03;
+    String Sts04;
+    String Sts05;
+    String Sts06;
+    String Sts07;
+    String Sts08;
+    String Sts09;
+    String Sts10;
+
+    String Deleted;         // 마스터정보가 삭제된것
+	int    GridIndex;	    // 메인폼에 뿌려지는 그리드 인덱스
+    int    StatusGridIndex;
+
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+ 	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+};
+//---------------------------------------------------------------------------
+
+class TFacilityStatus
+{
+public:
+    TFacilityStatus()
+    {
+        Type   = "";
+        Total  = 0;
+        Normal = 0;
+        Error  = 0;
+        Module = 0;
+        Collect= 0;
+    };
+    virtual ~TFacilityStatus() {};
+
+    String Type;
+    int    Total;
+    int    Normal;
+    int    Error;
+    int    Module;
+    int    Collect;
+};
+//---------------------------------------------------------------------------
+
+
+class TItsBit
+{
+public:
+    TItsBit(){}
+    virtual ~TItsBit(){}
+
+    String FCLT_ID;
+    String FCLT_LCTN;
+    String BIT_ID;
+    String X_CRDN;
+    String Y_CRDN;
+
+    String STOP_ID;
+    String STOP_EXPLAIN;
+    String LINK_ID;
+
+    String BIT_TYPE;
+    int    FAN_MIN_TEMPERATURE;
+    int    FAN_MAX_TEMPERATURE;
+    int    HEATER_MIN_TEMPERATURE;
+    int    HEATER_MAX_TEMPERATURE;
+    String INSTALL_STOP_ID;
+    String SERVICE_ID;
+    String STOP_TYPE;
+    String STOP_NAME;
+    String STOP_SHORTNAME;
+
+    String DEL_YN;
+};
+//---------------------------------------------------------------------------
+
+class TItsSig
+{
+public:
+    TItsSig(){}
+    virtual ~TItsSig(){}
+
+    String FCLT_ID;
+    String FCLT_LCTN;
+    String SIG_ID;
+    String X_CRDN;
+    String Y_CRDN;
+
+    String MDL_NM;
+    String DEL_YN;
+};
+//---------------------------------------------------------------------------
+
+class TItsSigDet
+{
+public:
+    TItsSigDet(){}
+    virtual ~TItsSigDet(){}
+
+    String FCLT_ID;
+    String FCLT_LCTN;
+    String SDET_ID;
+    String X_CRDN;
+    String Y_CRDN;
+    String SIG_ID;
+
+    String MDL_NM;
+    String DEL_YN;
+};
+//---------------------------------------------------------------------------
+
+class TItsPis
+{
+public:
+    TItsPis(){}
+    virtual ~TItsPis(){}
+
+    String FCLT_ID;
+    String FCLT_LCTN;
+    String PIS_ID;
+    String X_CRDN;
+    String Y_CRDN;
+    String SIG_ID;
+
+    String MDL_NM;
+    String DEL_YN;
+};
+//---------------------------------------------------------------------------
+
+class TItsPcs
+{
+public:
+    TItsPcs(){}
+    virtual ~TItsPcs(){}
+
+    String FCLT_ID;
+    String FCLT_LCTN;
+    String PCS_ID;
+    String X_CRDN;
+    String Y_CRDN;
+    String SIG_ID;
+
+    String MDL_NM;
+    String DEL_YN;
+};
+//---------------------------------------------------------------------------
+
+/*
+* Facility Manager
+*/
+class TItsFacilityManager
+{
+public:
+    TItsFacilityManager();
+    virtual ~TItsFacilityManager();
+
+public:
+    String                      CenterId;
+    int                         FLocalCctvCnt;
+
+    ListMap<TItsWebCam>         FWebCamLists;
+    ListMap<TItsCctv>           FCctvLists;
+    ListMap<TItsVms>            FVmsLists;
+    ListMap<TItsRse>            FRseLists;
+
+    ListMap<TItsVds>            FVdsLists;
+    ListMap<TItsAvi>            FAviLists;
+    ListMap<TItsDsrc>           FDsrcLists;
+
+    ListMap<TItsBit>            FBitLists;
+    ListMap<TItsSig>            FSigLists;
+    ListMap<TItsSigDet>         FSigDetLists;
+
+    ListMap<TItsPis>            FPisLists;
+    ListMap<TItsPcs>            FPcsLists;
+
+    ListMap<TItsRegFacility>    FRegLists;
+    ListMap<TItsFacility>       FLists;
+
+    ListMap<TFacilityStatus>    FListStatus;
+
+public:
+    void SetCenterId(String ACenterId);
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    
+    bool LoadFacilityReg(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityMaster(TADOConnection *ADbConn=NULL);
+
+    bool LoadFacilityWebCam(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityCctv(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityVms(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityRse(TADOConnection *ADbConn=NULL);
+
+    bool LoadFacilityVds(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityAvi(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityDsrc(TADOConnection *ADbConn=NULL);
+
+    bool LoadFacilityBit(TADOConnection *ADbConn=NULL);
+    bool LoadFacilitySig(TADOConnection *ADbConn=NULL);
+    bool LoadFacilitySigDet(TADOConnection *ADbConn=NULL);
+
+    bool LoadFacilityPvms(TADOConnection *ADbConn=NULL);
+    bool LoadFacilityPvds(TADOConnection *ADbConn=NULL);
+
+    bool CheckFacility();
+
+    bool LoadFacilityStatusFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadDsrcCollectStatusFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadVdsCollectStatusFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadAviCollectStatusFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsFacilityManager *ItsFacilityManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 399 - 0
COMMON/CDS/CDSFacilityFailF.cpp

@@ -0,0 +1,399 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSFacilityFailF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsFacilityFail::TItsFacilityFail()
+{
+	FGridIndex = -1;
+	FEditMode  = DB_INIT;
+    ActionCnt  = 0;
+}
+//---------------------------------------------------------------------------
+void TItsFacilityFail::Clear()
+{
+    FAIL_HS_SEQ = "";   //"장애이력일련번호";
+    OCRR_DT     = "";   //"발생일시";
+    RCPR_NM     = "";   //"접수자명";
+    ADTN_NM     = "";   //"추가자명";
+    ADTN_DT     = "";   //"추가일시";
+    CHNG_NM     = "";   //"변경자명";
+    CHNG_DT     = "";   //"변경일시";
+    FAIL_TYPE   = "";   //"장애 유형";
+    FAIL_CONT   = "";   //"장애 내용";
+    FCLT_ID     = "";   //"시설물 ID";
+}
+//---------------------------------------------------------------------------
+TItsFacilityFail::~TItsFacilityFail()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TItsFacilityFailManager *ItsFacilityFailManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* FacilityFail Manager
+*/
+TItsFacilityFailManager::TItsFacilityFailManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsFacilityFailManager::~TItsFacilityFailManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TItsFacilityFailManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    FLists.RemoveAll();
+    LoadFromDbFail(ADbConn);
+    LoadFromDbFailAction(ADbConn);
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsFacilityFailManager::LoadFromDbFail(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *               \r\n"
+           "  FROM TB_FCLT_FAIL_HS \r\n";
+//           " ORDER BY FAIL_HS_SEQ  \r\n";
+    try
+    {
+        FLists.Lock();
+        //FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsFacilityFail *pObj = new TItsFacilityFail();
+
+                pObj->FAIL_HS_SEQ = pADO->FieldByName("FAIL_HS_SEQ")->AsString;
+                pObj->OCRR_DT     = pADO->FieldByName("OCRR_DT")->AsString;
+                pObj->RCPR_NM     = pADO->FieldByName("RCPR_NM")->AsString;
+                pObj->ADTN_NM     = pADO->FieldByName("ADTN_NM")->AsString;
+                pObj->ADTN_DT     = pADO->FieldByName("ADTN_DT")->AsString;
+                pObj->CHNG_NM     = pADO->FieldByName("CHNG_NM")->AsString;
+                pObj->CHNG_DT     = pADO->FieldByName("CHNG_DT")->AsString;
+                pObj->FAIL_TYPE   = pADO->FieldByName("FAIL_TYPE")->AsString;
+                pObj->FAIL_CONT   = pADO->FieldByName("FAIL_CONT")->AsString;
+                pObj->FCLT_ID     = pADO->FieldByName("FCLT_ID")->AsString;
+                pObj->DEL_YN      = "N";
+                pObj->ActionCnt   = 0;
+				FLists.Push(pObj->FAIL_HS_SEQ, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityFailManager::LoadFromDbFail", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityFailManager::LoadFromDbFail", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsFacilityFailManager::LoadFromDbFailAction(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                       \r\n"
+           "  FROM TB_FCLT_FAIL_RPAR_HS    \r\n";
+//           " ORDER BY FAIL_HS_SEQ, CRTN_DT \r\n";
+    try
+    {
+        ItsFacilityFailManager->FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String FAIL_HS_SEQ  = pADO->FieldByName("FAIL_HS_SEQ")->AsString;
+                TItsFacilityFail *pFail = ItsFacilityFailManager->FLists.Find(FAIL_HS_SEQ);
+                if (!pFail) continue;
+
+				TItsFacilityFailAction *pObj = new TItsFacilityFailAction();
+
+                pObj->CRTN_DT      = pADO->FieldByName("CRTN_DT")->AsString;
+                pObj->FAIL_HS_SEQ  = pADO->FieldByName("FAIL_HS_SEQ")->AsString;
+                pObj->WRKR_NM      = pADO->FieldByName("WRKR_NM")->AsString;
+                pObj->WORK_CONT    = pADO->FieldByName("WORK_CONT")->AsString;
+                pObj->WORK_STRT_DT = pADO->FieldByName("WORK_STRT_DT")->AsString;
+                pObj->WORK_END_DT  = pADO->FieldByName("WORK_END_DT")->AsString;
+                pObj->WORK_FINS_YN = pADO->FieldByName("WORK_FINS_YN")->AsString;
+                pObj->ADTN_NM      = pADO->FieldByName("ADTN_NM")->AsString;
+                pObj->CHNG_NM      = pADO->FieldByName("CHNG_NM")->AsString;
+                pObj->CHNG_DT      = pADO->FieldByName("CHNG_DT")->AsString;
+                pObj->DEL_YN       = "N";
+
+				pFail->FLists.Push(pObj->CRTN_DT, pObj);
+                pFail->ActionCnt++;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityFailManager::LoadFromDbFailAction", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityFailManager::LoadFromDbFailAction", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        ItsFacilityFailManager->FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+TItsFacilityFailAction::TItsFacilityFailAction()
+{
+	FGridIndex = -1;
+	FEditMode  = DB_INIT;
+}
+//---------------------------------------------------------------------------
+void TItsFacilityFailAction::Clear()
+{
+    CRTN_DT      = "";  //'생성 일시
+    FAIL_HS_SEQ  = "";  //'장애 이력 일련번호
+    WRKR_NM      = "";  //'작업자 명
+    WORK_CONT    = "";  //'작업 내용
+    WORK_STRT_DT = "";  //'작업 시작 일시
+    WORK_END_DT  = "";  //'작업 종료 일시
+    WORK_FINS_YN = "";  //'작업 완료 여부
+    ADTN_NM      = "";  //'추가자 명
+    CHNG_NM      = "";  //'변경자 명
+    CHNG_DT      = "";  //'변경 일시*/
+}
+//---------------------------------------------------------------------------
+TItsFacilityFailAction::~TItsFacilityFailAction()
+{
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TItsFacilityFailActionManager *ItsFacilityFailActionManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* FacilityFail Manager
+*/
+TItsFacilityFailActionManager::TItsFacilityFailActionManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsFacilityFailActionManager::~TItsFacilityFailActionManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TItsFacilityFailActionManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                       \r\n"
+           "  FROM TB_FCLT_FAIL_RPAR_HS    \r\n";
+//           " ORDER BY FAIL_HS_SEQ, CRTN_DT \r\n";
+    try
+    {
+        ItsFacilityFailManager->FLists.Lock();
+        FLists.Lock();
+        FDataCnt = 0;
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String FAIL_HS_SEQ  = pADO->FieldByName("FAIL_HS_SEQ")->AsString;
+                TItsFacilityFail *pFail = ItsFacilityFailManager->FLists.Find(FAIL_HS_SEQ);
+                if (!pFail) continue;
+
+				TItsFacilityFailAction *pObj = new TItsFacilityFailAction();
+
+                pObj->CRTN_DT      = pADO->FieldByName("CRTN_DT")->AsString;
+                pObj->FAIL_HS_SEQ  = pADO->FieldByName("FAIL_HS_SEQ")->AsString;
+                pObj->WRKR_NM      = pADO->FieldByName("WRKR_NM")->AsString;
+                pObj->WORK_CONT    = pADO->FieldByName("WORK_CONT")->AsString;
+                pObj->WORK_STRT_DT = pADO->FieldByName("WORK_STRT_DT")->AsString;
+                pObj->WORK_END_DT  = pADO->FieldByName("WORK_END_DT")->AsString;
+                pObj->WORK_FINS_YN = pADO->FieldByName("WORK_FINS_YN")->AsString;
+                pObj->ADTN_NM      = pADO->FieldByName("ADTN_NM")->AsString;
+                pObj->CHNG_NM      = pADO->FieldByName("CHNG_NM")->AsString;
+                pObj->CHNG_DT      = pADO->FieldByName("CHNG_DT")->AsString;
+                pObj->DEL_YN       = "N";
+                pFail->ActionCnt++;
+
+				FLists.Push(String(FDataCnt++), pObj);
+
+				pFail->FLists.Push(pObj->CRTN_DT, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityFailActionManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityFailActionManager::LoadFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        ItsFacilityFailManager->FLists.UnLock();
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsFacilityFailActionManager::LoadFromDbFailAction(String AKeySeq, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                       \r\n"
+           "  FROM TB_FCLT_FAIL_RPAR_HS    \r\n"
+           " WHERE FAIL_HS_SEQ = :p01      \r\n";
+//           " ORDER BY FAIL_HS_SEQ, CRTN_DT \r\n";
+    try
+    {
+        ItsFacilityFailManager->FLists.Lock();
+        FLists.Lock();
+        FDataCnt = 0;
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            pADO->Parameters->ParamByName("p01")->Value = AKeySeq;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String FAIL_HS_SEQ  = pADO->FieldByName("FAIL_HS_SEQ")->AsString;
+                TItsFacilityFail *pFail = ItsFacilityFailManager->FLists.Find(FAIL_HS_SEQ);
+                if (!pFail) continue;
+
+				TItsFacilityFailAction *pObj = new TItsFacilityFailAction();
+
+                pObj->CRTN_DT      = pADO->FieldByName("CRTN_DT")->AsString;
+                pObj->FAIL_HS_SEQ  = pADO->FieldByName("FAIL_HS_SEQ")->AsString;
+                pObj->WRKR_NM      = pADO->FieldByName("WRKR_NM")->AsString;
+                pObj->WORK_CONT    = pADO->FieldByName("WORK_CONT")->AsString;
+                pObj->WORK_STRT_DT = pADO->FieldByName("WORK_STRT_DT")->AsString;
+                pObj->WORK_END_DT  = pADO->FieldByName("WORK_END_DT")->AsString;
+                pObj->WORK_FINS_YN = pADO->FieldByName("WORK_FINS_YN")->AsString;
+                pObj->ADTN_NM      = pADO->FieldByName("ADTN_NM")->AsString;
+                pObj->CHNG_NM      = pADO->FieldByName("CHNG_NM")->AsString;
+                pObj->CHNG_DT      = pADO->FieldByName("CHNG_DT")->AsString;
+                pObj->DEL_YN       = "N";
+                pFail->ActionCnt++;
+
+				FLists.Push(String(FDataCnt++), pObj);
+
+				pFail->FLists.Push(pObj->CRTN_DT, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityFailActionManager::LoadFromDbFailAction", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsFacilityFailActionManager::LoadFromDbFailAction", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        ItsFacilityFailManager->FLists.UnLock();
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+

+ 128 - 0
COMMON/CDS/CDSFacilityFailF.h

@@ -0,0 +1,128 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSFacilityFailFH
+#define CDSFacilityFailFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  FacilityFail class
+*/
+class TItsFacilityFailAction
+{
+public:
+    TItsFacilityFailAction();
+    virtual ~TItsFacilityFailAction();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+public:
+    String  CRTN_DT;        //'생성 일시
+    String  FAIL_HS_SEQ;    //'장애 이력 일련번호
+    String  WRKR_NM;        //'작업자 명
+    String  WORK_CONT;      //'작업 내용
+    String  WORK_STRT_DT;   //'작업 시작 일시
+    String  WORK_END_DT;    //'작업 종료 일시
+    String  WORK_FINS_YN;   //'작업 완료 여부
+    String  ADTN_NM;        //'추가자 명
+    String  CHNG_NM;        //'변경자 명
+    String  CHNG_DT;        //'변경 일시*/
+    String  DEL_YN;
+
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted };
+ 	__property int    EditMode  = {read = FEditMode,  write = FEditMode  };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+*  FacilityFail class
+*/
+class TItsFacilityFail
+
+{
+public:
+    TItsFacilityFail();
+    virtual ~TItsFacilityFail();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+    int     FActionCnt;
+public:
+    String  FAIL_HS_SEQ;    //"장애이력일련번호";
+    String  OCRR_DT;        //"발생일시";
+    String  RCPR_NM;        //"접수자명";
+    String  ADTN_NM;        //"추가자명";
+    String  ADTN_DT;        //"추가일시";
+    String  CHNG_NM;        //"변경자명";
+    String  CHNG_DT;        //"변경일시";
+    String  FAIL_TYPE;      //"장애 유형";
+    String  FAIL_CONT;      //"장애 내용";
+    String  FCLT_ID;        //"시설물 ID";
+    String  DEL_YN;
+
+    ListMap<TItsFacilityFailAction> FLists;
+
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted };
+ 	__property int    EditMode  = {read = FEditMode,  write = FEditMode  };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+	__property int    ActionCnt = {read = FActionCnt, write = FActionCnt };
+};
+//---------------------------------------------------------------------------
+
+/*
+* FacilityFail Manager
+*/
+class TItsFacilityFailManager
+{
+public:
+    TItsFacilityFailManager();
+    virtual ~TItsFacilityFailManager();
+
+public:
+    ListMap<TItsFacilityFail>       FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadFromDbFail(TADOConnection *ADbConn=NULL);
+    bool LoadFromDbFailAction(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsFacilityFailManager *ItsFacilityFailManager;
+//---------------------------------------------------------------------------
+
+/*
+* FacilityFailAction Manager
+*/
+class TItsFacilityFailActionManager
+{
+public:
+    TItsFacilityFailActionManager();
+    virtual ~TItsFacilityFailActionManager();
+
+public:
+    int     FDataCnt;
+    ListMap<TItsFacilityFailAction> FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadFromDbFailAction(String AKeySeq, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsFacilityFailActionManager *ItsFacilityFailActionManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 113 - 0
COMMON/CDS/CDSHolidayF.cpp

@@ -0,0 +1,113 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSHolidayF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsHoliday::TItsHoliday()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	DEL_YN     = "N";
+    //Clear();
+}
+//---------------------------------------------------------------------------
+void TItsHoliday::Clear()
+{
+    YMD          = "";  //VARCHAR2(8)	N			년월일
+    DAY_TYPE_CD  = "";  //VARCHAR2(7)	Y			요일 유형 코드
+    LEGL_HLDY_NM = "";  //VARCHAR2(30)	Y			공휴일 명
+    RMRK         = "";  //VARCHAR2(200)	Y			비고
+    DEL_YN       = "N";
+}
+//---------------------------------------------------------------------------
+TItsHoliday::~TItsHoliday()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsHolidayManager *ItsHolidayManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Holiday Manager
+*/
+TItsHolidayManager::TItsHolidayManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsHolidayManager::~TItsHolidayManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TItsHolidayManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT YMD, DAY_TYPE_CD, LEGL_HLDY_NM, RMRK \r\n"
+           "  FROM TB_LEGL_HLDY_INFR                    \r\n";
+           //" ORDER BY YMD, DAY_TYPE_CD, LEGL_HLDY_NM    \r\n";
+    try
+    {
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsHoliday *pObj = new TItsHoliday();
+
+                pObj->YMD          = pADO->FieldByName("YMD")->AsString;
+                pObj->DAY_TYPE_CD  = pADO->FieldByName("DAY_TYPE_CD")->AsString;
+                pObj->LEGL_HLDY_NM = pADO->FieldByName("LEGL_HLDY_NM")->AsString;
+                pObj->RMRK         = pADO->FieldByName("RMRK")->AsString;
+                
+				FLists.Push(pObj->YMD, pObj);
+
+                pObj->Completed = true;
+                pObj->DEL_YN    = "N";
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsHolidayManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsHolidayManager::LoadFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 62 - 0
COMMON/CDS/CDSHolidayF.h

@@ -0,0 +1,62 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSHolidayFH
+#define CDSHolidayFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+/*
+*  Holiday class
+*/
+class TItsHoliday
+{
+public:
+    TItsHoliday();
+    virtual ~TItsHoliday();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+    String  YMD;            //VARCHAR2(8)	N			년월일
+    String  DAY_TYPE_CD;    //VARCHAR2(7)	Y			요일 유형 코드
+    String  LEGL_HLDY_NM;   //VARCHAR2(30)	Y			공휴일 명
+    String  RMRK;           //VARCHAR2(200)	Y			비고
+
+    String  DEL_YN;
+    
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+* Holiday Manager
+*/
+class TItsHolidayManager
+{
+public:
+    TItsHolidayManager();
+    virtual ~TItsHolidayManager();
+
+public:
+    ListMap<TItsHoliday>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsHolidayManager *ItsHolidayManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 424 - 0
COMMON/CDS/CDSIfscF.cpp

@@ -0,0 +1,424 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSIfscF.h"
+#include "CDSTrafficF.h"
+#include "ITSUtilF.h"
+#include "AppGlobalF.h"
+#include "CDSLinkF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsIfsc::TItsIfsc()
+{
+    FPolyLine = NULL;
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsIfsc::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsIfsc::~TItsIfsc()
+{
+    FSubLists.clear();
+}
+//---------------------------------------------------------------------------
+void TItsIfsc::InitTraffic()
+{
+    TRAF->InitTraffic();
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TItsIfscManager *ItsIfscManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* IFSC Manager
+*/
+TItsIfscManager::TItsIfscManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsIfscManager::~TItsIfscManager()
+{
+}
+//---------------------------------------------------------------------------
+void TItsIfscManager::InitTraffic()
+{
+    try
+    {
+        FLists.Lock();
+
+        FOR_STL(TItsIfsc*, pObj, FLists)
+        {
+            pObj->InitTraffic();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+}
+//---------------------------------------------------------------------------
+bool TItsIfscManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    FLists.RemoveAll();
+
+    return (LoadLink(ADbConn) && LoadLinkList(ADbConn));
+}
+//---------------------------------------------------------------------------
+bool TItsIfscManager::LoadLink(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT IFSC_ID           ,                         \r\n"
+           "       IFSC_NM           ,                         \r\n"
+           "       DRCT_CD           ,                         \r\n"
+           "       STRT_NM           ,                         \r\n"
+           "       END_NM            ,                         \r\n"
+           "       SECT_LNGT         ,                         \r\n"
+           "       EXTR_CNCT_SECT_YN ,                         \r\n"
+           "       DEL_YN            ,                         \r\n"
+           "       RMRK              ,                         \r\n"
+           "       F_NODE_ID         ,                         \r\n"
+           "       T_NODE_ID         ,                         \r\n"
+           "       SECT_GRAD_CD      ,                         \r\n"
+           "       AREA_CD           ,                         \r\n"
+           "       DECODE(AREA_CD, 'LAT001', 'Y', 'N') REGN_YN \r\n"
+           "  FROM TB_IFSC                                     \r\n";
+//           " ORDER BY IFSC_ID                                  \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                TItsIfsc *pIfsc = new TItsIfsc();
+
+                pIfsc->IFSC_ID           = pADO->FieldByName("IFSC_ID")->AsString;
+                pIfsc->IFSC_NM           = pADO->FieldByName("IFSC_NM")->AsString.Trim();
+                pIfsc->DRCT_CD           = pADO->FieldByName("DRCT_CD")->AsString;
+                pIfsc->RMRK              = pADO->FieldByName("RMRK")->AsString.Trim();
+                pIfsc->EXTR_CNCT_SECT_YN = pADO->FieldByName("EXTR_CNCT_SECT_YN")->AsString;
+                pIfsc->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;
+                pIfsc->SECT_LNGT         = pADO->FieldByName("SECT_LNGT")->AsString;
+                pIfsc->SECT_GRAD_CD      = pADO->FieldByName("SECT_GRAD_CD")->AsString;
+                pIfsc->F_NODE_ID         = pADO->FieldByName("F_NODE_ID")->AsString;
+                pIfsc->T_NODE_ID         = pADO->FieldByName("T_NODE_ID")->AsString;
+                pIfsc->STRT_NM           = pADO->FieldByName("STRT_NM")->AsString.Trim();
+                pIfsc->END_NM            = pADO->FieldByName("END_NM")->AsString.Trim();
+                pIfsc->REGN_YN           = pADO->FieldByName("REGN_YN")->AsString;
+                pIfsc->AREA_CD           = pADO->FieldByName("AREA_CD")->AsString;
+
+                FLists.Push(pIfsc->IFSC_ID, pIfsc);
+                pIfsc->Completed = true;
+
+                pIfsc->TRAF = new TItsTraffic(2, pIfsc->IFSC_ID, (void*)pIfsc);
+                ItsTrafficManager->FLists.Push(pIfsc->IFSC_ID, pIfsc->TRAF);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIfscManager::LoadLink", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIfscManager::LoadLink", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsIfscManager::LoadLinkList(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT IFSC_ID, LINK_ID, ORD \r\n"
+           "  FROM TB_IFSC_LINK_RLTN     \r\n";
+//           " ORDER BY IFSC_ID, ORD       \r\n";
+    try
+    {
+        FLists.Lock();
+        TItsIfsc *pIfsc = NULL;
+        TItsLink *pLink;
+
+        try
+        {
+            int nORD;
+            
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sIFSC_ID = pADO->FieldByName("IFSC_ID")->AsString;
+                pIfsc = FLists.Find(sIFSC_ID);
+                if (!pIfsc) continue;
+
+                String sLINK_ID = pADO->FieldByName("LINK_ID")->AsString;
+				nORD            = pADO->FieldByName("ORD")->AsInteger;
+                pIfsc->FSubLists.insert(std::make_pair<int, String>(nORD, sLINK_ID));
+
+                pLink = ItsLinkManager->FLists.Find(sLINK_ID);
+                if (pLink) pLink->IFSC_ID = sIFSC_ID;
+
+#if 0
+				String sORD     = pADO->FieldByName("ORD")->AsString;
+                TSubLink *pSubLink = new TSubLink();
+                pSubLink->FLinkId = sLINK_ID;
+                pIfsc->FSubLists.Push(sORD, pSubLink);
+#endif
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIfscManager::LoadLinkList", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIfscManager::LoadLinkList", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return LoadCoordFromDb(ADbConn);
+    //return bResult;
+}
+//---------------------------------------------------------------------------
+bool TItsIfscManager::LoadCoordFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT IFSC_ID, LEVL, ORD, X_CRDN, Y_CRDN  \r\n"
+           "  FROM TB_IFSC_VRTX                        \r\n"
+           " WHERE LEVL = 4                            \r\n"
+           " ORDER BY IFSC_ID, LEVL, ORD               \r\n";
+#else
+    sQry = "SELECT A.*                     \r\n"
+           "  FROM TB_IFSC_GIS A,          \r\n"
+           "       TB_IFSC     B           \r\n"
+           " WHERE A.IFSC_ID = B.IFSC_ID   \r\n";
+#endif
+
+    TItsIfsc* pObj;
+    TStringList *sl = NULL;
+    int ii;
+    sl = new TStringList;
+    sl->Delimiter = ',';
+    sl->StrictDelimiter = true;
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String IFSC_ID = pADO->FieldByName("IFSC_ID")->AsString;
+                pObj = FLists.Find(IFSC_ID);
+                if (!pObj) continue;
+
+                int    FPointCnt = pADO->FieldByName("POINTCNT")->AsInteger;
+                String FVertex   = pADO->FieldByName("VERTEX")->AsString;
+
+                sl->DelimitedText = FVertex;
+                if (sl->Count != FPointCnt * 2)
+                {
+                    continue;
+                }
+                for (ii = 0; ii < sl->Count-1; )
+                {
+                    TItsCoord *pCoord = new TItsCoord();
+                    pCoord->X = sl->Strings[ii].ToDouble();
+                    pCoord->Y = sl->Strings[ii+1].ToDouble();
+                    pObj->Coords.Push(pObj->Coords.Size(), pCoord);
+
+                    if (pCoord->X < pObj->bounds.minX) pObj->bounds.minX = pCoord->X;
+                    if (pCoord->Y < pObj->bounds.minY) pObj->bounds.minY = pCoord->Y;
+                    if (pCoord->X > pObj->bounds.maxX) pObj->bounds.maxX = pCoord->X;
+                    if (pCoord->Y > pObj->bounds.maxY) pObj->bounds.maxY = pCoord->Y;
+
+                    ii += 2;
+                }
+                continue;
+
+				TItsCoord *pCoord = new TItsCoord();
+
+                pCoord->X = pADO->FieldByName("X_CRDN")->AsFloat;
+                pCoord->Y = pADO->FieldByName("Y_CRDN")->AsFloat;
+
+				pObj->Coords.Push(pObj->Coords.Size(), pCoord);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIfscManager::LoadCoordFromDb", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIfscManager::LoadCoordFromDb", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+        if (sl) delete sl;
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsIfscManager::LoadTraffic(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    InitTraffic();
+
+    sQry = "SELECT A.IFSC_ID, PRCN_DT, TFVL, SPED, OCPY_RATE, TRVL_HH, CMTR_GRAD_CD, PTRN_SPED, DATA_NUM, \r\n"
+           "       (CASE WHEN PRCN_DT <= TO_CHAR(SYSDATE - 10/1440, 'YYYYMMDDHH24MISS')                   \r\n"
+           "             THEN 'Y' ELSE 'N' END) AS MISSING,                                               \r\n"
+           "       (CASE WHEN PRCN_DT >= TO_CHAR(SYSDATE - 15/1440, 'YYYYMMDDHH24MISS')                   \r\n"
+           "             THEN 'Y' ELSE 'N' END) AS LASTANS,                                               \r\n"
+           "       (SELECT MAX(PRCN_DT) FROM TB_LINK_TRAF) MPRCN_DT                                       \r\n"
+           "  FROM TB_IFSC_TRAF A, TB_IFSC B                                                              \r\n"
+           " WHERE A.IFSC_ID = B.IFSC_ID                                                                  \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String ID = pADO->FieldByName("IFSC_ID")->AsString;
+                TItsIfsc *pObj = FLists.Find(ID);
+                if (!pObj) continue;
+
+                pObj->TRAF->PRCN_DT      = pADO->FieldByName("PRCN_DT")->AsString;
+                pObj->TRAF->TFVL         = pADO->FieldByName("TFVL")->AsInteger;
+                pObj->TRAF->SPED         = pADO->FieldByName("SPED")->AsInteger;
+                pObj->TRAF->OCPY_RATE    = pADO->FieldByName("OCPY_RATE")->AsFloat;
+                pObj->TRAF->TRVL_HH      = pADO->FieldByName("TRVL_HH")->AsInteger;
+                pObj->TRAF->CMTR_GRAD_CD = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+				pObj->TRAF->MISSING      = pADO->FieldByName("MISSING")->AsString;       // 결측여부
+				pObj->TRAF->LASTANS      = pADO->FieldByName("LASTANS")->AsString;       // 최근 15분 이내 가공
+				pObj->TRAF->MPRCN_DT     = pADO->FieldByName("MPRCN_DT")->AsString;      // 가공시각(최신)
+                pObj->TRAF->DATA_NUM     = pADO->FieldByName("DATA_NUM")->AsInteger;
+                pObj->TRAF->PTRN_SPED    = pADO->FieldByName("PTRN_SPED")->AsInteger;
+
+                if      (pObj->TRAF->CMTR_GRAD_CD == "LTC1") pObj->TRAF->TRAF_GRAD = 1;
+                else if (pObj->TRAF->CMTR_GRAD_CD == "LTC2") pObj->TRAF->TRAF_GRAD = 2;
+                else if (pObj->TRAF->CMTR_GRAD_CD == "LTC3") pObj->TRAF->TRAF_GRAD = 3;
+                else                                         pObj->TRAF->TRAF_GRAD = 0;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsIfscManager::LoadTraffic", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsIfscManager::LoadTraffic", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 87 - 0
COMMON/CDS/CDSIfscF.h

@@ -0,0 +1,87 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSIfscFH
+#define CDSIfscFH
+//---------------------------------------------------------------------------
+
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+#include "CDSCoordF.h"
+#include "CDSTrafficF.h"
+#include "CDSBaseF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  IFSC class
+*/
+class TItsIfsc : public TItsBaseId
+{
+public:
+    TItsIfsc();
+    virtual ~TItsIfsc();
+    void Clear();
+
+private:
+
+public:
+    String IFSC_NM;                // IIFSC_NM				VARCHAR(100 BYTE),                      IFSC_NM IS '정보제공구간 명';
+    String DRCT_CD;                // IDRCT_CD				VARCHAR(7 BYTE),                        DRCT_CD IS '방향 코드';
+    String STRT_NM;                // ISTRT_NM				VARCHAR(100 BYTE),                      STRT_NM IS '시점 명';
+    String END_NM;                 // IEND_NM				VARCHAR(100 BYTE)                       END_NM IS '종점 명';
+    String SECT_LNGT;              // ISECT_LNGT			NUMBER(5) DEFAULT 0,                  	SECT_LNGT IS '구간 길이';
+    String EXTR_CNCT_SECT_YN;      // IEXTR_CNCT_SECT_YN	CHAR(1 BYTE) DEFAULT 'N',     			EXTR_CNCT_SECT_YN IS '외부 연계 구간 여부';
+    String DEL_YN;                 // IDEL_YN				CHAR(1 BYTE) DEFAULT 'N',               DEL_YN IS '삭제 여부';
+    String RMRK;                   // IRMRK				VARCHAR(600 BYTE),                      RMRK IS '비고';
+    String F_NODE_ID;              // IF_NODE_ID			NUMBER(10),                           	F_NODE_ID IS '시작노드ID';
+    String T_NODE_ID;              // IT_NODE_ID			NUMBER(10),                           	T_NODE_ID IS '종료노드ID';
+    String SECT_GRAD_CD;           // ISECT_GRAD_CD		VARCHAR(7 BYTE),                   		SECT_GRAD_CD IS '구간 등급 코드';
+    String AREA_CD;                //	AREA_CD VARCHAR(7 BYTE)
+    String REGN_YN;
+
+    String ROAD_ID;
+
+    TItsTraffic        *TRAF;
+    TItsBounds          bounds;
+    IntMap<TItsCoord>   Coords;
+    void               *FPolyLine;
+
+    std::map<int, String>   FSubLists;
+
+protected:
+
+public:
+    void InitTraffic();
+};
+//---------------------------------------------------------------------------
+
+
+/*
+* IFSC Manager
+*/
+class TItsIfscManager
+{
+public:
+    TItsIfscManager();
+    virtual ~TItsIfscManager();
+
+public:
+    ListMap<TItsIfsc>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadCoordFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadLink(TADOConnection *ADbConn=NULL);
+    bool LoadLinkList(TADOConnection *ADbConn=NULL);
+
+    void InitTraffic();
+    bool LoadTraffic(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsIfscManager *ItsIfscManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 218 - 0
COMMON/CDS/CDSIfsc_VMSF.cpp

@@ -0,0 +1,218 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSIfsc_VMSF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TIfsc::TIfsc()
+{
+    InitTraffic();
+}
+//---------------------------------------------------------------------------
+TIfsc::~TIfsc()
+{
+}
+//---------------------------------------------------------------------------
+void TIfsc::InitTraffic()
+{
+    PRCN_DT      = "";	        //N	VARCHAR2(14)	Y			가공 일시
+    TFVL         = 0;	            //N	NUMBER(6)	    Y	0		교통량
+    SPED         = 0;	            //N	NUMBER(3)	    Y	0		속도
+    PTRN_SPED    = 0;	        //N	NUMBER(3)	    Y	0		패턴 속도
+    OCPY_RATE    = 0;	        //N	NUMBER(5,2)	    Y	0		점유 율
+    TRVL_HH      = 0;	        //N	NUMBER(6)	    Y	0		통행 시간
+    CMTR_GRAD_CD = "0";	    //N	VARCHAR2(7)	    Y			소통 등급 코드
+    DATA_NUM     = 0;	        //N	NUMBER(3)	    Y	0		데이터 개수
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TIfscManager *IfscManager = NULL;
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TIfscManager::TIfscManager()
+{
+}
+//---------------------------------------------------------------------------
+TIfscManager::~TIfscManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TIfscManager::InitTraffic()
+{
+    try
+    {
+        FLists.Lock();
+        FOR_STL(TIfsc*, pObj, FLists)
+        {
+            pObj->InitTraffic();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+}
+//---------------------------------------------------------------------------
+bool TIfscManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.*        \r\n"
+           "  FROM TB_IFSC A  \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String DEL_YN = pADO->FieldByName("DEL_YN")->AsString;
+                if (DEL_YN == "Y") continue;
+
+				TIfsc *pObj = new TIfsc();
+
+                pObj->IFSC_ID           = pADO->FieldByName("IFSC_ID")->AsString;	        //N	NUMBER(10)	    N			정보제공구간 ID
+                pObj->IFSC_NM           = pADO->FieldByName("IFSC_NM")->AsString;	        //N	VARCHAR2(100)	Y			정보제공구간 명
+                pObj->DRCT_CD           = pADO->FieldByName("DRCT_CD")->AsString;	        //N	VARCHAR2(7)	    Y			방향 코드
+                pObj->STRT_NM           = pADO->FieldByName("STRT_NM")->AsString;	        //N	VARCHAR2(100)	Y			시점 명
+                pObj->END_NM            = pADO->FieldByName("END_NM")->AsString;	        //N	VARCHAR2(100)	Y			종점 명
+                pObj->SECT_LNGT         = pADO->FieldByName("SECT_LNGT")->AsInteger;	    //N	NUMBER(5)	    Y	0		구간 길이
+                pObj->EXTR_CNCT_SECT_YN = pADO->FieldByName("EXTR_CNCT_SECT_YN")->AsString;	//N	CHAR(1)	        Y	'N'		외부 연계 구간 여부
+                pObj->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;	        //N	CHAR(1)	        Y	'N'		삭제 여부
+                pObj->RMRK              = pADO->FieldByName("RMRK")->AsString;	            //N	VARCHAR2(600)	Y			비고
+                pObj->F_NODE_ID         = pADO->FieldByName("F_NODE_ID")->AsString;	        //N	NUMBER(10)	    Y			시작 노드 ID
+                pObj->T_NODE_ID         = pADO->FieldByName("T_NODE_ID")->AsString;	        //N	NUMBER(10)	    Y			종료 노드 ID
+                pObj->SECT_GRAD_CD      = pADO->FieldByName("SECT_GRAD_CD")->AsString;	    //N	VARCHAR2(7)	    Y			구간 등급 코드
+                pObj->AREA_CD           = pADO->FieldByName("AREA_CD")->AsString;	        //N	VARCHAR2(7)	    Y			지역 코드
+
+				FLists.Push(pObj->IFSC_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("IFSC정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("IFSC정보조회", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TIfscManager::LoadTraffic(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    InitTraffic();
+
+    sQry = "SELECT IFSC_ID AS LINKID, NVL(PRCN_DT, '19000101000000') AS PRCN_DT,    \r\n"
+           "       NVL(TFVL,      0) AS TFVL,      NVL(SPED,      0) AS SPED,       \r\n"
+           "       NVL(PTRN_SPED, 0) AS PTRN_SPED, NVL(OCPY_RATE, 0) AS OCPY_RATE,  \r\n"
+           "       NVL(TRVL_HH,   0) AS TRVL_HH,                                    \r\n"
+           "       DECODE(CMTR_GRAD_CD, 'LTC1', '1',                                \r\n"
+           "                            'LTC2', '2',                                \r\n"
+           "                            'LTC3', '3', '0') AS CMTR_GRAD_CD,          \r\n"
+           "       NVL(DATA_NUM, 0) AS DATA_NUM                                     \r\n"
+           "  FROM TB_IFSC_TRAF                                                     \r\n"
+           " WHERE PRCN_DT > TO_CHAR(SYSDATE -  5 / 1440, 'YYYYMMDDHH24MISS')       \r\n";
+
+#if 0
+    sQry = "SELECT 2 AS LEVL, A.IFSC_ID AS LINKID,  NVL(B.SPED, 0) AS SPEED, NVL(CMTR_GRAD_CD, 'LTC0') CMTR_GRAD_CD, \r\n"
+           "       DECODE(CMTR_GRAD_CD, 'LTC1', '1', 'LTC2', '2', 'LTC3', '3', '0') TRF_GRADE,                       \r\n"
+           "       NVL(B.PRCN_DT, '19000101000000')     AS REGDATE,                                                  \r\n"
+           "       NVL(B.DATA_NUM, 0) AS DATACNT,                                                                    \r\n"
+           "       NVL(B.TRVL_HH, 0) AS TRVTM                                                                        \r\n"
+           "  FROM TB_IFSC A,                                                                                        \r\n"
+           "       (SELECT *                                                                                         \r\n"
+           "          FROM TB_IFSC_TRAF                                                                              \r\n"
+           //"         WHERE PRCN_DT > TO_CHAR(SYSDATE -  5 / 1440, 'YYYYMMDDHH24MISS')                                \r\n"
+           "       ) B                                                                                               \r\n"
+           " WHERE A.IFSC_ID = B.IFSC_ID(+)                                                                          \r\n";
+#endif
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String LINKID = pADO->FieldByName("LINKID")->AsString;
+
+				TIfsc *pObj = FLists.Find(LINKID);
+                if (!pObj) continue;
+
+                pObj->PRCN_DT       = pADO->FieldByName("PRCN_DT")->AsString;	        //N	VARCHAR2(14)	Y			가공 일시
+                pObj->TFVL          = pADO->FieldByName("TFVL")->AsInteger;	            //N	NUMBER(6)	    Y	0		교통량
+                pObj->SPED          = pADO->FieldByName("SPED")->AsInteger;	            //N	NUMBER(3)	    Y	0		속도
+                pObj->PTRN_SPED     = pADO->FieldByName("PTRN_SPED")->AsInteger;	    //N	NUMBER(3)	    Y	0		패턴 속도
+                pObj->OCPY_RATE     = pADO->FieldByName("OCPY_RATE")->AsFloat;	        //N	NUMBER(5,2)	    Y	0		점유 율
+                pObj->TRVL_HH       = pADO->FieldByName("TRVL_HH")->AsInteger;	        //N	NUMBER(6)	    Y	0		통행 시간
+                pObj->CMTR_GRAD_CD  = pADO->FieldByName("CMTR_GRAD_CD")->AsString;	    //N	VARCHAR2(7)	    Y			소통 등급 코드
+                pObj->DATA_NUM      = pADO->FieldByName("DATA_NUM")->AsInteger;	        //N	NUMBER(3)	    Y	0		데이터 개수
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("IFSC교통정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("IFSC교통정보조회", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 69 - 0
COMMON/CDS/CDSIfsc_VMSF.h

@@ -0,0 +1,69 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSIfsc_VMSFH
+#define CDSIfsc_VMSFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+class TIfsc
+{
+public:
+    TIfsc();
+    ~TIfsc();
+public:
+    String  IFSC_ID;	        //N	NUMBER(10)	    N			정보제공구간 ID
+    String  IFSC_NM;	        //N	VARCHAR2(100)	Y			정보제공구간 명
+    String  DRCT_CD;	        //N	VARCHAR2(7)	    Y			방향 코드
+    String  STRT_NM;	        //N	VARCHAR2(100)	Y			시점 명
+    String  END_NM;	            //N	VARCHAR2(100)	Y			종점 명
+    int     SECT_LNGT;	        //N	NUMBER(5)	    Y	0		구간 길이
+    String  EXTR_CNCT_SECT_YN;	//N	CHAR(1)	        Y	'N'		외부 연계 구간 여부
+    String  DEL_YN;	            //N	CHAR(1)	        Y	'N'		삭제 여부
+    String  RMRK;	            //N	VARCHAR2(600)	Y			비고
+    String  F_NODE_ID;	        //N	NUMBER(10)	    Y			시작 노드 ID
+    String  T_NODE_ID;	        //N	NUMBER(10)	    Y			종료 노드 ID
+    String  SECT_GRAD_CD;	    //N	VARCHAR2(7)	    Y			구간 등급 코드
+    String  AREA_CD;	        //N	VARCHAR2(7)	    Y			지역 코드
+
+    String  PRCN_DT;	        //N	VARCHAR2(14)	Y			가공 일시
+    int     TFVL;	            //N	NUMBER(6)	    Y	0		교통량
+    int     SPED;	            //N	NUMBER(3)	    Y	0		속도
+    int     PTRN_SPED;	        //N	NUMBER(3)	    Y	0		패턴 속도
+    float   OCPY_RATE;	        //N	NUMBER(5,2)	    Y	0		점유 율
+    int     TRVL_HH;	        //N	NUMBER(6)	    Y	0		통행 시간
+    String  CMTR_GRAD_CD;	    //N	VARCHAR2(7)	    Y			소통 등급 코드
+    int     DATA_NUM;	        //N	NUMBER(3)	    Y	0		데이터 개수
+
+    void InitTraffic();
+};
+//---------------------------------------------------------------------------
+
+class TIfscManager
+{
+public:
+    TIfscManager();
+    ~TIfscManager();
+
+private:
+
+public:
+
+    ListMap<TIfsc> FLists;
+
+public:
+    void InitTraffic();
+
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadTraffic(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TIfscManager *IfscManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 1089 - 0
COMMON/CDS/CDSIncidentF.cpp

@@ -0,0 +1,1089 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSIncidentF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsIncident::TItsIncident()
+{
+    FMarker = NULL;
+
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsIncident::Clear()
+{
+#if 0
+    FINCD_OCRR_ID             = "";          //돌발상황 발생 ID
+    FRGST_DT                  = "";               //등록 일시
+    FINCD_ORGN_CD             = "";          //돌발상황 원본 코드 : IST
+    FOCRR_LCTN_NM             = "";          //발생 위치 명
+    FX_CRDN                   = "";                //X 좌표
+    FY_CRDN                   = "";                //Y 좌표
+    FINCD_EXPL                = "";             //돌발상황 설명
+    FCMTR_GRAD_CD             = "";          //소통 등급 코드 : LTCU
+    FIFMR_NM                  = "";               //제보자 명
+    FINCD_CNFM_MTHD_CD        = "";     //돌발상황 확인 방법 코드 : ICM
+    FINCD_CNFM_DT             = "";          //돌발상황 확인 일시
+    FINCD_STRT_DT             = "";          //돌발상황 시작 일시
+    FINCD_END_PRAR_DT         = "";      //돌발상황 종료 예정 일시
+    FINCD_TYPE_CLSF_CD        = "";     //돌발상황 유형 분류 코드 : IDTU
+    FINCD_TYPE_CD             = "";          //돌발상황 유형 코드 : ACTU, CRTU, EVTU, WETU 중 하나
+    FINCD_TITL                = "";             //돌발상황 제목
+    FINCD_SERN_CD             = "";          //돌발상황 심각도 코드 : SRLU
+    FDELY_LNGT                = "";             //지체 길이
+    FINCD_LNGT                = "";             //돌발상황 길이
+    FINCD_OCRR_LANE           = "";        //돌발상황 발생 차로
+    FINCD_CLSR_LANE           = "";        //돌발상황 차단 차로
+    FTRVL_LMNT_TYPE_CD        = "";     //통행 제한 유형 코드 : PRTU
+    FTRUB_VHCL_YN             = "";          //고장 차량 여부
+    FFALT_YN                  = "";               //낙하물 여부
+    FFRWT_YN                  = "";               //화재위험물 여부
+    FUTIS_CNCT_YN             = "";          //UTIS 연계 여부
+    FSMLT_VHCL_UNUM           = "";        //소형 차량 대수
+    FMDLT_VHCL_UNUM           = "";        //중대형 차량 대수
+    FINJR_PNUM                = "";             //부상자 인원수
+    FFTLT_PNUM                = "";             //사망자 인원수
+    FWTHR_CD                  = "";               //기상 코드 : DFW
+    FRESP_LVL_CD              = "";           //대응 수준 코드 : RSL
+    FVMS_DSPL_YN              = "";           //VMS 표출 여부
+    FINCD_PRGR_STEP_CD        = "";     //돌발상황 진행 단계 코드 : ISS
+    FINCD_END_CNFM_MTHD_CD    = ""; //돌발상황 종료 확인 방법 코드 : ICM
+    FINCD_END_DT              = "";           //돌발상황 종료 일시
+    FMBLZ_EQPM_CONT           = "";        //출동 장비 내용
+    FMBLZ_PNUM                = "";             //출동 인원수
+    FRECR_CONT                = "";             //복구 내용
+    FRECR_PERD                = "";             //복구 기간
+    FLINK_ID                  = "";               //돌발발생 LINK ID
+#endif
+}
+//---------------------------------------------------------------------------
+TItsIncident::~TItsIncident()
+{
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetValue(String &AOrgValue, String AValue)
+{
+    if (AOrgValue != AValue)
+    {
+        AOrgValue = AValue;
+        if (FCompleted) FModified = true;
+    }
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_OCRR_ID(String AValue)
+{
+    SetValue(FINCD_OCRR_ID, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFRGST_DT(String AValue)
+{
+    SetValue(FRGST_DT, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_ORGN_CD(String AValue)
+{
+    SetValue(FINCD_ORGN_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFOCRR_LCTN_NM(String AValue)
+{
+    SetValue(FOCRR_LCTN_NM, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFX_CRDN(String AValue)
+{
+    SetValue(FX_CRDN, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFY_CRDN(String AValue)
+{
+    SetValue(FY_CRDN, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_EXPL(String AValue)
+{
+    SetValue(FINCD_EXPL, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFCMTR_GRAD_CD(String AValue)
+{
+    SetValue(FCMTR_GRAD_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFIFMR_NM(String AValue)
+{
+    SetValue(FIFMR_NM, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_CNFM_MTHD_CD(String AValue)
+{
+    SetValue(FINCD_CNFM_MTHD_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_CNFM_DT(String AValue)
+{
+    SetValue(FINCD_CNFM_DT, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_STRT_DT(String AValue)
+{
+    SetValue(FINCD_STRT_DT, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_END_PRAR_DT(String AValue)
+{
+    SetValue(FINCD_END_PRAR_DT, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_TYPE_CLSF_CD(String AValue)
+{
+    SetValue(FINCD_TYPE_CLSF_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_TYPE_CD(String AValue)
+{
+    SetValue(FINCD_TYPE_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_TITL(String AValue)
+{
+    SetValue(FINCD_TITL, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_SERN_CD(String AValue)
+{
+    SetValue(FINCD_SERN_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFDELY_LNGT(String AValue)
+{
+    SetValue(FDELY_LNGT, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_LNGT(String AValue)
+{
+    SetValue(FINCD_LNGT, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_OCRR_LANE(String AValue)
+{
+    SetValue(FINCD_OCRR_LANE, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_CLSR_LANE(String AValue)
+{
+    SetValue(FINCD_CLSR_LANE, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFTRVL_LMNT_TYPE_CD(String AValue)
+{
+    SetValue(FTRVL_LMNT_TYPE_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFTRUB_VHCL_YN(String AValue)
+{
+    SetValue(FTRUB_VHCL_YN, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFFALT_YN(String AValue)
+{
+    SetValue(FFALT_YN, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFFRWT_YN(String AValue)
+{
+    SetValue(FFRWT_YN, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFUTIS_CNCT_YN(String AValue)
+{
+    SetValue(FUTIS_CNCT_YN, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFSMLT_VHCL_UNUM(String AValue)
+{
+    SetValue(FSMLT_VHCL_UNUM, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFMDLT_VHCL_UNUM(String AValue)
+{
+    SetValue(FMDLT_VHCL_UNUM, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINJR_PNUM(String AValue)
+{
+    SetValue(FINJR_PNUM, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFFTLT_PNUM(String AValue)
+{
+    SetValue(FFTLT_PNUM, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFWTHR_CD(String AValue)
+{
+    SetValue(FWTHR_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFRESP_LVL_CD(String AValue)
+{
+    SetValue(FRESP_LVL_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFVMS_DSPL_YN(String AValue)
+{
+    SetValue(FVMS_DSPL_YN, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_PRGR_STEP_CD(String AValue)
+{
+    SetValue(FINCD_PRGR_STEP_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_END_CNFM_MTHD_CD(String AValue)
+{
+    SetValue(FINCD_END_CNFM_MTHD_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFINCD_END_DT(String AValue)
+{
+    SetValue(FINCD_END_DT, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFMBLZ_EQPM_CONT(String AValue)
+{
+    SetValue(FMBLZ_EQPM_CONT, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFMBLZ_PNUM(String AValue)
+{
+    SetValue(FMBLZ_PNUM, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFRECR_CONT(String AValue)
+{
+    SetValue(FRECR_CONT, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFRECR_PERD(String AValue)
+{
+    SetValue(FRECR_PERD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsIncident::SetFLINK_ID(String AValue)
+{
+    SetValue(FLINK_ID, AValue);
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TItsIncidentManager *ItsIncidentManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Incident Manager
+*/
+TItsIncidentManager::TItsIncidentManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsIncidentManager::~TItsIncidentManager()
+{
+}
+//---------------------------------------------------------------------------
+bool TItsIncidentManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.*, DECODE(B.INCD_OCRR_ID, NULL, 'N', 'Y') AS DISP_INCD \r\n"
+           "  FROM TB_INCD_OCRR A, VW_INCD_OCRR B                           \r\n"
+           " WHERE A.INCD_OCRR_ID = B.INCD_OCRR_ID(+)                       \r\n";
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsIncident *pObj = new TItsIncident();
+
+                pObj->FINCD_OCRR_ID          = pADO->FieldByName("INCD_OCRR_ID")->AsString;
+                pObj->FRGST_DT               = pADO->FieldByName("RGST_DT")->AsString;
+                pObj->FINCD_ORGN_CD          = pADO->FieldByName("INCD_ORGN_CD")->AsString;
+                pObj->FOCRR_LCTN_NM          = pADO->FieldByName("OCRR_LCTN_NM")->AsString;
+                pObj->FX_CRDN                = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->FY_CRDN                = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->FINCD_EXPL             = pADO->FieldByName("INCD_EXPL")->AsString;
+                pObj->FCMTR_GRAD_CD          = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+                pObj->FIFMR_NM               = pADO->FieldByName("IFMR_NM")->AsString;
+                pObj->FINCD_CNFM_MTHD_CD     = pADO->FieldByName("INCD_CNFM_MTHD_CD")->AsString;
+                pObj->FINCD_CNFM_DT          = pADO->FieldByName("INCD_CNFM_DT")->AsString;
+                pObj->FINCD_STRT_DT          = pADO->FieldByName("INCD_STRT_DT")->AsString;
+                pObj->FINCD_END_PRAR_DT      = pADO->FieldByName("INCD_END_PRAR_DT")->AsString;
+                pObj->FINCD_TYPE_CLSF_CD     = pADO->FieldByName("INCD_TYPE_CLSF_CD")->AsString;
+                pObj->FINCD_TYPE_CD          = pADO->FieldByName("INCD_TYPE_CD")->AsString;
+                pObj->FINCD_TITL             = pADO->FieldByName("INCD_TITL")->AsString;
+                pObj->FINCD_SERN_CD          = pADO->FieldByName("INCD_SERN_CD")->AsString;
+                pObj->FDELY_LNGT             = pADO->FieldByName("DELY_LNGT")->AsString;
+                pObj->FINCD_LNGT             = pADO->FieldByName("INCD_LNGT")->AsString;
+                pObj->FINCD_OCRR_LANE        = pADO->FieldByName("INCD_OCRR_LANE")->AsString;
+                if (pObj->FINCD_OCRR_LANE.IsEmpty())
+                {
+                    pObj->FINCD_OCRR_LANE = "000000";
+                }
+                else
+                if (pObj->FINCD_OCRR_LANE.Length() != 6)
+                {
+                    pObj->FINCD_OCRR_LANE = "000000";
+                }
+                pObj->FINCD_CLSR_LANE        = pADO->FieldByName("INCD_CLSR_LANE")->AsString;
+                pObj->FTRVL_LMNT_TYPE_CD     = pADO->FieldByName("TRVL_LMNT_TYPE_CD")->AsString;
+                pObj->FTRUB_VHCL_YN          = pADO->FieldByName("TRUB_VHCL_YN")->AsString;
+                pObj->FFALT_YN               = pADO->FieldByName("FALT_YN")->AsString;
+                pObj->FFRWT_YN               = pADO->FieldByName("FRWT_YN")->AsString;
+                pObj->FUTIS_CNCT_YN          = pADO->FieldByName("UTIS_CNCT_YN")->AsString;
+                pObj->FSMLT_VHCL_UNUM        = pADO->FieldByName("SMLT_VHCL_UNUM")->AsString;
+                pObj->FMDLT_VHCL_UNUM        = pADO->FieldByName("MDLT_VHCL_UNUM")->AsString;
+                pObj->FINJR_PNUM             = pADO->FieldByName("INJR_PNUM")->AsString;
+                pObj->FFTLT_PNUM             = pADO->FieldByName("FTLT_PNUM")->AsString;
+                pObj->FWTHR_CD               = pADO->FieldByName("WTHR_CD")->AsString;
+                pObj->FRESP_LVL_CD           = pADO->FieldByName("RESP_LVL_CD")->AsString;
+                pObj->FVMS_DSPL_YN           = pADO->FieldByName("VMS_DSPL_YN")->AsString;
+                pObj->FINCD_PRGR_STEP_CD     = pADO->FieldByName("INCD_PRGR_STEP_CD")->AsString;
+                pObj->FINCD_END_CNFM_MTHD_CD = pADO->FieldByName("INCD_END_CNFM_MTHD_CD")->AsString;
+                pObj->FINCD_END_DT           = pADO->FieldByName("INCD_END_DT")->AsString;
+                pObj->FMBLZ_EQPM_CONT        = pADO->FieldByName("MBLZ_EQPM_CONT")->AsString;
+                pObj->FMBLZ_PNUM             = pADO->FieldByName("MBLZ_PNUM")->AsString;
+                pObj->FRECR_CONT             = pADO->FieldByName("RECR_CONT")->AsString;
+                pObj->FRECR_PERD             = pADO->FieldByName("RECR_PERD")->AsString;
+                pObj->FLINK_ID               = pADO->FieldByName("LINK_ID")->AsString;
+
+                pObj->DISP_INCD              = pADO->FieldByName("DISP_INCD")->AsString;
+
+				FLists.Push(pObj->INCD_OCRR_ID, pObj);
+                pObj->Completed = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsIncidentManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsIncidentManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+bool TItsIncidentManager::LoadFromAutoIncident(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT A.LINK_ID, A.DETC_DT, A.CLCT_SPED_AVRG, A.ESTM_SPED_AVRG,  \r\n"
+           "       A.REAL_YN, B.X_CRDN, B.Y_CRDN, C.ROAD_NAME                 \r\n"
+           "  FROM TB_INCD_ESTM_SECT A, TB_LINK_VRTX B, TB_LINK C             \r\n"
+           " WHERE A.LINK_ID = B.LINK_ID                                      \r\n"
+           "   AND A.LINK_ID = C.LINK_ID                                      \r\n"
+           "   AND B.ORD = '1'                                                \r\n";
+
+#else
+    sQry = "SELECT A.LINK_ID, A.DETC_DT, A.CLCT_SPED_AVRG, A.ESTM_SPED_AVRG,        \r\n"
+           "       A.REAL_YN, B.X_CRDN, B.Y_CRDN, C.ROAD_NAME,                      \r\n"
+           "       B.NODE_NAME AS STNAME, D.NODE_NAME AS EDNAME                     \r\n"
+           "  FROM TB_INCD_ESTM_SECT A, TB_NODE B, TB_LINK C, TB_NODE D             \r\n"
+           " WHERE A.LINK_ID = C.LINK_ID                                            \r\n"
+           "   AND C.F_NODE  = B.NODE_ID                                            \r\n"
+           "   AND C.T_NODE  = D.NODE_ID                                            \r\n"
+           "   AND A.DETC_DT >= TO_CHAR(SYSDATE - (2*60)/60/24, 'YYYYMMDDHH24MISS') \r\n"
+           "   AND A.REAL_YN = 'N'                                                  \r\n";
+#endif
+    try
+    {
+        FAutoIncident = 0;
+        FAutoLists.Lock();
+        FAutoLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsAutoIncident *pObj = new TItsAutoIncident();
+
+                pObj->LINK_ID        = pADO->FieldByName("LINK_ID")->AsString;
+                pObj->DETC_DT        = pADO->FieldByName("DETC_DT")->AsString;
+                pObj->CLCT_SPED_AVRG = pADO->FieldByName("CLCT_SPED_AVRG")->AsString;
+                pObj->ESTM_SPED_AVRG = pADO->FieldByName("ESTM_SPED_AVRG")->AsString;
+                pObj->REAL_YN        = pADO->FieldByName("REAL_YN")->AsString;
+                pObj->X_CRDN         = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN         = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->ROAD_NAME      = pADO->FieldByName("ROAD_NAME")->AsString;
+                pObj->STNAME         = pADO->FieldByName("STNAME")->AsString;
+                pObj->EDNAME         = pADO->FieldByName("EDNAME")->AsString;
+
+				FAutoLists.Push(String(FAutoIncident++), pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsIncidentManager::LoadFromAutoIncident", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsIncidentManager::LoadFromAutoIncident", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FAutoLists.UnLock();
+    }
+
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+bool TItsIncidentManager::LoadFromVmsIncident(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT * FROM TB_INCD_OCRR_VMS \r\n";
+    try
+    {
+        FVmsLists.Lock();
+        FVmsLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsVmsIncident *pObj = new TItsVmsIncident();
+
+                pObj->INCD_OCRR_ID          = pADO->FieldByName("INCD_OCRR_ID")->AsString;
+                pObj->STRT_LCTN_NM          = pADO->FieldByName("STRT_LCTN_NM")->AsString;
+                pObj->END_LCTN_NM           = pADO->FieldByName("END_LCTN_NM")->AsString;
+                pObj->OCRR_LCTN_NM          = pADO->FieldByName("OCRR_LCTN_NM")->AsString;
+                pObj->CMTR_GRAD_CD          = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+                pObj->INCD_CLSR_LANE        = pADO->FieldByName("INCD_CLSR_LANE")->AsString;
+                pObj->VMS_DSPL_YN           = pADO->FieldByName("VMS_DSPL_YN")->AsString;
+                pObj->INCD_PRGR_STEP_CD     = pADO->FieldByName("INCD_PRGR_STEP_CD")->AsString;
+                pObj->INCD_STRT_DT          = pADO->FieldByName("INCD_STRT_DT")->AsString;
+                pObj->INCD_END_PRAR_DT      = pADO->FieldByName("INCD_END_PRAR_DT")->AsString;
+                pObj->LINK_ID               = pADO->FieldByName("LINK_ID")->AsString;
+                pObj->VMS_INCD_TYPE_CD      = pADO->FieldByName("VMS_INCD_TYPE_CD")->AsString;
+                pObj->VMS_INCD_DETL_TYPE_CD = pADO->FieldByName("VMS_INCD_DETL_TYPE_CD")->AsString;
+                pObj->VMS_INCD_RSTR_TYPE_CD = pADO->FieldByName("VMS_INCD_RSTR_TYPE_CD")->AsString;
+
+				FVmsLists.Push(pObj->INCD_OCRR_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::LoadFromVmsIncident", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::LoadFromVmsIncident", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FVmsLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsIncidentManager::UpdateIncidentInfo(TItsIncident *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_INCD_OCRR                  \r\n"
+           "   SET INCD_ORGN_CD          = :p02, \r\n"
+           "       OCRR_LCTN_NM          = :p03, \r\n"
+           "       X_CRDN                = :p04, \r\n"
+           "       Y_CRDN                = :p05, \r\n"
+           "       INCD_EXPL             = :p06, \r\n"
+           "       CMTR_GRAD_CD          = :p07, \r\n"
+           "       IFMR_NM               = :p08, \r\n"
+           "       INCD_CNFM_MTHD_CD     = :p09, \r\n"
+           "       INCD_CNFM_DT          = :p10, \r\n"
+           "       INCD_STRT_DT          = :p11, \r\n"
+           "       INCD_END_PRAR_DT      = :p12, \r\n"
+           "       INCD_TYPE_CLSF_CD     = :p13, \r\n"
+           "       INCD_TYPE_CD          = :p14, \r\n"
+           "       INCD_TITL             = :p15, \r\n"
+           "       INCD_SERN_CD          = :p16, \r\n"
+           "       DELY_LNGT             = :p17, \r\n"
+           "       INCD_LNGT             = :p18, \r\n"
+           "       INCD_OCRR_LANE        = :p19, \r\n"
+           "       INCD_CLSR_LANE        = :p20, \r\n"
+           "       TRVL_LMNT_TYPE_CD     = :p21, \r\n"
+           "       TRUB_VHCL_YN          = :p22, \r\n"
+           "       FALT_YN               = :p23, \r\n"
+           "       FRWT_YN               = :p24, \r\n"
+           "       UTIS_CNCT_YN          = :p25, \r\n"
+           "       SMLT_VHCL_UNUM        = :p26, \r\n"
+           "       MDLT_VHCL_UNUM        = :p27, \r\n"
+           "       INJR_PNUM             = :p28, \r\n"
+           "       FTLT_PNUM             = :p29, \r\n"
+           "       WTHR_CD               = :p30, \r\n"
+           "       RESP_LVL_CD           = :p31, \r\n"
+           "       VMS_DSPL_YN           = :p32, \r\n"
+           "       INCD_PRGR_STEP_CD     = :p33, \r\n"
+           "       INCD_END_CNFM_MTHD_CD = :p34, \r\n"
+           "       INCD_END_DT           = :p35, \r\n"
+           "       MBLZ_EQPM_CONT        = :p36, \r\n"
+           "       MBLZ_PNUM             = :p37, \r\n"
+           "       RECR_CONT             = :p38, \r\n"
+           "       RECR_PERD             = :p39, \r\n"
+           "       LINK_ID               = :p40  \r\n"
+           " WHERE INCD_OCRR_ID = :p01           \r\n";
+
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Parameters->ParamByName("p01")->Value = AObj->INCD_OCRR_ID;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->INCD_ORGN_CD;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->OCRR_LCTN_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->INCD_EXPL;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->CMTR_GRAD_CD;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->IFMR_NM;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->INCD_CNFM_MTHD_CD;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->INCD_CNFM_DT;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->INCD_STRT_DT;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->INCD_END_PRAR_DT;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->INCD_TYPE_CLSF_CD;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->INCD_TYPE_CD;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->INCD_TITL;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->INCD_SERN_CD;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->DELY_LNGT;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->INCD_LNGT;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->INCD_OCRR_LANE;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->INCD_CLSR_LANE;
+            pADO->Parameters->ParamByName("p21")->Value = AObj->TRVL_LMNT_TYPE_CD;
+            pADO->Parameters->ParamByName("p22")->Value = AObj->TRUB_VHCL_YN;
+            pADO->Parameters->ParamByName("p23")->Value = AObj->FALT_YN;
+            pADO->Parameters->ParamByName("p24")->Value = AObj->FRWT_YN;
+            pADO->Parameters->ParamByName("p25")->Value = AObj->UTIS_CNCT_YN;
+            pADO->Parameters->ParamByName("p26")->Value = AObj->SMLT_VHCL_UNUM;
+            pADO->Parameters->ParamByName("p27")->Value = AObj->MDLT_VHCL_UNUM;
+            pADO->Parameters->ParamByName("p28")->Value = AObj->INJR_PNUM;
+            pADO->Parameters->ParamByName("p29")->Value = AObj->FTLT_PNUM;
+            pADO->Parameters->ParamByName("p30")->Value = AObj->WTHR_CD;
+            pADO->Parameters->ParamByName("p31")->Value = AObj->RESP_LVL_CD;
+            pADO->Parameters->ParamByName("p32")->Value = AObj->VMS_DSPL_YN;
+            pADO->Parameters->ParamByName("p33")->Value = AObj->INCD_PRGR_STEP_CD;
+            pADO->Parameters->ParamByName("p34")->Value = AObj->INCD_END_CNFM_MTHD_CD;
+            pADO->Parameters->ParamByName("p35")->Value = AObj->INCD_END_DT;
+            pADO->Parameters->ParamByName("p36")->Value = AObj->MBLZ_EQPM_CONT;
+            pADO->Parameters->ParamByName("p37")->Value = AObj->MBLZ_PNUM;
+            pADO->Parameters->ParamByName("p38")->Value = AObj->RECR_CONT;
+            pADO->Parameters->ParamByName("p39")->Value = AObj->RECR_PERD;
+            pADO->Parameters->ParamByName("p40")->Value = AObj->LINK_ID;
+
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::UpdateIncidentInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::UpdateIncidentInfo", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+
+        UpdateIncidentLoc(AObj, ADbConn);
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TItsIncidentManager::DeleteIncidentLoc(String AIncidId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+
+    sQry = "DELETE INCIDENT_LOC  \r\n"
+           " WHERE INCIDENTID = :p01  \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Parameters->ParamByName("p01")->Value = AIncidId;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::DeleteIncidentLoc", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::DeleteIncidentLoc", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+
+bool TItsIncidentManager::UpdateIncidentLoc(TItsIncident *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    //공단에서 넘어온 돌발은 공단연계가 표출안되게
+    if (AObj->INCD_ORGN_CD == "IST5")
+    {
+        return true;
+    }
+
+    //1. 기존 정보가 어떤것인지 확인하기 귀찮으니까 일단 삭제해 버리자.
+    DeleteIncidentLoc(AObj->INCD_OCRR_ID, ADbConn);
+
+    sQry = "INSERT INTO INCIDENT_LOC (      \r\n"
+           "            INCIDENTID,         \r\n"
+           "            LOGDATE,            \r\n"
+           "            REPORTDATE,         \r\n"
+           "            LINKID,             \r\n"
+           "            USERID,             \r\n"
+           "            REPORTERID,         \r\n"
+           "            STARTDATE,          \r\n"
+           "            ENDDATE,            \r\n"
+           "            TRAFFICGRADE,       \r\n"
+           "            TROUBLEGRADE,       \r\n"
+           "            INCIDENTTITLE,      \r\n"
+           "            INCIDENTINFO,       \r\n"
+           "            INCIDENTCODE,       \r\n"
+           "            INCIDENTSUBCODE,    \r\n"
+           "            LOCATION,           \r\n"
+           "            DATARESTYPE,        \r\n"
+           "            COORDX,             \r\n"
+           "            COORDY )            \r\n"
+           "    VALUES (:p01,               \r\n"
+           "            TO_DATE(:p02, 'YYYYMMDDHH24MISS'), \r\n"
+           "            TO_DATE(:p03, 'YYYYMMDDHH24MISS'), \r\n"
+           "            :p04,               \r\n"
+           "            :p05,               \r\n"
+           "            :p06,               \r\n"
+           "            TO_DATE(:p07, 'YYYYMMDDHH24MISS'), \r\n"
+           "            TO_DATE(:p08, 'YYYYMMDDHH24MISS'), \r\n"
+           "            :p09,               \r\n"
+           "            :p10,               \r\n"
+           "            :p11,               \r\n"
+           "            :p12,               \r\n"
+           "            :p13,               \r\n"
+           "            :p14,               \r\n"
+           "            :p15,               \r\n"
+           "            :p16,               \r\n"
+           "            :p17,               \r\n"
+           "            :p18)               \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            //2. 공단으로 정보를 연계하는 경우에만 정보를 입력하도록 한다.
+            if (AObj->UTIS_CNCT_YN != "Y") return true;
+
+
+            pADO->Parameters->ParamByName("p01")->Value = AObj->INCD_OCRR_ID;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->RGST_DT;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->INCD_CNFM_DT;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->LINK_ID;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->INCD_OCRR_ID.SubString(1, 3);
+            pADO->Parameters->ParamByName("p06")->Value = AObj->INCD_OCRR_ID.SubString(1, 3);
+            pADO->Parameters->ParamByName("p07")->Value = AObj->INCD_STRT_DT;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->INCD_END_PRAR_DT;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->CMTR_GRAD_CD.SubString(1, 2);
+            pADO->Parameters->ParamByName("p10")->Value = AObj->INCD_SERN_CD;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->INCD_TITL.Trim();
+            pADO->Parameters->ParamByName("p12")->Value = AObj->INCD_EXPL.Trim().SubString(1, 250);
+            pADO->Parameters->ParamByName("p13")->Value = AObj->INCD_TYPE_CLSF_CD;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->INCD_TYPE_CD;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->OCRR_LCTN_NM.Trim();
+            pADO->Parameters->ParamByName("p16")->Value = "";
+            pADO->Parameters->ParamByName("p17")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->Y_CRDN;
+
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::UpdateIncidentLoc", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::UpdateIncidentLoc", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TItsIncidentManager::MergeVmsIncidentInfo(String AINCD_OCRR_ID,           // '돌발상황 발생 ID
+                                               String ASTRT_LCTN_NM,           // '시작 위치 명
+                                               String AEND_LCTN_NM,            // '종료 위치 명
+                                               String AOCRR_LCTN_NM,           // '발생 위치 명
+                                               String ACMTR_GRAD_CD,           // '소통 등급 코드
+                                               String AINCD_CLSR_LANE,         // '돌발상황 차단 차로
+                                               String AVMS_DSPL_YN,            // 'VMS 표출 여부
+                                               String AINCD_PRGR_STEP_CD,      // '돌발상황 진행 단계 코드
+                                               String AINCD_STRT_DT,           // '돌발상황 시작 일시
+                                               String AINCD_END_PRAR_DT,       // '돌발상황 종료 예정 일시
+                                               String ALINK_ID,                // '링크ID
+                                               String AVMS_INCD_TYPE_CD,       // 'VMS 돌발유형코드
+                                               String AVMS_INCD_DETL_TYPE_CD,  // 'VMS 돌발세부유형코드
+                                               String AVMS_INCD_RSTR_TYPE_CD,  // 'VMS 돌발통제코드
+                                               TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "MERGE INTO TB_INCD_OCRR_VMS L                                  \r\n"
+           "  USING (SELECT :p01 INCD_OCRR_ID,                             \r\n"
+           "                :p02 STRT_LCTN_NM,                             \r\n"
+           "                :p03 END_LCTN_NM,                              \r\n"
+           "                :p04 OCRR_LCTN_NM,                             \r\n"
+           "                :p05 CMTR_GRAD_CD,                             \r\n"
+           "                :p06 INCD_CLSR_LANE,                           \r\n"
+           "                :p07 VMS_DSPL_YN,                              \r\n"
+           "                :p08 INCD_PRGR_STEP_CD,                        \r\n"
+           "                :p09 INCD_STRT_DT,                             \r\n"
+           "                :p10 INCD_END_PRAR_DT,                         \r\n"
+           "                :p11 LINK_ID,                                  \r\n"
+           "                :p12 VMS_INCD_TYPE_CD,                         \r\n"
+           "                :p13 VMS_INCD_DETL_TYPE_CD,                    \r\n"
+           "                :p14 VMS_INCD_RSTR_TYPE_CD                     \r\n"
+           "           FROM DUAL ) M                                       \r\n"
+           "ON (L.INCD_OCRR_ID = M.INCD_OCRR_ID)                           \r\n"
+           "WHEN MATCHED THEN                                              \r\n"
+           " UPDATE SET L.STRT_LCTN_NM          = M.STRT_LCTN_NM,          \r\n"
+           "            L.END_LCTN_NM           = M.END_LCTN_NM,           \r\n"
+           "            L.OCRR_LCTN_NM          = M.OCRR_LCTN_NM,          \r\n"
+           "            L.CMTR_GRAD_CD          = M.CMTR_GRAD_CD,          \r\n"
+           "            L.INCD_CLSR_LANE        = M.INCD_CLSR_LANE,        \r\n"
+           "            L.VMS_DSPL_YN           = M.VMS_DSPL_YN,           \r\n"
+           "            L.INCD_PRGR_STEP_CD     = M.INCD_PRGR_STEP_CD,     \r\n"
+           "            L.INCD_STRT_DT          = M.INCD_STRT_DT,          \r\n"
+           "            L.INCD_END_PRAR_DT      = M.INCD_END_PRAR_DT,      \r\n"
+           "            L.LINK_ID               = M.LINK_ID,               \r\n"
+           "            L.VMS_INCD_TYPE_CD      = M.VMS_INCD_TYPE_CD,      \r\n"
+           "            L.VMS_INCD_DETL_TYPE_CD = M.VMS_INCD_DETL_TYPE_CD, \r\n"
+           "            L.VMS_INCD_RSTR_TYPE_CD = M.VMS_INCD_RSTR_TYPE_CD  \r\n"
+           "WHEN NOT MATCHED THEN                                          \r\n"
+           " INSERT (L.INCD_OCRR_ID, L.STRT_LCTN_NM, L.END_LCTN_NM,        \r\n"
+           "         L.OCRR_LCTN_NM, L.CMTR_GRAD_CD, L.INCD_CLSR_LANE,     \r\n"
+           "         L.VMS_DSPL_YN,  L.INCD_PRGR_STEP_CD, L.INCD_STRT_DT,  \r\n"
+           "         L.INCD_END_PRAR_DT, L.LINK_ID, L.VMS_INCD_TYPE_CD,    \r\n"
+           "         L.VMS_INCD_DETL_TYPE_CD, L.VMS_INCD_RSTR_TYPE_CD)     \r\n"
+           " VALUES (M.INCD_OCRR_ID, M.STRT_LCTN_NM, M.END_LCTN_NM,        \r\n"
+           "         M.OCRR_LCTN_NM, M.CMTR_GRAD_CD, M.INCD_CLSR_LANE,     \r\n"
+           "         M.VMS_DSPL_YN,  M.INCD_PRGR_STEP_CD, M.INCD_STRT_DT,  \r\n"
+           "         M.INCD_END_PRAR_DT, M.LINK_ID, M.VMS_INCD_TYPE_CD,    \r\n"
+           "         M.VMS_INCD_DETL_TYPE_CD, M.VMS_INCD_RSTR_TYPE_CD)     \r\n";
+
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Parameters->ParamByName("p01")->Value = AINCD_OCRR_ID;
+            pADO->Parameters->ParamByName("p02")->Value = ASTRT_LCTN_NM;
+            pADO->Parameters->ParamByName("p03")->Value = AEND_LCTN_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AOCRR_LCTN_NM;
+            pADO->Parameters->ParamByName("p05")->Value = ACMTR_GRAD_CD;
+            pADO->Parameters->ParamByName("p06")->Value = AINCD_CLSR_LANE;
+            pADO->Parameters->ParamByName("p07")->Value = AVMS_DSPL_YN;
+            pADO->Parameters->ParamByName("p08")->Value = AINCD_PRGR_STEP_CD;
+            pADO->Parameters->ParamByName("p09")->Value = AINCD_STRT_DT;
+            pADO->Parameters->ParamByName("p10")->Value = AINCD_END_PRAR_DT;
+            pADO->Parameters->ParamByName("p11")->Value = ALINK_ID;
+            pADO->Parameters->ParamByName("p12")->Value = AVMS_INCD_TYPE_CD;
+            pADO->Parameters->ParamByName("p13")->Value = AVMS_INCD_DETL_TYPE_CD;
+            pADO->Parameters->ParamByName("p14")->Value = AVMS_INCD_RSTR_TYPE_CD;
+
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::MergeVmsIncidentInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::MergeVmsIncidentInfo", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TItsIncidentManager::UpdateVmsIncidentInfo(String AINCD_OCRR_ID, String AINCD_PRGR_STEP_CD, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_INCD_OCRR_VMS          \r\n"
+           "   SET INCD_PRGR_STEP_CD = :p02  \r\n"
+           " WHERE INCD_OCRR_ID      = :p01  \r\n";
+
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Parameters->ParamByName("p01")->Value = AINCD_OCRR_ID;
+            pADO->Parameters->ParamByName("p02")->Value = AINCD_PRGR_STEP_CD;
+
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::UpdateVmsIncidentInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::UpdateVmsIncidentInfo", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TItsIncidentManager::GetNextIncidentId(String ACenterId, String &AIncidentId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT SQ_INCD_ID.NEXTVAL AS NEWID FROM DUAL \r\n";
+#else
+    sQry = "SELECT LPAD(NVL(MAX(SUBSTR(INCD_OCRR_ID, -9)), '000000000') + 1, 9, '0') AS NEWID \r\n"
+           "  FROM TB_INCD_OCRR                                                               \r\n"
+           " WHERE SUBSTR(INCD_OCRR_ID, 1, 3) = :p01                                          \r\n";
+#endif
+    AIncidentId = "";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+#if 0
+			pADO->Open();
+            AIncidentId = pADO->FieldByName("NEWID")->AsString;
+#else
+            pADO->Parameters->ParamByName("p01")->Value = ACenterId;
+			pADO->Open();
+            AIncidentId = ACenterId + pADO->FieldByName("NEWID")->AsString;
+#endif
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::GetNextIncidentId", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIncidentManager::GetNextIncidentId", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+

+ 359 - 0
COMMON/CDS/CDSIncidentF.h

@@ -0,0 +1,359 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSIncidentFH
+#define CDSIncidentFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  Incident class
+*/
+class TItsAutoIncident
+{
+public :
+    TItsAutoIncident(){}
+    virtual ~TItsAutoIncident(){}
+
+public :
+    String LINK_ID;         //NUMBER(10)	N			링크ID
+    String DETC_DT;         //VARCHAR2(14)	N			검지 일시
+    String CLCT_SPED_AVRG;  //NUMBER(3)	Y	0		수집 속도 평균
+    String ESTM_SPED_AVRG;  //NUMBER(3)	Y	0		예상 속도 평균
+    String REAL_YN;         //CHAR(1)	Y	'N'		사실 여부
+    String X_CRDN;
+    String Y_CRDN;
+    String ROAD_NAME;
+    String STNAME;
+    String EDNAME;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Vms Incident class
+*/
+class TItsVmsIncident
+{
+public:
+	TItsVmsIncident(){}
+	virtual ~TItsVmsIncident(){}
+
+public:
+        String INCD_OCRR_ID;            //돌발상황 발생 ID
+        String STRT_LCTN_NM;            //시작 위치 명
+        String END_LCTN_NM;             //종료 위치 명
+        String OCRR_LCTN_NM;            //발생 위치 명
+        String CMTR_GRAD_CD;            //소통 등급 코드
+        String INCD_CLSR_LANE;          //돌발상황 차단 차로
+        String VMS_DSPL_YN;             //VMS 표출 여부
+        String INCD_PRGR_STEP_CD;       //돌발상황 진행 단계 코드
+        String INCD_STRT_DT;            //돌발상황 시작 일시
+        String INCD_END_PRAR_DT;        //돌발상황 종료 예정 일시
+        String LINK_ID;                 //링크ID
+        String VMS_INCD_TYPE_CD;        //VMS 돌발유형코드
+        String VMS_INCD_DETL_TYPE_CD;   //VMS 돌발세부유형코드
+
+        String VMS_INCD_RSTR_TYPE_CD;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Incident class
+*/
+class TItsIncident
+{
+public:
+    TItsIncident();
+    virtual ~TItsIncident();
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String FINCD_OCRR_ID;          //돌발상황 발생 ID
+    String FRGST_DT;               //등록 일시
+    String FINCD_ORGN_CD;          //돌발상황 원본 코드 : IST
+    String FOCRR_LCTN_NM;          //발생 위치 명
+    String FX_CRDN;                //X 좌표
+    String FY_CRDN;                //Y 좌표
+    String FINCD_EXPL;             //돌발상황 설명
+    String FCMTR_GRAD_CD;          //소통 등급 코드 : LTCU
+    String FIFMR_NM;               //제보자 명
+    String FINCD_CNFM_MTHD_CD;     //돌발상황 확인 방법 코드 : ICM
+    String FINCD_CNFM_DT;          //돌발상황 확인 일시
+    String FINCD_STRT_DT;          //돌발상황 시작 일시
+    String FINCD_END_PRAR_DT;      //돌발상황 종료 예정 일시
+    String FINCD_TYPE_CLSF_CD;     //돌발상황 유형 분류 코드 : IDTU
+    String FINCD_TYPE_CD;          //돌발상황 유형 코드 : ACTU, CRTU, EVTU, WETU 중 하나
+    String FINCD_TITL;             //돌발상황 제목
+    String FINCD_SERN_CD;          //돌발상황 심각도 코드 : SRLU
+    String FDELY_LNGT;             //지체 길이
+    String FINCD_LNGT;             //돌발상황 길이
+    String FINCD_OCRR_LANE;        //돌발상황 발생 차로
+    String FINCD_CLSR_LANE;        //돌발상황 차단 차로
+    String FTRVL_LMNT_TYPE_CD;     //통행 제한 유형 코드 : PRTU
+    String FTRUB_VHCL_YN;          //고장 차량 여부
+    String FFALT_YN;               //낙하물 여부
+    String FFRWT_YN;               //화재위험물 여부
+    String FUTIS_CNCT_YN;          //UTIS 연계 여부
+    String FSMLT_VHCL_UNUM;        //소형 차량 대수
+    String FMDLT_VHCL_UNUM;        //중대형 차량 대수
+    String FINJR_PNUM;             //부상자 인원수
+    String FFTLT_PNUM;             //사망자 인원수
+    String FWTHR_CD;               //기상 코드 : DFW
+    String FRESP_LVL_CD;           //대응 수준 코드 : RSL
+    String FVMS_DSPL_YN;           //VMS 표출 여부
+    String FINCD_PRGR_STEP_CD;     //돌발상황 진행 단계 코드 : ISS
+    String FINCD_END_CNFM_MTHD_CD; //돌발상황 종료 확인 방법 코드 : ICM
+    String FINCD_END_DT;           //돌발상황 종료 일시
+    String FMBLZ_EQPM_CONT;        //출동 장비 내용
+    String FMBLZ_PNUM;             //출동 인원수
+    String FRECR_CONT;             //복구 내용
+    String FRECR_PERD;             //복구 기간
+    String FLINK_ID;               //돌발발생 LINK ID
+
+    String DISP_INCD;              //현재 돌발 진행 여부
+
+    void    *FMarker;
+
+    void SetValue(String &AOrgValue, String AValue);
+
+//돌발상황 원본 코드            : IST
+//소통등급 코드                 : LTCU
+//돌발상황 확인 방법 코드       : ICM
+//돌발상황 유형 분류 코드       : IDTU
+//돌발상황 유형 코드            : ACTU, CRTU, EVTU, WETU 중 하나
+//돌발상황 심각도 코드          : SRLU
+//통행 제한 유형 코드           : PRTU
+//대응 수준 코드                : RSL
+//돌발상황 진행 단계 코드       : ISS
+//돌발상황 종료 확인 방법 코드  : ICM
+#if 0
+  INCD_OCRR_ID          VARCHAR2(12) NOT NULL,
+  RGST_DT               VARCHAR2(14),
+  INCD_ORGN_CD          VARCHAR2(7),
+  OCRR_LCTN_NM          VARCHAR2(100),
+  X_CRDN                NUMBER(11,8),
+  Y_CRDN                NUMBER(10,8),
+  INCD_EXPL             VARCHAR2(600),
+  CMTR_GRAD_CD          VARCHAR2(7),
+  IFMR_NM               VARCHAR2(20),
+  INCD_CNFM_MTHD_CD     VARCHAR2(7),
+  INCD_CNFM_DT          VARCHAR2(14),
+  INCD_STRT_DT          VARCHAR2(14),
+  INCD_END_PRAR_DT      VARCHAR2(14),
+  INCD_TYPE_CLSF_CD     VARCHAR2(7),
+  INCD_TYPE_CD          VARCHAR2(7),
+  INCD_TITL             VARCHAR2(400),
+  INCD_SERN_CD          VARCHAR2(7),
+  DELY_LNGT             NUMBER(5),
+  INCD_LNGT             NUMBER(5),
+  INCD_OCRR_LANE        VARCHAR2(6),
+  INCD_CLSR_LANE        VARCHAR2(6),
+  TRVL_LMNT_TYPE_CD     VARCHAR2(7),
+  TRUB_VHCL_YN          CHAR(1) DEFAULT 'N',
+  FALT_YN               CHAR(1) DEFAULT 'N',
+  FRWT_YN               CHAR(1) DEFAULT 'N',
+  UTIS_CNCT_YN          CHAR(1) DEFAULT 'N',
+  SMLT_VHCL_UNUM        NUMBER(5),
+  MDLT_VHCL_UNUM        NUMBER(5),
+  INJR_PNUM             NUMBER(4) DEFAULT 0,
+  FTLT_PNUM             NUMBER(4) DEFAULT 0,
+  WTHR_CD               VARCHAR2(7),
+  RESP_LVL_CD           VARCHAR2(7),
+  VMS_DSPL_YN           CHAR(1) DEFAULT 'N',
+  INCD_PRGR_STEP_CD     VARCHAR2(7),
+  INCD_END_CNFM_MTHD_CD VARCHAR2(7),
+  INCD_END_DT           VARCHAR2(14),
+  MBLZ_EQPM_CONT        VARCHAR2(400),
+  MBLZ_PNUM             NUMBER(5),
+  RECR_CONT             VARCHAR2(400),
+  RECR_PERD             NUMBER(5),
+  LINK_ID               NUMBER(10)
+
+comment on table TB_INCD_OCRR  is '돌발상황 발생';
+comment on column TB_INCD_OCRR.incd_ocrr_id  is '돌발상황 발생 ID';
+comment on column TB_INCD_OCRR.rgst_dt  is '등록 일시';
+comment on column TB_INCD_OCRR.incd_orgn_cd  is '돌발상황 원본 코드';
+comment on column TB_INCD_OCRR.ocrr_lctn_nm  is '발생 위치 명';
+comment on column TB_INCD_OCRR.x_crdn  is 'X 좌표';
+comment on column TB_INCD_OCRR.y_crdn  is 'Y 좌표';
+comment on column TB_INCD_OCRR.incd_expl  is '돌발상황 설명';
+comment on column TB_INCD_OCRR.cmtr_grad_cd  is '소통 등급 코드';
+comment on column TB_INCD_OCRR.ifmr_nm  is '제보자 명';
+comment on column TB_INCD_OCRR.incd_cnfm_mthd_cd  is '돌발상황 확인 방법 코드';
+comment on column TB_INCD_OCRR.incd_cnfm_dt  is '돌발상황 확인 일시';
+comment on column TB_INCD_OCRR.incd_strt_dt  is '돌발상황 시작 일시';
+comment on column TB_INCD_OCRR.incd_end_prar_dt  is '돌발상황 종료 예정 일시';
+comment on column TB_INCD_OCRR.incd_type_clsf_cd  is '돌발상황 유형 분류 코드';
+comment on column TB_INCD_OCRR.incd_type_cd  is '돌발상황 유형 코드';
+comment on column TB_INCD_OCRR.incd_titl  is '돌발상황 제목';
+comment on column TB_INCD_OCRR.incd_sern_cd  is '돌발상황 심각도 코드';
+comment on column TB_INCD_OCRR.dely_lngt  is '지체 길이';
+comment on column TB_INCD_OCRR.incd_lngt  is '돌발상황 길이';
+comment on column TB_INCD_OCRR.incd_ocrr_lane  is '돌발상황 발생 차로';
+comment on column TB_INCD_OCRR.incd_clsr_lane  is '돌발상황 차단 차로';
+comment on column TB_INCD_OCRR.trvl_lmnt_type_cd  is '통행 제한 유형 코드';
+comment on column TB_INCD_OCRR.trub_vhcl_yn  is '고장 차량 여부';
+comment on column TB_INCD_OCRR.falt_yn  is '낙하물 여부';
+comment on column TB_INCD_OCRR.frwt_yn  is '화재위험물 여부';
+comment on column TB_INCD_OCRR.utis_cnct_yn  is 'UTIS 연계 여부';
+comment on column TB_INCD_OCRR.smlt_vhcl_unum  is '소형 차량 대수';
+comment on column TB_INCD_OCRR.mdlt_vhcl_unum  is '중대형 차량 대수';
+comment on column TB_INCD_OCRR.injr_pnum  is '부상자 인원수';
+comment on column TB_INCD_OCRR.ftlt_pnum  is '사망자 인원수';
+comment on column TB_INCD_OCRR.wthr_cd  is '기상 코드';
+comment on column TB_INCD_OCRR.resp_lvl_cd  is '대응 수준 코드';
+comment on column TB_INCD_OCRR.vms_dspl_yn  is 'VMS 표출 여부';
+comment on column TB_INCD_OCRR.incd_prgr_step_cd  is '돌발상황 진행 단계 코드';
+comment on column TB_INCD_OCRR.incd_end_cnfm_mthd_cd  is '돌발상황 종료 확인 방법 코드';
+comment on column TB_INCD_OCRR.incd_end_dt  is '돌발상황 종료 일시';
+comment on column TB_INCD_OCRR.mblz_eqpm_cont  is '출동 장비 내용';
+comment on column TB_INCD_OCRR.mblz_pnum  is '출동 인원수';
+comment on column TB_INCD_OCRR.recr_cont  is '복구 내용';
+comment on column TB_INCD_OCRR.recr_perd  is '복구 기간';
+comment on column TB_INCD_OCRR.link_id  is '링크ID';
+#endif
+
+protected:
+    void SetFINCD_OCRR_ID(String AValue);          //돌발상황 발생 ID
+    void SetFRGST_DT(String AValue);               //등록 일시
+    void SetFINCD_ORGN_CD(String AValue);          //돌발상황 원본 코드 : IST
+    void SetFOCRR_LCTN_NM(String AValue);          //발생 위치 명
+    void SetFX_CRDN(String AValue);                //X 좌표
+    void SetFY_CRDN(String AValue);                //Y 좌표
+    void SetFINCD_EXPL(String AValue);             //돌발상황 설명
+    void SetFCMTR_GRAD_CD(String AValue);          //소통 등급 코드 : LTCU
+    void SetFIFMR_NM(String AValue);               //제보자 명
+    void SetFINCD_CNFM_MTHD_CD(String AValue);     //돌발상황 확인 방법 코드 : ICM
+    void SetFINCD_CNFM_DT(String AValue);          //돌발상황 확인 일시
+    void SetFINCD_STRT_DT(String AValue);          //돌발상황 시작 일시
+    void SetFINCD_END_PRAR_DT(String AValue);      //돌발상황 종료 예정 일시
+    void SetFINCD_TYPE_CLSF_CD(String AValue);     //돌발상황 유형 분류 코드 : IDTU
+    void SetFINCD_TYPE_CD(String AValue);          //돌발상황 유형 코드 : ACTU, CRTU, EVTU, WETU 중 하나
+    void SetFINCD_TITL(String AValue);             //돌발상황 제목
+    void SetFINCD_SERN_CD(String AValue);          //돌발상황 심각도 코드 : SRLU
+    void SetFDELY_LNGT(String AValue);             //지체 길이
+    void SetFINCD_LNGT(String AValue);             //돌발상황 길이
+    void SetFINCD_OCRR_LANE(String AValue);        //돌발상황 발생 차로
+    void SetFINCD_CLSR_LANE(String AValue);        //돌발상황 차단 차로
+    void SetFTRVL_LMNT_TYPE_CD(String AValue);     //통행 제한 유형 코드 : PRTU
+    void SetFTRUB_VHCL_YN(String AValue);          //고장 차량 여부
+    void SetFFALT_YN(String AValue);               //낙하물 여부
+    void SetFFRWT_YN(String AValue);               //화재위험물 여부
+    void SetFUTIS_CNCT_YN(String AValue);          //UTIS 연계 여부
+    void SetFSMLT_VHCL_UNUM(String AValue);        //소형 차량 대수
+    void SetFMDLT_VHCL_UNUM(String AValue);        //중대형 차량 대수
+    void SetFINJR_PNUM(String AValue);             //부상자 인원수
+    void SetFFTLT_PNUM(String AValue);             //사망자 인원수
+    void SetFWTHR_CD(String AValue);               //기상 코드 : DFW
+    void SetFRESP_LVL_CD(String AValue);           //대응 수준 코드 : RSL
+    void SetFVMS_DSPL_YN(String AValue);           //VMS 표출 여부
+    void SetFINCD_PRGR_STEP_CD(String AValue);     //돌발상황 진행 단계 코드 : ISS
+    void SetFINCD_END_CNFM_MTHD_CD(String AValue); //돌발상황 종료 확인 방법 코드 : ICM
+    void SetFINCD_END_DT(String AValue);           //돌발상황 종료 일시
+    void SetFMBLZ_EQPM_CONT(String AValue);        //출동 장비 내용
+    void SetFMBLZ_PNUM(String AValue);             //출동 인원수
+    void SetFRECR_CONT(String AValue);             //복구 내용
+    void SetFRECR_PERD(String AValue);             //복구 기간
+    void SetFLINK_ID(String AValue);               //돌발발생 LINK ID
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    __property String INCD_OCRR_ID             = {read=FINCD_OCRR_ID             , write=SetFINCD_OCRR_ID             };
+    __property String RGST_DT                  = {read=FRGST_DT                  , write=SetFRGST_DT                  };
+    __property String INCD_ORGN_CD             = {read=FINCD_ORGN_CD             , write=SetFINCD_ORGN_CD             };
+    __property String OCRR_LCTN_NM             = {read=FOCRR_LCTN_NM             , write=SetFOCRR_LCTN_NM             };
+    __property String X_CRDN                   = {read=FX_CRDN                   , write=SetFX_CRDN                   };
+    __property String Y_CRDN                   = {read=FY_CRDN                   , write=SetFY_CRDN                   };
+    __property String INCD_EXPL                = {read=FINCD_EXPL                , write=SetFINCD_EXPL                };
+    __property String CMTR_GRAD_CD             = {read=FCMTR_GRAD_CD             , write=SetFCMTR_GRAD_CD             };
+    __property String IFMR_NM                  = {read=FIFMR_NM                  , write=SetFIFMR_NM                  };
+    __property String INCD_CNFM_MTHD_CD        = {read=FINCD_CNFM_MTHD_CD        , write=SetFINCD_CNFM_MTHD_CD        };
+    __property String INCD_CNFM_DT             = {read=FINCD_CNFM_DT             , write=SetFINCD_CNFM_DT             };
+    __property String INCD_STRT_DT             = {read=FINCD_STRT_DT             , write=SetFINCD_STRT_DT             };
+    __property String INCD_END_PRAR_DT         = {read=FINCD_END_PRAR_DT         , write=SetFINCD_END_PRAR_DT         };
+    __property String INCD_TYPE_CLSF_CD        = {read=FINCD_TYPE_CLSF_CD        , write=SetFINCD_TYPE_CLSF_CD        };
+    __property String INCD_TYPE_CD             = {read=FINCD_TYPE_CD             , write=SetFINCD_TYPE_CD             };
+    __property String INCD_TITL                = {read=FINCD_TITL                , write=SetFINCD_TITL                };
+    __property String INCD_SERN_CD             = {read=FINCD_SERN_CD             , write=SetFINCD_SERN_CD             };
+    __property String DELY_LNGT                = {read=FDELY_LNGT                , write=SetFDELY_LNGT                };
+    __property String INCD_LNGT                = {read=FINCD_LNGT                , write=SetFINCD_LNGT                };
+    __property String INCD_OCRR_LANE           = {read=FINCD_OCRR_LANE           , write=SetFINCD_OCRR_LANE           };
+    __property String INCD_CLSR_LANE           = {read=FINCD_CLSR_LANE           , write=SetFINCD_CLSR_LANE           };
+    __property String TRVL_LMNT_TYPE_CD        = {read=FTRVL_LMNT_TYPE_CD        , write=SetFTRVL_LMNT_TYPE_CD        };
+    __property String TRUB_VHCL_YN             = {read=FTRUB_VHCL_YN             , write=SetFTRUB_VHCL_YN             };
+    __property String FALT_YN                  = {read=FFALT_YN                  , write=SetFFALT_YN                  };
+    __property String FRWT_YN                  = {read=FFRWT_YN                  , write=SetFFRWT_YN                  };
+    __property String UTIS_CNCT_YN             = {read=FUTIS_CNCT_YN             , write=SetFUTIS_CNCT_YN             };
+    __property String SMLT_VHCL_UNUM           = {read=FSMLT_VHCL_UNUM           , write=SetFSMLT_VHCL_UNUM           };
+    __property String MDLT_VHCL_UNUM           = {read=FMDLT_VHCL_UNUM           , write=SetFMDLT_VHCL_UNUM           };
+    __property String INJR_PNUM                = {read=FINJR_PNUM                , write=SetFINJR_PNUM                };
+    __property String FTLT_PNUM                = {read=FFTLT_PNUM                , write=SetFFTLT_PNUM                };
+    __property String WTHR_CD                  = {read=FWTHR_CD                  , write=SetFWTHR_CD                  };
+    __property String RESP_LVL_CD              = {read=FRESP_LVL_CD              , write=SetFRESP_LVL_CD              };
+    __property String VMS_DSPL_YN              = {read=FVMS_DSPL_YN              , write=SetFVMS_DSPL_YN              };
+    __property String INCD_PRGR_STEP_CD        = {read=FINCD_PRGR_STEP_CD        , write=SetFINCD_PRGR_STEP_CD        };
+    __property String INCD_END_CNFM_MTHD_CD    = {read=FINCD_END_CNFM_MTHD_CD    , write=SetFINCD_END_CNFM_MTHD_CD    };
+    __property String INCD_END_DT              = {read=FINCD_END_DT              , write=SetFINCD_END_DT              };
+    __property String MBLZ_EQPM_CONT           = {read=FMBLZ_EQPM_CONT           , write=SetFMBLZ_EQPM_CONT           };
+    __property String MBLZ_PNUM                = {read=FMBLZ_PNUM                , write=SetFMBLZ_PNUM                };
+    __property String RECR_CONT                = {read=FRECR_CONT                , write=SetFRECR_CONT                };
+    __property String RECR_PERD                = {read=FRECR_PERD                , write=SetFRECR_PERD                };
+    __property String LINK_ID                  = {read=FLINK_ID                  , write=SetFLINK_ID                  };
+};
+//---------------------------------------------------------------------------
+
+/*
+* Incident Manager
+*/
+class TItsIncidentManager
+{
+public:
+    TItsIncidentManager();
+    virtual ~TItsIncidentManager();
+
+public:
+    ListMap<TItsVmsIncident>    FVmsLists;
+    ListMap<TItsAutoIncident>   FAutoLists;
+    ListMap<TItsIncident>       FLists;
+    int                         FAutoIncident;
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+	bool LoadFromAutoIncident(TADOConnection *ADbConn=NULL);
+	bool LoadFromVmsIncident(TADOConnection *ADbConn=NULL);
+    bool UpdateIncidentInfo(TItsIncident *AObj, TADOConnection *ADbConn=NULL);
+    bool DeleteIncidentLoc(String AIncidId, TADOConnection *ADbConn=NULL);
+    bool UpdateIncidentLoc(TItsIncident *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeVmsIncidentInfo(String AINCD_OCRR_ID,           // '돌발상황 발생 ID
+                              String ASTRT_LCTN_NM,           // '시작 위치 명
+                              String AEND_LCTN_NM,            // '종료 위치 명
+                              String AOCRR_LCTN_NM,           // '발생 위치 명
+                              String ACMTR_GRAD_CD,           // '소통 등급 코드
+                              String AINCD_CLSR_LANE,         // '돌발상황 차단 차로
+                              String AVMS_DSPL_YN,            // 'VMS 표출 여부
+                              String AINCD_PRGR_STEP_CD,      // '돌발상황 진행 단계 코드
+                              String AINCD_STRT_DT,           // '돌발상황 시작 일시
+                              String AINCD_END_PRAR_DT,       // '돌발상황 종료 예정 일시
+                              String ALINK_ID,                // '링크ID
+                              String AVMS_INCD_TYPE_CD,       // 'VMS 돌발유형코드
+                              String AVMS_INCD_DETL_TYPE_CD,  // 'VMS 돌발세부유형코드
+                              String AVMS_INCD_RSTR_TYPE_CD,  // 'VMS 돌발통제코드
+                              TADOConnection *ADbConn=NULL);
+    bool UpdateVmsIncidentInfo(String AINCD_OCRR_ID, String AINCD_PRGR_STEP_CD, TADOConnection *ADbConn=NULL);
+    bool GetNextIncidentId(String ACenterId, String &AIncidentId, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsIncidentManager *ItsIncidentManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 396 - 0
COMMON/CDS/CDSLinkF.cpp

@@ -0,0 +1,396 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSLinkF.h"
+#include "CDSTrafficF.h"
+#include "ITSUtilF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsLink::TItsLink()
+{
+    FPolyLine = NULL;
+    IFSC_ID = "";
+    ROAD_ID = "";
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsLink::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsLink::~TItsLink()
+{
+}
+//---------------------------------------------------------------------------
+void TItsLink::InitTraffic()
+{
+    TRAF->InitTraffic();
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsLinkManager *ItsLinkManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Link Manager
+*/
+TItsLinkManager::TItsLinkManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsLinkManager::~TItsLinkManager()
+{
+}
+//---------------------------------------------------------------------------
+void TItsLinkManager::InitTraffic()
+{
+    try
+    {
+        FLists.Lock();
+
+        FOR_STL(TItsLink*, pObj, FLists)
+        {
+            pObj->InitTraffic();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+}
+//---------------------------------------------------------------------------
+bool TItsLinkManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT LINK_ID, F_NODE, T_NODE, ROAD_USE, LANES,                                    \r\n"
+           "       ROAD_RANK, TRIM(ROAD_TYPE) AS ROAD_TYPE, ROAD_NO, TRIM(ROAD_NAME) ROAD_NAME, \r\n"
+           "       MULTI_LINK, TRIM(LINK_CONNECT) AS LINK_CONNECT, MAX_SPD,                     \r\n"
+           "       TRIM(REST_VEH) AS REST_VEH, REST_W, REST_H, LINK_LENG, RMRK,                 \r\n"
+           "       DEL_YN, DFLT_SPED, DFLT_SPED_USE_YN,                                         \r\n"
+           "       SECT_GRAD_CD, AREA_CD,                                                       \r\n"
+           "       DECODE(AREA_CD, 'LAT001', 'Y', 'N') REGN_YN, PARA_ID                         \r\n"
+           "  FROM TB_LINK                                                                      \r\n";
+//           " ORDER BY LINK_ID                                                                   \r\n";
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsLink *pLink = new TItsLink();
+
+                pLink->LINK_ID          = pADO->FieldByName("LINK_ID")->AsString;          //'링크ID';;
+                pLink->F_NODEID         = pADO->FieldByName("F_NODE")->AsString;           //'시작노드ID';;
+                pLink->T_NODEID         = pADO->FieldByName("T_NODE")->AsString;           //'종료노드ID';;
+                pLink->ROAD_USE         = pADO->FieldByName("ROAD_USE")->AsString;         //'도로사용여부';;
+                pLink->LANES            = pADO->FieldByName("LANES")->AsString;            //'차로수';;
+                pLink->ROAD_RANK        = pADO->FieldByName("ROAD_RANK")->AsString;        //'도로등급';;
+                pLink->ROAD_TYPE        = pADO->FieldByName("ROAD_TYPE")->AsString;        //'도로유형';;
+                pLink->ROAD_NO          = pADO->FieldByName("ROAD_NO")->AsString;          //'도로번호';;
+                pLink->ROAD_NAME        = pADO->FieldByName("ROAD_NAME")->AsString.Trim();        //'도로명';;
+                pLink->MULTI_LINK       = pADO->FieldByName("MULTI_LINK")->AsString;       //'중용구간여부';;
+                pLink->LINK_CONNECT     = pADO->FieldByName("LINK_CONNECT")->AsString;     //'연결로코드';;
+                pLink->MAX_SPD          = pADO->FieldByName("MAX_SPD")->AsString;          //'최고제한속도';;
+                pLink->REST_VEH         = pADO->FieldByName("REST_VEH")->AsString;         //'통행제한차량';;
+                pLink->REST_W           = pADO->FieldByName("REST_W")->AsString;           //'통과제한하중';;
+                pLink->REST_H           = pADO->FieldByName("REST_H")->AsString;           //'통과제한높이';;
+                pLink->LINK_LENG        = pADO->FieldByName("LINK_LENG")->AsString;        //'연장';;
+                pLink->RMRK             = pADO->FieldByName("RMRK")->AsString.Trim();             //'비고';;
+                pLink->DEL_YN           = pADO->FieldByName("DEL_YN")->AsString;           //'삭제 여부';;
+                pLink->DFLT_SPED        = pADO->FieldByName("DFLT_SPED")->AsString;        //'디폴트 속도';;
+                pLink->DFLT_SPED_USE_YN = pADO->FieldByName("DFLT_SPED_USE_YN")->AsString; //'디폴트 속도 사용 여부';;
+                pLink->SECT_GRAD_CD     = pADO->FieldByName("SECT_GRAD_CD")->AsString;     //'구간 등급 코드';;
+                pLink->AREA_CD          = pADO->FieldByName("AREA_CD")->AsString;          //'지역 코드';;
+                pLink->REGN_YN          = pADO->FieldByName("REGN_YN")->AsString;          //'로컬지역여부';
+                pLink->PARA_ID          = pADO->FieldByName("PARA_ID")->AsString;          //'파라미터ID
+
+				FLists.Push(pLink->LINK_ID, pLink);
+                pLink->Completed = true;
+
+                pLink->TRAF = new TItsTraffic(1, pLink->LINK_ID, (void*)pLink);
+                ItsTrafficManager->FLists.Push(pLink->LINK_ID, pLink->TRAF);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsLinkManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsLinkManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return LoadCoordFromDb(ADbConn);
+}
+//---------------------------------------------------------------------------
+bool TItsLinkManager::LoadCoordFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT LINK_ID, LEVL, ORD, X_CRDN, Y_CRDN  \r\n"
+           "  FROM TB_LINK_VRTX                        \r\n"
+           " WHERE LEVL = 1                            \r\n"
+           " ORDER BY LINK_ID, LEVL, ORD               \r\n";
+#else
+    sQry = "SELECT A.*                     \r\n"
+           "  FROM TB_LINK_GIS A,          \r\n"
+           "       TB_LINK     B           \r\n"
+           " WHERE A.LINK_ID = B.LINK_ID   \r\n";
+#endif
+
+    TItsLink* pObj;
+    TStringList *sl = NULL;
+    int ii;
+    sl = new TStringList;
+    sl->Delimiter = ',';
+    sl->StrictDelimiter = true;
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String LINK_ID = pADO->FieldByName("LINK_ID")->AsString;
+                pObj = FLists.Find(LINK_ID);
+                if (!pObj) continue;
+
+                int    FPointCnt = pADO->FieldByName("POINTCNT")->AsInteger;
+                String FVertex   = pADO->FieldByName("VERTEX")->AsString;
+
+                sl->DelimitedText = FVertex;
+                if (sl->Count != FPointCnt * 2)
+                {
+                    continue;
+                }
+                for (ii = 0; ii < sl->Count-1; )
+                {
+                    TItsCoord *pCoord = new TItsCoord();
+                    pCoord->X = sl->Strings[ii].ToDouble();
+                    pCoord->Y = sl->Strings[ii+1].ToDouble();
+                    pObj->Coords.Push(pObj->Coords.Size(), pCoord);
+
+                    if (pCoord->X < pObj->bounds.minX) pObj->bounds.minX = pCoord->X;
+                    if (pCoord->Y < pObj->bounds.minY) pObj->bounds.minY = pCoord->Y;
+                    if (pCoord->X > pObj->bounds.maxX) pObj->bounds.maxX = pCoord->X;
+                    if (pCoord->Y > pObj->bounds.maxY) pObj->bounds.maxY = pCoord->Y;
+
+                    ii += 2;
+                }
+                continue;
+
+				TItsCoord *pCoord = new TItsCoord();
+
+                pCoord->X = pADO->FieldByName("X_CRDN")->AsFloat;
+                pCoord->Y = pADO->FieldByName("Y_CRDN")->AsFloat;
+
+				pObj->Coords.Push(pObj->Coords.Size(), pCoord);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsLinkManager::LoadCoordFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsLinkManager::LoadCoordFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+        if (sl) delete sl;
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsLinkManager::LoadRegionVertexFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT * FROM TB_REGION_VRTX WHERE CENTERID = 'L01'";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String CENTERID = pADO->FieldByName("CENTERID")->AsString;
+
+                FRegionPointCnt = pADO->FieldByName("POINTCNT")->AsInteger;
+                FRegionVertex   = pADO->FieldByName("VERTEX")->AsString;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TItsLinkManager", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            DBERRORMSG("TItsLinkManager", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsLinkManager::LoadTraffic(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    InitTraffic();
+
+    sQry = "SELECT A.LINK_ID, PRCN_DT, TFVL, SPED, OCPY_RATE, TRVL_HH, CMTR_GRAD_CD, MISS_YN,   \r\n"
+           "        PRCN_SPED, SMTH_SPED, ADJS_SPED, PTRN_SPED, PRCN_SORC, ADJS_SORC, DATA_NUM, \r\n"
+           "        (CASE WHEN PRCN_DT <= TO_CHAR(SYSDATE - 10/1440, 'YYYYMMDDHH24MISS')        \r\n"
+           "              THEN 'Y' ELSE 'N' END) AS MISSING,                                    \r\n"
+           "        (CASE WHEN PRCN_DT >= TO_CHAR(SYSDATE - 15/1440, 'YYYYMMDDHH24MISS')        \r\n"
+           "              THEN 'Y' ELSE 'N' END) AS LASTANS,                                    \r\n"
+           "        (SELECT MAX(PRCN_DT) FROM TB_LINK_TRAF) MPRCN_DT                            \r\n"
+           "   FROM TB_LINK_TRAF A, TB_LINK B                                                   \r\n"
+           "  WHERE A.LINK_ID = B.LINK_ID                                                       \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String ID = pADO->FieldByName("LINK_ID")->AsString;
+                TItsLink *pObj = FLists.Find(ID);
+                if (!pObj) continue;
+
+                pObj->TRAF->PRCN_DT      = pADO->FieldByName("PRCN_DT")->AsString;
+                pObj->TRAF->TFVL         = pADO->FieldByName("TFVL")->AsInteger;
+                pObj->TRAF->SPED         = pADO->FieldByName("SPED")->AsInteger;
+                pObj->TRAF->OCPY_RATE    = pADO->FieldByName("OCPY_RATE")->AsFloat;
+                pObj->TRAF->TRVL_HH      = pADO->FieldByName("TRVL_HH")->AsInteger;
+                pObj->TRAF->CMTR_GRAD_CD = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+				pObj->TRAF->MISSING      = pADO->FieldByName("MISSING")->AsString;       // 결측여부
+				pObj->TRAF->LASTANS      = pADO->FieldByName("LASTANS")->AsString;       // 최근 15분 이내 가공
+				pObj->TRAF->MPRCN_DT     = pADO->FieldByName("MPRCN_DT")->AsString;      // 가공시각(최신)
+                pObj->TRAF->DATA_NUM     = pADO->FieldByName("DATA_NUM")->AsInteger;
+                pObj->TRAF->PTRN_SPED    = pADO->FieldByName("PTRN_SPED")->AsInteger;
+
+                if      (pObj->TRAF->CMTR_GRAD_CD == "LTC1") pObj->TRAF->TRAF_GRAD = 1;
+                else if (pObj->TRAF->CMTR_GRAD_CD == "LTC2") pObj->TRAF->TRAF_GRAD = 2;
+                else if (pObj->TRAF->CMTR_GRAD_CD == "LTC3") pObj->TRAF->TRAF_GRAD = 3;
+                else                                         pObj->TRAF->TRAF_GRAD = 0;
+
+				pObj->TRAF->MISS_YN      = pADO->FieldByName("MISS_YN")->AsString;       // '결측 여부';
+				pObj->TRAF->PRCN_SPED    = pADO->FieldByName("PRCN_SPED")->AsInteger;    // '가공 속도';
+				pObj->TRAF->SMTH_SPED    = pADO->FieldByName("SMTH_SPED")->AsInteger;    // '평활화 속도';
+				pObj->TRAF->ADJS_SPED    = pADO->FieldByName("ADJS_SPED")->AsInteger;    // '보정 속도';
+				pObj->TRAF->PRCN_SORC    = pADO->FieldByName("PRCN_SORC")->AsString;     // '가공 소스';
+				pObj->TRAF->ADJS_SORC    = pADO->FieldByName("ADJS_SORC")->AsString;     // '보정 소스';
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsLinkManager::LoadTraffic", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsLinkManager::LoadTraffic", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return bResult;
+}
+//---------------------------------------------------------------------------
+

+ 97 - 0
COMMON/CDS/CDSLinkF.h

@@ -0,0 +1,97 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSLinkFH
+#define CDSLinkFH
+//---------------------------------------------------------------------------
+
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+#include "CDSCoordF.h"
+#include "CDSTrafficF.h"
+#include "CDSBaseF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  LINK class
+*/
+class TItsLink : public TItsBaseId
+{
+public:
+    TItsLink();
+    virtual ~TItsLink();
+    void Clear();
+
+private:
+
+public:
+    String	F_NODEID;
+    String	T_NODEID;
+    String	ROAD_USE;
+    String	LANES;
+    String	ROAD_RANK;
+    String	ROAD_TYPE;
+    String	ROAD_NO;
+    String	ROAD_NAME;
+    String	MULTI_LINK;
+    String	LINK_CONNECT;
+    String	MAX_SPD;
+    String	REST_VEH;
+    String	REST_W;
+    String	REST_H;
+    String	LINK_LENG;
+    String	RMRK;
+    String	DEL_YN;
+    String	DFLT_SPED;
+    String	DFLT_SPED_USE_YN;
+    String	SECT_GRAD_CD;
+    String	AREA_CD;
+    String	REGN_YN;
+    String  PARA_ID;
+
+    String  IFSC_ID;
+    String  ROAD_ID;
+
+    TItsTraffic        *TRAF;
+    TItsBounds          bounds;
+    IntMap<TItsCoord>   Coords;
+    void               *FPolyLine;
+
+protected:
+
+public:
+    void InitTraffic();
+};
+//---------------------------------------------------------------------------
+
+/*
+* Link Manager
+*/
+class TItsLinkManager
+{
+public:
+    TItsLinkManager();
+    virtual ~TItsLinkManager();
+
+public:
+    int                 FRegionPointCnt;
+    String              FRegionVertex;
+
+    ListMap<TItsLink>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadCoordFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadRegionVertexFromDb(TADOConnection *ADbConn=NULL);
+
+    void InitTraffic();
+    bool LoadTraffic(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsLinkManager *ItsLinkManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 320 - 0
COMMON/CDS/CDSNodeF.cpp

@@ -0,0 +1,320 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSNodeF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsNode::TItsNode()
+{
+    TItsNode("");
+}
+//---------------------------------------------------------------------------
+TItsNode::TItsNode(String AId)
+{
+    FNODE_ID   = AId;
+    Clear();
+    FModified = false;
+    FCompleted= false;
+}
+//---------------------------------------------------------------------------
+void TItsNode::Clear()
+{
+#if 0
+    FNODE_TYPE = "";
+    FNODE_NAME = "";
+    FTURN_P    = "";
+    FRMRK      = "";
+    FX_CRDN    = "0";
+    FY_CRDN    = "0";
+#endif
+}
+//---------------------------------------------------------------------------
+TItsNode::~TItsNode()
+{
+}
+//---------------------------------------------------------------------------
+void TItsNode::SetValue(String &AOrgValue, String AValue)
+{
+    if (AOrgValue != AValue)
+    {
+        AOrgValue = AValue;
+        if (FCompleted) FModified = true;
+    }
+}
+//---------------------------------------------------------------------------
+void TItsNode::SetFNODE_ID(String AValue)
+{
+    SetValue(FNODE_ID, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsNode::SetFNODE_TYPE(String AValue)
+{
+    SetValue(FNODE_TYPE, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsNode::SetFNODE_NAME(String AValue)
+{
+    SetValue(FNODE_NAME, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsNode::SetFTURN_P(String AValue)
+{
+    SetValue(FTURN_P, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsNode::SetFRMRK(String AValue)
+{
+    SetValue(FRMRK, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsNode::SetFX_CRDN(String AValue)
+{
+    SetValue(FX_CRDN, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsNode::SetFY_CRDN(String AValue)
+{
+    SetValue(FY_CRDN, AValue);
+}
+//---------------------------------------------------------------------------
+
+
+TItsNodeList::TItsNodeList()
+{
+    FList = new TList();
+}
+//---------------------------------------------------------------------------
+TItsNodeList::~TItsNodeList()
+{
+    ReleaseAll();
+    delete FList;
+}
+//---------------------------------------------------------------------------
+void TItsNodeList::ReleaseAll()
+{
+    for(int ii = 0; ii < Count; ii++)
+        Release(ii);
+
+    FList->Clear();
+}
+//---------------------------------------------------------------------------
+void TItsNodeList::Release(int AIndex)
+{
+    if (AIndex >= 0 && AIndex < Count)
+        delete (TItsNode*)FList->Items[AIndex];
+}
+//---------------------------------------------------------------------------
+TItsNode *TItsNodeList::GetNode(int AIndex)
+{
+    if (AIndex >= 0 && AIndex < Count)
+        return (TItsNode*)FList->Items[AIndex];
+
+    return NULL;
+}
+//---------------------------------------------------------------------------
+int TItsNodeList::GetCount()
+{
+    return FList->Count;
+}
+//---------------------------------------------------------------------------
+void TItsNodeList::Clear()
+{
+    ReleaseAll();
+}
+//---------------------------------------------------------------------------
+int TItsNodeList::Add(TItsNode *AItsNode)
+{
+    int nRes;
+    nRes = FList->Add(AItsNode);
+    return nRes;
+}
+//---------------------------------------------------------------------------
+void TItsNodeList::Delete(int AIndex)
+{
+    if (AIndex >= 0 && AIndex < Count)
+    {
+        Release(AIndex);
+        FList->Delete(AIndex);
+    }
+}
+//---------------------------------------------------------------------------
+void TItsNodeList::Insert(int AIndex, TItsNode *AItsNode)
+{
+    if (AIndex >= 0 && AIndex < Count)
+        FList->Insert(AIndex, AItsNode);
+}
+//---------------------------------------------------------------------------
+
+TCDSNode::TCDSNode(TItsNodeList *AList) 
+{
+    FNodes = AList;
+}
+//---------------------------------------------------------------------------
+void *__fastcall TCDSNode::AppendRecord(void)
+{
+    TItsNode *ANode = new TItsNode();
+    TcxDataRecordHandle *Result = (TcxDataRecordHandle*)FNodes->Add(ANode);
+    DataChanged();
+    if (!Modified) FModified = true;
+    return Result;
+}
+//---------------------------------------------------------------------------
+void *__fastcall TCDSNode::InsertRecord(void * ARecordHandle)
+{
+    TItsNode *ANode = new TItsNode();
+    FNodes->Insert((int)ARecordHandle, ANode);
+    TcxDataRecordHandle *Result = (TcxDataRecordHandle*)ARecordHandle;
+    DataChanged();
+    if (!Modified) FModified = true;
+    return Result;
+}
+//---------------------------------------------------------------------------
+void __fastcall TCDSNode::DeleteRecord(void * ARecordHandle)
+{
+    FNodes->Delete((int)ARecordHandle);
+    DataChanged();
+    if (!Modified) FModified = true;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TCDSNode::GetRecordCount(void)
+{
+    return FNodes->Count;
+}
+//---------------------------------------------------------------------------
+
+Variant __fastcall TCDSNode::GetValue(void * ARecordHandle, void * AItemHandle)
+{
+    int AColumnId = GetDefaultItemID((int)AItemHandle);
+    TItsNode *ANode = FNodes->Node[(int)ARecordHandle];
+    Variant Result;
+#if 0
+    switch (AColumnId) 
+    {
+    case IndexOfID:
+      Result = ACustomer->ID; break;
+    case IndexOfName:
+      Result = ACustomer->Name; break;
+    case IndexOfDescription:
+      Result = ACustomer->Description; break;
+    }
+#else
+    Result = ANode->NODE_ID;
+#endif
+    return (Result);
+}
+//---------------------------------------------------------------------------
+void __fastcall TCDSNode::SetValue(void * ARecordHandle, void * AItemHandle, const Variant &AValue)
+{
+    int AColumnId = GetDefaultItemID((int)AItemHandle);
+    TItsNode *ANode = FNodes->Node[(int)ARecordHandle];
+#if 0
+    switch (AColumnId) 
+    {
+    case IndexOfID:
+        if (VarIsNull(AValue))
+            ACustomer->ID = 0;
+        else
+            ACustomer->ID = AValue; 
+        break;
+    case IndexOfName:
+        ACustomer->Name = VarToStr(AValue); 
+        break;
+    case IndexOfDescription:
+        ACustomer->Description = VarToStr(AValue); 
+        break;
+    }
+#else
+#endif
+    if (!Modified) FModified = true;
+}
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsNodeManager *ItsNodeManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Link Manager
+*/
+TItsNodeManager::TItsNodeManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsNodeManager::~TItsNodeManager()
+{
+}
+//---------------------------------------------------------------------------
+bool TItsNodeManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.NODE_ID, A.NODE_TYPE, A.NODE_NAME, \r\n"
+           "       A.TURN_P, A.RMRK, A.X_CRDN, A.Y_CRDN \r\n"
+           "  FROM TB_NODE A                            \r\n";
+//           " ORDER BY A.NODE_ID                         \r\n";
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsNode *pNode = new TItsNode();
+
+                pNode->FNODE_ID   = pADO->FieldByName("NODE_ID")->AsString;   //노드ID
+                pNode->FNODE_TYPE = pADO->FieldByName("NODE_TYPE")->AsString; //노드유형
+                pNode->FNODE_NAME = pADO->FieldByName("NODE_NAME")->AsString.Trim(); //교차로명칭
+                pNode->FTURN_P    = pADO->FieldByName("TURN_P")->AsString;    //회전제한유무
+                pNode->FRMRK      = pADO->FieldByName("RMRK")->AsString.Trim();      //비고
+                pNode->FX_CRDN    = pADO->FieldByName("X_CRDN")->AsString;    //X 좌표
+                pNode->FY_CRDN    = pADO->FieldByName("Y_CRDN")->AsString;    //Y 좌표
+
+				FLists.Push(pNode->NODE_ID, pNode);
+                pNode->Completed = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsNodeManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsNodeManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 145 - 0
COMMON/CDS/CDSNodeF.h

@@ -0,0 +1,145 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSNodeFH
+#define CDSNodeFH
+//---------------------------------------------------------------------------
+
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  Node class
+*/
+class TItsNode
+{
+public:
+    TItsNode();
+    TItsNode(String AId);
+    virtual ~TItsNode();
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String	FNODE_ID;
+    String	FNODE_TYPE;
+    String	FNODE_NAME;
+    String	FTURN_P;
+    String	FRMRK;
+    String	FX_CRDN;
+    String	FY_CRDN;
+    void SetValue(String &AOrgValue, String AValue);
+protected:
+    void SetFNODE_ID(String AValue);
+    void SetFNODE_TYPE(String AValue);
+    void SetFNODE_NAME(String AValue);
+    void SetFTURN_P(String AValue);
+    void SetFRMRK(String AValue);
+    void SetFX_CRDN(String AValue);
+    void SetFY_CRDN(String AValue);
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    __property String NODE_ID   = {read = FNODE_ID,   write = SetFNODE_ID};
+    __property String NODE_TYPE = {read = FNODE_TYPE, write = SetFNODE_TYPE};
+    __property String NODE_NAME = {read = FNODE_NAME, write = SetFNODE_NAME};
+    __property String TURN_P    = {read = FTURN_P,    write = SetFTURN_P};
+    __property String RMRK      = {read = FRMRK,      write = SetFRMRK};
+    __property String X_CRDN    = {read = FX_CRDN,    write = SetFX_CRDN};
+    __property String Y_CRDN    = {read = FY_CRDN,    write = SetFY_CRDN};
+
+    /*
+    NODE_ID NUMBER(10) NOT NULL,	COMMENT ON COLUMN ITSDBA.TB_NODE.NODE_ID IS '노드ID';
+    NODE_TYPE VARCHAR(3 BYTE),      COMMENT ON COLUMN ITSDBA.TB_NODE.NODE_TYPE IS '노드유형';
+    NODE_NAME VARCHAR(100 BYTE),    COMMENT ON COLUMN ITSDBA.TB_NODE.NODE_NAME IS '교차로명칭';
+    TURN_P VARCHAR(1 BYTE),         COMMENT ON COLUMN ITSDBA.TB_NODE.TURN_P IS '회전제한유무';
+    RMRK VARCHAR(50 BYTE),          COMMENT ON COLUMN ITSDBA.TB_NODE.RMRK IS '비고';
+    X_CRDN NUMBER(11,8),            COMMENT ON COLUMN ITSDBA.TB_NODE.X_CRDN IS 'X 좌표';
+    Y_CRDN NUMBER(10,8)             COMMENT ON COLUMN ITSDBA.TB_NODE.Y_CRDN IS 'Y 좌표';
+
+    #	NODE_ID		NODE_TYPE	NODE_NAME		TURN_P	RMRK	X_CRDN			Y_CRDN
+    1	2320043900	101			양촌산업단지22	0				126.62275095	37.61717415
+    */
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Node List class
+*/
+class TItsNodeList 
+{
+public:
+    TItsNodeList();
+    ~TItsNodeList();
+private:
+    TList *FList;
+    void ReleaseAll();
+    void Release(int AIndex);
+    TItsNode *GetNode(int AIndex);
+    int GetCount();
+public:
+    void Clear();
+    int  Add(TItsNode *AItsNode);
+    void Delete(int AIndex);
+    void Insert(int AIndex, TItsNode *AItsNode);
+
+    __property TItsNode *Node[int Index] = {read = GetNode};
+    __property int Count  = {read = GetCount};
+};
+//---------------------------------------------------------------------------
+
+/*
+* NODE CDS
+*/
+class TCDSNode : public TcxCustomDataSource 
+{
+public:
+    TCDSNode(TItsNodeList *AList);
+private:
+    TItsNodeList   *FNodes;
+    bool            FModified;
+protected:
+    void   *__fastcall AppendRecord(void);
+    void   *__fastcall InsertRecord(void * ARecordHandle);
+    void    __fastcall DeleteRecord(void * ARecordHandle);
+
+    int     __fastcall GetRecordCount(void);
+
+    Variant __fastcall GetValue(void * ARecordHandle, void * AItemHandle);
+    void    __fastcall SetValue(void * ARecordHandle, void * AItemHandle, const Variant &AValue);
+    
+public:
+    __property bool Modified = {read = FModified};
+};
+//---------------------------------------------------------------------------
+
+/*
+* Node Manager
+*/
+class TItsNodeManager
+{
+public:
+    TItsNodeManager();
+    virtual ~TItsNodeManager();
+
+public:
+    ListMap<TItsNode>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsNodeManager *ItsNodeManager;
+//---------------------------------------------------------------------------
+
+
+#endif
+

+ 481 - 0
COMMON/CDS/CDSObjectF.cpp

@@ -0,0 +1,481 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSAtrdF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsAtrdRoad::TItsAtrdRoad()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+    //Clear();
+}
+//---------------------------------------------------------------------------
+void TItsAtrdRoad::Clear()
+{
+    ATRD_ID  = "";
+    ROAD_ID  = "";
+    ORD      = "";
+    MEM_DEL  = "";
+}
+//---------------------------------------------------------------------------
+TItsAtrdRoad::~TItsAtrdRoad()
+{
+}
+//---------------------------------------------------------------------------
+
+TItsAtrd::TItsAtrd()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+    //Clear();
+}
+//---------------------------------------------------------------------------
+void TItsAtrd::Clear()
+{
+    ATRD_ID = "";
+    ATRD_NM = "";
+    DRCT_CD = "";
+    AREA_CD = "";
+    DEL_YN  = "";
+    MEM_DEL = "";
+}
+//---------------------------------------------------------------------------
+TItsAtrd::~TItsAtrd()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsAtrdManager *ItsAtrdManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Atrd Manager
+*/
+TItsAtrdManager::TItsAtrdManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsAtrdManager::~TItsAtrdManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TItsAtrdManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    LoadFromAtrdDb(ADbConn);
+    LoadFromAtrdRoadDb(ADbConn);
+    return true;
+}
+
+bool TItsAtrdManager::LoadFromAtrdDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT ATRD_ID,     \r\n"
+           "       ATRD_NM,     \r\n"
+           "       DRCT_CD,     \r\n"
+           "       AREA_CD,     \r\n"
+           "       DEL_YN       \r\n"
+           "  FROM TB_ATRD      \r\n";
+           //" WHERE DEL_YN = 'N' \r\n";
+           //" ORDER BY ATRD_ID   \r\n";
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsAtrd *pObj = new TItsAtrd();
+
+                pObj->ATRD_ID = pADO->FieldByName("ATRD_ID")->AsString;
+                pObj->ATRD_NM = pADO->FieldByName("ATRD_NM")->AsString;
+                pObj->DRCT_CD = pADO->FieldByName("DRCT_CD")->AsString;
+                pObj->AREA_CD = pADO->FieldByName("AREA_CD")->AsString;
+                pObj->DEL_YN  = pADO->FieldByName("DEL_YN")->AsString;
+
+				FLists.Push(pObj->ATRD_ID, pObj);
+
+                pObj->Completed = true;
+                pObj->MEM_DEL   = "N";
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("간선도로정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            DBERRORMSG("간선도로정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::LoadFromAtrdRoadDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT ATRD_ID,           \r\n"
+           "       ROAD_ID,           \r\n"
+           "       ORD                \r\n"
+           "  FROM TB_ATRD_ROAD_RLTN  \r\n";
+           " ORDER BY ATRD_ID, ORD    \r\n";
+    try
+    {
+        TItsAtrd *pAtrd;
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String ATRD_ID = pADO->FieldByName("ATRD_ID")->AsString;
+                pAtrd = FLists.Find(ATRD_ID);
+                if (!pAtrd) continue;
+
+				TItsAtrdRoad *pObj = new TItsAtrdRoad();
+
+                pObj->ATRD_ID   = ATRD_ID;
+                pObj->ROAD_ID   = pADO->FieldByName("ROAD_ID")->AsString;
+                pObj->ORD       = pADO->FieldByName("ORD")->AsString;
+
+				pAtrd->FSubLists.Push(pObj->ORD, pObj);
+
+                pObj->Completed = true;
+                pObj->MEM_DEL   = "N";
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("간선도로-구간정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            DBERRORMSG("간선도로-구간정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::DeleteAtrdRoad(TItsAtrd *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "DELETE TB_ATRD_ROAD_RLTN  \r\n"
+           " WHERE ATRD_ID = :p01     \r\n";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->ATRD_ID;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("간선도로-구간정보삭제", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            DBERRORMSG("간선도로-구간정보삭제", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::DeleteAtrd(TItsAtrd *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_ATRD        \r\n"
+           "   SET DEL_YN = 'Y'   \r\n"
+           " WHERE ATRD_ID = :p01 \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->ATRD_ID;
+			pADO->ExecSQL();
+
+            DeleteAtrdRoad(AObj, ADbConn);
+            
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("간선도로정보삭제", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            DBERRORMSG("간선도로정보삭제", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::InsertAtrdRoad(TItsAtrd *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    //링크구성정보 입력
+    sQry = "INSERT INTO TB_ATRD_ROAD_RLTN (ATRD_ID, ROAD_ID, ORD ) \r\n"
+           "                       VALUES (:p01,    :p02,    :p03) \r\n";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            FOR_STL(TItsAtrdRoad *, pObj, AObj->FSubLists)
+            {
+                pADO->Parameters->ParamByName("p01")->Value = AObj->ATRD_ID;
+                pADO->Parameters->ParamByName("p02")->Value = pObj->ROAD_ID;
+                pADO->Parameters->ParamByName("p03")->Value = pObj->ORD;
+                pADO->ExecSQL();
+            }
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("간선도로-구간정보입력", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            DBERRORMSG("간선도로-구간정보입력", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::UpdateAtrd(TItsAtrd *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+
+    sQry = "UPDATE TB_ATRD          \r\n"
+           "   SET ATRD_NM  = :p02, \r\n"
+           "       DRCT_CD  = :p03, \r\n"
+           "       AREA_CD  = :p04, \r\n"
+           "       DEL_YN   = :p05  \r\n"
+           " WHERE ATRD_ID  = :p01  \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Parameters->ParamByName("p01")->Value = AObj->ATRD_ID;
+			pADO->Parameters->ParamByName("p02")->Value = AObj->ATRD_NM;
+			pADO->Parameters->ParamByName("p03")->Value = AObj->DRCT_CD;
+			pADO->Parameters->ParamByName("p04")->Value = AObj->AREA_CD;
+			pADO->Parameters->ParamByName("p05")->Value = AObj->DEL_YN;
+
+			pADO->ExecSQL();
+
+            DeleteAtrdRoad(AObj, ADbConn);
+            InsertAtrdRoad(AObj, ADbConn);
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("간선도로정보업데이트", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            DBERRORMSG("간선도로정보업데이트", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsAtrdManager::InsertAtrd(TItsAtrd *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "INSERT INTO TB_ATRD(ATRD_ID, ATRD_NM, DRCT_CD, AREA_CD, DEL_YN) \r\n"
+           "             VALUES(:p01,    :p02,    :p03,    :p04,    :p05)   \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Parameters->ParamByName("p01")->Value = AObj->ATRD_ID;
+			pADO->Parameters->ParamByName("p02")->Value = AObj->ATRD_NM;
+			pADO->Parameters->ParamByName("p03")->Value = AObj->DRCT_CD;
+			pADO->Parameters->ParamByName("p04")->Value = AObj->AREA_CD;
+			pADO->Parameters->ParamByName("p05")->Value = AObj->DEL_YN;
+
+			pADO->ExecSQL();
+
+            DeleteAtrdRoad(AObj, ADbConn);
+            InsertAtrdRoad(AObj, ADbConn);
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("간선도로정보입력", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            DBERRORMSG("간선도로정보입력", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+

+ 102 - 0
COMMON/CDS/CDSObjectF.h

@@ -0,0 +1,102 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSAtrdFH
+#define CDSAtrdFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+
+/*
+*  TItsAtrdRoad class
+*/
+class TItsAtrdRoad
+{
+public:
+    TItsAtrdRoad();
+    virtual ~TItsAtrdRoad();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+
+    String ATRD_ID;     //VARCHAR2(10)	N			간선도로 ID
+    String ROAD_ID;     //NUMBER(10)	N			도로 ID
+    String ORD;         //NUMBER(3)	Y	0		순서
+    String MEM_DEL;
+
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Atrd class
+*/
+class TItsAtrd
+{
+public:
+    TItsAtrd();
+    virtual ~TItsAtrd();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+
+    String ATRD_ID;     //VARCHAR2(10)	N			간선도로 ID
+    String ATRD_NM;     //VARCHAR2(30)	Y			간선도로 명
+    String DRCT_CD;     //VARCHAR2(7)	Y			방향 코드
+    String AREA_CD;     //VARCHAR2(7)	Y			지역 코드
+    String DEL_YN;      //CHAR(1)	Y	'N'		삭제 여부
+    String MEM_DEL;
+
+    ListMap<TItsAtrdRoad>   FSubLists;
+    
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+* Atrd Manager
+*/
+class TItsAtrdManager
+{
+public:
+    TItsAtrdManager();
+    virtual ~TItsAtrdManager();
+
+public:
+    ListMap<TItsAtrd>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadFromAtrdDb(TADOConnection *ADbConn=NULL);
+    bool LoadFromAtrdRoadDb(TADOConnection *ADbConn=NULL);
+
+    bool DeleteAtrdRoad(TItsAtrd *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertAtrdRoad(TItsAtrd *AObj, TADOConnection *ADbConn=NULL);
+    bool DeleteAtrd(TItsAtrd *AObj, TADOConnection *ADbConn=NULL);
+    bool UpdateAtrd(TItsAtrd *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertAtrd(TItsAtrd *AObj, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsAtrdManager *ItsAtrdManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 137 - 0
COMMON/CDS/CDSOrganF.cpp

@@ -0,0 +1,137 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSOrganF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsOrgan::TItsOrgan()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+    //Clear();
+}
+//---------------------------------------------------------------------------
+void TItsOrgan::Clear()
+{
+    CNCT_INTN_MNGM_NMBR = "";    //NUMBER(10)	N			연계 기관 관리 번호
+    CNCT_INTN_NM        = "";           //VARCHAR2(50)	Y			연계 기관 명
+    CNCT_INTN_TYPE_CD   = "";      //VARCHAR2(7)	Y			연계 기관 유형 코드
+    CNCT_INTN_TEL       = "";          //VARCHAR2(128)	Y			연계 기관 전화번호
+    CNCT_INTN_ADDR      = "";         //VARCHAR2(200)	Y			연계 기관 주소
+    RMRK                = "";                   //VARCHAR2(600)	Y			비고
+    FRST_REGR_NMBR      = "";         //VARCHAR2(20)	Y			최초 등록자 번호
+    FRST_RGST_DT        = "";           //VARCHAR2(14)	Y			최초 등록 일시
+    LAST_CRPR_NMBR      = "";         //VARCHAR2(20)	Y			최종 수정자 번호
+    LAST_CRCT_DT        = "";           //VARCHAR2(14)	Y			최종 수정 일시
+    DEL_YN              = "N";                 //CHAR(1)	Y	'N'		삭제 여부
+}
+//---------------------------------------------------------------------------
+TItsOrgan::~TItsOrgan()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsOrganManager *ItsOrganManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Organ Manager
+*/
+TItsOrganManager::TItsOrganManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsOrganManager::~TItsOrganManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TItsOrganManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT *                        \r\n"
+           "  FROM TB_CNCT_INTN             \r\n";
+           //" ORDER BY CNCT_INTN_MNGM_NMBR   \r\n";
+#else
+    sQry = "SELECT A.CNCT_INTN_MNGM_NMBR, A.CNCT_INTN_NM, A.CNCT_INTN_TYPE_CD,      \r\n"
+           "       A.CNCT_INTN_TEL, A.CNCT_INTN_ADDR, A.RMRK,                       \r\n"
+           "       A.FRST_REGR_NMBR, A.FRST_RGST_DT,                                \r\n"
+           "       A.LAST_CRPR_NMBR, A.LAST_CRCT_DT, A.DEL_YN                       \r\n"
+           "  FROM TB_CNCT_INTN A                                                   \r\n";
+//           " ORDER BY A.CNCT_INTN_MNGM_NMBR                                         \r\n";
+#endif
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsOrgan *pObj = new TItsOrgan();
+
+                pObj->CNCT_INTN_MNGM_NMBR = pADO->FieldByName("CNCT_INTN_MNGM_NMBR")->AsString;    //NUMBER(10)	N			연계 기관 관리 번호
+                pObj->CNCT_INTN_NM        = pADO->FieldByName("CNCT_INTN_NM")->AsString.Trim();           //VARCHAR2(50)	Y			연계 기관 명
+                pObj->CNCT_INTN_TYPE_CD   = pADO->FieldByName("CNCT_INTN_TYPE_CD")->AsString;      //VARCHAR2(7)	Y			연계 기관 유형 코드
+                pObj->CNCT_INTN_TEL       = pADO->FieldByName("CNCT_INTN_TEL")->AsString;          //VARCHAR2(128)	Y			연계 기관 전화번호
+                pObj->CNCT_INTN_ADDR      = pADO->FieldByName("CNCT_INTN_ADDR")->AsString.Trim();         //VARCHAR2(200)	Y			연계 기관 주소
+                pObj->RMRK                = pADO->FieldByName("RMRK")->AsString;                   //VARCHAR2(600)	Y			비고
+                pObj->FRST_REGR_NMBR      = pADO->FieldByName("FRST_REGR_NMBR")->AsString;         //VARCHAR2(20)	Y			최초 등록자 번호
+                pObj->FRST_RGST_DT        = pADO->FieldByName("FRST_RGST_DT")->AsString;           //VARCHAR2(14)	Y			최초 등록 일시
+                pObj->LAST_CRPR_NMBR      = pADO->FieldByName("LAST_CRPR_NMBR")->AsString;         //VARCHAR2(20)	Y			최종 수정자 번호
+                pObj->LAST_CRCT_DT        = pADO->FieldByName("LAST_CRCT_DT")->AsString;           //VARCHAR2(14)	Y			최종 수정 일시
+                pObj->DEL_YN              = pADO->FieldByName("DEL_YN")->AsString;                 //CHAR(1)	Y	'N'		삭제 여부
+
+				FLists.Push(pObj->CNCT_INTN_MNGM_NMBR, pObj);
+
+                pObj->Completed = true;
+                pObj->MEM_DEL   = "N";
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsOrganManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsOrganManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 69 - 0
COMMON/CDS/CDSOrganF.h

@@ -0,0 +1,69 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSOrganFH
+#define CDSOrganFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+/*
+*  Organ class
+*/
+class TItsOrgan
+{
+public:
+    TItsOrgan();
+    virtual ~TItsOrgan();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+    String  CNCT_INTN_MNGM_NMBR;    //NUMBER(10)	N			연계 기관 관리 번호
+    String  CNCT_INTN_NM;           //VARCHAR2(50)	Y			연계 기관 명
+    String  CNCT_INTN_TYPE_CD;      //VARCHAR2(7)	Y			연계 기관 유형 코드
+    String  CNCT_INTN_TEL;          //VARCHAR2(128)	Y			연계 기관 전화번호
+    String  CNCT_INTN_ADDR;         //VARCHAR2(200)	Y			연계 기관 주소
+    String  RMRK;                   //VARCHAR2(600)	Y			비고
+    String  FRST_REGR_NMBR;         //VARCHAR2(20)	Y			최초 등록자 번호
+    String  FRST_RGST_DT;           //VARCHAR2(14)	Y			최초 등록 일시
+    String  LAST_CRPR_NMBR;         //VARCHAR2(20)	Y			최종 수정자 번호
+    String  LAST_CRCT_DT;           //VARCHAR2(14)	Y			최종 수정 일시
+    String  DEL_YN;                 //CHAR(1)	Y	'N'		삭제 여부
+
+    String  MEM_DEL;
+    
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+* Organ Manager
+*/
+class TItsOrganManager
+{
+public:
+    TItsOrganManager();
+    virtual ~TItsOrganManager();
+
+public:
+    ListMap<TItsOrgan>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsOrganManager *ItsOrganManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 650 - 0
COMMON/CDS/CDSParkingF.cpp

@@ -0,0 +1,650 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSParkingF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsParking::TItsParking()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+    DEL_YN     = "N";
+
+    DEL_USER_ID  = "";
+    DEL_DT       = "";
+    DEL_YN       = "N";
+    ADTN_USER_ID = "";
+    ADTN_DT      = "";
+    CHNG_USER_ID = "";
+    CHNG_DT      = "";
+
+    Floors = 0;
+    FData1 = NULL;
+    FData2 = NULL;
+}
+//---------------------------------------------------------------------------
+void TItsParking::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsParking::~TItsParking()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsParkingManager *ItsParkingManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Parking Manager
+*/
+TItsParkingManager::TItsParkingManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsParkingManager::~TItsParkingManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TItsParkingManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsParkingManager::GetNextParkingId(String &ANewId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT LPAD(NVL(MAX(SUBSTR(CTLR_MNGM_NMBR, -7)), '0000000') + 1, 7, '0') AS NEWID \r\n"
+           "  FROM TB_PRLT_CTLR                                                               \r\n";
+#else
+    sQry = "SELECT NVL(MAX(CTLR_MNGM_NMBR)+1, 1) AS NEWID \r\n"
+           "  FROM TB_PRLT_CTLR                           \r\n";
+#endif
+
+    ANewId = "";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            ANewId = pADO->FieldByName("NEWID")->AsString;
+//            ANewId = "PAR" + pADO->FieldByName("NEWID")->AsString;
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::GetNextParkingId", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::GetNextParkingId", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TItsParkingManager::DeleteParking(TItsParking *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_PRLT_CTLR          \r\n"
+           "   SET DEL_YN      = 'Y',    \r\n"
+           "       DEL_USER_ID = :p02,   \r\n"
+           "       DEL_DT      = :p03    \r\n"
+           " WHERE CTLR_MNGM_NMBR = :p01 \r\n";
+    try
+    {
+        //FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+			pADO->Parameters->ParamByName("p02")->Value = AObj->DEL_USER_ID;
+			pADO->Parameters->ParamByName("p03")->Value = AObj->DEL_DT;
+			pADO->ExecSQL();
+
+    sQry = "DELETE TB_PRLT_OPER_INFR          \r\n"
+           " WHERE CTLR_MNGM_NMBR = :p01 \r\n";
+
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+			pADO->ExecSQL();
+
+
+#if 0
+    sQry = "DELETE TB_PRLT_FLOR          \r\n"
+           " WHERE CTLR_MNGM_NMBR = :p01 \r\n";
+
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+			pADO->ExecSQL();
+#endif
+
+        sQry = "DELETE TB_FCLT_INFR       \r\n"
+               " WHERE FCLT_ID = :p01     \r\n";
+               "   AND FCLT_TYPE = 'PARK' \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+			pADO->ExecSQL();
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::DeleteParking", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::DeleteParking", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        //FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsParkingManager::UpdateParking(TItsParking *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+
+    sQry = "UPDATE TB_PRLT_CTLR                \r\n"
+           "   SET PRLT_OPER_DVSN_CD = :p02,   \r\n"
+           "       PRLT_TYPE_DVSN_CD = :p03,   \r\n"
+           "       VALD_YN           = :p04,   \r\n"
+           "       X_CRDN            = :p05,   \r\n"
+           "       Y_CRDN            = :p06,   \r\n"
+           "       ISTL_LCTN_ADDR    = :p07,   \r\n"
+           "       TRMN_IP           = :p08,   \r\n"
+           "       TRMN_PORT         = :p09,   \r\n"
+           "       CTLR_CLCT_CYCL    = :p10,   \r\n"
+           "       CTLR_STTS_CYCL    = :p11,   \r\n"
+           "       WHOL_NPLS         = :p12,   \r\n"
+           "       DEL_USER_ID       = :p13,   \r\n"
+           "       DEL_DT            = :p14,   \r\n"
+           "       DEL_YN            = :p15,   \r\n"
+           "       ADTN_USER_ID      = :p16,   \r\n"
+           "       ADTN_DT           = :p17,   \r\n"
+           "       CHNG_USER_ID      = :p18,   \r\n"
+           "       CHNG_DT           = :p19,   \r\n"
+#ifdef USE_PARK_REAL
+           "       CTLR_MNGM_NM      = :p20,   \r\n"
+           "       REAL_DATA_YN      = :p21    \r\n"
+#else
+           "       CTLR_MNGM_NM      = :p20   \r\n"
+#endif
+           " WHERE CTLR_MNGM_NMBR = :p01       \r\n";
+
+    try
+    {
+        //FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->PRLT_OPER_DVSN_CD;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->PRLT_TYPE_DVSN_CD;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->VALD_YN;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->ISTL_LCTN_ADDR;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->TRMN_IP;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->TRMN_PORT;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->CTLR_CLCT_CYCL;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->CTLR_STTS_CYCL;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->WHOL_NPLS;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->DEL_USER_ID;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->DEL_DT;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->DEL_YN;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->ADTN_USER_ID;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->ADTN_DT;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->CHNG_USER_ID;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->CHNG_DT;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->CTLR_MNGM_NM;
+#ifdef USE_PARK_REAL
+            pADO->Parameters->ParamByName("p21")->Value = AObj->REAL_DATA_YN;
+#endif
+
+			pADO->ExecSQL();
+
+            InsertParkingOper(AObj, ADbConn);
+            InsertParkingFloors(AObj, ADbConn);
+
+        sQry = "UPDATE TB_FCLT_INFR       \r\n"
+               "   SET FCLT_LCTN  = :p02  \r\n"
+               " WHERE FCLT_ID    = :p01  \r\n";
+               "   AND FCLT_TYPE = 'PARK' \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+			pADO->Parameters->ParamByName("p02")->Value = AObj->CTLR_MNGM_NM;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::UpdateParking", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::UpdateParking", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        //FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsParkingManager::InsertParking(TItsParking *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "INSERT INTO TB_PRLT_CTLR(                              \r\n"
+           "         CTLR_MNGM_NMBR,                               \r\n"
+           "         PRLT_OPER_DVSN_CD,                            \r\n"
+           "         PRLT_TYPE_DVSN_CD,                            \r\n"
+           "         VALD_YN,                                      \r\n"
+           "         X_CRDN,                                       \r\n"
+           "         Y_CRDN,                                       \r\n"
+           "         ISTL_LCTN_ADDR,                               \r\n"
+           "         TRMN_IP,                                      \r\n"
+           "         TRMN_PORT,                                    \r\n"
+           "         CTLR_CLCT_CYCL,                               \r\n"
+           "         CTLR_STTS_CYCL,                               \r\n"
+           "         WHOL_NPLS,                                    \r\n"
+           "         DEL_USER_ID,                                  \r\n"
+           "         DEL_DT,                                       \r\n"
+           "         DEL_YN,                                       \r\n"
+           "         ADTN_USER_ID,                                 \r\n"
+           "         ADTN_DT,                                      \r\n"
+           "         CHNG_USER_ID,                                 \r\n"
+           "         CHNG_DT,                                      \r\n"
+#ifdef USE_PARK_REAL
+           "         CTLR_MNGM_NM,                                 \r\n"
+           "         REAL_DATA_YN                                  \r\n"
+#else
+           "         CTLR_MNGM_NM                                  \r\n"
+#endif
+           "                        )                              \r\n"
+           "                 VALUES(:p01, :p02, :p03, :p04, :p05,  \r\n"
+           "                        :p06, :p07, :p08, :p09, :p10,  \r\n"
+           "                        :p11, :p12, :p13, :p14, :p15,  \r\n"
+#ifdef USE_PARK_REAL
+           "                        :p16, :p17, :p18, :p19, :p20,  \r\n"
+           "                        :p21 )                         \r\n";
+#else
+           "                        :p16, :p17, :p18, :p19, :p20 ) \r\n";
+#endif
+    try
+    {
+        //FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->PRLT_OPER_DVSN_CD;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->PRLT_TYPE_DVSN_CD;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->VALD_YN;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->ISTL_LCTN_ADDR;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->TRMN_IP;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->TRMN_PORT;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->CTLR_CLCT_CYCL;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->CTLR_STTS_CYCL;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->WHOL_NPLS;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->DEL_USER_ID;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->DEL_DT;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->DEL_YN;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->ADTN_USER_ID;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->ADTN_DT;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->CHNG_USER_ID;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->CHNG_DT;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->CTLR_MNGM_NM;
+#ifdef USE_PARK_REAL
+            pADO->Parameters->ParamByName("p21")->Value = AObj->REAL_DATA_YN;
+#endif
+
+			pADO->ExecSQL();
+
+            InsertParkingOper(AObj, ADbConn);
+            InsertParkingFloors(AObj, ADbConn);
+
+        sQry = "INSERT INTO TB_FCLT_INFR(FCLT_ID, FCLT_TYPE, FCLT_LCTN, RSCE_YN, DEL_YN, USE_YEAR, AMT) \r\n"
+               "                  VALUES(:p01,    'PARK',     :p03,      'N',     'N',    '0',      '0') \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+			pADO->Parameters->ParamByName("p03")->Value = AObj->CTLR_MNGM_NM;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::InsertParking", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::InsertParking", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        //FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsParkingManager::InsertParkingOper(TItsParking *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        //FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+
+
+    sQry = "DELETE TB_PRLT_OPER_INFR          \r\n"
+           " WHERE CTLR_MNGM_NMBR = :p01 \r\n";
+
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+			pADO->ExecSQL();
+
+    sQry = "INSERT INTO TB_PRLT_OPER_INFR(                         \r\n"
+           "         CTLR_MNGM_NMBR,                               \r\n"
+           "         PRLT_MNGM_INTN_NM,                            \r\n"
+           "         PRLT_MNGM_INTN_TEL,                           \r\n"
+           "         PARK_NDSY_CD,                                 \r\n"
+           "         PARK_OPER_DAY_CD,                             \r\n"
+           "         PARK_WKDY_STRT_HH,                            \r\n"
+           "         PARK_WKDY_END_HH,                             \r\n"
+           "         PARK_LHDY_STRT_HH,                            \r\n"
+           "         PARK_LHDY_END_HH,                             \r\n"
+           "         PARK_OPDR_CD,                                 \r\n"
+           "         PARK_FARE_IMPS_CD,                            \r\n"
+           "         PARK_APNT_OFFR_YN                             \r\n"
+           "                        )                              \r\n"
+           "                 VALUES(:p01, :p02, :p03, :p04, :p05,  \r\n"
+           "                        :p06, :p07, :p08, :p09, :p10,  \r\n"
+           "                        :p11, :p12            )        \r\n";
+
+			pADO->SQL->Text = sQry;
+
+            pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->PRLT_MNGM_INTN_NM;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->PRLT_MNGM_INTN_TEL;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->PARK_NDSY_CD;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->PARK_OPER_DAY_CD;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->PARK_WKDY_STRT_HH;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->PARK_WKDY_END_HH;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->PARK_LHDY_STRT_HH;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->PARK_LHDY_END_HH;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->PARK_OPDR_CD;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->PARK_FARE_IMPS_CD;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->PARK_APNT_OFFR_YN;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::InsertParkingOper", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::InsertParkingOper", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        //FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsParkingManager::InsertParkingFloors(TItsParking *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        //FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+
+
+#if 0
+    sQry = "DELETE TB_PRLT_FLOR          \r\n"
+           " WHERE CTLR_MNGM_NMBR = :p01 \r\n";
+
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+			pADO->ExecSQL();
+#endif
+
+#if 0
+    sQry = "INSERT INTO TB_PRLT_FLOR( CTLR_MNGM_NMBR, FLOR_NMBR, FLOR_NM ) \r\n"
+           "                 VALUES(:p01, :p02, :p03   )                   \r\n";
+#else
+    sQry = "UPDATE TB_PRLT_FLOR          \r\n"
+           "   SET FLOR_NM = :p03        \r\n"
+           " WHERE CTLR_MNGM_NMBR = :p01 \r\n"
+           "   AND FLOR_NMBR      = :p02 \r\n";
+#endif
+
+			pADO->SQL->Text = sQry;
+
+            for (int ii = 0; ii < AObj->Floors; ii++)
+            {
+                pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+                pADO->Parameters->ParamByName("p02")->Value = AObj->FLOR_NMBR[ii];
+                pADO->Parameters->ParamByName("p03")->Value = AObj->FLOR_NM[ii];
+                pADO->ExecSQL();
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::InsertParkingFloors", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::InsertParkingFloors", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        //FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsParkingManager::SelParkingFloors(TItsParking *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT * FROM TB_PRLT_FLOR   \r\n"
+           " WHERE CTLR_MNGM_NMBR = :p01 \r\n"
+           " ORDER BY FLOR_NMBR          \r\n";
+
+    AObj->Floors = 0;
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CTLR_MNGM_NMBR;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AObj->FLOR_NMBR[AObj->Floors] = pADO->FieldByName("FLOR_NMBR")->AsString;
+                AObj->FLOR_NM[AObj->Floors]   = pADO->FieldByName("FLOR_NM")->AsString;
+                AObj->Floors++;
+                if (AObj->Floors >= MAX_PARKING_FLOOR)
+                {
+                    break;
+                }
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::SelParkingFloors", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsParkingManager::SelParkingFloors", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 116 - 0
COMMON/CDS/CDSParkingF.h

@@ -0,0 +1,116 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSParkingFH
+#define CDSParkingFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+#define USE_PARK_REALx
+#define MAX_PARKING_FLOOR   20
+
+/*
+*  Parking class
+*/
+class TItsParking
+{
+public:
+    TItsParking();
+    virtual ~TItsParking();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+
+    //주차장 제어기정보
+    String  CTLR_MNGM_NMBR;     //	N	VARCHAR2(20)	N			제어기 관리 번호
+    String  PRLT_OPER_DVSN_CD;  //	N	VARCHAR2(7)	    Y			주차장 운영 구분 코드
+    String  PRLT_TYPE_DVSN_CD;  //	N	VARCHAR2(7)	    Y			주차장 유형 구분 코드
+    String  VALD_YN;            //	N	CHAR(1)	        Y	'N'		유효 여부
+    String  X_CRDN;             //	N	NUMBER(11,8)	Y			X 좌표
+    String  Y_CRDN;             //	N	NUMBER(10,8)	Y			Y 좌표
+    String  ISTL_LCTN_ADDR;     //	N	VARCHAR2(200)	Y			설치 위치 주소
+    String  TRMN_IP;            //	N	VARCHAR2(20)	Y			단말기 아이피
+    String  TRMN_PORT;          //	N	VARCHAR2(5)	    Y			단말기 포트
+    String  CTLR_CLCT_CYCL;     //	N	NUMBER(3)	    Y	0		제어기 수집 주기
+    String  CTLR_STTS_CYCL;     //	N	NUMBER(3)	    Y	0		제어기 상태 주기
+    String  WHOL_NPLS;          //	N	NUMBER(3)	    Y	0		전체 주차면수
+    String  DEL_USER_ID;        //	N	VARCHAR2(64)	Y			삭제 사용자 ID
+    String  DEL_DT;             //	N	VARCHAR2(14)	Y			삭제 일시
+    String  DEL_YN;             //	N	CHAR(1)	        Y	'N'		삭제 여부
+    String  ADTN_USER_ID;       //	N	VARCHAR2(64)	Y			추가 사용자 ID
+    String  ADTN_DT;            //	N	VARCHAR2(14)	Y			추가 일시
+    String  CHNG_USER_ID;       //	N	VARCHAR2(64)	Y			변경 사용자 ID
+    String  CHNG_DT;            //	N	VARCHAR2(14)	Y			변경 일시
+    String  CTLR_MNGM_NM;	    //  N	VARCHAR2(50)	Y			주차장명(20161213 추가)
+    String  REAL_DATA_YN;       //	N	CHAR(1)	        Y	'Y'		실시간 정보 제공 여부(20171220 추가)
+
+
+    //주차장 운영 정보
+    //String  CTLR_MNGM_NMBR;     //	N	VARCHAR2(20)	N			제어기 관리 번호
+    String  PRLT_MNGM_INTN_NM;  //	N	VARCHAR2(40)	Y			주차장 관리 기관 명
+    String  PRLT_MNGM_INTN_TEL; //	N	VARCHAR2(128)	Y			주차장 관리 기관 전화번호
+    String  PARK_NDSY_CD;       //	N	VARCHAR2(7)	    Y			주차 부제 코드
+    String  PARK_OPER_DAY_CD;   //	N	VARCHAR2(7)	    Y			주차 운영 요일 코드
+    String  PARK_WKDY_STRT_HH;  //	N	VARCHAR2(6)	    Y			주차 평일 시작 시간
+    String  PARK_WKDY_END_HH;   //	N	VARCHAR2(6)	    N			주차 평일 종료 시간
+    String  PARK_LHDY_STRT_HH;  //	N	VARCHAR2(6)	    Y			주차 공휴일 시작 시간
+    String  PARK_LHDY_END_HH;   //	N	VARCHAR2(6)	    Y			주차 공휴일 종료 시간
+    String  PARK_OPDR_CD;       //	N	VARCHAR2(7)	    Y			주차 개방 코드
+    String  PARK_FARE_IMPS_CD;  //	N	VARCHAR2(7)	    Y			주차 요금 부과 코드
+    String  PARK_APNT_OFFR_YN;  //	N	CHAR(1)	        Y	'N'		주차 예약 제공 여부
+
+    String MEM_DEL;
+    //String DEL_YN;
+
+    int Floors;
+    String FLOR_NMBR[MAX_PARKING_FLOOR];
+    String FLOR_NM[MAX_PARKING_FLOOR];
+
+    void *FData1;
+    void *FData2;
+
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+* Parking Manager
+*/
+class TItsParkingManager
+{
+public:
+    TItsParkingManager();
+    virtual ~TItsParkingManager();
+
+public:
+    ListMap<TItsParking>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+
+    bool GetNextParkingId(String &ANewId, TADOConnection *ADbConn=NULL);
+    bool DeleteParking(TItsParking *AObj, TADOConnection *ADbConn=NULL);
+    bool UpdateParking(TItsParking *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertParking(TItsParking *AObj, TADOConnection *ADbConn=NULL);
+
+    bool InsertParkingOper(TItsParking *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertParkingFloors(TItsParking *AObj, TADOConnection *ADbConn=NULL);
+    bool SelParkingFloors(TItsParking *AObj, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsParkingManager *ItsParkingManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 429 - 0
COMMON/CDS/CDSPrcsParamF.cpp

@@ -0,0 +1,429 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSPrcsParamF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+/*
+* Info Class
+*/
+TPrcsParam::TPrcsParam()
+{
+}
+//---------------------------------------------------------------------------
+void TPrcsParam::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TPrcsParam::~TPrcsParam()
+{
+}
+//---------------------------------------------------------------------------
+String     TPrcsParam::ToString()
+{
+    String SubIds = "";
+    String sTemp = "";
+    FOR_STL(TPrcsParamClct*, pSub, CLCTS)
+    {
+        sTemp.printf(L"                            PRRT: %2d, WGHT: %5.2f, CLCT: %s\r\n", pSub->FUSN_PRRT, pSub->FUSN_WGHT, pSub->CLCT_SYST_CD.c_str());
+        SubIds += sTemp;
+    }
+
+    String     sFltr1, sFltr2, sFltr3;
+    String     sAdjs1, sAdjs2, sAdjs3;
+    String     sSmth1, sSmth2, sSmth3;
+    String     sFusn1;
+
+    sFltr1.printf(L"                       FILTERING: %s\r\n", FLTR_MTHD_CD.c_str());
+    sFltr2.printf(L"                    VOL(MIN/MAX): %6d/%6d\r\n", FLTR_MIN_TFVL, FLTR_MAX_TFVL);
+    sFltr3.printf(L"                    SPD(LOW/HIG): %6d/%6d\r\n", FLTR_LWST_SPED, FLTR_HGHS_SPED);
+
+    sAdjs1.printf(L"                      ADJUSTMENT: %s\r\n", ADJS_MTHD_CD.c_str());
+    sAdjs2.printf(L"        WGHT_AVRG_PRE(1/2/3CYCL): %5.2f/%5.2f/%5.2f\r\n", ADJS_WGHT_AVRG_PRE_1CYCL, ADJS_WGHT_AVRG_PRE_2CYCL, ADJS_WGHT_AVRG_PRE_3CYCL);
+    sAdjs3.printf(L"     15M_PTRN_YN, MISS_DECS_CYCL: %s, %d\r\n", ADJS_15M_PTRN_APLY_YN.c_str(), ADJS_SHTR_MISS_DECS_CYCL);
+
+    sSmth1.printf(L"                       SMOOTHING: %s\r\n", SMTH_MTHD_CD.c_str());
+    sSmth2.printf(L"            SPED_FCTR(LWST/HGHS): %3.2f/%3.2f\r\n", SMTH_LWST_SPED_FCTR, SMTH_HGHS_SPED_FCTR);
+    sSmth3.printf(L"     WGHT_AVRG(PRST/1CYCL/2CYCL): %5.2f/%5.2f/%5.2f\r\n", SMTH_WGHT_AVRG_PRST, SMTH_WGHT_AVRG_PRE_1CYCL, SMTH_WGHT_AVRG_PRE_2CYCL);
+
+    sFusn1.printf(L"                          FUSION: %s\r\n", FUSN_MTHD_CD.c_str());
+
+    return "ID: " + PARA_ID + "\r\n" +
+            sFltr1 + sFltr2 + sFltr3 +
+            sAdjs1 + sAdjs2 + sAdjs3 +
+            sSmth1 + sSmth2 + sSmth3 +
+            sFusn1 + SubIds;
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TPrcsParamManager *PrcsParamManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+TPrcsParamManager::TPrcsParamManager()
+{
+}
+//---------------------------------------------------------------------------
+TPrcsParamManager::~TPrcsParamManager()
+{
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TPrcsParamManager::Clear()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+bool TPrcsParamManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    LoadParam(ADbConn);
+    return LoadParamDetl(ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TPrcsParamManager::LoadParam(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.LINK_ID AS PARA_ID,  A.PARA_NM,                                                    \r\n"
+           "       A.FLTR_MTHD_CD, A.FUSN_MTHD_CD, A.ADJS_MTHD_CD, A.SMTH_MTHD_CD,                      \r\n"
+           "       B.FLTR_MIN_TFVL, B.FLTR_MAX_TFVL,                                                    \r\n"
+           "       B.FLTR_LWST_SPED, B.FLTR_HGHS_SPED,                                                  \r\n"
+           "       B.ADJS_WGHT_AVRG_PRE_1CYCL, B.ADJS_WGHT_AVRG_PRE_2CYCL, B.ADJS_WGHT_AVRG_PRE_3CYCL,  \r\n"
+           "       B.ADJS_15M_PTRN_APLY_YN, B.ADJS_SHTR_MISS_DECS_CYCL,                                 \r\n"
+           "       B.SMTH_LWST_SPED_FCTR, B.SMTH_HGHS_SPED_FCTR,                                        \r\n"
+           "       B.SMTH_WGHT_AVRG_PRST, B.SMTH_WGHT_AVRG_PRE_1CYCL, B.SMTH_WGHT_AVRG_PRE_2CYCL        \r\n"
+           "  FROM TB_LINK_PARA_STUP A                                                                  \r\n"
+           " INNER JOIN TB_LINK_PARA_DETL B                                                             \r\n"
+           "         ON A.LINK_ID = B.LINK_ID                                                           \r\n";
+
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString PARA_ID = pADO->FieldByName("PARA_ID")->AsString;
+
+                TPrcsParam* pObj = new TPrcsParam();
+
+                pObj->PARA_ID                  = pADO->FieldByName("PARA_ID")->AsString;
+                pObj->PARA_NM                  = pADO->FieldByName("PARA_NM")->AsString;
+                pObj->FLTR_MTHD_CD             = pADO->FieldByName("FLTR_MTHD_CD")->AsString;               //	N	VARCHAR2(7)	Y			필터링 방법 코드
+                pObj->FUSN_MTHD_CD             = pADO->FieldByName("FUSN_MTHD_CD")->AsString;               //	N	VARCHAR2(7)	Y			퓨전 방법 코드
+                pObj->ADJS_MTHD_CD             = pADO->FieldByName("ADJS_MTHD_CD")->AsString;               //	N	VARCHAR2(7)	Y			보정 방법 코드
+                pObj->SMTH_MTHD_CD             = pADO->FieldByName("SMTH_MTHD_CD")->AsString;               //	N	VARCHAR2(7)	Y			평활화 방법 코드
+
+                pObj->FLTR_MIN_TFVL            = pADO->FieldByName("FLTR_MIN_TFVL")->AsInteger;             //	N	NUMBER(6)	Y	0		필터링 최소 교통량
+                pObj->FLTR_MAX_TFVL            = pADO->FieldByName("FLTR_MAX_TFVL")->AsInteger;             //	N	NUMBER(6)	Y	0		필터링 최대 교통량
+                pObj->FLTR_LWST_SPED           = pADO->FieldByName("FLTR_LWST_SPED")->AsInteger;            //	N	NUMBER(3)	Y	0		필터링 최저 속도
+                pObj->FLTR_HGHS_SPED           = pADO->FieldByName("FLTR_HGHS_SPED")->AsInteger;            //	N	NUMBER(3)	Y	0		필터링 최고 속도
+                pObj->ADJS_WGHT_AVRG_PRE_1CYCL = pADO->FieldByName("ADJS_WGHT_AVRG_PRE_1CYCL")->AsFloat;    //	N	NUMBER(5,2)	Y	0		보정 가중치 평균 이전 1주기
+                pObj->ADJS_WGHT_AVRG_PRE_2CYCL = pADO->FieldByName("ADJS_WGHT_AVRG_PRE_2CYCL")->AsFloat;    //	N	NUMBER(5,2)	Y	0		보정 가중치 평균 이전 2주기
+                pObj->ADJS_WGHT_AVRG_PRE_3CYCL = pADO->FieldByName("ADJS_WGHT_AVRG_PRE_3CYCL")->AsFloat;    //	N	NUMBER(5,2)	Y	0		보정 가중치 평균 이전 3주기
+                pObj->ADJS_15M_PTRN_APLY_YN    = pADO->FieldByName("ADJS_15M_PTRN_APLY_YN")->AsString;      //	N	CHAR(1)	    Y	'N'		보정 15분 패턴 적용 여부
+                pObj->ADJS_SHTR_MISS_DECS_CYCL = pADO->FieldByName("ADJS_SHTR_MISS_DECS_CYCL")->AsInteger;  //	N	NUMBER(2)	Y			보정 단기 결측 판단 주기
+                pObj->SMTH_LWST_SPED_FCTR      = pADO->FieldByName("SMTH_LWST_SPED_FCTR")->AsFloat;         //	N	NUMBER(3,2)	Y	0		평활화 최저 속도 계수
+                pObj->SMTH_HGHS_SPED_FCTR      = pADO->FieldByName("SMTH_HGHS_SPED_FCTR")->AsFloat;         //	N	NUMBER(3,2)	Y	0		평활화 최고 속도 계수
+                pObj->SMTH_WGHT_AVRG_PRST      = pADO->FieldByName("SMTH_WGHT_AVRG_PRST")->AsFloat;         //	N	NUMBER(5,2)	Y	0		평활화 가중치 평균 현재
+                pObj->SMTH_WGHT_AVRG_PRE_1CYCL = pADO->FieldByName("SMTH_WGHT_AVRG_PRE_1CYCL")->AsFloat;    //	N	NUMBER(5,2)	Y	0		평활화 가중치 평균 이전 1주기
+                pObj->SMTH_WGHT_AVRG_PRE_2CYCL = pADO->FieldByName("SMTH_WGHT_AVRG_PRE_2CYCL")->AsFloat;    //	N	NUMBER(5,2)	Y	0		평활화 가중치 평균 이전 2주기
+
+                pObj->DEL_YN = "N";
+
+                FLists.Push(pObj->PARA_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TPrcsParamManager::LoadParam", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TPrcsParamManager::LoadParam", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TPrcsParamManager::LoadParamDetl(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.LINK_ID AS PARA_ID,                         \r\n"
+           "       B.CLCT_SYST_CD, B.FUSN_PRRT, B.FUSN_WGHT      \r\n"
+           "  FROM TB_LINK_PARA_STUP A                           \r\n"
+           " INNER JOIN TB_LINK_PARA_CLCT_SYST B                 \r\n"
+           "         ON A.LINK_ID = B.LINK_ID                    \r\n"
+           //" WHERE A.LINK_ID = 2210011000                        \r\n"
+           " ORDER BY A.LINK_ID, B.FUSN_PRRT                     \r\n";
+
+    //기존 파라미터의 수집원별 우선순위, 가중치 정보를 삭제한다.
+    FOR_STL(TPrcsParam*, pObj, FLists)
+    {
+        pObj->CLCTS.RemoveAll();
+    }
+
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                AnsiString PARA_ID = pADO->FieldByName("PARA_ID")->AsString;
+                TPrcsParam* pObj = FLists.Find(PARA_ID);
+                if (pObj)
+                {
+                    // 메모리에 파라미터가 존재해야 한다
+                    TPrcsParamClct* pSub = new TPrcsParamClct();
+                    if (pSub)
+                    {
+                        pSub->CLCT_SYST_CD = pADO->FieldByName("CLCT_SYST_CD")->AsString;
+                        pSub->FUSN_PRRT    = pADO->FieldByName("FUSN_PRRT")->AsInteger;
+                        pSub->FUSN_WGHT    = pADO->FieldByName("FUSN_WGHT")->AsFloat;
+
+                        pObj->CLCTS.Push(pSub->FUSN_PRRT, pSub);
+                    }
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TPrcsParamManager::LoadParamDetl", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TPrcsParamManager::LoadParamDetl", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TPrcsParamManager::IsUsing(String AParamId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT COUNT(1) AS USE_CNT   \r\n"
+           "  FROM TB_LINK               \r\n"
+           " WHERE PARA_ID = :p01        \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AParamId;
+
+			pADO->Open();
+            int nUseCnt = pADO->FieldByName("USE_CNT")->AsInteger;
+            if (nUseCnt == 0) return false;
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TPrcsParamManager::IsUsing", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TPrcsParamManager::IsUsing", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TPrcsParamManager::GetNewPrcsParamId(String &ANewPraramId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT NVL(MAX(LINK_ID), 999999999) + 1 AS NEWID  \r\n"
+           "  FROM TB_LINK_PARA_STUP                          \r\n";
+
+    ANewPraramId = "";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            ANewPraramId = pADO->FieldByName("NEWID")->AsString;
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TPrcsParamManager::GetNewPrcsParamId", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TPrcsParamManager::GetNewPrcsParamId", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TPrcsParamManager::DeleteData(TPrcsParam* AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "DELETE TB_LINK_PARA_CLCT_SYST  \r\n"
+           " WHERE LINK_ID = :p01          \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->PARA_ID;
+			pADO->ExecSQL();
+
+        sQry = "DELETE TB_LINK_PARA_DETL  \r\n"
+               " WHERE LINK_ID = :p01     \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->PARA_ID;
+			pADO->ExecSQL();
+
+        sQry = "DELETE TB_LINK_PARA_STUP  \r\n"
+               " WHERE LINK_ID = :p01     \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->PARA_ID;
+			pADO->ExecSQL();
+
+            AObj->DEL_YN = "Y";
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TPrcsParamManager::DeleteData", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TPrcsParamManager::DeleteData", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 95 - 0
COMMON/CDS/CDSPrcsParamF.h

@@ -0,0 +1,95 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSPrcsParamFH
+#define CDSPrcsParamFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+
+/*
+* Sub Info Class
+*/
+class TPrcsParamClct
+{
+public:
+    TPrcsParamClct() {};
+    virtual ~TPrcsParamClct() {};
+
+public:
+    String     CLCT_SYST_CD;    //	N	VARCHAR2(7)	N			수집 시스템 코드
+    int        FUSN_PRRT;       //	N	NUMBER(2)	Y	0		퓨전 우선순위
+    float      FUSN_WGHT;       //	N	NUMBER(5,2)	Y	0		퓨전 가중치
+};
+//---------------------------------------------------------------------------
+
+/*
+* Info Class
+*/
+class TPrcsParam
+{
+public:
+    TPrcsParam();
+    virtual ~TPrcsParam();
+    void Clear();
+
+public:
+    String     PARA_ID;
+    String     PARA_NM;
+
+    String     FLTR_MTHD_CD;    //	N	VARCHAR2(7)	Y			필터링 방법 코드
+    String     FUSN_MTHD_CD;    //	N	VARCHAR2(7)	Y			퓨전 방법 코드
+    String     ADJS_MTHD_CD;    //	N	VARCHAR2(7)	Y			보정 방법 코드
+    String     SMTH_MTHD_CD;    //	N	VARCHAR2(7)	Y			평활화 방법 코드
+
+    int        FLTR_MIN_TFVL;               //	N	NUMBER(6)	Y	0		필터링 최소 교통량
+    int        FLTR_MAX_TFVL;               //	N	NUMBER(6)	Y	0		필터링 최대 교통량
+    int        FLTR_LWST_SPED;              //	N	NUMBER(3)	Y	0		필터링 최저 속도
+    int        FLTR_HGHS_SPED;              //	N	NUMBER(3)	Y	0		필터링 최고 속도
+    float      ADJS_WGHT_AVRG_PRE_1CYCL;    //	N	NUMBER(5,2)	Y	0		보정 가중치 평균 이전 1주기
+    float      ADJS_WGHT_AVRG_PRE_2CYCL;    //	N	NUMBER(5,2)	Y	0		보정 가중치 평균 이전 2주기
+    float      ADJS_WGHT_AVRG_PRE_3CYCL;    //	N	NUMBER(5,2)	Y	0		보정 가중치 평균 이전 3주기
+    String     ADJS_15M_PTRN_APLY_YN;       //	N	CHAR(1)	    Y	'N'		보정 15분 패턴 적용 여부
+    int        ADJS_SHTR_MISS_DECS_CYCL;    //	N	NUMBER(2)	Y			보정 단기 결측 판단 주기
+    float      SMTH_LWST_SPED_FCTR;         //	N	NUMBER(3,2)	Y	0		평활화 최저 속도 계수
+    float      SMTH_HGHS_SPED_FCTR;         //	N	NUMBER(3,2)	Y	0		평활화 최고 속도 계수
+    float      SMTH_WGHT_AVRG_PRST;         //	N	NUMBER(5,2)	Y	0		평활화 가중치 평균 현재
+    float      SMTH_WGHT_AVRG_PRE_1CYCL;    //	N	NUMBER(5,2)	Y	0		평활화 가중치 평균 이전 1주기
+    float      SMTH_WGHT_AVRG_PRE_2CYCL;    //	N	NUMBER(5,2)	Y	0		평활화 가중치 평균 이전 2주기
+
+    IntMap<TPrcsParamClct>  CLCTS;  //우선순위순서로 소팅되서 들어감
+
+    String     DEL_YN;
+    String     ToString();
+};
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+class TPrcsParamManager
+{
+public:
+    TPrcsParamManager();
+    virtual ~TPrcsParamManager();
+
+public:
+    ListMap<TPrcsParam>   FLists;
+
+public:
+    void Clear();
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadParam(TADOConnection *ADbConn=NULL);
+    bool LoadParamDetl(TADOConnection *ADbConn=NULL);
+    bool GetNewPrcsParamId(String &ANewPraramId, TADOConnection *ADbConn=NULL);
+    bool IsUsing(String AParamId, TADOConnection *ADbConn=NULL);
+    bool DeleteData(TPrcsParam* AObj, TADOConnection *ADbConn=NULL);
+
+};
+//---------------------------------------------------------------------------
+extern TPrcsParamManager *PrcsParamManager;
+//---------------------------------------------------------------------------
+#endif

+ 229 - 0
COMMON/CDS/CDSProcessF.cpp

@@ -0,0 +1,229 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSProcessF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsProcess::TItsProcess()
+{
+    FCommStatus = "CMS2";     // 장비 통신상태값
+    FDoorStatus = "CMS2";     // 장비 Door상태값
+
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	FMEM_DEL   = "N";
+
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsProcess::Clear()
+{
+#if 0
+    SYST_ID   = "";
+    SYST_TYPE = "";
+    SYST_NMBR = "";
+    SYST_NM   = "";
+    SYST_IP_1 = "";
+    SYST_IP_2 = "";
+    PRGM_PORT = "";
+    HOST_NM   = "";
+    OS_NM     = "";
+    DEL_YN    = "N";
+    STTS_DSPL_YN = "N";
+
+    CommStatus = "CMS2";   // 장비 통신상태값
+    DoorStatus = "CMS2";   // 장비 Door상태값
+
+	GridIndex  = -1;	    // 그리드 인덱스
+
+#endif
+}
+//---------------------------------------------------------------------------
+TItsProcess::~TItsProcess()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsProcessManager *ItsProcessManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Process Manager
+*/
+TItsProcessManager::TItsProcessManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsProcessManager::~TItsProcessManager()
+{
+}
+//---------------------------------------------------------------------------
+bool TItsProcessManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    return LoadProcessMaster(ADbConn);
+}
+//---------------------------------------------------------------------------
+bool TItsProcessManager::LoadProcessMaster(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.SYST_ID  ,    \r\n"
+           "       A.SYST_TYPE,    \r\n"
+           "       A.SYST_NMBR,    \r\n"
+           "       A.SYST_NM  ,    \r\n"
+           "       A.SYST_IP_1,    \r\n"
+           "       A.SYST_IP_2,    \r\n"
+           "       A.PRGM_PORT,    \r\n"
+           "       A.HOST_NM  ,    \r\n"
+           "       A.OS_NM    ,    \r\n"
+           "       A.STTS_DSPL_YN, \r\n"
+           "       A.DEL_YN        \r\n"
+           "  FROM TB_UNIT_SYST A  \r\n";
+//           " ORDER BY A.SYST_ID    \r\n";
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsProcess *pObj = new TItsProcess();
+
+                pObj->SYST_ID    = pADO->FieldByName("SYST_ID")->AsString;
+                pObj->SYST_TYPE  = pADO->FieldByName("SYST_TYPE")->AsString;
+                pObj->SYST_NMBR  = pADO->FieldByName("SYST_NMBR")->AsString;
+                pObj->SYST_NM    = pADO->FieldByName("SYST_NM")->AsString;
+                pObj->SYST_IP_1  = pADO->FieldByName("SYST_IP_1")->AsString;
+                pObj->SYST_IP_2  = pADO->FieldByName("SYST_IP_2")->AsString;
+                pObj->PRGM_PORT  = pADO->FieldByName("PRGM_PORT")->AsString;
+                pObj->HOST_NM    = pADO->FieldByName("HOST_NM")->AsString;
+                pObj->OS_NM      = pADO->FieldByName("OS_NM")->AsString;
+                pObj->DEL_YN     = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->STTS_DSPL_YN = pADO->FieldByName("STTS_DSPL_YN")->AsString;
+
+                pObj->GridIndex  = -1;
+                pObj->CommStatus = "0";
+
+				FLists.Push(pObj->SYST_ID, pObj);
+                pObj->Completed = true;
+                pObj->MEM_DEL   = "N";
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsProcessManager::LoadProcessMaster", String(E.ClassName()), E.Message, sQry);
+            bResult = false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsProcessManager::LoadProcessMaster", String(exception.ClassName()), exception.Message, sQry);
+            bResult = false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return bResult;
+}
+//---------------------------------------------------------------------------
+bool TItsProcessManager::LoadProcessStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT SYST_ID,                                                \r\n"
+           "       DECODE(SYST_STTS_CD, 'SPS1', '1',                       \r\n"
+           "                            'SPS2', '1',                       \r\n"
+           "                            'SPS4', '2',                       \r\n"
+           "                                    '0') AS COMMSTATUS         \r\n"
+           "  FROM TB_UNIT_SYST_STTS                                       \r\n"
+           " WHERE UPDT_DT >= TO_CHAR(SYSDATE-10/1440, 'YYYYMMDDHH24MISS') \r\n";
+    try
+    {
+        TItsProcess *pProcess = NULL;
+
+        ItsProcessManager->FLists.Lock();
+        try
+        {
+            FOR_STL(TItsProcess*, pObj, ItsProcessManager->FLists)
+            {
+                pObj->FCommStatus = "0";
+            }
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sId = pADO->FieldByName("SYST_ID")->AsString;
+                pProcess = ItsProcessManager->FLists.Find(sId);
+                if (!pProcess) continue;
+                
+                pProcess->FCommStatus = pADO->FieldByName("COMMSTATUS")->AsString;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsProcessManager::LoadProcessStatusFromDb", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsProcessManager::LoadProcessStatusFromDb", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        ItsProcessManager->FLists.UnLock();
+    }
+
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+

+ 87 - 0
COMMON/CDS/CDSProcessF.h

@@ -0,0 +1,87 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSProcessFH
+#define CDSProcessFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  Process class
+*/
+class TItsProcess
+{
+public:
+    TItsProcess();
+    virtual ~TItsProcess();
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+    int     FEditMode;
+
+public:
+    String SYST_ID;
+    String SYST_TYPE;
+    String SYST_NMBR;
+    String SYST_NM;
+    String SYST_IP_1;
+    String SYST_IP_2;
+    String PRGM_PORT;
+    String HOST_NM;
+    String OS_NM;
+    String DEL_YN;
+    String STTS_DSPL_YN;
+
+
+public:
+    String FMEM_DEL;
+    String FCommStatus;     // 장비 통신상태값
+    String FDoorStatus;     // 장비 Door상태값
+
+	int    FGridIndex;	    // 메인폼에 뿌려지는 그리드 인덱스
+
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+
+
+    __property String MEM_DEL    = {read = FMEM_DEL, write = FMEM_DEL };
+    __property String CommStatus = {read = FCommStatus, write = FCommStatus };
+    __property String DoorStatus = {read = FDoorStatus, write = FDoorStatus };
+};
+//---------------------------------------------------------------------------
+
+/*
+* Process Manager
+*/
+class TItsProcessManager
+{
+public:
+    TItsProcessManager();
+    virtual ~TItsProcessManager();
+
+public:
+    ListMap<TItsProcess>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadProcessMaster(TADOConnection *ADbConn=NULL);
+
+    bool LoadProcessStatusFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsProcessManager *ItsProcessManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 357 - 0
COMMON/CDS/CDSRepeatCongestF.cpp

@@ -0,0 +1,357 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSRepeatCongestF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsRepeatCongest::TItsRepeatCongest()
+{
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsRepeatCongest::Clear()
+{
+#if 0
+    //FIFSC_ID                = ""; // 정보제공구간 ID
+    FSTAT_YM                = ""; // 통계 년월
+    FDAY_TYPE_CD            = ""; // 요일 유형 코드
+    FCNFS_STRT_HM           = ""; // 혼잡 시작 시분
+    FCNFS_END_HM            = ""; // 혼잡 종료 시분
+    FAVRG_SPED              = ""; // 평균 속도
+    FAVRG_TRVL_HH           = ""; // 평균 통행 시간
+    FDCSN_YN                = ""; // 확정 여부
+    FCRTN_YMD               = ""; // 생성 일자
+    FREPT_CNGS_SECT_ORGN_CD = ""; // 반복 정체 구간 원본 코드
+#endif
+}
+//---------------------------------------------------------------------------
+TItsRepeatCongest::~TItsRepeatCongest()
+{
+}
+//---------------------------------------------------------------------------
+void TItsRepeatCongest::SetValue(String &AOrgValue, String AValue)
+{
+    if (AOrgValue != AValue)
+    {
+        AOrgValue = AValue;
+        if (FCompleted) FModified = true;
+    }
+}
+//---------------------------------------------------------------------------
+void TItsRepeatCongest::SetFIFSC_ID(String AValue)
+{
+    SetValue(FIFSC_ID, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsRepeatCongest::SetFSTAT_YM(String AValue)
+{
+    SetValue(FSTAT_YM, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsRepeatCongest::SetFDAY_TYPE_CD(String AValue)
+{
+    SetValue(FDAY_TYPE_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsRepeatCongest::SetFCNFS_STRT_HM(String AValue)
+{
+    SetValue(FCNFS_STRT_HM, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsRepeatCongest::SetFCNFS_END_HM(String AValue)
+{
+    SetValue(FCNFS_END_HM, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsRepeatCongest::SetFAVRG_SPED(String AValue)
+{
+    SetValue(FAVRG_SPED, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsRepeatCongest::SetFAVRG_TRVL_HH(String AValue)
+{
+    SetValue(FAVRG_TRVL_HH, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsRepeatCongest::SetFDCSN_YN(String AValue)
+{
+    SetValue(FDCSN_YN, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsRepeatCongest::SetFCRTN_YMD(String AValue)
+{
+    SetValue(FCRTN_YMD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsRepeatCongest::SetFREPT_CNGS_SECT_ORGN_CD(String AValue)
+{
+    SetValue(FREPT_CNGS_SECT_ORGN_CD, AValue);
+}
+//---------------------------------------------------------------------------
+
+
+
+//---------------------------------------------------------------------------
+TItsRepeatCongestManager *ItsRepeatCongestManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* RepeatCongest Manager
+*/
+TItsRepeatCongestManager::TItsRepeatCongestManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsRepeatCongestManager::~TItsRepeatCongestManager()
+{
+}
+//---------------------------------------------------------------------------
+bool TItsRepeatCongestManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                 \r\n"
+           "  FROM TB_REPT_CNGS_SECT \r\n";
+//           " ORDER BY IFSC_ID        \r\n";
+    try
+    {
+        FDataSeq = 0;
+
+        FLists.Lock();
+        FListsCnfm.Lock();
+
+        FLists.RemoveAll();
+        FListsCnfm.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsRepeatCongest *pRepeatCongest = new TItsRepeatCongest();
+
+                pRepeatCongest->FIFSC_ID		        = pADO->FieldByName("IFSC_ID")->AsString;                  // 정보제공구간 ID
+                pRepeatCongest->FSTAT_YM		        = pADO->FieldByName("CRTN_YMD")->AsString;                  // 통계 년월
+                pRepeatCongest->FDAY_TYPE_CD	        = pADO->FieldByName("DAY_TYPE_CD")->AsString;              // 요일 유형 코드
+                pRepeatCongest->FCNFS_STRT_HM	        = pADO->FieldByName("CNFS_STRT_HM")->AsString;             // 혼잡 시작 시분
+                pRepeatCongest->FCNFS_END_HM	        = pADO->FieldByName("CNFS_END_HM")->AsString;              // 혼잡 종료 시분
+                pRepeatCongest->FAVRG_SPED		        = pADO->FieldByName("AVRG_SPED")->AsString;                // 평균 속도
+                pRepeatCongest->FAVRG_TRVL_HH	        = pADO->FieldByName("AVRG_TRVL_HH")->AsString;             // 평균 통행 시간
+                pRepeatCongest->FDCSN_YN		        = pADO->FieldByName("DCSN_YN")->AsString;                  // 확정 여부
+                pRepeatCongest->FCRTN_YMD		        = pADO->FieldByName("CRTN_YMD")->AsString;                 // 생성 일자
+                pRepeatCongest->FREPT_CNGS_SECT_ORGN_CD	= pADO->FieldByName("REPT_CNGS_SECT_ORGN_CD")->AsString;   // 반복 정체 구간 원본 코드
+
+				if( pRepeatCongest->FDCSN_YN != "Y" )
+					FLists.Push(String(FDataSeq++), pRepeatCongest);
+				else
+					FListsCnfm.Push(String(FDataSeq++), pRepeatCongest);
+
+                pRepeatCongest->Completed = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsRepeatCongestManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsRepeatCongestManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+        FListsCnfm.UnLock();
+    }
+
+#if 1
+    return bResult;
+#else
+    return LoadFromDbWthrCnfm(ADbConn);
+#endif
+}
+//---------------------------------------------------------------------------
+
+bool TItsRepeatCongestManager::LoadFromDbWthr(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                      \r\n"
+           "  FROM TB_REPT_CNGS_SECT_WTHR \r\n";
+//           " ORDER BY IFSC_ID             \r\n";
+    try
+    {
+        FDataSeqWthr = 0;
+
+        FListsWthr.Lock();
+        FListsCnfmWthr.Lock();
+
+        FListsWthr.RemoveAll();
+        FListsCnfmWthr.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsRepeatCongestWthr *pRepeatCongest = new TItsRepeatCongestWthr();
+
+                pRepeatCongest->IFSC_ID		           = pADO->FieldByName("IFSC_ID")->AsString;                  // 정보제공구간 ID
+                pRepeatCongest->CRTN_YMD		       = pADO->FieldByName("CRTN_YMD")->AsString;                 // 생성 일자
+                pRepeatCongest->WTHR_TYPE_CD	       = pADO->FieldByName("WTHR_TYPE_CD")->AsString;             // 기상 코드
+                pRepeatCongest->CNFS_STRT_HM	       = pADO->FieldByName("CNFS_STRT_HM")->AsString;             // 혼잡 시작 시분
+                pRepeatCongest->CNFS_END_HM	           = pADO->FieldByName("CNFS_END_HM")->AsString;              // 혼잡 종료 시분
+                pRepeatCongest->AVRG_SPED		       = pADO->FieldByName("AVRG_SPED")->AsString;                // 평균 속도
+                pRepeatCongest->AVRG_TRVL_HH	       = pADO->FieldByName("AVRG_TRVL_HH")->AsString;             // 평균 통행 시간
+                pRepeatCongest->DCSN_YN		           = pADO->FieldByName("DCSN_YN")->AsString;                  // 확정 여부
+                pRepeatCongest->REPT_CNGS_SECT_ORGN_CD = pADO->FieldByName("REPT_CNGS_SECT_ORGN_CD")->AsString;   // 반복 정체 구간 원본 코드
+
+				if( pRepeatCongest->DCSN_YN != "Y" )
+					FListsWthr.Push(String(FDataSeqWthr++), pRepeatCongest);
+				else
+					FListsCnfmWthr.Push(String(FDataSeqWthr++), pRepeatCongest);
+
+                pRepeatCongest->Completed = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsRepeatCongestManager::LoadFromDbWthr", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsRepeatCongestManager::LoadFromDbWthr", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FListsWthr.UnLock();
+        FListsCnfmWthr.UnLock();
+    }
+
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+bool TItsRepeatCongestManager::LoadFromDbWthrCnfm(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                      \r\n"
+           "  FROM TB_REPT_CNGS_SECT_WTHR \r\n"
+           " WHERE DCSN_YN = 'Y'          \r\n";
+//           " ORDER BY IFSC_ID             \r\n";
+    try
+    {
+        FDataSeqWthr = 0;
+
+        FListsWthr.Lock();
+        FListsCnfmWthr.Lock();
+
+        FListsWthr.RemoveAll();
+        FListsCnfmWthr.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsRepeatCongestWthr *pRepeatCongest = new TItsRepeatCongestWthr();
+
+                pRepeatCongest->IFSC_ID		           = pADO->FieldByName("IFSC_ID")->AsString;                  // 정보제공구간 ID
+                pRepeatCongest->CRTN_YMD		       = pADO->FieldByName("CRTN_YMD")->AsString;                 // 생성 일자
+                pRepeatCongest->WTHR_TYPE_CD	       = pADO->FieldByName("WTHR_TYPE_CD")->AsString;             // 기상 코드
+                pRepeatCongest->CNFS_STRT_HM	       = pADO->FieldByName("CNFS_STRT_HM")->AsString;             // 혼잡 시작 시분
+                pRepeatCongest->CNFS_END_HM	           = pADO->FieldByName("CNFS_END_HM")->AsString;              // 혼잡 종료 시분
+                pRepeatCongest->AVRG_SPED		       = pADO->FieldByName("AVRG_SPED")->AsString;                // 평균 속도
+                pRepeatCongest->AVRG_TRVL_HH	       = pADO->FieldByName("AVRG_TRVL_HH")->AsString;             // 평균 통행 시간
+                pRepeatCongest->DCSN_YN		           = pADO->FieldByName("DCSN_YN")->AsString;                  // 확정 여부
+                pRepeatCongest->REPT_CNGS_SECT_ORGN_CD = pADO->FieldByName("REPT_CNGS_SECT_ORGN_CD")->AsString;   // 반복 정체 구간 원본 코드
+
+				if( pRepeatCongest->DCSN_YN != "Y" )
+					FListsWthr.Push(String(FDataSeqWthr++), pRepeatCongest);
+				else
+					FListsCnfmWthr.Push(String(FDataSeqWthr++), pRepeatCongest);
+
+                pRepeatCongest->Completed = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsRepeatCongestManager::LoadFromDbWthrCnfm", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsRepeatCongestManager::LoadFromDbWthrCnfm", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FListsWthr.UnLock();
+        FListsCnfmWthr.UnLock();
+    }
+
+    return bResult;
+}
+//---------------------------------------------------------------------------
+

+ 150 - 0
COMMON/CDS/CDSRepeatCongestF.h

@@ -0,0 +1,150 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSRepeatCongestFH
+#define CDSRepeatCongestFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  RepeatCongest class
+*/
+class TItsRepeatCongest
+{
+public:
+    TItsRepeatCongest();
+    virtual ~TItsRepeatCongest();
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String FIFSC_ID;                // 정보제공구간 ID
+    String FSTAT_YM;                // 통계 년월
+    String FDAY_TYPE_CD;            // 요일 유형 코드
+    String FCNFS_STRT_HM;           // 혼잡 시작 시분
+    String FCNFS_END_HM;            // 혼잡 종료 시분
+    String FAVRG_SPED;              // 평균 속도
+    String FAVRG_TRVL_HH;           // 평균 통행 시간
+    String FDCSN_YN;                // 확정 여부
+    String FCRTN_YMD;               // 생성 일자
+    String FREPT_CNGS_SECT_ORGN_CD;	// 반복 정체 구간 원본 코드
+
+    void SetValue(String &AOrgValue, String AValue);
+
+#if 0
+  IFSC_ID                NUMBER(10) NOT NULL,
+  STAT_YM                VARCHAR2(6) NOT NULL,
+  DAY_TYPE_CD            VARCHAR2(7) NOT NULL,
+  CNFS_STRT_HM           VARCHAR2(4) NOT NULL,
+  CNFS_END_HM            VARCHAR2(4),
+  AVRG_SPED              NUMBER(3) DEFAULT 0,
+  AVRG_TRVL_HH           NUMBER(6) DEFAULT 0,
+  DCSN_YN                CHAR(1) DEFAULT 'N',
+  CRTN_YMD               VARCHAR2(8),
+  REPT_CNGS_SECT_ORGN_CD VARCHAR2(7)
+
+comment on table TB_REPT_CNGS_SECT  is '반복 정체 구간';
+comment on column TB_REPT_CNGS_SECT.ifsc_id  is '정보제공구간 ID';
+comment on column TB_REPT_CNGS_SECT.stat_ym  is '통계 년월';
+comment on column TB_REPT_CNGS_SECT.day_type_cd  is '요일 유형 코드';
+comment on column TB_REPT_CNGS_SECT.cnfs_strt_hm  is '혼잡 시작 시분';
+comment on column TB_REPT_CNGS_SECT.cnfs_end_hm  is '혼잡 종료 시분';
+comment on column TB_REPT_CNGS_SECT.avrg_sped  is '평균 속도';
+comment on column TB_REPT_CNGS_SECT.avrg_trvl_hh  is '평균 통행 시간';
+comment on column TB_REPT_CNGS_SECT.dcsn_yn  is '확정 여부';
+comment on column TB_REPT_CNGS_SECT.crtn_ymd  is '생성 일자';
+comment on column TB_REPT_CNGS_SECT.rept_cngs_sect_orgn_cd  is '반복 정체 구간 원본 코드';
+#endif
+
+protected:
+    void SetFIFSC_ID(String AValue);                // 정보제공구간 ID
+    void SetFSTAT_YM(String AValue);                // 통계 년월
+    void SetFDAY_TYPE_CD(String AValue);            // 요일 유형 코드
+    void SetFCNFS_STRT_HM(String AValue);           // 혼잡 시작 시분
+    void SetFCNFS_END_HM(String AValue);            // 혼잡 종료 시분
+    void SetFAVRG_SPED(String AValue);              // 평균 속도
+    void SetFAVRG_TRVL_HH(String AValue);           // 평균 통행 시간
+    void SetFDCSN_YN(String AValue);                // 확정 여부
+    void SetFCRTN_YMD(String AValue);               // 생성 일자
+    void SetFREPT_CNGS_SECT_ORGN_CD(String AValue);	// 반복 정체 구간 원본 코드
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    __property String IFSC_ID                = {read = FIFSC_ID,                write = SetFIFSC_ID };                // 정보제공구간 ID
+    __property String STAT_YM                = {read = FSTAT_YM,                write = SetFSTAT_YM };                // 통계 년월
+    __property String DAY_TYPE_CD            = {read = FDAY_TYPE_CD,            write = SetFDAY_TYPE_CD };            // 요일 유형 코드
+    __property String CNFS_STRT_HM           = {read = FCNFS_STRT_HM,           write = SetFCNFS_STRT_HM };           // 혼잡 시작 시분
+    __property String CNFS_END_HM            = {read = FCNFS_END_HM,            write = SetFCNFS_END_HM };            // 혼잡 종료 시분
+    __property String AVRG_SPED              = {read = FAVRG_SPED,              write = SetFAVRG_SPED };              // 평균 속도
+    __property String AVRG_TRVL_HH           = {read = FAVRG_TRVL_HH,           write = SetFAVRG_TRVL_HH };           // 평균 통행 시간
+    __property String DCSN_YN                = {read = FDCSN_YN,                write = SetFDCSN_YN };                // 확정 여부
+    __property String CRTN_YMD               = {read = FCRTN_YMD,               write = SetFCRTN_YMD };               // 생성 일자
+    __property String REPT_CNGS_SECT_ORGN_CD = {read = FREPT_CNGS_SECT_ORGN_CD, write = SetFREPT_CNGS_SECT_ORGN_CD };	// 반복 정체 구간 원본 코드
+
+};
+//---------------------------------------------------------------------------
+
+class TItsRepeatCongestWthr
+{
+public:
+    TItsRepeatCongestWthr() {};
+    virtual ~TItsRepeatCongestWthr() {};
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String IFSC_ID;                 // 정보제공구간 ID
+    String CRTN_YMD;                // 생성 일자
+    String WTHR_TYPE_CD;            // 기상 코드
+    String CNFS_STRT_HM;            // 혼잡 시작 시분
+    String CNFS_END_HM;             // 혼잡 종료 시분
+    String AVRG_SPED;               // 평균 속도
+    String AVRG_TRVL_HH;            // 평균 통행 시간
+    String DCSN_YN;                 // 확정 여부
+    String REPT_CNGS_SECT_ORGN_CD;	// 반복 정체 구간 원본 코드
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+};
+//---------------------------------------------------------------------------
+
+/*
+* RepeatCongest Manager
+*/
+class TItsRepeatCongestManager
+{
+public:
+    TItsRepeatCongestManager();
+    virtual ~TItsRepeatCongestManager();
+
+public:
+    ListMap<TItsRepeatCongest>      FLists;
+    ListMap<TItsRepeatCongest>      FListsCnfm;
+    int                             FDataSeq;
+
+    ListMap<TItsRepeatCongestWthr>  FListsWthr;
+    ListMap<TItsRepeatCongestWthr>  FListsCnfmWthr;
+    int                             FDataSeqWthr;
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadFromDbWthr(TADOConnection *ADbConn=NULL);
+    bool LoadFromDbWthrCnfm(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsRepeatCongestManager *ItsRepeatCongestManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 427 - 0
COMMON/CDS/CDSRoadF.cpp

@@ -0,0 +1,427 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSRoadF.h"
+#include "CDSTrafficF.h"
+#include "ITSUtilF.h"
+#include "AppGlobalF.h"
+#include "CDSLinkF.h"
+#include "CDSIfscF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsRoad::TItsRoad()
+{
+    FPolyLine = NULL;
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsRoad::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsRoad::~TItsRoad()
+{
+}
+//---------------------------------------------------------------------------
+void TItsRoad::InitTraffic()
+{
+    TRAF->InitTraffic();
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsRoadManager *ItsRoadManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Road Manager
+*/
+TItsRoadManager::TItsRoadManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsRoadManager::~TItsRoadManager()
+{
+}
+//---------------------------------------------------------------------------
+void TItsRoadManager::InitTraffic()
+{
+    try
+    {
+        FLists.Lock();
+
+        FOR_STL(TItsRoad*, pObj, FLists)
+        {
+            pObj->InitTraffic();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+}
+//---------------------------------------------------------------------------
+bool TItsRoadManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    FLists.RemoveAll();
+
+    return (LoadRoad(ADbConn) && LoadRoadList(ADbConn));
+}
+//---------------------------------------------------------------------------
+bool TItsRoadManager::LoadRoad(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT ROAD_ID      ,                              \r\n"
+           "       ROAD_NAME    ,                              \r\n"
+           "       DRCT_CD      ,                              \r\n"
+           "       STRT_NM      ,                              \r\n"
+           "       END_NM       ,                              \r\n"
+           "       DEL_YN       ,                              \r\n"
+           "       SECT_LNGT    ,                              \r\n"
+           "       F_NODE_ID    ,                              \r\n"
+           "       T_NODE_ID    ,                              \r\n"
+           "       SECT_GRAD_CD ,                              \r\n"
+           "       AREA_CD      ,                              \r\n"
+           "       DECODE(AREA_CD, 'LAT001', 'Y', 'N') REGN_YN \r\n"
+           "  FROM TB_ROAD                                     \r\n"
+           " WHERE DEL_YN = 'N'                                \r\n";
+//           " ORDER BY ROAD_ID                                  \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsRoad *pRoad = new TItsRoad();
+
+                pRoad->ROAD_ID      = pADO->FieldByName("ROAD_ID")->AsString;
+                pRoad->ROAD_NAME    = pADO->FieldByName("ROAD_NAME")->AsString.Trim();
+                pRoad->DRCT_CD      = pADO->FieldByName("DRCT_CD")->AsString;
+                pRoad->STRT_NM      = pADO->FieldByName("STRT_NM")->AsString.Trim();
+                pRoad->END_NM       = pADO->FieldByName("END_NM")->AsString.Trim();
+                pRoad->DEL_YN       = pADO->FieldByName("DEL_YN")->AsString;
+                pRoad->SECT_LNGT    = pADO->FieldByName("SECT_LNGT")->AsString;
+                pRoad->F_NODE_ID    = pADO->FieldByName("F_NODE_ID")->AsString;
+                pRoad->T_NODE_ID    = pADO->FieldByName("T_NODE_ID")->AsString;
+                pRoad->SECT_GRAD_CD = pADO->FieldByName("SECT_GRAD_CD")->AsString;
+                pRoad->AREA_CD      = pADO->FieldByName("AREA_CD")->AsString;
+                pRoad->REGN_YN      = pADO->FieldByName("REGN_YN")->AsString;
+
+				FLists.Push(pRoad->ROAD_ID, pRoad);
+                pRoad->Completed = true;
+
+                pRoad->TRAF = new TItsTraffic(3, pRoad->ROAD_ID, (void*)pRoad);
+                ItsTrafficManager->FLists.Push(pRoad->ROAD_ID, pRoad->TRAF);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsRoadManager::LoadRoad", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsRoadManager::LoadRoad", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsRoadManager::LoadRoadList(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT ROAD_ID, IFSC_ID, ORD \r\n"
+           "  FROM TB_ROAD_IFSC_RLTN     \r\n";
+//           " ORDER BY ROAD_ID, ORD       \r\n";
+    try
+    {
+        FLists.Lock();
+        TItsRoad *pRoad = NULL;
+
+        TItsIfsc *pIfsc;
+        TItsLink *pLink;
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sROAD_ID = pADO->FieldByName("ROAD_ID")->AsString;
+                pRoad = FLists.Find(sROAD_ID);
+                if (!pRoad) continue;
+
+                String sIFSC_ID = pADO->FieldByName("IFSC_ID")->AsString;
+				nORD            = pADO->FieldByName("ORD")->AsInteger;
+                pRoad->FSubLists.insert(std::make_pair<int, String>(nORD, sIFSC_ID));
+
+                pIfsc = ItsIfscManager->FLists.Find(sIFSC_ID);
+                if (pIfsc)
+                {
+                    pIfsc->ROAD_ID = sROAD_ID;
+
+                    std::map<int, String>::iterator itPos2;
+                    for(itPos2 = pIfsc->FSubLists.begin(); itPos2 != pIfsc->FSubLists.end(); ++itPos2)
+                    {
+                        String sLinkId = itPos2->second;
+                        pLink = ItsLinkManager->FLists.Find(sLinkId);
+                        if (pLink) pLink->ROAD_ID = sROAD_ID;
+                    }
+                }
+
+#if 0
+				String sORD     = pADO->FieldByName("ORD")->AsString;
+                TSubRoad *pSubRoad = new TSubRoad();
+                pSubRoad->FIFSC_ID = sIFSC_ID;
+                pRoad->FSubLists.Push(sORD, pSubRoad);
+#endif
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsRoadManager::LoadRoadList", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsRoadManager::LoadRoadList", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return LoadCoordFromDb(ADbConn);
+    //return true;
+}
+//---------------------------------------------------------------------------
+bool TItsRoadManager::LoadCoordFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT ROAD_ID, LEVL, ORD, X_CRDN, Y_CRDN  \r\n"
+           "  FROM TB_ROAD_VRTX                        \r\n"
+           " WHERE LEVL = 1                            \r\n"
+           " ORDER BY ROAD_ID, LEVL, ORD               \r\n";
+#else
+    sQry = "SELECT A.*                     \r\n"
+           "  FROM TB_ROAD_GIS A,          \r\n"
+           "       TB_ROAD     B           \r\n"
+           " WHERE A.ROAD_ID = B.ROAD_ID   \r\n";
+#endif
+
+    TItsRoad* pObj;
+    TStringList *sl = NULL;
+    int ii;
+    sl = new TStringList;
+    sl->Delimiter = ',';
+    sl->StrictDelimiter = true;
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String ROAD_ID = pADO->FieldByName("ROAD_ID")->AsString;
+                pObj = FLists.Find(ROAD_ID);
+                if (!pObj) continue;
+
+                int    FPointCnt = pADO->FieldByName("POINTCNT")->AsInteger;
+                String FVertex   = pADO->FieldByName("VERTEX")->AsString;
+
+                sl->DelimitedText = FVertex;
+                if (sl->Count != FPointCnt * 2)
+                {
+                    continue;
+                }
+                for (ii = 0; ii < sl->Count-1; )
+                {
+                    TItsCoord *pCoord = new TItsCoord();
+                    pCoord->X = sl->Strings[ii].ToDouble();
+                    pCoord->Y = sl->Strings[ii+1].ToDouble();
+                    pObj->Coords.Push(pObj->Coords.Size(), pCoord);
+
+                    if (pCoord->X < pObj->bounds.minX) pObj->bounds.minX = pCoord->X;
+                    if (pCoord->Y < pObj->bounds.minY) pObj->bounds.minY = pCoord->Y;
+                    if (pCoord->X > pObj->bounds.maxX) pObj->bounds.maxX = pCoord->X;
+                    if (pCoord->Y > pObj->bounds.maxY) pObj->bounds.maxY = pCoord->Y;
+
+                    ii += 2;
+                }
+                continue;
+
+				TItsCoord *pCoord = new TItsCoord();
+
+                pCoord->X = pADO->FieldByName("X_CRDN")->AsFloat;
+                pCoord->Y = pADO->FieldByName("Y_CRDN")->AsFloat;
+
+				pObj->Coords.Push(pObj->Coords.Size(), pCoord);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsRoadManager::LoadCoordFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsRoadManager::LoadCoordFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+        if (sl) delete sl;
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsRoadManager::LoadTraffic(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    InitTraffic();
+
+    sQry = "SELECT A.ROAD_ID, PRCN_DT, TFVL, SPED, PTRN_SPED, OCPY_RATE, TRVL_HH, CMTR_GRAD_CD, DATA_NUM, \r\n"
+           "       (CASE WHEN PRCN_DT <= TO_CHAR(SYSDATE - 10/1440, 'YYYYMMDDHH24MISS')                   \r\n"
+           "             THEN 'Y' ELSE 'N' END) AS MISSING,                                               \r\n"
+           "       (CASE WHEN PRCN_DT >= TO_CHAR(SYSDATE - 15/1440, 'YYYYMMDDHH24MISS')                   \r\n"
+           "             THEN 'Y' ELSE 'N' END) AS LASTANS,                                               \r\n"
+           "       (SELECT MAX(PRCN_DT) FROM TB_ROAD_TRAF) MPRCN_DT                                       \r\n"
+           "  FROM TB_ROAD_TRAF A, TB_ROAD B                                                              \r\n"
+           " WHERE A.ROAD_ID = B.ROAD_ID                                                                  \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String ID = pADO->FieldByName("ROAD_ID")->AsString;
+                TItsRoad *pObj = FLists.Find(ID);
+                if (!pObj) continue;
+
+                pObj->TRAF->PRCN_DT      = pADO->FieldByName("PRCN_DT")->AsString;
+                pObj->TRAF->TFVL         = pADO->FieldByName("TFVL")->AsInteger;
+                pObj->TRAF->SPED         = pADO->FieldByName("SPED")->AsInteger;
+                pObj->TRAF->OCPY_RATE    = pADO->FieldByName("OCPY_RATE")->AsFloat;
+                pObj->TRAF->TRVL_HH      = pADO->FieldByName("TRVL_HH")->AsInteger;
+                pObj->TRAF->CMTR_GRAD_CD = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+				pObj->TRAF->MISSING      = pADO->FieldByName("MISSING")->AsString;       // 결측여부
+				pObj->TRAF->LASTANS      = pADO->FieldByName("LASTANS")->AsString;       // 최근 15분 이내 가공
+				pObj->TRAF->MPRCN_DT     = pADO->FieldByName("MPRCN_DT")->AsString;      // 가공시각(최신)
+                pObj->TRAF->DATA_NUM     = pADO->FieldByName("DATA_NUM")->AsInteger;
+                pObj->TRAF->PTRN_SPED    = pADO->FieldByName("PTRN_SPED")->AsInteger;
+
+                if      (pObj->TRAF->CMTR_GRAD_CD == "LTC1") pObj->TRAF->TRAF_GRAD = 1;
+                else if (pObj->TRAF->CMTR_GRAD_CD == "LTC2") pObj->TRAF->TRAF_GRAD = 2;
+                else if (pObj->TRAF->CMTR_GRAD_CD == "LTC3") pObj->TRAF->TRAF_GRAD = 3;
+                else                                         pObj->TRAF->TRAF_GRAD = 0;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsRoadManager::LoadTraffic", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsRoadManager::LoadTraffic", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 81 - 0
COMMON/CDS/CDSRoadF.h

@@ -0,0 +1,81 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSRoadFH
+#define CDSRoadFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+#include "CDSCoordF.h"
+#include "CDSTrafficF.h"
+#include "CDSBaseF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  ROAD class
+*/
+class TItsRoad : public TItsBaseId
+{
+public:
+    TItsRoad();
+    virtual ~TItsRoad();
+    void Clear();
+
+private:
+
+public:
+    String	ROAD_NAME;
+    String	DRCT_CD;
+    String	STRT_NM;
+    String	END_NM;
+    String	DEL_YN;
+    String	SECT_LNGT;
+    String	F_NODE_ID;
+    String	T_NODE_ID;
+    String	SECT_GRAD_CD;
+    String	REGN_YN;
+    String	AREA_CD;
+
+    TItsTraffic        *TRAF;
+    TItsBounds          bounds;
+    IntMap<TItsCoord>   Coords;
+    void               *FPolyLine;
+
+    std::map<int, String>   FSubLists;
+
+protected:
+
+public:
+    void InitTraffic();
+};
+//---------------------------------------------------------------------------
+
+/*
+* Road Manager
+*/
+class TItsRoadManager
+{
+public:
+    TItsRoadManager();
+    virtual ~TItsRoadManager();
+
+public:
+    ListMap<TItsRoad>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadCoordFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadRoad(TADOConnection *ADbConn=NULL);
+    bool LoadRoadList(TADOConnection *ADbConn=NULL);
+
+    void InitTraffic();
+    bool LoadTraffic(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsRoadManager *ItsRoadManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 497 - 0
COMMON/CDS/CDSServiceLinkF.cpp

@@ -0,0 +1,497 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSIfscF.h"
+#include "CDSTrafficF.h"
+#include "ITSUtilF.h"
+#include "AppGlobalF.h"
+#include "CDSLinkF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsTrafficServiceLink::TItsTrafficServiceLink()
+{
+    TItsTrafficServiceLink("");
+}
+//---------------------------------------------------------------------------
+TItsTrafficServiceLink::TItsTrafficServiceLink(String AId)
+{
+    FIFSC_ID   = AId;
+    Clear();
+    FModified = false;
+    FCompleted= false;
+}
+//---------------------------------------------------------------------------
+void TItsTrafficServiceLink::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsTrafficServiceLink::~TItsTrafficServiceLink()
+{
+}
+//---------------------------------------------------------------------------
+void TItsTrafficServiceLink::SetValue(String &AOrgValue, String AValue)
+{
+    if (AOrgValue != AValue)
+    {
+        AOrgValue = AValue;
+        if (FCompleted) FModified = true;
+    }
+}
+//---------------------------------------------------------------------------
+void TItsTrafficServiceLink::SetFIFSC_ID(String AValue)
+{
+    SetValue(FIFSC_ID, AValue);
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsTrafficServiceLinkManager *ItsTrafficServiceLinkManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* TrafficLink Manager
+*/
+TItsTrafficServiceLinkManager::TItsTrafficServiceLinkManager()
+{
+    FFirst = true;
+}
+//---------------------------------------------------------------------------
+TItsTrafficServiceLinkManager::~TItsTrafficServiceLinkManager()
+{
+}
+//---------------------------------------------------------------------------
+bool TItsTrafficServiceLinkManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+//ITSUtil_Trace("TItsTrafficServiceLinkManager::LoadFromDb - start");
+
+    sQry = "SELECT A.IFSC_ID, PRCN_DT, TFVL, SPED, OCPY_RATE, TRVL_HH, CMTR_GRAD_CD, PTRN_SPED, DATA_NUM, \r\n"
+           "       (CASE WHEN PRCN_DT <= TO_CHAR(SYSDATE - 10/1440, 'YYYYMMDDHH24MISS')                   \r\n"
+           "             THEN 'Y' ELSE 'N' END) AS MISSING,                                               \r\n"
+           "       (CASE WHEN PRCN_DT >= TO_CHAR(SYSDATE - 15/1440, 'YYYYMMDDHH24MISS')                   \r\n"
+           "             THEN 'Y' ELSE 'N' END) AS LASTANS,                                               \r\n"
+           "       (SELECT MAX(PRCN_DT) FROM TB_LINK_TRAF) MPRCN_DT                                       \r\n"
+           "  FROM TB_IFSC_TRAF A, TB_IFSC B                                                              \r\n"
+           " WHERE A.IFSC_ID = B.IFSC_ID                                                                  \r\n";
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsTrafficServiceLink *pTrafficLink = new TItsTrafficServiceLink();
+
+                pTrafficLink->IFSC_ID      = pADO->FieldByName("IFSC_ID")->AsString;
+                pTrafficLink->PRCN_DT      = pADO->FieldByName("PRCN_DT")->AsString;
+                pTrafficLink->TFVL         = pADO->FieldByName("TFVL")->AsInteger;
+                pTrafficLink->SPED         = pADO->FieldByName("SPED")->AsInteger;
+                pTrafficLink->PTRN_SPED    = pADO->FieldByName("PTRN_SPED")->AsInteger;
+                pTrafficLink->OCPY_RATE    = pADO->FieldByName("OCPY_RATE")->AsFloat;
+                pTrafficLink->TRVL_HH      = pADO->FieldByName("TRVL_HH")->AsInteger;
+                pTrafficLink->CMTR_GRAD_CD = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+                pTrafficLink->DATA_NUM     = pADO->FieldByName("DATA_NUM")->AsInteger;
+				pTrafficLink->MISSING      = pADO->FieldByName("MISSING")->AsString;       // 결측여부
+				pTrafficLink->LASTANS      = pADO->FieldByName("LASTANS")->AsString;       // 최근 15분 이내 가공
+				pTrafficLink->MPRCN_DT     = pADO->FieldByName("MPRCN_DT")->AsString;      // 가공시각(최신)
+
+				FLists.Push(pTrafficLink->IFSC_ID, pTrafficLink);
+                pTrafficLink->Completed = true;
+
+                if (FFirst)
+                {
+                    TItsTraffic *pTraffic = new TItsTraffic();
+
+                    pTraffic->LEVL         = 2;
+                    pTraffic->LINKID       = pTrafficLink->FIFSC_ID;
+                    if (pTrafficLink->FMISSING == "N")
+                    {
+                        pTraffic->SPEED        = pTrafficLink->FSPED;
+                        pTraffic->CMTR_GRAD_CD = pTrafficLink->FCMTR_GRAD_CD;
+                        if      (pTraffic->CMTR_GRAD_CD == "LTC1") pTraffic->TRF_GRADE = "1";
+                        else if (pTraffic->CMTR_GRAD_CD == "LTC2") pTraffic->TRF_GRADE = "2";
+                        else if (pTraffic->CMTR_GRAD_CD == "LTC3") pTraffic->TRF_GRADE = "3";
+                        else                                       pTraffic->TRF_GRADE = "0";
+
+                        pTraffic->REGDATE      = pTrafficLink->FPRCN_DT;
+                        pTraffic->DATACNT      = pTrafficLink->FDATA_NUM;
+                        pTraffic->TRVTM        = pTrafficLink->FTRVL_HH;
+                    }
+                    else
+                    {
+                        pTraffic->SPEED        = 0;
+                        pTraffic->CMTR_GRAD_CD = "LTC0";
+                        pTraffic->TRF_GRADE    = "0";
+                        pTraffic->REGDATE      = "19000101000000";
+                        pTraffic->DATACNT      = 0;
+                        pTraffic->TRVTM        = 0;
+                    }
+
+                    ItsTrafficManager->FLists.Push(pTraffic->LINKID, pTraffic);
+                }
+            }
+            FFirst = false;
+            ItsTrafficManager->FIfsc = true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsTrafficServiceLinkManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsTrafficServiceLinkManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+//ITSUtil_Trace("TItsTrafficServiceLinkManager::LoadFromDb - end");
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+TItsServiceLink::TItsServiceLink()
+{
+    TItsServiceLink("");
+}
+//---------------------------------------------------------------------------
+TItsServiceLink::TItsServiceLink(String AId)
+{
+    IFSC_ID   = AId;
+    Clear();
+    FModified = false;
+    FCompleted= false;
+    FPolyLine = NULL;
+}
+//---------------------------------------------------------------------------
+void TItsServiceLink::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsServiceLink::~TItsServiceLink()
+{
+    FSubLists.clear();
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TItsServiceLinkManager *ItsServiceLinkManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Link Manager
+*/
+TItsServiceLinkManager::TItsServiceLinkManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsServiceLinkManager::~TItsServiceLinkManager()
+{
+}
+//---------------------------------------------------------------------------
+bool TItsServiceLinkManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    FLists.RemoveAll();
+
+    return (LoadLink(ADbConn) && LoadLinkList(ADbConn));
+}
+//---------------------------------------------------------------------------
+bool TItsServiceLinkManager::LoadLink(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT IFSC_ID           ,                         \r\n"
+           "       IFSC_NM           ,                         \r\n"
+           "       DRCT_CD           ,                         \r\n"
+           "       STRT_NM           ,                         \r\n"
+           "       END_NM            ,                         \r\n"
+           "       SECT_LNGT         ,                         \r\n"
+           "       EXTR_CNCT_SECT_YN ,                         \r\n"
+           "       DEL_YN            ,                         \r\n"
+           "       RMRK              ,                         \r\n"
+           "       F_NODE_ID         ,                         \r\n"
+           "       T_NODE_ID         ,                         \r\n"
+           "       SECT_GRAD_CD      ,                         \r\n"
+           "       AREA_CD           ,                         \r\n"
+           "       DECODE(AREA_CD, 'LAT001', 'Y', 'N') REGN_YN \r\n"
+           "  FROM TB_IFSC                                     \r\n";
+//           " ORDER BY IFSC_ID                                  \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                TItsServiceLink *pIfsc = new TItsServiceLink();
+
+                pIfsc->IFSC_ID           = pADO->FieldByName("IFSC_ID")->AsString;
+                pIfsc->IFSC_NM           = pADO->FieldByName("IFSC_NM")->AsString.Trim();
+                pIfsc->DRCT_CD           = pADO->FieldByName("DRCT_CD")->AsString;
+                pIfsc->RMRK              = pADO->FieldByName("RMRK")->AsString.Trim();
+                pIfsc->EXTR_CNCT_SECT_YN = pADO->FieldByName("EXTR_CNCT_SECT_YN")->AsString;
+                pIfsc->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;
+                pIfsc->SECT_LNGT         = pADO->FieldByName("SECT_LNGT")->AsString;
+                pIfsc->SECT_GRAD_CD      = pADO->FieldByName("SECT_GRAD_CD")->AsString;
+                pIfsc->F_NODE_ID         = pADO->FieldByName("F_NODE_ID")->AsString;
+                pIfsc->T_NODE_ID         = pADO->FieldByName("T_NODE_ID")->AsString;
+                pIfsc->STRT_NM           = pADO->FieldByName("STRT_NM")->AsString.Trim();
+                pIfsc->END_NM            = pADO->FieldByName("END_NM")->AsString.Trim();
+                pIfsc->REGN_YN           = pADO->FieldByName("REGN_YN")->AsString;
+                pIfsc->AREA_CD           = pADO->FieldByName("AREA_CD")->AsString;
+
+                FLists.Push(pIfsc->IFSC_ID, pIfsc);
+                pIfsc->Completed = true;
+
+                pIfsc->TRAF = new TItsTraffic(2, pIfsc->IFSC_ID);
+                ItsTrafficManager->FLists.Push(pIfsc->IFSC_ID, pIfsc->TRAF);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsServiceLinkManager::LoadLink", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsServiceLinkManager::LoadLink", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsServiceLinkManager::LoadLinkList(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT IFSC_ID, LINK_ID, ORD \r\n"
+           "  FROM TB_IFSC_LINK_RLTN     \r\n";
+//           " ORDER BY IFSC_ID, ORD       \r\n";
+    try
+    {
+        ItsServiceLinkManager->FLists.Lock();
+        TItsServiceLink *pServiceLink = NULL;
+        TItsLink *pLink;
+
+        try
+        {
+            int nORD;
+            
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sIFSC_ID = pADO->FieldByName("IFSC_ID")->AsString;
+                pServiceLink = ItsServiceLinkManager->FLists.Find(sIFSC_ID);
+                if (!pServiceLink) continue;
+
+                String sLINK_ID = pADO->FieldByName("LINK_ID")->AsString;
+				nORD            = pADO->FieldByName("ORD")->AsInteger;
+                pServiceLink->FSubLists.insert(std::make_pair<int, String>(nORD, sLINK_ID));
+
+                pLink = ItsLinkManager->FLists.Find(sLINK_ID);
+                if (pLink) pLink->IFSC_ID = sIFSC_ID;
+
+#if 0
+				String sORD     = pADO->FieldByName("ORD")->AsString;
+                TSubLink *pSubLink = new TSubLink();
+                pSubLink->FLinkId = sLINK_ID;
+                pServiceLink->FSubLists.Push(sORD, pSubLink);
+#endif
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsServiceLinkManager::LoadLinkList", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsServiceLinkManager::LoadLinkList", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        ItsServiceLinkManager->FLists.UnLock();
+    }
+
+    return LoadCoordFromDb(ADbConn);
+    //return bResult;
+}
+//---------------------------------------------------------------------------
+bool TItsServiceLinkManager::LoadCoordFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT IFSC_ID, LEVL, ORD, X_CRDN, Y_CRDN  \r\n"
+           "  FROM TB_IFSC_VRTX                        \r\n"
+           " WHERE LEVL = 4                            \r\n"
+           " ORDER BY IFSC_ID, LEVL, ORD               \r\n";
+#else
+    sQry = "SELECT B.IFSC_ID, A.POINTCNT, A.VERTEX                   \r\n"
+           "  FROM (SELECT ROWNUM AS ID, X.* FROM TB_IFSC_GIS X) A,  \r\n"
+           "       (SELECT ROWNUM AS ID, X.* FROM TB_IFSC X) B       \r\n"
+           " WHERE A.ID = B.ID                                       \r\n";
+#endif
+
+    TItsServiceLink* pObj;
+    TStringList *sl = NULL;
+    int ii;
+    sl = new TStringList;
+    sl->Delimiter = ',';
+    sl->StrictDelimiter = true;
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String IFSC_ID = pADO->FieldByName("IFSC_ID")->AsString;
+                pObj = FLists.Find(IFSC_ID);
+                if (!pObj) continue;
+
+                int    FPointCnt = pADO->FieldByName("POINTCNT")->AsInteger;
+                String FVertex   = pADO->FieldByName("VERTEX")->AsString;
+
+                sl->DelimitedText = FVertex;
+                if (sl->Count != FPointCnt * 2)
+                {
+                    continue;
+                }
+                for (ii = 0; ii < sl->Count-1; )
+                {
+                    TItsCoord *pCoord = new TItsCoord();
+                    pCoord->X = sl->Strings[ii].ToDouble();
+                    pCoord->Y = sl->Strings[ii+1].ToDouble();
+                    pObj->Coords.Push(pObj->Coords.Size(), pCoord);
+
+                    if (pCoord->X < pObj->bounds.minX) pObj->bounds.minX = pCoord->X;
+                    if (pCoord->Y < pObj->bounds.minY) pObj->bounds.minY = pCoord->Y;
+                    if (pCoord->X > pObj->bounds.maxX) pObj->bounds.maxX = pCoord->X;
+                    if (pCoord->Y > pObj->bounds.maxY) pObj->bounds.maxY = pCoord->Y;
+
+                    ii += 2;
+                }
+                continue;
+
+				TItsCoord *pCoord = new TItsCoord();
+
+                pCoord->X = pADO->FieldByName("X_CRDN")->AsFloat;
+                pCoord->Y = pADO->FieldByName("Y_CRDN")->AsFloat;
+
+				pObj->Coords.Push(pObj->Coords.Size(), pCoord);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsServiceLinkManager::LoadCoordFromDb", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsServiceLinkManager::LoadCoordFromDb", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+        if (sl) delete sl;
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 182 - 0
COMMON/CDS/CDSServiceLinkF.h

@@ -0,0 +1,182 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSServiceLinkFH
+#define CDSServiceLinkFH
+//---------------------------------------------------------------------------
+
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+#include "CDSCoordF.h"
+#include "CDSTrafficF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  ServiceLink Traffic class
+*/
+class TItsTrafficServiceLink
+{
+public:
+    TItsTrafficServiceLink();
+    TItsTrafficServiceLink(String AId);
+    virtual ~TItsTrafficServiceLink();
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+    
+public:
+    String FIFSC_ID;        // IFSC_ID       NUMBER(10)                      NOT NULL,		   정보제공구간 ID
+    String FPRCN_DT;        // PRCN_DT       VARCHAR2(14 BYTE),                                가공 일시
+    int    FTFVL;           // TFVL          NUMBER(6)                       DEFAULT 0,        교통량
+    int    FSPED;           // SPED          NUMBER(3)                       DEFAULT 0,        속도
+    int    FPTRN_SPED;      // PTRN_SPED     NUMBER(3)                       DEFAULT 0,        패턴 속도
+    float  FOCPY_RATE;      // OCPY_RATE     NUMBER(5,2)                     DEFAULT 0,        점유 율
+    int    FTRVL_HH;        // TRVL_HH       NUMBER(6)                       DEFAULT 0,        통행 시간
+    String FCMTR_GRAD_CD;   // CMTR_GRAD_CD  VARCHAR2(7 BYTE)                DEFAULT NULL,     소통 등급 코드
+    int    FDATA_NUM;       // DATA_NUM      NUMBER(5)                                         데이터 개수
+    String FMISSING;
+    String FLASTANS;
+    String FMPRCN_DT;
+
+	/*
+COMMENT ON TABLE CWUTIS.TB_IFSC_TRAF IS '정보제공구간 소통상황';
+
+	IFSC_ID       NUMBER(10)                      NOT NULL,			정보제공구간 ID
+	PRCN_DT       VARCHAR2(14 BYTE),                                가공 일시
+	TFVL          NUMBER(6)                       DEFAULT 0,        교통량
+	SPED          NUMBER(3)                       DEFAULT 0,        속도
+	PTRN_SPED     NUMBER(3)                       DEFAULT 0,        패턴 속도
+	OCPY_RATE     NUMBER(5,2)                     DEFAULT 0,        점유 율
+	TRVL_HH       NUMBER(6)                       DEFAULT 0,        통행 시간
+	CMTR_GRAD_CD  VARCHAR2(7 BYTE)                DEFAULT NULL,     소통 등급 코드
+	DATA_NUM      NUMBER(5)                                         데이터 개수
+*/
+
+    void SetValue(String &AOrgValue, String AValue);
+
+protected:
+    void SetFIFSC_ID(String AValue);
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    __property String IFSC_ID      = {read = FIFSC_ID,      write = FIFSC_ID };        // IFSC_ID       NUMBER(10)                      NOT NULL,		   정보제공구간 ID
+    __property String PRCN_DT      = {read = FPRCN_DT,      write = FPRCN_DT };        // PRCN_DT       VARCHAR2(14 BYTE),                                가공 일시
+    __property int    TFVL         = {read = FTFVL,         write = FTFVL };           // TFVL          NUMBER(6)                       DEFAULT 0,        교통량
+    __property int    SPED         = {read = FSPED,         write = FSPED };           // SPED          NUMBER(3)                       DEFAULT 0,        속도
+    __property int    PTRN_SPED    = {read = FPTRN_SPED,    write = FPTRN_SPED };      // PTRN_SPED     NUMBER(3)                       DEFAULT 0,        패턴 속도
+    __property float  OCPY_RATE    = {read = FOCPY_RATE,    write = FOCPY_RATE };      // OCPY_RATE     NUMBER(5,2)                     DEFAULT 0,        점유 율
+    __property int    TRVL_HH      = {read = FTRVL_HH,      write = FTRVL_HH };        // TRVL_HH       NUMBER(6)                       DEFAULT 0,        통행 시간
+    __property String CMTR_GRAD_CD = {read = FCMTR_GRAD_CD, write = FCMTR_GRAD_CD };   // CMTR_GRAD_CD  VARCHAR2(7 BYTE)                DEFAULT NULL,     소통 등급 코드
+    __property int    DATA_NUM     = {read = FDATA_NUM,     write = FDATA_NUM };       // DATA_NUM      NUMBER(5)                                         데이터 개수
+    __property String MISSING      = {read = FMISSING,      write = FMISSING };
+    __property String LASTANS      = {read = FLASTANS,      write = FLASTANS };
+    __property String MPRCN_DT     = {read = FMPRCN_DT,     write = FMPRCN_DT };
+};
+//---------------------------------------------------------------------------
+
+/*
+* ServiceLink Traffic Manager
+*/
+class TItsTrafficServiceLinkManager
+{
+public:
+    TItsTrafficServiceLinkManager();
+    virtual ~TItsTrafficServiceLinkManager();
+
+public:
+    bool                              FFirst;
+    ListMap<TItsTrafficServiceLink>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsTrafficServiceLinkManager *ItsTrafficServiceLinkManager;
+//---------------------------------------------------------------------------
+
+class TSubLink
+{
+public:
+    TSubLink() {};
+    virtual ~TSubLink() {};
+    String FLinkId;
+};
+
+/*
+*  ServiceLink class
+*/
+class TItsServiceLink
+{
+public:
+    TItsServiceLink();
+    TItsServiceLink(String AId);
+    virtual ~TItsServiceLink();
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+    
+public:
+    String IFSC_ID;                // IFSC_ID				NUMBER(10) NOT NULL,					IFSC_ID IS '정보제공구간 ID';
+    String IFSC_NM;                // IIFSC_NM				VARCHAR(100 BYTE),                      IFSC_NM IS '정보제공구간 명';
+    String DRCT_CD;                // IDRCT_CD				VARCHAR(7 BYTE),                        DRCT_CD IS '방향 코드';
+    String STRT_NM;                // ISTRT_NM				VARCHAR(100 BYTE),                      STRT_NM IS '시점 명';
+    String END_NM;                 // IEND_NM				VARCHAR(100 BYTE)                       END_NM IS '종점 명';
+    String SECT_LNGT;              // ISECT_LNGT			NUMBER(5) DEFAULT 0,                  	SECT_LNGT IS '구간 길이';
+    String EXTR_CNCT_SECT_YN;      // IEXTR_CNCT_SECT_YN	CHAR(1 BYTE) DEFAULT 'N',     			EXTR_CNCT_SECT_YN IS '외부 연계 구간 여부';
+    String DEL_YN;                 // IDEL_YN				CHAR(1 BYTE) DEFAULT 'N',               DEL_YN IS '삭제 여부';
+    String RMRK;                   // IRMRK				VARCHAR(600 BYTE),                      RMRK IS '비고';
+    String F_NODE_ID;              // IF_NODE_ID			NUMBER(10),                           	F_NODE_ID IS '시작노드ID';
+    String T_NODE_ID;              // IT_NODE_ID			NUMBER(10),                           	T_NODE_ID IS '종료노드ID';
+    String SECT_GRAD_CD;           // ISECT_GRAD_CD		VARCHAR(7 BYTE),                   		SECT_GRAD_CD IS '구간 등급 코드';
+    String AREA_CD;                //	AREA_CD VARCHAR(7 BYTE)
+    String REGN_YN;
+
+    String ROAD_ID;
+
+    TItsTraffic        *TRAF;
+    TItsBounds          bounds;
+    IntMap<TItsCoord>   Coords;
+    void               *FPolyLine;
+
+    std::map<int, String>   FSubLists;
+
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+};
+//---------------------------------------------------------------------------
+
+
+/*
+* Link Manager
+*/
+class TItsServiceLinkManager
+{
+public:
+    TItsServiceLinkManager();
+    virtual ~TItsServiceLinkManager();
+
+public:
+    ListMap<TItsServiceLink>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadCoordFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadLink(TADOConnection *ADbConn=NULL);
+    bool LoadLinkList(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsServiceLinkManager *ItsServiceLinkManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 63 - 0
COMMON/CDS/CDSStaIncidentF.cpp

@@ -0,0 +1,63 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSStaIncidentF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsStaIncidentInfo::TItsStaIncidentInfo()
+{
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsStaIncidentInfo::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsStaIncidentInfo::~TItsStaIncidentInfo()
+{
+}
+//---------------------------------------------------------------------------
+
+TItsStaIncident::TItsStaIncident()
+{
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsStaIncident::Clear()
+{
+    FDate = "";
+    for (int ii = 0; ii < 6; ii++)
+        for (int jj = 0; jj < 4; jj++)
+             FIncid[ii][jj] = 0;   //전체,사고,공사,행사,기상,기타의 발생건수, 사망자수, 부상자수, 재산피해액
+}
+//---------------------------------------------------------------------------
+TItsStaIncident::~TItsStaIncident()
+{
+    FSubLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+//TItsStaIncidentManager *ItsStaIncidentManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Link Manager
+*/
+TItsStaIncidentManager::TItsStaIncidentManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsStaIncidentManager::~TItsStaIncidentManager()
+{
+}
+//---------------------------------------------------------------------------
+

+ 62 - 0
COMMON/CDS/CDSStaIncidentF.h

@@ -0,0 +1,62 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSStaIncidentFH
+#define CDSStaIncidentFH
+//---------------------------------------------------------------------------
+
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+class TItsStaIncidentInfo
+{
+public:
+    TItsStaIncidentInfo();
+    virtual ~TItsStaIncidentInfo();
+private:
+    void Clear();
+};
+
+/*
+*  StaIncident class
+*/
+class TItsStaIncident
+{
+public:
+    TItsStaIncident();
+    virtual ~TItsStaIncident();
+private:
+
+public:
+    void Clear();
+
+    String	FDate;
+    int     FIncid[6][4];   //전체,사고,공사,행사,기상,기타의 발생건수, 사망자수, 부상자수, 재산피해액
+public:
+    ListMap<TItsStaIncidentInfo>   FSubLists;
+};
+//---------------------------------------------------------------------------
+
+/*
+* StaIncident Manager
+*/
+class TItsStaIncidentManager
+{
+public:
+    TItsStaIncidentManager();
+    virtual ~TItsStaIncidentManager();
+
+public:
+    ListMap<TItsStaIncident>   FLists;
+};
+//---------------------------------------------------------------------------
+//extern TItsStaIncidentManager *ItsStaIncidentManager;
+//---------------------------------------------------------------------------
+
+
+#endif
+

+ 219 - 0
COMMON/CDS/CDSTrafficF.cpp

@@ -0,0 +1,219 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSTrafficF.h"
+#include "ITSUtilF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsTraffic::TItsTraffic(int ALEVL, String AID, void* AObj)
+{
+    ID     = AID;
+    LEVL   = ALEVL;
+    Object = AObj;
+
+    InitTraffic();
+}
+//---------------------------------------------------------------------------
+TItsTraffic::~TItsTraffic()
+{
+}
+//---------------------------------------------------------------------------
+void TItsTraffic::InitTraffic()
+{
+    CMTR_GRAD_CD = "LTC0";
+    PRCN_DT      = "19000101000000";
+    SPED         = 0;
+    TRVL_HH      = 0;
+    DATA_NUM     = 0;
+    TRAF_GRAD    = 0;
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsTrafficManager *ItsTrafficManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Link Traffic Manager
+*/
+TItsTrafficManager::TItsTrafficManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsTrafficManager::~TItsTrafficManager()
+{
+}
+//---------------------------------------------------------------------------
+void TItsTrafficManager::InitTraffic()
+{
+    try
+    {
+        FLists.Lock();
+
+        FOR_STL(TItsTraffic*, pObj, FLists)
+        {
+            pObj->InitTraffic();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+}
+//---------------------------------------------------------------------------
+bool TItsTrafficManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool         bResult = true;
+    String       sQry;
+    TADOQuery   *pADO = NULL;
+    TItsTraffic *pTraf;
+
+    InitTraffic();
+
+#if 0
+    sQry = "SELECT 3 AS LEVL, A.ROAD_ID AS LINKID,  NVL(B.SPED, 0) AS SPEED, NVL(B.CMTR_GRAD_CD, 'LTC0') CMTR_GRAD_CD, \r\n"
+           "       DECODE(B.CMTR_GRAD_CD, 'LTC1', '1', 'LTC2', '2', 'LTC3', '3', '0') TRF_GRADE,                       \r\n"
+           "       NVL(B.PRCN_DT, '19000101000000')     AS REGDATE,                                                    \r\n"
+           "       NVL(B.DATA_NUM, 0) AS DATACNT,                                                                      \r\n"
+           "       NVL(B.TRVL_HH, 0) AS TRVTM                                                                          \r\n"
+           "  FROM TB_ROAD A,                                                                                          \r\n"
+           "       (SELECT *                                                                                           \r\n"
+           "          FROM TB_ROAD_TRAF                                                                                \r\n"
+           "         WHERE PRCN_DT > TO_CHAR(SYSDATE -  8 / 1440, 'YYYYMMDDHH24MISS')                                  \r\n"
+           "           ) B                                                                                             \r\n"
+           " WHERE A.ROAD_ID = B.ROAD_ID(+)                                                                            \r\n"
+           "UNION ALL                                                                                                  \r\n"
+           "SELECT 2 AS LEVL, A.IFSC_ID AS LINKID,  NVL(B.SPED, 0) AS SPEED, NVL(B.CMTR_GRAD_CD, 'LTC0') CMTR_GRAD_CD, \r\n"
+           "       DECODE(B.CMTR_GRAD_CD, 'LTC1', '1', 'LTC2', '2', 'LTC3', '3', '0') TRF_GRADE,                       \r\n"
+           "       NVL(B.PRCN_DT, '19000101000000')     AS REGDATE,                                                    \r\n"
+           "       NVL(B.DATA_NUM, 0) AS DATACNT,                                                                      \r\n"
+           "       NVL(B.TRVL_HH, 0) AS TRVTM                                                                          \r\n"
+           "  FROM TB_IFSC A,                                                                                          \r\n"
+           "       (SELECT *                                                                                           \r\n"
+           "          FROM TB_IFSC_TRAF                                                                                \r\n"
+           "         WHERE PRCN_DT > TO_CHAR(SYSDATE -  8 / 1440, 'YYYYMMDDHH24MISS')                                  \r\n"
+           "       ) B                                                                                                 \r\n"
+           " WHERE A.IFSC_ID = B.IFSC_ID(+)                                                                            \r\n"
+           "UNION ALL                                                                                                  \r\n"
+           "SELECT 1 AS LEVL, A.LINK_ID AS LINKID,  NVL(B.SPED, 0) AS SPEED, NVL(B.CMTR_GRAD_CD, 'LTC0') CMTR_GRAD_CD, \r\n"
+           "       DECODE(B.CMTR_GRAD_CD, 'LTC1', '1', 'LTC2', '2', 'LTC3', '3', '0') TRF_GRADE,                       \r\n"
+           "       NVL(B.PRCN_DT, '19000101000000')     AS REGDATE,                                                    \r\n"
+           "       NVL(B.DATA_NUM, 0) AS DATACNT,                                                                      \r\n"
+           "       NVL(B.TRVL_HH, 0) AS TRVTM                                                                          \r\n"
+           "  FROM TB_LINK A,                                                                                          \r\n"
+           "       (SELECT *                                                                                           \r\n"
+           "          FROM TB_LINK_TRAF                                                                                \r\n"
+           "         WHERE PRCN_DT > TO_CHAR(SYSDATE -  8 / 1440, 'YYYYMMDDHH24MISS')                                  \r\n"
+           "       ) B                                                                                                 \r\n"
+           " WHERE A.LINK_ID = B.LINK_ID(+)                                                                            \r\n";
+#else
+    sQry = "SELECT 1 AS LEVL, A.LINK_ID AS LINKID, PRCN_DT, TFVL, SPED, OCPY_RATE, TRVL_HH, CMTR_GRAD_CD, PTRN_SPED, DATA_NUM,   \r\n"
+           "       (CASE WHEN PRCN_DT <= TO_CHAR(SYSDATE - 10/1440, 'YYYYMMDDHH24MISS')                                          \r\n"
+           "             THEN 'Y' ELSE 'N' END) AS MISSING,                                                                      \r\n"
+           "       (CASE WHEN PRCN_DT >= TO_CHAR(SYSDATE - 15/1440, 'YYYYMMDDHH24MISS')                                          \r\n"
+           "             THEN 'Y' ELSE 'N' END) AS LASTANS,                                                                      \r\n"
+           "       (SELECT MAX(PRCN_DT) FROM TB_LINK_TRAF) MPRCN_DT,                                                             \r\n"
+           "       MISS_YN, PRCN_SPED, SMTH_SPED, ADJS_SPED, PRCN_SORC, ADJS_SORC                                                \r\n"
+           "  FROM TB_LINK_TRAF A, TB_LINK B                                                                                     \r\n"
+           " WHERE A.LINK_ID = B.LINK_ID                                                                                         \r\n"
+           "UNION ALL                                                                                                            \r\n"
+           "SELECT 2 AS LEVL, A.IFSC_ID AS LINKID, PRCN_DT, TFVL, SPED, OCPY_RATE, TRVL_HH, CMTR_GRAD_CD, PTRN_SPED, DATA_NUM,   \r\n"
+           "       (CASE WHEN PRCN_DT <= TO_CHAR(SYSDATE - 10/1440, 'YYYYMMDDHH24MISS')                                          \r\n"
+           "             THEN 'Y' ELSE 'N' END) AS MISSING,                                                                      \r\n"
+           "       (CASE WHEN PRCN_DT >= TO_CHAR(SYSDATE - 15/1440, 'YYYYMMDDHH24MISS')                                          \r\n"
+           "             THEN 'Y' ELSE 'N' END) AS LASTANS,                                                                      \r\n"
+           "       (SELECT MAX(PRCN_DT) FROM TB_LINK_TRAF) MPRCN_DT,                                                             \r\n"
+           "       'N' AS MISS_YN, SPED AS PRCN_SPED, SPED AS SMTH_SPED, SPED AS ADJS_SPED, '' AS PRCN_SORC, 'MCS0' AS ADJS_SORC \r\n"
+           "  FROM TB_IFSC_TRAF A, TB_IFSC B                                                                                     \r\n"
+           " WHERE A.IFSC_ID = B.IFSC_ID                                                                                         \r\n"
+           "UNION ALL                                                                                                            \r\n"
+           "SELECT 3 AS LEVL, A.ROAD_ID AS LINKID, PRCN_DT, TFVL, SPED, OCPY_RATE, TRVL_HH, CMTR_GRAD_CD, PTRN_SPED, DATA_NUM,   \r\n"
+           "       (CASE WHEN PRCN_DT <= TO_CHAR(SYSDATE - 10/1440, 'YYYYMMDDHH24MISS')                                          \r\n"
+           "             THEN 'Y' ELSE 'N' END) AS MISSING,                                                                      \r\n"
+           "       (CASE WHEN PRCN_DT >= TO_CHAR(SYSDATE - 15/1440, 'YYYYMMDDHH24MISS')                                          \r\n"
+           "             THEN 'Y' ELSE 'N' END) AS LASTANS,                                                                      \r\n"
+           "       (SELECT MAX(PRCN_DT) FROM TB_ROAD_TRAF) MPRCN_DT,                                                             \r\n"
+           "       'N' AS MISS_YN, SPED AS PRCN_SPED, SPED AS SMTH_SPED, SPED AS ADJS_SPED, '' AS PRCN_SORC, 'MCS0' AS ADJS_SORC \r\n"
+           "  FROM TB_ROAD_TRAF A, TB_ROAD B                                                                                     \r\n"
+           " WHERE A.ROAD_ID = B.ROAD_ID                                                                                         \r\n";
+
+    #endif
+
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				String LINKID = pADO->FieldByName("LINKID")->AsString;
+                pTraf = FLists.Find(LINKID);
+                if (!pTraf) continue;
+
+                pTraf->PRCN_DT      = pADO->FieldByName("PRCN_DT")->AsString;
+                pTraf->TFVL         = pADO->FieldByName("TFVL")->AsInteger;
+                pTraf->SPED         = pADO->FieldByName("SPED")->AsInteger;
+                pTraf->OCPY_RATE    = pADO->FieldByName("OCPY_RATE")->AsFloat;
+                pTraf->TRVL_HH      = pADO->FieldByName("TRVL_HH")->AsInteger;
+                pTraf->CMTR_GRAD_CD = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+				pTraf->MISSING      = pADO->FieldByName("MISSING")->AsString;       // 결측여부
+				pTraf->LASTANS      = pADO->FieldByName("LASTANS")->AsString;       // 최근 15분 이내 가공
+				pTraf->MPRCN_DT     = pADO->FieldByName("MPRCN_DT")->AsString;      // 가공시각(최신)
+                pTraf->DATA_NUM     = pADO->FieldByName("DATA_NUM")->AsInteger;
+                pTraf->PTRN_SPED    = pADO->FieldByName("PTRN_SPED")->AsInteger;
+
+                if      (pTraf->CMTR_GRAD_CD == "LTC1") pTraf->TRAF_GRAD = 1;
+                else if (pTraf->CMTR_GRAD_CD == "LTC2") pTraf->TRAF_GRAD = 2;
+                else if (pTraf->CMTR_GRAD_CD == "LTC3") pTraf->TRAF_GRAD = 3;
+                else                                    pTraf->TRAF_GRAD = 0;
+
+				pTraf->MISS_YN      = pADO->FieldByName("MISS_YN")->AsString;       // '결측 여부';
+				pTraf->PRCN_SPED    = pADO->FieldByName("PRCN_SPED")->AsInteger;    // '가공 속도';
+				pTraf->SMTH_SPED    = pADO->FieldByName("SMTH_SPED")->AsInteger;    // '평활화 속도';
+				pTraf->ADJS_SPED    = pADO->FieldByName("ADJS_SPED")->AsInteger;    // '보정 속도';
+				pTraf->PRCN_SORC    = pADO->FieldByName("PRCN_SORC")->AsString;     // '가공 소스';
+				pTraf->ADJS_SORC    = pADO->FieldByName("ADJS_SORC")->AsString;     // '보정 소스';
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsTrafficManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            return false;
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TItsTrafficManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            return false;
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return bResult;
+}
+//---------------------------------------------------------------------------
+

+ 95 - 0
COMMON/CDS/CDSTrafficF.h

@@ -0,0 +1,95 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSTrafficFH
+#define CDSTrafficFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+#include "CDSBaseF.h"
+//#include "CDSLinkF.h"
+//#include "CDSIfscF.h"
+//#include "CDSRoadF.h"
+//---------------------------------------------------------------------------
+
+class TItsLink;
+class TItsIfsc;
+class TItsRoad;
+
+/*
+*  TRAFFIC class
+*/
+class TItsTraffic : public TItsBaseId
+{
+public:
+    TItsTraffic();
+    TItsTraffic(int ALEVL, String AID, void* AObj);
+    virtual ~TItsTraffic();
+    void Clear();
+
+private:
+    void  *Object;
+    TItsLink* GetLink() { return (TItsLink*)Object; }
+    TItsIfsc* GetIfsc() { return (TItsIfsc*)Object; }
+    TItsRoad* GetRoad() { return (TItsRoad*)Object; }
+
+public:
+    int    LEVL;
+
+    String PRCN_DT;        // VARCHAR2(14 BYTE),                                '가공 일시';
+    int    TFVL;           // NUMBER(6)                       DEFAULT 0,        '교통량';
+    int    SPED;           // NUMBER(3)                       DEFAULT 0,        '속도';
+    float  OCPY_RATE;      // NUMBER(5,2)                     DEFAULT 0,        '점유 율';
+    int    TRVL_HH;        // NUMBER(6)                       DEFAULT 0,        '통행 시간';
+    String CMTR_GRAD_CD;   // VARCHAR2(7 BYTE)                DEFAULT NULL,     '소통 등급 코드';
+
+    String MISSING;
+    String LASTANS;
+    String MPRCN_DT;
+    int    DATA_NUM;       // NUMBER(4)                       DEFAULT 0         '데이터 개수';
+
+    int    PTRN_SPED;      // NUMBER(3)                       DEFAULT 0,        '패턴 속도';
+
+    int    PRCN_SPED;      // NUMBER(3)                       DEFAULT 0,        '가공 속도';
+    int    SMTH_SPED;      // NUMBER(3)                       DEFAULT 0,        '평활화 속도';
+    int    ADJS_SPED;      // NUMBER(3)                       DEFAULT 0,        '보정 속도';
+    String PRCN_SORC;      // VARCHAR2(7 BYTE)                DEFAULT NULL,     '가공 소스';
+    String ADJS_SORC;      // VARCHAR2(7 BYTE)                DEFAULT NULL,     '보정 소스';
+    String MISS_YN;        // CHAR(1 BYTE)                    DEFAULT 'N',      '결측 여부';
+
+    int    TRAF_GRAD;
+
+public:
+    void InitTraffic();
+
+public:
+    __property TItsLink* Link = { read = GetLink };
+    __property TItsIfsc* Ifsc = { read = GetIfsc };
+    __property TItsRoad* Road = { read = GetRoad };
+};
+//---------------------------------------------------------------------------
+
+/*
+* Link Traffic Manager
+*/
+class TItsTrafficManager
+{
+public:
+    TItsTrafficManager();
+    virtual ~TItsTrafficManager();
+
+public:
+    ListMap<TItsTraffic>   FLists;
+
+public:
+    void InitTraffic();
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+
+//---------------------------------------------------------------------------
+extern TItsTrafficManager *ItsTrafficManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 287 - 0
COMMON/CDS/CDSTrafficGradeF.cpp

@@ -0,0 +1,287 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSTrafficGradeF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsTrafficSubGrade::TItsTrafficSubGrade()
+{
+    TItsTrafficSubGrade("", "");
+}
+//---------------------------------------------------------------------------
+TItsTrafficSubGrade::TItsTrafficSubGrade(String ACode, String ASubCode)
+{
+    FSECT_GRAD_CD = ACode;
+    FCMTR_GRAD_CD = ASubCode;
+    Clear();
+    FModified = false;
+    FCompleted= false;
+}
+//---------------------------------------------------------------------------
+TItsTrafficSubGrade::~TItsTrafficSubGrade()
+{
+}
+//---------------------------------------------------------------------------
+void TItsTrafficSubGrade::Clear()
+{
+#if 0
+    FSECT_GRAD_CD   = "";
+    FCMTR_GRAD_CD   = "";
+    FLWST_TRVL_SPED = "";
+    FHGHS_TRVL_SPED = "";
+    FCNGS_GRAD_YN   = "";
+#endif
+}
+//---------------------------------------------------------------------------
+
+void TItsTrafficSubGrade::SetValue(String &AOrgValue, String AValue)
+{
+    if (AOrgValue != AValue)
+    {
+        AOrgValue = AValue;
+        if (FCompleted) FModified = true;
+    }
+}
+//---------------------------------------------------------------------------
+void TItsTrafficSubGrade::SetFSECT_GRAD_CD(String AValue)
+{
+    SetValue(FSECT_GRAD_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsTrafficSubGrade::SetFCMTR_GRAD_CD(String AValue)
+{
+    SetValue(FCMTR_GRAD_CD, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsTrafficSubGrade::SetFLWST_TRVL_SPED(int AValue)
+{
+    if (FLWST_TRVL_SPED != AValue)
+    {
+        FLWST_TRVL_SPED = AValue;
+        if (FCompleted) FModified = true;
+    }
+}
+//---------------------------------------------------------------------------
+void TItsTrafficSubGrade::SetFHGHS_TRVL_SPED(int AValue)
+{
+    if (FHGHS_TRVL_SPED != AValue)
+    {
+        FHGHS_TRVL_SPED = AValue;
+        if (FCompleted) FModified = true;
+    }
+}
+//---------------------------------------------------------------------------
+void TItsTrafficSubGrade::SetFCNGS_GRAD_YN(String AValue)
+{
+    SetValue(FCNGS_GRAD_YN, AValue);
+}
+//---------------------------------------------------------------------------
+
+TItsTrafficGrade::TItsTrafficGrade()
+{
+    TItsTrafficGrade("");
+}
+//---------------------------------------------------------------------------
+TItsTrafficGrade::TItsTrafficGrade(String ACode)
+{
+    FSECT_GRAD_CD = ACode;
+    Clear();
+    FModified = false;
+    FCompleted= false;
+}
+//---------------------------------------------------------------------------
+void TItsTrafficGrade::Clear()
+{
+#if 0
+    FSECT_GRAD_NM = "";
+#endif
+}
+//---------------------------------------------------------------------------
+TItsTrafficGrade::~TItsTrafficGrade()
+{
+    FSubLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TItsTrafficGrade::SetValue(String &AOrgValue, String AValue)
+{
+    if (AOrgValue != AValue)
+    {
+        AOrgValue = AValue;
+        if (FCompleted) FModified = true;
+    }
+}
+//---------------------------------------------------------------------------
+void TItsTrafficGrade::SetFSECT_GRAD_NM(String AValue)
+{
+    SetValue(FSECT_GRAD_NM, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsTrafficGrade::SetFSECT_GRAD_CD(String AValue)
+{
+    SetValue(FSECT_GRAD_CD, AValue);
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TItsTrafficGradeManager *ItsTrafficGradeManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Link Manager
+*/
+TItsTrafficGradeManager::TItsTrafficGradeManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsTrafficGradeManager::~TItsTrafficGradeManager()
+{
+}
+//---------------------------------------------------------------------------
+bool TItsTrafficGradeManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    FLists.RemoveAll();
+
+    return (LoadTrafficGrade(ADbConn) && LoadTrafficSubGrade(ADbConn));
+}
+//---------------------------------------------------------------------------
+bool TItsTrafficGradeManager::LoadTrafficGrade(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT SECT_GRAD_CD,     \r\n"
+           "       SECT_GRAD_NM      \r\n"
+           "  FROM TB_SECT_GRAD_CLSF \r\n";
+//           " ORDER BY SECT_GRAD_CD   \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsTrafficGrade *pCode = new TItsTrafficGrade();
+
+                pCode->FSECT_GRAD_CD = pADO->FieldByName("SECT_GRAD_CD")->AsString; //'备埃 殿鞭 内靛';
+                pCode->FSECT_GRAD_NM = pADO->FieldByName("SECT_GRAD_NM")->AsString; //'备埃 殿鞭 疙';
+
+				FLists.Push(pCode->FSECT_GRAD_CD, pCode);
+                pCode->Completed = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsTrafficGradeManager::LoadTrafficGrade", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsTrafficGradeManager::LoadTrafficGrade", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsTrafficGradeManager::LoadTrafficSubGrade(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.SECT_GRAD_CD,                 \r\n"
+           "       CMTR_GRAD_CD  ,                 \r\n"
+           "       LWST_TRVL_SPED,                 \r\n"
+           "       HGHS_TRVL_SPED,                 \r\n"
+           "       CNGS_GRAD_YN                    \r\n"
+           "  FROM TB_CMTR_GRAD_CLSF A,            \r\n"
+           "       TB_SECT_GRAD_CLSF B             \r\n"
+           " WHERE A.SECT_GRAD_CD = B.SECT_GRAD_CD \r\n";
+//           " ORDER BY SECT_GRAD_CD, CMTR_GRAD_CD   \r\n";
+    try
+    {
+        ItsTrafficGradeManager->FLists.Lock();
+        TItsTrafficGrade *pCode = NULL;
+
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sGradCd = pADO->FieldByName("SECT_GRAD_CD")->AsString;
+                pCode = ItsTrafficGradeManager->FLists.Find(sGradCd);
+                if (!pCode) continue;
+
+				TItsTrafficSubGrade *pSubCode = new TItsTrafficSubGrade();
+
+                pSubCode->FSECT_GRAD_CD   = sGradCd;
+                pSubCode->FCMTR_GRAD_CD   = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+                pSubCode->FLWST_TRVL_SPED = pADO->FieldByName("LWST_TRVL_SPED")->AsInteger;
+                pSubCode->FHGHS_TRVL_SPED = pADO->FieldByName("HGHS_TRVL_SPED")->AsInteger;
+                pSubCode->FCNGS_GRAD_YN   = pADO->FieldByName("CNGS_GRAD_YN")->AsString;
+
+                pCode->FSubLists.Push(pSubCode->CMTR_GRAD_CD, pSubCode);
+                pSubCode->Completed = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsTrafficGradeManager::LoadTrafficSubGrade", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsTrafficGradeManager::LoadTrafficSubGrade", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        ItsTrafficGradeManager->FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+

+ 108 - 0
COMMON/CDS/CDSTrafficGradeF.h

@@ -0,0 +1,108 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSTrafficGradeFH
+#define CDSTrafficGradeFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+class TItsTrafficSubGrade
+{
+public:
+    TItsTrafficSubGrade();
+    TItsTrafficSubGrade(String ACode, String ASubCode);
+    virtual ~TItsTrafficSubGrade();
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String FSECT_GRAD_CD;       // VARCHAR2(7 BYTE)              NOT NULL,		'소통 등급 분류';
+    String FCMTR_GRAD_CD;       // VARCHAR(7 BYTE) NOT NULL,		'공통 코드';
+    int    FLWST_TRVL_SPED;     // VARCHAR(3 BYTE) NOT NULL,  '공통 분류 코드';
+    int    FHGHS_TRVL_SPED;     // VARCHAR(60 BYTE),        '공통 코드 한글 명';
+    String FCNGS_GRAD_YN;       // VARCHAR(60 BYTE),       '공통 코드 영문 명';
+
+    void SetValue(String &AOrgValue, String AValue);
+protected:
+    void SetFSECT_GRAD_CD(String AValue);
+    void SetFCMTR_GRAD_CD(String AValue);
+    void SetFLWST_TRVL_SPED(int AValue);
+    void SetFHGHS_TRVL_SPED(int AValue);
+    void SetFCNGS_GRAD_YN(String AValue);
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    __property String SECT_GRAD_CD   = {read = FSECT_GRAD_CD,   write = SetFSECT_GRAD_CD };
+    __property String CMTR_GRAD_CD   = {read = FCMTR_GRAD_CD,   write = SetFCMTR_GRAD_CD };
+    __property int    LWST_TRVL_SPED = {read = FLWST_TRVL_SPED, write = SetFLWST_TRVL_SPED };
+    __property int    HGHS_TRVL_SPED = {read = FHGHS_TRVL_SPED, write = SetFHGHS_TRVL_SPED };
+    __property String CNGS_GRAD_YN   = {read = FCNGS_GRAD_YN,   write = SetFCNGS_GRAD_YN };
+};
+
+/*
+*  Traffic Grade class
+*/
+class TItsTrafficGrade
+{
+public:
+    TItsTrafficGrade();
+    TItsTrafficGrade(String ACode);
+    virtual ~TItsTrafficGrade();
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String FSECT_GRAD_CD;
+    String FSECT_GRAD_NM;
+
+    void SetValue(String &AOrgValue, String AValue);
+protected:
+    void SetFSECT_GRAD_CD(String AValue);
+    void SetFSECT_GRAD_NM(String AValue);
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    __property String SECT_GRAD_CD = {read = FSECT_GRAD_CD, write = SetFSECT_GRAD_CD };
+    __property String SECT_GRAD_NM = {read = FSECT_GRAD_NM, write = SetFSECT_GRAD_NM };
+
+    ListMap<TItsTrafficSubGrade>   FSubLists;
+};
+//---------------------------------------------------------------------------
+
+/*
+* ItsTrafficGrade Manager
+*/
+class TItsTrafficGradeManager
+{
+public:
+    TItsTrafficGradeManager();
+    virtual ~TItsTrafficGradeManager();
+
+public:
+    ListMap<TItsTrafficGrade>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadTrafficGrade(TADOConnection *ADbConn=NULL);
+    bool LoadTrafficSubGrade(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsTrafficGradeManager *ItsTrafficGradeManager;
+//---------------------------------------------------------------------------
+
+
+#endif
+

+ 297 - 0
COMMON/CDS/CDSTrafficOprLinkF.cpp

@@ -0,0 +1,297 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSTrafficOprLinkF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsTrafficOprLink::TItsTrafficOprLink()
+{
+    Clear();
+	FGridIndex    = -1; // 그리드 인덱스
+}
+//---------------------------------------------------------------------------
+void TItsTrafficOprLink::Clear()
+{
+#if 0
+    FLINK_ID      = ""; // 링크ID
+    FCRTN_DT      = ""; // 생성 일시
+    FAPLY_STRT_DT = ""; // 적용 시작 일시
+    FAPLY_END_DT  = "";	// 적용 종료 일시
+    FTFVL         = ""; // 교통량
+    FSPED         = ""; // 속도
+    FOCPY_RATE    = ""; // 점유율
+    FTRVL_HH      = ""; // 통행 시간
+
+	FGridIndex    = -1; // 그리드 인덱스
+
+#endif
+}
+//---------------------------------------------------------------------------
+TItsTrafficOprLink::~TItsTrafficOprLink()
+{
+}
+//---------------------------------------------------------------------------
+void TItsTrafficOprLink::SetValue(String &AOrgValue, String AValue)
+{
+    if (AOrgValue != AValue)
+    {
+        AOrgValue = AValue;
+        if (FCompleted) FModified = true;
+    }
+}
+//---------------------------------------------------------------------------
+void TItsTrafficOprLink::SetFLINK_ID(String AValue)
+{
+    SetValue(FLINK_ID, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsTrafficOprLink::SetFCRTN_DT(String AValue)
+{
+    SetValue(FCRTN_DT, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsTrafficOprLink::SetFAPLY_STRT_DT(String AValue)
+{
+    SetValue(FAPLY_STRT_DT, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsTrafficOprLink::SetFAPLY_END_DT(String AValue)
+{
+    SetValue(FAPLY_END_DT, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsTrafficOprLink::SetFTFVL(String AValue)
+{
+    SetValue(FTFVL, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsTrafficOprLink::SetFSPED(String AValue)
+{
+    SetValue(FSPED, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsTrafficOprLink::SetFOCPY_RATE(String AValue)
+{
+    SetValue(FOCPY_RATE, AValue);
+}
+//---------------------------------------------------------------------------
+void TItsTrafficOprLink::SetFTRVL_HH(String AValue)
+{
+    SetValue(FTRVL_HH, AValue);
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TItsTrafficOprLinkManager *ItsTrafficOprLinkManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* TrafficOprLink Manager
+*/
+TItsTrafficOprLinkManager::TItsTrafficOprLinkManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsTrafficOprLinkManager::~TItsTrafficOprLinkManager()
+{
+}
+//---------------------------------------------------------------------------
+bool TItsTrafficOprLinkManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT LINK_ID,      CRTN_DT,           \r\n"
+           "       APLY_STRT_DT, APLY_END_DT,       \r\n"
+           "       NVL(TFVL,      0) AS TFVL,       \r\n"
+           "       NVL(SPED,      0) AS SPED,       \r\n"
+           "       NVL(OCPY_RATE, 0) AS OCPY_RATE,  \r\n"
+           "       NVL(TRVL_HH,   0) AS TRVL_HH     \r\n"
+           "  FROM TB_LINK_SYOP_TRAF                \r\n";
+//           " ORDER BY 1, 2                          \r\n";
+    try
+    {
+        FDataSeq = 0;
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsTrafficOprLink *pTrafficOprLink = new TItsTrafficOprLink();
+
+                pTrafficOprLink->FLINK_ID      = pADO->FieldByName("LINK_ID")->AsString;
+                pTrafficOprLink->FCRTN_DT      = pADO->FieldByName("CRTN_DT")->AsString;
+                pTrafficOprLink->FAPLY_STRT_DT = pADO->FieldByName("APLY_STRT_DT")->AsString;
+                pTrafficOprLink->FAPLY_END_DT  = pADO->FieldByName("APLY_END_DT")->AsString;
+                pTrafficOprLink->FTFVL         = pADO->FieldByName("TFVL")->AsString;
+                pTrafficOprLink->FSPED         = pADO->FieldByName("SPED")->AsString;
+                pTrafficOprLink->FOCPY_RATE    = pADO->FieldByName("OCPY_RATE")->AsString;
+                pTrafficOprLink->FTRVL_HH      = pADO->FieldByName("TRVL_HH")->AsString;
+
+				FLists.Push(String(FDataSeq++), pTrafficOprLink);
+                pTrafficOprLink->Completed = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsTrafficOprLinkManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsTrafficOprLinkManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsTrafficOprLinkManager::AllDelete(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "DELETE FROM TB_LINK_SYOP_TRAF \r\n";
+    try
+    {
+        FDataSeq = 0;
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->ExecSQL();
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsTrafficOprLinkManager::AllDelete", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsTrafficOprLinkManager::AllDelete", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsTrafficOprLinkManager::AllApply(int ALinkLevel, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    if (ALinkLevel == 1)
+    {
+    sQry = "INSERT INTO TB_LINK_SYOP_TRAF(LINK_ID, CRTN_DT, APLY_STRT_DT, APLY_END_DT, TFVL, SPED, OCPY_RATE, TRVL_HH) \r\n"
+           "SELECT LINK_ID,                                                                                            \r\n"
+           "       TO_CHAR(SYSDATE,   'YYYYMMDDHH24MISS') AS CRTN_DT,                                                  \r\n"
+           "       TO_CHAR(SYSDATE,   'YYYYMMDDHH24MISS') AS APLY_STRT_DT,                                             \r\n"
+           "       TO_CHAR(SYSDATE+1, 'YYYYMMDDHH24MISS') AS APLY_END_DT,                                              \r\n"
+           "       0,                                                                                                  \r\n"
+           "       100,                                                                                                \r\n"
+           "       0,                                                                                                  \r\n"
+           "       0                                                                                                   \r\n"
+           "  FROM TB_LINK_TRAF                                                                                        \r\n"
+           " WHERE SPED > 0                                                                                            \r\n";
+    }
+    else if (ALinkLevel == 2)
+    {
+    sQry = "INSERT INTO TB_LINK_SYOP_TRAF(LINK_ID, CRTN_DT, APLY_STRT_DT, APLY_END_DT, TFVL, SPED, OCPY_RATE, TRVL_HH) \r\n"
+           "SELECT IFSC_ID,                                                                                            \r\n"
+           "       TO_CHAR(SYSDATE,   'YYYYMMDDHH24MISS') AS CRTN_DT,                                                  \r\n"
+           "       TO_CHAR(SYSDATE,   'YYYYMMDDHH24MISS') AS APLY_STRT_DT,                                             \r\n"
+           "       TO_CHAR(SYSDATE+1, 'YYYYMMDDHH24MISS') AS APLY_END_DT,                                              \r\n"
+           "       0,                                                                                                  \r\n"
+           "       100,                                                                                                \r\n"
+           "       0,                                                                                                  \r\n"
+           "       0                                                                                                   \r\n"
+           "  FROM TB_IFSC_TRAF                                                                                        \r\n"
+           " WHERE SPED > 0                                                                                            \r\n";
+    }
+    else return true;
+
+    try
+    {
+        String sSysDate = Now().FormatString("YYYYMMDDHHNNSS");
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			//pADO->Parameters->ParamByName("p01")->Value = sSysDate
+
+			pADO->ExecSQL();
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsTrafficOprLinkManager::AllApply", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsTrafficOprLinkManager::AllApply", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 112 - 0
COMMON/CDS/CDSTrafficOprLinkF.h

@@ -0,0 +1,112 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSTrafficOprLinkFH
+#define CDSTrafficOprLinkFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  TrafficOprLink class
+*/
+class TItsTrafficOprLink
+{
+public:
+    TItsTrafficOprLink();
+    virtual ~TItsTrafficOprLink();
+    void Clear();
+private:
+    int     FEditMode;
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String FLINK_ID;        // 링크ID
+    String FCRTN_DT;        // 생성 일시
+    String FAPLY_STRT_DT;   // 적용 시작 일시
+    String FAPLY_END_DT;    // 적용 종료 일시
+    String FTFVL;           // 교통량
+    String FSPED;           // 속도
+    String FOCPY_RATE;      // 점유율
+    String FTRVL_HH;        // 통행 시간
+    /*
+    LINK_ID      NUMBER(10) NOT NULL,
+    CRTN_DT      VARCHAR2(14) NOT NULL,
+    APLY_STRT_DT VARCHAR2(14),
+    APLY_END_DT  VARCHAR2(14),
+    TFVL         NUMBER(6) DEFAULT 0,
+    SPED         NUMBER(3) DEFAULT 0,
+    OCPY_RATE    NUMBER(5,2) DEFAULT 0,
+    TRVL_HH      NUMBER(6) DEFAULT 0
+    comment on table TB_LINK_SYOP_TRAF is               '링크 운영자 소통상황';
+    comment on column TB_LINK_SYOP_TRAF.link_id is      '링크ID';
+    comment on column TB_LINK_SYOP_TRAF.crtn_dt is      '생성 일시';
+    comment on column TB_LINK_SYOP_TRAF.aply_strt_dt is '적용 시작 일시';
+    comment on column TB_LINK_SYOP_TRAF.aply_end_dt is  '적용 종료 일시';
+    comment on column TB_LINK_SYOP_TRAF.tfvl is         '교통량';
+    comment on column TB_LINK_SYOP_TRAF.sped is         '속도';
+    comment on column TB_LINK_SYOP_TRAF.ocpy_rate is    '점유 율';
+    comment on column TB_LINK_SYOP_TRAF.trvl_hh is      '통행 시간';
+    */
+
+	int    FGridIndex;	    // 메인폼에 뿌려지는 그리드 인덱스
+
+    void SetValue(String &AOrgValue, String AValue);
+
+protected:
+    void SetFLINK_ID(String AValue);
+    void SetFCRTN_DT(String AValue);
+    void SetFAPLY_STRT_DT(String AValue);
+    void SetFAPLY_END_DT(String AValue);
+    void SetFTFVL(String AValue);
+    void SetFSPED(String AValue);
+    void SetFOCPY_RATE(String AValue);
+    void SetFTRVL_HH(String AValue);
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+ 	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+
+    __property String LINK_ID      = {read = FLINK_ID,      write = SetFLINK_ID };
+    __property String CRTN_DT      = {read = FCRTN_DT,      write = SetFCRTN_DT };
+    __property String APLY_STRT_DT = {read = FAPLY_STRT_DT, write = SetFAPLY_STRT_DT };
+    __property String APLY_END_DT  = {read = FAPLY_END_DT,  write = SetFAPLY_END_DT };
+    __property String TFVL         = {read = FTFVL,         write = SetFTFVL };
+    __property String SPED         = {read = FSPED,         write = SetFSPED };
+    __property String OCPY_RATE    = {read = FOCPY_RATE,    write = SetFOCPY_RATE };
+    __property String TRVL_HH      = {read = FTRVL_HH,      write = SetFTRVL_HH };
+
+ 	__property int    GridIndex  = {read = FGridIndex,  write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+* TrafficOprLink Manager
+*/
+class TItsTrafficOprLinkManager
+{
+public:
+    TItsTrafficOprLinkManager();
+    virtual ~TItsTrafficOprLinkManager();
+
+public:
+    int    FDataSeq;
+    ListMap<TItsTrafficOprLink>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool AllDelete(TADOConnection *ADbConn=NULL);
+    bool AllApply(int ALinkLevel, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsTrafficOprLinkManager *ItsTrafficOprLinkManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 173 - 0
COMMON/CDS/CDSUserF.cpp

@@ -0,0 +1,173 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSUserF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsUser::TItsUser()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+    //Clear();
+}
+//---------------------------------------------------------------------------
+void TItsUser::Clear()
+{
+    USER_ID      = "";  //VARCHAR2(20)	N			사용자ID
+    PWD          = "";  //VARCHAR2(64)	Y			암호
+    NAME         = "";  //VARCHAR2(30)	Y			성명
+    COMP         = "";  //VARCHAR2(50)	Y			회사
+    TEL          = "";  //VARCHAR2(128)	Y			전화번호
+    ADDR         = "";  //VARCHAR2(200)	Y			주소
+    RESD_NMBR    = "";  //VARCHAR2(14)	Y			주민번호
+    MOBILE       = "";  //VARCHAR2(128)	Y			이동전화
+    EMAL         = "";  //VARCHAR2(128)	Y			이메일
+    DEL_YN       = "";  //CHAR(1)	Y	'N'		삭제 여부
+    RGSTYMD      = "";  //VARCHAR2(14)	Y			등록일자
+    CRCTYMD      = "";  //VARCHAR2(14)	Y			수정일자
+    HINT_QUES    = "";  //VARCHAR2(7)	Y			힌트질문
+    HINT_ANS     = "";  //VARCHAR2(100)	Y			힌트질문답
+    GROP_ID      = "";  //VARCHAR2(30)	Y			그룹ID
+    OPER_SYST_ID = "";  //VARCHAR2(30)	Y			운영시스템ID
+}
+//---------------------------------------------------------------------------
+TItsUser::~TItsUser()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsUserManager *ItsUserManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* User Manager
+*/
+TItsUserManager::TItsUserManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsUserManager::~TItsUserManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TItsUserManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT *            \r\n"
+           "  FROM TB_USER_INFR \r\n";
+           //" ORDER BY USER_ID   \r\n";
+#else
+    sQry = "SELECT A.USER_ID      ,                   \r\n"
+           "       A.PWD          ,                   \r\n"
+           "       A.NAME         ,                   \r\n"
+           "       A.COMP         ,                   \r\n"
+           "       A.TEL          ,                   \r\n"
+           "       A.ADDR         ,                   \r\n"
+//           "       A.RESD_NMBR    ,                   \r\n"
+           "       A.MOBILE       ,                   \r\n"
+           "       A.EMAL         ,                   \r\n"
+           "       A.DEL_YN       ,                   \r\n"
+           "       A.RGSTYMD      ,                   \r\n"
+           "       A.CRCTYMD      ,                   \r\n"
+           "       A.HINT_QUES    ,                   \r\n"
+           "       A.HINT_ANS     ,                   \r\n"
+           "       A.GROP_ID      ,                   \r\n"
+           "       A.OPER_SYST_ID ,                   \r\n"
+           "       B.GROP_NM AS GROP_NM,              \r\n"
+           "       C.OPER_SYST_NAME AS OPER_SYST_NM   \r\n"
+           "  FROM TB_USER_INFR     A,                \r\n"
+           "       TB_USERGROP_INFR B,                \r\n"
+           "       TB_OPERSYST      C                 \r\n"
+           " WHERE A.GROP_ID      = B.GROP_ID(+)      \r\n"
+           "   AND A.OPER_SYST_ID = C.OPER_SYST_ID(+) \r\n"
+           " ORDER BY A.USER_ID                       \r\n";
+#endif
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsUser *pObj = new TItsUser();
+
+                pObj->USER_ID       = pADO->FieldByName("USER_ID")->AsString;
+
+                pObj->PWD           = pADO->FieldByName("PWD")->AsString;
+
+                pObj->NAME          = pADO->FieldByName("NAME")->AsString;
+                pObj->COMP          = pADO->FieldByName("COMP")->AsString;
+                pObj->TEL           = pADO->FieldByName("TEL")->AsString;
+                pObj->ADDR          = pADO->FieldByName("ADDR")->AsString;
+                //pObj->RESD_NMBR     = pADO->FieldByName("RESD_NMBR")->AsString;
+                pObj->MOBILE        = pADO->FieldByName("MOBILE")->AsString;
+                pObj->EMAL          = pADO->FieldByName("EMAL")->AsString;
+                pObj->DEL_YN        = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->RGSTYMD       = pADO->FieldByName("RGSTYMD")->AsString;
+                pObj->CRCTYMD       = pADO->FieldByName("CRCTYMD")->AsString;
+                pObj->HINT_QUES     = pADO->FieldByName("HINT_QUES")->AsString;
+                pObj->HINT_ANS      = pADO->FieldByName("HINT_ANS")->AsString;
+                pObj->GROP_ID       = pADO->FieldByName("GROP_ID")->AsString;
+                pObj->OPER_SYST_ID  = pADO->FieldByName("OPER_SYST_ID")->AsString;
+
+                pObj->GROP_NM       = "[" + pObj->GROP_ID + "] " + pADO->FieldByName("GROP_NM")->AsString;
+                pObj->OPER_SYST_NM  = "[" + pObj->OPER_SYST_ID + "] " + pADO->FieldByName("OPER_SYST_NM")->AsString;
+
+                if (pObj->GROP_NM      == "[] ") pObj->GROP_NM = "";
+                if (pObj->OPER_SYST_NM == "[] ") pObj->OPER_SYST_NM = "";
+
+				FLists.Push(pObj->USER_ID, pObj);
+
+                pObj->Completed = true;
+                pObj->MEM_DEL   = "N";
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsUserManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsUserManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 77 - 0
COMMON/CDS/CDSUserF.h

@@ -0,0 +1,77 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSUserFH
+#define CDSUserFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+/*
+*  User class
+*/
+class TItsUser
+{
+public:
+    TItsUser();
+    virtual ~TItsUser();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+    String  USER_ID;        //VARCHAR2(20)	N			사용자ID
+    String  PWD;            //VARCHAR2(64)	Y			암호
+    String  NAME;           //VARCHAR2(30)	Y			성명
+    String  COMP;           //VARCHAR2(50)	Y			회사
+    String  TEL;            //VARCHAR2(128)	Y			전화번호
+    String  ADDR;           //VARCHAR2(200)	Y			주소
+    String  RESD_NMBR;      //VARCHAR2(14)	Y			주민번호
+    String  MOBILE;         //VARCHAR2(128)	Y			이동전화
+    String  EMAL;           //VARCHAR2(128)	Y			이메일
+    String  DEL_YN;         //CHAR(1)	Y	'N'		삭제 여부
+    String  RGSTYMD;        //VARCHAR2(14)	Y			등록일자
+    String  CRCTYMD;        //VARCHAR2(14)	Y			수정일자
+    String  HINT_QUES;      //VARCHAR2(7)	Y			힌트질문
+    String  HINT_ANS;       //VARCHAR2(100)	Y			힌트질문답
+    String  GROP_ID;        //VARCHAR2(30)	Y			그룹ID
+    String  OPER_SYST_ID;   //VARCHAR2(30)	Y			운영시스템ID
+
+    String  GROP_NM;
+    String  OPER_SYST_NM;
+
+    String  MEM_DEL;
+    
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+* User Manager
+*/
+class TItsUserManager
+{
+public:
+    TItsUserManager();
+    virtual ~TItsUserManager();
+
+public:
+    ListMap<TItsUser>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsUserManager *ItsUserManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 372 - 0
COMMON/CDS/CDSUtisF.cpp

@@ -0,0 +1,372 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSUtisF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsUtis::TItsUtis()
+{
+	FGridIndex  = -1;	    // 그리드 인덱스
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsUtis::Clear()
+{
+#if 0
+
+	FGridIndex  = -1;	    // 그리드 인덱스
+
+#endif
+}
+//---------------------------------------------------------------------------
+TItsUtis::~TItsUtis()
+{
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TItsUtisManager *ItsUtisManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Utis Manager
+*/
+TItsUtisManager::TItsUtisManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsUtisManager::~TItsUtisManager()
+{
+}
+//---------------------------------------------------------------------------
+void TItsUtisManager::SetCenterId(String ACenterId)
+{
+    CenterId = ACenterId;
+}
+//---------------------------------------------------------------------------
+
+bool TItsUtisManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    return LoadUtisMaster(ADbConn);
+}
+//---------------------------------------------------------------------------
+bool TItsUtisManager::LoadUtisMaster(TADOConnection *ADbConn/*=NULL*/)
+{
+    for (int ii = 0; ii < MAX_UTIS_RUN; ii++)
+    {
+        UtisRun.Status[ii] = "0";
+        UtisRun.TotCnt[ii] = 0;
+        UtisRun.RunCnt[ii] = 0;
+        UtisRun.LastTime[ii] = "";
+        RseRun[ii] = 0;
+    }
+
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT COUNT(1) AS CCTVCNT \r\n"
+           "  FROM TB_CCTV_CTLR        \r\n"
+           " WHERE DEL_YN = 'N'        \r\n";
+
+    FTotCctvCnt = 0;
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                 FTotCctvCnt = pADO->FieldByName("CCTVCNT")->AsInteger;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsUtisManager::LoadUtisMaster", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsUtisManager::LoadUtisMaster", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsUtisManager::LoadUtisStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    try
+    {
+        ItsUtisManager->FLists.Lock();
+        for (int ii = 0; ii < MAX_UTIS_RUN; ii++)
+        {
+            UtisRun.Status[ii] = "0";
+            UtisRun.TotCnt[ii] = 0;
+            UtisRun.RunCnt[ii] = 0;
+            UtisRun.LastTime[ii] = "";
+            RseRun[ii] = 0;
+        }
+
+        LoadUtisStatusUtisRun(ADbConn);
+        LoadUtisStatusRseRun(ADbConn);
+    }
+    __finally
+    {
+        ItsUtisManager->FLists.UnLock();
+    }
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsUtisManager::LoadUtisStatusUtisRun(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+//
+return true;
+
+    sQry = "SELECT OPCODE, TO_CHAR(COLLDT, 'YYYY-MM-DD HH24:MI:SS') AS COLLDT, RECORDCNT,                    \r\n"
+           "       DECODE(OPCODE, '20', DECODE(SIGN(COLLDT - (SYSDATE - 9/60/24)), -1, 'X', 'O'),            \r\n"
+           "                            DECODE(SIGN(COLLDT - (SYSDATE - 9/60/24)), -1, 'X', 'O')) AS COMMCHK \r\n"
+           "  FROM RUTIS.CENTERCOMM                                                                          \r\n"
+           " WHERE COMMTYPE = '1'                                                                            \r\n"
+           "   AND OPCODE IN ('38', '39', '20')                                                              \r\n";
+
+#if 0
+SELECT COUNT(1)
+  FROM RUTIS.CCTVIMG_BLOB A,
+       (SELECT CCTVID,
+               MAX(COLLDT) AS COLLDT
+          FROM RUTIS.CCTVIMG_BLOB
+         WHERE COLLDT >= (SYSDATE - 9/60/24)
+         GROUP BY CCTVID) B,
+       TB_CCTV_CTLR C
+ WHERE A.CCTVID = B.CCTVID
+   AND A.COLLDT = B.COLLDT
+   AND A.CCTVID = TRIM(C.CCTV_CTLR_ID)
+   AND C.DEL_YN = 'N'
+#endif
+
+    String sTrfTime = "-?-";
+    String sDirTime = "-?-";
+    String sImgTime = "-?-";
+    int    nTrfCnt = 0;
+    int    nDirCnt = 0;
+    int    nImgCnt = 0;
+    bool bTrf = false;
+    bool bDir = false;
+    bool bImg = false;
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sOpCode = pADO->FieldByName("OPCODE")->AsString;
+                if (sOpCode == "38")    // 5분 교통정보 수신(센터)
+                {
+                    String sCommChk = pADO->FieldByName("COMMCHK")->AsString;
+                    if (sCommChk == "O")
+                    {
+                        bTrf = true;
+                    }
+                    sTrfTime = pADO->FieldByName("COLLDT")->AsString;
+                    nTrfCnt  = pADO->FieldByName("RECORDCNT")->AsInteger;
+                }
+                else
+                if (sOpCode == "39")    // 5분 방향별 교통정보 수신(센터)
+                {
+                    String sCommChk = pADO->FieldByName("COMMCHK")->AsString;
+                    if (sCommChk == "O")
+                    {
+                        bDir = true;
+                    }
+                    sDirTime = pADO->FieldByName("COLLDT")->AsString;
+                    nDirCnt  = pADO->FieldByName("RECORDCNT")->AsInteger;
+                }
+                else
+                if (sOpCode == "20")   // 정지영상 생성
+                {
+                    String sCommChk = pADO->FieldByName("COMMCHK")->AsString;
+                    if (sCommChk == "O")
+                    {
+                        bImg = true;
+                    }
+                    sImgTime = pADO->FieldByName("COLLDT")->AsString;
+                    nImgCnt  = pADO->FieldByName("RECORDCNT")->AsInteger;
+                }
+            }
+
+            if (bTrf)
+            {
+                UtisRun.Status[1] = "1";
+                UtisRun.TotCnt[1] = 0;
+                UtisRun.RunCnt[1] = nTrfCnt;
+                UtisRun.LastTime[1] = sTrfTime;
+            }
+            else
+            {
+                UtisRun.Status[1] = "0";
+                UtisRun.TotCnt[1] = 0;
+                UtisRun.RunCnt[1] = 0;
+                UtisRun.LastTime[1] = sTrfTime;
+            }
+
+            if (bDir)
+            {
+                UtisRun.Status[2] = "1";
+                UtisRun.TotCnt[2] = 0;
+                UtisRun.RunCnt[2] = nDirCnt;
+                UtisRun.LastTime[2] = sTrfTime;
+            }
+            else
+            {
+                UtisRun.Status[2] = "0";
+                UtisRun.TotCnt[2] = 0;
+                UtisRun.RunCnt[2] = 0;
+                UtisRun.LastTime[2] = sDirTime;
+            }
+
+            if (bImg)
+            {
+                UtisRun.Status[0] = "1";
+                UtisRun.TotCnt[0] = nImgCnt;//m_nCctvCnt;
+
+                if (nImgCnt > FTotCctvCnt)
+                    nImgCnt = FTotCctvCnt;
+
+                UtisRun.RunCnt[0] = nImgCnt;
+                UtisRun.LastTime[0] = sImgTime;
+                //if (m_nCctvCnt != nImgCnt)
+                //{
+                //    UtisRun.Status[0] = 2;
+                //}
+            }
+            else
+            {
+                UtisRun.Status[0] = "0";
+                UtisRun.TotCnt[0] = 0;//nImgCnt;//m_nCctvCnt;
+                UtisRun.RunCnt[0] = 0;//nImgCnt;
+                UtisRun.LastTime[0] = sImgTime;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsUtisManager::LoadUtisStatusUtisRun", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsUtisManager::LoadUtisStatusUtisRun", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TItsUtisManager::LoadUtisStatusRseRun(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+return true;
+    sQry = "SELECT 0 AS COLTYPE, COUNT(1) AS UPCNT    \r\n"
+           "  FROM RUTIS.RSEMST                       \r\n"
+           "UNION ALL                                 \r\n"
+           "SELECT 1 AS COLTYPE, COUNT(1) AS UPCNT    \r\n"
+           "  FROM RUTIS.RSEOPSTATE A, RUTIS.RSEMST B \r\n"
+           " WHERE B.RSEID = A.RSEID                  \r\n"
+           "   AND A.COLLDT > SYSDATE - 30/1440       \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                int nColType = pADO->FieldByName("COLTYPE")->AsInteger;
+                if (nColType >= 0 && nColType < MAX_UTIS_RUN)
+                {
+                    RseRun[nColType] = pADO->FieldByName("UPCNT")->AsInteger;
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsUtisManager::LoadUtisStatusRseRun", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsUtisManager::LoadUtisStatusRseRun", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        ItsUtisManager->FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+

+ 82 - 0
COMMON/CDS/CDSUtisF.h

@@ -0,0 +1,82 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSUtisFH
+#define CDSUtisFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+/*
+*  Utis class
+*/
+class TItsUtis
+{
+public:
+    TItsUtis();
+    virtual ~TItsUtis();
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+
+	int    FGridIndex;	    // 메인폼에 뿌려지는 그리드 인덱스
+
+    void SetValue(String &AOrgValue, String AValue);
+
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    GridIndex  = {read = FGridIndex,  write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+#define MAX_UTIS_RUN    3
+typedef struct
+{
+    String Status[MAX_UTIS_RUN];
+    int    TotCnt[MAX_UTIS_RUN];
+    int    RunCnt[MAX_UTIS_RUN];
+    String LastTime[MAX_UTIS_RUN];
+} UTIS_RUN;
+
+
+/*
+* Utis Manager
+*/
+class TItsUtisManager
+{
+public:
+    TItsUtisManager();
+    virtual ~TItsUtisManager();
+
+public:
+    String              CenterId;
+    UTIS_RUN            UtisRun;
+    int                 FTotCctvCnt;
+    int                 RseRun[MAX_UTIS_RUN];
+    ListMap<TItsUtis>   FLists;
+
+public:
+    void SetCenterId(String ACenterId);
+
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadUtisMaster(TADOConnection *ADbConn=NULL);
+    
+    bool LoadUtisStatusFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadUtisStatusUtisRun(TADOConnection *ADbConn=NULL);
+    bool LoadUtisStatusRseRun(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsUtisManager *ItsUtisManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 583 - 0
COMMON/CDS/CDSVilgFrcsF.cpp

@@ -0,0 +1,583 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSVilgFrcsF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TItsVilgFrcsManager *ItsVilgFrcsManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* VilgFrcs Manager
+*/
+TItsVilgFrcsManager::TItsVilgFrcsManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsVilgFrcsManager::~TItsVilgFrcsManager()
+{
+}
+//---------------------------------------------------------------------------
+
+bool TItsVilgFrcsManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                    \r\n"
+           "  FROM TB_VILG_FRCS_ZONE    \r\n"
+           " ORDER BY VILG_FRCS_ZONE_NM \r\n";
+
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsVilgFrcs *pObj = new TItsVilgFrcs();
+
+                pObj->VILG_FRCS_ZONE_CD = pADO->FieldByName("VILG_FRCS_ZONE_CD")->AsString;      //	N	NUMBER(14)	    N			동네 예보 구역 코드
+                pObj->VILG_FRCS_ZONE_NM = pADO->FieldByName("VILG_FRCS_ZONE_NM")->AsString;      //	N	VARCHAR2(40)	Y			동네 예보 구역 명
+                pObj->X_CRDN = pADO->FieldByName("X_CRDN")->AsString;    //X 좌표
+                pObj->Y_CRDN = pADO->FieldByName("Y_CRDN")->AsString;    //Y 좌표
+
+				FLists.Push(pObj->VILG_FRCS_ZONE_CD, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsVilgFrcsManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsVilgFrcsManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+#if 0
+    return true;
+#else
+    return LoadFromDbAtmp(ADbConn);
+#endif
+}
+//---------------------------------------------------------------------------
+bool TItsVilgFrcsManager::LoadFromDbAtmp(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                  \r\n"
+           "  FROM TB_ATMP_PLTN_STTN  \r\n"
+           " ORDER BY STTN_NM         \r\n";
+
+    try
+    {
+        FAtmpLists.Lock();
+        FAtmpLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsAtmpPltn *pObj = new TItsAtmpPltn();
+
+                pObj->STTN_NM       = pADO->FieldByName("STTN_NM")->AsString;       //		N	VARCHAR2(30)	N			측정소 명
+                pObj->STTN_ADDR     = pADO->FieldByName("STTN_ADDR")->AsString;     //		N	VARCHAR2(200)	Y			측정소 주소
+                pObj->ISTL_YY       = pADO->FieldByName("ISTL_YY")->AsString;       //		N	VARCHAR2(4)	Y			설치 년도
+                pObj->MNGM_INTN_NM  = pADO->FieldByName("MNGM_INTN_NM")->AsString;  //		N	VARCHAR2(100)	Y			관리 기관 명
+                pObj->MSRM_SYST_NM  = pADO->FieldByName("MSRM_SYST_NM")->AsString;  //		N	VARCHAR2(10)	Y			측정 시스템 명
+                pObj->MSRM_ITEM     = pADO->FieldByName("MSRM_ITEM")->AsString;     //		N	VARCHAR2(100)	Y			측정 항목
+                pObj->X_CRDN        = pADO->FieldByName("X_CRDN")->AsString;        //X 좌표
+                pObj->Y_CRDN        = pADO->FieldByName("Y_CRDN")->AsString;        //Y 좌표
+
+				FAtmpLists.Push(pObj->STTN_NM, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsVilgFrcsManager::LoadFromDbAtmp", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsVilgFrcsManager::LoadFromDbAtmp", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FAtmpLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsVilgFrcsManager::LoadVilgFrcsInfo(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.*,                                                                                                  \r\n"
+           "       NVL((SELECT CMMN_CD                                                                                   \r\n"
+           "              FROM TB_CMMN_CD                                                                                \r\n"
+           "             WHERE CMMN_CLSF_CD = 'DFW'                                                                      \r\n"
+           "               AND CMMN_CD_KOR_NM(+) = WTCD_KOR_NM), 'XXX') AS WTCD_KOR_CD                                   \r\n"
+           "  FROM TB_VILG_FRCS A                                                                                        \r\n"
+           " WHERE (A.VILG_FRCS_ZONE_CD, A.ANNC_DT) IN (SELECT VILG_FRCS_ZONE_CD, MAX(ANNC_DT) AS ANNC_DT                \r\n"
+           "                                              FROM TB_VILG_FRCS                                              \r\n"
+           "                                             WHERE ANNC_DT >= TO_CHAR(SYSDATE-240/1440,'YYYYMMDDHH24MISS')   \r\n"
+           "                                               AND ORD = 0                                                   \r\n"
+           "                                             GROUP BY VILG_FRCS_ZONE_CD)                                     \r\n"
+           "   AND A.ORD = 0                                                                                             \r\n";
+
+    try
+    {
+        float fTemp;
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String VILG_FRCS_ZONE_CD = pADO->FieldByName("VILG_FRCS_ZONE_CD")->AsString;
+				TItsVilgFrcs *pObj = FLists.Find(VILG_FRCS_ZONE_CD);
+                if (!pObj) continue;
+
+                pObj->ANNC_DT             = pADO->FieldByName("ANNC_DT")->AsString;                //	N	VARCHAR2(14)	N			발표 일시
+                pObj->ORD                 = pADO->FieldByName("ORD")->AsString;                    //	N	NUMBER(3)	    N	0		순서
+                pObj->HH                  = pADO->FieldByName("HH")->AsString;                     //	N	NUMBER(3)	    Y	0		시간
+                pObj->DD                  = pADO->FieldByName("DD")->AsString;                     //	N	NUMBER(3)	    Y	0		일
+                pObj->PRST_TMPR           = pADO->FieldByName("PRST_TMPR")->AsString;              //	N	NUMBER(6,3)	    Y			현재 온도
+                pObj->HGHS_TMPR           = pADO->FieldByName("HGHS_TMPR")->AsString;              //	N	NUMBER(6,3)	    Y			최고 온도
+                pObj->LWST_TMPR           = pADO->FieldByName("LWST_TMPR")->AsString;              //	N	NUMBER(6,3)	    Y			최저 온도
+#if 0
+                pObj->ATMP_STTS           = pADO->FieldByName("ATMP_STTS")->AsString;              //	N	NUMBER(2)	    Y			대기 상태
+#else
+                switch(pADO->FieldByName("ATMP_STTS")->AsInteger)
+                {
+                case 1: pObj->ATMP_STTS = "맑음";       break;
+                case 2: pObj->ATMP_STTS = "구름조금";   break;
+                case 3: pObj->ATMP_STTS = "구름많음";   break;
+                case 4: pObj->ATMP_STTS = "흐림";       break;
+                default:
+                    pObj->ATMP_STTS = pADO->FieldByName("ATMP_STTS")->AsString;
+                    break;
+                }
+#endif
+
+                pObj->WTCD_KOR_NM         = pADO->FieldByName("WTCD_KOR_NM")->AsString;            //	N	VARCHAR2(20)	Y			날씨 한글 명
+#if 0
+                pObj->PRCP_STTS           = pADO->FieldByName("PRCP_STTS")->AsString;              //	N	NUMBER(3)	    Y	0		강수 상태
+#else
+                switch(pADO->FieldByName("PRCP_STTS")->AsInteger)
+                {
+                case 0: pObj->PRCP_STTS = "없음";   break;
+                case 1: pObj->PRCP_STTS = "비";     break;
+                case 2: pObj->PRCP_STTS = "비/눈";  break;
+                case 3: pObj->PRCP_STTS = "눈";     break;
+                default:
+                    pObj->PRCP_STTS = pADO->FieldByName("PRCP_STTS")->AsString;
+                    break;
+                }
+#endif
+                pObj->WTCD_ENGL_NM        = pADO->FieldByName("WTCD_ENGL_NM")->AsString;           //	N	VARCHAR2(20)	Y			날씨 영문 명
+                pObj->PRCP_PR             = pADO->FieldByName("PRCP_PR")->AsString;                //	N	NUMBER(5,2)	    Y	0		강수 확률
+                pObj->ESTM_PRAM_12HH      = pADO->FieldByName("ESTM_PRAM_12HH")->AsString;         //	N	NUMBER(5,2)	    Y	0		예상 강수량 12시간
+                pObj->ESTM_SNOW_AMUT_12HH = pADO->FieldByName("ESTM_SNOW_AMUT_12HH")->AsString;    //	N	NUMBER(5,2)	    Y	0		예상 눈 량 12시간
+                pObj->WNSP                = pADO->FieldByName("WNSP")->AsString;                   //	N	NUMBER(5,2)	    Y	0		풍속
+                pObj->WNDR                = pADO->FieldByName("WNDR")->AsString;                   //	N	NUMBER(2)	    Y			풍향
+                pObj->WNDR_KOR_NM         = pADO->FieldByName("WNDR_KOR_NM")->AsString;            //	N	VARCHAR2(20)	Y			풍향 한글 명
+                pObj->WNDR_ENGL_NM        = pADO->FieldByName("WNDR_ENGL_NM")->AsString;           //	N	VARCHAR2(20)	Y			풍향 영문 명
+                pObj->HMDT                = pADO->FieldByName("HMDT")->AsString;                   //	N	NUMBER(5,2)	    Y	0		습도
+                pObj->ESTM_PRCP_AMUT_6HH  = pADO->FieldByName("ESTM_PRCP_AMUT_6HH")->AsString;     //	N	NUMBER(5,2)	    Y	0		예상 강수 량 6시간
+                pObj->ESTM_SNOW_AMUT_6HH  = pADO->FieldByName("ESTM_SNOW_AMUT_6HH")->AsString;     //	N	NUMBER(5,2)	    Y	0		예상 눈 량 6시간
+                pObj->WTCD_KOR_CD         = pADO->FieldByName("WTCD_KOR_CD")->AsString;
+
+                if (pObj->WTCD_KOR_CD == "XXX" || pObj->VILG_FRCS_ZONE_NM.Trim() == "")
+                {
+                    pObj->VILG_FRCS_ZONE_NM = "정보없음";
+                }
+
+                // 호우알람
+                fTemp = pADO->FieldByName("ESTM_PRCP_AMUT_6HH")->AsFloat;
+                pObj->PRCP_ALARM = VILG_NONE;         // 강풍알람
+                if      (fTemp >= 110) pObj->PRCP_ALARM = VILG_ALARM;
+                else if (fTemp >=  70) pObj->PRCP_ALARM = VILG_WARNING;
+                if (pObj->PRCP_ALARM != VILG_NONE)
+                {
+                }
+                // 대설알람
+                fTemp = pADO->FieldByName("ESTM_SNOW_AMUT_6HH")->AsFloat;
+                fTemp *= 4;
+                //pObj->ESTM_SNOW_AMUT_6HH = FormatFloat("#0.#0", fTemp);
+                pObj->SNOW_ALARM = VILG_NONE;         // 강풍알람
+                if      (fTemp >= 20) pObj->SNOW_ALARM = VILG_ALARM;
+                else if (fTemp >=  5) pObj->SNOW_ALARM = VILG_WARNING;
+                if (pObj->SNOW_ALARM != VILG_NONE)
+                {
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsVilgFrcsManager::LoadVilgFrcsInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsVilgFrcsManager::LoadVilgFrcsInfo", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    LoadVilgShprInfo(ADbConn);
+    LoadAtmpPltnInfo(ADbConn);
+    return LoadAtmpSprpInfo(ADbConn);
+}
+//---------------------------------------------------------------------------
+bool TItsVilgFrcsManager::LoadVilgShprInfo(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                                                       \r\n"
+           "  FROM TB_SHPR_RLCN_PNST                                       \r\n"
+           " WHERE ANNC_DT >= TO_CHAR(SYSDATE-120/1440,'YYYYMMDDHH24MISS') \r\n";
+
+    try
+    {
+        int nTemp;
+        float fTemp;
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String VILG_FRCS_ZONE_CD = pADO->FieldByName("VILG_FRCS_ZONE_CD")->AsString;
+				TItsVilgFrcs *pObj = FLists.Find(VILG_FRCS_ZONE_CD);
+                if (!pObj) continue;
+
+                pObj->shpr.ANNC_DT   = pADO->FieldByName("ANNC_DT")->AsString;            //	N	VARCHAR2(14)	N			발표 일시
+                pObj->shpr.TMPR      = pADO->FieldByName("TMPR")->AsString;               //	N	NUMBER(6,3)	    Y			온도
+                pObj->shpr.PRAM_1HH  = pADO->FieldByName("PRAM_1HH")->AsString;           //	N	NUMBER(5,2)	    Y	0		강수량 1시간
+                pObj->shpr.ATMP_STTS = pADO->FieldByName("ATMP_STTS")->AsString;          //	N	NUMBER(2)	    Y			대기 상태
+                pObj->shpr.ESWS_WNSP = pADO->FieldByName("ESWS_WNSP")->AsString;          //	N	NUMBER(5,2)	    Y	0		동서 풍속
+                pObj->shpr.NRST_WNSP = pADO->FieldByName("NRST_WNSP")->AsString;          //	N	NUMBER(5,2)	    Y	0		남북 풍속
+                pObj->shpr.HMDT      = pADO->FieldByName("HMDT")->AsString;               //	N	NUMBER(5,2)	    Y	0		습도
+                pObj->shpr.PRCP_STTS = pADO->FieldByName("PRCP_STTS")->AsString;          //	N	NUMBER(3)	    Y	0		강수 상태
+                pObj->shpr.THND_STTS = pADO->FieldByName("THND_STTS")->AsString;          //	N	NUMBER(2)	    Y			낙뢰 상태
+                pObj->shpr.WNDR      = pADO->FieldByName("WNDR")->AsString;               //	N	NUMBER(2)	    Y			풍향
+                pObj->shpr.WNSP      = pADO->FieldByName("WNSP")->AsString;               //	N	NUMBER(5,2)	    Y	0		풍속
+
+                //하늘상태 - 맑음(1), 구름조금(2), 구름많음(3), 흐림(4)
+                switch(pObj->shpr.ATMP_STTS.ToIntDef(0))
+                {
+                case 1:  pObj->shpr.ATMP_STTS_NM = "맑음";     break;
+                case 2:  pObj->shpr.ATMP_STTS_NM = "구름조금"; break;
+                case 3:  pObj->shpr.ATMP_STTS_NM = "구름많음"; break;
+                case 4:  pObj->shpr.ATMP_STTS_NM = "흐림";     break;
+                default: pObj->shpr.ATMP_STTS_NM = "-";        break;
+                }
+
+                // 동서바람성분(m/s) - 동(+), 서(-)
+                fTemp = pADO->FieldByName("ESWS_WNSP")->AsFloat;
+                if      (fTemp > 0)  pObj->shpr.ESWS_WNSP_NM = "동 " + FormatFloat("#0.#0", fTemp);
+                else if (fTemp < 0)  pObj->shpr.ESWS_WNSP_NM = "서 " + FormatFloat("#0.#0", fTemp*-1);
+                else                 pObj->shpr.ESWS_WNSP_NM = "-";
+
+                // 남북바람성분(m/s) - 북(+), 남(-)
+                fTemp = pADO->FieldByName("NRST_WNSP")->AsFloat;
+                if      (fTemp > 0)  pObj->shpr.NRST_WNSP_NM = "북 " + FormatFloat("#0.#0", fTemp);
+                else if (fTemp < 0)  pObj->shpr.NRST_WNSP_NM = "남 " + FormatFloat("#0.#0", fTemp*-1);
+                else                 pObj->shpr.NRST_WNSP_NM = "-";
+
+                //강수형태 - 없음(0), 비(1), 비/눈(2), 눈(3)
+                switch(pObj->shpr.PRCP_STTS.ToIntDef(0))
+                {
+                case 0:  pObj->shpr.PRCP_STTS_NM = "없음";  break;
+                case 1:  pObj->shpr.PRCP_STTS_NM = "비";    break;
+                case 2:  pObj->shpr.PRCP_STTS_NM = "비/눈"; break;
+                case 3:  pObj->shpr.PRCP_STTS_NM = "눈";    break;
+                default: pObj->shpr.PRCP_STTS_NM = "-";     break;
+                }
+
+                //낙뢰 - 없음(0), 있음(1)
+                switch(pObj->shpr.THND_STTS.ToIntDef(0))
+                {
+                case 0:  pObj->shpr.THND_STTS_NM = "없음"; break;
+                case 1:  pObj->shpr.THND_STTS_NM = "비";   break;
+                default: pObj->shpr.THND_STTS_NM = "-";    break;
+                }
+
+                fTemp = pADO->FieldByName("WNSP")->AsFloat;
+                pObj->shpr.WNSP_ALARM = VILG_NONE;         // 강풍알람
+                if      (fTemp >= 21) pObj->shpr.WNSP_ALARM = VILG_ALARM;
+                else if (fTemp >= 14) pObj->shpr.WNSP_ALARM = VILG_WARNING;
+                if (pObj->shpr.WNSP_ALARM != VILG_NONE)
+                {
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsVilgFrcsManager::LoadVilgShprInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsVilgFrcsManager::LoadVilgShprInfo", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+String TItsVilgFrcsManager::GetGradeDesc(String &ACode)
+{
+    ACode = ACode.Trim();
+    if (ACode == "1") return ATMP_GOOD;
+    if (ACode == "2") return ATMP_NORMAL;
+    if (ACode == "3") return ATMP_BAD;
+    if (ACode == "4") return ATM_VERY_BAD;
+
+    ACode = "0";
+    return ATMP_NONE;
+}
+//---------------------------------------------------------------------------
+
+bool TItsVilgFrcsManager::LoadAtmpPltnInfo(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                                                       \r\n"
+           "  FROM TB_ATMP_PLTN_RT_PNST                                    \r\n"
+           " WHERE MSRM_DT >= TO_CHAR(SYSDATE-120/1440,'YYYYMMDDHH24MISS') \r\n";
+
+    try
+    {
+        int nTemp;
+        float fTemp;
+        FAtmpLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String STTN_NM = pADO->FieldByName("STTN_NM")->AsString;
+				TItsAtmpPltn *pObj = FAtmpLists.Find(STTN_NM);
+                if (!pObj) continue;
+
+                pObj->pnst.STTN_NM          = STTN_NM;        //	N	VARCHAR2(30)	N			측정소 명
+                pObj->pnst.MSRM_DT          = pADO->FieldByName("MSRM_DT")->AsString;        //	N	VARCHAR2(14)	Y			측정 일시
+                pObj->pnst.MSRM_SYST_NM     = pADO->FieldByName("MSRM_SYST_NM")->AsString;   //	N	VARCHAR2(10)	Y			측정 시스템 명
+                pObj->pnst.CO_VAL           = pADO->FieldByName("CO_VAL")->AsString;         //	N	VARCHAR2(10)	Y			CO 값
+                pObj->pnst.SO2_VAL          = pADO->FieldByName("SO2_VAL")->AsString;        //	N	VARCHAR2(10)	Y			SO2 값
+                pObj->pnst.NO2_VAL          = pADO->FieldByName("NO2_VAL")->AsString;        //	N	VARCHAR2(10)	Y			NO2 값
+                pObj->pnst.O3_VAL           = pADO->FieldByName("O3_VAL")->AsString;         //	N	VARCHAR2(10)	Y			O3 값
+                pObj->pnst.PM10_VAL         = pADO->FieldByName("PM10_VAL")->AsString;       //	N	VARCHAR2(10)	Y			PM10 값
+                pObj->pnst.PM10_24HH_VAL    = pADO->FieldByName("PM10_24HH_VAL")->AsString;  //	N	VARCHAR2(10)	Y			PM10 24시간 값
+                pObj->pnst.PM25_VAL         = pADO->FieldByName("PM25_VAL")->AsString;       //	N	VARCHAR2(10)	Y			PM25 값
+                pObj->pnst.PM25_24HH_VAL    = pADO->FieldByName("PM25_24HH_VAL")->AsString;  //	N	VARCHAR2(10)	Y			PM25 24시간 값
+                pObj->pnst.INTG_ATMP_VAL    = pADO->FieldByName("INTG_ATMP_VAL")->AsString;  //	N	VARCHAR2(10)	Y			통합 대기 값
+                pObj->pnst.INTG_ATMP_GRAD   = pADO->FieldByName("INTG_ATMP_GRAD")->AsString; //	N	VARCHAR2(10)	Y			통합 대기 등급
+                pObj->pnst.SO2_GRAD         = pADO->FieldByName("SO2_GRAD")->AsString;       //	N	VARCHAR2(10)	Y			SO2 등급
+                pObj->pnst.CO_GRAD          = pADO->FieldByName("CO_GRAD")->AsString;        //	N	VARCHAR2(10)	Y			CO 등급
+                pObj->pnst.O3_GRAD          = pADO->FieldByName("O3_GRAD")->AsString;        //	N	VARCHAR2(10)	Y			O3 드급
+                pObj->pnst.NO2_GRAD         = pADO->FieldByName("NO2_GRAD")->AsString;       //	N	VARCHAR2(10)	Y			NO2 등급
+                pObj->pnst.PM10_24HH_GRAD   = pADO->FieldByName("PM10_24HH_GRAD")->AsString; //	N	VARCHAR2(10)	Y			PM10 24시간 등급
+                pObj->pnst.PM25_24HH_GRAD   = pADO->FieldByName("PM25_24HH_GRAD")->AsString; //	N	VARCHAR2(10)	Y			PM25 24시간 등급
+                pObj->pnst.PM10_1HH_GRAD    = pADO->FieldByName("PM10_1HH_GRAD")->AsString;  //	N	VARCHAR2(10)	Y			PM10 1시간 등급
+                pObj->pnst.PM25_1HH_GRAD    = pADO->FieldByName("PM25_1HH_GRAD")->AsString;  //	N	VARCHAR2(10)	Y			PM25 1시간 등급
+
+                pObj->pnst.INTG_ATMP_GRAD_NM   = GetGradeDesc(pObj->pnst.INTG_ATMP_GRAD);
+                pObj->pnst.SO2_GRAD_NM         = GetGradeDesc(pObj->pnst.SO2_GRAD);
+                pObj->pnst.CO_GRAD_NM          = GetGradeDesc(pObj->pnst.CO_GRAD);
+                pObj->pnst.O3_GRAD_NM          = GetGradeDesc(pObj->pnst.O3_GRAD);
+                pObj->pnst.NO2_GRAD_NM         = GetGradeDesc(pObj->pnst.NO2_GRAD);
+                pObj->pnst.PM10_24HH_GRAD_NM   = GetGradeDesc(pObj->pnst.PM10_24HH_GRAD);
+                pObj->pnst.PM25_24HH_GRAD_NM   = GetGradeDesc(pObj->pnst.PM25_24HH_GRAD);
+                pObj->pnst.PM10_1HH_GRAD_NM    = GetGradeDesc(pObj->pnst.PM10_1HH_GRAD);
+                pObj->pnst.PM25_1HH_GRAD_NM    = GetGradeDesc(pObj->pnst.PM25_1HH_GRAD);
+
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsVilgFrcsManager::LoadAtmpPltnInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsVilgFrcsManager::LoadAtmpPltnInfo", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FAtmpLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsVilgFrcsManager::LoadAtmpSprpInfo(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                                                    \r\n"
+           "  FROM TB_ATMP_PLTN_SPRP_PNST A                             \r\n"
+           " WHERE A.ANNC_DVSN = '1'                                    \r\n"
+           "   AND A.ANNC_DT > TO_CHAR(SYSDATE-31/1440,'YYYYMMDDHH24')  \r\n";
+
+    try
+    {
+        FSprpLists.Lock();
+        FSprpLists.RemoveAll();
+
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                TItsAtmpSprp *pObj = new TItsAtmpSprp();
+
+                pObj->ATMP_PLTN_KIND = pADO->FieldByName("ATMP_PLTN_KIND")->AsString.Trim(); //	N	VARCHAR2(1)	    N			대기 오염 종류(1:미세먼지, 2:초미세먼지)
+                pObj->ANNC_DT        = pADO->FieldByName("ANNC_DT")->AsString.Trim();        //	N	VARCHAR2(14)	Y			Update 시간
+                pObj->REGN_CD        = pADO->FieldByName("REGN_CD")->AsString.Trim();        //	N	VARCHAR2(1)	    Y	2		권역 코드(1:북부권, 2:동부권, 3:중부권, 4:남부권) 남양주=동부권
+                pObj->ANNC_YMD       = pADO->FieldByName("ANNC_YMD")->AsString.Trim();       //	N	VARCHAR2(8)	    Y			발표 일자(4)
+                pObj->ANNC_HH        = pADO->FieldByName("ANNC_HH")->AsString.Trim();        //	N	VARCHAR2(2)	    Y			발표 시간(2)
+                pObj->ANNC_GRAD      = pADO->FieldByName("ANNC_GRAD")->AsString.Trim();      //	N	VARCHAR2(1)	    Y			발표 등급(1:주의보, 2:경보, 5:황사경보)
+                pObj->ANNC_DVSN      = pADO->FieldByName("ANNC_DVSN")->AsString.Trim();      //	N	VARCHAR2(1)	    Y			발표 구분(1:발령, 0:해제, 2:발령내역없음)
+
+				FSprpLists.Push(pObj->ATMP_PLTN_KIND, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsVilgFrcsManager::LoadAtmpSprpInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsVilgFrcsManager::LoadAtmpSprpInfo", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FSprpLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 224 - 0
COMMON/CDS/CDSVilgFrcsF.h

@@ -0,0 +1,224 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVilgFrcsFH
+#define CDSVilgFrcsFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+#define     VILG_NONE       "-"
+#define     VILG_WARNING    "주의보"
+#define     VILG_ALARM      "경보"
+
+#define     ATMP_NONE       "진행중"
+#define     ATMP_GOOD       "좋음"
+#define     ATMP_NORMAL     "보통"
+#define     ATMP_BAD        "나쁨"
+#define     ATM_VERY_BAD    "매우나쁨"
+
+/*
+* TB_SHPR_RLCN_PNST(초단기실황)
+*/
+typedef struct tagVilgShpr
+{
+    String	VILG_FRCS_ZONE_CD;  //	N	NUMBER(14)	    N			동네 예보 구역 코드
+    String	ANNC_DT;            //	N	VARCHAR2(14)	Y			발표 일시
+    String	TMPR;               //	N	NUMBER(6,3)	    Y			온도
+    String	PRAM_1HH;           //	N	NUMBER(5,2)	    Y	0		강수량 1시간
+    String	ATMP_STTS;          //	N	NUMBER(2)	    Y			대기 상태
+    String	ESWS_WNSP;          //	N	NUMBER(5,2)	    Y	0		동서 풍속
+    String	NRST_WNSP;          //	N	NUMBER(5,2)	    Y	0		남북 풍속
+    String	HMDT;               //	N	NUMBER(5,2)	    Y	0		습도
+    String	PRCP_STTS;          //	N	NUMBER(3)	    Y	0		강수 상태
+    String	THND_STTS;          //	N	NUMBER(2)	    Y			낙뢰 상태
+    String	WNDR;               //	N	NUMBER(2)	    Y			풍향
+    String	WNSP;               //	N	NUMBER(5,2)	    Y	0		풍속
+
+    String  ATMP_STTS_NM;       // 하늘상태 - 맑음(1), 구름조금(2), 구름많음(3), 흐림(4)
+    String  ESWS_WNSP_NM;       // 동서바람성분(m/s) - 동(+), 서(-)
+    String  NRST_WNSP_NM;       // 남북바람성분(m/s) - 북(+), 남(-)
+    String  PRCP_STTS_NM;       // 강수형태 - 없음(0), 비(1), 비/눈(2), 눈(3)
+    String  THND_STTS_NM;       // 낙뢰 - 없음(0), 있음(1)
+
+    String  WNSP_ALARM;         // 강풍알람
+
+} VILG_SHPR;
+
+/*
+*  VilgFrcs class
+*/
+class TItsVilgFrcs
+{
+public:
+    TItsVilgFrcs() {};
+    ~TItsVilgFrcs() {};
+
+private:
+
+public:
+    String	VILG_FRCS_ZONE_CD;      //	N	NUMBER(14)	    N			동네 예보 구역 코드
+    String	VILG_FRCS_ZONE_NM;      //	N	VARCHAR2(40)	Y			동네 예보 구역 명
+    String	X_CRDN;
+    String	Y_CRDN;
+
+    String	ANNC_DT;                //	N	VARCHAR2(14)	N			발표 일시
+    String	ORD;                    //	N	NUMBER(3)	    N	0		순서
+    String	HH;                     //	N	NUMBER(3)	    Y	0		시간
+    String	DD;                     //	N	NUMBER(3)	    Y	0		일
+    String	PRST_TMPR;              //	N	NUMBER(6,3)	    Y			현재 온도
+    String	HGHS_TMPR;              //	N	NUMBER(6,3)	    Y			최고 온도
+    String	LWST_TMPR;              //	N	NUMBER(6,3)	    Y			최저 온도
+    String	ATMP_STTS;              //	N	NUMBER(2)	    Y			대기 상태
+    String	WTCD_KOR_NM;            //	N	VARCHAR2(20)	Y			날씨 한글 명
+    String	PRCP_STTS;              //	N	NUMBER(3)	    Y	0		강수 상태
+    String	WTCD_ENGL_NM;           //	N	VARCHAR2(20)	Y			날씨 영문 명
+    String	PRCP_PR;                //	N	NUMBER(5,2)	    Y	0		강수 확률
+    String	ESTM_PRAM_12HH;         //	N	NUMBER(5,2)	    Y	0		예상 강수량 12시간
+    String	ESTM_SNOW_AMUT_12HH;    //	N	NUMBER(5,2)	    Y	0		예상 눈 량 12시간
+    String	WNSP;                   //	N	NUMBER(5,2)	    Y	0		풍속
+    String	WNDR;                   //	N	NUMBER(2)	    Y			풍향
+    String	WNDR_KOR_NM;            //	N	VARCHAR2(20)	Y			풍향 한글 명
+    String	WNDR_ENGL_NM;           //	N	VARCHAR2(20)	Y			풍향 영문 명
+    String	HMDT;                   //	N	NUMBER(5,2)	    Y	0		습도
+    String	ESTM_PRCP_AMUT_6HH;     //	N	NUMBER(5,2)	    Y	0		예상 강수 량 6시간
+    String	ESTM_SNOW_AMUT_6HH;     //	N	NUMBER(5,2)	    Y	0		예상 눈 량 6시간
+
+    String  WTCD_KOR_CD;
+
+    String  PRCP_ALARM;             // 호우알람
+    String  SNOW_ALARM;             // 대설알람
+
+    VILG_SHPR   shpr;
+
+protected:
+
+public:
+};
+//---------------------------------------------------------------------------
+
+/*
+* TB_ATMP_PLTN_RT_PNST(대기 오염 실시간 현황)
+*/
+typedef struct tagAtmpPltnRtPnst
+{
+    String	STTN_NM;        //	N	VARCHAR2(30)	N			측정소 명
+    String	MSRM_DT;        //	N	VARCHAR2(14)	Y			측정 일시
+    String	MSRM_SYST_NM;   //	N	VARCHAR2(10)	Y			측정 시스템 명
+    String	CO_VAL;         //	N	VARCHAR2(10)	Y			CO 값
+    String	SO2_VAL;        //	N	VARCHAR2(10)	Y			SO2 값
+    String	NO2_VAL;        //	N	VARCHAR2(10)	Y			NO2 값
+    String	O3_VAL;         //	N	VARCHAR2(10)	Y			O3 값
+    String	PM10_VAL;       //	N	VARCHAR2(10)	Y			PM10 값
+    String	PM10_24HH_VAL;  //	N	VARCHAR2(10)	Y			PM10 24시간 값
+    String	PM25_VAL;       //	N	VARCHAR2(10)	Y			PM25 값
+    String	PM25_24HH_VAL;  //	N	VARCHAR2(10)	Y			PM25 24시간 값
+    String	INTG_ATMP_VAL;  //	N	VARCHAR2(10)	Y			통합 대기 값
+    String	INTG_ATMP_GRAD; //	N	VARCHAR2(10)	Y			통합 대기 등급
+    String	SO2_GRAD;       //	N	VARCHAR2(10)	Y			SO2 등급
+    String	CO_GRAD;        //	N	VARCHAR2(10)	Y			CO 등급
+    String	O3_GRAD;        //	N	VARCHAR2(10)	Y			O3 드급
+    String	NO2_GRAD;       //	N	VARCHAR2(10)	Y			NO2 등급
+    String	PM10_24HH_GRAD; //	N	VARCHAR2(10)	Y			PM10 24시간 등급
+    String	PM25_24HH_GRAD; //	N	VARCHAR2(10)	Y			PM25 24시간 등급
+    String	PM10_1HH_GRAD;  //	N	VARCHAR2(10)	Y			PM10 1시간 등급
+    String	PM25_1HH_GRAD;  //	N	VARCHAR2(10)	Y			PM25 1시간 등급
+
+    String	INTG_ATMP_GRAD_NM; //	N	VARCHAR2(10)	Y			통합 대기 등급
+    String	SO2_GRAD_NM;       //	N	VARCHAR2(10)	Y			SO2 등급
+    String	CO_GRAD_NM;        //	N	VARCHAR2(10)	Y			CO 등급
+    String	O3_GRAD_NM;        //	N	VARCHAR2(10)	Y			O3 드급
+    String	NO2_GRAD_NM;       //	N	VARCHAR2(10)	Y			NO2 등급
+    String	PM10_24HH_GRAD_NM; //	N	VARCHAR2(10)	Y			PM10 24시간 등급
+    String	PM25_24HH_GRAD_NM; //	N	VARCHAR2(10)	Y			PM25 24시간 등급
+    String	PM10_1HH_GRAD_NM;  //	N	VARCHAR2(10)	Y			PM10 1시간 등급
+    String	PM25_1HH_GRAD_NM;  //	N	VARCHAR2(10)	Y			PM25 1시간 등급
+} ATMP_PLTN_RT_PNST;
+
+/*
+*  AtmpPltn class(미세먼지 클래스)
+*/
+class TItsAtmpPltn
+{
+public:
+    TItsAtmpPltn() {};
+    ~TItsAtmpPltn() {};
+
+private:
+
+public:
+    String	STTN_NM;        //	N	VARCHAR2(30)	N			측정소 명
+    String	STTN_ADDR;      //	N	VARCHAR2(200)	Y			측정소 주소
+    String	ISTL_YY;        //	N	VARCHAR2(4)	    Y			설치 년도
+    String	MNGM_INTN_NM;   //	N	VARCHAR2(100)	Y			관리 기관 명
+    String	MSRM_SYST_NM;   //	N	VARCHAR2(10)	Y			측정 시스템 명
+    String	MSRM_ITEM;      //	N	VARCHAR2(100)	Y			측정 항목
+    String	X_CRDN;         //	N	NUMBER(11,8)	Y			X 좌표
+    String	Y_CRDN;         //	N	NUMBER(10,8)	Y			Y 좌표
+
+    ATMP_PLTN_RT_PNST   pnst;
+protected:
+
+public:
+};
+//---------------------------------------------------------------------------
+
+/*
+*  대기오염특보 클래스
+*/
+class TItsAtmpSprp
+{
+public:
+    TItsAtmpSprp() {};
+    ~TItsAtmpSprp() {};
+
+private:
+
+public:
+    String	ATMP_PLTN_KIND; //	N	VARCHAR2(1)	    N			대기 오염 종류(1:미세먼지, 2:초미세먼지)
+    String	ANNC_DT;        //	N	VARCHAR2(14)	Y			Update 시간
+    String	REGN_CD;        //	N	VARCHAR2(1)	    Y	2		권역 코드(1:북부권, 2:동부권, 3:중부권, 4:남부권) 남양주=동부권
+    String	ANNC_YMD;       //	N	VARCHAR2(8)	    Y			발표 일자(4)
+    String	ANNC_HH;        //	N	VARCHAR2(2)	    Y			발표 시간(2)
+    String	ANNC_GRAD;      //	N	VARCHAR2(1)	    Y			발표 등급(1:주의보, 2:경보, 5:황사경보)
+    String	ANNC_DVSN;      //	N	VARCHAR2(1)	    Y			발표 구분(1:발령, 0:해제, 2:발령내역없음)
+
+protected:
+
+public:
+};
+//---------------------------------------------------------------------------
+
+/*
+* VilgFrcs Manager
+*/
+class TItsVilgFrcsManager
+{
+public:
+    TItsVilgFrcsManager();
+    ~TItsVilgFrcsManager();
+
+public:
+    ListMap<TItsVilgFrcs>   FLists;
+    ListMap<TItsAtmpPltn>   FAtmpLists;
+    ListMap<TItsAtmpSprp>   FSprpLists;
+
+public:
+    String GetGradeDesc(String &ACode);
+
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadFromDbAtmp(TADOConnection *ADbConn=NULL);
+
+    bool LoadVilgFrcsInfo(TADOConnection *ADbConn=NULL);
+    bool LoadVilgShprInfo(TADOConnection *ADbConn=NULL);
+    bool LoadAtmpPltnInfo(TADOConnection *ADbConn=NULL);
+    bool LoadAtmpSprpInfo(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsVilgFrcsManager *ItsVilgFrcsManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 1639 - 0
COMMON/CDS/CDSVmsCtlrF.cpp

@@ -0,0 +1,1639 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSVmsCtlrF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TVmsIfscRltn::TVmsIfscRltn()
+{
+}
+//---------------------------------------------------------------------------
+TVmsIfscRltn::~TVmsIfscRltn()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TVmsMsg::TVmsMsg()
+{
+    for (int ii = 0; ii < INT_MAX_VMS_FORM; ii++)
+    {
+        PHASE[ii].pVmsBmp = NULL;
+    }
+    Init();
+};
+//---------------------------------------------------------------------------
+TVmsMsg::~TVmsMsg()
+{
+    for (int ii = 0; ii < INT_MAX_VMS_FORM; ii++)
+    {
+        if (PHASE[ii].pVmsBmp)
+        {
+            PHASE[ii].pVmsBmp->FreeImage();
+            PHASE[ii].pVmsBmp->Assign(NULL);
+            delete PHASE[ii].pVmsBmp;
+            PHASE[ii].pVmsBmp = NULL;
+        }
+    }
+};
+//---------------------------------------------------------------------------
+
+void TVmsMsg::Init()
+{
+    Total    = 0;
+    Curr     = 0;
+    OFFER_DT = "19990101000000";
+    OFFER_YN = false;
+    for (int ii = 0; ii < INT_MAX_VMS_FORM; ii++)
+    {
+        PHASE[ii].DSPL_HH = 4;        //표출시간
+        PHASE[ii].DNLD_YN = "N";      //다운로드성공여부
+        PHASE[ii].DSPL_CD = "";       //표출방법
+    }
+};
+//---------------------------------------------------------------------------
+
+void VmsInitStatus(WIN_VMS_STATE *AState)
+{
+    int ii;
+	if (AState->Comm != vms_normal && AState->Wcomm != vms_normal)
+	{
+        AState->DoorStatus          = vms_unknown; /* 도어상태정보코드,     0:열림 1:닫힘 2:알수없음 */
+        AState->ModulePowerStatus   = vms_unknown; /* 모듈전원상태정보코드, 0:켜짐 1:꺼짐 2:알수없음 */
+        AState->BodyTemp            = 0;           /* 함체온도값(℃), 범위(-128~127) */
+        AState->LuminanceStatus     = 0;           /* 화면의 밝기값 (최대 휘도값을 100으로 했을 때의 백분율 값), 범위(0~100) */
+        AState->FanStatus           = vms_unknown; /* Fan 동작상태정보코드,    0:켜짐, 1:꺼짐 2:알수없음 */
+        AState->HeaterStatus        = vms_unknown; /* Heater 동작상태정보코드, 0:켜짐, 1:꺼짐 2:알수없음 */
+
+        AState->ExternalLightStatus = vms_unknown; /* 선택 외부조명 동작상태정보코드 0:켜짐, 1:꺼짐, 2:자동(공단은 미사용) */
+        AState->AlarmLightStatus    = vms_unknown; /* 선택 경광등 동작상태정보코드   0:켜짐, 1:꺼짐 */
+        AState->SpeakerStatus       = vms_unknown; /* 선택 스피커 동작상태정보코드   0:켜짐, 1:꺼짐 */
+        //memset(&AState->ControllerCurrentTime, 0x00, sizeof(AState->ControllerCurrentTime));  /*선택 제어기 시간 (YYYYMMDDHHMMSS) */
+
+        AState->Voltage = 0;                       /* 전압, 범위(0~255), 사용안함 */
+
+//        AState->ModuleState      = vms_unknown;    /* 모듈 상태, 0:정상 1:장애 2:알수없음 */
+#if 0
+        //AState->ModuleHorizontal = 0;              /* 가로 모듈수 */
+        //AState->ModuleVertical   = 0;              /* 세로 모듈수 */
+        for (ii = 0; ii < INT_VMS_MAX_MODULE_BIT; ii++)
+            AState->ModuleStatus[ii] = 0xFF;//vms_unknown; /* 모듈 개별 상태, 0:정상 1:장애 2:알수없음 */
+        //AState->PowerCount       = 0;               /* 전원 갯수 */
+        for (ii = 0; ii < INT_VMS_MAX_POWER_BIT; ii++)
+            AState->PowerStatus[ii] = 0xFF;//vms_unknown; /* 전원 개별 상태, 0:켜짐 1:꺼짐 2:알수없음 */
+#endif
+
+#if 0
+        AState->ScheduledMessageOperatingTime   = 0; /* 필수 계획된 메시지의 동작시간(초) */
+        AState->ModuleOperatingTemperature      = 0; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
+        AState->FanOperatingTemperature         = 0; /* 필수 Fan 동작 기준 온도값(℃) */
+        AState->HeaterOperatingTemperature      = 0; /* 필수 Heater 동작 기준 온도값(℃) */
+        AState->ExternalLightOperatingLuminance = 0; /* 선택 외부전등 동작 기준 휘도값 */
+        AState->ModuleBasicFailureRate          = 0; /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
+        AState->MaximumRetry                    = 0; /* 선택 최대 재시도 횟수(회) */
+        AState->ResponseTimeOut                 = 0; /* 선택 최대응답대기시간 (초) */
+        AState->BlinkingCycleTime               = 0; /* 선택 점멸시간 주기 ( 1/10초단위) */
+#endif
+    }
+
+    for (ii = 0; ii < INT_VMS_MAX_MODULE_BIT; ii++)
+        AState->ModuleStatus[ii] = 0xFF;//vms_unknown; /* 모듈 개별 상태, 0:정상 1:장애 2:알수없음 */
+    //AState->PowerCount       = 0;               /* 전원 갯수 */
+    for (ii = 0; ii < INT_VMS_MAX_POWER_BIT; ii++)
+        AState->PowerStatus[ii] = 0xFF;//vms_unknown; /* 전원 개별 상태, 0:켜짐 1:꺼짐 2:알수없음 */
+}
+//---------------------------------------------------------------------------
+void VmsStatusCopy(WIN_VMS_STATE *AState, INT_VMS_STATE *ASrc)
+{
+    int ii;
+
+    AState->OprMode = ASrc->OprMode;    /* VMS운영모드, 0:auto, 1:Fix */
+	AState->Comm    = ASrc->Comm;       /* 유선통신상태, 0:정상 1:장애 */
+	AState->Wcomm   = ASrc->Wcomm;      /* 무선통신상태, 0:정상 1:장애 */
+
+	AState->DoorStatus        = ASrc->DoorStatus;                               /* 도어상태정보코드,     0:열림 1:닫힘 2:알수없음 */
+	AState->ModulePowerStatus = ASrc->ModulePowerStatus;                        /* 모듈전원상태정보코드, 0:켜짐 1:꺼짐 2:알수없음 */
+	AState->BodyTemp          = ASrc->BodyTemp;                                 /* 함체온도값(℃), 범위(-128~127) */
+	AState->LuminanceStatus   = ASrc->LuminanceStatus;                          /* 화면의 밝기값 (최대 휘도값을 100으로 했을 때의 백분율 값), 범위(0~100) */
+	AState->FanStatus         = ASrc->FanStatus;                                /* Fan 동작상태정보코드,    0:켜짐, 1:꺼짐 2:알수없음 */
+	AState->HeaterStatus      = ASrc->HeaterStatus;                             /* Heater 동작상태정보코드, 0:켜짐, 1:꺼짐 2:알수없음 */
+
+    AState->ExternalLightStatus = ASrc->ExternalLightStatus;                    /* 선택 외부조명 동작상태정보코드 0:켜짐, 1:꺼짐, 2:자동(공단은 미사용) */
+    AState->AlarmLightStatus    = ASrc->AlarmLightStatus;                       /* 선택 경광등 동작상태정보코드   0:켜짐, 1:꺼짐 */
+    AState->SpeakerStatus       = ASrc->SpeakerStatus;                          /* 선택 스피커 동작상태정보코드   0:켜짐, 1:꺼짐 */
+
+    for (ii = 0; ii < INT_VMS_MAX_DATETIME; ii++)
+        AState->ControllerCurrentTime[ii] = ASrc->ControllerCurrentTime[ii];    /* 선택 제어기 시간 (YYYYMMDDHHMMSS) */
+
+    AState->Voltage = ASrc->Voltage;                                            /* 전압, 범위(0~255), 사용안함 */
+
+	AState->ModuleState      = ASrc->ModuleState;                               /* 모듈 상태, 0:정상 1:장애 2:알수없음 */
+	AState->ModuleHorizontal = ASrc->ModuleHorizontal;                          /* 가로 모듈수 */
+	AState->ModuleVertical   = ASrc->ModuleVertical;                            /* 세로 모듈수 */
+
+    for (ii = 0; ii < INT_VMS_MAX_MODULE_BIT; ii++)
+        AState->ModuleStatus[ii] = ASrc->ModuleStatus[ii]; /* 모듈 개별 상태, 0:정상 1:장애 2:알수없음 */
+
+	AState->PowerCount = ASrc->PowerCount;                 /* 전원 갯수 */
+
+    for (ii = 0; ii < INT_VMS_MAX_POWER_BIT; ii++)
+        AState->PowerStatus[ii] = ASrc->PowerStatus[ii];    /* 전원 개별 상태, 0:켜짐 1:꺼짐 2:알수없음 */
+
+	AState->ScheduledMessageOperatingTime   = ASrc->ScheduledMessageOperatingTime;      /* 필수 계획된 메시지의 동작시간(초) */
+	AState->ModuleOperatingTemperature      = ASrc->ModuleOperatingTemperature;         /* 필수 모듈 전원이 꺼지는 온도값(℃) */
+	AState->FanOperatingTemperature         = ASrc->FanOperatingTemperature;            /* 필수 Fan 동작 기준 온도값(℃) */
+	AState->HeaterOperatingTemperature      = ASrc->HeaterOperatingTemperature;         /* 필수 Heater 동작 기준 온도값(℃) */
+	AState->ExternalLightOperatingLuminance = ASrc->ExternalLightOperatingLuminance;    /* 선택 외부전등 동작 기준 휘도값 */
+	AState->ModuleBasicFailureRate          = ASrc->ModuleBasicFailureRate;             /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
+	AState->MaximumRetry                    = ASrc->MaximumRetry;                       /* 선택 최대 재시도 횟수(회) */
+	AState->ResponseTimeOut                 = ASrc->ResponseTimeOut;                    /* 선택 최대응답대기시간 (초) */
+	AState->BlinkingCycleTime               = ASrc->BlinkingCycleTime;                  /* 선택 점멸시간 주기 ( 1/10초단위) */
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TVmsCtlr::TVmsCtlr()
+{
+    InitializeCriticalSection(&FCS);
+
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+
+    VMS_NGHT_BRGH_STEP    = 0;     // NUMBER(2)    Y            VMS 야간 휘도 단계
+    VMS_WEEK_BRGH_STEP    = 0;     // NUMBER(2)    Y            VMS 주간 휘도 단계
+    CMNCFAIL_SLOT_NMBR    = 0;     // NUMBER(4)    Y    0        통신장애 SLOT 번호
+    PWER_FAIL_SLOT_NMBR   = 0;    // NUMBER(4)    Y    0        전원 장애 SLOT 번호
+    CMTRINFR_CNCT_YN      = "N";       // CHAR(1)    Y    'N'        소통정보 연계 여부
+    WTHRINFR_CNCT_YN      = "N";       // CHAR(1)    Y    'N'        기상정보 연계 여부
+    ENVRINFR_CNCT_YN      = "N";       // CHAR(1)    Y    'N'        환경정보 연계 여부
+    PANL_ON_TIME          = "0000";           // VARCHAR2(4)    Y            전광판 ON TIME
+    PANL_OFF_TIME         = "0000";          // VARCHAR2(4)    Y            전광판 OFF TIME
+    X_CRDN                = 0;                 // NUMBER(11,8)    Y            X 좌표
+    Y_CRDN                = 0;                 // NUMBER(10,8)    Y            Y 좌표
+    TRFC_STRG_USE_YN      = "Y";  // CHAR(1)    Y    'N'        교통 전략 사용 여부
+    VMS_LOC_IFSC_ID       = "";   // NUMBER(10)    Y            VMS 위치 정보제공구간 ID
+    OPER_MODE             = "A";
+
+    VMS_MAX_PHSE_NUM      = 16;   // NUMBER(2)    Y            VMS 최대 표출면 개수
+
+    VMS_PHSE_CHNG_CYCL    = 5;    // NUMBER(3)      Y VMS 표출면 변경 주기
+    VMS_CMNC_ERR_BASS_VAL = 127;  // NUMBER(3)      Y VMS 통신 오류 기본 값(모듈 전원이 꺼지는 온도값(℃))
+    FAN_MTNS_TMPR         = 35;   // NUMBER(6,3)    Y 팬 동작 온도
+    HETR_MTNS_TMPR        = 0;    // NUMBER(6,3)    Y 히터 동작 온도
+    VMS_MODL_ERR_RATE     = 20;   // NUMBER(3)      Y VMS 모듈 오류 율(Options)
+
+    WEB_CMRA_PORT = 0;          // NUMBER(5)    Y
+    WEB_CMRA_ID   = "";            // VARCHAR2(20)    Y
+    WEB_CMRA_PWD  = "";           // VARCHAR2(20)    Y
+    STRM_SESN_NM  = "";           // VARCHAR2(200)    Y            스트리밍 세션 명
+
+    DEL_YN                = "N";                 // CHAR(1)    Y    'N'        삭제 여부
+
+    memset(&WSTATE, 0x00, sizeof(WSTATE));
+    WSTATE.Comm = vms_error;
+    VmsInitStatus(&WSTATE);
+    WSTATE.Comm = vms_error;
+
+    InitFormCount();
+
+    VmsMsg = NULL;
+    VmsMsg = new TVmsMsg();
+    VmsMsg->Init();
+
+    FData1 = NULL;
+    FData2 = NULL;
+    FData3 = NULL;
+
+    RunState = state_error;
+}
+//---------------------------------------------------------------------------
+
+TVmsCtlr::~TVmsCtlr()
+{
+    FIfscRltn.RemoveAll();
+    DeleteCriticalSection(&FCS);
+}
+//---------------------------------------------------------------------------
+void TVmsCtlr::Lock()
+{
+    //EnterCriticalSection(&FCS);
+}
+//---------------------------------------------------------------------------
+void TVmsCtlr::UnLock()
+{
+    //LeaveCriticalSection(&FCS);
+}
+//---------------------------------------------------------------------------
+void TVmsCtlr::CheckRunState()
+{
+    RunState = WSTATE.Comm;
+    if (RunState == vms_normal)
+    {
+#if 0
+        if (WSTATE.DoorStatus == vms_open)
+            RunState = state_module;
+        if (WSTATE.ModulePowerStatus == vms_error)
+            RunState = state_module;
+        if (WSTATE.ModuleState == vms_error)
+            RunState = state_module;
+#endif
+    }
+}
+//---------------------------------------------------------------------------
+
+
+TVmsSize::TVmsSize()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TVmsCtlrManager *VmsManager = NULL;
+//---------------------------------------------------------------------------
+
+TVmsCtlrManager::TVmsCtlrManager()
+{
+    FImgStream = NULL;
+}
+//---------------------------------------------------------------------------
+TVmsCtlrManager::~TVmsCtlrManager()
+{
+    FVmsSize.RemoveAll();
+    FLists.RemoveAll();
+    if (FImgStream) delete FImgStream;
+    FImgStream = NULL;
+}
+//---------------------------------------------------------------------------
+void TVmsCtlrManager::InitFormCount()
+{
+    try
+    {
+        FLists.Lock();
+        FOR_STL(TVmsCtlr*, pObj, FLists)
+        {
+            pObj->InitFormCount();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+};
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::LoadVmsSize(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        FVmsSize.Lock();
+        FVmsSize.RemoveAll();
+    }
+    __finally
+    {
+        FVmsSize.UnLock();
+    }
+
+#if 0
+    sQry = "SELECT CMMN_CD,                                    \r\n"
+           "       CMMN_CD_ENGL_NM AS CMMN_CD_KOR_NM,          \r\n"
+           "       NVL(ATRB1, '320') AS FORMW,                 \r\n"
+           "       NVL(ATRB2,  '64') AS FORMH                  \r\n"
+           "  FROM TB_CMMN_CD                                  \r\n"
+           " WHERE CMMN_CLSF_CD = 'VMP'                        \r\n"
+           "   AND USE_YN = 'Y'                                \r\n"
+           "   AND CMMN_CD IN (SELECT DISTINCT VMS_TYPE_CD     \r\n"
+           "                     FROM TB_VMS_CTLR)             \r\n"
+           " ORDER BY CMMN_CD DESC                             \r\n";
+#else
+    sQry = "SELECT VMS_TYPE_CD, VMS_TYPE_NM,                        \r\n"
+           "       VMS_WDTH, VMS_HGHT, MODL_ROW_NUM, MODL_COL_NUM   \r\n"
+           "  FROM TB_VMS_TYPE                                      \r\n";
+#endif
+    try
+    {
+        FVmsSize.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TVmsSize *pObj = new TVmsSize();
+
+                pObj->TypeCd = pADO->FieldByName("VMS_TYPE_CD")->AsString;
+                pObj->TypeNm = pADO->FieldByName("VMS_TYPE_NM")->AsString;
+                pObj->Width  = pADO->FieldByName("VMS_WDTH")->AsInteger;
+                pObj->Height = pADO->FieldByName("VMS_HGHT")->AsInteger;
+
+				FVmsSize.Push(pObj->TypeCd, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsCtlrManager::LoadVmsSize", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TVmsCtlrManager::LoadVmsSize", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FVmsSize.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    FMinWidth = 1000;
+    FMinHeight= 1000;
+    FMaxWidth = 0;
+    FMaxHeight= 0;
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+#if 0
+    sQry = "SELECT A.*,                                        \r\n"
+           "       (SELECT NVL(ATRB1, '320')                   \r\n"
+           "          FROM TB_CMMN_CD                          \r\n"
+           "         WHERE CMMN_CLSF_CD = 'VMP'                \r\n"
+           "           AND CMMN_CD = A.VMS_TYPE_CD) AS FORMW,  \r\n"
+           "       (SELECT NVL(ATRB2,  '64')                   \r\n"
+           "          FROM TB_CMMN_CD                          \r\n"
+           "         WHERE CMMN_CLSF_CD = 'VMP'                \r\n"
+           "           AND CMMN_CD = A.VMS_TYPE_CD) AS FORMH   \r\n"
+           "  FROM TB_VMS_CTLR A                               \r\n";
+#else
+    sQry = "SELECT A.*,                           \r\n"
+           "       B.VMS_WDTH AS FORMW,           \r\n"
+           "       B.VMS_HGHT AS FORMH,           \r\n"
+           "       B.MODL_ROW_NUM AS MODV,        \r\n"
+           "       B.MODL_COL_NUM AS MODH         \r\n"
+           "  FROM TB_VMS_CTLR A, TB_VMS_TYPE B   \r\n"
+           " WHERE A.DEL_YN = 'N'                 \r\n"
+           "   AND A.VMS_TYPE_CD = B.VMS_TYPE_CD  \r\n";
+#endif
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TVmsCtlr *pObj = new TVmsCtlr();
+
+                pObj->VMS_CTLR_NMBR         = pADO->FieldByName("VMS_CTLR_NMBR")->AsInteger;
+                pObj->VMS_ID                = pADO->FieldByName("VMS_ID")->AsString;
+                pObj->VMS_CTLR_ID           = pADO->FieldByName("VMS_CTLR_ID")->AsString;
+                pObj->VMS_NM                = pADO->FieldByName("VMS_NM")->AsString;
+                pObj->VMS_CTLR_IP           = pADO->FieldByName("VMS_CTLR_IP")->AsString;
+                pObj->VMS_CMNC_PORT         = pADO->FieldByName("VMS_CMNC_PORT")->AsString;
+                pObj->VMS_USAG_TYPE_CD      = pADO->FieldByName("VMS_USAG_TYPE_CD")->AsString;
+                pObj->VMS_FRM_TYPE_CD       = pADO->FieldByName("VMS_FRM_TYPE_CD")->AsString;
+                pObj->VMS_TYPE_CD           = pADO->FieldByName("VMS_TYPE_CD")->AsString;
+                pObj->VMS_MODL_TYPE_CD      = pADO->FieldByName("VMS_MODL_TYPE_CD")->AsString;
+                pObj->OPER_MODE             = pADO->FieldByName("OPER_MODE")->AsString;
+                pObj->VMS_CMNC_ERR_BASS_VAL = pADO->FieldByName("VMS_CMNC_ERR_BASS_VAL")->AsInteger;
+                pObj->VMS_NGHT_BRGH_STEP    = pADO->FieldByName("VMS_NGHT_BRGH_STEP")->AsInteger;
+                pObj->VMS_WEEK_BRGH_STEP    = pADO->FieldByName("VMS_WEEK_BRGH_STEP")->AsInteger;
+                pObj->VMS_PHSE_CHNG_CYCL    = pADO->FieldByName("VMS_PHSE_CHNG_CYCL")->AsInteger;
+                pObj->VMS_MODL_ERR_RATE     = pADO->FieldByName("VMS_MODL_ERR_RATE")->AsInteger;
+                pObj->VMS_MODL_CHK_CYCL     = pADO->FieldByName("VMS_MODL_CHK_CYCL")->AsInteger;
+
+                pObj->CMNCFAIL_SLOT_NMBR    = pADO->FieldByName("CMNCFAIL_SLOT_NMBR")->AsInteger;
+                pObj->PWER_FAIL_SLOT_NMBR   = pADO->FieldByName("PWER_FAIL_SLOT_NMBR")->AsInteger;
+                pObj->CMTRINFR_CNCT_YN      = pADO->FieldByName("CMTRINFR_CNCT_YN")->AsString;
+                pObj->WTHRINFR_CNCT_YN      = pADO->FieldByName("WTHRINFR_CNCT_YN")->AsString;
+                pObj->ENVRINFR_CNCT_YN      = pADO->FieldByName("ENVRINFR_CNCT_YN")->AsString;
+                pObj->VMS_MAX_PHSE_NUM      = pADO->FieldByName("VMS_MAX_PHSE_NUM")->AsInteger;
+                pObj->FRST_REGR_NMBR        = pADO->FieldByName("FRST_REGR_NMBR")->AsString;
+                pObj->FRST_RGST_DT          = pADO->FieldByName("FRST_RGST_DT")->AsString;
+                pObj->LAST_CRPR_NMBR        = pADO->FieldByName("LAST_CRPR_NMBR")->AsString;
+                pObj->LAST_CRCT_DT          = pADO->FieldByName("LAST_CRCT_DT")->AsString;
+                pObj->PANL_ON_TIME          = pADO->FieldByName("PANL_ON_TIME")->AsString;
+                pObj->PANL_OFF_TIME         = pADO->FieldByName("PANL_OFF_TIME")->AsString;
+                pObj->PANL_PWER_MODE        = pADO->FieldByName("PANL_PWER_MODE")->AsString;
+                pObj->BRGH_MODE             = pADO->FieldByName("BRGH_MODE")->AsString;
+                pObj->X_CRDN                = pADO->FieldByName("X_CRDN")->AsFloat;
+                pObj->Y_CRDN                = pADO->FieldByName("Y_CRDN")->AsFloat;
+                pObj->ISTL_LCTN_NM          = pADO->FieldByName("ISTL_LCTN_NM")->AsString;
+                pObj->TRFC_STRG_USE_YN      = pADO->FieldByName("TRFC_STRG_USE_YN")->AsString;
+                pObj->VMS_LOC_IFSC_ID       = pADO->FieldByName("VMS_LOC_IFSC_ID")->AsString;
+                pObj->FAN_MTNS_TMPR         = pADO->FieldByName("FAN_MTNS_TMPR")->AsString.Trim().ToIntDef(0);
+                pObj->HETR_MTNS_TMPR        = pADO->FieldByName("HETR_MTNS_TMPR")->AsString.Trim().ToIntDef(0);
+                pObj->WEB_CMRA_IP           = pADO->FieldByName("WEB_CMRA_IP")->AsString;
+                pObj->WEB_CMRA_PORT         = pADO->FieldByName("WEB_CMRA_PORT")->AsString.Trim().ToIntDef(0);
+                pObj->WEB_CMRA_ID           = pADO->FieldByName("WEB_CMRA_ID")->AsString;
+                pObj->WEB_CMRA_PWD          = pADO->FieldByName("WEB_CMRA_PWD")->AsString;
+                pObj->WEB_CMRA_CMPY         = pADO->FieldByName("WEB_CMRA_CMPY")->AsString;
+                pObj->WEB_CMRA_MDL          = pADO->FieldByName("WEB_CMRA_MDL")->AsString;
+                pObj->STRM_SESN_NM          = pADO->FieldByName("STRM_SESN_NM")->AsString;
+                pObj->DEL_YN                = pADO->FieldByName("DEL_YN")->AsString;
+
+                pObj->DEF_PHSE_CHNG_CYCL    = pADO->FieldByName("DEF_PHSE_CHNG_CYCL")->AsInteger;
+
+                pObj->WIDTH                 = pADO->FieldByName("FORMW")->AsInteger;
+                pObj->HEIGHT                = pADO->FieldByName("FORMH")->AsInteger;
+
+                pObj->ModVerCnt             = pADO->FieldByName("MODV")->AsInteger;
+                pObj->ModHorCnt             = pADO->FieldByName("MODH")->AsInteger;
+
+                if (pObj->WIDTH  > FMaxWidth)  FMaxWidth  = pObj->WIDTH;
+                if (pObj->WIDTH  < FMinWidth)  FMinWidth  = pObj->WIDTH;
+                if (pObj->HEIGHT > FMaxHeight) FMaxHeight = pObj->HEIGHT;
+                if (pObj->HEIGHT < FMinHeight) FMinHeight = pObj->HEIGHT;
+
+                pObj->WSTATE.ScheduledMessageOperatingTime = pObj->VMS_PHSE_CHNG_CYCL;    /* 필수 계획된 메시지의 동작시간(초) */
+                pObj->WSTATE.ModuleOperatingTemperature    = pObj->VMS_CMNC_ERR_BASS_VAL; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
+                pObj->WSTATE.FanOperatingTemperature       = pObj->FAN_MTNS_TMPR;         /* 필수 Fan 동작 기준 온도값(℃) */
+                pObj->WSTATE.HeaterOperatingTemperature    = pObj->HETR_MTNS_TMPR;        /* 필수 Heater 동작 기준 온도값(℃) */
+                pObj->WSTATE.ModuleBasicFailureRate        = pObj->VMS_MODL_ERR_RATE;     /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
+
+				FLists.Push(String(pObj->VMS_CTLR_NMBR), pObj);
+                pObj->Completed  = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsCtlrManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TVmsCtlrManager::LoadFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::LoadVmsStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+//CONN_STTS_CD
+1	CMS0	CMS	정상	connected					Y
+2	CMS1	CMS	통신두절	Not connected					Y
+3	CMS2	CMS	정보없음						Y
+
+//COBXDOOR_OPEN_STTS_CD
+1	CDS0	CDS	닫힘	a door closed					Y
+2	CDS1	CDS	열림	a door opened					Y
+3	CDS2	CDS	정보없음						Y
+
+1	CRS0	CRS	가동	operated					Y
+2	CRS1	CRS	중지	stopped					Y
+
+1	CPS0	CPS	ON	Power On					Y
+2	CPS1	CPS	OFF	Power Off					Y
+
+//HETR_STTS_CD
+1	HTS0	HTS	가동	operated					Y
+2	HTS1	HTS	중지	stopped					Y
+3	HTS2	HTS	정보없음						Y
+
+//PWER_STTS_CD
+1	PWS0	PWS	정상	normal					Y
+2	PWS1	PWS	오류	abnormal					Y
+
+//FAN_STTS_CD
+1	PAS0	PAS	가동	operated					Y
+2	PAS1	PAS	중지	stopped					Y
+3	PAS2	PAS	정보없음						Y
+
+//모듈
+1	MOS0	MOS	정상	normal					Y
+2	MOS1	MOS	오류	abnormal					Y
+#endif
+
+    sQry = "SELECT *                                                        \r\n"
+           "  FROM TB_VMS_STTS_PRST A, TB_VMS_CTLR B                        \r\n"
+           " WHERE A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR                        \r\n"
+           "   AND A.RGST_DT >= TO_CHAR(SYSDATE-2/1440, 'YYYYMMDDHH24MISS') \r\n";
+
+    try
+    {
+        TVmsCtlr *pObj = NULL;
+
+        FLists.Lock();
+
+#if 0
+        FOR_STL(TVmsCtlr*, pTmp, FLists)
+        {
+            pTmp->WSTATE.Comm = vms_error;
+            VmsInitStatus(&pTmp->WSTATE);
+            pTmp->RunState = state_error;
+        }
+#endif
+
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sVmsNmbr = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
+                pObj = FLists.Find(sVmsNmbr);
+                if (!pObj) continue;
+
+                String RGST_DT               = pADO->FieldByName("RGST_DT")->AsString;
+                String CONN_STTS_CD          = pADO->FieldByName("CONN_STTS_CD")->AsString;
+                if (CONN_STTS_CD != "CMS0")
+                {
+                    //통신장애
+                    continue;
+                }
+                pObj->WSTATE.Comm = vms_normal;
+
+                String CBOXDOOR_OPEN_STTS_CD = pADO->FieldByName("CBOXDOOR_OPEN_STTS_CD")->AsString;
+                if      (CBOXDOOR_OPEN_STTS_CD == "CDS0") pObj->WSTATE.DoorStatus = vms_close;
+                else if (CBOXDOOR_OPEN_STTS_CD == "CDS1") pObj->WSTATE.DoorStatus = vms_open;
+
+                String PWER_STTS_CD = pADO->FieldByName("PWER_STTS_CD")->AsString;
+                if      (PWER_STTS_CD == "PWS0") pObj->WSTATE.ModulePowerStatus = vms_normal;
+                else if (PWER_STTS_CD == "PWS1") pObj->WSTATE.ModulePowerStatus = vms_error;
+
+                String CBOX_TMPR = pADO->FieldByName("CBOX_TMPR")->AsString;
+                pObj->WSTATE.BodyTemp = CBOX_TMPR.ToIntDef(0);
+
+                String CBOX_HMDT = pADO->FieldByName("CBOX_HMDT")->AsString;
+                pObj->WSTATE.LuminanceStatus = CBOX_HMDT.ToIntDef(0);
+
+                String FAN_STTS_CD = pADO->FieldByName("FAN_STTS_CD")->AsString;
+                if      (FAN_STTS_CD == "PAS0") pObj->WSTATE.FanStatus = vms_on;
+                else if (FAN_STTS_CD == "PAS1") pObj->WSTATE.FanStatus = vms_off;
+
+                String HETR_STTS_CD = pADO->FieldByName("HETR_STTS_CD")->AsString;
+                if      (HETR_STTS_CD == "HTS0") pObj->WSTATE.HeaterStatus = vms_on;
+                else if (HETR_STTS_CD == "HTS1") pObj->WSTATE.HeaterStatus = vms_off;
+
+
+                String CBOXFAN_STTS_CD = pADO->FieldByName("CBOXFAN_STTS_CD")->AsString;
+                if      (CBOXFAN_STTS_CD == "MOS0") pObj->WSTATE.ModuleState = vms_normal;
+                else if (CBOXFAN_STTS_CD == "MOS1") pObj->WSTATE.ModuleState = vms_error;
+
+                //String CBOXHETR_STTS_CD      = pADO->FieldByName("CBOXHETR_STTS_CD")->AsString;
+                //String VMS_TMPR              = pADO->FieldByName("VMS_TMPR")->AsString;
+                //String MODL_STTS             = pADO->FieldByName("MODL_STTS")->AsString;
+                //String PWER_STTS             = pADO->FieldByName("PWER_STTS")->AsString;
+
+                pObj->CheckRunState();
+#if 0
+                BYTE  Comm;                                         /* 유선통신상태, 0:정상 1:장애 */
+                BYTE  ModuleHorizontal;                             /* 가로 모듈수 */
+                BYTE  ModuleVertical;                               /* 세로 모듈수 */
+                BYTE  ModuleStatus[INT_VMS_MAX_MODULE_BIT];         /* 모듈 개별 상태, 0:정상 1:장애 2:알수없음 */
+                BYTE  PowerCount;                                   /* 전원 갯수 */
+                BYTE  PowerStatus[INT_VMS_MAX_POWER_BIT];           /* 전원 개별 상태, 0:켜짐 1:꺼짐 2:알수없음 */
+#endif
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TVmsCtlrManager::LoadVmsStatusFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TVmsCtlrManager::LoadVmsStatusFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::DeleteVms(TVmsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_VMS_CTLR          \r\n"
+           "   SET DEL_YN = 'Y'         \r\n"
+           " WHERE VMS_CTLR_NMBR = :p01 \r\n";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->VMS_CTLR_NMBR;
+			pADO->ExecSQL();
+
+#if 0
+        sQry = "UPDATE TB_FCLT_INFR   \r\n"
+               "   SET DEL_YN = 'Y'   \r\n"
+               " WHERE FCLT_ID = :p01 \r\n";
+#else
+        sQry = "DELETE TB_FCLT_INFR      \r\n"
+               " WHERE FCLT_ID = :p01    \r\n";
+               //"   AND FCLT_TYPE = 'DSRC' \r\n";
+#endif
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->VMS_CTLR_ID;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TVmsCtlrManager::DeleteVms", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TVmsCtlrManager::DeleteVms", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::InsertVms(TVmsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "INSERT INTO TB_VMS_CTLR           \r\n"
+           "          (VMS_CTLR_NMBR,         \r\n"
+           "           VMS_ID,                \r\n"
+           "           VMS_CTLR_ID,           \r\n"
+           "           VMS_NM,                \r\n"
+           "           VMS_USAG_TYPE_CD,      \r\n"
+           "           VMS_TYPE_CD,           \r\n"
+           "           X_CRDN,                \r\n"
+           "           Y_CRDN,                \r\n"
+           "           VMS_CTLR_IP,           \r\n"
+           "           PANL_ON_TIME,          \r\n"
+           "           PANL_OFF_TIME,         \r\n"
+           "           WEB_CMRA_IP,           \r\n"
+           "           WEB_CMRA_PORT,         \r\n"
+           "           WEB_CMRA_ID,           \r\n"
+           "           WEB_CMRA_PWD,          \r\n"
+           "           STRM_SESN_NM,          \r\n"
+           "           FRST_REGR_NMBR,        \r\n"
+           "           FRST_RGST_DT,          \r\n"
+           "           LAST_CRPR_NMBR,        \r\n"
+           "           LAST_CRCT_DT,          \r\n"
+           "           VMS_CMNC_PORT,         \r\n"
+           "           VMS_MAX_PHSE_NUM,      \r\n"   //= 16;      //VMS 최대 표출면 개수
+           "           VMS_PHSE_CHNG_CYCL,    \r\n"   //= 5;       //VMS 표출면 변경 주기(계획된 메시지의 동작시간(초))
+           "           VMS_CMNC_ERR_BASS_VAL, \r\n"   //= 127;  //VMS 통신 오류 기본 값(모듈 전원이 꺼지는 온도값(℃))
+           "           FAN_MTNS_TMPR,         \r\n"   //= 35;      //팬동작온도
+           "           HETR_MTNS_TMPR,        \r\n"   //= 0;       //히터동작온도
+           "           VMS_MODL_ERR_RATE,     \r\n"
+           "           OPER_MODE         )    \r\n"   // = 20;      //모듈장애율(Options)
+           "   VALUES (:p01,                  \r\n"
+           "           :p02,                  \r\n"
+           "           :p03,                  \r\n"
+           "           :p04,                  \r\n"
+           "           :p05,                  \r\n"
+           "           :p06,                  \r\n"
+           "           :p07,                  \r\n"
+           "           :p08,                  \r\n"
+           "           :p09,                  \r\n"
+           "           :p10,                  \r\n"
+           "           :p11,                  \r\n"
+           "           :p12,                  \r\n"
+           "           :p13,                  \r\n"
+           "           :p14,                  \r\n"
+           "           :p15,                  \r\n"
+           "           :p16,                  \r\n"
+           "           :p17,                  \r\n"
+           "           :p18,                  \r\n"
+           "           :p19,                  \r\n"
+           "           :p20,                  \r\n"
+           "           :p21,                  \r\n"
+           "           :p22,                  \r\n"
+           "           :p23,                  \r\n"
+           "           :p24,                  \r\n"
+           "           :p25,                  \r\n"
+           "           :p26,                  \r\n"
+           "           :p27,                  \r\n"
+           "           :p28)                  \r\n";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            pADO->Parameters->ParamByName("p01")->Value = AObj->VMS_CTLR_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->VMS_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->VMS_CTLR_ID;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->VMS_NM;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->VMS_USAG_TYPE_CD;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->VMS_TYPE_CD;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->VMS_CTLR_IP;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->PANL_ON_TIME;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->PANL_OFF_TIME;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->WEB_CMRA_IP;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->WEB_CMRA_PORT;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->WEB_CMRA_ID;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->WEB_CMRA_PWD;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->STRM_SESN_NM;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->FRST_REGR_NMBR;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->FRST_RGST_DT;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->LAST_CRPR_NMBR;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->LAST_CRCT_DT;
+            pADO->Parameters->ParamByName("p21")->Value = AObj->VMS_CMNC_PORT;
+            pADO->Parameters->ParamByName("p22")->Value = AObj->VMS_MAX_PHSE_NUM;
+            pADO->Parameters->ParamByName("p23")->Value = AObj->VMS_PHSE_CHNG_CYCL;
+            pADO->Parameters->ParamByName("p24")->Value = AObj->VMS_CMNC_ERR_BASS_VAL;
+            pADO->Parameters->ParamByName("p25")->Value = AObj->FAN_MTNS_TMPR;
+            pADO->Parameters->ParamByName("p26")->Value = AObj->HETR_MTNS_TMPR;
+            pADO->Parameters->ParamByName("p27")->Value = AObj->VMS_MODL_ERR_RATE;
+            pADO->Parameters->ParamByName("p28")->Value = AObj->OPER_MODE;
+
+			pADO->ExecSQL();
+
+            return MergeFcltInfo(AObj, ADbConn);
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TVmsCtlrManager::InsertVms", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TVmsCtlrManager::InsertVms", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::UpdateVms(TVmsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    return MergeVms(AObj, ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::MergeVms(TVmsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "MERGE INTO TB_VMS_CTLR L                                \r\n"
+           "USING (SELECT :p01 AS VMS_CTLR_NMBR,                    \r\n"
+           "              :p02 AS VMS_ID,                           \r\n"
+           "              :p03 AS VMS_CTLR_ID,                      \r\n"
+           "              :p04 AS VMS_NM,                           \r\n"
+           "              :p05 AS VMS_USAG_TYPE_CD,                 \r\n"
+           "              :p06 AS VMS_TYPE_CD,                      \r\n"
+           "              :p07 AS X_CRDN,                           \r\n"
+           "              :p08 AS Y_CRDN,                           \r\n"
+           "              :p09 AS VMS_CTLR_IP,                      \r\n"
+           "              :p10 AS PANL_ON_TIME,                     \r\n"
+           "              :p11 AS PANL_OFF_TIME,                    \r\n"
+           "              :p12 AS WEB_CMRA_IP,                      \r\n"
+           "              :p13 AS WEB_CMRA_PORT,                    \r\n"
+           "              :p14 AS WEB_CMRA_ID,                      \r\n"
+           "              :p15 AS WEB_CMRA_PWD,                     \r\n"
+           "              :p16 AS STRM_SESN_NM,                     \r\n"
+           "              :p17 AS FRST_REGR_NMBR,                   \r\n"
+           "              :p18 AS FRST_RGST_DT,                     \r\n"
+           "              :p19 AS LAST_CRPR_NMBR,                   \r\n"
+           "              :p20 AS LAST_CRCT_DT,                     \r\n"
+           "              :p21 AS VMS_CMNC_PORT,                    \r\n"
+           "              :p22 AS VMS_MAX_PHSE_NUM                  \r\n"
+           "         FROM DUAL) M                                   \r\n"
+           "        ON (L.VMS_CTLR_NMBR = M.VMS_CTLR_NMBR)          \r\n"
+           "WHEN MATCHED                                            \r\n"
+           "THEN                                                    \r\n"
+           "   UPDATE SET L.VMS_ID           = M.VMS_ID,            \r\n"
+           "              L.VMS_CTLR_ID      = M.VMS_CTLR_ID,       \r\n"
+           "              L.VMS_NM           = M.VMS_NM,            \r\n"
+           "              L.VMS_USAG_TYPE_CD = M.VMS_USAG_TYPE_CD,  \r\n"
+           "              L.VMS_TYPE_CD      = M.VMS_TYPE_CD,       \r\n"
+           "              L.X_CRDN           = M.X_CRDN,            \r\n"
+           "              L.Y_CRDN           = M.Y_CRDN,            \r\n"
+           "              L.VMS_CTLR_IP      = M.VMS_CTLR_IP,       \r\n"
+           "              L.PANL_ON_TIME     = M.PANL_ON_TIME,      \r\n"
+           "              L.PANL_OFF_TIME    = M.PANL_OFF_TIME,     \r\n"
+           "              L.WEB_CMRA_IP      = M.WEB_CMRA_IP,       \r\n"
+           "              L.WEB_CMRA_PORT    = M.WEB_CMRA_PORT,     \r\n"
+           "              L.WEB_CMRA_ID      = M.WEB_CMRA_ID,       \r\n"
+           "              L.WEB_CMRA_PWD     = M.WEB_CMRA_PWD,      \r\n"
+           "              L.STRM_SESN_NM     = M.STRM_SESN_NM,      \r\n"
+           "              L.FRST_REGR_NMBR   = M.FRST_REGR_NMBR,    \r\n"
+           "              L.FRST_RGST_DT     = M.FRST_RGST_DT,      \r\n"
+           "              L.LAST_CRPR_NMBR   = M.LAST_CRPR_NMBR,    \r\n"
+           "              L.LAST_CRCT_DT     = M.LAST_CRCT_DT,      \r\n"
+           "              L.VMS_CMNC_PORT    = M.VMS_CMNC_PORT,     \r\n"
+           "              L.VMS_MAX_PHSE_NUM = M.VMS_MAX_PHSE_NUM   \r\n"
+           "WHEN NOT MATCHED                                        \r\n"
+           "THEN                                                    \r\n"
+           "   INSERT (VMS_CTLR_NMBR,                               \r\n"
+           "           VMS_ID,                                      \r\n"
+           "           VMS_CTLR_ID,                                 \r\n"
+           "           VMS_NM,                                      \r\n"
+           "           VMS_USAG_TYPE_CD,                            \r\n"
+           "           VMS_TYPE_CD,                                 \r\n"
+           "           X_CRDN,                                      \r\n"
+           "           Y_CRDN,                                      \r\n"
+           "           VMS_CTLR_IP,                                 \r\n"
+           "           PANL_ON_TIME,                                \r\n"
+           "           PANL_OFF_TIME,                               \r\n"
+           "           WEB_CMRA_IP,                                 \r\n"
+           "           WEB_CMRA_PORT,                               \r\n"
+           "           WEB_CMRA_ID,                                 \r\n"
+           "           WEB_CMRA_PWD,                                \r\n"
+           "           STRM_SESN_NM,                                \r\n"
+           "           FRST_REGR_NMBR,                              \r\n"
+           "           FRST_RGST_DT,                                \r\n"
+           "           LAST_CRPR_NMBR,                              \r\n"
+           "           LAST_CRCT_DT,                                \r\n"
+           "           VMS_CMNC_PORT,                               \r\n"
+           "           VMS_MAX_PHSE_NUM )                           \r\n"
+           "   VALUES (M.VMS_CTLR_NMBR,                             \r\n"
+           "           M.VMS_ID,                                    \r\n"
+           "           M.VMS_CTLR_ID,                               \r\n"
+           "           M.VMS_NM,                                    \r\n"
+           "           M.VMS_USAG_TYPE_CD,                          \r\n"
+           "           M.VMS_TYPE_CD,                               \r\n"
+           "           M.X_CRDN,                                    \r\n"
+           "           M.Y_CRDN,                                    \r\n"
+           "           M.VMS_CTLR_IP,                               \r\n"
+           "           M.PANL_ON_TIME,                              \r\n"
+           "           M.PANL_OFF_TIME,                             \r\n"
+           "           M.WEB_CMRA_IP,                               \r\n"
+           "           M.WEB_CMRA_PORT,                             \r\n"
+           "           M.WEB_CMRA_ID,                               \r\n"
+           "           M.WEB_CMRA_PWD,                              \r\n"
+           "           M.STRM_SESN_NM,                              \r\n"
+           "           M.FRST_REGR_NMBR,                            \r\n"
+           "           M.FRST_RGST_DT,                              \r\n"
+           "           M.LAST_CRPR_NMBR,                            \r\n"
+           "           M.LAST_CRCT_DT,                              \r\n"
+           "           M.VMS_CMNC_PORT,                             \r\n"
+           "           M.VMS_MAX_PHSE_NUM )                         \r\n";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            pADO->Parameters->ParamByName("p01")->Value = AObj->VMS_CTLR_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->VMS_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->VMS_CTLR_ID;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->VMS_NM;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->VMS_USAG_TYPE_CD;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->VMS_TYPE_CD;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->VMS_CTLR_IP;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->PANL_ON_TIME;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->PANL_OFF_TIME;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->WEB_CMRA_IP;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->WEB_CMRA_PORT;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->WEB_CMRA_ID;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->WEB_CMRA_PWD;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->STRM_SESN_NM;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->FRST_REGR_NMBR;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->FRST_RGST_DT;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->LAST_CRPR_NMBR;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->LAST_CRCT_DT;
+            pADO->Parameters->ParamByName("p21")->Value = AObj->VMS_CMNC_PORT;
+            pADO->Parameters->ParamByName("p22")->Value = AObj->VMS_MAX_PHSE_NUM;
+			pADO->ExecSQL();
+
+            return MergeFcltInfo(AObj, ADbConn);
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TVmsCtlrManager::MergeVms", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TVmsCtlrManager::MergeVms", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::MergeFcltInfo(TVmsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "MERGE INTO TB_FCLT_INFR L                                         \r\n"
+           "USING (SELECT :p01 AS FCLT_ID,                                    \r\n"
+           "              :p02 AS FCLT_TYPE,                                  \r\n"
+           "              :p03 AS FCLT_LCTN                                   \r\n"
+           "         FROM DUAL) M                                             \r\n"
+           "        ON (L.FCLT_ID = M.FCLT_ID AND L.FCLT_TYPE = M.FCLT_TYPE)  \r\n"
+           "WHEN MATCHED                                                      \r\n"
+           "THEN                                                              \r\n"
+           "   UPDATE SET L.FCLT_LCTN = M.FCLT_LCTN,                          \r\n"
+           "              L.DEL_YN    = 'N'                                   \r\n"
+           "WHEN NOT MATCHED                                                  \r\n"
+           "THEN                                                              \r\n"
+           "   INSERT (  FCLT_ID,   FCLT_TYPE,   FCLT_LCTN)                   \r\n"
+           "   VALUES (M.FCLT_ID, M.FCLT_TYPE, M.FCLT_LCTN)                   \r\n";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->VMS_CTLR_ID;
+			pADO->Parameters->ParamByName("p02")->Value = "VMS";
+			pADO->Parameters->ParamByName("p03")->Value = AObj->VMS_NM;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TVmsCtlrManager::MergeFcltInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TVmsCtlrManager::MergeFcltInfo", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::GetNextVmsId(int &ANmbr, int &AId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT NVL(MAX(VMS_CTLR_NMBR), 10000) + 1 AS NEWID FROM TB_VMS_CTLR \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            ANmbr = pADO->FieldByName("NEWID")->AsInteger;
+            AId = ANmbr / 10000;
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("VmsCtlrManager::GetNextVmsId", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("VmsCtlrManager::GetNextVmsId", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::UpdateCtlrInfo(TVmsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_VMS_CTLR            \r\n"
+           "   SET PANL_ON_TIME   = :p01, \r\n"
+           "       PANL_OFF_TIME  = :p02, \r\n"
+           "       LAST_CRPR_NMBR = :p03, \r\n"
+           "       LAST_CRCT_DT   = :p04  \r\n"
+           " WHERE DEL_YN = 'N'           \r\n";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->PANL_ON_TIME;
+			pADO->Parameters->ParamByName("p02")->Value = AObj->PANL_OFF_TIME;
+			pADO->Parameters->ParamByName("p03")->Value = AObj->LAST_CRPR_NMBR;
+			pADO->Parameters->ParamByName("p04")->Value = AObj->LAST_CRCT_DT;
+			pADO->ExecSQL();
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TVmsCtlrManager::UpdateCtlrInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TVmsCtlrManager::UpdateCtlrInfo", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::LoadIfscRltn(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        FLists.Lock();
+        FOR_STL(TVmsCtlr*, pObj, FLists)
+        {
+            pObj->FIfscRltn.RemoveAll();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+    sQry = "SELECT A.VMS_CTLR_NMBR, B.VMS_IFSC_ID, B.DSPL_PRRT  \r\n"
+           "  FROM TB_VMS_CTLR      A,                          \r\n"
+           "       TB_VMS_IFSC_RLTN B,                          \r\n"
+           "       TB_VMS_IFSC      C                           \r\n"
+           " WHERE A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR            \r\n"
+           "   AND B.VMS_IFSC_ID   = C.VMS_IFSC_ID              \r\n"
+           " ORDER BY A.VMS_CTLR_NMBR, B.DSPL_PRRT              \r\n";
+    try
+    {
+        int VMS_CTLR_NMBR;
+
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                VMS_CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsInteger;
+				TVmsCtlr *pVms = FLists.Find(String(VMS_CTLR_NMBR));
+                if (!pVms) continue;
+
+                TVmsIfscRltn *pObj = new TVmsIfscRltn();
+                if (pObj)
+                {
+                    pObj->VMS_CTLR_NMBR = VMS_CTLR_NMBR;
+                    pObj->VMS_IFSC_ID   = pADO->FieldByName("VMS_IFSC_ID")->AsInteger;
+                    pObj->DSPL_PRRT     = pADO->FieldByName("DSPL_PRRT")->AsInteger;
+
+                    pVms->FIfscRltn.Push(pObj->DSPL_PRRT, pObj);
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsCtlrManager::LoadIfscRltn", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TVmsCtlrManager::LoadIfscRltn", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::SaveIfscRltn(TVmsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    int ii;
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+sQry = "DELETE FROM TB_VMS_IFSC_RLTN WHERE VMS_CTLR_NMBR = :p01";
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->VMS_CTLR_NMBR;
+			pADO->ExecSQL();
+
+sQry = "INSERT INTO TB_VMS_IFSC_RLTN(VMS_CTLR_NMBR, VMS_IFSC_ID, DSPL_PRRT) VALUES(:p01, :p02, :p03)";
+            ii = 0;
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            FOR_STL(TVmsIfscRltn *, pLink, AObj->FIfscRltn)
+            {
+                pADO->Parameters->ParamByName("p01")->Value = AObj->VMS_CTLR_NMBR;
+                pADO->Parameters->ParamByName("p02")->Value = pLink->VMS_IFSC_ID;
+                pADO->Parameters->ParamByName("p03")->Value = String(ii+1);
+    			pADO->ExecSQL();
+                ii++;
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TVmsCtlrManager::SaveIfscRltn", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TVmsCtlrManager::SaveIfscRltn", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::LoadVmsMsg(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.VMS_CTLR_NMBR, A.PHASE, A.DSPL_HH, A.DNLD_YN,          \r\n"
+           "       A.VMS_MSG_DSPL_MTHD_CD, A.TRFC_SITU_TYPE_CD, A.DSPL_DT,  \r\n"
+           "       TO_CHAR(SYSDATE - 6/1440, 'YYYYMMDDHH24MISS') AS SVC_DT, \r\n"
+           "       A.VMS_DSPL_MSG_IMAG                                      \r\n"
+           "  FROM TB_VMS_DSPL_PRST A,                                      \r\n"
+           "       (SELECT VMS_CTLR_NMBR, MAX(DSPL_DT) AS DSPL_DT           \r\n"
+           "          FROM TB_VMS_DSPL_PRST                                 \r\n"
+           "         GROUP BY VMS_CTLR_NMBR) B                              \r\n"
+           " WHERE A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR                        \r\n"
+           "   AND A.DSPL_DT       = B.DSPL_DT                              \r\n"
+           " ORDER BY A.VMS_CTLR_NMBR, A.PHASE                              \r\n";
+    try
+    {
+        FLists.Lock();
+        FOR_STL(TVmsCtlr*, pTmpObj, FLists)
+        {
+            pTmpObj->Lock();
+            pTmpObj->VmsMsg->Init();
+            pTmpObj->UnLock();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+    TVmsCtlr *pObj = NULL;
+    String    sOldVmsNmbr = "";
+    int       nPhase = 0;
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sVmsNmbr = pADO->FieldByName("VMS_CTLR_NMBR")->AsInteger;
+                if (sVmsNmbr != sOldVmsNmbr)
+                {
+                    if (pObj)
+                    {
+                        pObj->VmsMsg->Total = nPhase;
+                        pObj->VmsMsg->Curr  = 0;
+                        pObj->UnLock();
+                    }
+                    pObj = FLists.Find(sVmsNmbr);
+                    if (pObj)
+                    {
+                        pObj->Lock();
+                        nPhase = 0;
+                        sOldVmsNmbr = sVmsNmbr;
+                    }
+                    else continue;
+                }
+                if (!pObj) continue;
+
+                if (nPhase >= INT_MAX_VMS_FORM) continue;
+
+                SAFE_DELETE(FImgStream);
+                FImgStream = pADO->CreateBlobStream(pADO->FieldByName("VMS_DSPL_MSG_IMAG"), bmRead);
+                if (FImgStream && FImgStream->Size > 0)
+                {
+                    try
+                    {
+                        if (!pObj->VmsMsg->PHASE[nPhase].pVmsBmp)
+                        {
+                            pObj->VmsMsg->PHASE[nPhase].pVmsBmp = new Graphics::TBitmap();
+                        }
+                        pObj->VmsMsg->PHASE[nPhase].pVmsBmp->FreeImage();
+                        pObj->VmsMsg->PHASE[nPhase].pVmsBmp->LoadFromStream(FImgStream);
+
+                        int    PHASE   = pADO->FieldByName("PHASE")->AsInteger;
+
+                        pObj->VmsMsg->PHASE[nPhase].DSPL_HH = pADO->FieldByName("DSPL_HH")->AsInteger;
+                        pObj->VmsMsg->PHASE[nPhase].DNLD_YN = pADO->FieldByName("DNLD_YN")->AsString;
+                        pObj->VmsMsg->PHASE[nPhase].DSPL_CD = pADO->FieldByName("VMS_MSG_DSPL_MTHD_CD")->AsString;
+
+                        if (pObj->VmsMsg->PHASE[nPhase].DSPL_HH <=  0) pObj->VmsMsg->PHASE[nPhase].DSPL_HH = 3;
+                        if (pObj->VmsMsg->PHASE[nPhase].DSPL_HH >= 10) pObj->VmsMsg->PHASE[nPhase].DSPL_HH = 10;
+
+                        String DSPL_DT = pADO->FieldByName("DSPL_DT")->AsString;
+                        String SVC_DT  = pADO->FieldByName("SVC_DT")->AsString;
+
+                        pObj->VmsMsg->OFFER_DT = DSPL_DT;
+                        if (DSPL_DT >= SVC_DT)
+                        {
+                             pObj->VmsMsg->OFFER_YN = true;
+                        }
+                        else
+                        {
+                             pObj->VmsMsg->OFFER_YN = false;
+                        }
+                        if (pObj->VmsMsg->PHASE[nPhase].DNLD_YN == "N")
+                        {
+                            pObj->VmsMsg->OFFER_YN = false;
+                        }
+
+                        //TODO
+                        if (pObj->WSTATE.Comm != vms_normal)
+                        {
+                            pObj->VmsMsg->OFFER_YN = false;
+                        }
+
+                        nPhase++;
+                    }
+                    catch(Exception &e)
+                    {
+                    }
+                }
+            }
+
+            if (pObj)
+            {
+                pObj->VmsMsg->Total = nPhase;
+                pObj->VmsMsg->Curr  = 0;
+                pObj->UnLock();
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsCtlrManager::LoadVmsMsg", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TVmsCtlrManager::LoadVmsMsg", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::LoadVmsFormUsage(TADOConnection *ADbConn/*=NULL*/)
+{
+    InitFormCount();
+
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.VMS_CTLR_NMBR, A.TRFC_SITU_TYPE_CD,                     \r\n"
+           "       A.USE_YN, A.DSPL_STRT_HH, A.DSPL_END_HH,                  \r\n"
+           "       TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') AS CURR_HH           \r\n"
+           "  FROM TB_VMS_TRFC_INFR_DSPL_SCH A,                              \r\n"
+           "       TB_VMS_FORM               B                               \r\n"
+           " WHERE A.VMS_FORM_ID = B.VMS_FORM_ID                             \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+            ITSDb_SQLText(pADO, sQry);
+            ITSDb_SQLOpen(pADO);
+
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sVmsNmbr = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
+
+                TVmsCtlr *pObj = FLists.Find(sVmsNmbr);
+                if (!pObj) continue;
+
+                int nFormType = pADO->FieldByName("TRFC_SITU_TYPE_CD")->AsString.Trim().ToIntDef(-1);
+                switch(nFormType)
+                {
+                case enFormTraffic: //	, '	소통상황(1단)
+                                    //	, '	소통상황(2단)
+                                    //	, '	소통상황(3단)
+                                    //	, '	소통상황(4단)
+                                    //	, '	소통상황(도형식)
+                case enFormDolbal:  //	, '	돌발문안
+                case enFormGongsa:  //	, '	공사/행사문안
+                case enFormHongbo:  //	, '	홍보문안
+                case enFormDeture:  //	, '	우회도로
+                case enFormFixed:   //	, '	고정
+                case enFormBase:    //	, '	기본
+                case enFormCongest: //	, '	정체
+                    break;
+                default: continue;
+                }
+
+                pObj->FormCnt[nFormType][0]++;  //등록되어있는 전체 폼 숫자
+                String sUseYn = pADO->FieldByName("USE_YN")->AsString;
+                if (sUseYn == "N")
+                {
+                    continue;
+                }
+                //사용하는 것중에 현재시각이 제공시각안에 들어있는것은 카운트하지 않음.
+                String sStrHH = pADO->FieldByName("DSPL_STRT_HH")->AsString;
+                String sEndHH = pADO->FieldByName("DSPL_END_HH")->AsString;
+                String sCurHH = pADO->FieldByName("CURR_HH")->AsString;
+                if (sCurHH >= sStrHH && sCurHH <= sEndHH)
+                {
+                    pObj->FormCnt[nFormType][1]++;  //사용가능 폼 숫자
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TVmsCtlrManager::LoadVmsFormUsage", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TVmsCtlrManager::LoadVmsFormUsage", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::InsVmsControlHs(String ACtlDt, String AVmsNmbr, String ACtlType, String ACtlVal, String ACtlRes, String AUserId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "INSERT INTO TB_VMS_CTL_HS(                 \r\n"
+           "                          CTL_DT,          \r\n"
+           "                          VMS_CTLR_NMBR,   \r\n"
+           "                          CTL_TYPE,        \r\n"
+           "                          CTL_VAL,         \r\n"
+           "                          CTL_RESULT,      \r\n"
+           "                          USER_ID          \r\n"
+           "                         )                 \r\n"
+           "                   VALUES(                 \r\n"
+           "                          :p01,            \r\n"
+           "                          :p02,            \r\n"
+           "                          :p03,            \r\n"
+           "                          :p04,            \r\n"
+           "                          :p05,            \r\n"
+           "                          :p06             \r\n"
+           "                         )                 \r\n";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Parameters->ParamByName("p01")->Value = ACtlDt;
+            pADO->Parameters->ParamByName("p02")->Value = AVmsNmbr;
+            pADO->Parameters->ParamByName("p03")->Value = ACtlType;
+            pADO->Parameters->ParamByName("p04")->Value = ACtlVal;
+            pADO->Parameters->ParamByName("p05")->Value = ACtlRes;
+            pADO->Parameters->ParamByName("p06")->Value = AUserId;
+            pADO->ExecSQL();
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TVmsCtlrManager::InsVmsControlHs", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TVmsCtlrManager::InsVmsControlHs", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+

+ 283 - 0
COMMON/CDS/CDSVmsCtlrF.h

@@ -0,0 +1,283 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVmsCtlrFH
+#define CDSVmsCtlrFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+#include "VitzroCommF.h"
+//---------------------------------------------------------------------------
+
+#define     MAX_FORM_TYPE       8
+#define     MAX_FORM_SCHED      MAX_FORM_TYPE
+
+typedef enum enVmsState
+{
+    state_normal = 0,
+    state_error,
+    state_module,
+} EN_VMS_STATE;
+
+//---------------------------------------------------------------------------
+typedef enum enFormType
+{
+    enFormTraffic = 0,
+    enFormDolbal,
+    enFormGongsa,
+    enFormHongbo,
+    enFormDeture,
+    enFormFixed,
+    enFormBase,
+    enFormCongest,
+} EN_FORM_TYPE;
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+class TVmsIfscRltn
+{
+public:
+    TVmsIfscRltn();
+    ~TVmsIfscRltn();
+public:
+    int     VMS_CTLR_NMBR;  //NUMBER(10)	N			VMS 제어기 번호
+    int     VMS_IFSC_ID;    //NUMBER(10)	N			VMS 정보제공구간 ID
+    int     DSPL_PRRT;      //NUMBER(2)	    Y			표출 우선순위
+};
+//---------------------------------------------------------------------------
+
+typedef struct tagVmsPhase
+{
+    int                 DSPL_HH;    //표출시간
+    String              DNLD_YN;    //다운로드성공여부
+    String              DSPL_CD;    //표출방법
+    Graphics::TBitmap  *pVmsBmp;    //표출메시지(Bitmap 이미지)
+} VMS_PHASE;
+
+class TVmsMsg
+{
+public:
+    TVmsMsg();
+    ~TVmsMsg();
+
+public:
+    void Init();
+
+    int         Total;      //전체메시지 갯수
+    int         Curr;       //현재표출갯수(사용안함)
+    String      OFFER_DT;   //제공시각
+    bool        OFFER_YN;   //정시제공여부(true:정시제공,false:5분이상이전제공데이터)
+    VMS_PHASE   PHASE[INT_MAX_VMS_FORM];
+};
+
+//---------------------------------------------------------------------------
+
+typedef struct tagWinVmsState
+{
+    BYTE  OprMode;                                      /* VMS운영모드, 0:auto, 1:Fix */
+	BYTE  Comm;                                         /* 유선통신상태, 0:정상 1:장애 */
+	BYTE  Wcomm;                                        /* 무선통신상태, 0:정상 1:장애 */
+
+	BYTE  DoorStatus;                                   /* 도어상태정보코드,     0:열림 1:닫힘 2:알수없음 */
+	BYTE  ModulePowerStatus;                            /* 모듈전원상태정보코드, 0:켜짐 1:꺼짐 2:알수없음 */
+	short BodyTemp;                                     /* 함체온도값(℃), 범위(-128~127) */
+	BYTE  LuminanceStatus;                              /* 화면의 밝기값 (최대 휘도값을 100으로 했을 때의 백분율 값), 범위(0~100) */
+	BYTE  FanStatus;                                    /* Fan 동작상태정보코드,    0:켜짐, 1:꺼짐 2:알수없음 */
+	BYTE  HeaterStatus;                                 /* Heater 동작상태정보코드, 0:켜짐, 1:꺼짐 2:알수없음 */
+
+    BYTE  ExternalLightStatus;                          /* 선택 외부조명 동작상태정보코드 0:켜짐, 1:꺼짐, 2:자동(공단은 미사용) */
+    BYTE  AlarmLightStatus;                             /* 선택 경광등 동작상태정보코드   0:켜짐, 1:꺼짐 */
+    BYTE  SpeakerStatus;                                /* 선택 스피커 동작상태정보코드   0:켜짐, 1:꺼짐 */
+    BYTE  ControllerCurrentTime[INT_VMS_MAX_DATETIME];  /* 선택 제어기 시간 (YYYYMMDDHHMMSS) */
+
+    BYTE  Voltage;                                      /* 전압, 범위(0~255), 사용안함 */
+
+	BYTE  ModuleState;                                  /* 모듈 상태, 0:정상 1:장애 2:알수없음 */
+	BYTE  ModuleHorizontal;                             /* 가로 모듈수 */
+	BYTE  ModuleVertical;                               /* 세로 모듈수 */
+	BYTE  ModuleStatus[INT_VMS_MAX_MODULE_BIT];         /* 모듈 개별 상태, 0:정상 1:장애 2:알수없음 */
+	BYTE  PowerCount;                                   /* 전원 갯수 */
+	BYTE  PowerStatus[INT_VMS_MAX_POWER_BIT];           /* 전원 개별 상태, 0:켜짐 1:꺼짐 2:알수없음 */
+
+	short ScheduledMessageOperatingTime;                /* 필수 계획된 메시지의 동작시간(초) */
+	short ModuleOperatingTemperature;                   /* 필수 모듈 전원이 꺼지는 온도값(℃) */
+	short FanOperatingTemperature;                      /* 필수 Fan 동작 기준 온도값(℃) */
+	short HeaterOperatingTemperature;                   /* 필수 Heater 동작 기준 온도값(℃) */
+	short ExternalLightOperatingLuminance;              /* 선택 외부전등 동작 기준 휘도값 */
+	short ModuleBasicFailureRate;                       /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
+	short MaximumRetry;                                 /* 선택 최대 재시도 횟수(회) */
+	short ResponseTimeOut;                              /* 선택 최대응답대기시간 (초) */
+	short BlinkingCycleTime;                            /* 선택 점멸시간 주기 ( 1/10초단위) */
+} WIN_VMS_STATE;
+
+class TVmsCtlr
+{
+public:
+    TVmsCtlr();
+    ~TVmsCtlr();
+
+private:
+    CRITICAL_SECTION    FCS;
+
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+    String  FMEM_DEL;
+
+public:
+    int     VMS_CTLR_NMBR;          // NUMBER(10);    //         VMS 제어기 번호
+    String  VMS_ID;                 // VARCHAR2(4)    Y            VMS ID
+    String  VMS_CTLR_ID;            // VARCHAR2(30)    Y            VMS 제어기 ID
+    String  VMS_NM;                 // VARCHAR2(40)    Y            VMS 명
+    String  VMS_CTLR_IP;            // VARCHAR2(20)    Y            VMS 제어기 아이피
+    String  VMS_CMNC_PORT;          // VARCHAR2(5)    Y            VMS 통신 포트
+
+    String  VMS_USAG_TYPE_CD;       // VARCHAR2(7)    Y            VMS 용도 유형 코드
+    String  VMS_FRM_TYPE_CD;        // VARCHAR2(7)    Y            VMS 형식 유형 코드
+    String  VMS_TYPE_CD;            // VARCHAR2(7)    Y            VMS 유형 코드
+    String  VMS_MODL_TYPE_CD;       // VARCHAR2(7)    Y            VMS 모듈 유형 코드
+    String  OPER_MODE;              // VARCHAR2(7)    Y            운영 모드
+    int     VMS_CMNC_ERR_BASS_VAL;  // NUMBER(3)    Y            VMS 통신 오류 기본 값
+    int     VMS_NGHT_BRGH_STEP;     // NUMBER(2)    Y            VMS 야간 휘도 단계
+    int     VMS_WEEK_BRGH_STEP;     // NUMBER(2)    Y            VMS 주간 휘도 단계
+    int     VMS_PHSE_CHNG_CYCL;     // NUMBER(3)    Y            VMS 표출면 변경 주기
+    int     VMS_MODL_ERR_RATE;      // NUMBER(3)    Y            VMS 모듈 오류 율
+    int     VMS_MODL_CHK_CYCL;      // NUMBER(3)	Y	30		모듈체크주기(초)
+
+    int     CMNCFAIL_SLOT_NMBR;     // NUMBER(4)    Y    0        통신장애 SLOT 번호
+    int     PWER_FAIL_SLOT_NMBR;    // NUMBER(4)    Y    0        전원 장애 SLOT 번호
+    String  CMTRINFR_CNCT_YN;       // CHAR(1)    Y    'N'        소통정보 연계 여부
+    String  WTHRINFR_CNCT_YN;       // CHAR(1)    Y    'N'        기상정보 연계 여부
+    String  ENVRINFR_CNCT_YN;       // CHAR(1)    Y    'N'        환경정보 연계 여부
+    int     VMS_MAX_PHSE_NUM;       // NUMBER(2)    Y            VMS 최대 표출면 개수
+    String  FRST_REGR_NMBR;         // VARCHAR2(20)    Y            최초 등록자 번호
+    String  FRST_RGST_DT;           // VARCHAR2(14)    Y            최초 등록 일시
+    String  LAST_CRPR_NMBR;         // VARCHAR2(20)    Y            최종 수정자 번호
+    String  LAST_CRCT_DT;           // VARCHAR2(14)    Y            최종 수정 일시
+    String  PANL_ON_TIME;           // VARCHAR2(4)    Y            전광판 ON TIME
+    String  PANL_OFF_TIME;          // VARCHAR2(4)    Y            전광판 OFF TIME
+    String  PANL_PWER_MODE;         // VARCHAR2(7)    Y            전광판 전원 모드
+    String  BRGH_MODE;              // VARCHAR2(7)    Y            휘도 모드
+    String  WEB_CMRA_IP;            // VARCHAR2(20)    Y            웹 카메라 아이피
+    double  X_CRDN;                 // NUMBER(11,8)    Y            X 좌표
+    double  Y_CRDN;                 // NUMBER(10,8)    Y            Y 좌표
+    String  ISTL_LCTN_NM;           // VARCHAR2(40)    Y            설치 위치 명
+    String  TRFC_STRG_USE_YN;       // CHAR(1)    Y    'N'        교통 전략 사용 여부
+    String  VMS_LOC_IFSC_ID;        // NUMBER(10)    Y            VMS 위치 정보제공구간 ID
+    int     FAN_MTNS_TMPR;          // NUMBER(6,3)    Y            팬 동작 온도
+    int     HETR_MTNS_TMPR;         // NUMBER(6,3)    Y            히터 동작 온도
+    int     WEB_CMRA_PORT;          // NUMBER(5)    Y
+    String  WEB_CMRA_ID;            // VARCHAR2(20)    Y
+    String  WEB_CMRA_PWD;           // VARCHAR2(20)    Y
+    String  STRM_SESN_NM;           // VARCHAR2(200)    Y            스트리밍 세션 명
+    String  WEB_CMRA_CMPY;
+    String  WEB_CMRA_MDL;
+    String  DEL_YN;                 // CHAR(1)    Y    'N'        삭제 여부
+    int     DEF_PHSE_CHNG_CYCL;
+
+    //크기
+    int     WIDTH;
+    int     HEIGHT;
+
+    int     ModHorCnt;
+    int     ModVerCnt;
+    int     FormCnt[MAX_FORM_TYPE][2];
+
+    TVmsMsg *VmsMsg;
+
+    void    *FData1;
+    void    *FData2;
+    void    *FData3;
+
+    WIN_VMS_STATE   WSTATE;
+    int             RunState;
+
+public:
+    void Lock();
+    void UnLock();
+
+    void InitFormCount()
+    {
+        for (int ii = 0; ii < MAX_FORM_TYPE; ii++)
+        {
+            FormCnt[ii][0] = 0;
+            FormCnt[ii][1] = 0;
+        }
+    };
+    void CheckRunState();
+    IntMap<TVmsIfscRltn> FIfscRltn;
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+	__property String MEM_DEL   = {read = FMEM_DEL,   write = FMEM_DEL };
+};
+//---------------------------------------------------------------------------
+typedef std::map<String, TVmsCtlr*>::iterator   VmsIterator;
+//---------------------------------------------------------------------------
+
+class TVmsSize
+{
+public:	// User declarations
+    String TypeCd;
+    String TypeNm;
+    int    Width;
+    int    Height;
+
+public:		// User declarations
+    TVmsSize();
+};
+
+//---------------------------------------------------------------------------
+class TVmsCtlrManager
+{
+public:
+    TVmsCtlrManager();
+    ~TVmsCtlrManager();
+
+private:
+	TStream *FImgStream;
+
+public:
+    StrMap<TVmsSize> FVmsSize;
+
+    ListMap<TVmsCtlr> FLists;
+
+    void InitFormCount();
+
+    int  FMinWidth, FMinHeight;
+    int  FMaxWidth, FMaxHeight;
+public:
+    bool LoadVmsSize(TADOConnection *ADbConn=NULL);
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadVmsStatusFromDb(TADOConnection *ADbConn=NULL);
+    bool DeleteVms(TVmsCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertVms(TVmsCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool UpdateVms(TVmsCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeVms(TVmsCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeFcltInfo(TVmsCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool GetNextVmsId(int &ANmbr, int &AId, TADOConnection *ADbConn=NULL);
+
+    bool UpdateCtlrInfo(TVmsCtlr *AObj, TADOConnection *ADbConn=NULL);
+
+    bool LoadIfscRltn(TADOConnection *ADbConn=NULL);
+    bool SaveIfscRltn(TVmsCtlr *AObj, TADOConnection *ADbConn=NULL);
+
+    bool LoadVmsMsg(TADOConnection *ADbConn=NULL);
+
+    bool LoadVmsFormUsage(TADOConnection *ADbConn=NULL);
+
+    bool InsVmsControlHs(String ACtlDt, String AVmsNmbr, String ACtlType, String ACtlVal, String ACtlRes, String AUserId, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TVmsCtlrManager *VmsManager;
+//---------------------------------------------------------------------------
+void VmsInitStatus(WIN_VMS_STATE *AState);
+void VmsStatusCopy(WIN_VMS_STATE *AState, INT_VMS_STATE *ASrc);
+//---------------------------------------------------------------------------
+
+#endif

+ 688 - 0
COMMON/CDS/CDSVmsIfscF.cpp

@@ -0,0 +1,688 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSVmsIfscF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TVmsLinkIfsc::TVmsLinkIfsc()
+{
+}
+//---------------------------------------------------------------------------
+TVmsLinkIfsc::~TVmsLinkIfsc()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TVmsIfsc::TVmsIfsc()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+
+    VMS_IFSC_NM       = "";         ///VARCHAR2(60)	Y			VMS 정보제공구간 명
+    DSPL_STRT_NODE_NM = "";         //VARCHAR2(30)	Y			표출 시작 노드 명
+    DSPL_END_NODE_NM  = "";         //VARCHAR2(30)	Y			표출 종료 노드 명
+    DETR_ID           = 0;          //NUMBER(10)	Y			우회도로 ID
+    EDTN_CD           = "EDI0";     //VARCHAR2(7)	Y			편집 코드
+    AXIS_YN           = "N";
+
+    DEL_YN            = "N";
+
+    MIN[0] = 20; MAX[0] = 180;
+    MIN[1] = 10; MAX[1] =  19;
+    MIN[2] =  0; MAX[2] =   9;
+
+    InitTraffic();
+}
+//---------------------------------------------------------------------------
+TVmsIfsc::~TVmsIfsc()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TVmsIfsc::InitTraffic()
+{
+    RGST_DT      = "";	    //N	VARCHAR2(14)	Y			등록 일시
+    SPED         = 0;	    //N	NUMBER(3)	    Y	0		속도
+    CMTR_GRAD_CD = "0";	    //N	VARCHAR2(7)	    Y			소통 등급 코드 ==>예는 0,1,2,3으로 들어가네???
+    TRVL_HH      = 0;	    //N	NUMBER(6)	    Y	0		통행 시간
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TVmsIfscManager *VmsIfscManager = NULL;
+//---------------------------------------------------------------------------
+
+TVmsIfscManager::TVmsIfscManager()
+{
+}
+//---------------------------------------------------------------------------
+TVmsIfscManager::~TVmsIfscManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TVmsIfscManager::InitTraffic()
+{
+    try
+    {
+        FLists.Lock();
+        FOR_STL(TVmsIfsc*, pObj, FLists)
+        {
+            pObj->InitTraffic();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+}
+//---------------------------------------------------------------------------
+
+bool TVmsIfscManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+#if 0
+    sQry = "SELECT A.*              \r\n"
+           "  FROM TB_VMS_IFSC A    \r\n"
+           " ORDER BY A.VMS_IFSC_ID \r\n";
+#else
+    sQry = "SELECT A.*,                                                                                                       \r\n"
+           "       NVL(B.MIN1, 20) AS MIN1, NVL(B.MAX1, 180) AS MAX1,                                                         \r\n"
+           "       NVL(B.MIN2, 10) AS MIN2, NVL(B.MAX2,  19) AS MAX2,                                                         \r\n"
+           "       NVL(B.MIN3,  0) AS MIN3, NVL(B.MAX3,   9) AS MAX3                                                          \r\n"
+           "  FROM TB_VMS_IFSC A,                                                                                             \r\n"
+           "       (SELECT VMS_IFSC_ID,                                                                                       \r\n"
+           "               SUM(MIN1) AS MIN1, SUM(MAX1) AS MAX1,                                                              \r\n"
+           "               SUM(MIN2) AS MIN2, SUM(MAX2) AS MAX2,                                                              \r\n"
+           "               SUM(MIN3) AS MIN3, SUM(MAX3) AS MAX3                                                               \r\n"
+           "         FROM (SELECT VMS_IFSC_ID, LWSTSPED AS MIN1, HGHSSPED AS MAX1, 0 AS MIN2, 0 AS MAX2, 0 AS MIN3, 0 AS MAX3 \r\n"
+           "                 FROM TB_VMS_IFSC_CMTR_GRAD                                                                       \r\n"
+           "                WHERE CMTR_GRAD_CD = '1'                                                                          \r\n"
+           "               UNION ALL                                                                                          \r\n"
+           "               SELECT VMS_IFSC_ID, 0 AS MIN1, 0 AS MAX1, LWSTSPED AS MIN2, HGHSSPED AS MAX2, 0 AS MIN3, 0 AS MAX3 \r\n"
+           "                 FROM TB_VMS_IFSC_CMTR_GRAD                                                                       \r\n"
+           "                WHERE CMTR_GRAD_CD = '2'                                                                          \r\n"
+           "               UNION ALL                                                                                          \r\n"
+           "               SELECT VMS_IFSC_ID, 0 AS MIN1, 0 AS MAX1, 0 AS MIN2, 0 AS MAX2, LWSTSPED AS MIN3, HGHSSPED AS MAX3 \r\n"
+           "                 FROM TB_VMS_IFSC_CMTR_GRAD                                                                       \r\n"
+           "                WHERE CMTR_GRAD_CD = '3')                                                                         \r\n"
+           "         GROUP BY VMS_IFSC_ID) B                                                                                  \r\n"
+           " WHERE A.VMS_IFSC_ID = B.VMS_IFSC_ID                                                                              \r\n";
+#endif
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TVmsIfsc *pObj = new TVmsIfsc();
+
+                pObj->VMS_IFSC_ID       = pADO->FieldByName("VMS_IFSC_ID")->AsInteger;
+                pObj->VMS_IFSC_NM       = pADO->FieldByName("VMS_IFSC_NM")->AsString;
+                pObj->DSPL_STRT_NODE_NM = pADO->FieldByName("DSPL_STRT_NODE_NM")->AsString;
+                pObj->DSPL_END_NODE_NM  = pADO->FieldByName("DSPL_END_NODE_NM")->AsString;
+                pObj->DETR_ID           = pADO->FieldByName("DETR_ID")->AsInteger;
+                pObj->EDTN_CD           = pADO->FieldByName("EDTN_CD")->AsString;
+                pObj->ROAD_NM           = pADO->FieldByName("ROAD_NM")->AsString;
+                pObj->SPOT_NM           = pADO->FieldByName("SPOT_NM")->AsString;
+                pObj->AXIS_YN           = pADO->FieldByName("AXIS_YN")->AsString;
+
+                pObj->MIN[0] = pADO->FieldByName("MIN1")->AsInteger;
+                pObj->MAX[0] = pADO->FieldByName("MAX1")->AsInteger;
+                pObj->MIN[1] = pADO->FieldByName("MIN2")->AsInteger;
+                pObj->MAX[1] = pADO->FieldByName("MAX2")->AsInteger;
+                pObj->MIN[2] = pADO->FieldByName("MIN3")->AsInteger;
+                pObj->MAX[2] = pADO->FieldByName("MAX3")->AsInteger;
+
+                pObj->DEL_YN = "N";
+
+				FLists.Push(pObj->VMS_IFSC_ID, pObj);
+                pObj->Completed  = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("VMS정보제공구간정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("VMS정보제공구간정보조회", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return LoadSubFromDb(ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TVmsIfscManager::LoadSubFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.*, NVL(B.IFSC_NM, '-') AS IFSC_NM \r\n"
+           "  FROM TB_VMS_LINK_IFSC A,                 \r\n"
+           "       TB_IFSC          B                  \r\n"
+           " WHERE A.IFSC_ID = B.IFSC_ID(+)            \r\n"
+           " ORDER BY A.VMS_IFSC_ID, A.ORD             \r\n";
+    try
+    {
+        TVmsIfsc     *pIfsc;
+        TVmsLinkIfsc *pObj;
+        int           VMS_IFSC_ID;
+        int           ORD;
+
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                VMS_IFSC_ID = pADO->FieldByName("VMS_IFSC_ID")->AsInteger;
+                ORD         = pADO->FieldByName("ORD")->AsInteger;
+
+                pIfsc = FLists.Find(VMS_IFSC_ID);
+                if (!pIfsc) continue;
+
+                pObj = pIfsc->FLists.Find(ORD);
+                if (!pObj)
+                {
+				    pObj = new TVmsLinkIfsc();
+                    pIfsc->FLists.Push(ORD, pObj);
+                }
+                pObj->VMS_IFSC_ID       = VMS_IFSC_ID;
+                pObj->ORD               = ORD;
+                pObj->IFSC_ID           = pADO->FieldByName("IFSC_ID")->AsString;
+                //pObj->DSPL_STRT_NODE_NM = pADO->FieldByName("DSPL_STRT_NODE_NM")->AsString;
+                //pObj->DSPL_END_NODE_NM  = pADO->FieldByName("DSPL_END_NODE_NM")->AsString;
+                pObj->IFSC_NM           = pADO->FieldByName("IFSC_NM")->AsString;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("VMS정보제공구간링크정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("VMS정보제공구간링크정보조회", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsIfscManager::LoadTraffic(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    InitTraffic();
+
+    sQry = "SELECT VMS_IFSC_ID, NVL(RGST_DT, '19000101000000') AS RGST_DT,      \r\n"
+           "       NVL(SPED,      0) AS SPEED, NVL(TRVL_HH,   0) AS TRVL_HH,    \r\n"
+           "       DECODE(CMTR_GRAD_CD, '1', '1',                               \r\n"
+           "                            '2', '2',                               \r\n"
+           "                            '3', '3', '0') AS CMTR_GRAD_CD          \r\n"
+           "  FROM TB_VMS_CMTRINFR                                              \r\n"
+           " WHERE RGST_DT > TO_CHAR(SYSDATE -  10 / 1440, 'YYYYMMDDHH24MISS')  \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                int VMS_IFSC_ID = pADO->FieldByName("VMS_IFSC_ID")->AsInteger;
+
+				TVmsIfsc *pObj = FLists.Find(VMS_IFSC_ID);
+                if (!pObj) continue;
+
+                pObj->RGST_DT       = pADO->FieldByName("RGST_DT")->AsString;	    //N	VARCHAR2(14)	Y			등록 일시
+                pObj->SPED          = pADO->FieldByName("SPEED")->AsInteger;	    //N	NUMBER(3)	    Y	0		속도
+                pObj->CMTR_GRAD_CD  = pADO->FieldByName("CMTR_GRAD_CD")->AsString;	//N	VARCHAR2(7)	    Y			소통 등급 코드 ==>예는 0,1,2,3으로 들어가네???
+                pObj->TRVL_HH       = pADO->FieldByName("TRVL_HH")->AsInteger;	    //N	NUMBER(6)	    Y	0		통행 시간
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("VMS_IFSC교통정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("VMS_IFSC교통정보조회", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsIfscManager::GetNextVmsIfscId(int &AIfscId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT NVL(MAX(VMS_IFSC_ID), 0) + 1 AS NEWID FROM TB_VMS_IFSC \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            AIfscId = pADO->FieldByName("NEWID")->AsInteger;
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("VMS제공구간ID조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("VMS제공구간ID조회", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsIfscManager::DeleteVmsIfsc(TVmsIfsc *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        String sIfscId = String(AObj->VMS_IFSC_ID);
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+//VMS_정보제공구간 소통 등급
+sQry = "DELETE FROM TB_VMS_IFSC_CMTR_GRAD WHERE VMS_IFSC_ID = :p01";
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = sIfscId;
+			pADO->ExecSQL();
+
+//VMS LINK 정보제공구간
+sQry = "DELETE FROM TB_VMS_LINK_IFSC WHERE VMS_IFSC_ID = :p01";
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = sIfscId;
+			pADO->ExecSQL();
+
+//VMS 정보제공구간 관계
+sQry = "DELETE FROM TB_VMS_IFSC_RLTN WHERE VMS_IFSC_ID = :p01";
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = sIfscId;
+			pADO->ExecSQL();
+
+//VMS_소통정보
+sQry = "DELETE FROM TB_VMS_CMTRINFR WHERE VMS_IFSC_ID = :p01";
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = sIfscId;
+			pADO->ExecSQL();
+
+//VMS_소통정보 이력
+#if 0
+sQry = "DELETE FROM TB_VMS_CMTRINFR_HS WHERE VMS_IFSC_ID = :p01";
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = sIfscId;
+			pADO->ExecSQL();
+#endif
+
+//VMS_정보제공구간
+#if 1
+sQry = "DELETE FROM TB_VMS_IFSC WHERE VMS_IFSC_ID = :p01";
+#else
+sQry = "UPDATE TB_VMS_IFSC SET EDTN_CD = 'EDI2' WHERE VMS_IFSC_ID = :p01";
+#endif
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = sIfscId;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("VMS정보제공구간삭제", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("VMS정보제공구간삭제", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsIfscManager::InsertVmsIfsc(TVmsIfsc *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    return MergeVmsIfsc(AObj, ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TVmsIfscManager::UpdateVmsIfsc(TVmsIfsc *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    return MergeVmsIfsc(AObj, ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TVmsIfscManager::MergeVmsIfsc(TVmsIfsc *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    int ii;
+
+    sQry = "MERGE INTO TB_VMS_IFSC L                                 \r\n"
+           "USING (SELECT :p01 AS VMS_IFSC_ID,                       \r\n"
+           "              :p02 AS VMS_IFSC_NM,                       \r\n"
+           "              :p03 AS DSPL_STRT_NODE_NM,                 \r\n"
+           "              :p04 AS DSPL_END_NODE_NM,                  \r\n"
+           "              :p05 AS DETR_ID,                           \r\n"
+           "              :p06 AS EDTN_CD,                           \r\n"
+           "              :p07 AS ROAD_NM,                           \r\n"
+           "              :p08 AS SPOT_NM,                           \r\n"
+           "              :p09 AS AXIS_YN                            \r\n"
+           "         FROM DUAL) M                                    \r\n"
+           "        ON (L.VMS_IFSC_ID = M.VMS_IFSC_ID)               \r\n"
+           "WHEN MATCHED                                             \r\n"
+           "THEN                                                     \r\n"
+           "   UPDATE SET L.VMS_IFSC_NM       = M.VMS_IFSC_NM,       \r\n"
+           "              L.DSPL_STRT_NODE_NM = M.DSPL_STRT_NODE_NM, \r\n"
+           "              L.DSPL_END_NODE_NM  = M.DSPL_END_NODE_NM,  \r\n"
+           "              L.DETR_ID           = M.DETR_ID,           \r\n"
+           "              L.EDTN_CD           = M.EDTN_CD,           \r\n"
+           "              L.ROAD_NM           = M.ROAD_NM,           \r\n"
+           "              L.SPOT_NM           = M.SPOT_NM,           \r\n"
+           "              L.AXIS_YN           = M.AXIS_YN            \r\n"
+           "WHEN NOT MATCHED                                         \r\n"
+           "THEN                                                     \r\n"
+           "   INSERT (VMS_IFSC_ID,                                  \r\n"
+           "           VMS_IFSC_NM,                                  \r\n"
+           "           DSPL_STRT_NODE_NM,                            \r\n"
+           "           DSPL_END_NODE_NM,                             \r\n"
+           "           DETR_ID,                                      \r\n"
+           "           EDTN_CD,                                      \r\n"
+           "           ROAD_NM,                                      \r\n"
+           "           SPOT_NM,                                      \r\n"
+           "           AXIS_YN )                                     \r\n"
+           "   VALUES (M.VMS_IFSC_ID,                                \r\n"
+           "           M.VMS_IFSC_NM,                                \r\n"
+           "           M.DSPL_STRT_NODE_NM,                          \r\n"
+           "           M.DSPL_END_NODE_NM,                           \r\n"
+           "           M.DETR_ID,                                    \r\n"
+           "           M.EDTN_CD,                                    \r\n"
+           "           M.ROAD_NM,                                    \r\n"
+           "           M.SPOT_NM,                                    \r\n"
+           "           M.AXIS_YN )                                   \r\n";
+    try
+    {
+        try
+        {
+            String sDetrId = "";
+            if (AObj->DETR_ID != 0) sDetrId = String(AObj->DETR_ID);
+
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            pADO->Parameters->ParamByName("p01")->Value = AObj->VMS_IFSC_ID;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->VMS_IFSC_NM;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->DSPL_STRT_NODE_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->DSPL_END_NODE_NM;
+            pADO->Parameters->ParamByName("p05")->Value = sDetrId;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->EDTN_CD;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->ROAD_NM;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->SPOT_NM;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->AXIS_YN;
+			pADO->ExecSQL();
+
+//VMS_정보제공구간 소통 등급
+    sQry = "MERGE INTO TB_VMS_IFSC_CMTR_GRAD L           \r\n"
+           "USING (SELECT :p01 AS VMS_IFSC_ID,           \r\n"
+           "              :p02 AS CMTR_GRAD_CD,          \r\n"
+           "              :p03 AS LWSTSPED,              \r\n"
+           "              :p04 AS HGHSSPED               \r\n"
+           "         FROM DUAL) M                        \r\n"
+           "        ON (L.VMS_IFSC_ID  = M.VMS_IFSC_ID   \r\n"
+           "        AND L.CMTR_GRAD_CD = M.CMTR_GRAD_CD) \r\n"
+           "WHEN MATCHED                                 \r\n"
+           "THEN                                         \r\n"
+           "   UPDATE SET L.LWSTSPED = M.LWSTSPED,       \r\n"
+           "              L.HGHSSPED = M.HGHSSPED        \r\n"
+           "WHEN NOT MATCHED                             \r\n"
+           "THEN                                         \r\n"
+           "   INSERT (VMS_IFSC_ID,                      \r\n"
+           "           CMTR_GRAD_CD,                     \r\n"
+           "           LWSTSPED,                         \r\n"
+           "           HGHSSPED )                        \r\n"
+           "   VALUES (M.VMS_IFSC_ID,                    \r\n"
+           "           M.CMTR_GRAD_CD,                   \r\n"
+           "           M.LWSTSPED,                       \r\n"
+           "           M.HGHSSPED )                      \r\n";
+
+            String sGradCd;
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            for(ii = 0; ii < 3; ii++)
+            {
+                sGradCd = String(ii+1);
+                pADO->Parameters->ParamByName("p01")->Value = AObj->VMS_IFSC_ID;
+                pADO->Parameters->ParamByName("p02")->Value = sGradCd;
+                pADO->Parameters->ParamByName("p03")->Value = AObj->MIN[ii];
+                pADO->Parameters->ParamByName("p04")->Value = AObj->MAX[ii];
+    			pADO->ExecSQL();
+            }
+
+//VMS LINK 정보제공구간
+sQry = "DELETE FROM TB_VMS_LINK_IFSC WHERE VMS_IFSC_ID = :p01";
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->VMS_IFSC_ID;
+			pADO->ExecSQL();
+
+sQry = "INSERT INTO TB_VMS_LINK_IFSC(IFSC_ID, VMS_IFSC_ID, ORD) VALUES(:p01, :p02, :p03)";
+            ii = 0;
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            FOR_STL(TVmsLinkIfsc *, pLink, AObj->FLists)
+            {
+                sGradCd = String(ii+1);
+                pADO->Parameters->ParamByName("p01")->Value = pLink->IFSC_ID;
+                pADO->Parameters->ParamByName("p02")->Value = AObj->VMS_IFSC_ID;
+                pADO->Parameters->ParamByName("p03")->Value = String(pLink->ORD);
+    			pADO->ExecSQL();
+                ii++;
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("VMS제공구간정보저장", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("VMS제공구간정보저장", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVmsIfscManager::UpdateIfscSpeedInfo(TVmsIfsc *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_VMS_IFSC_CMTR_GRAD  \r\n"
+           "   SET LWSTSPED  = :p01,      \r\n"
+           "       HGHSSPED  = :p02       \r\n"
+           " WHERE CMTR_GRAD_CD = :p03    \r\n";
+    try
+    {
+        try
+        {
+            String sGradCd;
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            for(int ii = 0; ii < 3; ii++)
+            {
+                sGradCd = String(ii+1);
+                pADO->Parameters->ParamByName("p01")->Value = AObj->MIN[ii];
+                pADO->Parameters->ParamByName("p02")->Value = AObj->MAX[ii];
+                pADO->Parameters->ParamByName("p03")->Value = sGradCd;
+    			pADO->ExecSQL();
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("VMS제공구간속도정보저장", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("VMS제공구간속도정보저장", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 112 - 0
COMMON/CDS/CDSVmsIfscF.h

@@ -0,0 +1,112 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVmsIfscFH
+#define CDSVmsIfscFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+
+class TVmsLinkIfsc
+{
+public:
+    TVmsLinkIfsc();
+    ~TVmsLinkIfsc();
+
+public:
+    int     VMS_IFSC_ID;        //NUMBER(10)	N			VMS 정보제공구간 ID
+    String  IFSC_ID;            //NUMBER(10)	N			정보제공구간 ID
+    int     ORD;                //NUMBER(3)	Y	0		순서
+    //String  DSPL_STRT_NODE_NM;  //VARCHAR2(30)	Y			표출 시작 노드 명
+    //String  DSPL_END_NODE_NM;   //VARCHAR2(30)	Y			표출 종료 노드 명
+
+    String  IFSC_NM;            //NUMBER(10)	N			정보제공구간 ID
+};
+
+//---------------------------------------------------------------------------
+class TVmsIfsc
+{
+public:
+    TVmsIfsc();
+    ~TVmsIfsc();
+
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+    String  FMEM_DEL;
+
+public:
+    int     VMS_IFSC_ID;        //NUMBER(10)	N			VMS 정보제공구간 ID
+    String  VMS_IFSC_NM;        ///VARCHAR2(60)	Y			VMS 정보제공구간 명
+    String  DSPL_STRT_NODE_NM;  //VARCHAR2(30)	Y			표출 시작 노드 명
+    String  DSPL_END_NODE_NM;   //VARCHAR2(30)	Y			표출 종료 노드 명
+    int     DETR_ID;            //NUMBER(10)	Y			우회도로 ID
+    String  EDTN_CD;            //VARCHAR2(7)	Y			편집 코드
+    String  ROAD_NM;            //VARCHAR2(30)	Y			도로명
+    String  SPOT_NM;            //VARCHAR2(30)	Y			지점명
+    String  AXIS_YN;            //CHAR(1)	    Y	'N'		축정보 생성용
+
+    String  DEL_YN;
+
+//1	EDI0	EDI	추가	insert					Y
+//2	EDI1	EDI	수정	update					Y
+//3	EDI2	EDI	삭제	delete					Y
+
+    int     MIN[3];
+    int     MAX[3];
+
+    String  RGST_DT;	    //N	VARCHAR2(14)	Y			등록 일시
+    int     SPED;	        //N	NUMBER(3)	    Y	0		속도
+    String  CMTR_GRAD_CD;	//N	VARCHAR2(7)	    Y			소통 등급 코드 ==>예는 0,1,2,3으로 들어가네???
+    int     TRVL_HH;	    //N	NUMBER(6)	    Y	0		통행 시간
+
+    void InitTraffic();
+
+public:
+    IntMap<TVmsLinkIfsc> FLists;
+
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+	__property String MEM_DEL   = {read = FMEM_DEL,   write = FMEM_DEL };
+};
+
+
+//---------------------------------------------------------------------------
+class TVmsIfscManager
+{
+public:
+    TVmsIfscManager();
+    ~TVmsIfscManager();
+
+private:
+
+public:
+    IntMap<TVmsIfsc> FLists;
+
+public:
+    void InitTraffic();
+
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadSubFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadTraffic(TADOConnection *ADbConn=NULL);
+
+    bool GetNextVmsIfscId(int &AIfscId, TADOConnection *ADbConn=NULL);
+    bool DeleteVmsIfsc(TVmsIfsc *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertVmsIfsc(TVmsIfsc *AObj, TADOConnection *ADbConn=NULL);
+    bool UpdateVmsIfsc(TVmsIfsc *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeVmsIfsc(TVmsIfsc *AObj, TADOConnection *ADbConn=NULL);
+    bool UpdateIfscSpeedInfo(TVmsIfsc *AObj, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TVmsIfscManager *VmsIfscManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 149 - 0
COMMON/CDS/CDSVmsObjTypeF.cpp

@@ -0,0 +1,149 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSVmsObjTypeF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TVmsObjUse::TVmsObjUse()
+{
+}
+//---------------------------------------------------------------------------
+TVmsObjUse::~TVmsObjUse()
+{
+    MODE = enUPDATE;
+}
+//---------------------------------------------------------------------------
+
+TVmsObjUseManager::TVmsObjUseManager()
+{
+}
+//---------------------------------------------------------------------------
+TVmsObjUseManager::~TVmsObjUseManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+bool TVmsObjUseManager::LoadFromDb(String AFormId, TADOConnection *ADbConn/*=NULL*/)
+{
+return true;
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TVmsObjType::TVmsObjType()
+{
+}
+//---------------------------------------------------------------------------
+TVmsObjType::~TVmsObjType()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TVmsObjTypeManager *VmsObjTypeManager = NULL;
+//---------------------------------------------------------------------------
+
+TVmsObjTypeManager::TVmsObjTypeManager()
+{
+}
+//---------------------------------------------------------------------------
+TVmsObjTypeManager::~TVmsObjTypeManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+bool TVmsObjTypeManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+    sQry = "SELECT VMS_FORM_TYPE_CD AS TYPE,        \r\n"
+           "       VMS_FORM_OBJECT_TYPE_CD AS CD,   \r\n"
+           "       VMS_FORM_OBJECT_TYPE_NM AS NM,   \r\n"
+           "       EDTN_CD                          \r\n"
+           "  FROM TB_VMS_FORM_OBJECT_TYPE          \r\n"
+           " ORDER BY TYPE, CD                      \r\n";
+    try
+    {
+        FLists.Lock();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sUse = pADO->FieldByName("EDTN_CD")->AsString;
+                if (sUse == "EDI2") continue;
+
+                int nFormType = pADO->FieldByName("TYPE")->AsInteger;
+
+				TVmsObjType *pObj = FLists.Find(nFormType);
+                if (!pObj)
+                {
+                    pObj = new TVmsObjType();
+                    FLists.Push(nFormType, pObj);
+                }
+                pObj->TYPE = nFormType;
+
+                int nType = pADO->FieldByName("CD")->AsInteger;
+                TFormObjType *pType = pObj->FLists.Find(nType);
+                if (!pType)
+                {
+                    pType = new TFormObjType();
+                    pObj->FLists.Push(nType, pType);
+                }
+                pType->TYPE    = pADO->FieldByName("CD")->AsInteger;
+                pType->NAME    = pADO->FieldByName("NM")->AsString;
+                pType->EDTN_CD = sUse;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("VMS폼객체유형조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("VMS폼객체유형조회", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+

+ 98 - 0
COMMON/CDS/CDSVmsObjTypeF.h

@@ -0,0 +1,98 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVmsObjTypeFH
+#define CDSVmsObjTypeFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+#define MAX_VMS_OBJ_TYPE   5
+
+typedef enum eObjUse
+{
+    enINSERT,
+    enUPDATE,
+    enDELETE,
+} EN_OBJUSE;
+
+class TVmsObjUse
+{
+public:
+    TVmsObjUse();
+    ~TVmsObjUse();
+public:
+    int     VMS_FORM_ID;
+    int     FORM_OBJECT_ID;
+    int     MODE;
+};
+//---------------------------------------------------------------------------
+class TVmsObjUseManager
+{
+public:
+    TVmsObjUseManager();
+    ~TVmsObjUseManager();
+
+private:
+
+public:
+    IntMap<TVmsObjUse> FLists;
+
+public:
+    bool LoadFromDb(String AFormId, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+
+class TFormObjType
+{
+public:
+    TFormObjType()  {};
+    ~TFormObjType() {};
+
+private:
+
+public:
+    int     TYPE;
+    String  NAME;
+    String  EDTN_CD;
+};
+
+class TVmsObjType
+{
+public:
+    TVmsObjType();
+    ~TVmsObjType();
+
+private:
+
+public:
+    int     TYPE;
+
+    IntMap<TFormObjType> FLists;
+
+public:
+};
+//---------------------------------------------------------------------------
+class TVmsObjTypeManager
+{
+public:
+    TVmsObjTypeManager();
+    ~TVmsObjTypeManager();
+
+private:
+
+public:
+    IntMap<TVmsObjType>  FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TVmsObjTypeManager *VmsObjTypeManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 122 - 0
COMMON/CDS/CDSVmsTrafficF.cpp

@@ -0,0 +1,122 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSVmsTrafficF.h"
+#include "ITSUtilF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TVmsTraffic::TVmsTraffic()
+{
+}
+//---------------------------------------------------------------------------
+TVmsTraffic::~TVmsTraffic()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TVmsTrafficManager *VmsTrafficManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Link Traffic Manager
+*/
+TVmsTrafficManager::TVmsTrafficManager()
+{
+}
+//---------------------------------------------------------------------------
+TVmsTrafficManager::~TVmsTrafficManager()
+{
+}
+//---------------------------------------------------------------------------
+void TVmsTrafficManager::Init()
+{
+    FLink = false;
+    FIfsc = false;
+    FRoad = false;
+}
+//---------------------------------------------------------------------------
+bool TVmsTrafficManager::IsLoading()
+{
+    return (FLink && FIfsc && FRoad) ? true : false;
+}
+//---------------------------------------------------------------------------
+bool TVmsTrafficManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+//ITSUtil_Trace("TVmsTrafficManager::LoadFromDb - start");
+
+    sQry = "SELECT 2 AS LEVL, A.IFSC_ID AS LINKID,  NVL(B.SPED, 0) AS SPEED, NVL(CMTR_GRAD_CD, 'LTC0') CMTR_GRAD_CD, \r\n"
+           "       DECODE(CMTR_GRAD_CD, 'LTC1', '1', 'LTC2', '2', 'LTC3', '3', '0') TRF_GRADE,                       \r\n"
+           "       NVL(B.PRCN_DT, '19000101000000')     AS REGDATE,                                                  \r\n"
+           "       NVL(B.DATA_NUM, 0) AS DATACNT,                                                                    \r\n"
+           "       NVL(B.TRVL_HH, 0) AS TRVTM                                                                        \r\n"
+           "  FROM TB_IFSC A,                                                                                        \r\n"
+           "       (SELECT *                                                                                         \r\n"
+           "          FROM TB_IFSC_TRAF                                                                              \r\n"
+           //"         WHERE PRCN_DT > TO_CHAR(SYSDATE -  5 / 1440, 'YYYYMMDDHH24MISS')                                \r\n"
+           "       ) B                                                                                               \r\n"
+           " WHERE A.IFSC_ID = B.IFSC_ID(+)                                                                          \r\n";
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TVmsTraffic *pTraffic = new TVmsTraffic();
+
+				pTraffic->LEVL         = pADO->FieldByName("LEVL")->AsInteger;
+				pTraffic->LINKID       = pADO->FieldByName("LINKID")->AsString;
+				pTraffic->SPEED        = pADO->FieldByName("SPEED")->AsInteger;
+				pTraffic->CMTR_GRAD_CD = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+				pTraffic->TRF_GRADE    = pADO->FieldByName("TRF_GRADE")->AsString;
+				pTraffic->REGDATE      = pADO->FieldByName("REGDATE")->AsString;
+				pTraffic->DATACNT      = pADO->FieldByName("DATACNT")->AsInteger;
+				pTraffic->TRVTM        = pADO->FieldByName("TRVTM")->AsInteger;
+
+				FLists.Push(pTraffic->LINKID, pTraffic);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("소통정보조회", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            DBERRORMSG("소통정보조회", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 64 - 0
COMMON/CDS/CDSVmsTrafficF.h

@@ -0,0 +1,64 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVmsTrafficFH
+#define CDSVmsTrafficFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  Link Traffic class
+*/
+class TVmsTraffic
+{
+public:
+    TVmsTraffic();
+    virtual ~TVmsTraffic();
+    void Clear();
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    int    LEVL;
+    String LINKID;
+    int    SPEED;
+    String CMTR_GRAD_CD;
+    String TRF_GRADE;
+    String REGDATE;
+    int    DATACNT;
+    int    TRVTM;
+};
+//---------------------------------------------------------------------------
+
+/*
+* Link Traffic Manager
+*/
+class TVmsTrafficManager
+{
+public:
+    TVmsTrafficManager();
+    virtual ~TVmsTrafficManager();
+
+    void Init();
+    bool IsLoading();
+
+public:
+    bool                   FLink;
+    bool                   FIfsc;
+    bool                   FRoad;
+    ListMap<TVmsTraffic>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+
+//---------------------------------------------------------------------------
+extern TVmsTrafficManager *VmsTrafficManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 129 - 0
COMMON/CDS/CDSWebUserF.cpp

@@ -0,0 +1,129 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CDSWebUserF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TWebUser::TWebUser()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+    //Clear();
+}
+//---------------------------------------------------------------------------
+void TWebUser::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TWebUser::~TWebUser()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TWebUserManager *WebUserManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* User Manager
+*/
+TWebUserManager::TWebUserManager()
+{
+}
+//---------------------------------------------------------------------------
+TWebUserManager::~TWebUserManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TWebUserManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.*, TO_CHAR(A.REGDATE, 'YYYYMMDDHH24MISS') AS REG_DATE  \r\n"
+           "  FROM TB_MS_WEB_MEMBER A                                       \r\n";
+
+    try
+    {
+        FLists.Lock();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TWebUser *pObj = new TWebUser();
+
+                pObj->EMAIL            = pADO->FieldByName("EMAIL")->AsString;               //	N	VARCHAR2(50)	N
+                pObj->USERNAME         = pADO->FieldByName("USERNAME")->AsString;            //	N	VARCHAR2(15)	Y
+                pObj->PASSWORD         = pADO->FieldByName("PASSWORD")->AsString;            //	N	VARCHAR2(100)	Y
+                pObj->CONTACTNUM       = pADO->FieldByName("CONTACTNUM")->AsString;          //	N	VARCHAR2(20)	Y
+                pObj->USERAUTH         = pADO->FieldByName("USERAUTH")->AsString;            //	N	VARCHAR2(3)	    Y
+                pObj->QUESTION         = pADO->FieldByName("QUESTION")->AsString;            //	N	VARCHAR2(200)	Y
+                pObj->ANSWER           = pADO->FieldByName("ANSWER")->AsString;              //	N	VARCHAR2(100)	Y
+                pObj->REGDATE          = pADO->FieldByName("REG_DATE")->AsString;            //	N	DATE	        Y	sysdate
+                pObj->LOGIN_FAIL_COUNT = pADO->FieldByName("LOGIN_FAIL_COUNT")->AsString;    //	N	NUMBER(10)	    Y	0		로그인실패횟수
+                pObj->IS_ACCOUNT_LOCK  = pADO->FieldByName("IS_ACCOUNT_LOCK")->AsString;     //	N	CHAR(1)	        Y	'N'		계정잠김여부
+                pObj->IP_ADDRESS       = pADO->FieldByName("IP_ADDRESS")->AsString;          //	N	VARCHAR2(100)	Y			관리자계정접속가능아이피
+                pObj->DEL_YN           = pADO->FieldByName("DEL_YN")->AsString;
+
+                pObj->USERAUTH_NM = pObj->USERAUTH;
+
+                if (pObj->IS_ACCOUNT_LOCK == "N")
+                {
+                    pObj->IS_ACCOUNT_LOCK_NM = "[N] Un Lock";
+                }
+                else
+                {
+                    pObj->IS_ACCOUNT_LOCK_NM = "[Y] Locked";
+                }
+
+				FLists.Push(pObj->EMAIL, pObj);
+
+                pObj->Completed = true;
+                pObj->MEM_DEL   = "N";
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TWebUserManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TWebUserManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 72 - 0
COMMON/CDS/CDSWebUserF.h

@@ -0,0 +1,72 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSWebUserFH
+#define CDSWebUserFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "LibSTLF.hpp"
+//---------------------------------------------------------------------------
+
+/*
+*  User class
+*/
+class TWebUser
+{
+public:
+    TWebUser();
+    virtual ~TWebUser();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+    String EMAIL;               //	N	VARCHAR2(50)	N
+    String USERNAME;            //	N	VARCHAR2(15)	Y
+    String PASSWORD;            //	N	VARCHAR2(100)	Y
+    String CONTACTNUM;          //	N	VARCHAR2(20)	Y
+    String USERAUTH;            //	N	VARCHAR2(3)	    Y
+    String QUESTION;            //	N	VARCHAR2(200)	Y
+    String ANSWER;              //	N	VARCHAR2(100)	Y
+    String REGDATE;             //	N	DATE	        Y	sysdate
+    String LOGIN_FAIL_COUNT;    //	N	NUMBER(10)	    Y	0		로그인실패횟수
+    String IS_ACCOUNT_LOCK;     //	N	CHAR(1)	        Y	'N'		계정잠김여부
+    String IP_ADDRESS;          //	N	VARCHAR2(100)	Y			관리자계정접속가능아이피
+    String DEL_YN;              //CHAR(1)	Y	'N'		삭제 여부
+
+    String USERAUTH_NM;
+    String IS_ACCOUNT_LOCK_NM;
+
+    String  MEM_DEL;
+
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+* User Manager
+*/
+class TWebUserManager
+{
+public:
+    TWebUserManager();
+    virtual ~TWebUserManager();
+
+public:
+    ListMap<TWebUser>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TWebUserManager *WebUserManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 378 - 0
COMMON/CDS/LibSTLF.hpp

@@ -0,0 +1,378 @@
+
+#ifndef  _LIBSTL_HPP
+#define _LIBSTL_HPP
+
+#include <vcl.h>
+#include <math.h>
+#include <map>
+#include <list>
+#include <vector>
+#include <algorithm>
+#include <functional>
+
+#ifndef FOR_STL
+#define FOR_STL(_class, _pointer, _list )		for( _class _pointer = (_list).GetHead(); !(_list).IsEnd(); _pointer = (_list).GetNext())
+#endif
+
+#ifndef REV_STL
+#define REV_STL(_class, _pointer, _list )		for( _class _pointer = (_list).GetTail(); !(_list).IsBegin(); _pointer = (_list).GetPrev())
+#endif
+
+#define DB_INIT     0
+#define DB_NEW      1
+#define DB_DELETE   2
+#define DB_UPDATE   3
+
+class TLockObj
+{
+private:
+    CRITICAL_SECTION CS;
+public:
+    TLockObj(CRITICAL_SECTION &ACS)
+    {
+        EnterCriticalSection(&CS);
+    }
+    ~TLockObj()
+    {
+        LeaveCriticalSection(&CS);
+    }
+};
+
+namespace LibSTL
+{
+    template<class T>
+    class LibStrMap
+    {
+    protected:
+        typedef std::map<String, T*>                    MapObject;
+        typedef std::map<String, T*>::iterator          MapPosition;
+        typedef std::map<String, T*>::reverse_iterator  MapRevPosition;
+
+        MapPosition         FMapPosition;
+        MapRevPosition      FMapRevPosition;
+        //TCriticalSection   *FCS;
+        //TRTLCriticalSection CS;
+        CRITICAL_SECTION    CS;
+
+    public:
+        MapObject           FMapObject;
+
+        LibStrMap()
+        {
+            //FCS = new TCriticalSection();
+            FMapObject.clear();
+            InitializeCriticalSection(&CS);
+        };
+
+        virtual ~LibStrMap()
+        {
+            RemoveAll();
+            //if (FCS) delete FCS;
+            DeleteCriticalSection(&CS);
+        };
+
+    public:
+        inline bool Lock()
+        {
+            EnterCriticalSection(&CS);
+            //FCS->Acquire();
+            return true;
+        };
+        inline void UnLock()
+        {
+            LeaveCriticalSection(&CS);
+            //FCS->Release();
+        };
+        inline bool Push(String AKey, T* AData)
+        {
+            //std::pair<map<String, T*>::iterator, bool> pairTwo;
+            std::pair<MapPosition, bool> pairTwo;
+
+            pairTwo = FMapObject.insert(std::make_pair<String, T*>(AKey, AData));
+            // if (pairTwo->second == false) //데이터가 중복으로 들어간것임.
+            return pairTwo.second;
+        };
+
+        inline T* Find(String AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it == FMapObject.end())
+                return (T*)NULL;
+            return it->second;
+        }
+
+        inline void RemoveAll()
+        {
+            MapPosition it;
+            for (it = FMapObject.begin(); it != FMapObject.end(); ++it)
+            {
+                T* pData = it->second;
+                if (pData)
+                    delete pData;
+            }
+            FMapObject.clear();
+        }
+
+        inline void Clear()
+        {
+            FMapObject.clear();
+        }
+
+        inline bool Remove(String AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it != FMapObject.end())
+            {
+                T* pData = it->second;
+                if (pData)
+                    delete pData;
+
+                FMapObject.erase(AKey);
+                return true;
+            }
+            return false;
+        }
+
+        inline bool Erase(String AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it != FMapObject.end())
+            {
+                FMapObject.erase(AKey);
+                return true;
+            }
+            return false;
+        }
+
+        inline int Size()
+        {
+            return(int)FMapObject.size();
+        }
+
+        inline bool IsExist(String AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it == FMapObject.end())
+                return false;
+            return true;
+        }
+
+        inline T* GetTail()
+        {
+            FMapRevPosition = FMapObject.rbegin();
+            if (FMapRevPosition == FMapObject.rend())
+                return (T*)NULL;
+            return FMapRevPosition->second;
+        }
+
+        inline T* GetPrev()
+        {
+            if (FMapRevPosition != FMapObject.rend()) {
+                FMapRevPosition++;
+                if (FMapRevPosition != FMapObject.rend())
+                    return FMapRevPosition->second;
+            }
+            return(T*)NULL;
+        }
+
+        inline bool IsBegin()
+        {
+            return (FMapRevPosition == FMapObject.rend());
+        }
+
+        inline T* GetHead()
+        {
+            FMapPosition = FMapObject.begin();
+            if (FMapPosition == FMapObject.end())
+                return (T*)NULL;
+            return FMapPosition->second;
+        }
+
+        inline T* GetNext()
+        {
+            if (FMapPosition != FMapObject.end()) {
+                FMapPosition++;
+                if (FMapPosition != FMapObject.end())
+                    return FMapPosition->second;
+            }
+            return(T*)NULL;
+        }
+
+        inline bool IsEnd()
+        {
+            return (FMapPosition == FMapObject.end());
+        }
+    };
+
+    template<class T>
+    class LibIntMap
+    {
+    protected:
+        typedef std::map<int, T*>                   MapObject;
+        typedef std::map<int, T*>::iterator         MapPosition;
+        typedef std::map<int, T*>::reverse_iterator MapRevPosition;
+
+        MapObject           FMapObject;
+        MapPosition         FMapPosition;
+        MapRevPosition      FMapRevPosition;
+        CRITICAL_SECTION    CS;
+
+    public:
+        LibIntMap()
+        {
+            FMapObject.clear();
+            InitializeCriticalSection(&CS);
+        };
+
+        virtual ~LibIntMap()
+        {
+            RemoveAll();
+            DeleteCriticalSection(&CS);
+        };
+
+    public:
+        inline bool Lock()
+        {
+            EnterCriticalSection(&CS);
+            return true;
+        };
+        inline void UnLock()
+        {
+            LeaveCriticalSection(&CS);
+        };
+        inline bool Push(int AKey, T* AData)
+        {
+            std::pair<MapPosition, bool> pairTwo;
+            pairTwo = FMapObject.insert(std::make_pair<int, T*>(AKey, AData));
+            return pairTwo.second;
+        };
+
+        inline T* Find(int AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it == FMapObject.end())
+                return (T*)NULL;
+            return it->second;
+        }
+
+        inline void RemoveAll()
+        {
+            MapPosition it;
+            for (it = FMapObject.begin(); it != FMapObject.end(); ++it)
+            {
+                T* pData = it->second;
+                if (pData)
+                    delete pData;
+            }
+            FMapObject.clear();
+        }
+
+        inline void Clear()
+        {
+            FMapObject.clear();
+        }
+
+        inline bool Remove(int AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it != FMapObject.end())
+            {
+                T* pData = it->second;
+                if (pData)
+                    delete pData;
+
+                FMapObject.erase(AKey);
+                return true;
+            }
+            return false;
+        }
+
+        inline bool Erase(int AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it != FMapObject.end())
+            {
+                FMapObject.erase(AKey);
+                return true;
+            }
+            return false;
+        }
+
+        inline int Size()
+        {
+            return(int)FMapObject.size();
+        }
+
+        inline bool IsExist(int AKey)
+        {
+            MapPosition it;
+            it = FMapObject.find(AKey);
+            if (it == FMapObject.end())
+                return false;
+            return true;
+        }
+
+        inline T* GetTail()
+        {
+            FMapRevPosition = FMapObject.rbegin();
+            if (FMapRevPosition == FMapObject.rend())
+                return (T*)NULL;
+            return FMapRevPosition->second;
+        }
+
+        inline T* GetPrev()
+        {
+            if (FMapRevPosition != FMapObject.rend()) {
+                FMapRevPosition++;
+                if (FMapRevPosition != FMapObject.rend())
+                    return FMapRevPosition->second;
+            }
+            return(T*)NULL;
+        }
+
+        inline bool IsBegin()
+        {
+            return (FMapRevPosition == FMapObject.rend());
+        }
+
+        inline T* GetHead()
+        {
+            FMapPosition = FMapObject.begin();
+            if (FMapPosition == FMapObject.end())
+                return (T*)NULL;
+            return FMapPosition->second;
+        }
+
+        inline T* GetNext()
+        {
+            if (FMapPosition != FMapObject.end()) {
+                FMapPosition++;
+                if (FMapPosition != FMapObject.end())
+                    return FMapPosition->second;
+            }
+            return(T*)NULL;
+        }
+
+        inline bool IsEnd()
+        {
+            return (FMapPosition == FMapObject.end());
+        }
+    };
+
+} // namespace
+
+#define StrMap     LibSTL::LibStrMap
+#define IntMap     LibSTL::LibIntMap
+#define ListMap    LibSTL::LibStrMap
+
+#endif //_LIBSTL_HPP
+
+
+

+ 48 - 0
COMMON/DM/DBDbF.cpp

@@ -0,0 +1,48 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "DBDbF.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TDMDb *DMDb;
+//---------------------------------------------------------------------------
+__fastcall TDMDb::TDMDb(TComponent* Owner)
+    : TDataModule(Owner)
+{
+    FConnString = "";
+}
+//---------------------------------------------------------------------------
+void __fastcall TDMDb::DataModuleCreate(TObject *Sender)
+{
+//
+}
+//---------------------------------------------------------------------------
+void __fastcall TDMDb::DataModuleDestroy(TObject *Sender)
+{
+//
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMDb::SetErrorString(String AErrorString)
+{
+    FErrorString = AErrorString;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMDb::SetConnectString(String AProvider, String AUserName, String APassword, String AServerName, String ACatalog/*=""*/)
+{
+    FConnString  = "";
+    FConnString += "Provider="         + AProvider;
+    FConnString += ";Password="        + APassword;
+    FConnString += ";Persist Security Info=True";
+    FConnString += ";User ID="         + AUserName;
+    if (ACatalog != "")
+    {
+        FConnString += ";Initial Catalog=" + ACatalog;
+    }
+    FConnString += ";Data Source="     + AServerName;
+}
+//---------------------------------------------------------------------------

+ 7 - 0
COMMON/DM/DBDbF.dfm

@@ -0,0 +1,7 @@
+object DMDb: TDMDb
+  OldCreateOrder = False
+  OnCreate = DataModuleCreate
+  OnDestroy = DataModuleDestroy
+  Height = 150
+  Width = 215
+end

+ 35 - 0
COMMON/DM/DBDbF.h

@@ -0,0 +1,35 @@
+//---------------------------------------------------------------------------
+
+#ifndef DBDbFH
+#define DBDbFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+//---------------------------------------------------------------------------
+class TDMDb : public TDataModule
+{
+__published:	// IDE-managed Components
+    void __fastcall DataModuleCreate(TObject *Sender);
+    void __fastcall DataModuleDestroy(TObject *Sender);
+private:	// User declarations
+    TADOConnection *FDbConn;
+    String          FErrorString;
+    String          FConnString;
+
+public:		// User declarations
+    __fastcall TDMDb(TComponent* Owner);
+
+    TADOConnection *GetConnection() { return FDbConn; }
+    void __fastcall SetConnectString(String AProvider, String AUserName, String APassword, String AServerName, String ACatalog="");
+
+    void __fastcall SetErrorString(String AErrorString);
+	__property String  ErrorString = {read=FErrorString, write=SetErrorString};
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TDMDb *DMDb;
+//---------------------------------------------------------------------------
+#endif

+ 392 - 0
COMMON/DM/DMDbF.cpp

@@ -0,0 +1,392 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "DMDbF.h"
+#include "ITSLogF.h"
+#include "AppGlobalF.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TDMDb *DMDb;
+//---------------------------------------------------------------------------
+__fastcall TDMDb::TDMDb(TComponent* Owner)
+    : TDataModule(Owner)
+{
+    FConnString = "";
+    FException  = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDMDb::DataModuleCreate(TObject *Sender)
+{
+//
+}
+//---------------------------------------------------------------------------
+void __fastcall TDMDb::DataModuleDestroy(TObject *Sender)
+{
+//
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMDb::SetErrorString(String AErrorString)
+{
+    FErrorString = AErrorString;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TDMDb::SetConnectString(String AProvider, String AServerName, String AUserName, String APassword, String ACatalog/*=""*/)
+{
+    FConnString  = "";
+    FConnString += "Provider="         + AProvider;
+    FConnString += ";Password="        + APassword;
+    FConnString += ";Persist Security Info=True";
+    FConnString += ";User ID="         + AUserName;
+    if (ACatalog != "")
+    {
+        FConnString += ";Initial Catalog=" + ACatalog;
+    }
+    FConnString += ";Data Source="     + AServerName;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::Connect(String AConnStr/*=""*/)
+{
+    bool bResult = false;
+
+	try
+    {
+        Close();
+
+        FDbConn = new TADOConnection(NULL);
+        if (!FDbConn) return false;
+
+        FDbConn->ConnectionTimeout = 10;
+        FDbConn->ConnectionString  = AConnStr == "" ? FConnString : AConnStr;
+        FDbConn->KeepConnection	   = true;
+        FDbConn->LoginPrompt       = false;
+        FDbConn->Open();
+        bResult = true;
+    }
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException)
+        {
+            DBERRORMSG("Connect", String(E.ClassName()), E.Message, "Connect");
+            throw Exception(ErrorString);
+        }
+        else
+        {
+            DBERRORLOG("Connect", String(E.ClassName()), E.Message, "Connect");
+        }
+    }
+    catch (Exception &e)
+    {
+        ErrorString = String(e.ClassName()) + e.Message;
+        if (FException)
+        {
+            DBERRORMSG("Connect", String(e.ClassName()), e.Message, "Connect");
+            throw Exception(ErrorString);
+        }
+        else
+        {
+            DBERRORLOG("Connect", String(e.ClassName()), e.Message, "Connect");
+        }
+    }
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::Close()
+{
+    bool bResult = false;
+
+	try
+    {
+        if (!FDbConn) return false;
+
+        if (FDbConn->Connected)
+        {
+            FDbConn->Close();
+            FDbConn->Connected = false;
+        }
+        delete FDbConn;
+        FDbConn = NULL;
+        bResult = true;
+    }
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException)
+        {
+            DBERRORMSG("Close", String(E.ClassName()), E.Message, "Close");
+            throw Exception(ErrorString);
+        }
+        else
+        {
+            DBERRORLOG("Close", String(E.ClassName()), E.Message, "Close");
+        }
+    }
+    catch (Exception &e)
+    {
+        ErrorString = String(e.ClassName()) + e.Message;
+        if (FException)
+        {
+            DBERRORMSG("Close", String(e.ClassName()), e.Message, "Close");
+            throw Exception(ErrorString);
+        }
+        else
+        {
+            DBERRORLOG("Close", String(e.ClassName()), e.Message, "Close");
+        }
+    }
+    return bResult;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::SQLClose(TADOQuery *adoQry)
+{
+#if 0
+    try
+#endif
+    {
+        if (adoQry->Active)
+        {
+            adoQry->Recordset->Close();
+            adoQry->Close();
+            adoQry->Active = false;
+        }
+        adoQry->SQL->Clear();
+
+        return true;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return false;
+#endif
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMDb::SQLText(TADOQuery *adoQry, String sQry)
+{
+#if 0
+    try
+#endif
+    {
+        adoQry->Close();
+        adoQry->SQL->Text = sQry;
+        return 0;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return 0;
+#endif
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::SQLBind(TADOQuery *adoQry, String param, String var)
+{
+#if 0
+    try
+#endif
+    {
+        adoQry->Parameters->ParamByName(param)->Value = var;
+        return true;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return false;
+#endif
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::SQLBindStream(TADOQuery *adoQry, String param, TStream * pStream)
+{
+#if 0
+    try
+#endif
+    {
+        adoQry->Parameters->ParamByName(param)->LoadFromStream(pStream, ftBlob);
+        return true;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return false;
+#endif
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TDMDb::SQLOpen(TADOQuery *adoQry)
+{
+#if 0
+    try
+#endif
+    {
+#if 0
+        if (0)
+        {
+            String sLogSql = adoQry->SQL->Text;
+
+            sLogSql += "\r\n";
+            for (int ii = 0; ii < adoQry->Parameters->Count; ii++)
+            {
+                sLogSql += ":" + adoQry->Parameters->Items[ii]->Name + "  :  " + adoQry->Parameters->Items[ii]->Value;
+                sLogSql += "\r\n";
+            }
+
+            //LogSql(sLogSql);
+        }
+#endif
+
+        adoQry->Open();
+        adoQry->First();
+        return adoQry->RecordCount;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return -1;
+#endif
+}
+//---------------------------------------------------------------------------
+
+int  __fastcall TDMDb::SQLExec(TADOQuery *adoQry)
+{
+#if 0
+    try
+#endif
+    {
+#if 0
+        if (0)
+        {
+            String sLogSql = adoQry->SQL->Text;
+
+            sLogSql += "\r\n";
+            for (int ii = 0; ii < adoQry->Parameters->Count; ii++)
+            {
+                sLogSql += ":" + adoQry->Parameters->Items[ii]->Name + "  :  " + adoQry->Parameters->Items[ii]->Value;
+                sLogSql += "\r\n";
+            }
+
+            //LogSql(sLogSql);
+        }
+#endif
+        adoQry->ExecSQL();
+        return adoQry->RowsAffected;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return -1;
+#endif
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::SQLClear(TADOQuery *adoQry)
+{
+#if 0
+    try
+#endif
+    {
+        adoQry->Close();
+        adoQry->SQL->Clear();
+
+        return true;
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return false;
+#endif
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TDMDb::LocateItem(TADOQuery *adoQry, String sFldNm, String sFldVal)
+{
+#if 0
+    try
+#endif
+    {
+        TLocateOptions Opts;
+        Opts.Clear();
+        Opts << loPartialKey;
+
+        return adoQry->Locate(sFldNm, sFldVal, Opts);
+    }
+#if 0
+    catch(EDatabaseError &E)
+    {
+        ErrorString = String(E.ClassName()) + E.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    catch (Exception &exception)
+    {
+        ErrorString = String(exception.ClassName()) + exception.Message;
+        if (FException) throw Exception(ErrorString);
+    }
+    return false;
+#endif
+}
+//---------------------------------------------------------------------------
+

+ 7 - 0
COMMON/DM/DMDbF.dfm

@@ -0,0 +1,7 @@
+object DMDb: TDMDb
+  OldCreateOrder = False
+  OnCreate = DataModuleCreate
+  OnDestroy = DataModuleDestroy
+  Height = 150
+  Width = 215
+end

+ 54 - 0
COMMON/DM/DMDbF.h

@@ -0,0 +1,54 @@
+//---------------------------------------------------------------------------
+
+#ifndef DMDbFH
+#define DMDbFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+//---------------------------------------------------------------------------
+#define ERRMSG(v,w,x,y) ITSLog->LogDbError(v,w,x,y,__FILE__, String(__FUNC__), __LINE__,true)
+#define ERRLOG(v,w,x,y) ITSLog->LogDbError(v,w,x,y,__FILE__, String(__FUNC__), __LINE__,false)
+//---------------------------------------------------------------------------
+class TDMDb : public TDataModule
+{
+__published:	// IDE-managed Components
+    void __fastcall DataModuleCreate(TObject *Sender);
+    void __fastcall DataModuleDestroy(TObject *Sender);
+private:	// User declarations
+    TADOConnection *FDbConn;
+    String          FErrorString;
+    String          FConnString;
+    bool            FException;
+
+public:		// User declarations
+    __fastcall TDMDb(TComponent* Owner);
+
+    void __fastcall SetException(bool AException=true) { FException = AException; }
+
+    TADOConnection *GetConnection() { return FDbConn; }
+    void __fastcall SetConnectString(String AProvider, String AServerName, String AUserName, String APassword, String ACatalog="");
+
+    bool __fastcall Connect(String AConnStr="");
+    bool __fastcall Close();
+
+    bool __fastcall SQLClose(TADOQuery *adoQry);
+    bool __fastcall SQLClear(TADOQuery *adoQry);
+    int  __fastcall SQLText(TADOQuery *adoQry, String sQry);
+    bool __fastcall SQLBind(TADOQuery *adoQry, String param, String var);
+    bool __fastcall SQLBindStream(TADOQuery *adoQry, String param, TStream * pStream);
+    int  __fastcall SQLOpen(TADOQuery *adoQry);
+    int  __fastcall SQLExec(TADOQuery *adoQry);
+    bool __fastcall LocateItem(TADOQuery *adoQry, String sFldNm, String sFldVal);
+
+    void __fastcall SetErrorString(String AErrorString);
+	__property String  ErrorString = {read=FErrorString, write=SetErrorString};
+	__property String  ConnString  = {read=FConnString,  write=FConnString};
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TDMDb *DMDb;
+//---------------------------------------------------------------------------
+#endif

+ 80 - 0
COMMON/DataTypesF.h

@@ -0,0 +1,80 @@
+//---------------------------------------------------------------------------
+
+#ifndef DataTypesFH
+#define DataTypesFH
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#include <Classes.hpp>
+#include <windows.h>
+//---------------------------------------------------------------------------
+
+/*
+******************************************************************************
+* Define enum
+******************************************************************************
+*/
+typedef enum
+{       
+    enJobNone = 0,
+    enJobSave,
+    enJobEdit,
+    enJobDelete,
+    enJobUpdate,
+} EN_JOB;
+//---------------------------------------------------------------------------
+typedef enum
+{
+    enDbNone,
+    enDbInsert,
+    enDbUpdate,
+    enDbDelete,
+} EN_DBMODE;
+//---------------------------------------------------------------------------
+#define DBMODE_NONE     "-"
+#define DBMODE_INSERT   "신규"
+#define DBMODE_UPDATE   "수정"
+#define DBMODE_DELETE   "삭제"
+#define DBMODE_UNKNOWN  "?"
+//---------------------------------------------------------------------------
+
+/*
+******************************************************************************
+* Define user structure
+******************************************************************************
+*/
+/*
+*  전자지도에서 위치정보를 관리하기 위한 구조체 정의
+*/
+typedef struct
+{
+    TForm  *pForm;
+    int    Level;
+    String Id;
+} ST_SELLINK;
+
+/*
+*  전자지도 정보를 저장할 구조체
+*/
+typedef struct
+{
+    String          sApiKey;
+    int             nZoomLevel;
+    double          dCenterX;
+    double          dCenterY;
+
+    double          dLeftTopX;
+    double          dLeftTopY;
+    double          dRightBottomX;
+    double          dRightBottomY;
+} ST_GISINFO;
+//---------------------------------------------------------------------------
+
+typedef struct
+{
+    String  AClassName;
+    String  AExeName;
+    String  AOption;
+} ST_RUNPROGRAM;
+
+#endif
+

+ 49 - 0
COMMON/Flash--/CommFlashF.cpp

@@ -0,0 +1,49 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+
+#include "CommFlashF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TCommFlash::TCommFlash()
+{
+}
+//---------------------------------------------------------------------------
+TCommFlash::~TCommFlash()
+{
+}
+//---------------------------------------------------------------------------
+
+bool TCommFlash::CallFunc(TShockwaveFlashEx *ShockwaveFlash1, String AFuncName, String AArgs)
+{
+    try
+    {
+        String sCommand;
+        sCommand.sprintf((L"<invoke name=\"%s\"><arguments><string>%s</string></arguments></invoke>"), AFuncName, AArgs);
+        ShockwaveFlash1->CallFunction(sCommand);
+    }
+    catch (Exception &exception)
+    {
+        //throw Exception(String(exception.ClassName()) + exception.Message);
+        return false;
+    }
+    return true;
+}
+//---------------------------------------------------------------------------
+
+String TCommFlash::ReplaceName(String AName)
+{
+    String sReturn;
+    sReturn = StringReplace(AName,   "<", "[", TReplaceFlags() << rfReplaceAll);
+    sReturn = StringReplace(sReturn, ">", "]", TReplaceFlags() << rfReplaceAll);
+    sReturn = StringReplace(sReturn, ",", "^", TReplaceFlags() << rfReplaceAll);
+    sReturn = StringReplace(sReturn, "$", "^", TReplaceFlags() << rfReplaceAll);
+
+    return sReturn;
+}
+//---------------------------------------------------------------------------
+

+ 49 - 0
COMMON/Flash--/CommFlashF.h

@@ -0,0 +1,49 @@
+//---------------------------------------------------------------------------
+
+#ifndef CommFlashFH
+#define CommFlashFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include "ShockwaveEx.hpp"
+#include "ShockwaveFlashObjects_TLB.hpp"
+//---------------------------------------------------------------------------
+
+/*
+*  define facility kind
+*/
+#define FAC_CCTV   String("CCTV")
+#define FAC_VMS    String("VMS")
+#define FAC_RSE    String("RSE")
+#define FAC_WCAM   String("WCAM")
+#define FAC_VDS    String("VDS")
+#define FAC_AVI    String("AVI")
+#define FAC_DSRC   String("DSRC")
+#define FAC_INCD   String("INCD")
+#define FAC_PARK   String("PARK")
+#define FAC_PVMS   String("PVMS")
+#define FAC_PVDS   String("PVDS")
+#define FAC_BIT    String("BIT")
+#define FAC_SIG    String("SIG")
+#define FAC_SIGDET String("LVD")    //신호검지기
+#define FAC_EVENT  String("EVT")    //이벤트(블랙박스용-남양주시)
+#define FAC_WTHR   String("WTHR")   //기상
+#define FAC_ATMP   String("ATMP")   //대기환경
+
+
+/*
+*  Flash interface class
+*/
+class TCommFlash
+{
+public:
+    TCommFlash();
+    virtual ~TCommFlash();
+    void Clear();
+private:
+protected:
+
+public:
+    static bool CallFunc(TShockwaveFlashEx *ShockwaveFlash1, String AFuncName, String AArgs);
+    static String ReplaceName(String AName);
+};
+#endif

+ 124 - 0
COMMON/JavaScript/UJSExec.pas

@@ -0,0 +1,124 @@
+unit UJSExec;
+
+interface
+
+uses
+  MSHTML, ShDocVw;
+
+type
+  TJSExec = class(TObject)
+  private
+    fWB: TWebBrowser;
+    function GetDocWindow: IHTMLWindow2;
+    function GetElementById(const ID: string): IHTMLElement;
+    function GetRetValContainer: IHTMLElement;
+    function CreateRetValContainer: IHTMLElement;
+  public
+    constructor Create(const WB: TWebBrowser);
+    procedure RunJSProc(const Fn: string);
+    function RunJSFn(const Fn: string): string;
+  end;
+
+implementation
+
+uses
+  SysUtils;
+
+const
+  // unique id that should clash with anything in the doc
+  cRetValElemId = 'id58A3A2A46539468A943D00FDD6A4FF08';
+
+{ TJSExec }
+
+constructor TJSExec.Create(const WB: TWebBrowser);
+begin
+  inherited Create;
+  fWB := WB;
+end;
+
+function TJSExec.CreateRetValContainer: IHTMLElement;
+var
+  Doc: IHTMLDocument2;
+begin
+  if not Supports(fWB.Document, IHTMLDocument2, Doc) then
+    raise Exception.Create('Invalid document');
+  Result := Doc.createElement('input');
+  Result.id := cRetValElemId;
+  Result.setAttribute('name', cRetValElemId, 0);
+  Result.setAttribute('type', 'hidden', 0);
+  Result.setAttribute('value', '', 0);
+end;
+
+function TJSExec.GetDocWindow: IHTMLWindow2;
+var
+  Doc: IHTMLDocument2;
+begin
+  if not Supports(fWB.Document, IHTMLDocument2, Doc) then
+    raise Exception.Create('Invalid document');
+  Result := Doc.parentWindow;
+  if not Assigned(Result) then
+    raise Exception.Create('No document window');
+end;
+
+function TJSExec.GetElementById(const ID: string): IHTMLElement;
+var
+  Doc: IHTMLDocument3;
+begin
+  if not Supports(fWB.Document, IHTMLDocument3, Doc) then
+    raise Exception.Create('Invalid document');
+  Result := Doc.getElementById(ID);
+end;
+
+function TJSExec.GetRetValContainer: IHTMLElement;
+var
+  NewNode: IHTMLDOMNode;
+  BodyNode: IHTMLDOMNode;
+  Doc: IHTMLDocument2;
+begin
+  Result := GetElementById(cRetValElemId);
+  if not Assigned(Result) then
+  begin
+    if not Supports(fWB.Document, IHTMLDocument2, Doc) then
+      raise Exception.Create('Invalid document');
+    if not Supports(Doc.body, IHTMLDOMNode, BodyNode) then
+      raise Exception.Create('Invalid body node');
+    Result := CreateRetValContainer;
+    if not Supports(Result, IHTMLDOMNode, NewNode) then
+      raise Exception.Create('Invalid new node');
+    BodyNode.appendChild(NewNode);
+  end;
+end;
+
+function TJSExec.RunJSFn(const Fn: string): string;
+var
+  EmbedFn: string;
+  WrapperFn: string;
+  HiddenElem: IHTMLElement;
+const
+  WrapperFnTplt = 'eval("'
+    + 'id = document.getElementById(''' + cRetValElemId + '''); '
+    + 'id.value = %s;'
+    + '")';
+begin
+  EmbedFn := StringReplace(Fn, '"', '\"', [rfReplaceAll]);
+  EmbedFn := StringReplace(EmbedFn, '''', '\''', [rfReplaceAll]);
+  HiddenElem := GetRetValContainer;
+  WrapperFn := Format(WrapperFnTplt, [EmbedFn]);
+  RunJSProc(WrapperFn);
+  Result := HiddenElem.getAttribute('value', 0);
+end;
+
+procedure TJSExec.RunJSProc(const Fn: string);
+var
+  Wdw: IHTMLWindow2;
+begin
+  try
+    Wdw := GetDocWindow;
+    Wdw.execScript(Fn, 'JavaScript'); // execute function
+  except
+    // swallow exception to prevent JS error dialog
+  end;
+end;
+
+end.
+

+ 298 - 0
COMMON/Lib/CommLogF.cpp

@@ -0,0 +1,298 @@
+//---------------------------------------------------------------------------
+
+
+#pragma hdrstop
+//---------------------------------------------------------------------------
+
+#include "ITSUtilF.h"
+#include "CommLogF.h"
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+TCommLog *CommLog = NULL;
+LOG_INFO  g_LogCfg;
+
+TCriticalSection *csLog = NULL;
+//---------------------------------------------------------------------------
+
+TCommLog::TCommLog(String ALogDir, String ALogName, String ALogDay)
+{
+    if (!csLog) csLog = new TCriticalSection();
+
+    FLogDay  = ALogDay;
+    FLogFile = ALogDir + ALogName;
+
+    ForceDirectories(ALogDir.c_str());
+}
+//---------------------------------------------------------------------------
+
+TCommLog::~TCommLog()
+{
+    if (csLog)
+    {
+        delete csLog;
+        csLog = NULL;
+    }
+}
+//---------------------------------------------------------------------------
+
+void TCommLog::SendLogMessage(int AKind, char *AFmt, ...)
+{
+    va_list      ap;
+    int          res;
+    LRESULT      result;
+    LOG_MESSAGE *pMsg = NULL;
+
+    bool bLog = false;
+
+    switch(AKind)
+    {
+    case eLOG_INFO:    bLog = g_LogCfg.Info;    break;
+    case eLOG_DATA:    bLog = g_LogCfg.Data;    break;
+    case eLOG_ERROR:   bLog = g_LogCfg.Error;   break;
+    case eLOG_WARNING: bLog = g_LogCfg.Warning; break;
+    case eLOG_DEBUG:   bLog = g_LogCfg.Debug;   break;
+    case eLOG_DETAIL:  bLog = g_LogCfg.Detail;  break;
+    }
+    if (!bLog) return;
+
+    try
+    {
+        csLog->Enter();
+
+        try
+        {
+            pMsg = new LOG_MESSAGE;
+            memset((char*)pMsg, 0x00, sizeof(LOG_MESSAGE));
+
+            va_start(ap, AFmt);
+            res = vsprintf(pMsg->Data, AFmt, ap);
+            va_end(ap);
+
+            //LogWrite(NULL, AKind, pMsg->Data);
+
+            pMsg->Kind = AKind;
+            pMsg->Len  = strlen(pMsg->Data);
+
+#if 0
+            if (TCommLog::FLog.Debug)
+            {
+                ITSUtil_Trace(pMsg->Data);
+            }
+#endif
+
+            //result = ::PostMessage(MAINHANDLE, WM_LOG, (WPARAM)pMsg, 0);
+        }
+        catch(Exception &e)
+        {
+            SAFE_DELETE(pMsg);
+        }
+    }
+    __finally
+    {
+        csLog->Leave();
+    }
+}
+//---------------------------------------------------------------------------
+
+FILE *TCommLog::OpenLogFile(AnsiString AFileExt/*=".log"*/)
+{
+    FILE	   *fp = NULL;
+    AnsiString  sOpenMode = "a+";
+    try
+    {
+        AnsiString sLogDay = Now().FormatString("dd");
+        if (FLogDay != sLogDay)
+        {
+            sOpenMode = "w+";
+            FLogDay = sLogDay;
+        }
+
+        AnsiString sLogFile = FLogFile + "_" + FLogDay + AFileExt;
+        fp = fopen(sLogFile.c_str(), sOpenMode.c_str());
+    }
+    catch(Exception &e)
+    {
+    }
+    return fp;
+}
+//---------------------------------------------------------------------------
+
+int TCommLog::LogData(char *ASndRcv, const unsigned char *AData, int ALen, FILE *Afp/*=NULL*/)
+{
+    AnsiString     sTime;
+    int            ii, jj, pos;
+    FILE          *fp = Afp;
+    bool           bFileClose = false;
+
+    if (!g_LogCfg.Data || !AData)
+    {
+        return -1;
+    }
+
+    if (!fp)
+    {
+        fp = OpenLogFile();
+        bFileClose = true;
+    }
+    if (!fp) return -1;
+
+    try
+    {
+        sTime = AnsiString(Now().FormatString("yyyy-mm-dd hh:nn:ss"));
+
+        fprintf(fp, "[%s] [DATA ] %d Bytes [%s]\n", sTime.c_str(), ALen, ASndRcv);
+
+        AnsiString sLog;
+        AnsiString sChar;
+        AnsiString sMsg;
+
+        for (ii = 0; ii < ALen; ii += 16)
+        {
+            sLog = "           ";
+            sMsg.printf("%08Xh ", ii);
+            sLog += sMsg;
+            for (jj = 0; jj < 16; jj++)
+            {
+                pos = ii + jj;
+                if (pos < ALen)
+                    sMsg.printf(" %02X", AData[pos]);
+                else
+                    sMsg.printf("   ");
+
+                sLog += sMsg;
+
+                if (jj == 7)
+                {
+                    sMsg.printf("  "); sLog += sMsg;
+                }
+            }
+
+            sMsg.printf("  ;"); sLog += sMsg;
+
+            for (jj = 0; jj < 16; jj++)
+            {
+                pos = ii + jj;
+                if (pos >= ALen)
+                    break;
+
+                uint8_t v = AData[pos];
+                sMsg.printf("%c", isprint(v) ? v : '.');
+                sLog += sMsg;
+                if (jj == 7)
+                {
+                    sMsg.printf(" "); sLog += sMsg;
+                }
+            }
+            fprintf(fp, "%s\n", sLog.c_str());
+            fflush(fp);
+        }
+        fprintf(fp, "\n");
+    }
+    catch(Exception &e)
+    {
+    }
+
+    if (bFileClose)
+    {
+        // 아규먼트로 파일디스크립터가 넘어온 경우 파일을 닫지 않는다.
+        if (fp) fclose(fp);
+    }
+
+    return ALen;
+}
+//---------------------------------------------------------------------------
+
+int TCommLog::LogWrite(FILE *Afp, int ALogKind, char *AFmt, ...)
+{
+    va_list        ap;
+    int            cnt = 0;
+    char           szFmtData[MAX_LOG_BUFFER+1];
+    AnsiString     sLogKind = "";
+
+    AnsiString     sTime;
+    FILE          *fp = Afp;
+    bool           bFileClose = false;
+
+    bool bLog = false;
+    switch(ALogKind)
+    {
+    case eLOG_INFO   : bLog = g_LogCfg.Info;    sLogKind = "[INFO  ]"; break;
+    case eLOG_DATA   : bLog = g_LogCfg.Data;    sLogKind = "[DATA  ]"; break;
+    case eLOG_ERROR  : bLog = g_LogCfg.Error;   sLogKind = "[ERROR ]"; break;
+    case eLOG_WARNING: bLog = g_LogCfg.Warning; sLogKind = "[WARN  ]"; break;
+    case eLOG_DEBUG  : bLog = g_LogCfg.Debug;   sLogKind = "[DEGUG ]"; break;
+    case eLOG_DETAIL : bLog = g_LogCfg.Detail;  sLogKind = "[DETAIL]"; break;
+    }
+    if (!bLog) return -1;
+
+    if (!fp)
+    {
+        fp = OpenLogFile();
+        bFileClose = true;
+    }
+    if (!fp) return -1;
+
+    try
+    {
+        va_start(ap, AFmt);
+        cnt = vsprintf(szFmtData, AFmt, ap);
+        va_end(ap);
+
+        sTime = AnsiString(Now().FormatString("yyyy-mm-dd hh:nn:ss"));
+
+        fprintf(fp, "[%s] %s %s\n", sTime.c_str(), sLogKind.c_str(), szFmtData);
+    }
+    catch(Exception &e)
+    {
+    }
+
+    if (bFileClose)
+    {
+        // 아규먼트로 파일디스크립터가 넘어온 경우 파일을 닫지 않는다.
+        if (fp) fclose(fp);
+    }
+
+    return cnt;
+}
+//---------------------------------------------------------------------------
+int TCommLog::LogDbError(String ATitle, String AClass, String AError, String ASql,
+                         String AFile, String AFunc, int ALine, bool AShowMsg/*=true*/)
+{
+    AnsiString  sTime;
+    FILE       *fp;
+
+    LogWrite(NULL, eLOG_ERROR, "[%s] DB Error Occured. FILE: %s LINE: %d FUNC: %s", AnsiString(ExtractFileName(AFile)).c_str(), ALine, AnsiString(AFunc).c_str());
+
+    fp = OpenLogFile(".err");
+    if (!fp) return -1;
+
+    try
+    {
+        sTime = AnsiString(Now().FormatString("yyyy-mm-dd hh:nn:ss"));
+
+        fprintf(fp, "[%s] DB Error Occured. FILE: %s LINE: %d FUNC: %s\n",
+                    sTime.c_str(), AnsiString(ExtractFileName(AFile)).c_str(), ALine, AnsiString(AFunc).c_str());
+        fprintf(fp, "Title: %s\n", AnsiString(ATitle).c_str());
+        fprintf(fp, "Class: %s\n", AnsiString(AClass).c_str());
+        fprintf(fp, "Error: %s\n", AnsiString(AError).c_str());
+        fprintf(fp, "SQL  :\n%s\n",AnsiString(ASql).c_str());
+        fprintf(fp, "\n");
+    }
+    catch(Exception &e)
+    {
+    }
+
+    if (fp) fclose(fp);
+
+    if (AShowMsg)
+    {
+        String sErrMsg = AClass + " : " + AError;
+        Application->NormalizeTopMosts();
+        Application->MessageBox(sErrMsg.c_str(), ATitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
+        Application->RestoreTopMosts();
+    }
+    return 0;
+}
+//---------------------------------------------------------------------------
+

+ 91 - 0
COMMON/Lib/CommLogF.h

@@ -0,0 +1,91 @@
+//---------------------------------------------------------------------------
+
+#ifndef CommLogFH
+#define CommLogFH
+//---------------------------------------------------------------------------
+#include <windows.h>
+#include <SyncObjs.hpp>
+#include <stdio.h>
+//---------------------------------------------------------------------------
+
+#define     LOG_DISPLAY_FIRST       1
+#define     MAX_LOG_BUFFER          2048
+
+// 로그 종류
+typedef enum eEN_LOG_KIND
+{
+    eLOG_NONE    = 0x00,     /* 없음 */
+    eLOG_INFO    = 0x01,     /* 정보 */
+    eLOG_DATA    = 0x02,     /* 데이터 */
+    eLOG_ERROR   = 0x04,     /* 에러 */
+    eLOG_WARNING = 0x08,     /* 경고 */
+    eLOG_DEBUG   = 0x10,     /* 디버그 */
+    eLOG_DETAIL  = 0x1F      /* 상세 */
+} EN_LOG_KIND;
+
+typedef struct tagLogInfo
+{
+    bool    Info;
+    bool    Data;
+    bool    Error;
+    bool    Warning;
+    bool    Debug;
+    bool    Detail;
+public:
+    tagLogInfo()
+    {
+        Info    = true;
+        Data    = false;
+        Error   = true;
+        Warning = true;
+        Debug   = false;
+        Detail  = false;
+    }
+} LOG_INFO;
+
+typedef struct tagLogMessage
+{
+    int         Kind;                  /* message kind */
+    int         Len;                   /* message len */
+//    TDateTime   Tm;                    /* message create time */
+    char        Data[MAX_LOG_BUFFER];  /* message data */
+} LOG_MESSAGE;
+
+//---------------------------------------------------------------------------
+#define LOGINFO(args...)    CommLog->LogWrite(NULL, eLOG_INFO,    ##args)
+#define LOGDATA(args...)    CommLog->LogWrite(NULL, eLOG_DATA,    ##args)
+#define LOGERROR(args...)   CommLog->LogWrite(NULL, eLOG_ERROR,   ##args)
+#define LOGWARN(args...)    CommLog->LogWrite(NULL, eLOG_WARNING, ##args)
+#define LOGDEBUG(args...)   CommLog->LogWrite(NULL, eLOG_DEBUG,   ##args)
+//---------------------------------------------------------------------------
+#define DBERRORMSG(v,w,x,y) CommLog->LogDbError(v,w,x,y,__FILE__, String(__FUNC__), __LINE__,true)
+#define DBERRORLOG(v,w,x,y) CommLog->LogDbError(v,w,x,y,__FILE__, String(__FUNC__), __LINE__,false)
+
+//---------------------------------------------------------------------------
+class TCommLog
+{
+public:
+	TCommLog(String ALogDir, String ALogName, String ALogDay);
+    ~TCommLog();
+
+protected:
+
+public:
+
+    String      FLogDay;
+    String      FLogFile;
+
+    void SendLogMessage(int AKind, char *AFmt, ...);
+
+    FILE *OpenLogFile(AnsiString AFileExt=".log");
+    int LogData(char *ASndRcv, const unsigned char *AData, int ALen, FILE *Afp=NULL);
+    int LogWrite(FILE *Afp, int ALogKind, char *AFmt, ...);
+    int LogDbError(String ATitle, String AClass, String AError, String ASql,
+                   String AFile, String AFunc, int ALine, bool AShowMsg=true);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TCommLog *CommLog;
+extern         LOG_INFO  g_LogCfg;
+//---------------------------------------------------------------------------
+
+#endif

+ 91 - 0
COMMON/WindowMsgF.h

@@ -0,0 +1,91 @@
+//---------------------------------------------------------------------------
+
+#ifndef WindowMsgFH
+#define WindowMsgFH
+//---------------------------------------------------------------------------
+#include <Types.hpp>
+#include <Windows.hpp>
+
+/*
+******************************************************************************
+* Define constant(윈도우 간의 메시지 전달을 위해 사용하는 상수값 정의)
+******************************************************************************
+*/
+#define POST_MSG(x,y,z,p)       ::PostMessage(x, y,       (WPARAM)z, (LPARAM)p)
+#define USER_MSG(x,y)           ::PostMessage(x, WM_USER, (WPARAM)y, (LPARAM)0)
+
+/*
+*  윈도우 메시지
+*/
+#define WM_MAINFORM             (WM_USER + 0xF0)    // Main Form으로 부터의 메시지
+#define WM_PLUGINFORM           (WM_USER + 0xF1)    // PlugIn Form으로 부터의 메시지
+#define WM_SUBFORM_CLOSE        (WM_USER + 0xF2)    // Sub Form Close
+#define WM_THREAD               (WM_USER + 0xF3)    /* 스레드 연계 메시지 */
+#define WM_PARAM_DATABASE       (WM_USER + 0xF4)    /* 데이터베이스 메시지 */
+#define WM_DATABASE_REFRESH     (WM_USER + 0xF5)    // 데이터베이스 변경
+
+#define WM_VMS_SELECT           (WM_USER + 0xA0)
+#define WM_VMS_SELECT_DBLCLICK  (WM_USER + 0xB0)
+#define WM_VMS_STATE_REFRESH    (WM_USER + 0xA1)
+#define WM_VMS_FORM_REFRESH     (WM_USER + 0xA2)
+#define WM_VMS_INCIDENT_REFRESH (WM_USER + 0xA3)
+
+// WPARAM unique message
+#define WP_PING                 0xA0    // 스레드 핑테스트
+#define WP_DB_SELECT_START      0xB0    // db select start
+#define WP_DB_SELECT_OK         0xB1    // db select end(ok)
+#define WP_DB_SELECT_ERROR      0xB2    // db select error
+#define WP_DB_SELECT_CANCEL     0xB3    // db select cancel
+#define WP_PARAM_TRAFFIC        0xC0    // 데이터베이스 메시지
+
+
+
+// WPARAM Message
+#define WP_MSG_01               0xC1    //
+#define WP_MSG_02               0xC2    //
+#define WP_MSG_03               0xC3    //
+#define WP_MSG_04               0xC4    //
+#define WP_MSG_05               0xC5    //
+#define WP_MSG_06               0xC6    //
+#define WP_MSG_07               0xC7    //
+#define WP_MSG_08               0xC8    //
+#define WP_MSG_09               0xC9    //
+#define WP_MSG_10               0xCA    //
+#define WP_MSG_11               0xCB    //
+#define WP_MSG_12               0xCC    //
+#define WP_MSG_13               0xCD    //
+#define WP_MSG_14               0xCE    //
+#define WP_MSG_15               0xCF    //
+#define WP_MSG_16               0xD0    //
+#define WP_MSG_17               0xD1    //
+#define WP_MSG_18               0xD2    //
+#define WP_MSG_19               0xD3    //
+#define WP_MSG_20               0xD4    //
+
+// LPARAM Message
+#define LP_MSG_00               0xA0    //
+#define LP_MSG_01               0xA1    //
+#define LP_MSG_02               0xA2    //
+#define LP_MSG_03               0xA3    //
+#define LP_MSG_04               0xA4    //
+#define LP_MSG_05               0xA5    //
+#define LP_MSG_06               0xA6    //
+#define LP_MSG_07               0xA7    //
+#define LP_MSG_08               0xA8    //
+#define LP_MSG_09               0xA9    //
+#define LP_MSG_10               0xAA    //
+#define LP_MSG_11               0xAB    //
+#define LP_MSG_12               0xAC    //
+#define LP_MSG_13               0xAD    //
+#define LP_MSG_14               0xAE    //
+#define LP_MSG_15               0xAF    //
+#define LP_MSG_16               0xB0    //
+#define LP_MSG_17               0xB1    //
+#define LP_MSG_18               0xB2    //
+#define LP_MSG_19               0xB3    //
+#define LP_MSG_20               0xB4    //
+#define LP_MSG_21               0xB5    //
+
+
+#endif
+

+ 780 - 0
COMMON/XiMapUtilF.cpp

@@ -0,0 +1,780 @@
+//---------------------------------------------------------------------------
+
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "XiMapUtilF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+//TXiMapUtil *XiMapUtil = NULL;
+//---------------------------------------------------------------------------
+TXiMapUtil::TXiMapUtil(TXiClient *AXiClient)
+{
+	FXiClient = AXiClient;
+}
+//---------------------------------------------------------------------------
+TXiMapUtil::~TXiMapUtil()
+{
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MovePoint(double AdX, double AdY, double AdValue)
+{
+	if (!FXiClient)
+		return;
+
+	FXiClient->Start(DDRect(AdX - AdValue,
+							AdX + AdValue,
+							AdY - AdValue,
+							AdY + AdValue));
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveLink(String ALinkId)
+{
+	TItsLink *pLink = ItsLinkManager->FLists.Find(ALinkId);
+
+	MoveLink(pLink);
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveLink(TItsLink *ALink)
+{
+	FXiClient->ClearPathInfo();
+
+	if (!ALink) return;
+
+	TArrInt      vObjIDxs;
+	TDDPoints    pts;
+	TDDRect      objmbr;
+	TDDLineStyle Linestyle;
+	TStringList *Linkids = new TStringList();
+	int nLayerIndex = FXiClient->XiMapServer->GetLayerIndex("GD_LINK_LV7.dvf");
+    if (nLayerIndex < 0) return;
+
+	Linkids->Add(ALink->LINK_ID);
+	Linkids->Add(ALink->LINK_ID);
+
+	TDDRect DDRect_Move;
+	DDRect_Move.MinX = 200;
+	DDRect_Move.MaxX = 0;
+	DDRect_Move.MinY = 50;
+	DDRect_Move.MaxY = 0;
+
+	try
+	{
+		if (FXiClient->XiMapServer->Get_MultiAtt(nLayerIndex, "SD_LINK_ID", Linkids, vObjIDxs))
+		{
+			for(int i = 0; i < vObjIDxs.High; i++)
+			{
+				pts = FXiClient->XiMapServer->Get_NstObj(nLayerIndex, vObjIDxs[i], objmbr);
+
+				if (vObjIDxs[i] == -1)
+					continue;
+
+				Linestyle.PenWidth = 4;
+				Linestyle.PenColor = clPurple;
+				Linestyle.OutLineType = true;
+				Linestyle.ArrowType = false;
+
+				FXiClient->ADDPathInfo(TDDPolyLine(pts), "--=", 1, 1, Linestyle);
+
+				if (DDRect_Move.MinX > objmbr.MinX)
+					DDRect_Move.MinX = objmbr.MinX;
+				if (DDRect_Move.MaxX < objmbr.MaxX)
+					DDRect_Move.MaxX = objmbr.MaxX;
+				if (DDRect_Move.MinY > objmbr.MinY)
+					DDRect_Move.MinY = objmbr.MinY;
+				if (DDRect_Move.MaxY < objmbr.MaxY)
+					DDRect_Move.MaxY = objmbr.MaxY;
+			}
+
+			DDRect_Move.MinX -= 0.002;
+			DDRect_Move.MaxX += 0.002;
+			DDRect_Move.MinY -= 0.002;
+			DDRect_Move.MaxY += 0.002;
+
+			FXiClient->ExtentDraw(DDRect_Move);
+		}
+	}
+	catch(...)
+	{
+	}
+
+	delete Linkids;
+	FXiClient->ReDraw();
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveServiceLink(String AServiceLinkId)
+{
+	TItsServiceLink *ServiceLink = ItsServiceLinkManager->FLists.Find(AServiceLinkId);
+
+	MoveServiceLink(ServiceLink);
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveServiceLink(TItsServiceLink *AServiceLink)
+{
+	FXiClient->ClearPathInfo();
+
+	if (!AServiceLink)
+		return;
+
+	TArrInt vObjIDxs;
+	TDDPoints pts;
+	TDDRect objmbr;
+	TDDLineStyle Linestyle;
+	TStringList *Linkids = new TStringList();
+	int nLayerIndex = FXiClient->XiMapServer->GetLayerIndex("GD_LINK_LV6.dvf");
+    if (nLayerIndex < 0) return;
+
+	Linkids->Add(AServiceLink->IFSC_ID);
+	Linkids->Add(AServiceLink->IFSC_ID);
+
+	TDDRect DDRect_Move;
+	DDRect_Move.MinX = 200;
+	DDRect_Move.MaxX = 0;
+	DDRect_Move.MinY = 50;
+	DDRect_Move.MaxY = 0;
+
+	try
+	{
+		if (FXiClient->XiMapServer->Get_MultiAtt(nLayerIndex, "SD_LINK_ID", Linkids, vObjIDxs))
+		{
+			for(int i = 0; i < vObjIDxs.High; i++)
+			{
+				pts = FXiClient->XiMapServer->Get_NstObj(nLayerIndex, vObjIDxs[i], objmbr);
+
+				if (vObjIDxs[i] == -1)
+					continue;
+
+				Linestyle.PenWidth = 4;
+				Linestyle.PenColor = clPurple;
+				Linestyle.OutLineType = true;
+				Linestyle.ArrowType = false;
+
+				FXiClient->ADDPathInfo(TDDPolyLine(pts), "--=", 1, 1, Linestyle);
+
+				if (DDRect_Move.MinX > objmbr.MinX)
+					DDRect_Move.MinX = objmbr.MinX;
+				if (DDRect_Move.MaxX < objmbr.MaxX)
+					DDRect_Move.MaxX = objmbr.MaxX;
+				if (DDRect_Move.MinY > objmbr.MinY)
+					DDRect_Move.MinY = objmbr.MinY;
+				if (DDRect_Move.MaxY < objmbr.MaxY)
+					DDRect_Move.MaxY = objmbr.MaxY;
+			}
+
+			DDRect_Move.MinX -= 0.002;
+			DDRect_Move.MaxX += 0.002;
+			DDRect_Move.MinY -= 0.002;
+			DDRect_Move.MaxY += 0.002;
+
+			FXiClient->ExtentDraw(DDRect_Move);
+		}
+	}
+	catch(...)
+	{
+	}
+
+	delete Linkids;
+	FXiClient->ReDraw();
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveRoad(String ARoadId)
+{
+	TItsRoad *pRoad = ItsRoadManager->FLists.Find(ARoadId);
+
+	MoveRoad(pRoad);
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveRoad(TItsRoad *ARoad)
+{
+	FXiClient->ClearPathInfo();
+
+	if (!ARoad)
+		return;
+
+	TArrInt vObjIDxs;
+	TDDPoints pts;
+	TDDRect objmbr;
+	TDDLineStyle Linestyle;
+	TStringList *Linkids = new TStringList();
+	int nLayerIndex = FXiClient->XiMapServer->GetLayerIndex("GD_LINK_LV5.dvf");
+    if (nLayerIndex < 0) return;
+
+	Linkids->Add(ARoad->ROAD_ID);
+	Linkids->Add(ARoad->ROAD_ID);
+
+	TDDRect DDRect_Move;
+	DDRect_Move.MinX = 200;
+	DDRect_Move.MaxX = 0;
+	DDRect_Move.MinY = 50;
+	DDRect_Move.MaxY = 0;
+
+	try
+	{
+		if (FXiClient->XiMapServer->Get_MultiAtt(nLayerIndex, "SD_LINK_ID", Linkids, vObjIDxs))
+		{
+			for(int i = 0; i < vObjIDxs.High; i++)
+			{
+				pts = FXiClient->XiMapServer->Get_NstObj(nLayerIndex, vObjIDxs[i], objmbr);
+
+				if (vObjIDxs[i] == -1)
+					continue;
+
+				Linestyle.PenWidth = 4;
+				Linestyle.PenColor = clPurple;
+				Linestyle.OutLineType = true;
+				Linestyle.ArrowType = false;
+
+				FXiClient->ADDPathInfo(TDDPolyLine(pts), "--=", 1, 1, Linestyle);
+
+				if (DDRect_Move.MinX > objmbr.MinX)
+					DDRect_Move.MinX = objmbr.MinX;
+				if (DDRect_Move.MaxX < objmbr.MaxX)
+					DDRect_Move.MaxX = objmbr.MaxX;
+				if (DDRect_Move.MinY > objmbr.MinY)
+					DDRect_Move.MinY = objmbr.MinY;
+				if (DDRect_Move.MaxY < objmbr.MaxY)
+					DDRect_Move.MaxY = objmbr.MaxY;
+			}
+
+			DDRect_Move.MinX -= 0.002;
+			DDRect_Move.MaxX += 0.002;
+			DDRect_Move.MinY -= 0.002;
+			DDRect_Move.MaxY += 0.002;
+
+			FXiClient->ExtentDraw(DDRect_Move);
+		}
+	}
+	catch(...)
+	{
+	}
+
+	delete Linkids;
+	FXiClient->ReDraw();
+}
+//---------------------------------------------------------------------------
+
+
+void TXiMapUtil::ClearPath(TXiClient *AXiClient)
+{
+	if (!AXiClient)
+		return;
+
+    AXiClient->ClearUserDrawPolyGon();
+    AXiClient->ClearPathInfo();
+    AXiClient->ReDraw();
+}
+//---------------------------------------------------------------------------
+
+void TXiMapUtil::MovePoint(TXiClient *AXiClient, double AdX, double AdY, double AdValue)
+{
+	if (!AXiClient)
+		return;
+
+	AXiClient->Start(DDRect(AdX - AdValue,
+							AdX + AdValue,
+							AdY - AdValue,
+							AdY + AdValue));
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveNode(TXiClient *AXiClient, String ANodeId)
+{
+	TItsNode *pNode = ItsNodeManager->FLists.Find(ANodeId);
+
+	MoveNode(AXiClient, pNode);
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveNode(TXiClient *AXiClient, TItsNode *ANode)
+{
+	if (!AXiClient)
+		return;
+
+	AXiClient->ClearPathInfo();
+
+	if (!ANode)
+		return;
+
+    TDDPoint tdpPoint;
+    try {
+        tdpPoint.X = StrToFloat(ANode->X_CRDN);    //X 좌표
+        tdpPoint.Y = StrToFloat(ANode->Y_CRDN);    //Y 좌표
+    } catch(...) { return; }
+
+    AXiClient->MoveExtentDraw(tdpPoint);
+    AXiClient->LevelView(7);
+    AXiClient->CreateDrawFocusRectThread(tdpPoint, 4);
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveLink(TXiClient *AXiClient, String ALinkId)
+{
+	TItsLink *pLink = ItsLinkManager->FLists.Find(ALinkId);
+
+	MoveLink(AXiClient, pLink);
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveLink(TXiClient *AXiClient, TItsLink *ALink)
+{
+	if (!AXiClient)
+		return;
+
+	AXiClient->ClearPathInfo();
+
+	if (!ALink)
+		return;
+
+	TArrInt vObjIDxs;
+	TDDPoints pts;
+	TDDRect objmbr;
+	TDDLineStyle Linestyle;
+	TStringList *Linkids = new TStringList();
+	int nLayerIndex = AXiClient->XiMapServer->GetLayerIndex("GD_LINK_LV7.dvf");
+    if (nLayerIndex < 0) return;
+
+	Linkids->Add(ALink->LINK_ID);
+	Linkids->Add(ALink->LINK_ID);
+
+	TDDRect DDRect_Move;
+	DDRect_Move.MinX = 200;
+	DDRect_Move.MaxX = 0;
+	DDRect_Move.MinY = 50;
+	DDRect_Move.MaxY = 0;
+
+	try
+	{
+		if (AXiClient->XiMapServer->Get_MultiAtt(nLayerIndex, "SD_LINK_ID", Linkids, vObjIDxs))
+		{
+			for(int i = 0; i < vObjIDxs.High; i++)
+			{
+				pts = AXiClient->XiMapServer->Get_NstObj(nLayerIndex, vObjIDxs[i], objmbr);
+
+				if (vObjIDxs[i] == -1)
+					continue;
+
+				Linestyle.PenWidth = 4;
+				Linestyle.PenColor = clPurple;
+				Linestyle.OutLineType = true;
+				Linestyle.ArrowType = false;
+
+				AXiClient->ADDPathInfo(TDDPolyLine(pts), "--=", 1, 1, Linestyle);
+
+				if (DDRect_Move.MinX > objmbr.MinX)
+					DDRect_Move.MinX = objmbr.MinX;
+				if (DDRect_Move.MaxX < objmbr.MaxX)
+					DDRect_Move.MaxX = objmbr.MaxX;
+				if (DDRect_Move.MinY > objmbr.MinY)
+					DDRect_Move.MinY = objmbr.MinY;
+				if (DDRect_Move.MaxY < objmbr.MaxY)
+					DDRect_Move.MaxY = objmbr.MaxY;
+			}
+
+			DDRect_Move.MinX -= 0.002;
+			DDRect_Move.MaxX += 0.002;
+			DDRect_Move.MinY -= 0.002;
+			DDRect_Move.MaxY += 0.002;
+
+			AXiClient->ExtentDraw(DDRect_Move);
+		}
+	}
+	catch(...)
+	{
+	}
+
+	delete Linkids;
+	AXiClient->ReDraw();
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveServiceLink(TXiClient *AXiClient, String AServiceLinkId)
+{
+	TItsServiceLink *ServiceLink = ItsServiceLinkManager->FLists.Find(AServiceLinkId);
+
+	MoveServiceLink(AXiClient, ServiceLink);
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveServiceLink(TXiClient *AXiClient, TItsServiceLink *AServiceLink)
+{
+	if (!AXiClient)
+		return;
+
+	AXiClient->ClearPathInfo();
+
+	if (!AServiceLink)
+		return;
+
+	TArrInt vObjIDxs;
+	TDDPoints pts;
+	TDDRect objmbr;
+	TDDLineStyle Linestyle;
+	TStringList *Linkids = new TStringList();
+	int nLayerIndex = AXiClient->XiMapServer->GetLayerIndex("GD_LINK_LV6.dvf");
+    if (nLayerIndex < 0) return;
+
+	Linkids->Add(AServiceLink->IFSC_ID);
+	Linkids->Add(AServiceLink->IFSC_ID);
+
+	TDDRect DDRect_Move;
+	DDRect_Move.MinX = 200;
+	DDRect_Move.MaxX = 0;
+	DDRect_Move.MinY = 50;
+	DDRect_Move.MaxY = 0;
+
+	try
+	{
+		if (AXiClient->XiMapServer->Get_MultiAtt(nLayerIndex, "SD_LINK_ID", Linkids, vObjIDxs))
+		{
+			for(int i = 0; i < vObjIDxs.High; i++)
+			{
+				pts = AXiClient->XiMapServer->Get_NstObj(nLayerIndex, vObjIDxs[i], objmbr);
+
+				if (vObjIDxs[i] == -1)
+					continue;
+
+				Linestyle.PenWidth = 4;
+				Linestyle.PenColor = clPurple;
+				Linestyle.OutLineType = true;
+				Linestyle.ArrowType = false;
+
+				AXiClient->ADDPathInfo(TDDPolyLine(pts), "--=", 1, 1, Linestyle);
+
+				if (DDRect_Move.MinX > objmbr.MinX)
+					DDRect_Move.MinX = objmbr.MinX;
+				if (DDRect_Move.MaxX < objmbr.MaxX)
+					DDRect_Move.MaxX = objmbr.MaxX;
+				if (DDRect_Move.MinY > objmbr.MinY)
+					DDRect_Move.MinY = objmbr.MinY;
+				if (DDRect_Move.MaxY < objmbr.MaxY)
+					DDRect_Move.MaxY = objmbr.MaxY;
+			}
+
+			DDRect_Move.MinX -= 0.002;
+			DDRect_Move.MaxX += 0.002;
+			DDRect_Move.MinY -= 0.002;
+			DDRect_Move.MaxY += 0.002;
+
+			AXiClient->ExtentDraw(DDRect_Move);
+		}
+	}
+	catch(...)
+	{
+	}
+
+	delete Linkids;
+	AXiClient->ReDraw();
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveRoad(TXiClient *AXiClient, String ARoadId)
+{
+	TItsRoad *pRoad = ItsRoadManager->FLists.Find(ARoadId);
+
+	MoveRoad(AXiClient, pRoad);
+}
+//---------------------------------------------------------------------------
+void TXiMapUtil::MoveRoad(TXiClient *AXiClient, TItsRoad *ARoad)
+{
+	if (!AXiClient)
+		return;
+
+	AXiClient->ClearPathInfo();
+
+	if (!ARoad)
+		return;
+
+	TArrInt vObjIDxs;
+	TDDPoints pts;
+	TDDRect objmbr;
+	TDDLineStyle Linestyle;
+	TStringList *Linkids = new TStringList();
+	int nLayerIndex = AXiClient->XiMapServer->GetLayerIndex("GD_LINK_LV5.dvf");
+    if (nLayerIndex < 0) return;
+
+	Linkids->Add(ARoad->ROAD_ID);
+	Linkids->Add(ARoad->ROAD_ID);
+
+	TDDRect DDRect_Move;
+	DDRect_Move.MinX = 200;
+	DDRect_Move.MaxX = 0;
+	DDRect_Move.MinY = 50;
+	DDRect_Move.MaxY = 0;
+
+	try
+	{
+		if (AXiClient->XiMapServer->Get_MultiAtt(nLayerIndex, "SD_LINK_ID", Linkids, vObjIDxs))
+		{
+			for(int i = 0; i < vObjIDxs.High; i++)
+			{
+				pts = AXiClient->XiMapServer->Get_NstObj(nLayerIndex, vObjIDxs[i], objmbr);
+
+				if (vObjIDxs[i] == -1)
+					continue;
+
+				Linestyle.PenWidth = 4;
+				Linestyle.PenColor = clPurple;
+				Linestyle.OutLineType = true;
+				Linestyle.ArrowType = false;
+
+				AXiClient->ADDPathInfo(TDDPolyLine(pts), "--=", 1, 1, Linestyle);
+
+				if (DDRect_Move.MinX > objmbr.MinX)
+					DDRect_Move.MinX = objmbr.MinX;
+				if (DDRect_Move.MaxX < objmbr.MaxX)
+					DDRect_Move.MaxX = objmbr.MaxX;
+				if (DDRect_Move.MinY > objmbr.MinY)
+					DDRect_Move.MinY = objmbr.MinY;
+				if (DDRect_Move.MaxY < objmbr.MaxY)
+					DDRect_Move.MaxY = objmbr.MaxY;
+			}
+
+			DDRect_Move.MinX -= 0.002;
+			DDRect_Move.MaxX += 0.002;
+			DDRect_Move.MinY -= 0.002;
+			DDRect_Move.MaxY += 0.002;
+
+			AXiClient->ExtentDraw(DDRect_Move);
+		}
+	}
+	catch(...)
+	{
+	}
+
+	delete Linkids;
+	AXiClient->ReDraw();
+}
+//---------------------------------------------------------------------------
+
+void TXiMapUtil::SelectLinkByPos(TXiServer *AXiServer, TXiClient *AXiClient, int ALayerIdx, int X, int Y, String &ALinkId)
+{
+    TDDPoints ddptsArea;
+    ALinkId = "";
+    try
+    {
+    	TDVAInfo	  DVAInfo;
+        TStringList	 *slstGeo    = new TStringList();
+        TStringList	 *slFldName  = new TStringList();
+        TStringList	 *slFldValue = new TStringList();
+
+        AXiServer->GetDVAInfo(ALayerIdx, DVAInfo);
+        TShpType shpType = AXiServer->GetShpType(ALayerIdx);
+        if (AXiServer->ShpObjInfo2(X, Y, ALayerIdx, slFldName, slFldValue, slstGeo))
+        {
+            if (slstGeo->Count)
+            {
+                ddptsArea.Length = 0;
+
+                if (slstGeo->Strings[0] == "POLYGON")
+                {
+                    ddptsArea.Length = 0;
+
+                    ALinkId = slFldValue->Strings[1];
+                    if (shpType == iLine)  // polyline shape
+                    {
+                        TStringList *slDel = new TStringList();
+                        TStringList *slPos = new TStringList();
+
+                        slDel->Clear();
+                        slDel->Delimiter = '/';
+                        slDel->DelimitedText = slstGeo->Strings[3];
+
+                        ddptsArea.Length = slDel->Count+1;
+
+                        int nCnt = 0;
+                        for (int ii = 0; ii < slDel->Count; ii++)
+                        {
+                            slPos->Clear();
+                            slPos->Delimiter = '|';
+                            slPos->DelimitedText = slDel->Strings[ii];
+
+                            for (int jj = 0; jj < slPos->Count; jj++)
+                            {
+                                if (!(jj % 2))
+                                {
+                                    ddptsArea[nCnt].X = slPos->Strings[jj].ToDouble();
+                                }
+                                else
+                                {
+                                    ddptsArea[nCnt].Y = slPos->Strings[jj].ToDouble();
+                                    nCnt++;
+                                }
+                            }
+                            ddptsArea[nCnt].X = ddptsArea[nCnt-1].X;
+                            ddptsArea[nCnt].Y = ddptsArea[nCnt-1].Y;
+                        }
+                        delete slDel;
+                        delete slPos;
+                    }
+                    else    // polygon shape
+                    {
+                        AnsiString  strLnkID = "SD_LINK_ID";
+                        TStringList *linkids;
+                        TArrInt     vObjIdxs;
+                        TDDRect     objMBR;
+
+                        linkids	= new TStringList( );
+
+                        linkids->Add(AnsiString(ALinkId));
+                        linkids->Add(AnsiString("2100031100")); // 아이템이 1개 이상이어야 검색이됨
+                        if (AXiServer->Get_MultiAtt(ALayerIdx, strLnkID, linkids, vObjIdxs))
+                        {
+                            for ( int i = 0; i < vObjIdxs.High ; i++ )
+                            {
+                                if ( vObjIdxs[i] == -1 )
+                                    continue;
+                                ddptsArea = AXiServer->Get_NstObj(ALayerIdx, vObjIdxs[i], objMBR);
+                                break;
+                            }
+                        }
+                        delete linkids;
+                    }
+                }
+            }
+        }
+
+        delete slstGeo;
+        delete slFldName;
+        delete slFldValue;
+    }
+    catch(...)
+    {
+    }
+    if (ddptsArea.Length > 0)
+    {
+        TDDPolygonStyle dpgStyle;
+        dpgStyle.BrushStyle = bsCross;
+        dpgStyle.BrushColor = clWhite;
+        dpgStyle.LineStyle.PenWidth = 2;
+        dpgStyle.LineStyle.PenStyle = psSolid;
+        dpgStyle.LineStyle.PenMode = pmMask;
+        dpgStyle.LineStyle.PenColor = clBlue;
+        dpgStyle.LineStyle.OutLineType = true;
+
+        AXiClient->ADDUserDrawPolyGon(ddptsArea, "", dpgStyle);
+    }
+}
+//---------------------------------------------------------------------------
+
+void TXiMapUtil::SelectLinkByPos2(TXiServer *AXiServer, TXiClient *AXiClient, int ALayerIdx, double X, double Y)
+{
+    TDDPoints ddptsArea;
+    try
+    {
+    	TDVAInfo	  DVAInfo;
+        TStringList	 *slstGeo    = new TStringList();
+        TStringList	 *slFldName  = new TStringList();
+        TStringList	 *slFldValue = new TStringList();
+
+        AXiServer->GetDVAInfo(ALayerIdx, DVAInfo);
+        TShpType shpType = AXiServer->GetShpType(ALayerIdx);
+        if (AXiServer->ShpObjInfo2(X, Y, ALayerIdx, slFldName, slFldValue, slstGeo))
+        {
+            if (slstGeo->Count)
+            {
+                ddptsArea.Length = 0;
+
+                if (slstGeo->Strings[0] == "POLYGON")
+                {
+                    ddptsArea.Length = 0;
+
+                    if (shpType == iLine)  // polyline shape
+                    {
+                        TStringList *slDel = new TStringList();
+                        TStringList *slPos = new TStringList();
+
+                        slDel->Clear();
+                        slDel->Delimiter = '/';
+                        slDel->DelimitedText = slstGeo->Strings[3];
+
+                        ddptsArea.Length = slDel->Count+1;
+
+                        int nCnt = 0;
+                        for (int ii = 0; ii < slDel->Count; ii++)
+                        {
+                            slPos->Clear();
+                            slPos->Delimiter = '|';
+                            slPos->DelimitedText = slDel->Strings[ii];
+
+                            for (int jj = 0; jj < slPos->Count; jj++)
+                            {
+                                if (!(jj % 2))
+                                {
+                                    ddptsArea[nCnt].X = slPos->Strings[jj].ToDouble();
+                                }
+                                else
+                                {
+                                    ddptsArea[nCnt].Y = slPos->Strings[jj].ToDouble();
+                                    nCnt++;
+                                }
+                            }
+                            ddptsArea[nCnt].X = ddptsArea[nCnt-1].X;
+                            ddptsArea[nCnt].Y = ddptsArea[nCnt-1].Y;
+                        }
+                        delete slDel;
+                        delete slPos;
+                    }
+                }
+            }
+        }
+
+        delete slstGeo;
+        delete slFldName;
+        delete slFldValue;
+    }
+    catch(...)
+    {
+    }
+    if (ddptsArea.Length > 0)
+    {
+        TDDPolygonStyle dpgStyle;
+        dpgStyle.BrushStyle = bsCross;
+        dpgStyle.BrushColor = clWhite;
+        dpgStyle.LineStyle.PenWidth = 2;
+        dpgStyle.LineStyle.PenStyle = psSolid;
+        dpgStyle.LineStyle.PenMode = pmMask;
+        dpgStyle.LineStyle.PenColor = clBlue;
+        dpgStyle.LineStyle.OutLineType = true;
+
+        AXiClient->ADDUserDrawPolyGon(ddptsArea, "", dpgStyle);
+    }
+}
+//---------------------------------------------------------------------------
+
+void TXiMapUtil::SelectLinkById(TXiServer *AXiServer, TXiClient *AXiClient, int ALayerIdx, String ALinkId)
+{
+    TDDRect      objmbr;
+    TDDPoints    pts;
+    TStringList *Linkids = NULL;
+    TArrInt      vObjIDxs;
+
+    try
+    {
+        Linkids = new TStringList();
+        Linkids->Add(ALinkId);
+        Linkids->Add(ALinkId);
+
+        if (AXiServer->Get_MultiAtt(ALayerIdx, "SD_LINK_ID", Linkids, vObjIDxs))
+        {
+            for(int ii = 0; ii < vObjIDxs.High; ii++)
+            {
+                if (vObjIDxs[ii] == -1)
+                {
+                    continue;
+                }
+                pts = AXiServer->Get_NstObj(ALayerIdx, vObjIDxs[ii], objmbr);
+
+                TDDLineStyle Linestyle;
+                Linestyle.PenWidth = 4;
+                Linestyle.PenColor = clPurple;
+                Linestyle.OutLineType = true;
+                Linestyle.ArrowType   = true;
+                AXiClient->ADDPathInfo(TDDPolyLine(pts), "", 0, 0, Linestyle);
+            }
+        }
+    }
+    __finally
+    {
+        if (Linkids) delete Linkids;
+    }
+}
+//---------------------------------------------------------------------------
+

+ 57 - 0
COMMON/XiMapUtilF.h

@@ -0,0 +1,57 @@
+//---------------------------------------------------------------------------
+
+#ifndef XiMapUtilFH
+#define XiMapUtilFH
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#include "XiClient.hpp"
+#include "XiServer.hpp"
+#include "CDSNodeF.h"
+#include "CDSLinkF.h"
+#include "CDSServiceLinkF.h"
+#include "CDSRoadF.h"
+//---------------------------------------------------------------------------
+#define GIS_XGAP                0.00015     // CCTV, RSEÁÂÇ¥°¡ °°À¸¹Ç·Î º¸Á¤
+//---------------------------------------------------------------------------
+
+class TXiMapUtil
+{
+public:
+    TXiMapUtil(TXiClient *AXiClient);
+    virtual ~TXiMapUtil();
+
+    TXiClient   *FXiClient;
+
+    void MovePoint      (double AdX, double AdY, double AdValue = 0.02);
+    void MoveLink       (String    ALinkId);
+    void MoveLink       (TItsLink *ALink);
+    void MoveServiceLink(String           AServiceLinkId);
+    void MoveServiceLink(TItsServiceLink *AServiceLink);
+    void MoveRoad       (String    ARoadId);
+    void MoveRoad       (TItsRoad *ARoad);
+
+    static void ClearPath      (TXiClient *AXiClient); 
+    static void MovePoint      (TXiClient *AXiClient, double AdX, double AdY, double AdValue = 0.02);
+    static void MoveNode       (TXiClient *AXiClient, String    ANodeId);
+    static void MoveNode       (TXiClient *AXiClient, TItsNode *ANode);
+    static void MoveLink       (TXiClient *AXiClient, String    ALinkId);
+    static void MoveLink       (TXiClient *AXiClient, TItsLink *ALink);
+    static void MoveServiceLink(TXiClient *AXiClient, String           AServiceLinkId);
+    static void MoveServiceLink(TXiClient *AXiClient, TItsServiceLink *AServiceLink);
+    static void MoveRoad       (TXiClient *AXiClient, String    ARoadId);
+    static void MoveRoad       (TXiClient *AXiClient, TItsRoad *ARoad);
+
+    static void SelectLinkByPos(TXiServer *AXiServer, TXiClient *AXiClient, int ALayerIdx, int X, int Y, String &ALinkId);
+    static void SelectLinkByPos2(TXiServer *AXiServer, TXiClient *AXiClient, int ALayerIdx, double X, double Y);
+    static void SelectLinkById(TXiServer *AXiServer, TXiClient *AXiClient, int ALayerIdx, String ALinkId);
+
+    __property TXiClient *XiClient = {read = FXiClient };
+};
+//---------------------------------------------------------------------------
+//extern TXiMapUtil *XiMapUtil;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 338 - 0
COMMON/XnsWebCamera--/XnsCommon.h

@@ -0,0 +1,338 @@
+#pragma once
+
+#include "XnsDeviceInterface.h"
+
+#define STR_LEN_NAME				127	
+#define STR_LEN_ID					 63	
+#define STR_LEN_PSWD				 41	
+#define STR_LEN_PTZ_NAME			 41	
+#define STR_LEN_IP					 16	
+#define STR_LEN_MAC					 13
+#define STR_LEN_DOMAIN				255		
+#define STR_LEN_URL					255	
+#define STR_LEN_DDNSID				 21	
+#define STR_LEN_VERSION				128	
+#define STR_LEN_DESCRIPTION			255	
+#define STR_LEN_PHONE				 63	
+#define STR_LEN_ADDRESS				255	
+#define STR_LEN_PATH				512
+
+//#define ERR_NOT_INITIALIZE			-1	// 0xFFFFFFFF
+
+#define ERR_SUCCESS					0x00000000
+#define ERR_UNKNOWN					0x00000001
+
+// Initialize
+#define ERR_INVALID_CFG_FILE	 	0x00000010
+#define ERR_CFG_FILE_READ_ERROR		0x00000011
+#define ERR_ALREADY_INITIALIZE		0x00000012
+#define ERR_NOT_INITIALIZE			0x00000013
+
+// ADDED BY SSO(2011.06.03):디바이스핸들유무 체크후 삭제하도록 예외처리추가
+// ADDED BY HH3.KIM(2011.06.08):디바이스핸들 체크 에러시 0을 리턴하지 않고 아래의 값을 리턴하도록 변경함.
+#define ERR_INVALID_DEVICE_HANDLE	0x00000014
+#define ERR_ALREADY_EXIST_DEVICEID	0x00000015
+
+// Device Connection
+#define ERR_NOT_SUPPORTED_DEVICE	0x00000020
+#define ERR_EXCEED_CONNECTION		0x00000021
+#define ERR_NOT_CONNECT				0x00000022
+#define ERR_MAC_CONFLICT			0x00000023
+#define ERR_INVALID_VERSION			0x00000024
+#define ERR_INVALID_MODEL			0x00000025
+#define ERR_ALREADY_CONNECT			0x00000026
+
+// Login Error
+#define ERR_INVALID_USERID			0x00000030
+#define ERR_WRONG_PASSWORD			0x00000031
+#define ERR_LOGIN					0x00000032
+#define ERR_ADMIN_CONFLICT			0x00000033
+#define ERR_USER_FULL				0x00000034
+// Query Request
+#define ERR_XNS_BUSY				0x00000040
+#define ERR_BAD_NETWORK				0x00000041
+#define ERR_REQUEST_TIME_OUT		0x00000042
+#define ERR_INVALID_PARAMETER		0x00000043
+#define ERR_NO_PERMISSION			0x00000044
+#define ERR_NOT_SUPPORTED_COMMAND	0x00000045
+// File Transfer
+#define ERR_INVALID_FILE			0x00000050
+#define ERR_UPLOAD_FAIL				0x00000051
+#define ERR_IMPORT_FAIL				0x00000052
+#define ERR_EXPORT_FAIL				0x00000053
+#define ERR_FILE_TRANSFERRING		0x00000054
+// Media Open
+//#define ERR_VIDEO_LOSS				0x0000001a
+//#define ERR_COVERT					0x0000001b
+#define ERR_MEDIA_ALREADY_OPEND		0x00000060
+// PTZ Control
+#define ERR_PTZ_CONFLICT			0x00000070
+// XnsWindow Error
+#define ERR_INVALID_OBJID			0x00000080
+#define ERR_ALREADY_RUN				0x00000081
+#define ERR_MEDIA_NOT_OPENED		0x00000082
+#define ERR_MEDIA_PAUSED			0x00000083
+#define ERR_MEDIA_PLAYED			0x00000084
+#define ERR_MEDIA_DISCONNECTED		0x00000085
+// File Error
+#define ERR_FILE_ALREADY_OPEND		0x00000090
+#define ERR_FILE_NOT_OPEND			0x00000091
+#define ERR_FILE_OPEN				0x00000092
+#define ERR_FILE_SEEK				0x00000093
+#define ERR_FILE_READ				0x00000094
+#define ERR_FILE_WRITE				0x00000095
+#define ERR_INVALID_FRAME			0x00000096
+#define ERR_WRITE_STOPPED			0x00000097
+#define ERR_WRITE_LIMITED			0x00000098
+#define ERR_WRITE_EMPTY				0x00000099
+#define ERR_DISK_FULL				0x0000009a
+#define ERR_READ_END				0x0000009b
+#define ERR_ALREADY_RECORDED		0x0000009c
+#define ERR_BACKUP_DOING			0x0000009d
+
+#define ERR_INVALID_XML				0x000000b0
+#define ERR_OVERLAPPED				0x000000b1
+#define ERR_LIMITED					0x000000b2
+
+#define ERR_BUFFER_FULL				0x000000c0
+#define ERR_INVALID_SEQUENCE		0x000000c1
+#define ERR_TALK_ALREADY_USE		0x000000c2
+
+// EMAIL INFO 디파인
+#define ERR_EMAIL_ALREADY_KEY_EXIST 0x000000d1
+#define ERR_EMAIL_KEY_NOT_EXIST		0x000000d2
+#define ERR_EMAIL_INVALID_KEY		0x000000d3
+#define ERR_EMAIL_SEND_FAIL			0x000000d4
+#define ERR_EMAIL_INFO_LIMIT		0x000000d5
+
+//+ jungkoo.kang <2012.11.28> Device Disconnect 에러코드 추가함
+#define ERR_DISCONNECT_LOGOUT_BY_ADMIN		0x000000e0
+#define ERR_DISCONNECT_TIME_CHANGE			0x000000e1
+#define ERR_DISCONNECT_HDD_ERASE			0x000000e2
+#define ERR_DISCONNECT_HDD_UNMOUNT			0x000000e3
+#define ERR_DISCONNECT_LOAD_FACTORY_DEFAULT	0x000000e4
+#define ERR_DISCONNECT_IMPORTED_CONFIG		0x000000e5
+#define ERR_DISCONNECT_SYSTEM_SHUTDOWN		0x000000e6
+#define ERR_DISCONNECT_REBOOT_MANUALLY		0x000000e7
+#define ERR_DISCONNECT_REBOOT_UPGRADE		0x000000e8
+#define ERR_DISCONNECT_NETWORK_CHANGE		0x000000e9
+//+
+
+//+ jungkoo.kang <2013.04.12> Banamex 관련 Siteminder 접속실패 에러코드 추가
+#define ERR_SITEMINDER_CONN_FAILED			0x000000f0
+#define ERR_SITEMINDER_AUTH_FAILED			0x000000f1
+
+#define NETADR_IP					1
+#define NETADR_URL					2
+#define NETADR_DDNS_SAMSUNG			3
+#define NETADR_DDNS_S1				4
+
+#define SEC_WRITER					1
+#define REC_WRITER					2
+
+#define MEDIA_TYPE_LIVE				1
+#define	MEDIA_TYPE_PLAYBACK			2
+#define	MEDIA_TYPE_BACKUP			3
+//#define MEDIA_TYPE_LIVE_CODEC1	4
+//#define MEDIA_TYPE_LIVE_CODEC2	5
+//#define MEDIA_TYPE_FILE			6
+
+#define PTZ_MENU_UP					1
+#define PTZ_MENU_DOWN				2
+#define PTZ_MENU_LEFT				3
+#define PTZ_MENU_RIGHT				4
+#define PTZ_MENU_ENTER				5
+#define PTZ_MENU_ON					6
+#define PTZ_MENU_OFF				7
+#define PTZ_MENU_CANCEL				8
+
+#define PTZ_UP						1
+#define PTZ_DOWN					2
+#define PTZ_LEFT					3
+#define PTZ_RIGHT					4
+#define PTZ_UPLEFT					5
+#define PTZ_UPRIGHT					6
+#define PTZ_DOWNLEFT				7
+#define PTZ_DOWNRIGHT				8
+#define PTZ_ZOOMIN					9
+#define PTZ_ZOOMOUT					10
+#define PTZ_STOP					11
+#define PTZ_FOCUS_NEAR				12
+#define PTZ_FOCUS_FAR				13
+#define PTZ_FOCUS_STOP				14
+#define PTZ_IRIS_OPEN				15
+#define PTZ_IRIS_CLOSE				16
+
+#define CAM_STATUS_ON				0x00000001
+#define CAM_STATUS_SIGNAL			0x00000002
+#define CAM_STATUS_COVERT1			0x00000004
+#define CAM_STATUS_COVERT2			0x00000008
+#define CAM_STATUS_ACTIVATED		0x00000010
+
+#define CAM_STATUS_NONE				0x00000000
+#define CAM_STATUS_MASK_ALL			0xffffffff
+
+#define CAP_NONE					0x00000000
+#define CAP_MASK_ALL				0xffffffff
+
+#define DEVICE_CAP_NONE				0x00000000
+#define DEVICE_CAP_SW_UPLOAD		0x00000001
+#define DEVICE_CAP_CFG_IMPORT		0x00000002
+#define DEVICE_CAP_CFG_EXPORT		0x00000004
+#define DEVICE_CAP_CONN_FORCED		0x00000008
+#define DEVICE_CAP_MEDIA_AUTHORITY	0x00000010
+#define DEVICE_CAP_FSPEED1			0x00020000
+#define DEVICE_CAP_FSPEED2			0x00040000
+#define DEVICE_CAP_FSPEED4			0x00060000
+#define DEVICE_CAP_FSPEED8			0x00080000
+#define DEVICE_CAP_FSPEED16			0x000a0000
+#define DEVICE_CAP_FSPEED32			0x000c0000
+#define DEVICE_CAP_FSPEED64			0x000e0000
+#define DEVICE_CAP_BSPEED1			0x00100000
+#define DEVICE_CAP_BSPEED2			0x00200000
+#define DEVICE_CAP_BSPEED4			0x00300000
+#define DEVICE_CAP_BSPEED8			0x00400000
+#define DEVICE_CAP_BSPEED16			0x00500000
+#define DEVICE_CAP_BSPEED32			0x00600000
+#define DEVICE_CAP_BSPEED64			0x00700000
+#define DEVICE_CAP_FSSPEED1			0x00800000
+#define DEVICE_CAP_FSSPEED2			0x01000000
+#define DEVICE_CAP_FSSPEED4			0x01800000
+#define DEVICE_CAP_FSSPEED8			0x02000000
+#define DEVICE_CAP_FSSPEED16		0x02800000
+#define DEVICE_CAP_FSSPEED32		0x03000000
+#define DEVICE_CAP_FSSPEED64		0x03800000
+#define DEVICE_CAP_BSSPEED1			0x04000000
+#define DEVICE_CAP_BSSPEED2			0x08000000
+#define DEVICE_CAP_BSSPEED4			0x0c000000
+#define DEVICE_CAP_BSSPEED8			0x10000000
+#define DEVICE_CAP_BSSPEED16		0x14000000
+#define DEVICE_CAP_BSSPEED32		0x18000000
+#define DEVICE_CAP_BSSPEED64		0x1c000000
+#define DEVICE_CAP_SEEK				0x20000000
+#define DEVICE_CAP_FSTEP			0x40000000
+#define DEVICE_CAP_BSTEP			0x80000000
+
+#define DEVICE_CAP_MASK_OFFLINE		0xfffe001f
+#define DEVICE_CAP_MASK_ONLINE		0x0001ffe0
+
+#define CHANNEL_CAP_LIVE			0x00000001
+#define CHANNEL_CAP_SEARCH			0x00000002
+#define CHANNEL_CAP_BACKUP			0x00000004
+#define CHANNEL_CAP_LISTEN			0x00000008
+#define CHANNEL_CAP_TALK			0x00000010
+#define CHANNEL_CAP_MENU			0x00000020
+#define CHANNEL_CAP_PTZ_PAN			0x00000040
+#define CHANNEL_CAP_PTZ_TILT		0x00000080
+#define CHANNEL_CAP_PTZ_ZOOM		0x00000100
+#define CHANNEL_CAP_PTZ_SPEED		0x00000200
+#define CHANNEL_CAP_PTZ_PRESET		0x00000400
+#define CHANNEL_CAP_PTZ_FUNCTION	0x00000800
+#define CHANNEL_CAP_PTZ_POWER		0x00001000
+#define CHANNEL_CAP_IRIS			0x00002000
+#define CHANNEL_CAP_FOCUS			0x00004000
+#define CHANNEL_CAP_BRIGHTNESS		0x00008000
+#define CHANNEL_CAP_CONTRAST		0x00010000
+#define CHANNEL_CAP_PTZ_FREE_MOVE	0x00020000
+#define CHANNEL_CAP_PTZ_SPEED_ZOOM	0x00040000
+
+#define VIDEO_CAP_LIVE				0x00000001
+
+#define ALARMOUT_CAP_ONOFF			0x00000001
+
+#define REC_TYPE_NONE				0x00
+#define REC_TYPE_MOTION				0x01
+#define REC_TYPE_ALARM				0x02
+#define REC_TYPE_VLOSS				0x04
+#define REC_TYPE_MANUAL				0x08
+#define REC_TYPE_CONTINUOS			0x10
+#define REC_TYPE_ALL				0xff
+
+#define HPTZ_TYPE_PRESET			1
+#define HPTZ_TYPE_AUTOPAN			2
+#define HPTZ_TYPE_SCAN				3
+#define HPTZ_TYPE_PATTERN			4
+
+#define FILE_TRANS_SW_UP			1
+#define FILE_TRANS_CFG_IMPORT		2
+#define FILE_TRANS_CFG_EXPORT		3
+
+#define MEDIA_VIDEO					1
+#define MEDIA_AUDIO					2
+
+#define VCODEC_UNKNOWN				0x00000000
+#define VCODEC_JPEG					0x00000001
+#define VCODEC_MJPEG				0x00000002
+#define VCODEC_MP4V					0x00000004
+#define VCODEC_MP4V_ASP				0x00000008
+#define VCODEC_PENTA				0x00000010
+#define VCODEC_SOLO					0x00000020
+#define VCODEC_H264					0x00000040
+#define ACODEC_G711					0x00010000	
+#define ACODEC_G711_IPCAM			0x00010001
+#define ACODEC_G726					0x00020000
+#define ACODEC_PCM					0x00040000
+#define ACODEC_G726_504X			0x00080000
+#define ACODEC_IMA_ADPCM			0x00100000
+#define ACODEC_G723					0x00200000 
+
+#define FRAME_UNKNOWN				0
+#define FRAME_IVOP					1
+#define FRAME_PVOP					2
+#define FRAME_BVOP					3
+#define FRAME_END					4
+
+#define OBJ_ALL						0xFFFFFFFF
+#define XOBJ_ALL					0x000000FF
+#define XOBJ_DEVICE					0x00000001
+#define XOBJ_CHANNEL				0x00000002
+#define XOBJ_VIDEO					0x00000004
+#define XOBJ_ALARMIN				0x00000008
+#define XOBJ_ALARMOUT				0x00000010
+
+#define PLAY_TYPE_NONE				0
+#define PLAY_TYPE_LIVE				1
+#define PLAY_TYPE_PLAYBACK			2
+
+#define MEDIA_STATUS_NONE			0
+
+#define LIVE_STATUS_ON				1
+#define LIVE_STATUS_VLOSS			2
+#define LIVE_STATUS_COVERT			3
+#define LIVE_STATUS_DISALBE			4
+#define LIVE_STATUS_DISCONNECT		5
+
+#define PLAYBACK_STATUS_PLAY		1
+#define PLAYBACK_STATUS_PAUSE		2
+#define PLAYBACK_STATUS_NODATA		3
+#define PLAYBACK_STATUS_COVERT		4
+#define PLAYBACK_STATUS_DISCONNECT	5
+
+// OSD TYPE
+#define OSD_ALL						0x0000FFFF
+#define OSD_TIME1					0x00000001
+#define OSD_TIME2					0x00000002
+#define OSD_IPS						0x00000004
+#define OSD_LOCAL_NAME				0x00000008
+#define OSD_REMOTE_NAME				0x00000010
+#define OSD_SPEED					0x00000020
+#define OSD_PTZ						0x00000040
+#define OSD_LISTEN					0x00000080
+#define OSD_TALK					0x00000100
+#define OSD_SENSOR					0x00000200
+#define OSD_MOTION					0x00000400
+#define OSD_DVR_RECORDING			0x00000800
+#define OSD_LOCAL_RECORDING			0x00001000
+
+
+#define EVENT_ALL					0x000000ff
+#define EVENT_ALARM					0x00000001
+#define EVENT_MOTION				0x00000002
+#define EVENT_VIDEOLOSS				0x00000004
+
+#define EXTRACT_TYPE( nObjectID ) ( (nObjectID&(0xff<<24))>>24 )
+#define EXTRACT_SESSIONID( nObjectID ) ( (nObjectID&(0xfff<<12))>>12 )
+#define EXTRACT_CHANNELNUM( nObjectID ) ( (nObjectID&(0xff<<4))>>4 )
+#define EXTRACT_VIDEONUM( nObjectID ) (nObjectID&0xf )
+#define EXTRACT_ALARMINNUM( nObjectID ) ( (nObjectID&(0xff<<4))>>4 )
+#define EXTRACT_ALARMOUTNUM( nObjectID ) ( (nObjectID&(0xff<<4))>>4 )

+ 541 - 0
COMMON/XnsWebCamera--/XnsDeviceInterface.h

@@ -0,0 +1,541 @@
+#pragma once
+
+#include "XnsMediaInterface.h"
+
+#define STR_LEN_NAME				127	
+#define STR_LEN_ID					 63	
+#define STR_LEN_PSWD				 41	
+#define STR_LEN_PTZ_NAME			 41	
+#define STR_LEN_IP					 16	
+#define STR_LEN_MAC					 13
+#define STR_LEN_DOMAIN				255		
+#define STR_LEN_URL					255	
+#define STR_LEN_DDNSID				 21	
+#define STR_LEN_VERSION				128	
+#define STR_LEN_DESCRIPTION			255	
+#define STR_LEN_PHONE				 63	
+#define STR_LEN_ADDRESS				255	
+#define STR_LEN_PATH				512
+
+#define  WM_RECEIVE_DEVICEEVENT			WM_USER + 101
+#define  WM_RECEIVE_WINDOWEVENT			WM_USER + 102
+enum
+{
+	XDEVICE_STATUS_DISCONNECTED = 0,
+	XDEVICE_STATUS_CONNECTED,
+};
+
+enum
+{
+	XCTL_ALL = 0xFF,
+	XCTL_DVR = 0x01,
+	XCTL_NETCAM = 0x02,
+	XCTL_ENCODER = 0x04,
+	XCTL_CAMERA = 0x08,
+	XCTL_VIDEO = 0x10,
+	XCTL_ALARM = 0x20,
+	XCTL_SENSOR = 0x40,
+	XCTL_ALARM_BEEP = 0x80,
+};
+
+enum
+{
+	XADDRESS_IP = 1,
+	XADDRESS_URL,
+	XADDRESS_SSDDNS,
+	XADDRESS_S1DDNS,
+	XADDRESS_IPOLISDDNS,
+};
+
+enum
+{
+	XCAMERA_STATUS = 1,
+	XRECORDING_STATUS,
+	XLISTEN_STATUS,
+	XTALK_STATUS,
+	XALARM_STATUS,
+	XLOCALREC_STATUS,
+};
+
+enum
+{
+	XCAMERA_STATUS_MASK = 0x00000001,
+	XRECORDING_STATUS_MASK = 0x00000002,
+	XLISTEN_STATUS_MASK = 0x00000004,
+	XTALK_STATUS_MASK = 0x00000008,
+	XALARM_STATUS_MASK = 0x00000010,
+	XLOCALREC_STATUS_MASK = 0x00000020,
+};
+
+enum
+{
+	XCAM_STATUS_ON = 0x00000001,
+	XCAM_STATUS_SIGNAL = 0x00000002,
+	XCAM_STATUS_COVERT1 = 0x00000004,
+	XCAM_STATUS_COVERT2 = 0x00000008,
+	XCAM_STATUS_ACTIVATED = 0x00000010,
+};
+
+enum
+{
+	XLISTEN_STATUS_LIVE = 0x00000001,
+	XLISTEN_STATUS_PLAYBACK = 0x00000002,
+};
+
+// --> hh3.kim : ADD IV EVENT
+// IV TYPE
+enum
+{
+	XIV_TYPE_PASSING		= 0x00000001,
+	XIV_TYPE_ENTERING		= 0x00000010,
+	XIV_TYPE_EXITING		= 0x00000020,
+	XIV_TYPE_APPEARING		= 0x00000040,
+	XIV_TYPE_DISAPPERING	= 0x00000080,
+	XIV_TYPE_SCENE_CHANGE	= 0x00000100,
+};
+// <-- hh3.kim : ADD IV EVENT
+
+enum
+{
+	XVCODEC_UNKNOWN = 0,
+	XVCODEC_MJPEG,
+	XVCODEC_MPEG4,
+	XVCODEC_H264
+};
+
+// Unit Cap (For Device and Control)
+// Caution! MAX Cap is 100 (MAX_CAPAPBILITY Defined)
+enum
+{
+	XCTL_CAP_NONE = 0,
+	XCTL_CAP_SW_UPLOAD,
+	XCTL_CAP_CFG_IMPORT,
+	XCTL_CAP_CFG_EXPORT,
+	XCTL_CAP_CONN_FORCED,
+	XCTL_CAP_MEDIA_AUTHORITY,
+	XCTL_CAP_FSPEED1,
+	XCTL_CAP_FSPEED2,
+	XCTL_CAP_FSPEED4,
+	XCTL_CAP_FSPEED8,
+	XCTL_CAP_FSPEED16,			//10
+	XCTL_CAP_FSPEED32,
+	XCTL_CAP_FSPEED64,
+	XCTL_CAP_BSPEED1,
+	XCTL_CAP_BSPEED2,
+	XCTL_CAP_BSPEED4,
+	XCTL_CAP_BSPEED8,
+	XCTL_CAP_BSPEED16,
+	XCTL_CAP_BSPEED32,
+	XCTL_CAP_BSPEED64,
+	XCTL_CAP_FSSPEED1,			//20
+	XCTL_CAP_FSSPEED2,
+	XCTL_CAP_FSSPEED4,
+	XCTL_CAP_FSSPEED8,
+	XCTL_CAP_FSSPEED16,
+	XCTL_CAP_FSSPEED32,
+	XCTL_CAP_FSSPEED64,
+	XCTL_CAP_BSSPEED1,
+	XCTL_CAP_BSSPEED2,
+	XCTL_CAP_BSSPEED4,
+	XCTL_CAP_BSSPEED8,			//30
+	XCTL_CAP_BSSPEED16,
+	XCTL_CAP_BSSPEED32,
+	XCTL_CAP_BSSPEED64,
+	XCTL_CAP_SEEK,
+	XCTL_CAP_FSTEP,
+	XCTL_CAP_BSTEP,
+	XCTL_CAP_LIVE,
+	XCTL_CAP_PLAYBACK,
+	XCTL_CAP_BACKUP,
+	XCTL_CAP_SEARCH,			//40
+	XCTL_CAP_LISTEN,
+	XCTL_CAP_TALK,
+	XCTL_CAP_CAM_MENU,
+	XCTL_CAP_PTZ_PAN,
+	XCTL_CAP_PTZ_TILT,
+	XCTL_CAP_PTZ_ZOOM,
+	XCTL_CAP_PTZ_SPEED,
+	XCTL_CAP_PTZ_PRESET,
+	XCTL_CAP_PTZ_PRESET_SVR,
+	XCTL_CAP_PTZ_AUTOPAN,		//50
+	XCTL_CAP_PTZ_SCAN,
+	XCTL_CAP_PTZ_PATTERN,
+	XCTL_CAP_PTZ_SWING,
+	XCTL_CAP_PTZ_TOUR,
+	XCTL_CAP_PTZ_POWER,		
+	XCTL_CAP_PTZ_FREE_MOVE,
+	XCTL_CAP_PTZ_SPEED_ZOOM,
+	XCTL_CAP_CAM_IRIS,
+	XCTL_CAP_CAM_FOCUS,
+	XCTL_CAP_CAM_BRIGHTNESS,	//60
+	XCTL_CAP_CAM_CONTRAST,		
+	XCTL_CAP_ALARM_ONOFF,
+	XCTL_CAP_DVR_EVENT_RESET,
+	XCTL_CAP_DVR_MANUAL_REC_CONTROL,
+	XCTL_CAP_DVR_REC_STATUS,
+	XCTL_CAP_MOTION_SEARCH,				// Smart Search Added
+
+	// --> hh3.kim : ADD AREA ZOOM FUNCTIONS
+	XCTL_CAP_PTZ_AREA_ZOOM,
+
+	// --> hh3.kim : ADD PTZ GET/SET FUNCTIONS
+	XCTL_CAP_PTZ_GET_POS,
+	XCTL_CAP_PTZ_SET_POS,
+	XCTL_CAP_OVERLAP_TRACK_SEARCH,		//70, //+ jeongguc.kang <2011.10.19> 중복구간 추가
+	XCTL_CAP_POS_SEARCH,				//+ jeongguc.kang <2011.10.20> Search Pos 추가
+
+	// hh3.kim : PTZ GET/SET POS SPEED
+	XCTL_CAP_PTZ_GET_POS_SPEED,
+	XCTL_CAP_PTZ_SET_POS_SPEED,
+
+	XCTL_CAP_POWER_RESTART,
+
+	XCTL_CAP_BANDWIDTH					//+ jeongguc.kang <2012.04.18> banamex 프로젝트 관련 bandwidth 커맨드 추가
+};
+
+// Unit Cap Mask (For Control, not Device)
+enum
+{
+	XCTL_CAP_SW_UPLOAD_MASK			= 0x00000001,
+	XCTL_CAP_CFG_IMPORT_MASK		= 0x00000002,
+	XCTL_CAP_CFG_EXPORT_MASK		= 0x00000004,
+	XCTL_CAP_CONN_FORCED_MASK		= 0x00000008,
+	XCTL_CAP_MEDIA_AUTHORITY_MASK	= 0x00000010,
+	XCTL_CAP_PLAY_CONTROL_MASK		= 0x00000020,
+	XCTL_CAP_LIVE_MASK				= 0x00000040,
+	XCTL_CAP_PLAYBACK_MASK			= 0x00000080,
+	XCTL_CAP_BACKUP_MASK			= 0x00000100,
+	XCTL_CAP_SEARCH_MASK			= 0x00000200,
+	XCTL_CAP_LISTEN_MASK			= 0x00000400,
+	XCTL_CAP_TALK_MASK				= 0x00000800,
+	XCTL_CAP_PTZ_MASK				= 0x00001000,
+	XCTL_CAP_ALARM_ONOFF_MASK		= 0x00002000,
+	XCTL_CAP_DVR_EVENT_RESET_MASK	= 0x00004000,
+	XCTL_CAP_DVR_MANUAL_REC_CONTROL_MASK = 0x00008000,
+	XCTL_CAP_DVR_REC_STATUS_MASK	= 0x00010000,
+	XCTL_CAP_MOTION_SEARCH_MASK		= 0x00020000,
+	XCTL_CAP_OVERLAP_TRACK_SEARCH_MASK = 0x00040000,	//+ jeongguc.kang <2011.10.19> 중복 구간 추가
+	XCTL_CAP_POS_SEARCH_MASK		= 0x00080000,		//+ jeongguc.kang <2011.10.20> Search Pos 추가
+	XCTL_CAP_POWER_RESTART_MASK		= 0x00100000,
+	XCTL_CAP_BANDWIDTH_MASK			= 0x00200000,	//+ jeongguc.kang <2012.04.18> banamex 프로젝트 관련 Get Bandwidth 추가
+};
+
+// XNS Command Match
+enum	// Query
+{
+	XQRY_CONNECT = 1,
+	XQRY_CONNECT_NONBLOCK,
+	XQRY_DISCONNECT,
+	XQRY_RECONNECT,
+	XQRY_ACQUIRE_MEDIA_AUTHIRITY,
+	XQRY_RELEASE_MEDIA_AUTHORITY,
+	XQRY_OPEN_MEDIA,
+	XQRY_CLOSE_MEDIA,
+	XQRY_PLAY_MEDIA,
+	XQRY_PAUSE_MEDIA,
+	XQRY_SEEK_MEDIA,
+	XQRY_FRAMEAD_MEDIA,
+	XQRY_SEARCH_CALENDAR,
+	XQRY_SEARCH_DAY,
+	XQRY_TALK,
+	XQRY_LISTEN,
+	XQRY_SEND_AUDIO,
+	XQRY_ALARM,
+	XQRY_CONTROL_PTZ,	
+	XQRY_CONTROL_PTZ_FREE_MOVE,
+	XQRY_CONTROL_PTZ_SPEED_ZOOMIN,
+	XQRY_CONTROL_PTZ_SPEED_ZOOMOUT,
+	XQRY_CONTROL_PPTZ,
+	XQRY_CONTROL_MENU,
+	XQRY_EXECUTE_HPTZ,
+	XQRY_GET_PRESET_LIST,
+	XQRY_SET_PRESET,
+	XQRY_DELETE_PRESET,
+	XQRY_DELETE_PRESET_ALL,
+	XQRY_UPLOAD_SW,
+	XQRY_IMPORT_CFG,
+	XQRY_EXPORT_CFG,
+	XQRY_LOCALREC_START,
+	XQRY_LOCALREC_STOP,
+	XQRY_BACKUP_START,
+	XQRY_BACKUP_STOP,
+	XQRY_OPEN_STREAM,
+	XQRY_CLOSE_STREAM,
+	XQRY_REOPEN_ALL_STREAM,
+	XQRY_SUSPEND_ALL_STREAM,
+	XQRY_RESUME_ALL_STREAM,
+	XQRY_SUSPEND_STREAM,
+	XQRY_RESUME_STREAM,
+	XQRY_DVR_EVENT_RESET,
+	XQRY_DVR_RECORDING,
+	XQRY_GET_MOTION_GRID,
+	XQRY_MOTION_SEARCH,
+	XQRY_SEND_SERIAL_DATA,
+
+	// --> hh3.kim : ADD AREA ZOOM FUNCTIONS
+	XQRY_AREA_ZOOM,
+	XQRY_ZOOM_1X,
+	// <-- hh3.kim : ADD AREA ZOOM FUNCTIONS
+
+	// --> hh3.kim : ADD PTZ GET/SET FUNCTIONS
+	XQRY_GET_PTZ_POS,
+	XQRY_SET_PTZ_POS,
+	// --> hh3.kim : ADD PTZ GET/SET FUNCTIONS
+	XQRY_SEARCH_OVERLAP,	//+ jeongguc.kang <2011.10.19> 중복구간 추가
+	XQRY_SEARCH_POS,		//+ jeongguc.kang <2011.10.20> Search POS 추가
+	XQRY_CANCEL_POS,		//+ jeongguc.kang <2011.10.20> Cancel Pos 추가
+
+	// hh3.kim : PTZ_POS+SPEED, POWER RESTART
+	XQRY_GET_PTZ_POS_SPEED,
+	XQRY_SET_PTZ_POS_SPEED,
+	XQRY_POWER_RESTART,
+
+	// hh3.kim : get hptz list
+	XQRY_GET_HPTZ_LIST,
+	
+	//+ jeongguc.kang <2012.04.18> banamex 프로젝트 관련 bandwidth 커맨드 추가
+	XQRY_GET_BANDWIDTH,
+	XQRY_SET_BANDWIDTH,
+	//+
+
+	XQRY_GET_START_RECORDING_TIME,	//+ jungkoo.kang <2012.11.30> banamex 프로젝트 관련 GetRecordingTime API 추가
+	XQRY_GET_END_RECORDING_TIME,	//+ jungkoo.kang <2012.11.30> banamex 프로젝트 관련 GetRecordingTime API 추가
+};
+
+enum	// Response or Event
+{	
+	XEVT_DEVICE_DETECTED = 1,
+	XEVT_CONNECT_FAILED,
+	XEVT_SEARCH_CALENDAR,
+	XEVT_SEARCH_DAY,
+	XEVT_PRESET_LIST,
+	XEVT_UPLOAD_SW_PROGRESS,
+	XEVT_IMPORT_CFG_PROGRESS,
+	XEVT_EXPORT_CFG_PROGRESS,
+	XEVT_MOTION,
+	XEVT_SENSOR,
+	XEVT_VIDEOLOSS,
+	XEVT_HDD_FAIL,
+	XEVT_HDD_FULL,
+	// hh3.kim : XEVT_PASSWORD_CNAHGED --> XEVT_PASSWORD_CHANGED
+	XEVT_PASSWORD_CHANGED,
+	XEVT_FAN_BROKEN,
+	// hh3.kim : XEVT_DEVICE_STATUS_CAHGED --> XEVT_DEVICE_STATUS_CHANGED
+	XEVT_DEVICE_STATUS_CHANGED,
+	XEVT_CONTROL_LOCAL_NAME_CHANGED,
+	XEVT_CONTROL_REMOTE_NAME_CHANGED,
+	// hh3.kim : XEVT_CONTROL_STATUS_CAHGED --> XEVT_CONTROL_STATUS_CHANGED
+	XEVT_CONTROL_STATUS_CHANGED,
+	// hh3.kim : XEVT_CONTROL_CAPABILITY_CAHGED --> XEVT_CONTROL_CAPABILITY_CHANGED
+	XEVT_CONTROL_CAPABILITY_CHANGED,	
+	XEVT_BACKUP_PROGRESS,
+	XEVT_PTZ_CONTROL_FAILED,
+	XEVT_ALARM_OUT_CONTROL_FAILED,
+	XEVT_NEW_MEDIA,
+	XEVT_GET_MOTION_GRID,
+	XEVT_MOTION_SEARCH,
+	XEVT_TALK_FAILED,
+	XEVT_CALLBACK_EVENT,
+	XEVT_SEND_SERIAL_DATA,
+
+	// --> hh3.kim : ADD IV EVENT
+	XEVT_IV_OCCUR,
+	XEVT_GET_PTZ_POS,
+
+	XEVT_AREA_ZOOM_MOVING,		//+ jeongguc.kang <2011.09.29>
+	XEVT_SEARCH_OVERLAP,		//+ jeongguc.kang <2011.10.19> 중복 구간 추가
+	XEVT_SEARCH_POS_LIST,		//+ jeongguc.kang <2011.10.20> Search Pos 추가
+	XEVT_END_SEARCH_POS,
+
+	// hh3.kim : GET_PTZ_POS + SPEED
+	XEVT_GET_PTZ_POS_SPEED,
+	XEVT_POWER_RESTART,
+	
+	// hh3.kim : HPTZ LIST
+	XEVT_HPTZ_LIST,
+	XEVT_DEVICE_INSTALLED,	// hh3.kim <2011-03-28> 디바이스 인스톨 이벤트
+	
+	XEVT_GET_BANDWIDTH,			//+ jeongguc.kang <2012.04.18> banamex 프로젝트 관련 Get Bandwidth 이벤트 추가
+	XEVT_RECORDING_ERROR,		//+ jeongguc.kang <2012.04.18> banamex 프로젝트 관련 Recording Error 이벤트 추가
+	XEVT_FAN_STATUS_CHANGED,	//+ jeongguc.kang <2012.07.07> banamex 프로젝트 관련 Fan Status Changed 이벤트 추가
+
+	XEVT_VIDEO_FRAME_INFO_RECEIVED, //+ hh3.kim <2012-10-24> 프레임 정보 이벤트 추가 (iPOLiS Device Manager 대응)
+	XEVT_HDD_NUM_CHANGED,		//+ jungkoo.kang <2012.11.27> OnHDDNumChanged 이벤트 추가
+	XEVT_GET_START_RECORDING_TIME,	//+ jungkoo.kang <2012.11.30> banamex 프로젝트 관련 GetRecordingTime API 추가
+	XEVT_GET_END_RECORDING_TIME,	//+ jungkoo.kang <2012.11.30> banamex 프로젝트 관련 GetRecordingTime API 추가
+	XEVT_RECORDING_STATUS_CHANGED,	//+ jungkoo.kang <2013.02.26> 저장장치의 레코딩 시작/종료 이벤트 추가
+	XEVT_NTP_SERVER_CONN_FAILED,	//+ jungkoo.kang <2013.04.11> banamex 프로젝트 관련 시간 동기화 필요 이벤트 추가
+	XEVT_CPU_HIGH_CONSUMPTION,		//+ jungkoo.kang <2013.04.11> banamex 프로젝트 관련 CPU 성능 이벤트 추가
+	XEVT_RAM_HIGH_CONSUMPTION,		//+ jungkoo.kang <2013.04.11> banamex 프로젝트 관련 RAM 성능 이벤트 추가
+	XEVT_VIDEOLOSS_END,				//+ jungkoo.kang <2013.04.11> banamex 프로젝트 관련 VideoLoss End 이벤트 추가
+};
+
+enum
+{
+	XPTZ_UP = 1,
+	XPTZ_DOWN,
+	XPTZ_LEFT,
+	XPTZ_RIGHT,
+	XPTZ_UPLEFT,
+	XPTZ_UPRIGHT,
+	XPTZ_DOWNLEFT,
+	XPTZ_DOWNRIGHT,
+	XPTZ_ZOOMIN,
+	XPTZ_ZOOMOUT,
+	XPTZ_STOP,	
+	XPTZ_FOCUS_NEAR,
+	XPTZ_FOCUS_FAR,
+	XPTZ_FOCUS_STOP,
+	XPTZ_IRIS_OPEN,	
+	XPTZ_IRIS_CLOSE,
+};
+
+enum
+{
+	XMENU_UP = 1,
+	XMENU_DOWN,
+	XMENU_LEFT,
+	XMENU_RIGHT,
+	XMENU_ENTER,
+	XMENU_ON,
+	XMENU_OFF,
+	XMENU_CANCEL,
+};
+
+enum 
+{
+	XHPTZ_PRESET = 1,
+	XHPTZ_AUTOPAN,
+	XHPTZ_SCAN,
+	XHPTZ_PATTERN,
+	XHPTZ_SWING,		// New HPTZ Command
+	XHPTZ_TOUR,		// New HPTZ Command
+};
+
+enum
+{
+	XMEDIA_LIVE = 1,
+	XMEDIA_PLAYBACK,
+	XMEDIA_BACKUP,
+};
+
+enum
+{
+	XREC_MOTION = 0x01,
+	XREC_SENSOR = 0x02,
+	XREC_VIDEOLOSS = 0x04,
+	XREC_MANUAL = 0x08,
+	XREC_CONTINUOS = 0x10,
+	XREC_TYPE_ALL = 0xff // hh3.kim <2012-04-24> 추가
+};
+
+enum
+{
+	XEVENT_ALL = 0x000000ff,
+	XEVENT_SENSOR = 0x00000001,
+	XEVENT_MOTION = 0x00000002,
+	XEVENT_VIDEOLOSS = 0x00000004,
+	// --> hh3.kim : ADD IV EVENT
+	XEVENT_IV_OCCUR = 0x00000008,
+};
+
+class IXnsDeviceEventHandler
+{
+public:
+	virtual void			OnXnsDeviceEvent( long nEventID , ... ) = 0;
+};
+
+class IXnsTimeline
+{
+public:
+	virtual long			GetCameraCount() = 0;
+	virtual long			GetTimelineCount( long nCamIndex ) = 0;
+	virtual void			GetTimeline( long nCamIndex , long nTlIndex , long nType , long* ptStart , long* ptEnd , long* pnRecType , long* pnRecID ) = 0;
+	virtual long			GetTimelineIndex() = 0;
+};
+
+class IXnsPresetList
+{
+public:
+	virtual long			GetPresetCount() = 0;
+	virtual const char*		GetPreset( long nPresetIndex , long* pnNumber ) = 0;
+};
+
+class IXnsFileReader
+{
+public:
+	virtual const char*		GetFileName() = 0;
+	virtual IXnsMediaSource*GetMediaSource() = 0;
+	virtual IXnsTimeline*	GetTimeline() = 0;
+	virtual long			Play( double dSpeed ) = 0;
+	virtual long			Pause() = 0;
+
+	virtual long			Seek( long tPos ) = 0;
+	virtual long			FrameAdvance( long nDelta ) = 0;
+};
+
+class IXnsDevice
+{
+public:	
+	virtual long			GetDeviceID() = 0;
+	virtual long			GetDeviceStatus() = 0;	
+	
+	virtual const char*		GetVendorName() = 0;
+	virtual const char*		GetModelName() = 0;
+	virtual const char*		GetDisplayName() = 0;
+	virtual long			GetSetupPageStyle() = 0;
+	virtual const char*		GetVersion() = 0;
+	virtual long			GetAddressType() = 0;
+	virtual const char*		GetIP() = 0;
+	virtual const char*		GetMac() = 0;
+	virtual const char*		GetURL() = 0;
+	virtual const char*		GetDDNSID() = 0;
+	virtual long			GetPort() = 0;
+	virtual long			GetHttpPort() = 0;
+	virtual const char*		GetUserID() = 0;
+	virtual const char*		GetPassword() = 0;
+	
+	virtual void			SetConnectionInfo( const char* szVendorName , const char* szModelName , long nAddressType , const char* szAddress , long nPort , long nHttpPort , const char* szUserID , const char* szPassword ) = 0;	
+	
+	virtual long			GetLatestUpdateTime() = 0;
+	virtual long			GetDeviceUTC() = 0;
+	virtual long			GetDeviceLocalTime() = 0;
+	virtual BOOL			IsEmptyTimeInDST( long tLocal ) = 0;
+	virtual BOOL			IsDuplicatedTimeInDST( long tLocal ) = 0;
+	virtual long			LocalTimeToDeviceUTC( long tLocal ) = 0;
+	virtual long			UTCToDeviceLocalTime( long tUTC ) = 0;
+	virtual long			GetDeviceDSTStartUTC( long nYear ) = 0;
+	virtual long			GetDeviceDSTEndUTC( long nYear ) = 0;
+
+	virtual long			GetControlCount( long nType ) = 0;	
+	virtual long			GetParentControlID( long nControlID ) = 0;
+	virtual long			GetControlType( long nControlID ) = 0;
+	virtual long			GetControlNumber( long nControlID ) = 0;
+	virtual long			GetControlDepth( long nControlID ) = 0;
+	virtual const char*		GetControlLocalName( long nControlID ) = 0;
+	virtual const char*		GetControlRemoteName( long nControlID ) = 0;
+	virtual long			GetControlStatus( long nControlID , long nStatusID ) = 0;
+	virtual BOOL			GetControlCapability( long nControlID , long nCapabilityID ) = 0;
+	
+	//+ jungkoo.kang <2013.03.21> Video Resolution,FrameRate,Quality,Codec 가져오는 API 추가
+	virtual long			GetControlVideoResolution( long nControlID ) = 0;
+	virtual long			GetControlVideoFrameRate( long nControlID ) = 0;
+	virtual long			GetControlVideoQuality( long nControlID ) = 0;
+	virtual const char*		GetControlVideoCodec( long nControlID ) = 0;
+	//+
+
+	virtual void			ChangeControlLocalName( long nControlID , const char* szName ) = 0;
+	virtual void			ChangeControlRemoteName( long nControlID , const char* szName ) = 0;
+	
+	virtual long			LoadDeviceProfile() = 0;
+	virtual long			SaveDeviceProfile() = 0;
+	virtual long			DeleteDeviceProfile() = 0;
+	
+	virtual BOOL			IsPlaying() = 0;
+	virtual BOOL			HasAuthority() = 0;
+
+	virtual long			SendXnsQuery( long nQueryID , ... ) = 0;
+
+	virtual long			SetVideoInfoReceived(long nControlID, long nMediaType, long bFlag) = 0;
+};
+

部分文件因为文件数量过多而无法显示