浏览代码

first commit

shjung 1 年之前
当前提交
51a4041b8c
共有 100 个文件被更改,包括 28360 次插入0 次删除
  1. 73 0
      .gitignore
  2. 277 0
      COMMON/AcesPlayer/FrmCamViewF.cpp
  3. 118 0
      COMMON/AcesPlayer/FrmCamViewF.dfm
  4. 75 0
      COMMON/AcesPlayer/FrmCamViewF.h
  5. 123 0
      COMMON/CDS/CDSAtmpF.cpp
  6. 80 0
      COMMON/CDS/CDSAtmpF.h
  7. 672 0
      COMMON/CDS/CDSAtrdF.cpp
  8. 138 0
      COMMON/CDS/CDSAtrdF.h
  9. 990 0
      COMMON/CDS/CDSCCamCtlrF.cpp
  10. 135 0
      COMMON/CDS/CDSCCamCtlrF.h
  11. 1081 0
      COMMON/CDS/CDSCctvCtlrF.cpp
  12. 136 0
      COMMON/CDS/CDSCctvCtlrF.h
  13. 236 0
      COMMON/CDS/CDSCodeF.cpp
  14. 103 0
      COMMON/CDS/CDSCodeF.h
  15. 123 0
      COMMON/CDS/CDSColSysF.cpp
  16. 66 0
      COMMON/CDS/CDSColSysF.h
  17. 127 0
      COMMON/CDS/CDSColtSysF.cpp
  18. 62 0
      COMMON/CDS/CDSColtSysF.h
  19. 143 0
      COMMON/CDS/CDSCompanyF.cpp
  20. 76 0
      COMMON/CDS/CDSCompanyF.h
  21. 21 0
      COMMON/CDS/CDSCoordF.cpp
  22. 44 0
      COMMON/CDS/CDSCoordF.h
  23. 118 0
      COMMON/CDS/CDSDatabaseF.cpp
  24. 56 0
      COMMON/CDS/CDSDatabaseF.h
  25. 167 0
      COMMON/CDS/CDSEventF.cpp
  26. 79 0
      COMMON/CDS/CDSEventF.h
  27. 314 0
      COMMON/CDS/CDSFacilityCodeF.cpp
  28. 107 0
      COMMON/CDS/CDSFacilityCodeF.h
  29. 2188 0
      COMMON/CDS/CDSFacilityF.cpp
  30. 414 0
      COMMON/CDS/CDSFacilityF.h
  31. 2274 0
      COMMON/CDS/CDSFacilityF_back.cpp
  32. 581 0
      COMMON/CDS/CDSFacilityF_back.h
  33. 402 0
      COMMON/CDS/CDSFacilityFailF.cpp
  34. 128 0
      COMMON/CDS/CDSFacilityFailF.h
  35. 203 0
      COMMON/CDS/CDSFontF.cpp
  36. 67 0
      COMMON/CDS/CDSFontF.h
  37. 113 0
      COMMON/CDS/CDSHolidayF.cpp
  38. 62 0
      COMMON/CDS/CDSHolidayF.h
  39. 407 0
      COMMON/CDS/CDSIfscF.cpp
  40. 98 0
      COMMON/CDS/CDSIfscF.h
  41. 287 0
      COMMON/CDS/CDSIfsc_VMSF.cpp
  42. 74 0
      COMMON/CDS/CDSIfsc_VMSF.h
  43. 839 0
      COMMON/CDS/CDSIncidentF.cpp
  44. 175 0
      COMMON/CDS/CDSIncidentF.h
  45. 233 0
      COMMON/CDS/CDSLayerF.cpp
  46. 123 0
      COMMON/CDS/CDSLayerF.h
  47. 465 0
      COMMON/CDS/CDSLinkF.cpp
  48. 131 0
      COMMON/CDS/CDSLinkF.h
  49. 380 0
      COMMON/CDS/CDSLink_VMSF.cpp
  50. 108 0
      COMMON/CDS/CDSLink_VMSF.h
  51. 105 0
      COMMON/CDS/CDSNodeF.cpp
  52. 66 0
      COMMON/CDS/CDSNodeF.h
  53. 76 0
      COMMON/CDS/CDSObjectF.cpp
  54. 138 0
      COMMON/CDS/CDSObjectF.h
  55. 173 0
      COMMON/CDS/CDSOrganF.cpp
  56. 66 0
      COMMON/CDS/CDSOrganF.h
  57. 104 0
      COMMON/CDS/CDSParkF.cpp
  58. 57 0
      COMMON/CDS/CDSParkF.h
  59. 431 0
      COMMON/CDS/CDSPrcsParamF.cpp
  60. 95 0
      COMMON/CDS/CDSPrcsParamF.h
  61. 721 0
      COMMON/CDS/CDSPrltCtlrF.cpp
  62. 135 0
      COMMON/CDS/CDSPrltCtlrF.h
  63. 225 0
      COMMON/CDS/CDSProcessF.cpp
  64. 85 0
      COMMON/CDS/CDSProcessF.h
  65. 281 0
      COMMON/CDS/CDSRepeatCongestF.cpp
  66. 101 0
      COMMON/CDS/CDSRepeatCongestF.h
  67. 427 0
      COMMON/CDS/CDSRoadF.cpp
  68. 93 0
      COMMON/CDS/CDSRoadF.h
  69. 496 0
      COMMON/CDS/CDSServiceLinkF.cpp
  70. 182 0
      COMMON/CDS/CDSServiceLinkF.h
  71. 62 0
      COMMON/CDS/CDSStaIncidentF.cpp
  72. 62 0
      COMMON/CDS/CDSStaIncidentF.h
  73. 207 0
      COMMON/CDS/CDSTrafficGradeF.cpp
  74. 87 0
      COMMON/CDS/CDSTrafficGradeF.h
  75. 230 0
      COMMON/CDS/CDSTrafficOprLinkF.cpp
  76. 71 0
      COMMON/CDS/CDSTrafficOprLinkF.h
  77. 173 0
      COMMON/CDS/CDSUserF.cpp
  78. 77 0
      COMMON/CDS/CDSUserF.h
  79. 374 0
      COMMON/CDS/CDSUtisF.cpp
  80. 82 0
      COMMON/CDS/CDSUtisF.h
  81. 1424 0
      COMMON/CDS/CDSVdsCtlrF.cpp
  82. 209 0
      COMMON/CDS/CDSVdsCtlrF.h
  83. 620 0
      COMMON/CDS/CDSVilgFrcsF.cpp
  84. 227 0
      COMMON/CDS/CDSVilgFrcsF.h
  85. 115 0
      COMMON/CDS/CDSVmsColorF.cpp
  86. 58 0
      COMMON/CDS/CDSVmsColorF.h
  87. 1597 0
      COMMON/CDS/CDSVmsCtlrF.cpp
  88. 255 0
      COMMON/CDS/CDSVmsCtlrF.h
  89. 136 0
      COMMON/CDS/CDSVmsDsplSchF.cpp
  90. 67 0
      COMMON/CDS/CDSVmsDsplSchF.h
  91. 123 0
      COMMON/CDS/CDSVmsFormF.cpp
  92. 56 0
      COMMON/CDS/CDSVmsFormF.h
  93. 743 0
      COMMON/CDS/CDSVmsIfscF.cpp
  94. 114 0
      COMMON/CDS/CDSVmsIfscF.h
  95. 246 0
      COMMON/CDS/CDSVmsObjTypeF.cpp
  96. 132 0
      COMMON/CDS/CDSVmsObjTypeF.h
  97. 121 0
      COMMON/CDS/CDSVmsTrafficF.cpp
  98. 64 0
      COMMON/CDS/CDSVmsTrafficF.h
  99. 951 0
      COMMON/CDS/CDSWCamCtlrF.cpp
  100. 128 0
      COMMON/CDS/CDSWCamCtlrF.h

+ 73 - 0
.gitignore

@@ -0,0 +1,73 @@
+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*.$$$
+
+### LOG ###
+/logs/
+/images/
+/fonts/
+/REAL-RUN/
+/ftp/
+
+### 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
+

+ 123 - 0
COMMON/CDS/CDSAtmpF.cpp

@@ -0,0 +1,123 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSAtmpF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+void TCDSAtmp::Init()
+{
+    SUCCESS         = false;
+    MSRM_DT         = "";
+    MSRM_SYST_NM    = "";
+    SO2_VAL         = "";
+    CO_VAL          = "";
+    NO2_VAL         = "";
+    O3_VAL          = "";
+    PM10_VAL        = "";
+    PM10_24HH_VAL   = "";
+    PM25_VAL        = "";
+    PM25_24HH_VAL   = "";
+    INTG_ATMP_VAL   = "";
+    INTG_ATMP_GRAD  = "";
+    SO2_GRAD        = "";
+    CO_GRAD         = "";
+    O3_GRAD         = "";
+    NO2_GRAD        = "";
+    PM10_24HH_GRAD  = "";
+    PM25_24HH_GRAD  = "";
+    PM10_1HH_GRAD   = "";
+    PM25_1HH_GRAD   = "";
+}
+//---------------------------------------------------------------------------
+TCDSAtmpManager *CDSAtmpManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+TCDSAtmpManager::TCDSAtmpManager()
+{
+}
+//---------------------------------------------------------------------------
+TCDSAtmpManager::~TCDSAtmpManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TCDSAtmpManager::Init()
+{
+    FOR_STL(TCDSAtmp*, pObj, FLists)
+    {
+        pObj->Init();
+    }
+}
+//---------------------------------------------------------------------------
+bool TCDSAtmpManager::LoadFromDb(TADOConnection *ADbConn)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                    \r\n"
+           "  FROM TB_ATMP_PLTN_STTN    \r\n";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String ATMP_STTN_NMBR = pADO->FieldByName("ATMP_STTN_NMBR")->AsString.Trim();
+				TCDSAtmp *pObj = FLists.Find(ATMP_STTN_NMBR);
+                if (!pObj)
+                {
+                    pObj = new TCDSAtmp();
+
+                    pObj->ATMP_STTN_NMBR = ATMP_STTN_NMBR;
+                    FLists.Push(pObj->ATMP_STTN_NMBR, pObj);
+                }
+
+                pObj->ATMP_STTN_NM   = pADO->FieldByName("ATMP_STTN_NM")->AsString.Trim();
+                pObj->VMS_DISP_NM    = pADO->FieldByName("VMS_DISP_NM")->AsString.Trim();
+                pObj->ATMP_STTN_ADDR = pADO->FieldByName("ATMP_STTN_ADDR")->AsString.Trim();
+                pObj->DEL_YN         = pADO->FieldByName("DEL_YN")->AsString.Trim();
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TCDSAtmpManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TCDSAtmpManager::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;
+}
+//---------------------------------------------------------------------------
+

+ 80 - 0
COMMON/CDS/CDSAtmpF.h

@@ -0,0 +1,80 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSAtmpFH
+#define CDSAtmpFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+//---------------------------------------------------------------------------
+#include "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  class
+*/
+class TCDSAtmp
+{
+public:
+    TCDSAtmp()  {};
+    ~TCDSAtmp() {};
+
+public:
+    String ATMP_STTN_NMBR;
+    String ATMP_STTN_NM;
+    String VMS_DISP_NM;
+    String ATMP_STTN_ADDR;
+    String DEL_YN;
+
+    bool   SUCCESS;
+
+    String MSRM_DT;         //	N	VARCHAR2(14)	Y			측정 일시
+    String MSRM_SYST_NM;    //	N	VARCHAR2(10)	Y			측정 시스템 명
+    String SO2_VAL;         //	N	VARCHAR2(10)	Y			SO2 값
+    String CO_VAL;          //	N	VARCHAR2(10)	Y			CO 값
+    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시간 등급
+
+public:
+    void Init();
+
+};
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+class TCDSAtmpManager
+{
+public:
+    TCDSAtmpManager();
+    virtual ~TCDSAtmpManager();
+
+public:
+    TItsMap<String, TCDSAtmp*>  FLists;
+
+public:
+    void Init();
+
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TCDSAtmpManager *CDSAtmpManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 672 - 0
COMMON/CDS/CDSAtrdF.cpp

@@ -0,0 +1,672 @@
+//---------------------------------------------------------------------------
+
+#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()
+{
+	Completed = 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();
+    FCDSNameLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TItsAtrdManager::LoadFromDbAtrdName(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT DISTINCT TRIM(ATRD_NM) AS ATRD_NM  \r\n"
+           "  FROM TB_ATRD                            \r\n";
+    try
+    {
+        FCDSNameSelCnt = 0;
+        FCDSNameLists.Lock();
+        FCDSNameLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TCDSAtrdName *pObj = new TCDSAtrdName();
+
+                pObj->ATRD_NM = pADO->FieldByName("ATRD_NM")->AsString;
+                pObj->IsSelected = true;
+                FCDSNameSelCnt++;
+				FCDSNameLists.Push(pObj->ATRD_NM, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::LoadFromDbAtrdName", 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::LoadFromDbAtrdName", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FCDSNameLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+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->Prepared = true;
+			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_RLTN_ROAD  \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->Prepared = true;
+			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->FRoads.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_RLTN_ROAD 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->Prepared = true;
+			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_RLTN_ROAD  \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_RLTN_ROAD (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->FRoads)
+            {
+                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_NM) \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_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::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;
+}
+//---------------------------------------------------------------------------
+
+

+ 138 - 0
COMMON/CDS/CDSAtrdF.h

@@ -0,0 +1,138 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSAtrdFH
+#define CDSAtrdFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "CDSLayerF.h"
+//---------------------------------------------------------------------------
+
+
+/*
+*  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    FModified;
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+    String  ATRD_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;
+
+    TItsMap<int, TItsAtrdRoad*> FRoads;
+
+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 };
+};
+//---------------------------------------------------------------------------
+
+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;
+};
+
+class TCDSAtrdName
+{
+public:
+    TCDSAtrdName() {};
+    virtual ~TCDSAtrdName() {};
+public:
+    String  ATRD_NM;
+    bool    IsSelected;
+};
+
+/*
+* Atrd Manager
+*/
+class TItsAtrdManager
+{
+public:
+    TItsAtrdManager();
+    virtual ~TItsAtrdManager();
+
+public:
+    TItsMap<String, TItsAtrd*>       FLists;
+    TItsMap<String, TItsAtrdName*>   FNameLists;
+    TItsMap<String, TCDSAtrdName*>   FCDSNameLists;
+    int                              FCDSNameSelCnt;
+
+public:
+    bool LoadFromDbAtrdName(TADOConnection *ADbConn=NULL);
+    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
+

+ 990 - 0
COMMON/CDS/CDSCCamCtlrF.cpp

@@ -0,0 +1,990 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSCCamCtlrF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+
+//---------------------------------------------------------------------------
+TCCamCtlr::TCCamCtlr()
+{
+}
+//---------------------------------------------------------------------------
+
+TCCamCtlr::~TCCamCtlr()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TCCamCtlrManager *CCamCtlrManager = NULL;
+//---------------------------------------------------------------------------
+
+TCCamCtlrManager::TCCamCtlrManager()
+{
+    FImgStream = NULL;
+}
+//---------------------------------------------------------------------------
+TCCamCtlrManager::~TCCamCtlrManager()
+{
+    FLists.RemoveAll();
+    if (FImgStream) delete FImgStream;
+    FImgStream = NULL;
+}
+//---------------------------------------------------------------------------
+bool TCCamCtlrManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.*              \r\n"
+           "  FROM TB_CCAM_CTLR A   \r\n";
+           " WHERE A.DEL_YN = 'N'   \r\n";
+
+    FLists.Lock();
+    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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TCCamCtlr *pObj = new TCCamCtlr();
+
+                pObj->CCAM_CTLR_NMBR        = pADO->FieldByName("CCAM_CTLR_NMBR")->AsString;
+                pObj->CCAM_CTLR_ID          = pADO->FieldByName("CCAM_CTLR_ID")->AsString.Trim();
+                pObj->CCAM_NM               = pADO->FieldByName("CCAM_NM")->AsString.Trim();
+                pObj->CCAM_CTLR_IP          = pADO->FieldByName("CCAM_CTLR_IP")->AsString.Trim();
+                pObj->CCAM_CTLR_PORT        = pADO->FieldByName("CCAM_CTLR_PORT")->AsInteger;
+                pObj->CCAM_CTLR_LOCAL_NO    = pADO->FieldByName("CCAM_CTLR_LOCAL_NO")->AsInteger;
+                pObj->CCAM_TYPE_CD          = pADO->FieldByName("CCAM_TYPE_CD")->AsString.Trim();
+                pObj->ISTL_LCTN_NM          = pADO->FieldByName("ISTL_LCTN_NM")->AsString.Trim();
+                pObj->X_CRDN                = pADO->FieldByName("X_CRDN")->AsFloat;
+                pObj->Y_CRDN                = pADO->FieldByName("Y_CRDN")->AsFloat;
+                pObj->DEL_YN                = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->STRM_SVR_IP           = pADO->FieldByName("STRM_SVR_IP")->AsString.Trim();
+                pObj->STRM_SVR_PORT         = pADO->FieldByName("STRM_SVR_PORT")->AsString.Trim();
+                pObj->STRM_SESN_NM          = pADO->FieldByName("STRM_SESN_NM")->AsString.Trim();
+                pObj->STRM_RTSP_ADDR        = pADO->FieldByName("STRM_RTSP_ADDR")->AsString.Trim();
+                pObj->STRM_RTMP_ADDR        = pADO->FieldByName("STRM_RTMP_ADDR")->AsString.Trim();
+                pObj->STRM_HTTP_ADDR        = pADO->FieldByName("STRM_HTTP_ADDR")->AsString.Trim();
+                pObj->STRM_STOR_ADDR        = pADO->FieldByName("STRM_STOR_ADDR")->AsString.Trim();
+                pObj->CMRA_PORT             = pADO->FieldByName("CMRA_PORT")->AsInteger;
+                pObj->CMRA_ID               = pADO->FieldByName("CMRA_ID")->AsString.Trim();
+                pObj->CMRA_PSWD             = pADO->FieldByName("CMRA_PSWD")->AsString.Trim();
+                pObj->CMRA_CHNL             = pADO->FieldByName("CMRA_CHNL")->AsInteger;
+                pObj->LINK_ID               = pADO->FieldByName("LINK_ID")->AsString.Trim();
+
+                pObj->GROUP_NO          = pADO->FieldByName("GROUP_NO")->AsInteger;
+                pObj->FAN_MODE          = pADO->FieldByName("FAN_MODE")->AsInteger;
+                pObj->FAN_RUN_TMPR      = pADO->FieldByName("FAN_RUN_TMPR")->AsInteger;
+                pObj->HETR_RUN_TMPR     = pADO->FieldByName("HETR_RUN_TMPR")->AsInteger;
+                pObj->DETECT_LANES      = pADO->FieldByName("DETECT_LANES")->AsInteger;
+                pObj->TRAF_CLCT_CYCL    = pADO->FieldByName("TRAF_CLCT_CYCL")->AsInteger;
+                pObj->STTS_CLCT_CYCL    = pADO->FieldByName("STTS_CLCT_CYCL")->AsInteger;
+                pObj->ISTL_LCTN_ADDR    = pADO->FieldByName("ISTL_LCTN_ADDR")->AsString.Trim();
+
+				FLists.Push(pObj->CCAM_CTLR_NMBR, pObj);
+                pObj->Completed  = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TCCamCtlrManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TCCamCtlrManager::LoadFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return LoadPreSet(ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TCCamCtlrManager::LoadStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                                                        \r\n"
+           "  FROM TB_CCAM_CTLR_STTS A,                                     \r\n"
+           "       TB_CCAM_CTLR      B                                      \r\n"
+           " WHERE A.CCAM_CTLR_NMBR = B.CCAM_CTLR_NMBR                      \r\n"
+           "   AND A.UPDT_DT >= TO_CHAR(SYSDATE-2/1440, 'YYYYMMDDHH24MISS') \r\n";
+
+    FLists.Lock();
+    try
+    {
+        TCCamCtlr *pObj = 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->Prepared = true;
+            pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String CCAM_CTLR_NMBR = pADO->FieldByName("CCAM_CTLR_NMBR")->AsString;
+                pObj = FLists.Find(CCAM_CTLR_NMBR);
+                if (!pObj) continue;
+
+                String UPDT_DT      = pADO->FieldByName("UPDT_DT")->AsString;
+                String CMNC_STTS_CD = pADO->FieldByName("CMNC_STTS_CD")->AsString;
+                if (CMNC_STTS_CD != "CMS0")
+                {
+                    //Åë½ÅÀå¾Ö
+                    continue;
+                }
+                //pObj->STATE.Comm = (CMNC_STTS_CD == "CMS0") ? cctv_normal : cctv_error;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCCamCtlrManager::LoadStatusFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCCamCtlrManager::LoadStatusFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCCamCtlrManager::DeleteCCam(TCCamCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_CCAM_CTLR          \r\n"
+           "   SET DEL_YN = 'Y'          \r\n"
+           " WHERE CCAM_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->CCAM_CTLR_NMBR;
+			pADO->ExecSQL();
+
+        sQry = "DELETE TB_FCLT_INFR      \r\n"
+               " WHERE FCLT_ID = :p01    \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CCAM_CTLR_ID;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCCamCtlrManager::DeleteCCam", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCCamCtlrManager::DeleteCCam", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCCamCtlrManager::InsertCCam(TCCamCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    return MergeCCam(AObj, ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TCCamCtlrManager::UpdateCCam(TCCamCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    return MergeCCam(AObj, ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TCCamCtlrManager::MergeCCam(TCCamCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "MERGE INTO TB_CCAM_CTLR L                                   \r\n"
+           "USING (SELECT                                               \r\n"
+           "              :p01 AS CCAM_CTLR_NMBR,                       \r\n"
+           "              :p02 AS CCAM_CTLR_ID,                         \r\n"
+           "              :p03 AS CCAM_NM,                              \r\n"
+           "              :p04 AS CCAM_CTLR_IP,                         \r\n"
+           "              :p05 AS CCAM_CTLR_PORT,                       \r\n"
+           "              :p06 AS CCAM_CTLR_LOCAL_NO,                   \r\n"
+           "              :p07 AS CCAM_TYPE_CD,                         \r\n"
+           "              :p08 AS ISTL_LCTN_NM,                         \r\n"
+           "              :p09 AS X_CRDN,                               \r\n"
+           "              :p10 AS Y_CRDN,                               \r\n"
+           "              :p11 AS DEL_YN,                               \r\n"
+           "              :p12 AS STRM_SVR_IP,                          \r\n"
+           "              :p13 AS STRM_SVR_PORT,                        \r\n"
+           "              :p14 AS STRM_SESN_NM,                         \r\n"
+           "              :p15 AS STRM_RTSP_ADDR,                       \r\n"
+           "              :p16 AS STRM_RTMP_ADDR,                       \r\n"
+           "              :p17 AS STRM_HTTP_ADDR,                       \r\n"
+           "              :p18 AS STRM_STOR_ADDR,                       \r\n"
+           "              :p19 AS CMRA_PORT,                            \r\n"
+           "              :p20 AS CMRA_ID,                              \r\n"
+           "              :p21 AS CMRA_PSWD,                            \r\n"
+           "              :p22 AS CMRA_CHNL,                            \r\n"
+           "              :p23 AS LINK_ID,                              \r\n"
+           "              :p24 AS GROUP_NO,                             \r\n"
+           "              :p25 AS FAN_MODE,                             \r\n"
+           "              :p26 AS FAN_RUN_TMPR,                         \r\n"
+           "              :p27 AS HETR_MODE,                            \r\n"
+           "              :p28 AS HETR_RUN_TMPR,                        \r\n"
+           "              :p29 AS DETECT_LANES,                         \r\n"
+           "              :p30 AS TRAF_CLCT_CYCL,                       \r\n"
+           "              :p31 AS STTS_CLCT_CYCL,                       \r\n"
+           "              :p32 AS ISTL_LCTN_ADDR                        \r\n"
+           "         FROM DUAL) M                                       \r\n"
+           "        ON (L.CCAM_CTLR_NMBR = M.CCAM_CTLR_NMBR)            \r\n"
+           "WHEN MATCHED THEN                                           \r\n"
+           "   UPDATE SET                                               \r\n"
+           "              L.CCAM_CTLR_ID       = M.CCAM_CTLR_ID,        \r\n"
+           "              L.CCAM_NM            = M.CCAM_NM,             \r\n"
+           "              L.CCAM_CTLR_IP       = M.CCAM_CTLR_IP,        \r\n"
+           "              L.CCAM_CTLR_PORT     = M.CCAM_CTLR_PORT,      \r\n"
+           "              L.CCAM_CTLR_LOCAL_NO = M.CCAM_CTLR_LOCAL_NO,  \r\n"
+           "              L.CCAM_TYPE_CD       = M.CCAM_TYPE_CD,        \r\n"
+           "              L.ISTL_LCTN_NM       = M.ISTL_LCTN_NM,        \r\n"
+           "              L.X_CRDN             = M.X_CRDN,              \r\n"
+           "              L.Y_CRDN             = M.Y_CRDN,              \r\n"
+           "              L.DEL_YN             = M.DEL_YN,              \r\n"
+           "              L.STRM_SVR_IP        = M.STRM_SVR_IP,         \r\n"
+           "              L.STRM_SVR_PORT      = M.STRM_SVR_PORT,       \r\n"
+           "              L.STRM_SESN_NM       = M.STRM_SESN_NM,        \r\n"
+           "              L.STRM_RTSP_ADDR     = M.STRM_RTSP_ADDR,      \r\n"
+           "              L.STRM_RTMP_ADDR     = M.STRM_RTMP_ADDR,      \r\n"
+           "              L.STRM_HTTP_ADDR     = M.STRM_HTTP_ADDR,      \r\n"
+           "              L.STRM_STOR_ADDR     = M.STRM_STOR_ADDR,      \r\n"
+           "              L.CMRA_PORT          = M.CMRA_PORT,           \r\n"
+           "              L.CMRA_ID            = M.CMRA_ID,             \r\n"
+           "              L.CMRA_PSWD          = M.CMRA_PSWD,           \r\n"
+           "              L.CMRA_CHNL          = M.CMRA_CHNL,           \r\n"
+           "              L.LINK_ID            = M.LINK_ID,             \r\n"
+           "              L.GROUP_NO           = M.GROUP_NO,            \r\n"
+           "              L.FAN_MODE           = M.FAN_MODE,            \r\n"
+           "              L.FAN_RUN_TMPR       = M.FAN_RUN_TMPR,        \r\n"
+           "              L.HETR_MODE          = M.HETR_MODE,           \r\n"
+           "              L.HETR_RUN_TMPR      = M.HETR_RUN_TMPR,       \r\n"
+           "              L.DETECT_LANES       = M.DETECT_LANES,        \r\n"
+           "              L.TRAF_CLCT_CYCL     = M.TRAF_CLCT_CYCL,      \r\n"
+           "              L.STTS_CLCT_CYCL     = M.STTS_CLCT_CYCL,      \r\n"
+           "              L.ISTL_LCTN_ADDR     = M.ISTL_LCTN_ADDR       \r\n"
+           "WHEN NOT MATCHED THEN                                       \r\n"
+           "   INSERT (                                                 \r\n"
+           "           CCAM_CTLR_NMBR,                                  \r\n"
+           "           CCAM_CTLR_ID,                                    \r\n"
+           "           CCAM_NM,                                         \r\n"
+           "           CCAM_CTLR_IP,                                    \r\n"
+           "           CCAM_CTLR_PORT,                                  \r\n"
+           "           CCAM_CTLR_LOCAL_NO,                              \r\n"
+           "           CCAM_TYPE_CD,                                    \r\n"
+           "           ISTL_LCTN_NM,                                    \r\n"
+           "           X_CRDN,                                          \r\n"
+           "           Y_CRDN,                                          \r\n"
+           "           DEL_YN,                                          \r\n"
+           "           STRM_SVR_IP,                                     \r\n"
+           "           STRM_SVR_PORT,                                   \r\n"
+           "           STRM_SESN_NM,                                    \r\n"
+           "           STRM_RTSP_ADDR,                                  \r\n"
+           "           STRM_RTMP_ADDR,                                  \r\n"
+           "           STRM_HTTP_ADDR,                                  \r\n"
+           "           STRM_STOR_ADDR,                                  \r\n"
+           "           CMRA_PORT,                                       \r\n"
+           "           CMRA_ID,                                         \r\n"
+           "           CMRA_PSWD,                                       \r\n"
+           "           CMRA_CHNL,                                       \r\n"
+           "           LINK_ID,                                         \r\n"
+           "           GROUP_NO,                                        \r\n"
+           "           FAN_MODE,                                        \r\n"
+           "           FAN_RUN_TMPR,                                    \r\n"
+           "           HETR_MODE,                                       \r\n"
+           "           HETR_RUN_TMPR,                                   \r\n"
+           "           DETECT_LANES,                                    \r\n"
+           "           TRAF_CLCT_CYCL,                                  \r\n"
+           "           STTS_CLCT_CYCL,                                  \r\n"
+           "           ISTL_LCTN_ADDR )                                 \r\n"
+           "   VALUES (                                                 \r\n"
+           "           M.CCAM_CTLR_NMBR,                                \r\n"
+           "           M.CCAM_CTLR_ID,                                  \r\n"
+           "           M.CCAM_NM,                                       \r\n"
+           "           M.CCAM_CTLR_IP,                                  \r\n"
+           "           M.CCAM_CTLR_PORT,                                \r\n"
+           "           M.CCAM_CTLR_LOCAL_NO,                            \r\n"
+           "           M.CCAM_TYPE_CD,                                  \r\n"
+           "           M.ISTL_LCTN_NM,                                  \r\n"
+           "           M.X_CRDN,                                        \r\n"
+           "           M.Y_CRDN,                                        \r\n"
+           "           M.DEL_YN,                                        \r\n"
+           "           M.STRM_SVR_IP,                                   \r\n"
+           "           M.STRM_SVR_PORT,                                 \r\n"
+           "           M.STRM_SESN_NM,                                  \r\n"
+           "           M.STRM_RTSP_ADDR,                                \r\n"
+           "           M.STRM_RTMP_ADDR,                                \r\n"
+           "           M.STRM_HTTP_ADDR,                                \r\n"
+           "           M.STRM_STOR_ADDR,                                \r\n"
+           "           M.CMRA_PORT,                                     \r\n"
+           "           M.CMRA_ID,                                       \r\n"
+           "           M.CMRA_PSWD,                                     \r\n"
+           "           M.CMRA_CHNL,                                     \r\n"
+           "           M.LINK_ID,                                       \r\n"
+           "           M.GROUP_NO,                                      \r\n"
+           "           M.FAN_MODE,                                      \r\n"
+           "           M.FAN_RUN_TMPR,                                  \r\n"
+           "           M.HETR_MODE,                                     \r\n"
+           "           M.HETR_RUN_TMPR,                                 \r\n"
+           "           M.DETECT_LANES,                                  \r\n"
+           "           M.TRAF_CLCT_CYCL,                                \r\n"
+           "           M.STTS_CLCT_CYCL,                                \r\n"
+           "           M.ISTL_LCTN_ADDR )                               \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->CCAM_CTLR_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->CCAM_CTLR_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->CCAM_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->CCAM_CTLR_IP;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->CCAM_CTLR_PORT;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->CCAM_CTLR_LOCAL_NO;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->CCAM_TYPE_CD;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->ISTL_LCTN_NM;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->DEL_YN;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->STRM_SVR_IP;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->STRM_SVR_PORT;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->STRM_SESN_NM;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->STRM_RTSP_ADDR;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->STRM_RTMP_ADDR;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->STRM_HTTP_ADDR;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->STRM_STOR_ADDR;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->CMRA_PORT;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->CMRA_ID;
+            pADO->Parameters->ParamByName("p21")->Value = AObj->CMRA_PSWD;
+            pADO->Parameters->ParamByName("p22")->Value = AObj->CMRA_CHNL;
+            pADO->Parameters->ParamByName("p23")->Value = AObj->LINK_ID;
+            pADO->Parameters->ParamByName("p24")->Value = AObj->GROUP_NO;
+            pADO->Parameters->ParamByName("p25")->Value = AObj->FAN_MODE;
+            pADO->Parameters->ParamByName("p26")->Value = AObj->FAN_RUN_TMPR;
+            pADO->Parameters->ParamByName("p27")->Value = AObj->HETR_MODE;
+            pADO->Parameters->ParamByName("p28")->Value = AObj->HETR_RUN_TMPR;
+            pADO->Parameters->ParamByName("p29")->Value = AObj->DETECT_LANES;
+            pADO->Parameters->ParamByName("p30")->Value = AObj->TRAF_CLCT_CYCL;
+            pADO->Parameters->ParamByName("p31")->Value = AObj->STTS_CLCT_CYCL;
+            pADO->Parameters->ParamByName("p32")->Value = AObj->ISTL_LCTN_ADDR;
+
+			pADO->ExecSQL();
+
+            return MergeFcltInfo(AObj, ADbConn);
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCCamCtlrManager::MergeCCam", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCCamCtlrManager::MergeCCam", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCCamCtlrManager::MergeFcltInfo(TCCamCtlr *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->CCAM_CTLR_ID;
+			pADO->Parameters->ParamByName("p02")->Value = "CCAM";
+			pADO->Parameters->ParamByName("p03")->Value = AObj->CCAM_NM;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCCamCtlrManager::MergeFcltInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCCamCtlrManager::MergeFcltInfo", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCCamCtlrManager::GetNextCCamId(int &ANmbr, int &AId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT NVL(MAX(CCAM_CTLR_NMBR), 10000) + 1 AS NEWID FROM TB_CCAM_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->Prepared = true;
+			pADO->Open();
+            ANmbr = pADO->FieldByName("NEWID")->AsInteger;
+            AId = ANmbr / 10000;
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCCamCtlrManager::GetNextCCamId", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCCamCtlrManager::GetNextCCamId", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TCCamCtlrManager::LoadPreSet(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    FLists.Lock();
+    try
+    {
+        FOR_STL(TCCamCtlr*, pObj, FLists)
+        {
+            pObj->FLists.RemoveAll();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+    sQry = "SELECT B.*                                 \r\n"
+           "  FROM TB_CCAM_CTLR A,                     \r\n"
+           "       TB_CCAM_PSET B                      \r\n"
+           " WHERE A.CCAM_CTLR_NMBR = B.CCAM_CTLR_NMBR \r\n"
+           " ORDER BY B.CCAM_CTLR_NMBR, B.PSET_NMBR    \r\n";
+    try
+    {
+        String CCAM_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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                CCAM_CTLR_NMBR = pADO->FieldByName("CCAM_CTLR_NMBR")->AsString;
+				TCCamCtlr *pCCam = FLists.Find(String(CCAM_CTLR_NMBR));
+                if (!pCCam) continue;
+
+                TCCamPset *pObj = new TCCamPset();
+                if (pObj)
+                {
+                    pObj->CCAM_CTLR_NMBR = CCAM_CTLR_NMBR;
+                    pObj->PSET_NMBR      = pADO->FieldByName("PSET_NMBR")->AsInteger;
+                    pObj->PSET_NM        = pADO->FieldByName("PSET_NM")->AsString;
+                    pObj->PAN            = pADO->FieldByName("PAN")->AsInteger;
+                    pObj->TILT           = pADO->FieldByName("TILT")->AsInteger;
+                    pObj->ZOOM           = pADO->FieldByName("ZOOM")->AsInteger;
+                    pObj->FOCS           = pADO->FieldByName("FOCS")->AsInteger;
+                    pObj->ANGLE          = pADO->FieldByName("ANGLE")->AsInteger;
+                    pObj->DFLT_YN        = pADO->FieldByName("DFLT_YN")->AsString;
+
+                    pObj->DEL_YN         = "N";
+
+                    pCCam->FLists.Push(pObj->PSET_NMBR, pObj);
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TCCamCtlrManager::LoadPreSet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TCCamCtlrManager::LoadPreSet", 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 TCCamCtlrManager::SavePreSet(TCCamCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+    sQry = "DELETE FROM TB_CCAM_PSET WHERE CCAM_CTLR_NMBR = :p01";
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CCAM_CTLR_NMBR;
+			pADO->ExecSQL();
+
+    sQry = "INSERT INTO TB_CCAM_PSET (  \r\n"
+           "            CCAM_CTLR_NMBR, \r\n"
+           "            PSET_NMBR,      \r\n"
+           "            PSET_NM,        \r\n"
+           "            PAN,            \r\n"
+           "            TILT,           \r\n"
+           "            ZOOM,           \r\n"
+           "            FOCS,           \r\n"
+           "            ANGLE,          \r\n"
+           "            DFLT_YN         \r\n"
+           "   ) VALUES (               \r\n"
+           "           :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"
+           "      )                     \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            FOR_STL(TCCamPset *, pObj, AObj->FLists)
+            {
+                if (pObj->DEL_YN != "N") continue;
+
+                pADO->Parameters->ParamByName("p01")->Value = pObj->CCAM_CTLR_NMBR;
+                pADO->Parameters->ParamByName("p02")->Value = pObj->PSET_NMBR;
+                pADO->Parameters->ParamByName("p03")->Value = pObj->PSET_NM;
+                pADO->Parameters->ParamByName("p04")->Value = pObj->PAN;
+                pADO->Parameters->ParamByName("p05")->Value = pObj->TILT;
+                pADO->Parameters->ParamByName("p06")->Value = pObj->ZOOM;
+                pADO->Parameters->ParamByName("p07")->Value = pObj->FOCS;
+                pADO->Parameters->ParamByName("p08")->Value = pObj->ANGLE;
+                pADO->Parameters->ParamByName("p09")->Value = pObj->DFLT_YN;
+
+    			pADO->ExecSQL();
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCCamCtlrManager::SavePreSet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCCamCtlrManager::SavePreSet", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCCamCtlrManager::DeletePreSet(TCCamCtlr *AObj, int APsetNmbr, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    TCCamPset* pObj = AObj->FLists.Find(APsetNmbr);
+    if (!pObj) return false;
+
+    sQry = "DELETE FROM TB_CCAM_PSET WHERE CCAM_CTLR_NMBR = :p01 AND PSET_NMBR = :p02";
+
+    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->CCAM_CTLR_NMBR;
+			pADO->Parameters->ParamByName("p02")->Value = APsetNmbr;
+
+			pADO->ExecSQL();
+
+            pObj->DEL_YN = "Y";
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCCamCtlrManager::DeletePreSet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCCamCtlrManager::DeletePreSet", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCCamCtlrManager::MergePreSet(TCCamCtlr *AObj, TCCamPset* APset, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+    sQry = "MERGE INTO TB_CCAM_PSET L                           \r\n"
+           "USING (SELECT :p01 AS CCAM_CTLR_NMBR,               \r\n"
+           "              :p02 AS PSET_NMBR,                    \r\n"
+           "              :p03 AS PSET_NM,                      \r\n"
+           "              :p04 AS PAN,                          \r\n"
+           "              :p05 AS TILT,                         \r\n"
+           "              :p06 AS ZOOM,                         \r\n"
+           "              :p07 AS FOCS,                         \r\n"
+           "              :p08 AS ANGLE,                        \r\n"
+           "              :p09 AS DFLT_YN                       \r\n"
+           "         FROM DUAL) M                               \r\n"
+           "        ON (L.CCAM_CTLR_NMBR = M.CCAM_CTLR_NMBR)    \r\n"
+           "WHEN MATCHED THEN                                   \r\n"
+           "   UPDATE SET L.PSET_NMBR   = M.PSET_NMBR,          \r\n"
+           "              L.PSET_NM     = M.PSET_NM,            \r\n"
+           "              L.PAN         = M.PAN,                \r\n"
+           "              L.TILT        = M.TILT,               \r\n"
+           "              L.ZOOM        = M.ZOOM,               \r\n"
+           "              L.FOCS        = M.FOCS,               \r\n"
+           "              L.ANGLE       = M.ANGLE,              \r\n"
+           "              L.DFLT_YN     = M.DFLT_YN             \r\n"
+           "WHEN NOT MATCHED THEN                               \r\n"
+           "   INSERT (CCAM_CTLR_NMBR,                          \r\n"
+           "           PSET_NMBR,                               \r\n"
+           "           PSET_NM,                                 \r\n"
+           "           PAN,                                     \r\n"
+           "           TILT,                                    \r\n"
+           "           ZOOM,                                    \r\n"
+           "           FOCS,                                    \r\n"
+           "           ANGLE,                                   \r\n"
+           "           DFLT_YN )                                \r\n"
+           "   VALUES (M.CCAM_CTLR_NMBR,                        \r\n"
+           "           M.PSET_NMBR,                             \r\n"
+           "           M.PSET_NM,                               \r\n"
+           "           M.PAN,                                   \r\n"
+           "           M.TILT,                                  \r\n"
+           "           M.ZOOM,                                  \r\n"
+           "           M.FOCS,                                  \r\n"
+           "           M.ANGLE,                                 \r\n"
+           "           M.DFLT_YN )                              \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            FOR_STL(TCCamPset *, pObj, AObj->FLists)
+            {
+                if (pObj->DEL_YN != "N") continue;
+
+                pADO->Parameters->ParamByName("p01")->Value = APset->CCAM_CTLR_NMBR;
+                pADO->Parameters->ParamByName("p02")->Value = APset->PSET_NMBR;
+                pADO->Parameters->ParamByName("p03")->Value = APset->PSET_NM;
+                pADO->Parameters->ParamByName("p04")->Value = APset->PAN;
+                pADO->Parameters->ParamByName("p05")->Value = APset->TILT;
+                pADO->Parameters->ParamByName("p06")->Value = APset->ZOOM;
+                pADO->Parameters->ParamByName("p07")->Value = APset->FOCS;
+                pADO->Parameters->ParamByName("p08")->Value = APset->ANGLE;
+                pADO->Parameters->ParamByName("p09")->Value = APset->DFLT_YN;
+
+    			pADO->ExecSQL();
+
+                TCCamPset* pObj = AObj->FLists.Find(APset->PSET_NMBR);
+                if (pObj)
+                {
+                    pObj->CCAM_CTLR_NMBR = APset->CCAM_CTLR_NMBR;
+                    pObj->PSET_NMBR      = APset->PSET_NMBR;
+                    pObj->PSET_NM        = APset->PSET_NM;
+                    pObj->PAN            = APset->PAN;
+                    pObj->TILT           = APset->TILT;
+                    pObj->ZOOM           = APset->ZOOM;
+                    pObj->FOCS           = APset->FOCS;
+                    pObj->ANGLE          = APset->ANGLE;
+                    pObj->DFLT_YN        = APset->DFLT_YN;
+                }
+                else
+                {
+                    AObj->FLists.Push(APset->PSET_NMBR, APset);
+                }
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCCamCtlrManager::SavePreSet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCCamCtlrManager::SavePreSet", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCCamCtlrManager::InsCCamControlHs(String ACtlDt, String ACctvNmbr, String ACtlType, String ACtlVal, String ACtlRes, String AUserId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "INSERT INTO TB_CCAM_CTRL_HS(               \r\n"
+           "                          CTRL_DT,         \r\n"
+           "                          CCAM_CTLR_NMBR,  \r\n"
+           "                          CTRL_TYPE,       \r\n"
+           "                          CTRL_VAL,        \r\n"
+           "                          CTRL_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 = ACctvNmbr;
+            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("TCCamCtlrManager::InsCCamControlHs", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCCamCtlrManager::InsCCamControlHs", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 135 - 0
COMMON/CDS/CDSCCamCtlrF.h

@@ -0,0 +1,135 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSCCamCtlrFH
+#define CDSCCamCtlrFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+#include "CDSObjectF.h"
+//---------------------------------------------------------------------------
+#include "CenterCommF.h"
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+
+class TCCamPset
+{
+public:
+    TCCamPset()
+    {
+        PSET_NMBR = 1;
+        PSET_NM   = "";
+        PAN       = 0;
+        TILT      = 0;
+        ZOOM      = 0;
+        FOCS      = 0;
+        ANGLE     = 0;
+        DFLT_YN   = "N";
+    };
+    ~TCCamPset() {};
+
+private:
+
+public:
+    String  CCAM_CTLR_NMBR;     //	N	NUMBER(10)	    N			CCTV 제어기 번호
+    int     PSET_NMBR;          //	N	NUMBER(4)	    N			프리셋 번호
+    String  PSET_NM;            //	N	VARCHAR2(100)	N			프리셋 명
+    int     PAN;                //	N	NUMBER(4)	    Y	0		팬 값
+    int     TILT;               //	N	NUMBER(4)	    Y	0		틸트 값
+    int     ZOOM;               //	N	NUMBER(4)	    Y	0		줌 값
+    int     FOCS;               //	N	NUMBER(4)	    Y	0		포커스 값
+    int     ANGLE;              //	N	NUMBER(4)	    Y	0		각도
+    String  DFLT_YN;            //	N	CHAR(1)	        Y	'N'		디폴트 여부
+
+public:
+    String  DEL_YN;
+
+};
+
+class TCCamCtlr : public TCDSObject
+{
+public:
+    TCCamCtlr();
+    ~TCCamCtlr();
+
+public:
+    String  STRM_SVR_IP;        //	N	VARCHAR2(20)	Y			스트리밍 서버 아이피
+    String  STRM_SVR_PORT;      //	N	VARCHAR2(5)	    Y			스트리밍 서버 포트
+    String  STRM_SESN_NM;       //	N	VARCHAR2(200)	Y			스트리밍 세션 명
+    String  STRM_RTSP_ADDR;     //	N	VARCHAR2(200)	Y			스트리밍 RTSP 주소
+    String  STRM_RTMP_ADDR;     //	N	VARCHAR2(200)	Y			스트리밍 RTMP 주소
+    String  STRM_HTTP_ADDR;     //	N	VARCHAR2(200)	Y			스트리밍 HTTP 주소
+    String  STRM_STOR_ADDR;     //	N	VARCHAR2(200)	Y			스트리밍 저장 주소
+    int     CMRA_PORT;          //	N	NUMBER(5)	    Y	1852	웹카메라 제어 포트
+    String  CMRA_ID;            //	N	VARCHAR2(20)	Y	'root'	웹카메라 제어 ID
+    String  CMRA_PSWD;          //	N	VARCHAR2(20)	Y	'1234'	웹카메라 제어 PSWD
+    int     CMRA_CHNL;          //	N	NUMBER(5)	    Y	1		웹카메라제어 CHANNEL
+    String  LINK_ID;            //	N	NUMBER(10)	    Y			링크ID
+
+    int     GROUP_NO;           //	N	NUMBER(5)	Y	0		그룹번호
+    int     FAN_MODE;           //	N	NUMBER(3)	Y	2		FAN 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
+    int     FAN_RUN_TMPR;       //	N	NUMBER(3)	Y	30		팬 동작 온도
+    int     HETR_MODE;          //	N	NUMBER(3)	Y	2		히터 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
+    int     HETR_RUN_TMPR;      //	N	NUMBER(3)	Y	0		히터 동작 온도
+    int     DETECT_LANES;       //	N	NUMBER(2)	Y	0		검지 전체 차로수
+    int     TRAF_CLCT_CYCL;     //	N	NUMBER(3)	Y	60		교통정보수집주기
+    int     STTS_CLCT_CYCL;     //	N	NUMBER(3)	Y	0		상태정보수집주기
+
+public:
+    INT_CCAM_STATE  STATE;
+
+    TItsMap<int, TCCamPset*> FLists;
+
+public:
+    __property String  CCAM_CTLR_NMBR     = { read = CTLR_NMBR,     write = CTLR_NMBR     };
+    __property String  CCAM_CTLR_ID       = { read = CTLR_ID,       write = CTLR_ID       };
+    __property String  CCAM_NM            = { read = NAME,          write = NAME          };
+    __property String  CCAM_CTLR_IP       = { read = CTLR_IP,       write = CTLR_IP       };
+    __property int     CCAM_CTLR_PORT     = { read = CTLR_PORT,     write = CTLR_PORT     };
+    __property int     CCAM_CTLR_LOCAL_NO = { read = CTLR_LOCAL_NO, write = CTLR_LOCAL_NO };
+    __property String  CCAM_TYPE_CD       = { read = TYPE_CD,       write = TYPE_CD       };
+
+};
+//---------------------------------------------------------------------------
+typedef std::map<String, TCCamCtlr*>::iterator   CCamIterator;
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+class TCCamCtlrManager
+{
+public:
+    TCCamCtlrManager();
+    ~TCCamCtlrManager();
+
+private:
+	TStream *FImgStream;
+
+public:
+    TItsMap<String, TCCamCtlr*> FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadStatusFromDb(TADOConnection *ADbConn=NULL);
+    bool DeleteCCam(TCCamCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertCCam(TCCamCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool UpdateCCam(TCCamCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeCCam(TCCamCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeFcltInfo(TCCamCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool GetNextCCamId(int &ANmbr, int &AId, TADOConnection *ADbConn=NULL);
+
+    bool LoadPreSet(TADOConnection *ADbConn=NULL);
+    bool SavePreSet(TCCamCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool DeletePreSet(TCCamCtlr *AObj, int APsetNmbr, TADOConnection *ADbConn=NULL);
+    bool MergePreSet(TCCamCtlr *AObj, TCCamPset* APset, TADOConnection *ADbConn=NULL);
+
+    bool InsCCamControlHs(String ACtlDt, String ACctvNmbr, String ACtlType, String ACtlVal, String ACtlRes, String AUserId, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TCCamCtlrManager *CCamCtlrManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 1081 - 0
COMMON/CDS/CDSCctvCtlrF.cpp

@@ -0,0 +1,1081 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSCctvCtlrF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+
+//---------------------------------------------------------------------------
+TCctvCtlr::TCctvCtlr()
+{
+}
+//---------------------------------------------------------------------------
+
+TCctvCtlr::~TCctvCtlr()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TCctvCtlrManager *CctvCtlrManager = NULL;
+//---------------------------------------------------------------------------
+
+TCctvCtlrManager::TCctvCtlrManager()
+{
+    FImgStream = NULL;
+}
+//---------------------------------------------------------------------------
+TCctvCtlrManager::~TCctvCtlrManager()
+{
+    FLists.RemoveAll();
+    if (FImgStream) delete FImgStream;
+    FImgStream = NULL;
+}
+//---------------------------------------------------------------------------
+bool TCctvCtlrManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.*              \r\n"
+           "  FROM TB_CCTV_CTLR A   \r\n";
+           " WHERE A.DEL_YN = 'N'   \r\n";
+
+    FLists.Lock();
+    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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TCctvCtlr *pObj = new TCctvCtlr();
+
+#if 0
+                pObj->CCTV_CTLR_NMBR      = pADO->FieldByName("CCTV_CTLR_NMBR")->AsString;             //	N	NUMBER(10)	    N			CCTV 제어기 번호
+                pObj->CCTV_NM             = pADO->FieldByName("CCTV_NM")->AsString.Trim();              //	N	VARCHAR2(40)	Y			CCTV 명칭
+                pObj->CCTV_TYPE_CD        = pADO->FieldByName("CCTV_TYPE_CD")->AsString.Trim();         //	N	VARCHAR2(7)	    Y			CCTV 유형
+                pObj->CCTV_CTLR_LOCAL_NO  = pADO->FieldByName("CCTV_CTLR_LOCAL_NO")->AsInteger;         //	N	NUMBER(5)	    Y			CCTV 제어기 지역번호
+                pObj->STRM_STOR_ADDR      = pADO->FieldByName("STRM_STOR_ADDR")->AsString.Trim();       //	N	VARCHAR2(200)	Y			스트리밍 저장 주소
+                pObj->INTR_RTSP_ADDR      = pADO->FieldByName("INTR_RTSP_ADDR")->AsString.Trim();       //	N	VARCHAR2(200)	Y			내부 RTSP 주소
+                pObj->INTR_RTMP_ADDR      = pADO->FieldByName("INTR_RTMP_ADDR")->AsString.Trim();       //	N	VARCHAR2(200)	Y			내부 RTMP 주소
+                pObj->INTR_HTTP_ADDR      = pADO->FieldByName("INTR_HTTP_ADDR")->AsString.Trim();       //	N	VARCHAR2(200)	Y			내부 HTTP 주소
+                pObj->CCTV_SBST_DSPL_YN   = pADO->FieldByName("CCTV_SBST_DSPL_YN")->AsString.Trim();    //	N	CHAR(1)	        Y	'N'		CCTV 대체 표출 여부
+                pObj->SYOP_CNTL_YN        = pADO->FieldByName("SYOP_CNTL_YN")->AsString.Trim();         //	N	CHAR(1)	        Y	'N'		운영자 제어 여부
+                pObj->CCTV_IP             = pADO->FieldByName("CCTV_IP")->AsString.Trim();              //	N	VARCHAR2(20)	Y			목포 CCTV 제어 IP
+                pObj->CCTV_PORT           = pADO->FieldByName("CCTV_PORT")->AsInteger;                  //	N	NUMBER(5)	    Y	1852		목포 CCTV 제어 PORT
+                pObj->CCTV_ID             = pADO->FieldByName("CCTV_ID")->AsString.Trim();              //	N	VARCHAR2(20)	Y	'root'		목포 CCTV 제어 ID
+                pObj->CCTV_PSWD           = pADO->FieldByName("CCTV_PSWD")->AsString.Trim();            //	N	VARCHAR2(20)	Y	'1234'		목포 CCTV 제어 PSWD
+                pObj->CCTV_CHNL           = pADO->FieldByName("CCTV_CHNL")->AsInteger;                  //	N	NUMBER(5)	    Y	1		목포 CCTV 제어 CHANNEL
+#else
+                pObj->CCTV_CTLR_NMBR      = pADO->FieldByName("CCTV_MNGM_NMBR")->AsString;             //	N	NUMBER(10)	    N			CCTV 제어기 번호
+                pObj->CCTV_NM             = pADO->FieldByName("ISTL_LCTN_NM")->AsString.Trim();        //	N	VARCHAR2(40)	Y			CCTV 명칭
+#endif
+                pObj->CCTV_CTLR_ID        = pADO->FieldByName("CCTV_CTLR_ID")->AsString.Trim();         //	N	VARCHAR2(30)	Y			CCTV 제어기 ID
+                pObj->CCTV_CTLR_IP        = pADO->FieldByName("CCTV_CTLR_IP")->AsString.Trim();         //	N	VARCHAR2(20)	Y			CCTV 제어기 아이피
+                pObj->CCTV_CTLR_PORT      = pADO->FieldByName("CCTV_CTLR_PORT")->AsInteger;             //	N	NUMBER(5)	    Y			CCTV 제어기 포트
+                pObj->ISTL_LCTN_NM        = pADO->FieldByName("ISTL_LCTN_NM")->AsString.Trim();         //	N	VARCHAR2(40)	Y			설치 위치 명
+                pObj->X_CRDN              = pADO->FieldByName("X_CRDN")->AsFloat;                       //	N	NUMBER(11,8)	Y			X 좌표
+                pObj->Y_CRDN              = pADO->FieldByName("Y_CRDN")->AsFloat;                       //	N	NUMBER(10,8)	Y			Y 좌표
+                pObj->DEL_YN              = pADO->FieldByName("DEL_YN")->AsString.Trim();               //	N	CHAR(1)	        Y	'N'		삭제 여부
+                pObj->CCTV_CAPT_IP        = pADO->FieldByName("CCTV_CAPT_IP")->AsString.Trim();         //	N	VARCHAR2(20)	Y			CCTV 자막기 아이피
+                pObj->CCTV_CAPT_PORT      = pADO->FieldByName("CCTV_CAPT_PORT")->AsString.Trim();       //	N	VARCHAR2(5)	    Y			CCTV 자막기 포트
+                pObj->CCTV_FIBR_IP        = pADO->FieldByName("CCTV_FIBR_IP")->AsString.Trim();         //	N	VARCHAR2(20)	Y			CCTV 광장비 아이피
+                pObj->CCTV_ENCD_IP        = pADO->FieldByName("CCTV_ENCD_IP")->AsString.Trim();         //	N	VARCHAR2(20)	Y			CCTV 인코더 아이피
+                pObj->STRM_SVR_IP         = pADO->FieldByName("STRM_SVR_IP")->AsString.Trim();          //	N	VARCHAR2(20)	Y			스트리밍 서버 아이피
+                pObj->STRM_SVR_PORT       = pADO->FieldByName("STRM_SVR_PORT")->AsString.Trim();        //	N	VARCHAR2(5)	    Y			스트리밍 서버 포트
+                pObj->STRM_SESN_NM        = pADO->FieldByName("STRM_SESN_NM")->AsString.Trim();         //	N	VARCHAR2(200)	Y			스트리밍 세션 명
+                pObj->STRM_RTSP_ADDR      = pADO->FieldByName("STRM_RTSP_ADDR")->AsString.Trim();       //	N	VARCHAR2(200)	Y			스트리밍 RTSP 주소
+                pObj->STRM_RTMP_ADDR      = pADO->FieldByName("STRM_RTMP_ADDR")->AsString.Trim();       //	N	VARCHAR2(200)	Y			스트리밍 RTMP 주소
+                pObj->STRM_HTTP_ADDR      = pADO->FieldByName("STRM_HTTP_ADDR")->AsString.Trim();       //	N	VARCHAR2(200)	Y			스트리밍 HTTP 주소
+                //pObj->CCTV_SBST_IMGN      = pADO->FieldByName("CCTV_SBST_IMGN")->AsString.Trim();       //	N	BLOB	        Y			CCTV 대체 영상
+
+                pObj->STATE.Comm = cctv_error;
+
+				FLists.Push(pObj->CCTV_CTLR_NMBR, pObj);
+                pObj->Completed  = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TCctvCtlrManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TCctvCtlrManager::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 TCctvCtlrManager::LoadStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                                                        \r\n"
+           "  FROM TB_CCTV_CTLR_STTS A,                                     \r\n"
+           "       TB_CCTV_CTLR      B                                      \r\n"
+           " WHERE A.CCTV_CTLR_NMBR = B.CCTV_CTLR_NMBR                      \r\n"
+           "   AND A.UPDT_DT >= TO_CHAR(SYSDATE-2/1440, 'YYYYMMDDHH24MISS') \r\n";
+
+    FLists.Lock();
+    try
+    {
+        TCctvCtlr *pObj = 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->Prepared = true;
+            pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String CCTV_CTLR_NMBR = pADO->FieldByName("CCTV_CTLR_NMBR")->AsString;
+                pObj = FLists.Find(CCTV_CTLR_NMBR);
+                if (!pObj) continue;
+
+                String UPDT_DT      = pADO->FieldByName("UPDT_DT")->AsString;
+                String CONN_STTS_CD = pADO->FieldByName("CONN_STTS_CD")->AsString;
+                if (CONN_STTS_CD != "CMS0")
+                {
+                    //통신장애
+                    continue;
+                }
+                pObj->STATE.Comm = (CONN_STTS_CD == "CMS0") ? cctv_normal : cctv_error;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCctvCtlrManager::LoadStatusFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCctvCtlrManager::LoadStatusFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCctvCtlrManager::DeleteCctv(TCctvCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_CCTV_CTLR          \r\n"
+           "   SET DEL_YN = 'Y'          \r\n"
+           " WHERE CCTV_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->CCTV_CTLR_NMBR;
+			pADO->ExecSQL();
+
+        sQry = "DELETE TB_FCLT_INFR      \r\n"
+               " WHERE FCLT_ID = :p01    \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CCTV_CTLR_ID;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCctvCtlrManager::DeleteCctv", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCctvCtlrManager::DeleteCctv", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCctvCtlrManager::InsertCctv(TCctvCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "MERGE INTO TB_CCTV_CTLR L                   \r\n"
+           "USING (SELECT                               \r\n"
+           "              :p01 AS CCTV_CTLR_NMBR,       \r\n"
+           "              :p02 AS CCTV_CTLR_ID,         \r\n"
+           "              :p03 AS CCTV_NM,              \r\n"
+           "              :p04 AS CCTV_CTLR_IP,         \r\n"
+           "              :p05 AS CCTV_CTLR_PORT,       \r\n"
+           "              :p06 AS CCTV_CTLR_LOCAL_NO,   \r\n"
+           "              :p07 AS CCTV_TYPE_CD,         \r\n"
+           "              :p08 AS ISTL_LCTN_NM,         \r\n"
+           "              :p09 AS X_CRDN,               \r\n"
+           "              :p10 AS Y_CRDN,               \r\n"
+           "              :p11 AS DEL_YN,               \r\n"
+           "              :p12 AS STRM_SVR_IP,          \r\n"
+           "              :p13 AS STRM_SESN_NM,         \r\n"
+           "              :p14 AS STRM_RTSP_ADDR,       \r\n"
+           "              :p15 AS STRM_RTMP_ADDR,       \r\n"
+           "              :p16 AS STRM_HTTP_ADDR,       \r\n"
+           "              :p17 AS CCTV_IP,              \r\n"
+           "              :p18 AS CCTV_PORT,            \r\n"
+           "              :p19 AS CCTV_ID,              \r\n"
+           "              :p20 AS CCTV_PSWD,            \r\n"
+           "              :p21 AS CCTV_CHNL             \r\n"
+           "         FROM DUAL) M                       \r\n"
+           "        ON (L.CCTV_CTLR_NMBR = M.CCTV_CTLR_NMBR)            \r\n"
+           "WHEN MATCHED THEN                                           \r\n"
+           "   UPDATE SET L.CCTV_CTLR_ID       = M.CCTV_CTLR_ID,        \r\n"
+           "              L.CCTV_NM            = M.CCTV_NM,             \r\n"
+           "              L.CCTV_CTLR_IP       = M.CCTV_CTLR_IP,        \r\n"
+           "              L.CCTV_CTLR_PORT     = M.CCTV_CTLR_PORT,      \r\n"
+           "              L.CCTV_CTLR_LOCAL_NO = M.CCTV_CTLR_LOCAL_NO,  \r\n"
+           "              L.CCTV_TYPE_CD       = M.CCTV_TYPE_CD,        \r\n"
+           "              L.ISTL_LCTN_NM       = M.ISTL_LCTN_NM,        \r\n"
+           "              L.X_CRDN             = M.X_CRDN,              \r\n"
+           "              L.Y_CRDN             = M.Y_CRDN,              \r\n"
+           "              L.DEL_YN             = M.DEL_YN,              \r\n"
+           "              L.STRM_SVR_IP        = M.STRM_SVR_IP,         \r\n"
+           "              L.STRM_SESN_NM       = M.STRM_SESN_NM,        \r\n"
+           "              L.STRM_RTSP_ADDR     = M.STRM_RTSP_ADDR,      \r\n"
+           "              L.STRM_RTMP_ADDR     = M.STRM_RTMP_ADDR,      \r\n"
+           "              L.STRM_HTTP_ADDR     = M.STRM_HTTP_ADDR,      \r\n"
+           "              L.CCTV_IP            = M.CCTV_IP,             \r\n"
+           "              L.CCTV_PORT          = M.CCTV_PORT,           \r\n"
+           "              L.CCTV_ID            = M.CCTV_ID,             \r\n"
+           "              L.CCTV_PSWD          = M.CCTV_PSWD,           \r\n"
+           "              L.CCTV_CHNL          = M.CCTV_CHNL            \r\n"
+           "WHEN NOT MATCHED THEN               \r\n"
+           "   INSERT (                         \r\n"
+           "           CCTV_CTLR_NMBR,          \r\n"
+           "           CCTV_CTLR_ID,            \r\n"
+           "           CCTV_NM,                 \r\n"
+           "           CCTV_CTLR_IP,            \r\n"
+           "           CCTV_CTLR_PORT,          \r\n"
+           "           CCTV_CTLR_LOCAL_NO,      \r\n"
+           "           CCTV_TYPE_CD,            \r\n"
+           "           ISTL_LCTN_NM,            \r\n"
+           "           X_CRDN,                  \r\n"
+           "           Y_CRDN,                  \r\n"
+           "           DEL_YN,                  \r\n"
+           "           STRM_SVR_IP,             \r\n"
+           "           STRM_SESN_NM	,           \r\n"
+           "           STRM_RTSP_ADDR,          \r\n"
+           "           STRM_RTMP_ADDR,          \r\n"
+           "           STRM_HTTP_ADDR,          \r\n"
+           "           CCTV_IP,                 \r\n"
+           "           CCTV_PORT,               \r\n"
+           "           CCTV_ID,                 \r\n"
+           "           CCTV_PSWD,               \r\n"
+           "           CCTV_CHNL                \r\n"
+           "           )                        \r\n"
+           "   VALUES (                         \r\n"
+           "           M.CCTV_CTLR_NMBR,        \r\n"
+           "           M.CCTV_CTLR_ID,          \r\n"
+           "           M.CCTV_NM,               \r\n"
+           "           M.CCTV_CTLR_IP,          \r\n"
+           "           M.CCTV_CTLR_PORT,        \r\n"
+           "           M.CCTV_CTLR_LOCAL_NO,    \r\n"
+           "           M.CCTV_TYPE_CD,          \r\n"
+           "           M.ISTL_LCTN_NM,          \r\n"
+           "           M.X_CRDN,                \r\n"
+           "           M.Y_CRDN,                \r\n"
+           "           M.DEL_YN,                \r\n"
+           "           M.STRM_SVR_IP,           \r\n"
+           "           M.STRM_SESN_NM	,       \r\n"
+           "           M.STRM_RTSP_ADDR,        \r\n"
+           "           M.STRM_RTMP_ADDR,        \r\n"
+           "           M.STRM_HTTP_ADDR,        \r\n"
+           "           M.CCTV_IP,               \r\n"
+           "           M.CCTV_PORT,             \r\n"
+           "           M.CCTV_ID,               \r\n"
+           "           M.CCTV_PSWD,             \r\n"
+           "           M.CCTV_CHNL              \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 = AObj->CCTV_CTLR_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->CCTV_CTLR_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->CCTV_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->CCTV_CTLR_IP;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->CCTV_CTLR_PORT;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->CCTV_CTLR_LOCAL_NO;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->CCTV_TYPE_CD;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->ISTL_LCTN_NM;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->DEL_YN;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->STRM_SVR_IP;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->STRM_SESN_NM;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->STRM_RTSP_ADDR;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->STRM_RTMP_ADDR;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->STRM_HTTP_ADDR;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->CCTV_IP;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->CCTV_PORT;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->CCTV_ID;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->CCTV_PSWD;
+            pADO->Parameters->ParamByName("p21")->Value = AObj->CCTV_CHNL;
+
+			pADO->ExecSQL();
+
+            return MergeFcltInfo(AObj, ADbConn);
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCctvCtlrManager::InsertCctv", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCctvCtlrManager::InsertCctv", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCctvCtlrManager::UpdateCctv(TCctvCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    return MergeCctv(AObj, ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TCctvCtlrManager::MergeCctv(TCctvCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "MERGE INTO TB_CCTV_CTLR L                   \r\n"
+           "USING (SELECT                               \r\n"
+           "              :p01 AS CCTV_CTLR_NMBR,       \r\n"
+           "              :p02 AS CCTV_CTLR_ID,         \r\n"
+           "              :p03 AS CCTV_NM,              \r\n"
+           "              :p04 AS CCTV_CTLR_IP,         \r\n"
+           "              :p05 AS CCTV_CTLR_PORT,       \r\n"
+           "              :p06 AS CCTV_CTLR_LOCAL_NO,   \r\n"
+           "              :p07 AS CCTV_TYPE_CD,         \r\n"
+           "              :p08 AS ISTL_LCTN_NM,         \r\n"
+           "              :p09 AS X_CRDN,               \r\n"
+           "              :p10 AS Y_CRDN,               \r\n"
+           "              :p11 AS DEL_YN,               \r\n"
+           "              :p12 AS STRM_SVR_IP,          \r\n"
+           "              :p13 AS STRM_SESN_NM,         \r\n"
+           "              :p14 AS STRM_RTSP_ADDR,       \r\n"
+           "              :p15 AS STRM_RTMP_ADDR,       \r\n"
+           "              :p16 AS STRM_HTTP_ADDR,       \r\n"
+           "              :p17 AS CCTV_IP,              \r\n"
+           "              :p18 AS CCTV_PORT,            \r\n"
+           "              :p19 AS CCTV_ID,              \r\n"
+           "              :p20 AS CCTV_PSWD,            \r\n"
+           "              :p21 AS CCTV_CHNL             \r\n"
+           "         FROM DUAL) M                       \r\n"
+           "        ON (L.CCTV_CTLR_NMBR = M.CCTV_CTLR_NMBR)            \r\n"
+           "WHEN MATCHED THEN                                           \r\n"
+           "   UPDATE SET L.CCTV_CTLR_ID       = M.CCTV_CTLR_ID,        \r\n"
+           "              L.CCTV_NM            = M.CCTV_NM,             \r\n"
+           "              L.CCTV_CTLR_IP       = M.CCTV_CTLR_IP,        \r\n"
+           "              L.CCTV_CTLR_PORT     = M.CCTV_CTLR_PORT,      \r\n"
+           "              L.CCTV_CTLR_LOCAL_NO = M.CCTV_CTLR_LOCAL_NO,  \r\n"
+           "              L.CCTV_TYPE_CD       = M.CCTV_TYPE_CD,        \r\n"
+           "              L.ISTL_LCTN_NM       = M.ISTL_LCTN_NM,        \r\n"
+           "              L.X_CRDN             = M.X_CRDN,              \r\n"
+           "              L.Y_CRDN             = M.Y_CRDN,              \r\n"
+           "              L.DEL_YN             = M.DEL_YN,              \r\n"
+           "              L.STRM_SVR_IP        = M.STRM_SVR_IP,         \r\n"
+           "              L.STRM_SESN_NM       = M.STRM_SESN_NM,        \r\n"
+           "              L.STRM_RTSP_ADDR     = M.STRM_RTSP_ADDR,      \r\n"
+           "              L.STRM_RTMP_ADDR     = M.STRM_RTMP_ADDR,      \r\n"
+           "              L.STRM_HTTP_ADDR     = M.STRM_HTTP_ADDR,      \r\n"
+           "              L.CCTV_IP            = M.CCTV_IP,             \r\n"
+           "              L.CCTV_PORT          = M.CCTV_PORT,           \r\n"
+           "              L.CCTV_ID            = M.CCTV_ID,             \r\n"
+           "              L.CCTV_PSWD          = M.CCTV_PSWD,           \r\n"
+           "              L.CCTV_CHNL          = M.CCTV_CHNL            \r\n"
+           "WHEN NOT MATCHED THEN               \r\n"
+           "   INSERT (                         \r\n"
+           "           CCTV_CTLR_NMBR,          \r\n"
+           "           CCTV_CTLR_ID,            \r\n"
+           "           CCTV_NM,                 \r\n"
+           "           CCTV_CTLR_IP,            \r\n"
+           "           CCTV_CTLR_PORT,          \r\n"
+           "           CCTV_CTLR_LOCAL_NO,      \r\n"
+           "           CCTV_TYPE_CD,            \r\n"
+           "           ISTL_LCTN_NM,            \r\n"
+           "           X_CRDN,                  \r\n"
+           "           Y_CRDN,                  \r\n"
+           "           DEL_YN,                  \r\n"
+           "           STRM_SVR_IP,             \r\n"
+           "           STRM_SESN_NM	,           \r\n"
+           "           STRM_RTSP_ADDR,          \r\n"
+           "           STRM_RTMP_ADDR,          \r\n"
+           "           STRM_HTTP_ADDR,          \r\n"
+           "           CCTV_IP,                 \r\n"
+           "           CCTV_PORT,               \r\n"
+           "           CCTV_ID,                 \r\n"
+           "           CCTV_PSWD,               \r\n"
+           "           CCTV_CHNL                \r\n"
+           "           )                        \r\n"
+           "   VALUES (                         \r\n"
+           "           M.CCTV_CTLR_NMBR,        \r\n"
+           "           M.CCTV_CTLR_ID,          \r\n"
+           "           M.CCTV_NM,               \r\n"
+           "           M.CCTV_CTLR_IP,          \r\n"
+           "           M.CCTV_CTLR_PORT,        \r\n"
+           "           M.CCTV_CTLR_LOCAL_NO,    \r\n"
+           "           M.CCTV_TYPE_CD,          \r\n"
+           "           M.ISTL_LCTN_NM,          \r\n"
+           "           M.X_CRDN,                \r\n"
+           "           M.Y_CRDN,                \r\n"
+           "           M.DEL_YN,                \r\n"
+           "           M.STRM_SVR_IP,           \r\n"
+           "           M.STRM_SESN_NM	,       \r\n"
+           "           M.STRM_RTSP_ADDR,        \r\n"
+           "           M.STRM_RTMP_ADDR,        \r\n"
+           "           M.STRM_HTTP_ADDR,        \r\n"
+           "           M.CCTV_IP,               \r\n"
+           "           M.CCTV_PORT,             \r\n"
+           "           M.CCTV_ID,               \r\n"
+           "           M.CCTV_PSWD,             \r\n"
+           "           M.CCTV_CHNL              \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 = AObj->CCTV_CTLR_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->CCTV_CTLR_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->CCTV_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->CCTV_CTLR_IP;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->CCTV_CTLR_PORT;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->CCTV_CTLR_LOCAL_NO;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->CCTV_TYPE_CD;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->ISTL_LCTN_NM;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->DEL_YN;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->STRM_SVR_IP;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->STRM_SESN_NM;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->STRM_RTSP_ADDR;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->STRM_RTMP_ADDR;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->STRM_HTTP_ADDR;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->CCTV_IP;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->CCTV_PORT;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->CCTV_ID;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->CCTV_PSWD;
+            pADO->Parameters->ParamByName("p21")->Value = AObj->CCTV_CHNL;
+
+			pADO->ExecSQL();
+
+            return MergeFcltInfo(AObj, ADbConn);
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCctvCtlrManager::MergeCctv", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCctvCtlrManager::MergeCctv", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCctvCtlrManager::MergeFcltInfo(TCctvCtlr *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->CCTV_CTLR_ID;
+			pADO->Parameters->ParamByName("p02")->Value = "CCTV";
+			pADO->Parameters->ParamByName("p03")->Value = AObj->CCTV_NM;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCctvCtlrManager::MergeFcltInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCctvCtlrManager::MergeFcltInfo", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCctvCtlrManager::GetNextCctvId(int &ANmbr, int &AId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT NVL(MAX(CCTV_CTLR_NMBR), 10000) + 1 AS NEWID FROM TB_CCTV_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->Prepared = true;
+			pADO->Open();
+            ANmbr = pADO->FieldByName("NEWID")->AsInteger;
+            AId = ANmbr / 10000;
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCctvCtlrManager::GetNextCctvId", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCctvCtlrManager::GetNextCctvId", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TCctvCtlrManager::LoadPreSet(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    FLists.Lock();
+    try
+    {
+        FOR_STL(TCctvCtlr*, pObj, FLists)
+        {
+            pObj->FLists.RemoveAll();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+    sQry = "SELECT B.*                                 \r\n"
+           "  FROM TB_CCTV_CTLR A,                     \r\n"
+           "       TB_CCTV_PSET B                      \r\n"
+           " WHERE A.CCTV_CTLR_NMBR = B.CCTV_CTLR_NMBR \r\n"
+           " ORDER BY B.CCTV_CTLR_NMBR, B.PSET_NMBR    \r\n";
+    try
+    {
+        String CCTV_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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                CCTV_CTLR_NMBR = pADO->FieldByName("CCTV_CTLR_NMBR")->AsString;
+				TCctvCtlr *pCctv = FLists.Find(String(CCTV_CTLR_NMBR));
+                if (!pCctv) continue;
+
+                TCctvPset *pObj = new TCctvPset();
+                if (pObj)
+                {
+                    pObj->CCTV_CTLR_NMBR = CCTV_CTLR_NMBR;
+                    pObj->PSET_NMBR     = pADO->FieldByName("PSET_NMBR")->AsInteger;
+                    pObj->PSET_NM       = pADO->FieldByName("PSET_NM")->AsString;
+                    pObj->PAN           = pADO->FieldByName("PAN")->AsInteger;
+                    pObj->TILT          = pADO->FieldByName("TILT")->AsInteger;
+                    pObj->ZOOM          = pADO->FieldByName("ZOOM")->AsInteger;
+                    pObj->FOCS          = pADO->FieldByName("FOCS")->AsInteger;
+                    pObj->ANGLE         = pADO->FieldByName("ANGLE")->AsInteger;
+                    pObj->DFLT_YN       = pADO->FieldByName("DFLT_YN")->AsString;
+
+                    pObj->DEL_YN         = "N";
+
+                    pCctv->FLists.Push(pObj->PSET_NMBR, pObj);
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TCctvCtlrManager::LoadPreSet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TCctvCtlrManager::LoadPreSet", 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 TCctvCtlrManager::SavePreSet(TCctvCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+sQry = "DELETE FROM TB_CCTV_PSET WHERE CCTV_CTLR_NMBR = :p01";
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->CCTV_CTLR_NMBR;
+			pADO->ExecSQL();
+
+sQry = "INSERT INTO TB_CCTV_PSET(                               \r\n"
+       "        CCTV_CTLR_NMBR,                                 \r\n"
+       "        PSET_NMBR,                                      \r\n"
+       "        PSET_NM,                                        \r\n"
+       "        PAN,                                            \r\n"
+       "        TILT,                                           \r\n"
+       "        ZOOM,                                           \r\n"
+       "        FOCS,                                           \r\n"
+       "        DFLT_YN )                                       \r\n"
+       " VALUES(:p01, :p02, :p03, :p04, :p05, :p06, :p07, :p08) \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            FOR_STL(TCctvPset *, pObj, AObj->FLists)
+            {
+                if (pObj->DEL_YN != "N") continue;
+
+                pADO->Parameters->ParamByName("p01")->Value = pObj->CCTV_CTLR_NMBR;
+                pADO->Parameters->ParamByName("p02")->Value = pObj->PSET_NMBR;
+                pADO->Parameters->ParamByName("p03")->Value = pObj->PSET_NM;
+                pADO->Parameters->ParamByName("p04")->Value = pObj->PAN;
+                pADO->Parameters->ParamByName("p05")->Value = pObj->TILT;
+                pADO->Parameters->ParamByName("p06")->Value = pObj->ZOOM;
+                pADO->Parameters->ParamByName("p07")->Value = pObj->FOCS;
+                pADO->Parameters->ParamByName("p08")->Value = pObj->DFLT_YN;
+
+    			pADO->ExecSQL();
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCctvCtlrManager::SavePreSet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCctvCtlrManager::SavePreSet", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCctvCtlrManager::DeletePreSet(TCctvCtlr *AObj, int APsetNmbr, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    TCctvPset* pObj = AObj->FLists.Find(APsetNmbr);
+    if (!pObj) return false;
+
+    sQry = "DELETE FROM TB_CCTV_PSET WHERE CCTV_CTLR_NMBR = :p01 AND PSET_NMBR = :p02";
+
+    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->CCTV_CTLR_NMBR;
+			pADO->Parameters->ParamByName("p02")->Value = APsetNmbr;
+
+			pADO->ExecSQL();
+
+            pObj->DEL_YN = "Y";
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCctvCtlrManager::DeletePreSet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCctvCtlrManager::DeletePreSet", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCctvCtlrManager::MergePreSet(TCctvCtlr *AObj, TCctvPset* APset, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+    sQry = "MERGE INTO TB_CCTV_PSET L                       \r\n"
+           "USING (SELECT                                   \r\n"
+           "              :p01 AS CCTV_CTLR_NMBR,           \r\n"
+           "              :p02 AS PSET_NMBR,                \r\n"
+           "              :p03 AS PSET_NM,                  \r\n"
+           "              :p04 AS PAN,                      \r\n"
+           "              :p05 AS TILT,                     \r\n"
+           "              :p06 AS ZOOM,                     \r\n"
+           "              :p07 AS FOCS,                     \r\n"
+           "              :p08 AS DFLT_YN                   \r\n"
+           "         FROM DUAL) M                           \r\n"
+           "        ON (L.CCTV_CTLR_NMBR = M.CCTV_CTLR_NMBR \r\n"
+           "        AND L.PSET_NMBR      = M.PSET_NMBR )    \r\n"
+           "WHEN MATCHED THEN                               \r\n"
+           "   UPDATE SET L.PSET_NM = M.PSET_NM,            \r\n"
+           "              L.PAN     = M.PAN,                \r\n"
+           "              L.TILT    = M.TILT,               \r\n"
+           "              L.ZOOM    = M.ZOOM,               \r\n"
+           "              L.FOCS    = M.FOCS,               \r\n"
+           "              L.DFLT_YN = M.DFLT_YN             \r\n"
+           "WHEN NOT MATCHED THEN                           \r\n"
+           "   INSERT (                                     \r\n"
+           "        CCTV_CTLR_NMBR,                         \r\n"
+           "        PSET_NMBR,                              \r\n"
+           "        PSET_NM,                                \r\n"
+           "        PAN,                                    \r\n"
+           "        TILT,                                   \r\n"
+           "        ZOOM,                                   \r\n"
+           "        FOCS,                                   \r\n"
+           "        DFLT_YN )                               \r\n"
+           "   VALUES (                                     \r\n"
+           "        M.CCTV_CTLR_NMBR,                       \r\n"
+           "        M.PSET_NMBR,                            \r\n"
+           "        M.PSET_NM,                              \r\n"
+           "        M.PAN,                                  \r\n"
+           "        M.TILT,                                 \r\n"
+           "        M.ZOOM,                                 \r\n"
+           "        M.FOCS,                                 \r\n"
+           "        M.DFLT_YN )                             \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            FOR_STL(TCctvPset *, pObj, AObj->FLists)
+            {
+                if (pObj->DEL_YN != "N") continue;
+
+                pADO->Parameters->ParamByName("p01")->Value = APset->CCTV_CTLR_NMBR;
+                pADO->Parameters->ParamByName("p02")->Value = APset->PSET_NMBR;
+                pADO->Parameters->ParamByName("p03")->Value = APset->PSET_NM;
+                pADO->Parameters->ParamByName("p04")->Value = APset->PAN;
+                pADO->Parameters->ParamByName("p05")->Value = APset->TILT;
+                pADO->Parameters->ParamByName("p06")->Value = APset->ZOOM;
+                pADO->Parameters->ParamByName("p07")->Value = APset->FOCS;
+                pADO->Parameters->ParamByName("p08")->Value = APset->DFLT_YN;
+
+    			pADO->ExecSQL();
+
+                TCctvPset* pObj = AObj->FLists.Find(APset->PSET_NMBR);
+                if (pObj)
+                {
+                    pObj->CCTV_CTLR_NMBR = APset->CCTV_CTLR_NMBR;
+                    pObj->PSET_NMBR      = APset->PSET_NMBR;
+                    pObj->PSET_NM        = APset->PSET_NM;
+                    pObj->PAN            = APset->PAN;
+                    pObj->TILT           = APset->TILT;
+                    pObj->ZOOM           = APset->ZOOM;
+                    pObj->FOCS           = APset->FOCS;
+                    pObj->DFLT_YN        = APset->DFLT_YN;
+                }
+                else
+                {
+                    AObj->FLists.Push(APset->PSET_NMBR, APset);
+                }
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TCctvCtlrManager::SavePreSet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCctvCtlrManager::SavePreSet", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TCctvCtlrManager::InsCctvControlHs(String ACtlDt, String ACctvNmbr, String ACtlType, String ACtlVal, String ACtlRes, String AUserId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "INSERT INTO TB_CCTV_CTRL_HS(               \r\n"
+           "                          CTRL_DT,         \r\n"
+           "                          CCTV_CTLR_NMBR,  \r\n"
+           "                          CTRL_TYPE,       \r\n"
+           "                          CTRL_VAL,        \r\n"
+           "                          CTRL_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 = ACctvNmbr;
+            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("TCctvCtlrManager::InsCctvControlHs", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TCctvCtlrManager::InsCctvControlHs", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 136 - 0
COMMON/CDS/CDSCctvCtlrF.h

@@ -0,0 +1,136 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSCctvCtlrFH
+#define CDSCctvCtlrFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+#include "CDSObjectF.h"
+//---------------------------------------------------------------------------
+#include "CenterCommF.h"
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+
+class TCctvPset
+{
+public:
+    TCctvPset()
+    {
+        PSET_NMBR = 1;
+        PSET_NM   = "";
+        PAN       = 0;
+        TILT      = 0;
+        ZOOM      = 0;
+        FOCS      = 0;
+        ANGLE     = 0;
+        DFLT_YN   = "N";
+    };
+    ~TCctvPset() {};
+
+private:
+
+public:
+    String  CCTV_CTLR_NMBR;     //	N	NUMBER(10)	    N			CCTV 제어기 번호
+    int     PSET_NMBR;          //	N	NUMBER(4)	    N			프리셋 번호
+    String  PSET_NM;            //	N	VARCHAR2(100)	N			프리셋 명
+    int     PAN;                //	N	NUMBER(4)	    Y	0		팬 값
+    int     TILT;               //	N	NUMBER(4)	    Y	0		틸트 값
+    int     ZOOM;               //	N	NUMBER(4)	    Y	0		줌 값
+    int     FOCS;               //	N	NUMBER(4)	    Y	0		포커스 값
+    int     ANGLE;              //	N	NUMBER(4)	    Y	0		각도 값
+    String  DFLT_YN;            //	N	CHAR(1)	        Y	'N'		디폴트 여부
+
+public:
+    String  DEL_YN;
+
+};
+
+class TCctvCtlr : public TCDSObject
+{
+public:
+    TCctvCtlr();
+    ~TCctvCtlr();
+
+public:
+    String  CCTV_CAPT_IP;       //	N	VARCHAR2(20)	Y			CCTV 자막기 아이피
+    String  CCTV_CAPT_PORT;     //	N	VARCHAR2(5)	    Y			CCTV 자막기 포트
+    String  CCTV_FIBR_IP;       //	N	VARCHAR2(20)	Y			CCTV 광장비 아이피
+    String  CCTV_ENCD_IP;       //	N	VARCHAR2(20)	Y			CCTV 인코더 아이피
+    String  STRM_SVR_IP;        //	N	VARCHAR2(20)	Y			스트리밍 서버 아이피
+    String  STRM_SVR_PORT;      //	N	VARCHAR2(5)	    Y			스트리밍 서버 포트
+    String  STRM_SESN_NM;       //	N	VARCHAR2(200)	Y			스트리밍 세션 명
+    String  STRM_STOR_ADDR;     //	N	VARCHAR2(200)	Y			스트리밍 저장 주소
+    String  STRM_RTSP_ADDR;     //	N	VARCHAR2(200)	Y			스트리밍 RTSP 주소
+    String  STRM_RTMP_ADDR;     //	N	VARCHAR2(200)	Y			스트리밍 RTMP 주소
+    String  STRM_HTTP_ADDR;     //	N	VARCHAR2(200)	Y			스트리밍 HTTP 주소
+    String  INTR_RTSP_ADDR;     //	N	VARCHAR2(200)	Y			내부 RTSP 주소
+    String  INTR_RTMP_ADDR;     //	N	VARCHAR2(200)	Y			내부 RTMP 주소
+    String  INTR_HTTP_ADDR;     //	N	VARCHAR2(200)	Y			내부 HTTP 주소
+    String  CCTV_SBST_IMGN;     //	N	BLOB	        Y			CCTV 대체 영상
+    String  CCTV_SBST_DSPL_YN;  //	N	CHAR(1)	        Y	'N'		CCTV 대체 표출 여부
+    String  SYOP_CNTL_YN;       //	N	CHAR(1)	        Y	'N'		운영자 제어 여부
+    String  CCTV_IP;            //	N	VARCHAR2(20)	Y			목포 CCTV 제어 IP
+    int     CCTV_PORT;          //	N	NUMBER(5)	    Y	1852		목포 CCTV 제어 PORT
+    String  CCTV_ID;            //	N	VARCHAR2(20)	Y	'root'		목포 CCTV 제어 ID
+    String  CCTV_PSWD;          //	N	VARCHAR2(20)	Y	'1234'		목포 CCTV 제어 PSWD
+    int     CCTV_CHNL;          //	N	NUMBER(5)	    Y	1		목포 CCTV 제어 CHANNEL
+
+    INT_CCTV_STATE  STATE;
+
+public:
+    TItsMap<int, TCctvPset*> FLists;
+
+public:
+    __property String  CCTV_CTLR_NMBR     = { read = CTLR_NMBR,     write = CTLR_NMBR     };
+    __property String  CCTV_CTLR_ID       = { read = CTLR_ID,       write = CTLR_ID       };
+    __property String  CCTV_NM            = { read = NAME,          write = NAME          };
+    __property String  CCTV_CTLR_IP       = { read = CTLR_IP,       write = CTLR_IP       };
+    __property int     CCTV_CTLR_PORT     = { read = CTLR_PORT,     write = CTLR_PORT     };
+    __property int     CCTV_CTLR_LOCAL_NO = { read = CTLR_LOCAL_NO, write = CTLR_LOCAL_NO };
+    __property String  CCTV_TYPE_CD       = { read = TYPE_CD,       write = TYPE_CD       };
+
+};
+//---------------------------------------------------------------------------
+typedef std::map<String, TCctvCtlr*>::iterator   CctvIterator;
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+class TCctvCtlrManager
+{
+public:
+    TCctvCtlrManager();
+    ~TCctvCtlrManager();
+
+private:
+	TStream *FImgStream;
+
+public:
+    TItsMap<String, TCctvCtlr*> FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadStatusFromDb(TADOConnection *ADbConn=NULL);
+    bool DeleteCctv(TCctvCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertCctv(TCctvCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool UpdateCctv(TCctvCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeCctv(TCctvCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeFcltInfo(TCctvCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool GetNextCctvId(int &ANmbr, int &AId, TADOConnection *ADbConn=NULL);
+
+    bool LoadPreSet(TADOConnection *ADbConn=NULL);
+    bool SavePreSet(TCctvCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool DeletePreSet(TCctvCtlr *AObj, int APsetNmbr, TADOConnection *ADbConn=NULL);
+    bool MergePreSet(TCctvCtlr *AObj, TCctvPset* APset, TADOConnection *ADbConn=NULL);
+
+    bool InsCctvControlHs(String ACtlDt, String ACctvNmbr, String ACtlType, String ACtlVal, String ACtlRes, String AUserId, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TCctvCtlrManager *CctvCtlrManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 236 - 0
COMMON/CDS/CDSCodeF.cpp

@@ -0,0 +1,236 @@
+//---------------------------------------------------------------------------
+
+#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()
+{
+}
+//---------------------------------------------------------------------------
+TItsSubCode::~TItsSubCode()
+{
+}
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+TItsCode::TItsCode()
+{
+    TItsCode("");
+}
+//---------------------------------------------------------------------------
+TItsCode::TItsCode(String AClsfCd)
+{
+    CMMN_CLSF_CD = AClsfCd;
+    Clear();
+    FModified = false;
+    FCompleted= false;
+}
+//---------------------------------------------------------------------------
+void TItsCode::Clear()
+{
+}
+//---------------------------------------------------------------------------
+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"
+           "  FROM TB_CMMN_CLSF_CD              \r\n"
+           " WHERE USE_YN = 'Y'                 \r\n";
+//           " ORDER BY MSG_TYPE_CD, CMMN_CLSF_CD \r\n";
+
+    FLists.Lock();
+    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->Prepared = true;
+			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;              //''사용 여부';
+
+				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"
+           "  FROM TB_CMMN_CD               \r\n"
+           " WHERE USE_YN = 'Y'             \r\n";
+//           " ORDER BY CMMN_CLSF_CD, CMMN_CD \r\n";
+
+    FLists.Lock();
+    try
+    {
+        TItsCode *pCode = NULL;
+
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			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;
+
+                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;
+}
+//---------------------------------------------------------------------------
+

+ 103 - 0
COMMON/CDS/CDSCodeF.h

@@ -0,0 +1,103 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSCodeFH
+#define CDSCodeFH
+//---------------------------------------------------------------------------
+
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "ITSLibF.h"
+#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',        '사용 여부';
+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',                                            '사용 여부';
+
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    TItsMap<String, TItsSubCode*>    FSubLists;
+};
+//---------------------------------------------------------------------------
+
+/*
+* Code Manager
+*/
+class TItsCodeManager
+{
+public:
+    TItsCodeManager();
+    virtual ~TItsCodeManager();
+
+public:
+    TItsMap<String, 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->Prepared = true;
+			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 "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+#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:
+    TItsMap<String, TItsColSys*>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsColSysManager *ItsColSysManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 127 - 0
COMMON/CDS/CDSColtSysF.cpp

@@ -0,0 +1,127 @@
+//---------------------------------------------------------------------------
+
+#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->Prepared = true;
+			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 "ITSLibF.h"
+#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:
+    TItsMap<String, TItsCompany*>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsCompanyManager *ItsCompanyManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 21 - 0
COMMON/CDS/CDSCoordF.cpp

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

+ 44 - 0
COMMON/CDS/CDSCoordF.h

@@ -0,0 +1,44 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSCoordFH
+#define CDSCoordFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  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
+

+ 118 - 0
COMMON/CDS/CDSDatabaseF.cpp

@@ -0,0 +1,118 @@
+//---------------------------------------------------------------------------
+
+#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";
+
+    FLists.Lock();
+    try
+    {
+        //FLists.RemoveAll();
+        FOR_STL(TItsDatabase*, pTmp, FLists)
+        {
+            pTmp->Completed = false;
+        }
+
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String TABLESPACE_NAME = pADO->FieldByName("TABLESPACE_NAME")->AsString;
+
+				TItsDatabase *pObj = FLists.Find(TABLESPACE_NAME);
+                if (!pObj)
+                {
+                    pObj = new TItsDatabase();
+                    pObj->TABLESPACE_NAME = TABLESPACE_NAME;
+
+    				FLists.Push(pObj->TABLESPACE_NAME, pObj);
+                }
+
+                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;
+
+                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 "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  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:
+    TItsMap<String, 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->Prepared = true;
+			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 "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+
+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;
+    TItsMap<String, TItsEvent*> FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+
+    bool LoadBlackBoxEvent(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsEventManager *ItsEventManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 314 - 0
COMMON/CDS/CDSFacilityCodeF.cpp

@@ -0,0 +1,314 @@
+//---------------------------------------------------------------------------
+
+#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->Prepared = true;
+			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->Prepared = true;
+			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->Prepared = true;
+			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->Prepared = true;
+			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 "ITSLibF.h"
+#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;     // 장애 발생 코드 명
+
+    TItsMap<String, 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;           // 시설물 유형
+
+    TItsMap<String, 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:
+    TItsMap<String, TFacilityEqpmType*>  FLists;
+    TItsMap<String, 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
+

+ 2188 - 0
COMMON/CDS/CDSFacilityF.cpp

@@ -0,0 +1,2188 @@
+//---------------------------------------------------------------------------
+
+#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;
+
+        FRseLists.Lock();
+
+        FAviLists.Lock();
+        FDsrcLists.Lock();
+
+        FBitLists.Lock();
+        FSigLists.Lock();
+        FSigDetLists.Lock();
+
+        FPisLists.Lock();
+        FPcsLists.Lock();
+
+        FRegLists.Lock();
+        FLists.Lock();
+
+        FRseLists.RemoveAll();
+
+        FAviLists.RemoveAll();
+        FDsrcLists.RemoveAll();
+
+        FBitLists.RemoveAll();
+        FSigLists.RemoveAll();
+        FSigDetLists.RemoveAll();
+
+        FPisLists.RemoveAll();
+        FPcsLists.RemoveAll();
+
+        FRegLists.RemoveAll();
+        FLists.RemoveAll();
+    }
+    __finally
+    {
+        FRseLists.UnLock();
+
+        FAviLists.UnLock();
+        FDsrcLists.UnLock();
+
+        FBitLists.UnLock();
+        FSigLists.UnLock();
+        FSigDetLists.UnLock();
+
+        FPisLists.UnLock();
+        FPcsLists.UnLock();
+
+        FRegLists.UnLock();
+        FLists.UnLock();
+    }
+
+    LoadFacilityReg(ADbConn);       // 시설물 개별 테이블 조회(ID, NAME 등)
+    LoadFacilityMaster(ADbConn);    // TB_FCLT_INFR
+
+    LoadFacilityVds(ADbConn);
+    LoadFacilityCctv(ADbConn);
+    LoadFacilityVms(ADbConn);
+
+    LoadFacilityWebCam(ADbConn);
+    LoadFacilityCrsCam(ADbConn);
+    LoadFacilityPark(ADbConn);
+
+#ifdef USE_RSE
+    LoadFacilityRse(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
+
+    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
+#if 0
+           "UNION                                                                                       \r\n"
+           "SELECT 'CCTV' AS FAC_TYPE, CCTV_CTLR_ID AS FAC_ID, CCTV_NM AS FAC_NM, DEL_YN                \r\n"
+           "  FROM TB_CCTV_CTLR                                                                         \r\n"
+           " WHERE DEL_YN = 'N'                                                                         \r\n"
+#else
+           "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
+#endif
+#ifdef USE_VDS
+           "UNION                                                                                       \r\n"
+           "SELECT 'VDS' AS FAC_TYPE, VDS_CTLR_ID AS FAC_ID, VDS_NM AS FAC_N, DEL_YN                    \r\n"
+           "  FROM TB_VDS_CTLR                                                                          \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_WCAM
+           "UNION                                                                                       \r\n"
+           "SELECT 'WCAM' AS FAC_TYPE, WCAM_CTLR_ID AS FAC_ID, WCAM_NM AS FAC_NM, DEL_YN                \r\n"
+           "  FROM TB_WCAM_CTLR                                                                         \r\n"
+           " WHERE DEL_YN = 'N'                                                                         \r\n"
+#endif
+#ifdef USE_CCAM
+           "UNION                                                                                       \r\n"
+           "SELECT 'CCAM' AS FAC_TYPE, CCAM_CTLR_ID AS FAC_ID, CCAM_NM AS FAC_NM, DEL_YN                \r\n"
+           "  FROM TB_CCAM_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_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, PRLT_CTLR_ID AS FAC_ID, PRLT_NM AS FAC_NM, DEL_YN                \r\n"
+           "  FROM TB_PRLT_CTLR                                                                         \r\n"
+           " WHERE DEL_YN = 'N'                                                                         \r\n"
+#endif
+            ;
+
+    FRegLists.Lock();
+    try
+    {
+        FRegLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			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";
+
+    TFacilityStatus *pStatus;
+
+    FListStatus.Lock();
+    FLists.Lock();
+    try
+    {
+        FListStatus.RemoveAll();
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			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;
+
+                pFacility->Object = NULL;
+
+				FLists.Push(pFacility->FCLT_ID, pFacility);
+                pFacility->Completed = true;
+
+                String FCLT_TYPE = pFacility->FCLT_TYPE;
+                if (FCLT_TYPE == "VDS" && pFacility->FCLT_ID.Pos("VDC"))
+                {
+                    FCLT_TYPE = "CRSSVR";
+                }
+                pStatus = FListStatus.Find(FCLT_TYPE);
+                if (!pStatus)
+                {
+                    pStatus = new TFacilityStatus();
+                    pStatus->Type   = FCLT_TYPE;
+                    pStatus->Total  = 0;
+                    pStatus->Normal = 0;
+                    pStatus->Error  = 0;
+                    pStatus->Module = 0;
+                    pStatus->Collect= 0;
+
+                    FListStatus.Push(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*/)
+{
+    if (!WCamCtlrManager)
+    {
+        WCamCtlrManager = new TWCamCtlrManager();
+    }
+
+#ifdef USE_WCAM
+    TItsFacility *pFacility;
+
+    WCamCtlrManager->LoadFromDb();
+    FOR_STL(TWCamCtlr*, pObj, WCamCtlrManager->FLists)
+    {
+        if (pObj->DEL_YN == "Y") continue;
+        pFacility = FLists.Find(pObj->WCAM_CTLR_ID);
+        if (!pFacility) continue;
+
+        pFacility->Object = pObj;
+    }
+#endif
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityCrsCam(TADOConnection *ADbConn/*=NULL*/)
+{
+    if (!CCamCtlrManager)
+    {
+        CCamCtlrManager = new TCCamCtlrManager();
+    }
+
+#ifdef USE_CCAM
+    TItsFacility *pFacility;
+
+    CCamCtlrManager->LoadFromDb();
+    FOR_STL(TCCamCtlr*, pObj, CCamCtlrManager->FLists)
+    {
+        if (pObj->DEL_YN == "Y") continue;
+        pFacility = FLists.Find(pObj->CCAM_CTLR_ID);
+        if (!pFacility) continue;
+
+        pFacility->Object = pObj;
+        pFacility->FCLT_KIND = pObj->TYPE_CD;
+    }
+#endif
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityCctv(TADOConnection *ADbConn/*=NULL*/)
+{
+    if (!CctvCtlrManager)
+    {
+        CctvCtlrManager = new TCctvCtlrManager();
+    }
+
+#ifdef USE_CCTV
+    TItsFacility *pFacility;
+
+    CctvCtlrManager->LoadFromDb();
+    FOR_STL(TCctvCtlr*, pObj, CctvCtlrManager->FLists)
+    {
+        if (pObj->DEL_YN == "Y") continue;
+        pFacility = FLists.Find(pObj->CCTV_CTLR_ID);
+        if (!pFacility) continue;
+
+        pFacility->Object = pObj;
+        pFacility->FCLT_KIND = pObj->TYPE_CD;
+    }
+#endif
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityVms(TADOConnection *ADbConn/*=NULL*/)
+{
+    if (!VmsCtlrManager)
+    {
+        VmsCtlrManager = new TVmsCtlrManager();
+    }
+
+#ifdef USE_VMS
+    TItsFacility *pFacility;
+
+    VmsCtlrManager->LoadVmsSize();
+    VmsCtlrManager->LoadFromDb();
+    VmsCtlrManager->LoadVmsFormUsage();
+    VmsCtlrManager->LoadIfscRltn();
+    FOR_STL(TVmsCtlr*, pObj, VmsCtlrManager->FLists)
+    {
+        if (pObj->DEL_YN == "Y") continue;
+        pFacility = FLists.Find(pObj->VMS_CTLR_ID);
+        if (!pFacility) continue;
+
+        pFacility->Object = pObj;
+        pFacility->FCLT_KIND = pObj->TYPE_CD;
+    }
+#endif
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TItsFacilityManager::LoadFacilityVds(TADOConnection *ADbConn/*=NULL*/)
+{
+    if (!VdsCtlrManager)
+    {
+        VdsCtlrManager = new TVdsCtlrManager();
+    }
+
+#ifdef USE_VDS
+    TItsFacility *pFacility;
+
+    VdsCtlrManager->LoadFromDb();
+    VdsCtlrManager->LoadFromDtctDb();
+    FOR_STL(TVdsCtlr*, pObj, VdsCtlrManager->FLists)
+    {
+        if (pObj->DEL_YN == "Y") continue;
+        pFacility = FLists.Find(pObj->VDS_CTLR_ID);
+        if (!pFacility) continue;
+
+        pFacility->Object = pObj;
+        pFacility->FCLT_KIND = pObj->TYPE_CD;
+    }
+#endif
+    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->Prepared = true;
+			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::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"
+           "  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->Prepared = true;
+			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;
+
+				//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->Prepared = true;
+			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->Prepared = true;
+			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->Prepared = true;
+			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->Prepared = true;
+			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->Prepared = true;
+			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->Prepared = true;
+			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*/)
+{
+    if (!PrltCtlrManager)
+    {
+        PrltCtlrManager = new TPrltCtlrManager();
+    }
+
+#ifdef USE_PARK
+    TItsFacility *pFacility;
+
+    TFacilityStatus *pStatus = FListStatus.Find("PARK");
+    if (pStatus)
+    {
+        pStatus->Total  = 0;
+        pStatus->Normal = 0;
+        pStatus->Error  = 0;
+        pStatus->Module = 0;
+        pStatus->Collect= 0;
+    }
+
+    PrltCtlrManager->LoadFromDb();
+    FOR_STL(TPrltCtlr*, pObj, PrltCtlrManager->FLists)
+    {
+        if (pObj->DEL_YN == "Y") continue;
+        pFacility = FLists.Find(pObj->PRLT_CTLR_ID);
+        if (!pFacility) continue;
+
+        pFacility->Object = pObj;
+        pFacility->FCLT_KIND = pObj->REAL_DATA_YN;  //실시간주차정보제공여부
+
+        //주차장중에 실시간정보를 수집하는 것만 상태정보 범례를 표출하자
+        if (pObj->REAL_DATA_YN == "Y")
+        {
+            if (pStatus)
+            {
+                pStatus->Total++;   /* 전체 갯수를 증가 시킴 */
+            }
+        }
+    }
+#endif
+    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
+#if 0
+                   "UNION                                                                            \r\n"
+                   "SELECT 'CCTV' AS FAC_TYPE, B.CCTV_CTLR_ID AS FAC_ID,                             \r\n"
+                   "       CONN_STTS_CD AS STTS_CD, 'CDS0' AS DOOR_STTS_CD,                          \r\n"
+                   "       DECODE(CONN_STTS_CD, 'CMS0', '0', 'CMS1', '1', '2') 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_CCTV_CTLR_STTS A, TB_CCTV_CTLR B                                       \r\n"
+                   " WHERE A.CCTV_CTLR_NMBR = B.CCTV_CTLR_NMBR                                       \r\n"
+                   "   AND A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+#else
+                   "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', '1', 'CMS1', '0', '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 UPDT_DT >= TO_CHAR(SYSDATE-2/1440, 'YYYYMMDDHH24MISS')                    \r\n"
+#endif
+#endif
+#ifdef USE_WCAM
+                   "UNION                                                                            \r\n"
+                   "SELECT 'WCAM' AS FAC_TYPE, B.WCAM_CTLR_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_WCAM_CTLR_STTS A, TB_WCAM_CTLR B                                       \r\n"
+                   " WHERE A.WCAM_CTLR_NMBR = B.WCAM_CTLR_NMBR                                       \r\n"
+                   "   AND A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+#endif
+#ifdef USE_CCAM
+                   "UNION                                                                         \r\n"
+                   "SELECT 'CCAM' AS FAC_TYPE, B.CCAM_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_CCAM_CTLR_STTS A, TB_CCAM_CTLR B                                    \r\n"
+                   " WHERE A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')               \r\n"
+                   "   AND A.CCAM_CTLR_NMBR = B.CCAM_CTLR_NMBR                                    \r\n"
+#endif
+#ifdef USE_VMS
+#if 0
+                   "UNION                                                                            \r\n"
+                   "SELECT 'VMS' AS FAC_TYPE, B.VMS_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_VMS_CTLR_STTS A, TB_VMS_CTLR B                                         \r\n"
+                   " WHERE A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR                                         \r\n"
+                   "   AND A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS')                  \r\n"
+#else
+                   "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
+#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.VDS_CTLR_NMBR = B.VDS_CTLR_NMBR                                      \r\n"
+#endif
+#ifdef USE_AVI
+                   "UNION                                                                            \r\n"
+                   "SELECT 'AVI' AS FAC_TYPE, B.AVI_ID AS FAC_ID,                                    \r\n"
+                   "       CONN_STTS_CD AS STTS_CD, CBOX_DOOR_STTS_CD AS DOOR_STTS_CD,               \r\n"
+                   "       DECODE(CONN_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.PRLT_CTLR_ID 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.PRLT_CTLR_NMBR = B.PRLT_CTLR_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;
+                pObj->FCollError   = false;
+            }
+            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->Prepared = true;
+            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)
+        {
+            String FCLT_TYPE = pTmpObj->FCLT_TYPE;
+            if (FCLT_TYPE == "VDS" && pTmpObj->FCLT_KIND == "C")
+            {
+                FCLT_TYPE = "CRSSVR";
+            }
+            pStatus = ItsFacilityManager->FListStatus.Find(FCLT_TYPE);
+            if (!pStatus) continue;
+
+            if (FCLT_TYPE == "PARK" && pTmpObj->FCLT_KIND == "N")
+            {
+                //주차장이면서 실시간정보를 제공하지않는경우 통신정상으로 설정
+                pTmpObj->FComm = state_default;
+                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;
+        }
+
+        //각각의 제어기에 대한 상태정보를 업데이트 한다.
+        TItsFacility *pFacility;
+        FOR_STL(TWCamCtlr*, pObj, WCamCtlrManager->FLists)
+        {
+            if (pObj->DEL_YN == "Y") continue;
+            pFacility = ItsFacilityManager->FLists.Find(pObj->WCAM_CTLR_ID);
+            if (pFacility)
+            {
+                pObj->STATE.Comm = pFacility->FComm != state_error ? wcam_normal : wcam_error;
+            }
+        }
+
+        FOR_STL(TCCamCtlr*, pObj, CCamCtlrManager->FLists)
+        {
+            if (pObj->DEL_YN == "Y") continue;
+            pFacility = ItsFacilityManager->FLists.Find(pObj->CCAM_CTLR_ID);
+            if (pFacility)
+            {
+                pObj->STATE.Comm = pFacility->FComm != state_error ? ccam_normal : ccam_error;
+            }
+        }
+
+        FOR_STL(TVdsCtlr*, pObj, VdsCtlrManager->FLists)
+        {
+            if (pObj->DEL_YN == "Y") continue;
+            pFacility = ItsFacilityManager->FLists.Find(pObj->VDS_CTLR_ID);
+            if (pFacility)
+            {
+                pObj->STATE.Comm = pFacility->FComm != state_error ? vds_normal : vds_error;
+            }
+        }
+
+        FOR_STL(TVmsCtlr*, pObj, VmsCtlrManager->FLists)
+        {
+            if (pObj->DEL_YN == "Y") continue;
+            pFacility = ItsFacilityManager->FLists.Find(pObj->VMS_CTLR_ID);
+            if (pFacility)
+            {
+                pObj->STATE.Comm = pFacility->FComm != state_error ? vms_comm_normal : vms_comm_error;
+            }
+        }
+
+        FOR_STL(TPrltCtlr*, pObj, PrltCtlrManager->FLists)
+        {
+            if (pObj->DEL_YN == "Y") continue;
+            pFacility = ItsFacilityManager->FLists.Find(pObj->PRLT_CTLR_ID);
+            if (pFacility)
+            {
+                pObj->STATE.Comm = pFacility->FComm != state_error ? park_comm_normal : park_comm_error;
+            }
+        }
+
+        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->Prepared = true;
+            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_CLCT_PNST A,                                 \r\n"
+           "       TB_VDS_DTCT           B,                                 \r\n"
+           "       TB_VDS_CTLR           C                                  \r\n"
+           " WHERE A.CLCT_DT > TO_CHAR(SYSDATE-1/24, 'YYYYMMDDHH24MISS')    \r\n"
+           "   AND A.VDS_DTCT_NMBR = B.VDS_DTCT_NMBR                        \r\n"
+           "   AND B.VDS_CTLR_NMBR = C.VDS_CTLR_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->Prepared = true;
+            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->Prepared = true;
+            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->Prepared = true;
+            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::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->Prepared = true;
+            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;
+}
+//---------------------------------------------------------------------------
+

+ 414 - 0
COMMON/CDS/CDSFacilityF.h

@@ -0,0 +1,414 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSFacilityFH
+#define CDSFacilityFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+#include "CDSDsrcF.h"
+#include "CDSVdsCtlrF.h"
+#include "CDSAviF.h"
+//#include "CDSParkingF.h"
+#include "CDSEventF.h"
+#include "CDSVmsCtlrF.h"
+#include "CDSPrltCtlrF.h"
+#include "CDSCctvCtlrF.h"
+#include "CDSWCamCtlrF.h"
+#include "CDSCCamCtlrF.h"
+//---------------------------------------------------------------------------
+
+#define state_normal    "0"
+#define state_error     "1"
+#define state_module    "2"
+#define state_unknown   "3"
+#define state_collect   "4"
+#define state_default   "5"
+
+/*
+*  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;
+};
+//---------------------------------------------------------------------------
+
+/*
+*  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'		삭제 여부
+};
+//---------------------------------------------------------------------------
+
+/*
+*  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 FCLT_KIND;
+
+    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;
+
+    TCDSObject *Object;
+    String      FOldComm;
+
+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;
+
+    TItsMap<String, TItsFacility*>       FLists;
+
+    TItsMap<String, TItsRse*>            FRseLists;
+
+    TItsMap<String, TItsAvi*>            FAviLists;
+    TItsMap<String, TItsDsrc*>           FDsrcLists;
+
+    TItsMap<String, TItsBit*>            FBitLists;
+    TItsMap<String, TItsSig*>            FSigLists;
+    TItsMap<String, TItsSigDet*>         FSigDetLists;
+
+    TItsMap<String, TItsPis*>            FPisLists;
+    TItsMap<String, TItsPcs*>            FPcsLists;
+
+    TItsMap<String, TItsRegFacility*>    FRegLists;
+
+    TItsMap<String, 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 LoadFacilityCrsCam(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 LoadAviCollectStatusFromDb_OLD(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsFacilityManager *ItsFacilityManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 2274 - 0
COMMON/CDS/CDSFacilityF_back.cpp

@@ -0,0 +1,2274 @@
+//---------------------------------------------------------------------------
+
+#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
+

+ 402 - 0
COMMON/CDS/CDSFacilityFailF.cpp

@@ -0,0 +1,402 @@
+//---------------------------------------------------------------------------
+
+#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->Prepared = true;
+			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->Prepared = true;
+			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->Prepared = true;
+			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->Prepared = true;
+			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 "ITSLibF.h"
+#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;
+
+    TItsMap<String, 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:
+    TItsMap<String, 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;
+    TItsMap<String, TItsFacilityFailAction*> FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadFromDbFailAction(String AKeySeq, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsFacilityFailActionManager *ItsFacilityFailActionManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 203 - 0
COMMON/CDS/CDSFontF.cpp

@@ -0,0 +1,203 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSFontF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+
+//---------------------------------------------------------------------------
+TCDSFontName::TCDSFontName()
+{
+}
+//---------------------------------------------------------------------------
+
+TCDSFontName::~TCDSFontName()
+{
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TCDSFontColor::TCDSFontColor()
+{
+}
+//---------------------------------------------------------------------------
+
+TCDSFontColor::~TCDSFontColor()
+{
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+TCDSFontManager *CDSFontManager = NULL;
+//---------------------------------------------------------------------------
+
+TCDSFontManager::TCDSFontManager()
+{
+}
+//---------------------------------------------------------------------------
+TCDSFontManager::~TCDSFontManager()
+{
+    FNames.RemoveAll();
+    FColors.RemoveAll();
+}
+//---------------------------------------------------------------------------
+int TCDSFontManager::GetColorCode(int AColor)
+{
+    FOR_STL(TCDSFontColor*, pObj, FColors)
+    {
+        if (AColor == pObj->VMS_FONT_COLR_VAL) return pObj->VMS_FONT_COLR_CD;
+    }
+    return 0;
+}
+//---------------------------------------------------------------------------
+int TCDSFontManager::GetColorCodeIndex(int ACode)
+{
+    int nIdx = 0;
+    FOR_STL(TCDSFontColor*, pObj, FColors)
+    {
+        if (ACode == pObj->VMS_FONT_COLR_CD) return nIdx;
+        nIdx++;
+    }
+    return 0;
+}
+//---------------------------------------------------------------------------
+int TCDSFontManager::LoadFontInfo(TADOConnection *ADbConn)
+{
+    if(LoadFontNameInfo(ADbConn) < 0)
+    {
+        return -1;
+    }
+
+    return LoadFontColorInfo(ADbConn);
+}
+//---------------------------------------------------------------------------
+int TCDSFontManager::LoadFontNameInfo(TADOConnection *ADbConn)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+    int        nSelCnt = 0;
+
+    sQry = "SELECT A.*                  \r\n"
+           "  FROM TB_VMS_FONT_NAME  A  \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Connection = ADbConn;
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                int VMS_FONT_NAME_CD = pADO->FieldByName("VMS_FONT_NAME_CD")->AsInteger;
+
+				TCDSFontName *pObj = FNames.Find(VMS_FONT_NAME_CD);
+                if (!pObj)
+                {
+                    pObj = new TCDSFontName();
+                    pObj->VMS_FONT_NAME_CD = VMS_FONT_NAME_CD;
+                    FNames.Push(pObj->VMS_FONT_NAME_CD, pObj);
+                }
+
+                pObj->VMS_FONT_NAME_NM = pADO->FieldByName("VMS_FONT_NAME_NM")->AsString.Trim();
+                pObj->USE_YN           = pADO->FieldByName("USE_YN")->AsString.Trim();
+                nSelCnt++;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TCDSFontManager::LoadFontNameInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TCDSFontManager::LoadFontNameInfo", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return nSelCnt;
+}
+//---------------------------------------------------------------------------
+int TCDSFontManager::LoadFontColorInfo(TADOConnection *ADbConn)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+    int        nSelCnt = 0;
+
+    sQry = "SELECT A.*                  \r\n"
+           "  FROM TB_VMS_FONT_COLR  A  \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Connection = ADbConn;
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                int VMS_FONT_COLR_CD = pADO->FieldByName("VMS_FONT_COLR_CD")->AsInteger;
+
+				TCDSFontColor *pObj = FColors.Find(VMS_FONT_COLR_CD);
+                if (!pObj)
+                {
+                    pObj = new TCDSFontColor();
+                    pObj->VMS_FONT_COLR_CD = VMS_FONT_COLR_CD;
+                    FColors.Push(pObj->VMS_FONT_COLR_CD, pObj);
+                }
+
+                pObj->VMS_FONT_COLR_NM  = pADO->FieldByName("VMS_FONT_COLR_NM")->AsString.Trim();
+                pObj->VMS_FONT_COLR_VAL = pADO->FieldByName("VMS_FONT_COLR_VAL")->AsInteger;
+                pObj->USE_YN            = pADO->FieldByName("USE_YN")->AsString.Trim();
+                nSelCnt++;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TCDSFontManager::LoadFontColorInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TCDSFontManager::LoadFontColorInfo", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return nSelCnt;
+}
+//---------------------------------------------------------------------------

+ 67 - 0
COMMON/CDS/CDSFontF.h

@@ -0,0 +1,67 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSFontFH
+#define CDSFontFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+class TCDSFontName
+{
+public:
+    TCDSFontName();
+    ~TCDSFontName();
+
+public:
+    int         VMS_FONT_NAME_CD;   //	N	NUMBER(3)	    N	0		VMS 글꼴 명칭 코드
+    AnsiString  VMS_FONT_NAME_NM;   //	N	VARCHAR2(60)	Y			VMS 글꼴 명칭
+    AnsiString  USE_YN;             //	N	CHAR(1)	        Y	'N'		사용 여부
+};
+//---------------------------------------------------------------------------
+
+class TCDSFontColor
+{
+public:
+    TCDSFontColor();
+    ~TCDSFontColor();
+
+public:
+    int         VMS_FONT_COLR_CD;   //	N	NUMBER(3)	    N	0		VMS 글꼴 색상 코드
+    AnsiString  VMS_FONT_COLR_NM;   //	N	VARCHAR2(60)	Y			VMS 글꼴 색상 명칭
+    int         VMS_FONT_COLR_VAL;  //	N	NUMBER(10)	    Y			VMS 글꼴 색상 값
+    AnsiString  USE_YN;             //	N	CHAR(1)	        Y	'N'		사용 여부
+};
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+class TCDSFontManager
+{
+public:
+    TCDSFontManager();
+    ~TCDSFontManager();
+
+private:
+
+public:
+    TItsMap<int, TCDSFontName*>  FNames;
+    TItsMap<int, TCDSFontColor*> FColors;
+
+public:
+    int LoadFontInfo(TADOConnection *ADbConn=NULL);
+    int LoadFontNameInfo(TADOConnection *ADbConn=NULL);
+    int LoadFontColorInfo(TADOConnection *ADbConn=NULL);
+    int GetColorCode(int AColor);
+    int GetColorCodeIndex(int ACode);
+};
+//---------------------------------------------------------------------------
+extern TCDSFontManager *CDSFontManager;
+//---------------------------------------------------------------------------
+
+
+#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->Prepared = true;
+			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 "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  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:
+    TItsMap<String, TItsHoliday*>    FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsHolidayManager *ItsHolidayManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 407 - 0
COMMON/CDS/CDSIfscF.cpp

@@ -0,0 +1,407 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSIfscF.h"
+#include "CDSLayerF.h"
+#include "ITSUtilF.h"
+#include "AppGlobalF.h"
+#include "CDSLinkF.h"
+#include "CDSLayerF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsIfsc::TItsIfsc()
+{
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsIfsc::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsIfsc::~TItsIfsc()
+{
+    FLinks.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 (LoadIfsc(ADbConn) && LoadLinkList(ADbConn));
+}
+//---------------------------------------------------------------------------
+bool TItsIfscManager::LoadIfsc(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";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                TItsIfsc *pIfsc = new TItsIfsc();
+
+                pIfsc->IsVertex          = false;
+                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;
+                //pIfsc->REGN_YN          = "Y";
+
+                FLists.Push(pIfsc->IFSC_ID, pIfsc);
+                pIfsc->Completed = true;
+
+                pIfsc->TRAF = new TCDSTraffic();
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIfscManager::LoadIfsc", 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::LoadIfsc", 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_RLTN_LINK     \r\n";
+
+    TItsIfsc *pIfsc = NULL;
+    TItsLink *pLink;
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+            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->FLinks.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->FLinks.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 LoadVrtxFromDb(ADbConn);
+}
+//---------------------------------------------------------------------------
+bool TItsIfscManager::LoadVrtxFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT A.IFSC_ID, A.LEVL,           \r\n"
+           "       A.X_CRDN_ARR, A.Y_CRDN_ARR   \r\n"
+           "  FROM TB_IFSC_VRTX_ARR A,          \r\n"
+           "       TB_IFSC          B           \r\n"
+           " WHERE B.DEL_YN  = 'N'              \r\n"
+           "   AND B.IFSC_ID = A.IFSC_ID        \r\n"
+           "   AND A.LEVL    = 3                \r\n";
+#else
+    sQry = "SELECT *                 \r\n"
+           "  FROM VW_IFSC_VRTX_ARR  \r\n";
+#endif
+
+    TItsIfsc* pObj;
+//    int       LEVL;
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String IFSC_ID = pADO->FieldByName("IFSC_ID")->AsString;
+                pObj = FLists.Find(IFSC_ID);
+                if (!pObj) continue;
+
+#if 0
+                LEVL = pADO->FieldByName("LEVL")->AsInteger;
+                TItsVrtx* pVrtx = new TItsVrtx();
+                pVrtx->X_CRDN_ARR = pADO->FieldByName("X_CRDN_ARR")->AsString;
+                pVrtx->Y_CRDN_ARR = pADO->FieldByName("Y_CRDN_ARR")->AsString;
+
+				pObj->Vrtxs.Push(LEVL, pVrtx);
+#else
+                pObj->IsVertex   = true;
+                pObj->X_CRDN_ARR = pADO->FieldByName("X_CRDN_ARR")->AsString;
+                pObj->Y_CRDN_ARR = pADO->FieldByName("Y_CRDN_ARR")->AsString;
+#endif
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsIfscManager::LoadVrtxFromDb", 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("TItsIfscManager::LoadVrtxFromDb", 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 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";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			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 == "LTC0") pObj->TRAF->MISSING = "Y";
+
+                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;
+}
+//---------------------------------------------------------------------------
+

+ 98 - 0
COMMON/CDS/CDSIfscF.h

@@ -0,0 +1,98 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSIfscFH
+#define CDSIfscFH
+//---------------------------------------------------------------------------
+
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+#include "CDSLayerF.h"
+#include "CDSObjectF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  IFSC class
+*/
+class TItsIfsc
+{
+public:
+    TItsIfsc();
+    virtual ~TItsIfsc();
+    void Clear();
+
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String  IFSC_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  LINK_ID;
+    String  ROAD_ID;
+
+    TCDSTraffic             *TRAF;
+    TItsMap<int, TItsVrtx*>  Vrtxs;
+
+    bool   IsVertex;
+    String X_CRDN_ARR;
+    String Y_CRDN_ARR;
+    int    SPED;
+    int    TRAF_GRAD;
+
+    std::map<int, String>    FLinks;
+
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    void InitTraffic();
+};
+//---------------------------------------------------------------------------
+
+
+/*
+* IFSC Manager
+*/
+class TItsIfscManager
+{
+public:
+    TItsIfscManager();
+    virtual ~TItsIfscManager();
+
+public:
+    TItsMap<String, TItsIfsc*>  FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadVrtxFromDb(TADOConnection *ADbConn=NULL);
+
+    bool LoadIfsc(TADOConnection *ADbConn=NULL);
+    bool LoadLinkList(TADOConnection *ADbConn=NULL);
+
+    void InitTraffic();
+    bool LoadTraffic(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsIfscManager *ItsIfscManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 287 - 0
COMMON/CDS/CDSIfsc_VMSF.cpp

@@ -0,0 +1,287 @@
+//---------------------------------------------------------------------------
+
+#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()
+{
+    FLists.Lock();
+    try
+    {
+        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";
+
+    FLists.Lock();
+    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 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			지역 코드
+
+                pObj->vertex = false;
+				FLists.Push(pObj->IFSC_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TIfscManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TIfscManager::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 TIfscManager::LoadVertexFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT B.IFSC_ID,                  \r\n"
+           "       B.X_CRDN_ARR, B.Y_CRDN_ARR  \r\n"
+           "  FROM TB_IFSC          A,         \r\n"
+           "       TB_IFSC_VRTX_ARR B          \r\n"
+           " WHERE A.DEL_YN  = 'N'             \r\n"
+           "   AND A.IFSC_ID = B.IFSC_ID       \r\n"
+           "   AND B.LEVL    = 2               \r\n";
+#else
+    sQry = "SELECT *                 \r\n"
+           "  FROM VW_IFSC_VRTX_ARR  \r\n";
+#endif
+
+    FLists.Lock();
+    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 IFSC_ID = pADO->FieldByName("IFSC_ID")->AsString;
+
+				TIfsc *pObj = FLists.Find(IFSC_ID);
+                if (pObj)
+                {
+                    pObj->vertex     = true;
+                    pObj->X_CRDN_ARR = pADO->FieldByName("X_CRDN_ARR")->AsString;
+                    pObj->Y_CRDN_ARR = pADO->FieldByName("Y_CRDN_ARR")->AsString;
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TIfscManager::LoadVertexFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TIfscManager::LoadVertexFromDb", 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
+
+    FLists.Lock();
+    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 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;
+}
+//---------------------------------------------------------------------------
+

+ 74 - 0
COMMON/CDS/CDSIfsc_VMSF.h

@@ -0,0 +1,74 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSIfsc_VMSFH
+#define CDSIfsc_VMSFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#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		데이터 개수
+
+    bool   vertex;
+    String X_CRDN_ARR;
+    String Y_CRDN_ARR;
+
+    void InitTraffic();
+};
+//---------------------------------------------------------------------------
+
+class TIfscManager
+{
+public:
+    TIfscManager();
+    ~TIfscManager();
+
+private:
+
+public:
+
+    TItsMap<String, TIfsc*> FLists;
+
+public:
+    void InitTraffic();
+
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadVertexFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadTraffic(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TIfscManager *IfscManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 839 - 0
COMMON/CDS/CDSIncidentF.cpp

@@ -0,0 +1,839 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSIncidentF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsIncident::TItsIncident()
+{
+    FMarker = NULL;
+
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsIncident::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsIncident::~TItsIncident()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+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";
+
+    FLists.Lock();
+    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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsIncident *pObj = new TItsIncident();
+
+                pObj->INCD_OCRR_ID          = pADO->FieldByName("INCD_OCRR_ID")->AsString;
+                pObj->RGST_DT               = pADO->FieldByName("RGST_DT")->AsString;
+                pObj->INCD_ORGN_CD          = pADO->FieldByName("INCD_ORGN_CD")->AsString;
+                pObj->OCRR_LCTN_NM          = pADO->FieldByName("OCRR_LCTN_NM")->AsString;
+                pObj->X_CRDN                = pADO->FieldByName("X_CRDN")->AsString;
+                pObj->Y_CRDN                = pADO->FieldByName("Y_CRDN")->AsString;
+                pObj->INCD_EXPL             = pADO->FieldByName("INCD_EXPL")->AsString;
+                pObj->CMTR_GRAD_CD          = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+                pObj->IFMR_NM               = pADO->FieldByName("IFMR_NM")->AsString;
+                pObj->INCD_CNFM_MTHD_CD     = pADO->FieldByName("INCD_CNFM_MTHD_CD")->AsString;
+                pObj->INCD_CNFM_DT          = pADO->FieldByName("INCD_CNFM_DT")->AsString;
+                pObj->INCD_STRT_DT          = pADO->FieldByName("INCD_STRT_DT")->AsString;
+                pObj->INCD_END_PRAR_DT      = pADO->FieldByName("INCD_END_PRAR_DT")->AsString;
+                pObj->INCD_TYPE_CLSF_CD     = pADO->FieldByName("INCD_TYPE_CLSF_CD")->AsString;
+                pObj->INCD_TYPE_CD          = pADO->FieldByName("INCD_TYPE_CD")->AsString;
+                pObj->INCD_TITL             = pADO->FieldByName("INCD_TITL")->AsString;
+                pObj->INCD_SERN_CD          = pADO->FieldByName("INCD_SERN_CD")->AsString;
+                pObj->DELY_LNGT             = pADO->FieldByName("DELY_LNGT")->AsString;
+                pObj->INCD_LNGT             = pADO->FieldByName("INCD_LNGT")->AsString;
+                pObj->INCD_OCRR_LANE        = pADO->FieldByName("INCD_OCRR_LANE")->AsString;
+                if (pObj->INCD_OCRR_LANE.IsEmpty())
+                {
+                    pObj->INCD_OCRR_LANE = "000000";
+                }
+                else
+                if (pObj->INCD_OCRR_LANE.Length() != 6)
+                {
+                    pObj->INCD_OCRR_LANE = "000000";
+                }
+                pObj->INCD_CLSR_LANE        = pADO->FieldByName("INCD_CLSR_LANE")->AsString;
+                pObj->TRVL_LMNT_TYPE_CD     = pADO->FieldByName("TRVL_LMNT_TYPE_CD")->AsString;
+                pObj->TRUB_VHCL_YN          = pADO->FieldByName("TRUB_VHCL_YN")->AsString;
+                pObj->FALT_YN               = pADO->FieldByName("FALT_YN")->AsString;
+                pObj->FRWT_YN               = pADO->FieldByName("FRWT_YN")->AsString;
+                pObj->UTIS_CNCT_YN          = pADO->FieldByName("UTIS_CNCT_YN")->AsString;
+                pObj->SMLT_VHCL_UNUM        = pADO->FieldByName("SMLT_VHCL_UNUM")->AsString;
+                pObj->MDLT_VHCL_UNUM        = pADO->FieldByName("MDLT_VHCL_UNUM")->AsString;
+                pObj->INJR_PNUM             = pADO->FieldByName("INJR_PNUM")->AsString;
+                pObj->FTLT_PNUM             = pADO->FieldByName("FTLT_PNUM")->AsString;
+                pObj->WTHR_CD               = pADO->FieldByName("WTHR_CD")->AsString;
+                pObj->RESP_LVL_CD           = pADO->FieldByName("RESP_LVL_CD")->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_END_CNFM_MTHD_CD = pADO->FieldByName("INCD_END_CNFM_MTHD_CD")->AsString;
+                pObj->INCD_END_DT           = pADO->FieldByName("INCD_END_DT")->AsString;
+                pObj->MBLZ_EQPM_CONT        = pADO->FieldByName("MBLZ_EQPM_CONT")->AsString;
+                pObj->MBLZ_PNUM             = pADO->FieldByName("MBLZ_PNUM")->AsString;
+                pObj->RECR_CONT             = pADO->FieldByName("RECR_CONT")->AsString;
+                pObj->RECR_PERD             = pADO->FieldByName("RECR_PERD")->AsString;
+                pObj->LINK_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*/)
+{
+return true;
+
+    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_ID = B.NODE_ID                                          \r\n"
+           "   AND C.T_NODE_ID = 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
+
+    FAutoLists.Lock();
+    try
+    {
+        FAutoIncident = 0;
+        FAutoLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			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";
+
+    FVmsLists.Lock();
+    try
+    {
+        FVmsLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			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 ROTA.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);
+
+    //2. 공단으로 정보를 연계하는 경우에만 정보를 입력하도록 한다.
+    if (AObj->UTIS_CNCT_YN != "Y") return true;
+
+    sQry = "INSERT INTO ROTA.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;
+
+            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->Prepared = true;
+			pADO->Open();
+            AIncidentId = pADO->FieldByName("NEWID")->AsString;
+#else
+            pADO->Parameters->ParamByName("p01")->Value = ACenterId;
+            pADO->Prepared = true;
+			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;
+}
+//---------------------------------------------------------------------------
+
+

+ 175 - 0
COMMON/CDS/CDSIncidentF.h

@@ -0,0 +1,175 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSIncidentFH
+#define CDSIncidentFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "ITSLibF.h"
+#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 INCD_OCRR_ID;          //돌발상황 발생 ID
+    String RGST_DT;               //등록 일시
+    String INCD_ORGN_CD;          //돌발상황 원본 코드 : IST
+    String OCRR_LCTN_NM;          //발생 위치 명
+    String X_CRDN;                //X 좌표
+    String Y_CRDN;                //Y 좌표
+    String INCD_EXPL;             //돌발상황 설명
+    String CMTR_GRAD_CD;          //소통 등급 코드 : LTCU
+    String IFMR_NM;               //제보자 명
+    String INCD_CNFM_MTHD_CD;     //돌발상황 확인 방법 코드 : ICM
+    String INCD_CNFM_DT;          //돌발상황 확인 일시
+    String INCD_STRT_DT;          //돌발상황 시작 일시
+    String INCD_END_PRAR_DT;      //돌발상황 종료 예정 일시
+    String INCD_TYPE_CLSF_CD;     //돌발상황 유형 분류 코드 : IDTU
+    String INCD_TYPE_CD;          //돌발상황 유형 코드 : ACTU, CRTU, EVTU, WETU 중 하나
+    String INCD_TITL;             //돌발상황 제목
+    String INCD_SERN_CD;          //돌발상황 심각도 코드 : SRLU
+    String DELY_LNGT;             //지체 길이
+    String INCD_LNGT;             //돌발상황 길이
+    String INCD_OCRR_LANE;        //돌발상황 발생 차로
+    String INCD_CLSR_LANE;        //돌발상황 차단 차로
+    String TRVL_LMNT_TYPE_CD;     //통행 제한 유형 코드 : PRTU
+    String TRUB_VHCL_YN;          //고장 차량 여부
+    String FALT_YN;               //낙하물 여부
+    String FRWT_YN;               //화재위험물 여부
+    String UTIS_CNCT_YN;          //UTIS 연계 여부
+    String SMLT_VHCL_UNUM;        //소형 차량 대수
+    String MDLT_VHCL_UNUM;        //중대형 차량 대수
+    String INJR_PNUM;             //부상자 인원수
+    String FTLT_PNUM;             //사망자 인원수
+    String WTHR_CD;               //기상 코드 : DFW
+    String RESP_LVL_CD;           //대응 수준 코드 : RSL
+    String VMS_DSPL_YN;           //VMS 표출 여부
+    String INCD_PRGR_STEP_CD;     //돌발상황 진행 단계 코드 : ISS
+    String INCD_END_CNFM_MTHD_CD; //돌발상황 종료 확인 방법 코드 : ICM
+    String INCD_END_DT;           //돌발상황 종료 일시
+    String MBLZ_EQPM_CONT;        //출동 장비 내용
+    String MBLZ_PNUM;             //출동 인원수
+    String RECR_CONT;             //복구 내용
+    String RECR_PERD;             //복구 기간
+    String LINK_ID;               //돌발발생 LINK ID
+
+    String DISP_INCD;              //현재 돌발 진행 여부
+
+    void    *FMarker;
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+};
+//---------------------------------------------------------------------------
+
+/*
+* Incident Manager
+*/
+class TItsIncidentManager
+{
+public:
+    TItsIncidentManager();
+    virtual ~TItsIncidentManager();
+
+public:
+    TItsMap<String, TItsVmsIncident*>   FVmsLists;
+    TItsMap<String, TItsAutoIncident*>  FAutoLists;
+    TItsMap<String, 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
+

+ 233 - 0
COMMON/CDS/CDSLayerF.cpp

@@ -0,0 +1,233 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSLayerF.h"
+#include "ITSUtilF.h"
+#include "ITSMapF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsLayer::TItsLayer()
+{
+}
+TItsLayer::TItsLayer(bool AUse, int AZOOM, String ALINK_TYPE, int ALEVL, bool ADefault)
+{
+    Use       = AUse;
+    ZOOM      = AZOOM;
+    LINK_TYPE = ALINK_TYPE;
+    LEVL      = ALEVL;
+    Default   = ADefault;
+}
+//---------------------------------------------------------------------------
+TItsLayer::~TItsLayer()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsLayerManager *ItsLayerManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Layer Manager
+*/
+TItsLayerManager::TItsLayerManager()
+{
+    FFacilityLayers.Push("CCTV", new TLayerIdx("CCTV",  5, 1));
+    FFacilityLayers.Push("VMS",  new TLayerIdx("VMS",   6, 1));
+    FFacilityLayers.Push("VDS",  new TLayerIdx("VDS",   7, 1));
+    FFacilityLayers.Push("WCAM", new TLayerIdx("WCAM", 21, 1));
+    FFacilityLayers.Push("CCAM", new TLayerIdx("CCAM", 22, 1));
+    FFacilityLayers.Push("PARK", new TLayerIdx("PARK", 16, 1));
+}
+//---------------------------------------------------------------------------
+TItsLayerManager::~TItsLayerManager()
+{
+}
+//---------------------------------------------------------------------------
+int TItsLayerManager::GetLayerIndex(String ALayerType)
+{
+    TLayerIdx *pLayer = FFacilityLayers.Find(ALayerType);
+    if (pLayer) return pLayer->Index;
+
+    if (ALayerType.Pos("±³Â÷·Î°¨½Ã")) return 22;
+    if (ALayerType.Pos("CCTV")) return 5;
+
+    return -1;
+}
+//---------------------------------------------------------------------------
+String TItsLayerManager::GetLayerType(int ALayerIndex)
+{
+    String sLayerType[] =
+    {
+        "TRAFFIC",
+        "LINK",
+        "IFSC",
+        "ROAD",
+        "NODE",
+        "CCTV",
+        "VMS",
+        "VDS",
+        "VDSDET",
+        "VDSR",
+        "VDSRDET",
+        "VDSC",
+        "VDSCDET",
+        "AVI",
+        "RSE",
+        "DSRC",
+        "PARK",
+        "PVMS",
+        "BIT",
+        "SIG",
+        "SIGDET",
+        "WCAM",
+        "CCAM",
+        "EVENT",
+        "WTHR",
+        "ATMP",
+        "INCD",
+        "SELECT",
+    };
+    if (ALayerIndex < 0 || ALayerIndex > LyrTp_Select) return "";
+
+    return sLayerType[ALayerIndex];
+}
+//---------------------------------------------------------------------------
+bool TItsLayerManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+#if 1
+    FLists.Push(12, new TItsLayer(true, 12, "R", 3, false));
+    FLists.Push(13, new TItsLayer(true, 13, "R", 4, true));
+    FLists.Push(14, new TItsLayer(true, 14, "I", 2, false));
+    FLists.Push(15, new TItsLayer(true, 15, "I", 2, true));
+    FLists.Push(16, new TItsLayer(true, 16, "L", 1, false));
+    FLists.Push(17, new TItsLayer(true, 17, "L", 1, false));
+    FLists.Push(18, new TItsLayer(true, 18, "L", 1, false));
+    FLists.Push(19, new TItsLayer(true, 19, "L", 1, false));
+    FLists.Push(20, new TItsLayer(true, 20, "L", 1, true));
+#else
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *             \r\n"
+           "  FROM TB_LAYER_INFO \r\n";
+
+    FLists.Lock();
+    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->Prepared = true;
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsLayer *pLayer = new TItsLayer();
+
+                pLayer->Use       = pADO->FieldByName("LINK_TYPE")->AsString == "X" ? false : true;
+                pLayer->ZOOM      = pADO->FieldByName("ZOOM")->AsInteger;
+                pLayer->LINK_TYPE = pADO->FieldByName("LINK_TYPE")->AsString;
+                pLayer->LEVL      = pADO->FieldByName("LEVL")->AsInteger;
+                pLayer->Default   = pADO->FieldByName("DFLT_YN")->AsString == "Y" ? true : false;
+
+				FLists.Push(pLayer->ZOOM, pLayer);
+
+                if (pLayer->Use)
+                {
+                    TItsVrtxList *pVrtx = new TItsVrtxList();
+                    pVrtx->ZOOM = pLayer->ZOOM;
+                    FVrtxs.Push(pVrtx->ZOOM, pVrtx);
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsLayerManager::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("TItsLayerManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+#endif
+    return true;
+}
+//---------------------------------------------------------------------------
+int TItsLayerManager::GetDefaultLinkLayer()
+{
+    int nLayerIdx = -1;
+    FOR_STL(TItsLayer*, pObj, FLists)
+    {
+        if (pObj->LINK_TYPE == "L" && pObj->Default)
+        {
+            nLayerIdx = pObj->LEVL;
+            break;
+        }
+    }
+    return nLayerIdx;
+}
+//---------------------------------------------------------------------------
+int TItsLayerManager::GetDefaultIfscLayer()
+{
+    int nLayerIdx = -1;
+    FOR_STL(TItsLayer*, pObj, FLists)
+    {
+        if (pObj->LINK_TYPE == "I" && pObj->Default)
+        {
+            nLayerIdx = pObj->LEVL;
+            break;
+        }
+    }
+    return nLayerIdx;
+}
+//---------------------------------------------------------------------------
+int TItsLayerManager::GetDefaultRoadLayer()
+{
+    int nLayerIdx = -1;
+    FOR_STL(TItsLayer*, pObj, FLists)
+    {
+        if (pObj->LINK_TYPE == "R" && pObj->Default)
+        {
+            nLayerIdx = pObj->LEVL;
+            break;
+        }
+    }
+    return nLayerIdx;
+}
+//---------------------------------------------------------------------------
+
+#if 0
+SELECT A.LINK_ID, A.LEVL, A.X_CRDN_ARR, A.Y_CRDN_ARR
+  FROM TB_LINK_VRTX_ARR A,
+       TB_LINK          B
+ WHERE A.LINK_ID = B.LINK_ID
+   AND A.LEVL IN (SELECT DISTINCT LEVL
+                    FROM TB_LAYER_INFO
+                   WHERE LINK_TYPE = 'L')
+#endif
+

+ 123 - 0
COMMON/CDS/CDSLayerF.h

@@ -0,0 +1,123 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSLayerFH
+#define CDSLayerFH
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  LAYER class
+*/
+class TItsLayer
+{
+public:
+    TItsLayer();
+    TItsLayer(bool AUse, int AZOOM, String ALINK_TYPE, int ALEVL, bool ADefault);
+    virtual ~TItsLayer();
+    void Clear();
+
+private:
+
+public:
+    bool    Use;
+    int     ZOOM;
+    String  LINK_TYPE;
+    int     LEVL;
+    bool    Default;
+
+public:
+};
+//---------------------------------------------------------------------------
+
+class TItsVrtx
+{
+public:
+    TItsVrtx()  {};
+    ~TItsVrtx() {};
+
+private:
+
+public:
+    String ID;
+    String X_CRDN_ARR;
+    String Y_CRDN_ARR;
+
+public:
+};
+//---------------------------------------------------------------------------
+
+class TItsVrtxList
+{
+public:
+    TItsVrtxList()  {};
+    ~TItsVrtxList() {};
+
+private:
+
+public:
+    int    ZOOM;
+    TItsMap<String, TItsVrtx*> FLists;
+
+public:
+};
+//---------------------------------------------------------------------------
+
+class TLayerIdx
+{
+public:
+    TLayerIdx(String ALayerType, int ALayerIdx, int AVisible)
+    {
+        Type  = ALayerType;
+        Index = ALayerIdx;
+        Visible = AVisible;
+    }
+    ~TLayerIdx() {};
+
+private:
+
+public:
+    String Type;
+    int    Index;
+    int    Visible;
+    String arrObj;
+
+};
+//---------------------------------------------------------------------------
+
+/*
+* Layer Manager
+*/
+class TItsLayerManager
+{
+public:
+    TItsLayerManager();
+    virtual ~TItsLayerManager();
+
+public:
+
+    TItsMap<String, TLayerIdx*>    FFacilityLayers;
+    TItsMap<String, TItsLayer*>    FLists;
+    TItsMap<int,    TItsVrtxList*> FVrtxs;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+
+    int GetLayerIndex(String ALayerType);
+    String GetLayerType(int ALayerIndex);
+
+    int GetDefaultLinkLayer();
+    int GetDefaultIfscLayer();
+    int GetDefaultRoadLayer();
+};
+//---------------------------------------------------------------------------
+extern TItsLayerManager *ItsLayerManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 465 - 0
COMMON/CDS/CDSLinkF.cpp

@@ -0,0 +1,465 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSLinkF.h"
+#include "CDSLayerF.h"
+#include "ITSUtilF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsLink::TItsLink()
+{
+    IFSC_ID = "";
+    ROAD_ID = "";
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TItsLink::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsLink::~TItsLink()
+{
+}
+//---------------------------------------------------------------------------
+void TItsLink::InitTraffic()
+{
+    TRAF->InitTraffic();
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsLinkManager *ItsLinkManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Link Manager
+*/
+TItsLinkManager::TItsLinkManager()
+{
+}
+//---------------------------------------------------------------------------
+TItsLinkManager::~TItsLinkManager()
+{
+    FLists.RemoveAll();
+    FClctSystStts.RemoveAll();
+}
+//---------------------------------------------------------------------------
+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_ID, T_NODE_ID, 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";
+    FLists.Lock();
+    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->Prepared = true;
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsLink *pLink = new TItsLink();
+
+                pLink->IsVertex         = false;
+                pLink->LINK_ID          = pADO->FieldByName("LINK_ID")->AsString;          //'링크ID';;
+                pLink->F_NODE_ID        = pADO->FieldByName("F_NODE_ID")->AsString;        //'시작노드ID';;
+                pLink->T_NODE_ID        = pADO->FieldByName("T_NODE_ID")->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
+                //pLink->REGN_YN          = "Y";
+
+				FLists.Push(pLink->LINK_ID, pLink);
+                pLink->Completed = true;
+
+                pLink->TRAF = new TCDSTraffic();
+            }
+        }
+        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 LoadVrtxFromDb(ADbConn);
+}
+//---------------------------------------------------------------------------
+bool TItsLinkManager::LoadVrtxFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT A.LINK_ID, A.LEVL,           \r\n"
+           "       A.X_CRDN_ARR, A.Y_CRDN_ARR   \r\n"
+           "  FROM TB_LINK_VRTX_ARR A,          \r\n"
+           "       TB_LINK          B           \r\n"
+           " WHERE B.DEL_YN  = 'N'              \r\n"
+           "   AND B.LINK_ID = A.LINK_ID        \r\n"
+           "   AND A.LEVL    = 1                \r\n";
+#else
+    sQry = "SELECT *                 \r\n"
+           "  FROM VW_LINK_VRTX_ARR  \r\n";
+#endif
+
+    TItsLink* pObj;
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String LINK_ID = pADO->FieldByName("LINK_ID")->AsString;
+                pObj = FLists.Find(LINK_ID);
+                if (!pObj) continue;
+
+#if 0
+                LEVL = pADO->FieldByName("LEVL")->AsInteger;
+                TItsVrtx* pVrtx = new TItsVrtx();
+                pVrtx->X_CRDN_ARR = pADO->FieldByName("X_CRDN_ARR")->AsString;
+                pVrtx->Y_CRDN_ARR = pADO->FieldByName("Y_CRDN_ARR")->AsString;
+
+				pObj->Vrtxs.Push(LEVL, pVrtx);
+#else
+                pObj->IsVertex   = true;
+                pObj->X_CRDN_ARR = pADO->FieldByName("X_CRDN_ARR")->AsString;
+                pObj->Y_CRDN_ARR = pADO->FieldByName("Y_CRDN_ARR")->AsString;
+#endif
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsLinkManager::LoadVrtxFromDb", 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::LoadVrtxFromDb", 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::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->Prepared = true;
+			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::LoadRegionVertexFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            DBERRORMSG("TItsLinkManager::LoadRegionVertexFromDb", 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";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			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;     // '보정 소스';
+
+                if (pObj->TRAF->CMTR_GRAD_CD == "LTC0" && pObj->TRAF->MISS_YN == "Y") pObj->TRAF->MISSING = "Y";
+
+            }
+        }
+        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;
+}
+//---------------------------------------------------------------------------
+bool TItsLinkManager::LoadClctSystStts(TADOConnection *ADbConn/*=NULL*/)
+{
+    bool bResult = true;
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    FOR_STL(TClctSystStts*, pObj, FClctSystStts)
+    {
+        pObj->IsCollected = false;
+    }
+
+    sQry = "SELECT A.PRCN_DT, A.CLCT_SYST_CD, B.CLCT_SYST_NM, A.CLCT_NUM, A.FLTR_NUM, A.FUSN_NUM        \r\n"
+           "  FROM TB_CLCT_SYST_STTS_HS A,                                                              \r\n"
+           "       TB_CLCT_SYST_STUP    B                                                               \r\n"
+           " WHERE A.PRCN_DT = (SELECT MAX(PRCN_DT)                                                     \r\n"
+           "                      FROM TB_CLCT_SYST_STTS_HS                                             \r\n"
+           "                     WHERE PRCN_DT >= TO_CHAR(SYSDATE - 1/24, 'YYYYMMDDHH24MISS')           \r\n"
+           "                   )                                                                        \r\n"
+           "   AND B.CLCT_SYST_CD = A.CLCT_SYST_CD(+)                                                   \r\n"
+           "   AND B.USE_YN       = 'Y'                                                                 \r\n";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String CLCT_SYST_CD = pADO->FieldByName("CLCT_SYST_CD")->AsString;
+                TClctSystStts *pObj = FClctSystStts.Find(CLCT_SYST_CD);
+                if (!pObj)
+                {
+                    pObj = new TClctSystStts();
+                    pObj->CLCT_SYST_CD = CLCT_SYST_CD;
+                    FClctSystStts.Push(pObj->CLCT_SYST_CD, pObj);
+                }
+
+                pObj->CLCT_SYST_NM = pADO->FieldByName("CLCT_SYST_NM")->AsString;
+                pObj->PRCN_DT = pADO->FieldByName("PRCN_DT")->AsString;
+
+                pObj->CLCT_NUM = pADO->FieldByName("CLCT_NUM")->AsInteger;
+                pObj->FLTR_NUM = pADO->FieldByName("FLTR_NUM")->AsInteger;
+                pObj->FUSN_NUM = pADO->FieldByName("FUSN_NUM")->AsInteger;
+
+                pObj->IsCollected = true;
+            }
+        }
+        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;
+}
+//---------------------------------------------------------------------------
+

+ 131 - 0
COMMON/CDS/CDSLinkF.h

@@ -0,0 +1,131 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSLinkFH
+#define CDSLinkFH
+//---------------------------------------------------------------------------
+
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+#include "CDSLayerF.h"
+#include "CDSObjectF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  LINK class
+*/
+class TItsLink
+{
+public:
+    TItsLink();
+    virtual ~TItsLink();
+    void Clear();
+
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String  LINK_ID;
+    String	F_NODE_ID;
+    String	T_NODE_ID;
+    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  PARA_ID;
+
+    String	REGN_YN;
+
+    String  IFSC_ID;
+    String  ROAD_ID;
+
+    TCDSTraffic             *TRAF;
+    TItsMap<int, TItsVrtx*>  Vrtxs;
+
+    bool   IsVertex;
+    String X_CRDN_ARR;
+    String Y_CRDN_ARR;
+    int    SPED;
+    int    TRAF_GRAD;
+
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    void InitTraffic();
+};
+//---------------------------------------------------------------------------
+
+class TClctSystStts
+{
+public:
+    TClctSystStts()  {};
+    ~TClctSystStts() {};
+
+private:
+
+public:
+    String CLCT_SYST_CD;
+    String CLCT_SYST_NM;
+    String PRCN_DT;
+
+    int    CLCT_NUM;
+    int    FLTR_NUM;
+    int    FUSN_NUM;
+
+    bool   IsCollected;
+};
+//---------------------------------------------------------------------------
+
+/*
+* Link Manager
+*/
+class TItsLinkManager
+{
+public:
+    TItsLinkManager();
+    virtual ~TItsLinkManager();
+
+public:
+    int                         FRegionPointCnt;
+    String                      FRegionVertex;
+
+    TItsMap<String, TItsLink*>       FLists;
+    TItsMap<String, TClctSystStts*>  FClctSystStts;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadVrtxFromDb(TADOConnection *ADbConn=NULL);
+
+    bool LoadRegionVertexFromDb(TADOConnection *ADbConn=NULL);
+
+    void InitTraffic();
+    bool LoadTraffic(TADOConnection *ADbConn=NULL);
+    bool LoadClctSystStts(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsLinkManager *ItsLinkManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 380 - 0
COMMON/CDS/CDSLink_VMSF.cpp

@@ -0,0 +1,380 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSLink_VMSF.h"
+#include "ITSUtilF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TLink::TLink()
+{
+    IFSC_ID = "";
+    ROAD_ID = "";
+    Clear();
+}
+//---------------------------------------------------------------------------
+void TLink::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TLink::~TLink()
+{
+}
+//---------------------------------------------------------------------------
+void TLink::InitTraffic()
+{
+    TRAF->InitTraffic();
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TLinkManager *LinkManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Link Manager
+*/
+TLinkManager::TLinkManager()
+{
+}
+//---------------------------------------------------------------------------
+TLinkManager::~TLinkManager()
+{
+}
+//---------------------------------------------------------------------------
+void TLinkManager::InitTraffic()
+{
+    try
+    {
+        FLists.Lock();
+
+        FOR_STL(TLink*, pObj, FLists)
+        {
+            pObj->InitTraffic();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+}
+//---------------------------------------------------------------------------
+bool TLinkManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT LINK_ID, F_NODE_ID, T_NODE_ID, 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";
+
+    FLists.Lock();
+    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->Prepared = true;
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TLink *pLink = new TLink();
+
+                pLink->IsVertex         = false;
+                pLink->LINK_ID          = pADO->FieldByName("LINK_ID")->AsString;          //'링크ID';;
+                pLink->F_NODE_ID        = pADO->FieldByName("F_NODE_ID")->AsString;        //'시작노드ID';;
+                pLink->T_NODE_ID        = pADO->FieldByName("T_NODE_ID")->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
+                //pLink->REGN_YN          = "Y";
+
+				FLists.Push(pLink->LINK_ID, pLink);
+                pLink->Completed = true;
+
+                pLink->TRAF = new TCDSTraffic();
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TLinkManager::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("TLinkManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return LoadVrtxFromDb(ADbConn);
+}
+//---------------------------------------------------------------------------
+bool TLinkManager::LoadVrtxFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT A.LINK_ID, A.LEVL,           \r\n"
+           "       A.X_CRDN_ARR, A.Y_CRDN_ARR   \r\n"
+           "  FROM TB_LINK_VRTX_ARR A,          \r\n"
+           "       TB_LINK          B           \r\n"
+           " WHERE B.DEL_YN  = 'N'              \r\n"
+           "   AND B.LINK_ID = A.LINK_ID        \r\n"
+           "   AND A.LEVL    = 1                \r\n";
+#else
+    sQry = "SELECT *                 \r\n"
+           "  FROM VW_LINK_VRTX_ARR  \r\n";
+#endif
+
+    TLink* pObj;
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String LINK_ID = pADO->FieldByName("LINK_ID")->AsString;
+                pObj = FLists.Find(LINK_ID);
+                if (!pObj) continue;
+
+#if 0
+                LEVL = pADO->FieldByName("LEVL")->AsInteger;
+                TItsVrtx* pVrtx = new TItsVrtx();
+                pVrtx->X_CRDN_ARR = pADO->FieldByName("X_CRDN_ARR")->AsString;
+                pVrtx->Y_CRDN_ARR = pADO->FieldByName("Y_CRDN_ARR")->AsString;
+
+				pObj->Vrtxs.Push(LEVL, pVrtx);
+#else
+                pObj->IsVertex   = true;
+                pObj->X_CRDN_ARR = pADO->FieldByName("X_CRDN_ARR")->AsString;
+                pObj->Y_CRDN_ARR = pADO->FieldByName("Y_CRDN_ARR")->AsString;
+#endif
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TLinkManager::LoadVrtxFromDb", 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("TLinkManager::LoadVrtxFromDb", 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 TLinkManager::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->Prepared = true;
+			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("TLinkManager::LoadRegionVertexFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &exception)
+        {
+            DBERRORMSG("TLinkManager::LoadRegionVertexFromDb", 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 TLinkManager::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";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String ID = pADO->FieldByName("LINK_ID")->AsString;
+                TLink *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;     // '보정 소스';
+
+                if (pObj->TRAF->CMTR_GRAD_CD == "LTC0" && pObj->TRAF->MISS_YN == "Y") pObj->TRAF->MISSING = "Y";
+
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORLOG("TLinkManager::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("TLinkManager::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;
+}
+//---------------------------------------------------------------------------
+

+ 108 - 0
COMMON/CDS/CDSLink_VMSF.h

@@ -0,0 +1,108 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSLink_VMSFH
+#define CDSLink_VMSFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+#include "CDSObjectF.h"
+#include "CDSLayerF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  LINK class
+*/
+class TLink
+{
+public:
+    TLink();
+    virtual ~TLink();
+    void Clear();
+
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String  LINK_ID;
+    String	F_NODE_ID;
+    String	T_NODE_ID;
+    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  PARA_ID;
+
+    String	REGN_YN;
+
+    String  IFSC_ID;
+    String  ROAD_ID;
+
+    TCDSTraffic             *TRAF;
+    TItsMap<int, TItsVrtx*>  Vrtxs;
+
+    bool   IsVertex;
+    String X_CRDN_ARR;
+    String Y_CRDN_ARR;
+    int    SPED;
+    int    TRAF_GRAD;
+
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    void InitTraffic();
+};
+//---------------------------------------------------------------------------
+
+/*
+* Link Manager
+*/
+class TLinkManager
+{
+public:
+    TLinkManager();
+    virtual ~TLinkManager();
+
+public:
+    int                         FRegionPointCnt;
+    String                      FRegionVertex;
+
+    TItsMap<String, TLink*>  FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadVrtxFromDb(TADOConnection *ADbConn=NULL);
+
+    bool LoadRegionVertexFromDb(TADOConnection *ADbConn=NULL);
+
+    void InitTraffic();
+    bool LoadTraffic(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TLinkManager *LinkManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 105 - 0
COMMON/CDS/CDSNodeF.cpp

@@ -0,0 +1,105 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSNodeF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsNode::TItsNode()
+{
+}
+//---------------------------------------------------------------------------
+void TItsNode::Clear()
+{
+}
+//---------------------------------------------------------------------------
+TItsNode::~TItsNode()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TItsNodeManager *ItsNodeManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Node 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";
+
+    FLists.Lock();
+    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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsNode *pNode = new TItsNode();
+
+                pNode->NODE_ID   = pADO->FieldByName("NODE_ID")->AsString;              //노드ID
+                pNode->NODE_TYPE = pADO->FieldByName("NODE_TYPE")->AsString;            //노드유형
+                pNode->NODE_NAME = pADO->FieldByName("NODE_NAME")->AsString.Trim();     //교차로명칭
+                pNode->TURN_P    = pADO->FieldByName("TURN_P")->AsString;               //회전제한유무
+                pNode->RMRK      = pADO->FieldByName("RMRK")->AsString.Trim();          //비고
+                pNode->X_CRDN    = pADO->FieldByName("X_CRDN")->AsFloat;                //X 좌표
+                pNode->Y_CRDN    = pADO->FieldByName("Y_CRDN")->AsFloat;                //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;
+}
+//---------------------------------------------------------------------------
+

+ 66 - 0
COMMON/CDS/CDSNodeF.h

@@ -0,0 +1,66 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSNodeFH
+#define CDSNodeFH
+//---------------------------------------------------------------------------
+
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+#include "CDSLayerF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  Node class
+*/
+class TItsNode
+{
+public:
+    TItsNode();
+    virtual ~TItsNode();
+    void Clear();
+
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String  NODE_ID;
+    String  NODE_TYPE;
+    String  NODE_NAME;
+    String  TURN_P;
+    String  RMRK;
+    double  X_CRDN;
+    double  Y_CRDN;
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+};
+//---------------------------------------------------------------------------
+
+/*
+* Node Manager
+*/
+class TItsNodeManager
+{
+public:
+    TItsNodeManager();
+    virtual ~TItsNodeManager();
+
+public:
+    TItsMap<String, TItsNode*>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsNodeManager *ItsNodeManager;
+//---------------------------------------------------------------------------
+
+
+#endif
+

+ 76 - 0
COMMON/CDS/CDSObjectF.cpp

@@ -0,0 +1,76 @@
+//---------------------------------------------------------------------------
+
+#include "ITSLibF.h"
+#pragma hdrstop
+
+#include "CDSObjectF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TCDSObject::TCDSObject()
+{
+    //InitializeCriticalSection(&FCS);
+
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+
+    CTLR_NMBR      = "";
+    CTLR_ID        = "";
+    NAME           = "";
+    CTLR_IP        = "";
+    CTLR_PORT      = 0;
+    CTLR_LOCAL_NO  = 0;
+    TYPE_CD        = "";
+    ISTL_LCTN_NM   = "";
+    ISTL_LCTN_ADDR = "";
+    X_CRDN         = 0.;
+    Y_CRDN         = 0.;
+    DEL_YN         = "N";
+
+    FData1     = NULL;
+    FData2     = NULL;
+    FData3     = NULL;
+}
+//---------------------------------------------------------------------------
+TCDSObject::~TCDSObject()
+{
+    //DeleteCriticalSection(&FCS);
+}
+//---------------------------------------------------------------------------
+void TCDSObject::Lock()
+{
+    //EnterCriticalSection(&FCS);
+}
+//---------------------------------------------------------------------------
+void TCDSObject::UnLock()
+{
+    //LeaveCriticalSection(&FCS);
+}
+//---------------------------------------------------------------------------
+
+TCDSTraffic::TCDSTraffic()
+{
+    InitTraffic();
+}
+//---------------------------------------------------------------------------
+TCDSTraffic::~TCDSTraffic()
+{
+}
+//---------------------------------------------------------------------------
+void TCDSTraffic::InitTraffic()
+{
+    CMTR_GRAD_CD = "LTC0";
+    PRCN_DT      = "19000101000000";
+    SPED         = 0;
+    TRVL_HH      = 0;
+    DATA_NUM     = 0;
+    TRAF_GRAD    = 0;
+    MISS_YN      = "Y";
+    MISSING      = "Y";
+}
+//---------------------------------------------------------------------------
+

+ 138 - 0
COMMON/CDS/CDSObjectF.h

@@ -0,0 +1,138 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSObjectFH
+#define CDSObjectFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include "ITSLibF.h"
+//---------------------------------------------------------------------------
+class TCDSObject
+{
+public:
+    TCDSObject();
+    ~TCDSObject();
+
+private:
+    //CRITICAL_SECTION    FCS;
+
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+    String  FMEM_DEL;
+
+    String  FCTLR_NMBR;          //	N	NUMBER(10)	    N			VMS 제어기 번호
+    String  FCTLR_ID;            //	N	VARCHAR2(10)	Y			VMS 제어기 ID
+    String  FNAME;               //	N	VARCHAR2(40)	Y			VMS 명칭
+    String  FCTLR_IP;            //	N	VARCHAR2(20)	Y			VMS 제어기 아이피
+    int     FCTLR_PORT;          //	N	NUMBER(5)	    Y	0		VMS 제어기 포트
+    int     FCTLR_LOCAL_NO;      //	N	NUMBER(5)	    Y	0		VMS 제어기 지역번호
+    String  FTYPE_CD;            //	N	VARCHAR2(7)	    Y			VMS 유형 코드
+    String  FISTL_LCTN_NM;       //	N	VARCHAR2(40)	Y			설치 위치 명
+    String  FISTL_LCTN_ADDR;     //	N	VARCHAR2(200)	Y			설치 위치 주소
+    double  FX_CRDN;             //	N	NUMBER(11,8)	Y			X 좌표
+    double  FY_CRDN;             //	N	NUMBER(10,8)	Y			Y 좌표
+    String  FDEL_YN;             //	N	CHAR(1)	        Y	'N'		삭제 여부
+    void   *FFData1;
+    void   *FFData2;
+    void   *FFData3;
+
+public:
+    void Lock();
+    void UnLock();
+
+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        };
+    __property String CTLR_NMBR      = { read = FCTLR_NMBR,      write = FCTLR_NMBR      };
+    __property String CTLR_ID        = { read = FCTLR_ID,        write = FCTLR_ID        };
+    __property String NAME           = { read = FNAME,           write = FNAME           };
+    __property String CTLR_IP        = { read = FCTLR_IP,        write = FCTLR_IP        };
+    __property int    CTLR_PORT      = { read = FCTLR_PORT,      write = FCTLR_PORT      };
+    __property int    CTLR_LOCAL_NO  = { read = FCTLR_LOCAL_NO,  write = FCTLR_LOCAL_NO  };
+    __property String TYPE_CD        = { read = FTYPE_CD,        write = FTYPE_CD        };
+    __property String ISTL_LCTN_NM   = { read = FISTL_LCTN_NM,   write = FISTL_LCTN_NM   };
+    __property String ISTL_LCTN_ADDR = { read = FISTL_LCTN_ADDR, write = FISTL_LCTN_ADDR };
+    __property double X_CRDN         = { read = FX_CRDN,         write = FX_CRDN         };
+    __property double Y_CRDN         = { read = FY_CRDN,         write = FY_CRDN         };
+    __property String DEL_YN         = { read = FDEL_YN,         write = FDEL_YN         };
+    __property void*  FData1         = { read = FFData1,         write = FFData1         };
+    __property void*  FData2         = { read = FFData2,         write = FFData2         };
+    __property void*  FData3         = { read = FFData3,         write = FFData3         };
+};
+//---------------------------------------------------------------------------
+
+class TCDSTraffic
+{
+public:
+    TCDSTraffic();
+    virtual ~TCDSTraffic();
+
+private:
+
+public:
+    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();
+
+};
+//---------------------------------------------------------------------------
+class TTrafficVal
+{
+public:
+    TTrafficVal()  {};
+    ~TTrafficVal() {};
+
+private:
+
+public:
+    String  ID;
+    String	GRADE;
+    int     GRADE_VAL;
+    bool    IsUpdate;
+};
+//---------------------------------------------------------------------------
+
+/*
+* Traffic Manager
+*/
+class TTrafficValManager
+{
+public:
+    TTrafficValManager()
+    {
+    }
+    ~TTrafficValManager()
+    {
+        FLists.RemoveAll();
+    }
+
+public:
+    TItsMap<String, TTrafficVal*>   FLists;
+};
+//---------------------------------------------------------------------------
+
+#endif

+ 173 - 0
COMMON/CDS/CDSOrganF.cpp

@@ -0,0 +1,173 @@
+//---------------------------------------------------------------------------
+
+#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_NMBR      = "";
+    CNCT_INTN_NM        = "";
+    CNCT_INTN_TYPE_CD   = "";
+    CNCT_INTN_TEL       = "";
+    CNCT_INTN_ADDR      = "";
+    RMRK                = "";
+    DEL_YN              = "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;
+
+    sQry = "SELECT *                    \r\n"
+           "  FROM TB_CNCT_INTN_INFR    \r\n";
+
+    FLists.Lock();
+    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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsOrgan *pObj = new TItsOrgan();
+
+
+                //pObj->CNCT_INTN_NMBR      = pADO->FieldByName("CNCT_INTN_NMBR")->AsString;          //NUMBER(10)	N			연계 기관 관리 번호
+                pObj->CNCT_INTN_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->DEL_YN              = pADO->FieldByName("DEL_YN")->AsString;                  //CHAR(1)	Y	'N'		삭제 여부
+
+				FLists.Push(pObj->CNCT_INTN_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;
+}
+//---------------------------------------------------------------------------
+bool TItsOrganManager::GetNextOrganId(String &ANewOrgId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT NVL(MAX(CNCT_INTN_NMBR) + 1, 1) AS NEWID \r\n"
+           "  FROM TB_CNCT_INTN_INFR                        \r\n";
+#else
+    sQry = "SELECT NVL(MAX(CNCT_INTN_MNGM_NMBR) + 1, 1) AS NEWID \r\n"
+           "  FROM TB_CNCT_INTN_INFR                             \r\n";
+#endif
+    ANewOrgId = "1";
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+			pADO->Open();
+            ANewOrgId = pADO->FieldByName("NEWID")->AsString;
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsOrganManager::GetNextOrganId", 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::GetNextOrganId", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+

+ 66 - 0
COMMON/CDS/CDSOrganF.h

@@ -0,0 +1,66 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSOrganFH
+#define CDSOrganFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  Organ class
+*/
+class TItsOrgan
+{
+public:
+    TItsOrgan();
+    virtual ~TItsOrgan();
+    void Clear();
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+    String  CNCT_INTN_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  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:
+    TItsMap<String, TItsOrgan*>  FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool GetNextOrganId(String &ANewOrgId, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsOrganManager *ItsOrganManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 104 - 0
COMMON/CDS/CDSParkF.cpp

@@ -0,0 +1,104 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSParkF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+void TCDSPark::Init()
+{
+}
+//---------------------------------------------------------------------------
+TCDSParkManager *CDSParkManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+TCDSParkManager::TCDSParkManager()
+{
+}
+//---------------------------------------------------------------------------
+TCDSParkManager::~TCDSParkManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TCDSParkManager::Init()
+{
+    FOR_STL(TCDSPark*, pObj, FLists)
+    {
+        pObj->Init();
+    }
+}
+//---------------------------------------------------------------------------
+bool TCDSParkManager::LoadFromDb(TADOConnection *ADbConn)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                    \r\n"
+           "  FROM TB_PRLT_CTLR         \r\n"
+           " WHERE DEL_YN       = 'N'   \r\n"
+           "   AND REAL_DATA_YN = 'Y'   \r\n";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String PRLT_CTLR_NMBR = pADO->FieldByName("PRLT_CTLR_NMBR")->AsString.Trim();
+				TCDSPark *pObj = FLists.Find(PRLT_CTLR_NMBR);
+                if (!pObj)
+                {
+                    pObj = new TCDSPark();
+
+                    pObj->PRLT_CTLR_NMBR = PRLT_CTLR_NMBR;
+                    FLists.Push(pObj->PRLT_CTLR_NMBR, pObj);
+                }
+
+                pObj->PRLT_CTLR_ID = pADO->FieldByName("PRLT_CTLR_ID")->AsString.Trim();
+                pObj->PRLT_NM      = pADO->FieldByName("PRLT_NM")->AsString.Trim();
+                pObj->REAL_DATA_YN = pADO->FieldByName("REAL_DATA_YN")->AsString.Trim();
+                pObj->DEL_YN       = pADO->FieldByName("DEL_YN")->AsString.Trim();
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TCDSParkManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TCDSParkManager::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;
+}
+//---------------------------------------------------------------------------
+

+ 57 - 0
COMMON/CDS/CDSParkF.h

@@ -0,0 +1,57 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSParkFH
+#define CDSParkFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+//---------------------------------------------------------------------------
+#include "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  class
+*/
+class TCDSPark
+{
+public:
+    TCDSPark()  {};
+    ~TCDSPark() {};
+
+public:
+    String  PRLT_CTLR_NMBR; //	N	NUMBER(10)	    N			주차장 제어기 번호
+    String  PRLT_CTLR_ID;   //	N	VARCHAR2(10)	Y			주차장 제어기 ID
+    String  PRLT_NM;        //	N	VARCHAR2(50)	Y			주차장 명칭
+    String  REAL_DATA_YN;   //	N	CHAR(1)	    Y	'N'		실시간주차정보제공여부
+    String  DEL_YN;         //	N	CHAR(1)	    Y	'N'		삭제 여부
+
+public:
+    void Init();
+
+};
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+class TCDSParkManager
+{
+public:
+    TCDSParkManager();
+    virtual ~TCDSParkManager();
+
+public:
+    TItsMap<String, TCDSPark*>  FLists;
+
+public:
+    void Init();
+
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TCDSParkManager *CDSParkManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 431 - 0
COMMON/CDS/CDSPrcsParamF.cpp

@@ -0,0 +1,431 @@
+//---------------------------------------------------------------------------
+
+#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.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.PARA_ID = B.PARA_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->Prepared = true;
+			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.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.PARA_ID = B.PARA_ID               \r\n"
+           " ORDER BY A.PARA_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->Prepared = true;
+			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->Prepared = true;
+			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(PARA_ID), 0) + 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->Prepared = true;
+			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 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 = AObj->PARA_ID;
+			pADO->ExecSQL();
+
+        sQry = "DELETE TB_LINK_PARA_DETL  \r\n"
+               " WHERE PARA_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 PARA_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 "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+
+/*
+* 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주기
+
+    TItsMap<int, TPrcsParamClct*>    CLCTS;  //우선순위순서로 소팅되서 들어감
+
+    String     DEL_YN;
+    String     ToString();
+};
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+class TPrcsParamManager
+{
+public:
+    TPrcsParamManager();
+    virtual ~TPrcsParamManager();
+
+public:
+    TItsMap<String, 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

+ 721 - 0
COMMON/CDS/CDSPrltCtlrF.cpp

@@ -0,0 +1,721 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSPrltCtlrF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TPrltCtlr::TPrltCtlr()
+{
+}
+//---------------------------------------------------------------------------
+TPrltCtlr::~TPrltCtlr()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TPrltCtlrManager *PrltCtlrManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Prlt Manager
+*/
+TPrltCtlrManager::TPrltCtlrManager()
+{
+}
+//---------------------------------------------------------------------------
+TPrltCtlrManager::~TPrltCtlrManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TPrltCtlrManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *             \r\n"
+           "  FROM TB_PRLT_CTLR  \r\n"
+           " WHERE DEL_YN = 'N'  \r\n";
+
+    FLists.Lock();
+    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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TPrltCtlr *pObj = new TPrltCtlr();
+
+                pObj->PRLT_CTLR_NMBR     = pADO->FieldByName("PRLT_CTLR_NMBR")->AsString;
+                pObj->PRLT_CTLR_ID       = pADO->FieldByName("PRLT_CTLR_ID")->AsString;
+                pObj->PRLT_NM            = pADO->FieldByName("PRLT_NM")->AsString;
+                pObj->PRLT_CTLR_IP       = pADO->FieldByName("PRLT_CTLR_IP")->AsString;
+                pObj->PRLT_CTLR_PORT     = pADO->FieldByName("PRLT_CTLR_PORT")->AsInteger;
+                pObj->PRLT_CTLR_LOCAL_NO = pADO->FieldByName("PRLT_CTLR_LOCAL_NO")->AsInteger;
+                //pObj->PRLT_TYPE_CD       = pADO->FieldByName("PRLT_TYPE_CD")->AsString;
+                pObj->ISTL_LCTN_NM      = pADO->FieldByName("ISTL_LCTN_NM")->AsString;
+                pObj->X_CRDN            = pADO->FieldByName("X_CRDN")->AsFloat;
+                pObj->Y_CRDN            = pADO->FieldByName("Y_CRDN")->AsFloat;
+                pObj->DEL_YN            = pADO->FieldByName("DEL_YN")->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->PRLT_TEL          = pADO->FieldByName("PRLT_TEL")->AsString;
+                pObj->ISTL_LCTN_ADDR    = pADO->FieldByName("ISTL_LCTN_ADDR")->AsString;
+                pObj->WHOL_NPLS         = pADO->FieldByName("WHOL_NPLS")->AsInteger;
+                pObj->GNRL_NPLS         = pADO->FieldByName("GNRL_NPLS")->AsInteger;
+                pObj->LGVH_NPLS         = pADO->FieldByName("LGVH_NPLS")->AsInteger;
+                pObj->HVVH_NPLS         = pADO->FieldByName("HVVH_NPLS")->AsInteger;
+                pObj->EMVH_NPLS         = pADO->FieldByName("EMVH_NPLS")->AsInteger;
+                pObj->HNDC_NPLS         = pADO->FieldByName("HNDC_NPLS")->AsInteger;
+                pObj->WMON_NPLS         = pADO->FieldByName("WMON_NPLS")->AsInteger;
+                pObj->ELVH_NPLS         = pADO->FieldByName("ELVH_NPLS")->AsInteger;
+                pObj->ETC_NPLS          = pADO->FieldByName("ETC_NPLS")->AsInteger;
+                pObj->CNGT_NPLS         = pADO->FieldByName("CNGT_NPLS")->AsInteger;
+                pObj->PRLT_CHARGE_DESC  = pADO->FieldByName("PRLT_CHARGE_DESC")->AsString;
+                pObj->PRLT_OPER_DESC    = pADO->FieldByName("PRLT_OPER_DESC")->AsString;
+                pObj->PRLT_ETC_DESC     = pADO->FieldByName("PRLT_ETC_DESC")->AsString;
+                pObj->REAL_DATA_YN      = pADO->FieldByName("REAL_DATA_YN")->AsString;
+                pObj->CTLR_CLCT_CYCL    = pADO->FieldByName("CTLR_CLCT_CYCL")->AsInteger;
+                pObj->CTLR_STTS_CYCL    = pADO->FieldByName("CTLR_STTS_CYCL")->AsInteger;
+                pObj->CHNG_DT           = pADO->FieldByName("CHNG_DT")->AsString;
+
+                pObj->MEM_DEL           = "N";
+
+				FLists.Push(pObj->PRLT_CTLR_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("TPrltCtlrManager::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("TPrltCtlrManager::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 TPrltCtlrManager::LoadStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                                                                \r\n"
+           "  FROM TB_PRLT_CTLR_STTS A, TB_PRLT_CTLR B                              \r\n"
+           " WHERE B.REAL_DATA_YN   = 'Y'                                           \r\n"
+           "   AND A.PRLT_CTLR_NMBR = B.PRLT_CTLR_NMBR                              \r\n"
+           "   AND A.UPDT_DT       >= TO_CHAR(SYSDATE-3/1440, 'YYYYMMDDHH24MISS')   \r\n";
+
+    FLists.Lock();
+    try
+    {
+        TPrltCtlr *pObj = NULL;
+
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sPrltNmbr = pADO->FieldByName("PRLT_CTLR_NMBR")->AsString;
+                pObj = FLists.Find(sPrltNmbr);
+                if (!pObj) continue;
+
+                String UPDT_DT      = pADO->FieldByName("UPDT_DT")->AsString;
+                String CONN_STTS_CD = pADO->FieldByName("CMNC_STTS_CD")->AsString;
+                if (CONN_STTS_CD != "CMS0")
+                {
+                    pObj->STATE.Comm = park_comm_error;
+                    //Åë½ÅÀå¾Ö
+                    continue;
+                }
+                pObj->STATE.Comm = park_comm_normal;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TPrltCtlrManager::LoadStatusFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TPrltCtlrManager::LoadStatusFromDb", 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 TPrltCtlrManager::GetNextPrltId(int &ANmbr, int &AId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT NVL(MAX(PRLT_CTLR_NMBR), 10000) + 1 AS NEWID FROM TB_PRLT_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->Prepared = true;
+			pADO->Open();
+            ANmbr = pADO->FieldByName("NEWID")->AsInteger;
+            AId = ANmbr / 10000;
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TPrltCtlrManager::GetNextPrltId", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TPrltCtlrManager::GetNextPrltId", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TPrltCtlrManager::DeletePrlt(TPrltCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_PRLT_CTLR           \r\n"
+           "   SET DEL_YN = 'Y'          \r\n"
+           " WHERE PRLT_CTLR_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->PRLT_CTLR_NMBR;
+			pADO->ExecSQL();
+
+        sQry = "DELETE TB_FCLT_INFR      \r\n"
+               " WHERE FCLT_ID = :p01    \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->PRLT_CTLR_ID;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TPrltCtlrManager::DeletePrlt", 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("TPrltCtlrManager::DeletePrlt", 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 TPrltCtlrManager::UpdatePrlt(TPrltCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    return MergePrlt(AObj, ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TPrltCtlrManager::MergePrlt(TPrltCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "MERGE INTO TB_PRLT_CTLR L                                   \r\n"
+           "USING (SELECT :p01 AS PRLT_CTLR_NMBR,                       \r\n"
+           "              :p02 AS PRLT_CTLR_ID,                         \r\n"
+           "              :p03 AS PRLT_NM,                              \r\n"
+           "              :p04 AS PRLT_CTLR_IP,                         \r\n"
+           "              :p05 AS PRLT_CTLR_PORT,                       \r\n"
+           "              :p06 AS PRLT_CTLR_LOCAL_NO,                   \r\n"
+           "              :p07 AS PRLT_OPER_DVSN_CD,                    \r\n"
+           "              :p08 AS PRLT_TYPE_DVSN_CD,                    \r\n"
+           "              :p09 AS PRLT_TEL,                              \r\n"
+           "              :p10 AS ISTL_LCTN_NM,                         \r\n"
+           "              :p11 AS X_CRDN,                               \r\n"
+           "              :p12 AS Y_CRDN,                               \r\n"
+           "              :p13 AS DEL_YN,                               \r\n"
+           "              :p14 AS ISTL_LCTN_ADDR,                       \r\n"
+           "              :p15 AS WHOL_NPLS,                            \r\n"
+           "              :p16 AS GNRL_NPLS,                            \r\n"
+           "              :p17 AS LGVH_NPLS,                            \r\n"
+           "              :p18 AS HVVH_NPLS,                            \r\n"
+           "              :p19 AS EMVH_NPLS,                            \r\n"
+           "              :p20 AS HNDC_NPLS,                            \r\n"
+           "              :p21 AS WMON_NPLS,                            \r\n"
+           "              :p22 AS ELVH_NPLS,                            \r\n"
+           "              :p23 AS ETC_NPLS,                             \r\n"
+           "              :p24 AS PRLT_CHARGE_DESC,                     \r\n"
+           "              :p25 AS PRLT_OPER_DESC,                       \r\n"
+           "              :p26 AS PRLT_ETC_DESC,                        \r\n"
+           "              :p27 AS CTLR_CLCT_CYCL,                       \r\n"
+           "              :p28 AS CTLR_STTS_CYCL,                       \r\n"
+           "              :p29 AS REAL_DATA_YN,                         \r\n"
+           "              :p30 AS CHNG_DT,                              \r\n"
+           "              :p31 AS CNGT_NPLS                             \r\n"
+           "         FROM DUAL) M                                       \r\n"
+           "        ON (L.PRLT_CTLR_NMBR = M.PRLT_CTLR_NMBR)            \r\n"
+           "WHEN MATCHED THEN                                           \r\n"
+           "   UPDATE SET L.PRLT_CTLR_ID       = M.PRLT_CTLR_ID,        \r\n"
+           "              L.PRLT_NM            = M.PRLT_NM,             \r\n"
+           "              L.PRLT_CTLR_IP       = M.PRLT_CTLR_IP,        \r\n"
+           "              L.PRLT_CTLR_PORT     = M.PRLT_CTLR_PORT,      \r\n"
+           "              L.PRLT_CTLR_LOCAL_NO = M.PRLT_CTLR_LOCAL_NO,  \r\n"
+           "              L.PRLT_OPER_DVSN_CD  = M.PRLT_OPER_DVSN_CD,   \r\n"
+           "              L.PRLT_TYPE_DVSN_CD  = M.PRLT_TYPE_DVSN_CD,   \r\n"
+           "              L.PRLT_TEL           = M.PRLT_TEL,            \r\n"
+           "              L.ISTL_LCTN_NM       = M.ISTL_LCTN_NM,        \r\n"
+           "              L.X_CRDN             = M.X_CRDN,              \r\n"
+           "              L.Y_CRDN             = M.Y_CRDN,              \r\n"
+           "              L.DEL_YN             = M.DEL_YN,              \r\n"
+           "              L.ISTL_LCTN_ADDR     = M.ISTL_LCTN_ADDR,      \r\n"
+           "              L.WHOL_NPLS          = M.WHOL_NPLS,           \r\n"
+           "              L.GNRL_NPLS          = M.GNRL_NPLS,           \r\n"
+           "              L.LGVH_NPLS          = M.LGVH_NPLS,           \r\n"
+           "              L.HVVH_NPLS          = M.HVVH_NPLS,           \r\n"
+           "              L.EMVH_NPLS          = M.EMVH_NPLS,           \r\n"
+           "              L.HNDC_NPLS          = M.HNDC_NPLS,           \r\n"
+           "              L.WMON_NPLS          = M.WMON_NPLS,           \r\n"
+           "              L.ELVH_NPLS          = M.ELVH_NPLS,           \r\n"
+           "              L.ETC_NPLS           = M.ETC_NPLS,            \r\n"
+           "              L.PRLT_CHARGE_DESC   = M.PRLT_CHARGE_DESC,    \r\n"
+           "              L.PRLT_OPER_DESC     = M.PRLT_OPER_DESC,      \r\n"
+           "              L.PRLT_ETC_DESC      = M.PRLT_ETC_DESC,       \r\n"
+           "              L.CTLR_CLCT_CYCL     = M.CTLR_CLCT_CYCL,      \r\n"
+           "              L.CTLR_STTS_CYCL     = M.CTLR_STTS_CYCL,      \r\n"
+           "              L.REAL_DATA_YN       = M.REAL_DATA_YN,        \r\n"
+           "              L.CHNG_DT            = M.CHNG_DT,             \r\n"
+           "              L.CNGT_NPLS          = M.CNGT_NPLS            \r\n"
+           "WHEN NOT MATCHED THEN                                       \r\n"
+           "   INSERT (PRLT_CTLR_NMBR,                                  \r\n"
+           "           PRLT_CTLR_ID,                                    \r\n"
+           "           PRLT_NM,                                         \r\n"
+           "           PRLT_CTLR_IP,                                    \r\n"
+           "           PRLT_CTLR_PORT,                                  \r\n"
+           "           PRLT_CTLR_LOCAL_NO,                              \r\n"
+           "           PRLT_OPER_DVSN_CD,                               \r\n"
+           "           PRLT_TYPE_DVSN_CD,                               \r\n"
+           "           PRLT_TEL,                                        \r\n"
+           "           ISTL_LCTN_NM,                                    \r\n"
+           "           X_CRDN,                                          \r\n"
+           "           Y_CRDN,                                          \r\n"
+           "           DEL_YN,                                          \r\n"
+           "           ISTL_LCTN_ADDR,                                  \r\n"
+           "           WHOL_NPLS,                                       \r\n"
+           "           GNRL_NPLS,                                       \r\n"
+           "           LGVH_NPLS,                                       \r\n"
+           "           HVVH_NPLS,                                       \r\n"
+           "           EMVH_NPLS,                                       \r\n"
+           "           HNDC_NPLS,                                       \r\n"
+           "           WMON_NPLS,                                       \r\n"
+           "           ELVH_NPLS,                                       \r\n"
+           "           ETC_NPLS,                                        \r\n"
+           "           PRLT_CHARGE_DESC,                                \r\n"
+           "           PRLT_OPER_DESC,                                  \r\n"
+           "           PRLT_ETC_DESC,                                   \r\n"
+           "           CTLR_CLCT_CYCL,                                  \r\n"
+           "           CTLR_STTS_CYCL,                                  \r\n"
+           "           REAL_DATA_YN,                                    \r\n"
+           "           CNGT_NPLS,                                       \r\n"
+           "           CHNG_DT )                                        \r\n"
+           "   VALUES (M.PRLT_CTLR_NMBR,                                \r\n"
+           "           M.PRLT_CTLR_ID,                                  \r\n"
+           "           M.PRLT_NM,                                       \r\n"
+           "           M.PRLT_CTLR_IP,                                  \r\n"
+           "           M.PRLT_CTLR_PORT,                                \r\n"
+           "           M.PRLT_CTLR_LOCAL_NO,                            \r\n"
+           "           M.PRLT_OPER_DVSN_CD,                             \r\n"
+           "           M.PRLT_TYPE_DVSN_CD,                             \r\n"
+           "           M.PRLT_TEL,                                      \r\n"
+           "           M.ISTL_LCTN_NM,                                  \r\n"
+           "           M.X_CRDN,                                        \r\n"
+           "           M.Y_CRDN,                                        \r\n"
+           "           M.DEL_YN,                                        \r\n"
+           "           M.ISTL_LCTN_ADDR,                                \r\n"
+           "           M.WHOL_NPLS,                                     \r\n"
+           "           M.GNRL_NPLS,                                     \r\n"
+           "           M.LGVH_NPLS,                                     \r\n"
+           "           M.HVVH_NPLS,                                     \r\n"
+           "           M.EMVH_NPLS,                                     \r\n"
+           "           M.HNDC_NPLS,                                     \r\n"
+           "           M.WMON_NPLS,                                     \r\n"
+           "           M.ELVH_NPLS,                                     \r\n"
+           "           M.ETC_NPLS,                                      \r\n"
+           "           M.PRLT_CHARGE_DESC,                              \r\n"
+           "           M.PRLT_OPER_DESC,                                \r\n"
+           "           M.PRLT_ETC_DESC,                                 \r\n"
+           "           M.CTLR_CLCT_CYCL,                                \r\n"
+           "           M.CTLR_STTS_CYCL,                                \r\n"
+           "           M.REAL_DATA_YN,                                  \r\n"
+           "           M.CNGT_NPLS,                                     \r\n"
+           "           M.CHNG_DT )                                      \r\n";
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            AObj->CHNG_DT = Now().FormatString("yyyymmddhhnnss");
+
+            pADO->Parameters->ParamByName("p01")->Value = AObj->PRLT_CTLR_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->PRLT_CTLR_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->PRLT_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->PRLT_CTLR_IP;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->PRLT_CTLR_PORT;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->PRLT_CTLR_LOCAL_NO;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->PRLT_OPER_DVSN_CD;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->PRLT_TYPE_DVSN_CD;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->PRLT_TEL;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->ISTL_LCTN_NM;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->DEL_YN;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->ISTL_LCTN_ADDR;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->WHOL_NPLS;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->GNRL_NPLS;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->LGVH_NPLS;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->HVVH_NPLS;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->EMVH_NPLS;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->HNDC_NPLS;
+            pADO->Parameters->ParamByName("p21")->Value = AObj->WMON_NPLS;
+            pADO->Parameters->ParamByName("p22")->Value = AObj->ELVH_NPLS;
+            pADO->Parameters->ParamByName("p23")->Value = AObj->ETC_NPLS;
+            pADO->Parameters->ParamByName("p24")->Value = AObj->PRLT_CHARGE_DESC;
+            pADO->Parameters->ParamByName("p25")->Value = AObj->PRLT_OPER_DESC;
+            pADO->Parameters->ParamByName("p26")->Value = AObj->PRLT_ETC_DESC;
+            pADO->Parameters->ParamByName("p27")->Value = AObj->CTLR_CLCT_CYCL;
+            pADO->Parameters->ParamByName("p28")->Value = AObj->CTLR_STTS_CYCL;
+            pADO->Parameters->ParamByName("p29")->Value = AObj->REAL_DATA_YN;
+            pADO->Parameters->ParamByName("p30")->Value = AObj->CHNG_DT;
+            pADO->Parameters->ParamByName("p31")->Value = AObj->CNGT_NPLS;
+
+			pADO->ExecSQL();
+
+            MergeFcltInfo(AObj, ADbConn);
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TPrltCtlrManager::MergePrlt", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TPrltCtlrManager::MergePrlt", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TPrltCtlrManager::InsertPrlt(TPrltCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "INSERT INTO TB_PRLT_CTLR (      \r\n"
+           "            PRLT_CTLR_NMBR,     \r\n"
+           "            PRLT_CTLR_ID,       \r\n"
+           "            PRLT_NM,            \r\n"
+           "            PRLT_CTLR_IP,       \r\n"
+           "            PRLT_CTLR_PORT,     \r\n"
+           "            PRLT_CTLR_LOCAL_NO, \r\n"
+           "            PRLT_OPER_DVSN_CD,  \r\n"
+           "            PRLT_TYPE_DVSN_CD,  \r\n"
+           "            PRLT_TEL,           \r\n"
+           "            ISTL_LCTN_NM,       \r\n"
+           "            X_CRDN,             \r\n"
+           "            Y_CRDN,             \r\n"
+           "            DEL_YN,             \r\n"
+           "            ISTL_LCTN_ADDR,     \r\n"
+           "            WHOL_NPLS,          \r\n"
+           "            GNRL_NPLS,          \r\n"
+           "            LGVH_NPLS,          \r\n"
+           "            HVVH_NPLS,          \r\n"
+           "            EMVH_NPLS,          \r\n"
+           "            HNDC_NPLS,          \r\n"
+           "            WMON_NPLS,          \r\n"
+           "            ELVH_NPLS,          \r\n"
+           "            ETC_NPLS,           \r\n"
+           "            PRLT_CHARGE_DESC,   \r\n"
+           "            PRLT_OPER_DESC,     \r\n"
+           "            PRLT_ETC_DESC,      \r\n"
+           "            CTLR_CLCT_CYCL,     \r\n"
+           "            CTLR_STTS_CYCL,     \r\n"
+           "            REAL_DATA_YN,       \r\n"
+           "            CNGT_NPLS,          \r\n"
+           "            CHNG_DT )           \r\n"
+           "   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"
+           "           :p29,                \r\n";
+           "           :p30,                \r\n";
+           "           :p31 )               \r\n";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            AObj->CHNG_DT = Now().FormatString("yyyymmddhhnnss");
+
+            pADO->Parameters->ParamByName("p01")->Value = AObj->PRLT_CTLR_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->PRLT_CTLR_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->PRLT_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->PRLT_CTLR_IP;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->PRLT_CTLR_PORT;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->PRLT_CTLR_LOCAL_NO;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->PRLT_OPER_DVSN_CD;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->PRLT_TYPE_DVSN_CD;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->PRLT_TEL;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->ISTL_LCTN_NM;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->DEL_YN;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->ISTL_LCTN_ADDR;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->WHOL_NPLS;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->GNRL_NPLS;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->LGVH_NPLS;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->HVVH_NPLS;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->EMVH_NPLS;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->HNDC_NPLS;
+            pADO->Parameters->ParamByName("p21")->Value = AObj->WMON_NPLS;
+            pADO->Parameters->ParamByName("p22")->Value = AObj->ELVH_NPLS;
+            pADO->Parameters->ParamByName("p23")->Value = AObj->ETC_NPLS;
+            pADO->Parameters->ParamByName("p24")->Value = AObj->PRLT_CHARGE_DESC;
+            pADO->Parameters->ParamByName("p25")->Value = AObj->PRLT_OPER_DESC;
+            pADO->Parameters->ParamByName("p26")->Value = AObj->PRLT_ETC_DESC;
+            pADO->Parameters->ParamByName("p27")->Value = AObj->CTLR_CLCT_CYCL;
+            pADO->Parameters->ParamByName("p28")->Value = AObj->CTLR_STTS_CYCL;
+            pADO->Parameters->ParamByName("p29")->Value = AObj->REAL_DATA_YN;
+            pADO->Parameters->ParamByName("p30")->Value = AObj->CNGT_NPLS;
+            pADO->Parameters->ParamByName("p31")->Value = AObj->CHNG_DT;
+
+			pADO->ExecSQL();
+
+            MergeFcltInfo(AObj, ADbConn);
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TPrltCtlrManager::InsertPrlt", 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("TPrltCtlrManager::InsertPrlt", 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 TPrltCtlrManager::MergeFcltInfo(TPrltCtlr *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->PRLT_CTLR_ID;
+			pADO->Parameters->ParamByName("p02")->Value = "PARK";
+			pADO->Parameters->ParamByName("p03")->Value = AObj->PRLT_NM;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TPrltCtlrManager::MergeFcltInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TPrltCtlrManager::MergeFcltInfo", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 135 - 0
COMMON/CDS/CDSPrltCtlrF.h

@@ -0,0 +1,135 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSPrltCtlrFH
+#define CDSPrltCtlrFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "CDSObjectF.h"
+//---------------------------------------------------------------------------
+#include "CenterCommF.h"
+//---------------------------------------------------------------------------
+
+/*
+* 주차장 실시간 정보
+*/
+class TPrltRtInfr
+{
+public:
+    TPrltRtInfr(){}
+    virtual ~TPrltRtInfr(){}
+
+public:
+    String  PRLT_CTLR_NMBR;         //	N	NUMBER(10)	    N			주차장 제어기 번호
+    String  FLOR_NMBR;              //	N	VARCHAR2(20)	N			층 번호
+    String  UPDT_DT;                //	N	VARCHAR2(14)	Y			갱신 일시
+    int     GNRL_RMND_PRZN_NUM;     //	N	NUMBER(3)	    Y	0		일반 잔여 주차구역 개수
+    int     LGVH_RMND_PRZN_NUM;     //	N	NUMBER(3)	    Y	0		경차 잔여 주차구역 개수
+    int     HVVH_RMND_PRZN_NUM;     //	N	NUMBER(3)	    Y	0		대형 잔여 주차구역 개수
+    int     EMVH_RMND_PRZN_NUM;     //	N	NUMBER(3)	    Y	0		긴급차량 잔여 주차구역 개수
+    int     HNDC_RMND_PRZN_NUM;     //	N	NUMBER(3)	    Y	0		장애인 잔여 주차구역 개수
+    int     WMON_RMND_PRZN_NUM;     //	N	NUMBER(3)	    Y	0		여성전용 잔여 주차구역 개수
+    int     ELVH_RMND_PRZN_NUM;     //	N	NUMBER(3)	    Y	0		전기차 잔여 주차구역 개수
+    int     ETC_RMND_PRZN_NUM;      //	N	NUMBER(3)	    Y	0		기타 잔여 주차구역 개수
+};
+//---------------------------------------------------------------------------
+
+/*
+*  주차장 제어기
+*/
+class TPrltCtlr : public TCDSObject
+{
+public:
+    TPrltCtlr();
+    virtual ~TPrltCtlr();
+
+public:
+
+//182	POT		주차장 운영 구분	Parking Lot Operation Type			Y	
+//  1	POT0	POT	공영						Y	
+//  2	POT1	POT	민영						Y	
+//  3	POT2	POT	해상케이블카						Y	
+
+//183	PFT		주차장 시설 유형 구분	Parking Lot Facility Type			Y	
+//  1	PFT0	PFT	노상						Y	
+//  2	PFT1	PFT	노외						Y	
+//  3	PFT2	PFT	부설						Y	
+
+    String  PRLT_OPER_DVSN_CD;  //	N	VARCHAR2(7)	    Y			주차장 운영 구분 코드
+    String  PRLT_TYPE_DVSN_CD;  //	N	VARCHAR2(7)	    Y			주차장 유형 구분 코드
+    String  PRLT_TEL;           //	N	VARCHAR2(128)	Y			전화번호
+    String  ISTL_LCTN_ADDR;     //	N	VARCHAR2(200)	Y			설치 위치 주소
+    int     WHOL_NPLS;          //	N	NUMBER(3)	    Y	0		전체 주차면수
+    int     GNRL_NPLS;          //	N	NUMBER(3)	    Y	0		일반 주차면수
+    int     LGVH_NPLS;          //	N	NUMBER(3)	    Y	0		경차 주차면수
+    int     HVVH_NPLS;          //	N	NUMBER(3)	    Y	0		대형 주차면수
+    int     EMVH_NPLS;          //	N	NUMBER(3)	    Y	0		긴급차량 주차면수
+    int     HNDC_NPLS;          //	N	NUMBER(3)	    Y	0		장애인 주차면수
+    int     WMON_NPLS;          //	N	NUMBER(3)	    Y	0		여성전용 주차면수
+    int     ELVH_NPLS;          //	N	NUMBER(3)	    Y	0		전기차 주차면수
+    int     ETC_NPLS;           //	N	NUMBER(3)	    Y	0		기타 주차면수
+    int     CNGT_NPLS;          //	N	NUMBER(3)	    Y	10		혼잡기준차 주차면수
+    String  PRLT_CHARGE_DESC;   //	N	VARCHAR2(512)	Y			요금정보
+    String  PRLT_OPER_DESC;     //	N	VARCHAR2(512)	Y			운영정보
+    String  PRLT_ETC_DESC;      //	N	VARCHAR2(512)	Y			기타부가정보
+    String  REAL_DATA_YN;       //	N	CHAR(1)	        Y			실시간주차정보제공여부
+    int     CTLR_CLCT_CYCL;     //	N	NUMBER(3)	    Y	0		제어기 수집 주기
+    int     CTLR_STTS_CYCL;     //	N	NUMBER(3)	    Y	0		제어기 상태 주기
+    String  CHNG_DT;            //	N	VARCHAR2(14)	Y	to_char(sysdate, 'yyyymmddhh24miss')		정보등록(수정)일자
+//실시간주차정보, 일반주차정보
+//주차장명
+//전화번호
+//주소
+//지번
+//전체주차면(총주차대수, 일반, 경차, 대형, 긴급차량, 장애인, 여성, 기타)
+//요금정보
+//운영정보
+//기타정보
+//정보등록(수정)일자
+public:
+    INT_PARK_STATE   STATE;
+
+public:
+    __property String  PRLT_CTLR_NMBR     = { read = CTLR_NMBR,     write = CTLR_NMBR     };
+    __property String  PRLT_CTLR_ID       = { read = CTLR_ID,       write = CTLR_ID       };
+    __property String  PRLT_NM            = { read = NAME,          write = NAME          };
+    __property String  PRLT_CTLR_IP       = { read = CTLR_IP,       write = CTLR_IP       };
+    __property int     PRLT_CTLR_PORT     = { read = CTLR_PORT,     write = CTLR_PORT     };
+    __property int     PRLT_CTLR_LOCAL_NO = { read = CTLR_LOCAL_NO, write = CTLR_LOCAL_NO };
+    __property String  PRLT_TYPE_CD       = { read = TYPE_CD,       write = TYPE_CD       };
+
+};
+//---------------------------------------------------------------------------
+
+/*
+* Prlt Manager
+*/
+class TPrltCtlrManager
+{
+public:
+    TPrltCtlrManager();
+    virtual ~TPrltCtlrManager();
+
+public:
+    TItsMap<String, TPrltCtlr*>    FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadStatusFromDb(TADOConnection *ADbConn=NULL);
+
+    bool GetNextPrltId(int &ANmbr, int &AId, TADOConnection *ADbConn=NULL);
+
+    bool DeletePrlt(TPrltCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertPrlt(TPrltCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool UpdatePrlt(TPrltCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool MergePrlt(TPrltCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeFcltInfo(TPrltCtlr *AObj, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TPrltCtlrManager *PrltCtlrManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 225 - 0
COMMON/CDS/CDSProcessF.cpp

@@ -0,0 +1,225 @@
+//---------------------------------------------------------------------------
+
+#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*/)
+{
+    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";
+
+    FLists.Lock();
+    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->Prepared = true;
+			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::LoadFromDb", 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::LoadFromDb", 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";
+
+    ItsProcessManager->FLists.Lock();
+    try
+    {
+        TItsProcess *pProcess = NULL;
+        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->Prepared = true;
+            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;
+}
+//---------------------------------------------------------------------------
+
+

+ 85 - 0
COMMON/CDS/CDSProcessF.h

@@ -0,0 +1,85 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSProcessFH
+#define CDSProcessFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "ITSLibF.h"
+#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:
+    TItsMap<String, TItsProcess*>    FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadProcessStatusFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsProcessManager *ItsProcessManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 281 - 0
COMMON/CDS/CDSRepeatCongestF.cpp

@@ -0,0 +1,281 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSRepeatCongestF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsRepeatCongest::TItsRepeatCongest()
+{
+}
+//---------------------------------------------------------------------------
+TItsRepeatCongest::~TItsRepeatCongest()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsRepeatCongest *pRepeatCongest = new TItsRepeatCongest();
+
+                pRepeatCongest->IFSC_ID		            = pADO->FieldByName("IFSC_ID")->AsString;                  // 정보제공구간 ID
+                pRepeatCongest->STAT_YM		            = pADO->FieldByName("CRTN_YMD")->AsString;                  // 통계 년월
+                pRepeatCongest->DAY_TYPE_CD	            = pADO->FieldByName("DAY_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->CRTN_YMD		        = pADO->FieldByName("CRTN_YMD")->AsString;                 // 생성 일자
+                pRepeatCongest->REPT_CNGS_SECT_ORGN_CD	= pADO->FieldByName("REPT_CNGS_SECT_ORGN_CD")->AsString;   // 반복 정체 구간 원본 코드
+
+				if( pRepeatCongest->DCSN_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->Prepared = true;
+			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->Prepared = true;
+			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;
+}
+//---------------------------------------------------------------------------
+

+ 101 - 0
COMMON/CDS/CDSRepeatCongestF.h

@@ -0,0 +1,101 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSRepeatCongestFH
+#define CDSRepeatCongestFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  RepeatCongest class
+*/
+class TItsRepeatCongest
+{
+public:
+    TItsRepeatCongest();
+    virtual ~TItsRepeatCongest();
+
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String IFSC_ID;                // 정보제공구간 ID
+    String STAT_YM;                // 통계 년월
+    String DAY_TYPE_CD;            // 요일 유형 코드
+    String CNFS_STRT_HM;           // 혼잡 시작 시분
+    String CNFS_END_HM;            // 혼잡 종료 시분
+    String AVRG_SPED;              // 평균 속도
+    String AVRG_TRVL_HH;           // 평균 통행 시간
+    String DCSN_YN;                // 확정 여부
+    String CRTN_YMD;               // 생성 일자
+    String REPT_CNGS_SECT_ORGN_CD;	// 반복 정체 구간 원본 코드
+
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+};
+//---------------------------------------------------------------------------
+
+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:
+    TItsMap<String, TItsRepeatCongest*>     FLists;
+    TItsMap<String, TItsRepeatCongest*>     FListsCnfm;
+    int                                     FDataSeq;
+
+    TItsMap<String, TItsRepeatCongestWthr*> FListsWthr;
+    TItsMap<String, 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 "CDSLayerF.h"
+#include "ITSUtilF.h"
+#include "AppGlobalF.h"
+#include "CDSLinkF.h"
+#include "CDSIfscF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsRoad::TItsRoad()
+{
+    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) && LoadIfscList(ADbConn));
+}
+//---------------------------------------------------------------------------
+bool TItsRoadManager::LoadRoad(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT ROAD_ID      ,                              \r\n"
+           "       ROAD_NM      ,                              \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";
+#else
+    sQry = "SELECT ROAD_ID      ,                              \r\n"
+           "       ROAD_NAME AS ROAD_NM,                       \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";
+#endif
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsRoad *pRoad = new TItsRoad();
+
+                pRoad->IsVertex     = false;
+                pRoad->ROAD_ID      = pADO->FieldByName("ROAD_ID")->AsString;
+                pRoad->ROAD_NM      = pADO->FieldByName("ROAD_NM")->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;
+                //pRoad->REGN_YN          = "Y";
+
+				FLists.Push(pRoad->ROAD_ID, pRoad);
+                pRoad->Completed = true;
+
+                pRoad->TRAF = new TCDSTraffic();
+            }
+        }
+        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::LoadIfscList(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT ROAD_ID, IFSC_ID, ORD \r\n"
+           "  FROM TB_ROAD_RLTN_IFSC     \r\n";
+
+    TItsRoad *pRoad = NULL;
+    TItsIfsc *pIfsc;
+    TItsLink *pLink;
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            int nORD;
+
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+            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->FIfscs.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->FLinks.begin(); itPos2 != pIfsc->FLinks.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->FIfscs.Push(sORD, pSubRoad);
+#endif
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsRoadManager::LoadIfscList", 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::LoadIfscList", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return LoadVrtxFromDb(ADbConn);
+}
+//---------------------------------------------------------------------------
+bool TItsRoadManager::LoadVrtxFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+    sQry = "SELECT A.ROAD_ID, A.LEVL,           \r\n"
+           "       A.X_CRDN_ARR, A.Y_CRDN_ARR   \r\n"
+           "  FROM TB_ROAD_VRTX_ARR A,          \r\n"
+           "       TB_ROAD          B           \r\n"
+           " WHERE B.DEL_YN  = 'N'              \r\n"
+           "   AND B.ROAD_ID = A.ROAD_ID        \r\n"
+           "   AND A.LEVL    = 5                \r\n";
+#else
+    sQry = "SELECT *                 \r\n"
+           "  FROM VW_ROAD_VRTX_ARR  \r\n";
+#endif
+
+    TItsRoad* pObj;
+//    int       LEVL;
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String ROAD_ID = pADO->FieldByName("ROAD_ID")->AsString;
+                pObj = FLists.Find(ROAD_ID);
+                if (!pObj) continue;
+
+#if 0
+                LEVL = pADO->FieldByName("LEVL")->AsInteger;
+                TItsVrtx* pVrtx = new TItsVrtx();
+                pVrtx->X_CRDN_ARR = pADO->FieldByName("X_CRDN_ARR")->AsString;
+                pVrtx->Y_CRDN_ARR = pADO->FieldByName("Y_CRDN_ARR")->AsString;
+
+				pObj->Vrtxs.Push(LEVL, pVrtx);
+#else
+                pObj->IsVertex   = true;
+                pObj->X_CRDN_ARR = pADO->FieldByName("X_CRDN_ARR")->AsString;
+                pObj->Y_CRDN_ARR = pADO->FieldByName("Y_CRDN_ARR")->AsString;
+#endif
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsRoadManager::LoadVrtxFromDb", 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::LoadVrtxFromDb", 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::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";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			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 == "LTC0") pObj->TRAF->MISSING = "Y";
+
+                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;
+}
+//---------------------------------------------------------------------------
+

+ 93 - 0
COMMON/CDS/CDSRoadF.h

@@ -0,0 +1,93 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSRoadFH
+#define CDSRoadFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+#include "CDSLayerF.h"
+#include "CDSObjectF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  ROAD class
+*/
+class TItsRoad
+{
+public:
+    TItsRoad();
+    virtual ~TItsRoad();
+    void Clear();
+
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String  ROAD_ID;
+    String	ROAD_NM;
+    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;
+
+    String  LINK_ID;
+
+    TCDSTraffic             *TRAF;
+    TItsMap<int, TItsVrtx*>  Vrtxs;
+
+    bool   IsVertex;
+    String X_CRDN_ARR;
+    String Y_CRDN_ARR;
+    int    SPED;
+    int    TRAF_GRAD;
+
+    std::map<int, String>   FIfscs;
+
+protected:
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+    void InitTraffic();
+};
+//---------------------------------------------------------------------------
+
+/*
+* Road Manager
+*/
+class TItsRoadManager
+{
+public:
+    TItsRoadManager();
+    virtual ~TItsRoadManager();
+
+public:
+    TItsMap<String, TItsRoad*>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadVrtxFromDb(TADOConnection *ADbConn=NULL);
+
+    bool LoadRoad(TADOConnection *ADbConn=NULL);
+    bool LoadIfscList(TADOConnection *ADbConn=NULL);
+
+    void InitTraffic();
+    bool LoadTraffic(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsRoadManager *ItsRoadManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 496 - 0
COMMON/CDS/CDSServiceLinkF.cpp

@@ -0,0 +1,496 @@
+//---------------------------------------------------------------------------
+
+#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
+

+ 62 - 0
COMMON/CDS/CDSStaIncidentF.cpp

@@ -0,0 +1,62 @@
+//---------------------------------------------------------------------------
+
+#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 "ITSLibF.h"
+#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:
+    TItsMap<String, TItsStaIncidentInfo*>    FSubLists;
+};
+//---------------------------------------------------------------------------
+
+/*
+* StaIncident Manager
+*/
+class TItsStaIncidentManager
+{
+public:
+    TItsStaIncidentManager();
+    virtual ~TItsStaIncidentManager();
+
+public:
+    TItsMap<String, TItsStaIncident*>    FLists;
+};
+//---------------------------------------------------------------------------
+//extern TItsStaIncidentManager *ItsStaIncidentManager;
+//---------------------------------------------------------------------------
+
+
+#endif
+

+ 207 - 0
COMMON/CDS/CDSTrafficGradeF.cpp

@@ -0,0 +1,207 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSTrafficGradeF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsTrafficSubGrade::TItsTrafficSubGrade()
+{
+    TItsTrafficSubGrade("", "");
+}
+//---------------------------------------------------------------------------
+TItsTrafficSubGrade::TItsTrafficSubGrade(String ACode, String ASubCode)
+{
+    SECT_GRAD_CD = ACode;
+    CMTR_GRAD_CD = ASubCode;
+
+    FModified = false;
+    FCompleted= false;
+}
+//---------------------------------------------------------------------------
+TItsTrafficSubGrade::~TItsTrafficSubGrade()
+{
+}
+//---------------------------------------------------------------------------
+
+TItsTrafficGrade::TItsTrafficGrade()
+{
+    TItsTrafficGrade("");
+}
+//---------------------------------------------------------------------------
+TItsTrafficGrade::TItsTrafficGrade(String ACode)
+{
+    SECT_GRAD_CD = ACode;
+
+    FModified = false;
+    FCompleted= false;
+}
+//---------------------------------------------------------------------------
+TItsTrafficGrade::~TItsTrafficGrade()
+{
+    FSubLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+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->Prepared = true;
+			pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsTrafficGrade *pCode = new TItsTrafficGrade();
+
+                pCode->SECT_GRAD_CD = pADO->FieldByName("SECT_GRAD_CD")->AsString; //'구간 등급 코드';
+                pCode->SECT_GRAD_NM = pADO->FieldByName("SECT_GRAD_NM")->AsString; //'구간 등급 명';
+
+				FLists.Push(pCode->SECT_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->Prepared = true;
+			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->SECT_GRAD_CD   = sGradCd;
+                pSubCode->CMTR_GRAD_CD   = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
+                pSubCode->LWST_TRVL_SPED = pADO->FieldByName("LWST_TRVL_SPED")->AsInteger;
+                pSubCode->HGHS_TRVL_SPED = pADO->FieldByName("HGHS_TRVL_SPED")->AsInteger;
+                pSubCode->CNGS_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;
+}
+//---------------------------------------------------------------------------
+
+

+ 87 - 0
COMMON/CDS/CDSTrafficGradeF.h

@@ -0,0 +1,87 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSTrafficGradeFH
+#define CDSTrafficGradeFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+class TItsTrafficSubGrade
+{
+public:
+    TItsTrafficSubGrade();
+    TItsTrafficSubGrade(String ACode, String ASubCode);
+    virtual ~TItsTrafficSubGrade();
+
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String SECT_GRAD_CD;       // VARCHAR2(7 BYTE)              NOT NULL,		'소통 등급 분류';
+    String CMTR_GRAD_CD;       // VARCHAR(7 BYTE) NOT NULL,		'공통 코드';
+    int    LWST_TRVL_SPED;     // VARCHAR(3 BYTE) NOT NULL,  '공통 분류 코드';
+    int    HGHS_TRVL_SPED;     // VARCHAR(60 BYTE),        '공통 코드 한글 명';
+    String CNGS_GRAD_YN;       // VARCHAR(60 BYTE),       '공통 코드 영문 명';
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+};
+
+/*
+*  Traffic Grade class
+*/
+class TItsTrafficGrade
+{
+public:
+    TItsTrafficGrade();
+    TItsTrafficGrade(String ACode);
+    virtual ~TItsTrafficGrade();
+private:
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String SECT_GRAD_CD;
+    String SECT_GRAD_NM;
+
+    TItsMap<String, TItsTrafficSubGrade*>    FSubLists;
+
+public:
+    __property bool   Modified  = {read = FModified};
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+
+};
+//---------------------------------------------------------------------------
+
+/*
+* ItsTrafficGrade Manager
+*/
+class TItsTrafficGradeManager
+{
+public:
+    TItsTrafficGradeManager();
+    virtual ~TItsTrafficGradeManager();
+
+public:
+    TItsMap<String, TItsTrafficGrade*>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadTrafficGrade(TADOConnection *ADbConn=NULL);
+    bool LoadTrafficSubGrade(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsTrafficGradeManager *ItsTrafficGradeManager;
+//---------------------------------------------------------------------------
+
+
+#endif
+

+ 230 - 0
COMMON/CDS/CDSTrafficOprLinkF.cpp

@@ -0,0 +1,230 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSTrafficOprLinkF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+TItsTrafficOprLink::TItsTrafficOprLink()
+{
+	FGridIndex    = -1; // ±×¸®µå À妽º
+}
+//---------------------------------------------------------------------------
+TItsTrafficOprLink::~TItsTrafficOprLink()
+{
+}
+//---------------------------------------------------------------------------
+
+
+//---------------------------------------------------------------------------
+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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsTrafficOprLink *pTrafficOprLink = new TItsTrafficOprLink();
+
+                pTrafficOprLink->LINK_ID      = pADO->FieldByName("LINK_ID")->AsString;
+                pTrafficOprLink->CRTN_DT      = pADO->FieldByName("CRTN_DT")->AsString;
+                pTrafficOprLink->APLY_STRT_DT = pADO->FieldByName("APLY_STRT_DT")->AsString;
+                pTrafficOprLink->APLY_END_DT  = pADO->FieldByName("APLY_END_DT")->AsString;
+                pTrafficOprLink->TFVL         = pADO->FieldByName("TFVL")->AsString;
+                pTrafficOprLink->SPED         = pADO->FieldByName("SPED")->AsString;
+                pTrafficOprLink->OCPY_RATE    = pADO->FieldByName("OCPY_RATE")->AsString;
+                pTrafficOprLink->TRVL_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;
+}
+//---------------------------------------------------------------------------
+

+ 71 - 0
COMMON/CDS/CDSTrafficOprLinkF.h

@@ -0,0 +1,71 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSTrafficOprLinkFH
+#define CDSTrafficOprLinkFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "cxCustomData.hpp"
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  TrafficOprLink class
+*/
+class TItsTrafficOprLink
+{
+public:
+    TItsTrafficOprLink();
+    virtual ~TItsTrafficOprLink();
+
+private:
+    int     FEditMode;
+    bool    FModified;
+    bool    FCompleted;
+
+public:
+    String LINK_ID;        // 링크ID
+    String CRTN_DT;        // 생성 일시
+    String APLY_STRT_DT;   // 적용 시작 일시
+    String APLY_END_DT;    // 적용 종료 일시
+    String TFVL;           // 교통량
+    String SPED;           // 속도
+    String OCPY_RATE;      // 점유율
+    String TRVL_HH;        // 통행 시간
+
+	int    FGridIndex;	    // 메인폼에 뿌려지는 그리드 인덱스
+
+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 };
+};
+//---------------------------------------------------------------------------
+
+/*
+* TrafficOprLink Manager
+*/
+class TItsTrafficOprLinkManager
+{
+public:
+    TItsTrafficOprLinkManager();
+    virtual ~TItsTrafficOprLinkManager();
+
+public:
+    int    FDataSeq;
+    TItsMap<String, 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_USER_GROP_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->Prepared = true;
+			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 "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  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:
+    TItsMap<String, TItsUser*>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TItsUserManager *ItsUserManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 374 - 0
COMMON/CDS/CDSUtisF.cpp

@@ -0,0 +1,374 @@
+//---------------------------------------------------------------------------
+
+#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->Prepared = true;
+            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->Prepared = true;
+            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->Prepared = true;
+            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 "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  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];
+    TItsMap<String, 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
+

+ 1424 - 0
COMMON/CDS/CDSVdsCtlrF.cpp

@@ -0,0 +1,1424 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSVdsCtlrF.h"
+#include "ITSDbF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+
+TVdsDtctLink::TVdsDtctLink()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+}
+//---------------------------------------------------------------------------
+TVdsDtctLink::~TVdsDtctLink()
+{
+}
+//---------------------------------------------------------------------------
+
+TVdsDtct::TVdsDtct()
+{
+	FCompleted = false;
+    FEditMode  = DB_INIT;
+	FGridIndex = -1;
+	MEM_DEL    = "N";
+    //Clear();
+}
+//---------------------------------------------------------------------------
+TVdsDtct::~TVdsDtct()
+{
+}
+//---------------------------------------------------------------------------
+
+TVdsCtlr::TVdsCtlr()
+{
+}
+//---------------------------------------------------------------------------
+TVdsCtlr::~TVdsCtlr()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TVdsCtlrManager *VdsCtlrManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Vds Manager
+*/
+TVdsCtlrManager::TVdsCtlrManager()
+{
+}
+//---------------------------------------------------------------------------
+TVdsCtlrManager::~TVdsCtlrManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+bool TVdsCtlrManager::LoadFromDbVdsLink(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.LINK_ID, C.NODE_NAME AS STR_NAME, D.NODE_NAME AS END_NAME,         \r\n"
+           "       F.VDS_CTLR_NMBR, F.VDS_NM                                            \r\n"
+           "  FROM TB_VDS_DTCT_RLTN_LINK A,                                             \r\n"
+           "       TB_LINK               B,                                             \r\n"
+           "       TB_NODE               C,                                             \r\n"
+           "       TB_NODE               D,                                             \r\n"
+           "       TB_VDS_DTCT           E,                                             \r\n"
+           "       TB_VDS_CTLR           F                                              \r\n"
+           " WHERE A.LINK_ID   = B.LINK_ID                                              \r\n"
+           "   AND B.F_NODE_ID = C.NODE_ID                                              \r\n"
+           "   AND B.T_NODE_ID = D.NODE_ID                                              \r\n"
+           "   AND A.VDS_DTCT_NMBR = E.VDS_DTCT_NMBR                                    \r\n"
+           "   AND E.VDS_CTLR_NMBR = F.VDS_CTLR_NMBR                                    \r\n"
+           "   AND F.VDS_TYPE_CD   = 'I'                                                \r\n"
+           " GROUP BY A.LINK_ID, C.NODE_NAME, D.NODE_NAME, F.VDS_CTLR_NMBR, F.VDS_NM    \r\n";
+//           " ORDER BY F.VDS_CTLR_NMBR, A.LINK_ID                                        \r\n";
+    try
+    {
+        FLinkSelCnt = 0;
+        FLinkLists.Lock();
+        FLinkLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TVdsLink *pObj = new TVdsLink();
+
+                pObj->VDS_CTLR_NMBR = pADO->FieldByName("VDS_CTLR_NMBR")->AsString;
+                pObj->VDS_NM        = pADO->FieldByName("VDS_NM")->AsString;
+                pObj->LINK_ID       = pADO->FieldByName("LINK_ID")->AsString;
+                pObj->STR_NAME      = pADO->FieldByName("STR_NAME")->AsString;
+                pObj->END_NAME      = pADO->FieldByName("END_NAME")->AsString;
+
+                pObj->IsSelected = true;
+                FLinkSelCnt++;
+				FLinkLists.Push(pObj->LINK_ID, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TItsAtrdManager::LoadFromDbAtrdName", 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::LoadFromDbAtrdName", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLinkLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+bool TVdsCtlrManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *            \r\n"
+           "  FROM TB_VDS_CTLR  \r\n"
+           " WHERE DEL_YN = 'N' \r\n";
+
+    FLists.Lock();
+    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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TVdsCtlr *pObj = new TVdsCtlr();
+
+                pObj->VDS_CTLR_NMBR     = pADO->FieldByName("VDS_CTLR_NMBR")->AsString;
+                pObj->VDS_CTLR_ID       = pADO->FieldByName("VDS_CTLR_ID")->AsString;
+                pObj->VDS_NM            = pADO->FieldByName("VDS_NM")->AsString;
+                pObj->VDS_CTLR_IP       = pADO->FieldByName("VDS_CTLR_IP")->AsString;
+                pObj->VDS_CTLR_PORT     = pADO->FieldByName("VDS_CTLR_PORT")->AsInteger;
+                pObj->VDS_CTLR_LOCAL_NO = pADO->FieldByName("VDS_CTLR_LOCAL_NO")->AsInteger;
+                pObj->VDS_TYPE_CD       = pADO->FieldByName("VDS_TYPE_CD")->AsString;
+                pObj->ISTL_LCTN_NM      = pADO->FieldByName("ISTL_LCTN_NM")->AsString;
+                pObj->X_CRDN            = pADO->FieldByName("X_CRDN")->AsFloat;
+                pObj->Y_CRDN            = pADO->FieldByName("Y_CRDN")->AsFloat;
+                pObj->DEL_YN            = pADO->FieldByName("DEL_YN")->AsString;
+
+                pObj->GROUP_NO          = pADO->FieldByName("GROUP_NO")->AsInteger;
+                pObj->FAN_MODE          = pADO->FieldByName("FAN_MODE")->AsInteger;
+                pObj->FAN_RUN_TMPR      = pADO->FieldByName("FAN_RUN_TMPR")->AsInteger;
+                pObj->HETR_RUN_TMPR     = pADO->FieldByName("HETR_RUN_TMPR")->AsInteger;
+                pObj->DETECT_LANES      = pADO->FieldByName("DETECT_LANES")->AsInteger;
+                pObj->TRAF_CLCT_CYCL    = pADO->FieldByName("TRAF_CLCT_CYCL")->AsInteger;
+                pObj->STTS_CLCT_CYCL    = pADO->FieldByName("STTS_CLCT_CYCL")->AsInteger;
+                pObj->ISTL_LCTN_ADDR    = pADO->FieldByName("ISTL_LCTN_ADDR")->AsString;
+
+                pObj->MEM_DEL           = "N";
+
+				FLists.Push(pObj->VDS_CTLR_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("TVdsCtlrManager::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("TVdsCtlrManager::LoadFromDb", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return LoadFromCmraDb(ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TVdsCtlrManager::LoadFromCmraDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *            \r\n"
+           "  FROM TB_VDS_CMRA  \r\n"
+           " WHERE DEL_YN = 'N' \r\n";
+
+    TVdsCtlr *pVds;
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String VDS_CTLR_NMBR = pADO->FieldByName("VDS_CTLR_NMBR")->AsString;
+                pVds = FLists.Find(VDS_CTLR_NMBR);
+                if (!pVds) continue;
+
+				TVdsCmra *pObj = new TVdsCmra();
+
+                pObj->VDS_CTLR_NMBR  = VDS_CTLR_NMBR;
+                pObj->VDS_CMRA_NO    = pADO->FieldByName("VDS_CMRA_NO")->AsInteger;
+                pObj->VDS_CMRA_NM    = pADO->FieldByName("VDS_CMRA_NM")->AsString.Trim();
+                pObj->DETECT_LANE    = pADO->FieldByName("DETECT_LANE")->AsInteger;
+                pObj->CMRA_DRCT_CD   = pADO->FieldByName("CMRA_DRCT_CD")->AsString.Trim();
+                pObj->DEL_YN         = pADO->FieldByName("DEL_YN")->AsString.Trim();
+                pObj->CCAM_CTLR_NMBR = pADO->FieldByName("CCAM_CTLR_NMBR")->AsString.Trim();
+                pObj->ROAD_NAME      = pADO->FieldByName("ROAD_NAME")->AsString.Trim();
+                pObj->CROSS_NAME     = pADO->FieldByName("CROSS_NAME")->AsString.Trim();
+                pObj->DIR_NAME       = pADO->FieldByName("DIR_NAME")->AsString.Trim();
+                pObj->VDS_CMRA_IP    = pADO->FieldByName("VDS_CMRA_IP")->AsString.Trim();
+
+				pVds->FCmras.Push(pObj->VDS_CMRA_NO, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TVdsCtlrManager::LoadFromCmraDb", 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("TVdsCtlrManager::LoadFromCmraDb", 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 TVdsCtlrManager::LoadFromDtctDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *            \r\n"
+           "  FROM TB_VDS_DTCT  \r\n";
+
+    TVdsCtlr *pVds;
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String VDS_CTLR_NMBR = pADO->FieldByName("VDS_CTLR_NMBR")->AsString;
+                pVds = FLists.Find(VDS_CTLR_NMBR);
+                if (!pVds) continue;
+
+				TVdsDtct *pObj = new TVdsDtct();
+
+                pObj->VDS_DTCT_NMBR = pADO->FieldByName("VDS_DTCT_NMBR")->AsString;
+                pObj->VDS_DTCT_ID   = pADO->FieldByName("VDS_DTCT_ID")->AsString;
+                pObj->VDS_DTCT_NM   = pADO->FieldByName("VDS_DTCT_NM")->AsString;
+                pObj->VDS_CTLR_NMBR = pADO->FieldByName("VDS_CTLR_NMBR")->AsString;
+                pObj->VDS_CMRA_NO   = pADO->FieldByName("VDS_CMRA_NO")->AsInteger;
+                pObj->DTCT_TYPE     = pADO->FieldByName("DTCT_TYPE")->AsString;
+                pObj->DTCT_DIR      = pADO->FieldByName("DTCT_DIR")->AsString;
+                pObj->DETECT_LANE   = pADO->FieldByName("DETECT_LANE")->AsInteger;
+                pObj->ISTL_LANE     = pADO->FieldByName("ISTL_LANE")->AsInteger;
+                pObj->SPED_CLCT_YN  = pADO->FieldByName("SPED_CLCT_YN")->AsString;
+                pObj->TFVL_CLCT_YN  = pADO->FieldByName("TFVL_CLCT_YN")->AsString;
+                pObj->OCPY_CLCT_YN  = pADO->FieldByName("OCPY_CLCT_YN")->AsString;
+                pObj->MAX_TFVL      = pADO->FieldByName("MAX_TFVL")->AsInteger;
+                pObj->MIN_TFVL      = pADO->FieldByName("MIN_TFVL")->AsInteger;
+                pObj->MAX_OCPY_RATE = pADO->FieldByName("MAX_OCPY_RATE")->AsFloat;
+                pObj->MIN_OCPY_RATE = pADO->FieldByName("MIN_OCPY_RATE")->AsFloat;
+                pObj->MAX_SPED      = pADO->FieldByName("MAX_SPED")->AsInteger;
+                pObj->MIN_SPED      = pADO->FieldByName("MIN_SPED")->AsInteger;
+                pObj->USE_YN        = pADO->FieldByName("USE_YN")->AsString;
+                pObj->DEL_YN        = pADO->FieldByName("DEL_YN")->AsString;
+
+				pVds->FDtcts.Push(pObj->VDS_DTCT_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("TVdsCtlrManager::LoadFromDtctDb", 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("TVdsCtlrManager::LoadFromDtctDb", 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 TVdsCtlrManager::LoadFromDtctLinkDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.VDS_CTLR_NMBR,                  \r\n"
+           "       A.VDS_DTCT_NMBR,                  \r\n"
+           "       B.LINK_ID                         \r\n"
+           "  FROM TB_VDS_DTCT           A,          \r\n"
+           "       TB_VDS_DTCT_RLTN_LINK B           \r\n"
+           " WHERE A.VDS_DTCT_NMBR = B.VDS_DTCT_NMBR \r\n"
+           " ORDER BY VDS_CTLR_NMBR                  \r\n";
+
+    TVdsCtlr *pVds;
+    TVdsDtct *pVdsDtct;
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String VDS_CTLR_NMBR = pADO->FieldByName("VDS_CTLR_NMBR")->AsString;
+                pVds = FLists.Find(VDS_CTLR_NMBR);
+                if (!pVds) continue;
+
+                String VDS_DTCT_NMBR = pADO->FieldByName("VDS_DTCT_NMBR")->AsString;
+                pVdsDtct = pVds->FDtcts.Find(VDS_DTCT_NMBR);
+                if (!pVdsDtct) continue;
+
+                TVdsDtctLink *pObj = new TVdsDtctLink();
+
+                pObj->VDS_CTLR_NMBR = VDS_CTLR_NMBR;
+                pObj->VDS_DTCT_NMBR = VDS_DTCT_NMBR;
+                pObj->LINK_ID       = pADO->FieldByName("LINK_ID")->AsString;
+
+				pVdsDtct->FLinks.Push(pObj->LINK_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("TVdsCtlrManager::LoadFromDtctLinkDb", 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("TVdsCtlrManager::LoadFromDtctLinkDb", 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 TVdsCtlrManager::LoadStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                                                        \r\n"
+           "  FROM TB_VDS_CTLR_STTS A, TB_VDS_CTLR B                        \r\n"
+           " WHERE A.VDS_CTLR_NMBR = B.VDS_CTLR_NMBR                        \r\n"
+           "   AND A.UPDT_DT >= TO_CHAR(SYSDATE-2/1440, 'YYYYMMDDHH24MISS') \r\n";
+
+    FLists.Lock();
+    try
+    {
+        TVdsCtlr *pObj = NULL;
+
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+            pADO->SQL->Clear();
+            pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+            pADO->Open();
+            //int nRows = pADO->RecordCount;
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sVmsNmbr = pADO->FieldByName("VDS_CTLR_NMBR")->AsString;
+                pObj = FLists.Find(sVmsNmbr);
+                if (!pObj) continue;
+
+                String UPDT_DT      = pADO->FieldByName("UPDT_DT")->AsString;
+                String CONN_STTS_CD = pADO->FieldByName("CMNC_STTS_CD")->AsString;
+                if (CONN_STTS_CD != "CMS0")
+                {
+                    //통신장애
+                    continue;
+                }
+#if 0
+                pObj->STATE.Comm = vms_comm_normal;
+
+                String CBOXDOOR_OPEN_STTS_CD = pADO->FieldByName("CBOX_DOOR_STTS_CD")->AsString;
+                if      (CBOXDOOR_OPEN_STTS_CD == "CDS0") pObj->STATE.DoorStatus = vms_door_close;
+                else if (CBOXDOOR_OPEN_STTS_CD == "CDS1") pObj->STATE.DoorStatus = vms_door_open;
+
+                String CBOXFAN_STTS_CD = pADO->FieldByName("FAN_STTS_CD")->AsString;
+                if      (CBOXFAN_STTS_CD == "MOS0") pObj->STATE.ModulePowerStatus = vms_module_power_on;
+                else if (CBOXFAN_STTS_CD == "MOS1") pObj->STATE.ModulePowerStatus = vms_module_power_off;
+
+                String CBOX_TMPR = pADO->FieldByName("CBOX_TMPR")->AsString;
+                pObj->STATE.BodyTemp = CBOX_TMPR.ToIntDef(0);
+
+                String CBOX_HMDT = pADO->FieldByName("BRGH_VAL")->AsString;
+                pObj->STATE.LuminanceStatus = CBOX_HMDT.ToIntDef(0);
+
+                String FAN_STTS_CD = pADO->FieldByName("FAN_STTS_CD")->AsString;
+                if      (FAN_STTS_CD == "PAS0") pObj->STATE.FanStatus = vms_fan_on;
+                else if (FAN_STTS_CD == "PAS1") pObj->STATE.FanStatus = vms_fan_off;
+
+                String HETR_STTS_CD = pADO->FieldByName("HETR_STTS_CD")->AsString;
+                if      (HETR_STTS_CD == "HTS0") pObj->STATE.HeaterStatus = vms_heater_on;
+                else if (HETR_STTS_CD == "HTS1") pObj->STATE.HeaterStatus = vms_heater_off;
+
+                String COMM_STTS_CD = pADO->FieldByName("COMM_STTS_CD")->AsString;
+                if      (COMM_STTS_CD == "CMS0") pObj->STATE.Wcomm = vms_wcomm_normal;
+                else if (COMM_STTS_CD == "CMS1") pObj->STATE.Wcomm = vms_wcomm_error;
+#endif
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVdsCtlrManager::LoadStatusFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TVdsCtlrManager::LoadStatusFromDb", 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 TVdsCtlrManager::GetNextVdsId(int &ANmbr, int &AId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT NVL(MAX(VDS_CTLR_NMBR), 10000) + 1 AS NEWID FROM TB_VDS_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->Prepared = true;
+			pADO->Open();
+            ANmbr = pADO->FieldByName("NEWID")->AsInteger;
+            AId = ANmbr / 10000;
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TVdsCtlrManager::GetNextVdsId", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TVdsCtlrManager::GetNextVdsId", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TVdsCtlrManager::GetNextVdsDtctId(int &ANmbr, int &AId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT NVL(MAX(VDS_DTCT_NMBR), 10000) + 1 AS NEWID FROM TB_VDS_DTCT \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->Prepared = true;
+			pADO->Open();
+            ANmbr = pADO->FieldByName("NEWID")->AsInteger;
+            AId = ANmbr / 10000;
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TVdsCtlrManager::GetNextVdsId", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TVdsCtlrManager::GetNextVdsId", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TVdsCtlrManager::DeleteVdsDtctSubTable(TVdsDtct *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+        sQry = "DELETE TB_VDS_DTCT_RLTN_LINK \r\n"
+               " WHERE VDS_DTCT_NMBR = :p01  \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->VDS_DTCT_NMBR;
+			pADO->ExecSQL();
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TVdsCtlrManager::DeleteVdsDtctSubTable", 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("TVdsCtlrManager::DeleteVdsDtctSubTable", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+
+bool TVdsCtlrManager::DeleteVdsDtct(TVdsDtct *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_VDS_DTCT          \r\n"
+           "   SET DEL_YN = 'Y'         \r\n"
+           " WHERE VDS_DTCT_NMBR = :p01 \r\n";
+    try
+    {
+        DeleteVdsDtctSubTable(AObj, ADbConn);
+        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->VDS_DTCT_NMBR;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TVdsCtlrManager::DeleteVdsDtct", 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("TVdsCtlrManager::DeleteVdsDtct", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVdsCtlrManager::SaveVdsDtct(TVdsDtct *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "MERGE INTO TB_VDS_DTCT L                            \r\n"
+           "USING (SELECT :p01 AS VDS_DTCT_NMBR,                \r\n"
+           "              :p02 AS VDS_DTCT_ID,                  \r\n"
+           "              :p03 AS VDS_DTCT_NM,                  \r\n"
+           "              :p04 AS VDS_CTLR_NMBR,                \r\n"
+           "              :p05 AS VDS_CMRA_NO,                  \r\n"
+           "              :p06 AS DTCT_TYPE,                    \r\n"
+           "              :p07 AS DTCT_DIR,                     \r\n"
+           "              :p08 AS DETECT_LANE,                  \r\n"
+           "              :p09 AS ISTL_LANE,                    \r\n"
+           "              :p10 AS SPED_CLCT_YN,                 \r\n"
+           "              :p11 AS TFVL_CLCT_YN,                 \r\n"
+           "              :p12 AS OCPY_CLCT_YN,                 \r\n"
+           "              :p13 AS MAX_TFVL,                     \r\n"
+           "              :p14 AS MIN_TFVL,                     \r\n"
+           "              :p15 AS MAX_OCPY_RATE,                \r\n"
+           "              :p16 AS MIN_OCPY_RATE,                \r\n"
+           "              :p17 AS MAX_SPED,                     \r\n"
+           "              :p18 AS MIN_SPED,                     \r\n"
+           "              :p19 AS USE_YN,                       \r\n"
+           "              :p20 AS DEL_YN                        \r\n"
+           "         FROM DUAL) M                               \r\n"
+           "        ON (L.VDS_DTCT_NMBR = M.VDS_DTCT_NMBR)      \r\n"
+           "WHEN MATCHED THEN                                   \r\n"
+           "   UPDATE SET L.VDS_DTCT_ID     = M.VDS_DTCT_ID,    \r\n"
+           "              L.VDS_DTCT_NM     = M.VDS_DTCT_NM,    \r\n"
+           "              L.VDS_CTLR_NMBR   = M.VDS_CTLR_NMBR,  \r\n"
+           "              L.VDS_CMRA_NO     = M.VDS_CMRA_NO,    \r\n"
+           "              L.DTCT_TYPE       = M.DTCT_TYPE,      \r\n"
+           "              L.DTCT_DIR        = M.DTCT_DIR,       \r\n"
+           "              L.DETECT_LANE     = M.DETECT_LANE,    \r\n"
+           "              L.ISTL_LANE       = M.ISTL_LANE,      \r\n"
+           "              L.SPED_CLCT_YN    = M.SPED_CLCT_YN,   \r\n"
+           "              L.TFVL_CLCT_YN    = M.TFVL_CLCT_YN,   \r\n"
+           "              L.OCPY_CLCT_YN    = M.OCPY_CLCT_YN,   \r\n"
+           "              L.MAX_TFVL        = M.MAX_TFVL,       \r\n"
+           "              L.MIN_TFVL        = M.MIN_TFVL,       \r\n"
+           "              L.MAX_OCPY_RATE   = M.MAX_OCPY_RATE,  \r\n"
+           "              L.MIN_OCPY_RATE   = M.MIN_OCPY_RATE,  \r\n"
+           "              L.MAX_SPED        = M.MAX_SPED,       \r\n"
+           "              L.MIN_SPED        = M.MIN_SPED,       \r\n"
+           "              L.USE_YN          = M.USE_YN,         \r\n"
+           "              L.DEL_YN          = M.DEL_YN          \r\n"
+           "WHEN NOT MATCHED THEN                               \r\n"
+           "   INSERT (VDS_DTCT_NMBR,                           \r\n"
+           "           VDS_DTCT_ID,                             \r\n"
+           "           VDS_DTCT_NM,                             \r\n"
+           "           VDS_CTLR_NMBR,                           \r\n"
+           "           VDS_CMRA_NO,                             \r\n"
+           "           DTCT_TYPE,                               \r\n"
+           "           DTCT_DIR,                                \r\n"
+           "           DETECT_LANE,                             \r\n"
+           "           ISTL_LANE,                               \r\n"
+           "           SPED_CLCT_YN,                            \r\n"
+           "           TFVL_CLCT_YN,                            \r\n"
+           "           OCPY_CLCT_YN,                            \r\n"
+           "           MAX_TFVL,                                \r\n"
+           "           MIN_TFVL,                                \r\n"
+           "           MAX_OCPY_RATE,                           \r\n"
+           "           MIN_OCPY_RATE,                           \r\n"
+           "           MAX_SPED,                                \r\n"
+           "           MIN_SPED,                                \r\n"
+           "           USE_YN,                                  \r\n"
+           "           DEL_YN )                                 \r\n"
+           "   VALUES (M.VDS_DTCT_NMBR,                         \r\n"
+           "           M.VDS_DTCT_ID,                           \r\n"
+           "           M.VDS_DTCT_NM,                           \r\n"
+           "           M.VDS_CTLR_NMBR,                         \r\n"
+           "           M.VDS_CMRA_NO,                           \r\n"
+           "           M.DTCT_TYPE,                             \r\n"
+           "           M.DTCT_DIR,                              \r\n"
+           "           M.DETECT_LANE,                           \r\n"
+           "           M.ISTL_LANE,                             \r\n"
+           "           M.SPED_CLCT_YN,                          \r\n"
+           "           M.TFVL_CLCT_YN,                          \r\n"
+           "           M.OCPY_CLCT_YN,                          \r\n"
+           "           M.MAX_TFVL,                              \r\n"
+           "           M.MIN_TFVL,                              \r\n"
+           "           M.MAX_OCPY_RATE,                         \r\n"
+           "           M.MIN_OCPY_RATE,                         \r\n"
+           "           M.MAX_SPED,                              \r\n"
+           "           M.MIN_SPED,                              \r\n"
+           "           M.USE_YN,                                \r\n"
+           "           M.DEL_YN )                               \r\n";
+
+    try
+    {
+        //관련정보를 모두 삭제
+        DeleteVdsDtctSubTable(AObj, ADbConn);
+        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->VDS_DTCT_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->VDS_DTCT_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->VDS_DTCT_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->VDS_CTLR_NMBR;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->VDS_CMRA_NO;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->DTCT_TYPE;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->DTCT_DIR;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->DETECT_LANE;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->ISTL_LANE;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->SPED_CLCT_YN;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->TFVL_CLCT_YN;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->OCPY_CLCT_YN;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->MAX_TFVL;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->MIN_TFVL;
+            pADO->Parameters->ParamByName("p15")->Value = String(AObj->MAX_OCPY_RATE);
+            pADO->Parameters->ParamByName("p16")->Value = String(AObj->MIN_OCPY_RATE);
+            pADO->Parameters->ParamByName("p17")->Value = AObj->MAX_SPED;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->MIN_SPED;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->USE_YN;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->DEL_YN;
+
+			pADO->ExecSQL();
+
+    //링크구성정보 입력
+    sQry = "INSERT INTO TB_VDS_DTCT_RLTN_LINK (VDS_DTCT_NMBR, LINK_ID)  \r\n"
+           "                           VALUES (:p01,          :p02   )  \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            FOR_STL(TVdsDtctLink *, pObj, AObj->FLinks)
+            {
+                pADO->Parameters->ParamByName("p01")->Value = AObj->VDS_DTCT_NMBR;
+                pADO->Parameters->ParamByName("p02")->Value = pObj->LINK_ID;
+                pADO->ExecSQL();
+            }
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TVdsCtlrManager::SaveVdsDtct", 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("TVdsCtlrManager::SaveVdsDtct", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVdsCtlrManager::DeleteVds(TVdsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_VDS_CTLR           \r\n"
+           "   SET DEL_YN = 'Y'          \r\n"
+           " WHERE VDS_CTLR_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->VDS_CTLR_NMBR;
+			pADO->ExecSQL();
+
+        sQry = "DELETE TB_FCLT_INFR      \r\n"
+               " WHERE FCLT_ID = :p01    \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->VDS_CTLR_ID;
+			pADO->ExecSQL();
+
+            DeleteVdsCmra(AObj, ADbConn);
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TVdsCtlrManager::DeleteVds", 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("TVdsCtlrManager::DeleteVds", 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 TVdsCtlrManager::UpdateVds(TVdsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    return MergeVds(AObj, ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TVdsCtlrManager::MergeVds(TVdsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "MERGE INTO TB_VDS_CTLR L                   \r\n"
+           "USING (SELECT :p01 AS VDS_CTLR_NMBR,       \r\n"
+           "              :p02 AS VDS_CTLR_ID,         \r\n"
+           "              :p03 AS VDS_NM,              \r\n"
+           "              :p04 AS VDS_CTLR_IP,         \r\n"
+           "              :p05 AS VDS_CTLR_PORT,       \r\n"
+           "              :p06 AS VDS_CTLR_LOCAL_NO,   \r\n"
+           "              :p07 AS VDS_TYPE_CD,         \r\n"
+           "              :p08 AS ISTL_LCTN_NM,        \r\n"
+           "              :p09 AS X_CRDN,              \r\n"
+           "              :p10 AS Y_CRDN,              \r\n"
+           "              :p11 AS DEL_YN,              \r\n"
+           "              :p12 AS GROUP_NO,            \r\n"
+           "              :p13 AS FAN_MODE,            \r\n"
+           "              :p14 AS FAN_RUN_TMPR,        \r\n"
+           "              :p15 AS HETR_MODE,           \r\n"
+           "              :p16 AS HETR_RUN_TMPR,       \r\n"
+           "              :p17 AS DETECT_LANES,        \r\n"
+           "              :p18 AS TRAF_CLCT_CYCL,      \r\n"
+           "              :p19 AS STTS_CLCT_CYCL,      \r\n"
+           "              :p20 AS ISTL_LCTN_ADDR       \r\n"
+           "         FROM DUAL) M                                     \r\n"
+           "        ON (L.VDS_CTLR_NMBR = M.VDS_CTLR_NMBR)            \r\n"
+           "WHEN MATCHED THEN                                         \r\n"
+           "   UPDATE SET L.VDS_CTLR_ID       = M.VDS_CTLR_ID,        \r\n"
+           "              L.VDS_NM            = M.VDS_NM,             \r\n"
+           "              L.VDS_CTLR_IP       = M.VDS_CTLR_IP,        \r\n"
+           "              L.VDS_CTLR_PORT     = M.VDS_CTLR_PORT,      \r\n"
+           "              L.VDS_CTLR_LOCAL_NO = M.VDS_CTLR_LOCAL_NO,  \r\n"
+           "              L.VDS_TYPE_CD       = M.VDS_TYPE_CD,        \r\n"
+           "              L.ISTL_LCTN_NM      = M.ISTL_LCTN_NM,       \r\n"
+           "              L.X_CRDN            = M.X_CRDN,             \r\n"
+           "              L.Y_CRDN            = M.Y_CRDN,             \r\n"
+           "              L.DEL_YN            = M.DEL_YN,             \r\n"
+           "              L.GROUP_NO          = M.GROUP_NO,           \r\n"
+           "              L.FAN_MODE          = M.FAN_MODE,           \r\n"
+           "              L.FAN_RUN_TMPR      = M.FAN_RUN_TMPR,       \r\n"
+           "              L.HETR_MODE         = M.HETR_MODE,          \r\n"
+           "              L.HETR_RUN_TMPR     = M.HETR_RUN_TMPR,      \r\n"
+           "              L.DETECT_LANES      = M.DETECT_LANES,       \r\n"
+           "              L.TRAF_CLCT_CYCL    = M.TRAF_CLCT_CYCL,     \r\n"
+           "              L.STTS_CLCT_CYCL    = M.STTS_CLCT_CYCL,     \r\n"
+           "              L.ISTL_LCTN_ADDR    = M.ISTL_LCTN_ADDR      \r\n"
+           "WHEN NOT MATCHED THEN                                     \r\n"
+           "   INSERT (                     \r\n"
+           "           VDS_CTLR_NMBR,       \r\n"
+           "           VDS_CTLR_ID,         \r\n"
+           "           VDS_NM,              \r\n"
+           "           VDS_CTLR_IP,         \r\n"
+           "           VDS_CTLR_PORT,       \r\n"
+           "           VDS_CTLR_LOCAL_NO,   \r\n"
+           "           VDS_TYPE_CD,         \r\n"
+           "           ISTL_LCTN_NM,        \r\n"
+           "           X_CRDN,              \r\n"
+           "           Y_CRDN,              \r\n"
+           "           DEL_YN,              \r\n"
+           "           GROUP_NO,            \r\n"
+           "           FAN_MODE,            \r\n"
+           "           FAN_RUN_TMPR,        \r\n"
+           "           HETR_MODE,           \r\n"
+           "           HETR_RUN_TMPR,       \r\n"
+           "           DETECT_LANES,        \r\n"
+           "           TRAF_CLCT_CYCL,      \r\n"
+           "           STTS_CLCT_CYCL,      \r\n"
+           "           ISTL_LCTN_ADDR       \r\n"
+           "          )                     \r\n"
+           "   VALUES (                     \r\n"
+           "           M.VDS_CTLR_NMBR,     \r\n"
+           "           M.VDS_CTLR_ID,       \r\n"
+           "           M.VDS_NM,            \r\n"
+           "           M.VDS_CTLR_IP,       \r\n"
+           "           M.VDS_CTLR_PORT,     \r\n"
+           "           M.VDS_CTLR_LOCAL_NO, \r\n"
+           "           M.VDS_TYPE_CD,       \r\n"
+           "           M.ISTL_LCTN_NM,      \r\n"
+           "           M.X_CRDN,            \r\n"
+           "           M.Y_CRDN,            \r\n"
+           "           M.DEL_YN,            \r\n"
+           "           M.GROUP_NO,          \r\n"
+           "           M.FAN_MODE,          \r\n"
+           "           M.FAN_RUN_TMPR,      \r\n"
+           "           M.HETR_MODE,         \r\n"
+           "           M.HETR_RUN_TMPR,     \r\n"
+           "           M.DETECT_LANES,      \r\n"
+           "           M.TRAF_CLCT_CYCL,    \r\n"
+           "           M.STTS_CLCT_CYCL,    \r\n"
+           "           M.ISTL_LCTN_ADDR     \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;
+
+            AObj->FAN_MODE      = 2;
+            AObj->FAN_RUN_TMPR  = 30;
+            AObj->HETR_MODE     = 2;
+            AObj->HETR_RUN_TMPR = 0;
+
+            pADO->Parameters->ParamByName("p01")->Value = AObj->VDS_CTLR_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->VDS_CTLR_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->VDS_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->VDS_CTLR_IP;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->VDS_CTLR_PORT;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->VDS_CTLR_LOCAL_NO;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->VDS_TYPE_CD;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->ISTL_LCTN_NM;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->DEL_YN;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->GROUP_NO;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->FAN_MODE;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->FAN_RUN_TMPR;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->HETR_MODE;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->HETR_RUN_TMPR;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->DETECT_LANES;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->TRAF_CLCT_CYCL;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->STTS_CLCT_CYCL;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->ISTL_LCTN_ADDR;
+
+			pADO->ExecSQL();
+
+            MergeFcltInfo(AObj, ADbConn);
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVdsCtlrManager::MergeVds", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TVdsCtlrManager::MergeVds", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return InsertVdsCmra(AObj, ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TVdsCtlrManager::InsertVds(TVdsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "INSERT INTO TB_VDS_CTLR (       \r\n"
+           "            VDS_CTLR_NMBR     , \r\n"
+           "            VDS_CTLR_ID       , \r\n"
+           "            VDS_NM            , \r\n"
+           "            VDS_CTLR_IP       , \r\n"
+           "            VDS_CTLR_PORT     , \r\n"
+           "            VDS_CTLR_LOCAL_NO , \r\n"
+           "            VDS_TYPE_CD       , \r\n"
+           "            ISTL_LCTN_NM      , \r\n"
+           "            X_CRDN            , \r\n"
+           "            Y_CRDN            , \r\n"
+           "            DEL_YN            , \r\n"
+           "            GROUP_NO          , \r\n"
+           "            FAN_MODE          , \r\n"
+           "            FAN_RUN_TMPR      , \r\n"
+           "            HETR_MODE         , \r\n"
+           "            HETR_RUN_TMPR     , \r\n"
+           "            DETECT_LANES      , \r\n"
+           "            TRAF_CLCT_CYCL    , \r\n"
+           "            STTS_CLCT_CYCL    , \r\n"
+           "            ISTL_LCTN_ADDR      \r\n"
+           "            )                   \r\n"
+           "   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";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            AObj->FAN_MODE      = 2;
+            AObj->FAN_RUN_TMPR  = 30;
+            AObj->HETR_MODE     = 2;
+            AObj->HETR_RUN_TMPR = 0;
+
+            pADO->Parameters->ParamByName("p01")->Value = AObj->VDS_CTLR_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->VDS_CTLR_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->VDS_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->VDS_CTLR_IP;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->VDS_CTLR_PORT;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->VDS_CTLR_LOCAL_NO;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->VDS_TYPE_CD;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->ISTL_LCTN_NM;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->DEL_YN;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->GROUP_NO;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->FAN_MODE;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->FAN_RUN_TMPR;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->HETR_MODE;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->HETR_RUN_TMPR;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->DETECT_LANES;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->TRAF_CLCT_CYCL;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->STTS_CLCT_CYCL;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->ISTL_LCTN_ADDR;
+
+			pADO->ExecSQL();
+
+            MergeFcltInfo(AObj, ADbConn);
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TVdsCtlrManager::InsertVds", 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("TVdsCtlrManager::InsertVds", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return InsertVdsCmra(AObj, ADbConn);
+}
+//---------------------------------------------------------------------------
+bool TVdsCtlrManager::MergeFcltInfo(TVdsCtlr *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->VDS_CTLR_ID;
+			pADO->Parameters->ParamByName("p02")->Value = "VDS";
+			pADO->Parameters->ParamByName("p03")->Value = AObj->VDS_NM;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVdsCtlrManager::MergeFcltInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TVdsCtlrManager::MergeFcltInfo", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TVdsCtlrManager::DeleteVdsCmra(TVdsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "DELETE TB_VDS_CMRA          \r\n"
+           " WHERE VDS_CTLR_NMBR = :p01 \r\n";
+
+    FLists.Lock();
+    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->VDS_CTLR_NMBR;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TVdsCtlrManager::DeleteVdsCmra", 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("TVdsCtlrManager::DeleteVdsCmra", 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 TVdsCtlrManager::InsertVdsCmra(TVdsCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "INSERT INTO TB_VDS_CMRA(VDS_CTLR_NMBR, VDS_CMRA_NO, VDS_CMRA_NM, DETECT_LANE, CMRA_DRCT_CD, DEL_YN, CCAM_CTLR_NMBR, ROAD_NAME, CROSS_NAME, DIR_NAME, VDS_CMRA_IP) \r\n"
+           "                 VALUES(:p01,          :p02,        :p03,        :p04,        :p05,         'N',    :p06,           :p07,      :p08,       :p09,     :p10       ) \r\n";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            DeleteVdsCmra(AObj, ADbConn);
+
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            FOR_STL(TVdsCmra*, pCmra, AObj->FCmras)
+            {
+                if (pCmra->DEL_YN == "Y") continue;
+
+                pADO->Parameters->ParamByName("p01")->Value = pCmra->VDS_CTLR_NMBR;
+                pADO->Parameters->ParamByName("p02")->Value = pCmra->VDS_CMRA_NO;
+                pADO->Parameters->ParamByName("p03")->Value = pCmra->VDS_CMRA_NM;
+                pADO->Parameters->ParamByName("p04")->Value = pCmra->DETECT_LANE;
+                pADO->Parameters->ParamByName("p05")->Value = pCmra->CMRA_DRCT_CD;
+                pADO->Parameters->ParamByName("p06")->Value = pCmra->CCAM_CTLR_NMBR;
+                pADO->Parameters->ParamByName("p07")->Value = pCmra->ROAD_NAME;
+                pADO->Parameters->ParamByName("p08")->Value = pCmra->CROSS_NAME;
+                pADO->Parameters->ParamByName("p09")->Value = pCmra->DIR_NAME;
+                pADO->Parameters->ParamByName("p10")->Value = pCmra->VDS_CMRA_IP;
+
+                pADO->ExecSQL();
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
+            DBERRORMSG("TVdsCtlrManager::InsertVdsCmra", 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("TVdsCtlrManager::InsertVdsCmra", String(exception.ClassName()), exception.Message, sQry);
+            throw Exception(String(exception.ClassName()) + exception.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 209 - 0
COMMON/CDS/CDSVdsCtlrF.h

@@ -0,0 +1,209 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVdsCtlrFH
+#define CDSVdsCtlrFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "CDSObjectF.h"
+//---------------------------------------------------------------------------
+#include "CenterCommF.h"
+//---------------------------------------------------------------------------
+
+#define YONGIN_VDS
+
+class TVdsDtctLink
+{
+public:
+    TVdsDtctLink();
+    virtual ~TVdsDtctLink();
+
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+
+    String VDS_CTLR_NMBR;   //VARCHAR2(20)	Y			제어기 관리 번호
+    String VDS_DTCT_NMBR;   //VARCHAR2(8)	N			검지기 번호
+    String LINK_ID;         //NUMBER(10)	N			링크ID
+    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 };
+};
+//---------------------------------------------------------------------------
+
+/*
+*  VdsDtct class
+*/
+class TVdsDtct
+{
+public:
+    TVdsDtct();
+    virtual ~TVdsDtct();
+
+private:
+    bool    FCompleted;
+    int     FEditMode;
+	int     FGridIndex;
+
+public:
+
+    String  VDS_DTCT_NMBR;  //	N	NUMBER(10)	    N			VDS 검지기 번호
+    String  VDS_DTCT_ID;    //	N	VARCHAR2(10)	N			VDS 검지기 ID
+    String  VDS_DTCT_NM;    //	N	VARCHAR2(40)	Y			VDS 검지기 명칭
+    String  VDS_CTLR_NMBR;  //	N	NUMBER(10)	    N			VDS 제어기 번호
+    int     VDS_CMRA_NO;    //	N	NUMBER(1)	    N			VDS 카메라 번호
+    String  DTCT_TYPE;      //	N	VARCHAR2(7)	    Y			검지기 유형('DTT')
+    String  DTCT_DIR;       //	N	VARCHAR2(7)	    N	0		검지기 방향('VCD')
+    int     DETECT_LANE;    //	N	NUMBER(2)	    Y			감지차로(제어기설치차로)
+    int     ISTL_LANE;      //	N	NUMBER(2)	    Y	1		설치 차로
+    String  SPED_CLCT_YN;   //	N	CHAR(1)	        Y	'Y'		속도수집여부
+    String  TFVL_CLCT_YN;   //	N	CHAR(1)	        Y	'Y'		교통량수집여부
+    String  OCPY_CLCT_YN;   //	N	CHAR(1)	        Y	'Y'		점유율수집여부
+    int     MAX_TFVL;       //	N	NUMBER(6)	    Y	250		최대 교통량
+    int     MIN_TFVL;       //	N	NUMBER(6)	    Y	1		최소 교통량
+    float   MAX_OCPY_RATE;  //	N	NUMBER(6,2)	    Y	100		최대 점유 율
+    float   MIN_OCPY_RATE;  //	N	NUMBER(6,2)	    Y	0		최소 점유 율
+    int     MAX_SPED;       //	N	NUMBER(3)	    Y	140		최대 속도
+    int     MIN_SPED;       //	N	NUMBER(3)	    Y	1		최소 속도
+    String  USE_YN;         //	N	CHAR(1)	        Y	'Y'		사용여부
+    String  DEL_YN;         //	N	CHAR(1)	        Y	'N'		삭제 여부
+
+    String MEM_DEL;
+
+    TItsMap<String, TVdsDtctLink*>  FLinks;
+
+public:
+    __property bool   Completed = {read = FCompleted, write = FCompleted};
+	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
+	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
+};
+//---------------------------------------------------------------------------
+
+/*
+* Vds camera class
+*/
+class TVdsCmra
+{
+public:
+    TVdsCmra(){}
+    virtual ~TVdsCmra(){}
+
+public:
+    String  VDS_CTLR_NMBR;      //	N	NUMBER(10)	    N			VDS 제어기 번호
+    int     VDS_CMRA_NO;        //	N	NUMBER(1)	    N			VDS 카메라 번호
+    String  VDS_CMRA_NM;        //	N	VARCHAR2(40)	N			VDS 카메라명칭
+    int     DETECT_LANE;        //	N	NUMBER(2)	    Y			감지 차로
+    String  CMRA_DRCT_CD;       //	N	VARCHAR2(7)	    Y			카메라 방향 코드
+    String  DEL_YN;             //	N	CHAR(1)	        Y	'N'		삭제 여부
+    String  CCAM_CTLR_NMBR;     //	N	NUMBER(10)	    Y			교차로감시 카메라 제어기 번호
+    String  ROAD_NAME;          //	N	VARCHAR2(50)	Y			도로명
+    String  CROSS_NAME;         //	N	VARCHAR2(50)	Y			교차로명
+    String  DIR_NAME;           //	N	VARCHAR2(50)	Y			방향명
+    String  VDS_CMRA_IP;        //	N	VARCHAR2(20)	Y			VDS 카메라 아이피
+};
+//---------------------------------------------------------------------------
+
+/*
+*  Vds class
+*/
+class TVdsCtlr : public TCDSObject
+{
+public:
+    TVdsCtlr();
+    virtual ~TVdsCtlr();
+
+public:
+
+    int     GROUP_NO;           //	N	NUMBER(5)	Y	0		그룹번호
+    int     FAN_MODE;           //	N	NUMBER(3)	Y	2		FAN 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
+    int     FAN_RUN_TMPR;       //	N	NUMBER(3)	Y	30		팬 동작 온도
+    int     HETR_MODE;          //	N	NUMBER(3)	Y	2		히터 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
+    int     HETR_RUN_TMPR;      //	N	NUMBER(3)	Y	0		히터 동작 온도
+    int     DETECT_LANES;       //	N	NUMBER(2)	Y	0		검지 전체 차로수
+    int     TRAF_CLCT_CYCL;     //	N	NUMBER(3)	Y	60		교통정보수집주기
+    int     STTS_CLCT_CYCL;     //	N	NUMBER(3)	Y	0		상태정보수집주기
+
+public:
+    INT_VDS_STATE   STATE;
+
+    TItsMap<int,    TVdsCmra*>    FCmras;
+    TItsMap<String, TVdsDtct*>    FDtcts;
+
+public:
+    __property String  VDS_CTLR_NMBR     = { read = CTLR_NMBR,     write = CTLR_NMBR     };
+    __property String  VDS_CTLR_ID       = { read = CTLR_ID,       write = CTLR_ID       };
+    __property String  VDS_NM            = { read = NAME,          write = NAME          };
+    __property String  VDS_CTLR_IP       = { read = CTLR_IP,       write = CTLR_IP       };
+    __property int     VDS_CTLR_PORT     = { read = CTLR_PORT,     write = CTLR_PORT     };
+    __property int     VDS_CTLR_LOCAL_NO = { read = CTLR_LOCAL_NO, write = CTLR_LOCAL_NO };
+    __property String  VDS_TYPE_CD       = { read = TYPE_CD,       write = TYPE_CD       };
+
+};
+//---------------------------------------------------------------------------
+
+class TVdsLink
+{
+public:
+    TVdsLink() {};
+    virtual ~TVdsLink() {};
+public:
+    String  LINK_ID;
+    String  STR_NAME;
+    String  END_NAME;
+    String  VDS_CTLR_NMBR;
+    String  VDS_NM;
+    bool    IsSelected;
+};
+
+/*
+* Vds Manager
+*/
+class TVdsCtlrManager
+{
+public:
+    TVdsCtlrManager();
+    virtual ~TVdsCtlrManager();
+
+public:
+    TItsMap<String, TVdsCtlr*>    FLists;
+    TItsMap<String, TVdsLink*>    FLinkLists;
+    int                           FLinkSelCnt;
+
+public:
+    bool LoadFromDbVdsLink(TADOConnection *ADbConn=NULL);
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadStatusFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadFromCmraDb(TADOConnection *ADbConn=NULL);
+    bool LoadFromDtctDb(TADOConnection *ADbConn=NULL);
+    bool LoadFromDtctLinkDb(TADOConnection *ADbConn=NULL);
+
+    bool GetNextVdsId(int &ANmbr, int &AId, TADOConnection *ADbConn=NULL);
+    bool GetNextVdsDtctId(int &ANmbr, int &AId, TADOConnection *ADbConn=NULL);
+
+    bool DeleteVds(TVdsCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertVds(TVdsCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool UpdateVds(TVdsCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeVds(TVdsCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeFcltInfo(TVdsCtlr *AObj, TADOConnection *ADbConn=NULL);
+
+    bool DeleteVdsCmra(TVdsCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertVdsCmra(TVdsCtlr *AObj, TADOConnection *ADbConn=NULL);
+
+    bool DeleteVdsDtctSubTable(TVdsDtct *AObj, TADOConnection *ADbConn=NULL);
+    bool DeleteVdsDtct(TVdsDtct *AObj, TADOConnection *ADbConn=NULL);
+    bool SaveVdsDtct(TVdsDtct *AObj, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TVdsCtlrManager *VdsCtlrManager;
+//---------------------------------------------------------------------------
+
+#endif
+

+ 620 - 0
COMMON/CDS/CDSVilgFrcsF.cpp

@@ -0,0 +1,620 @@
+//---------------------------------------------------------------------------
+
+#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->Prepared = true;
+			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();
+    }
+
+    return LoadFromDbAtmp(ADbConn);
+}
+//---------------------------------------------------------------------------
+bool TItsVilgFrcsManager::LoadFromDbAtmp(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                  \r\n"
+           "  FROM TB_ATMP_PLTN_STTN  \r\n"
+           " ORDER BY ATMP_STTN_NMBR  \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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TItsAtmpPltn *pObj = new TItsAtmpPltn();
+
+                pObj->ATMP_STTN_NMBR = pADO->FieldByName("ATMP_STTN_NMBR")->AsString;   //		N	NUMBER(10)	N			측정소 번호
+                pObj->ATMP_STTN_NM   = pADO->FieldByName("ATMP_STTN_NM")->AsString;     //		N	VARCHAR2(30)	N			측정소 명
+                pObj->ATMP_STTN_ADDR = pADO->FieldByName("ATMP_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->ATMP_STTN_NMBR, 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->Prepared = true;
+			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);
+    return LoadAtmpPltnInfo(ADbConn);
+    //return LoadAtmpSprpInfo(ADbConn);
+}
+//---------------------------------------------------------------------------
+bool TItsVilgFrcsManager::LoadVilgShprInfo(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                                                       \r\n"
+           "  FROM TB_VILG_SHPR                                            \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->Prepared = true;
+			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		풍속
+
+#if 0
+                int wndr = pObj->shpr.WNDR.ToIntDef(0);
+                if (wndr >=   0 && wndr <    45) pObj->shpr.WNDR_NM = "N-NE";
+                if (wndr >=  45 && wndr <    90) pObj->shpr.WNDR_NM = "NE-E";
+                if (wndr >=  90 && wndr <   135) pObj->shpr.WNDR_NM = "E-SE";
+                if (wndr >= 135 && wndr <   180) pObj->shpr.WNDR_NM = "SE-S";
+                if (wndr >= 180 && wndr <   225) pObj->shpr.WNDR_NM = "S-SW";
+                if (wndr >= 225 && wndr <   270) pObj->shpr.WNDR_NM = "SW-W";
+                if (wndr >= 270 && wndr <   315) pObj->shpr.WNDR_NM = "W-NW";
+                if (wndr >= 315 && wndr <=  360) pObj->shpr.WNDR_NM = "NW-N";
+#else
+                //풍향값에 따른 16방위 변환
+                int wndr = pObj->shpr.WNDR.ToIntDef(0);
+                int wndrDir = (int)(((float)wndr + 22.5 * 0.5 ) / 22.5);
+                switch(wndrDir)
+                {
+                case  0: pObj->shpr.WNDR_NM = "N";   break;
+                case  1: pObj->shpr.WNDR_NM = "NNE"; break;
+                case  2: pObj->shpr.WNDR_NM = "NE";  break;
+                case  3: pObj->shpr.WNDR_NM = "ENE"; break;
+                case  4: pObj->shpr.WNDR_NM = "E";   break;
+                case  5: pObj->shpr.WNDR_NM = "ESE"; break;
+                case  6: pObj->shpr.WNDR_NM = "SE";  break;
+                case  7: pObj->shpr.WNDR_NM = "SSE"; break;
+                case  8: pObj->shpr.WNDR_NM = "S";   break;
+                case  9: pObj->shpr.WNDR_NM = "SSW"; break;
+                case 10: pObj->shpr.WNDR_NM = "SW";  break;
+                case 11: pObj->shpr.WNDR_NM = "WSW"; break;
+                case 12: pObj->shpr.WNDR_NM = "W";   break;
+                case 13: pObj->shpr.WNDR_NM = "WNW"; break;
+                case 14: pObj->shpr.WNDR_NM = "NW";  break;
+                case 15: pObj->shpr.WNDR_NM = "NNW"; break;
+                case 16: pObj->shpr.WNDR_NM = "N";   break;
+                }
+#endif
+
+                //하늘상태 - 맑음(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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String ATMP_STTN_NMBR = pADO->FieldByName("ATMP_STTN_NMBR")->AsString;
+				TItsAtmpPltn *pObj = FAtmpLists.Find(ATMP_STTN_NMBR);
+                if (!pObj) continue;
+
+                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.UPDT_DT          = pADO->FieldByName("UPDT_DT")->AsString;        // N	VARCHAR2(14)	Y			갱신 일시
+
+                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->Prepared = true;
+			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;
+}
+//---------------------------------------------------------------------------
+

+ 227 - 0
COMMON/CDS/CDSVilgFrcsF.h

@@ -0,0 +1,227 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVilgFrcsFH
+#define CDSVilgFrcsFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+#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_VILG_SHPR(초단기실황)
+*/
+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	WNDR_NM;            //	N	NUMBER(2)	    Y			풍향
+
+    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	ATMP_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시간 등급
+    String	UPDT_DT;           // 	N	VARCHAR2(14)	Y			갱신 일시
+} ATMP_PLTN_RT_PNST;
+
+/*
+*  AtmpPltn class(미세먼지 클래스)
+*/
+class TItsAtmpPltn
+{
+public:
+    TItsAtmpPltn() {};
+    ~TItsAtmpPltn() {};
+
+private:
+
+public:
+    String	ATMP_STTN_NMBR; //	N	NUMBER(10)   	N			측정소 번호
+    String	ATMP_STTN_NM;   //	N	VARCHAR2(30)	N			측정소 명
+    String	ATMP_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:
+    TItsMap<String, TItsVilgFrcs*>  FLists;
+    TItsMap<String, TItsAtmpPltn*>  FAtmpLists;
+    TItsMap<String, 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
+

+ 115 - 0
COMMON/CDS/CDSVmsColorF.cpp

@@ -0,0 +1,115 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSVmsColorF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TCDSVmsColorManager *CDSVmsColorManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+TCDSVmsColorManager::TCDSVmsColorManager()
+{
+}
+//---------------------------------------------------------------------------
+TCDSVmsColorManager::~TCDSVmsColorManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+int  TCDSVmsColorManager::GetNextColorId()
+{
+    FMaxID = 0;
+    FOR_STL(TCDSVmsColor*, pObj, FLists)
+    {
+        if (pObj->VMS_FONT_COLR_CD > FMaxID)
+        {
+            FMaxID = pObj->VMS_FONT_COLR_CD;
+        }
+    }
+    return FMaxID+1;
+}
+//---------------------------------------------------------------------------
+bool TCDSVmsColorManager::LoadFromDb(TADOConnection *ADbConn)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.*                  \r\n"
+           "  FROM TB_VMS_FONT_COLR A   \r\n";
+
+    FMaxID = 0;
+    FLists.Lock();
+    try
+    {
+        FLists.RemoveAll();
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                int    VMS_FONT_COLR_CD  = pADO->FieldByName("VMS_FONT_COLR_CD")->AsInteger;
+                String VMS_FONT_COLR_NM  = pADO->FieldByName("VMS_FONT_COLR_NM")->AsString.Trim();
+                int    VMS_FONT_COLR_VAL = pADO->FieldByName("VMS_FONT_COLR_VAL")->AsInteger;
+                String USE_YN            = pADO->FieldByName("USE_YN")->AsString.Trim();
+
+                if (VMS_FONT_COLR_CD > FMaxID)
+                {
+                    FMaxID = VMS_FONT_COLR_CD;
+                }
+				TCDSVmsColor *pObj = FLists.Find(VMS_FONT_COLR_CD);
+                if (!pObj)
+                {
+                    pObj = new TCDSVmsColor();
+
+                    pObj->VMS_FONT_COLR_CD = VMS_FONT_COLR_CD;
+                    FLists.Push(pObj->VMS_FONT_COLR_CD, pObj);
+                }
+
+                pObj->VMS_FONT_COLR_NM  = VMS_FONT_COLR_NM;
+                pObj->VMS_FONT_COLR_VAL = VMS_FONT_COLR_VAL;
+                pObj->USE_YN            = USE_YN;
+
+                pObj->Completed = true;
+                pObj->EditMode  = DB_INIT;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TCDSVmsColorManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TCDSVmsColorManager::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;
+}
+//---------------------------------------------------------------------------

+ 58 - 0
COMMON/CDS/CDSVmsColorF.h

@@ -0,0 +1,58 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVmsColorFH
+#define CDSVmsColorFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+//---------------------------------------------------------------------------
+#include "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  class
+*/
+class TCDSVmsColor
+{
+public:
+    TCDSVmsColor()  {};
+    ~TCDSVmsColor() {};
+
+public:
+    int     VMS_FONT_COLR_CD;   //	N	NUMBER(3)	    N	0		VMS 글꼴 색상 코드
+    String  VMS_FONT_COLR_NM;   //	N	VARCHAR2(60)	Y			VMS 글꼴 색상 명칭
+    int     VMS_FONT_COLR_VAL;  //	N	NUMBER(10)	    Y			VMS 글꼴 색상 값
+    String  USE_YN;             //	N	CHAR(1)	        Y	'N'		사용 여부
+
+    bool    Completed;
+    int     EditMode;
+    int     GridIndex;
+public:
+
+};
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+class TCDSVmsColorManager
+{
+public:
+    TCDSVmsColorManager();
+    virtual ~TCDSVmsColorManager();
+
+public:
+    int                          FMaxID;
+    TItsMap<int, TCDSVmsColor*>  FLists;
+
+public:
+    int  GetNextColorId();
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TCDSVmsColorManager *CDSVmsColorManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 1597 - 0
COMMON/CDS/CDSVmsCtlrF.cpp

@@ -0,0 +1,1597 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSVmsCtlrF.h"
+#include "ITSUtilF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TVmsIfscRltn::TVmsIfscRltn()
+{
+}
+//---------------------------------------------------------------------------
+TVmsIfscRltn::~TVmsIfscRltn()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TVmsMsg::TVmsMsg()
+{
+    for (int ii = 0; ii < INT_VMS_MAX_FORM; ii++)
+    {
+        PHASE[ii].pVmsBmp = NULL;
+    }
+    Init();
+};
+//---------------------------------------------------------------------------
+TVmsMsg::~TVmsMsg()
+{
+    for (int ii = 0; ii < INT_VMS_MAX_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_VMS_MAX_FORM; ii++)
+    {
+        PHASE[ii].DSPL_HH = 4;        //표출시간
+        PHASE[ii].DNLD_YN = "N";      //다운로드성공여부
+        PHASE[ii].DSPL_CD = "";       //표출방법
+        PHASE[ii].VMS_SCH_FORM_TYPE = 0;
+        PHASE[ii].VMS_DSPL_MSG_TXT  = "";
+    }
+};
+//---------------------------------------------------------------------------
+
+void VmsInitStatus(INT_VMS_STATE *AState)
+{
+    int ii;
+	if (AState->Comm != vms_comm_normal && AState->Wcomm != vms_wcomm_normal)
+	{
+        AState->DoorStatus          = vms_door_unknown; /* 도어상태정보코드,     0:열림 1:닫힘 2:알수없음 */
+        AState->ModulePowerStatus   = vms_module_power_unknown; /* 모듈전원상태정보코드, 0:켜짐 1:꺼짐 2:알수없음 */
+        AState->BodyTemp            = 0;           /* 함체온도값(℃), 범위(-128~127) */
+        AState->LuminanceStatus     = 0;           /* 화면의 밝기값 (최대 휘도값을 100으로 했을 때의 백분율 값), 범위(0~100) */
+        AState->FanStatus           = vms_fan_unknown; /* Fan 동작상태정보코드,    0:켜짐, 1:꺼짐 2:알수없음 */
+        AState->HeaterStatus        = vms_heater_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:알수없음 */
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TVmsCtlr::TVmsCtlr()
+{
+    memset(&STATE, 0x00, sizeof(STATE));
+    STATE.Comm = vms_comm_error;
+    VmsInitStatus(&STATE);
+    STATE.Comm = vms_comm_error;
+
+    InitFormCount();
+
+    VmsMsg = NULL;
+    VmsMsg = new TVmsMsg();
+    VmsMsg->Init();
+
+    RunState = state_error;
+}
+//---------------------------------------------------------------------------
+
+TVmsCtlr::~TVmsCtlr()
+{
+    FIfscRltn.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TVmsCtlr::CheckRunState()
+{
+    RunState = STATE.Comm;
+    if (STATE.Comm == vms_comm_normal && STATE.Wcomm != vms_wcomm_normal)
+    {
+        STATE.DoorStatus        = vms_door_unknown;
+        STATE.ModulePowerStatus = vms_module_power_unknown;
+        STATE.BodyTemp          = 0;
+        STATE.LuminanceStatus   = 0;
+        STATE.FanStatus         = vms_fan_unknown;
+        STATE.HeaterStatus      = vms_heater_unknown;
+    }
+}
+//---------------------------------------------------------------------------
+
+
+TVmsSize::TVmsSize()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TVmsCtlrManager *VmsCtlrManager = NULL;
+//---------------------------------------------------------------------------
+
+TVmsCtlrManager::TVmsCtlrManager()
+{
+    FImgStream = NULL;
+}
+//---------------------------------------------------------------------------
+TVmsCtlrManager::~TVmsCtlrManager()
+{
+    FVmsSize.RemoveAll();
+    FLists.RemoveAll();
+    if (FImgStream) delete FImgStream;
+    FImgStream = NULL;
+}
+//---------------------------------------------------------------------------
+void TVmsCtlrManager::InitFormCount()
+{
+    FLists.Lock();
+    try
+    {
+        FOR_STL(TVmsCtlr*, pObj, FLists)
+        {
+            pObj->InitFormCount();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+};
+//---------------------------------------------------------------------------
+
+bool TVmsCtlrManager::LoadVmsSize(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    FVmsSize.Lock();
+    try
+    {
+        FVmsSize.RemoveAll();
+    }
+    __finally
+    {
+        FVmsSize.UnLock();
+    }
+
+    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"
+           " WHERE USE_YN = 'Y'                                     \r\n";
+
+    FVmsSize.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			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;
+
+    sQry = "SELECT A.*,                               \r\n"
+           "       B.VMS_TYPE_NM,                     \r\n"
+           "       B.VMS_WDTH,     B.VMS_HGHT,        \r\n"
+           "       B.ROW_NUM,      B.COL_NUM,         \r\n"
+           "       B.MODL_ROW_NUM, B.MODL_COL_NUM,    \r\n"
+           "       B.POWR_ROW_NUM, B.POWR_COL_NUM     \r\n"
+           "  FROM TB_VMS_CTLR A,                     \r\n"
+           "       TB_VMS_TYPE B                      \r\n"
+           " WHERE A.VMS_TYPE_CD = B.VMS_TYPE_CD      \r\n"
+           "   AND A.DEL_YN      = 'N'                \r\n";
+
+    FLists.Lock();
+    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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TVmsCtlr *pObj = new TVmsCtlr();
+
+                pObj->VMS_CTLR_NMBR      = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;           //	N	NUMBER(10)	    N			VMS 제어기 번호
+                pObj->VMS_CTLR_ID        = pADO->FieldByName("VMS_CTLR_ID")->AsString.Trim();       //	N	VARCHAR2(10)	Y			VMS 제어기 ID
+                pObj->VMS_NM             = pADO->FieldByName("VMS_NM")->AsString.Trim();            //	N	VARCHAR2(40)	Y			VMS 명칭
+                pObj->VMS_CTLR_IP        = pADO->FieldByName("VMS_CTLR_IP")->AsString.Trim();       //	N	VARCHAR2(20)	Y			VMS 제어기 아이피
+#if 0
+                pObj->VMS_CTLR_PORT      = pADO->FieldByName("VMS_CTLR_PORT")->AsInteger;           //	N	NUMBER(5)	    Y	0		VMS 제어기 포트
+                pObj->VMS_CTLR_LOCAL_NO  = pADO->FieldByName("VMS_CTLR_LOCAL_NO")->AsInteger;       //	N	NUMBER(5)	    Y	0		VMS 제어기 지역번호
+                pObj->DEF_PHSE_CHNG_CYCL = pADO->FieldByName("DEF_PHSE_CHNG_CYCL")->AsInteger;      //	N	NUMBER(3)	    Y	5		기본메시지주기
+                pObj->FAN_MODE           = pADO->FieldByName("FAN_MODE")->AsInteger;                //	N	NUMBER(3)	Y	2		FAN 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
+                pObj->FAN_RUN_TMPR       = pADO->FieldByName("FAN_RUN_TMPR")->AsInteger;            //	N	NUMBER(3)	Y	30		팬 동작 온도
+                pObj->HETR_MODE          = pADO->FieldByName("HETR_MODE")->AsInteger;               //	N	NUMBER(3)	Y	2		히터 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
+                pObj->HETR_RUN_TMPR      = pADO->FieldByName("HETR_RUN_TMPR")->AsInteger;           //	N	NUMBER(3)	Y	0		히터 동작 온도
+                pObj->BRGH_CURR_STEP     = pADO->FieldByName("BRGH_CURR_STEP")->AsInteger;          //	N	NUMBER(3)	Y	40		휘도 현재 단계(0~100)
+                pObj->BRGH_WEEK_STEP     = pADO->FieldByName("BRGH_WEEK_STEP")->AsInteger;          //	N	NUMBER(3)	Y	64		휘도 주간 단계(0~100)
+                pObj->BRGH_NGHT_STEP     = pADO->FieldByName("BRGH_NGHT_STEP")->AsInteger;          //	N	NUMBER(3)	Y	48		휘도 야간 단계(0~100)
+                pObj->MODL_ERR_RATE      = pADO->FieldByName("MODL_ERR_RATE")->AsInteger;           //	N	NUMBER(3)	Y	10		VMS 모듈 오류 율
+                pObj->CMNC_FAIL_RATE     = pADO->FieldByName("CMNC_FAIL_RATE")->AsInteger;          //	N	NUMBER(3)	Y	60		VMS 통신 오류 기본 값
+                pObj->WEB_CMRA_CMPY      = pADO->FieldByName("WEB_CMRA_CMPY")->AsString.Trim();     //	N	VARCHAR2(50)	Y			웹카메라제조사(삼성카메라'Samsung')
+                pObj->WEB_CMRA_MDL       = pADO->FieldByName("WEB_CMRA_MDL")->AsString.Trim();      //	N	VARCHAR2(126)	Y			웹카메라모델
+                pObj->ISTL_LCTN_ADDR     = pADO->FieldByName("ISTL_LCTN_ADDR")->AsString.Trim();    //	N	VARCHAR2(200)	Y			설치 위치 주소
+#else
+                pObj->VMS_CTLR_PORT      = pADO->FieldByName("VMS_CMNC_PORT")->AsInteger;           //	N	NUMBER(5)	    Y	0		VMS 제어기 포트
+#endif
+                pObj->VMS_TYPE_CD        = pADO->FieldByName("VMS_TYPE_CD")->AsString.Trim();       //	N	VARCHAR2(7)	    Y			VMS 유형 코드
+                pObj->ISTL_LCTN_NM       = pADO->FieldByName("ISTL_LCTN_NM")->AsString.Trim();      //	N	VARCHAR2(40)	Y			설치 위치 명
+                pObj->X_CRDN             = pADO->FieldByName("X_CRDN")->AsFloat;                    //	N	NUMBER(11,8)	Y			X 좌표
+                pObj->Y_CRDN             = pADO->FieldByName("Y_CRDN")->AsFloat;                    //	N	NUMBER(10,8)	Y			Y 좌표
+                pObj->DEL_YN             = pADO->FieldByName("DEL_YN")->AsString.Trim();            //	N	CHAR(1)	        Y	'N'		삭제 여부
+                pObj->WEB_CMRA_IP        = pADO->FieldByName("WEB_CMRA_IP")->AsString.Trim();       //	N	VARCHAR2(20)	Y			웹 카메라 아이피
+                pObj->WEB_CMRA_PORT      = pADO->FieldByName("WEB_CMRA_PORT")->AsString.Trim();     //	N	NUMBER(5)	    Y			웹카메라 포트
+                pObj->WEB_CMRA_ID        = pADO->FieldByName("WEB_CMRA_ID")->AsString.Trim();       //	N	VARCHAR2(20)	Y			웹카메라 ID
+                pObj->WEB_CMRA_PWD       = pADO->FieldByName("WEB_CMRA_PWD")->AsString.Trim();      //	N	VARCHAR2(20)	Y			웹카메라 비밀번호
+                pObj->STRM_SESN_NM       = pADO->FieldByName("STRM_SESN_NM")->AsString.Trim();      //	N	VARCHAR2(200)	Y			스트리밍 세션 명
+                pObj->OPER_MODE          = pADO->FieldByName("OPER_MODE")->AsString.Trim();         //	N	VARCHAR2(7)	    Y	'A'		운영 모드
+                pObj->VMS_MAX_PHSE_NUM   = pADO->FieldByName("VMS_MAX_PHSE_NUM")->AsInteger;        //	N	NUMBER(2)	    Y	14		VMS 최대 표출면 개수
+                pObj->PANL_ON_TIME       = pADO->FieldByName("PANL_ON_TIME")->AsString.Trim();      //	N	VARCHAR2(4)	    Y	'0400'	전광판 ON TIME
+                pObj->PANL_OFF_TIME      = pADO->FieldByName("PANL_OFF_TIME")->AsString.Trim();     //	N	VARCHAR2(4)	    Y	'0200'	전광판 OFF TIME
+                pObj->PANL_PWER_MODE     = pADO->FieldByName("PANL_PWER_MODE")->AsInteger;          //	N	NUMBER(3)	Y	2		전광판 전원 모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
+                pObj->BRGH_MODE          = pADO->FieldByName("BRGH_MODE")->AsInteger;               //	N	NUMBER(3)	Y	2		휘도 모드(0x00:주간,0x01:야간,0x00:자동,0x09:알수없음)
+
+                pObj->VMS_TYPE_NM        = pADO->FieldByName("VMS_TYPE_NM")->AsString;
+
+
+                pObj->WIDTH              = pADO->FieldByName("VMS_WDTH")->AsString.Trim().ToIntDef(576);
+                pObj->HEIGHT             = pADO->FieldByName("VMS_HGHT")->AsString.Trim().ToIntDef(320);
+                pObj->ROW_NUM            = pADO->FieldByName("ROW_NUM")->AsInteger;
+                pObj->COL_NUM            = pADO->FieldByName("COL_NUM")->AsInteger;
+                pObj->MODL_ROW_NUM       = pADO->FieldByName("MODL_ROW_NUM")->AsInteger;
+                pObj->MODL_COL_NUM       = pADO->FieldByName("MODL_COL_NUM")->AsInteger;
+                pObj->POWR_ROW_NUM       = pADO->FieldByName("POWR_ROW_NUM")->AsInteger;
+                pObj->POWR_COL_NUM       = pADO->FieldByName("POWR_COL_NUM")->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;
+
+#if 0
+                pObj->STATE.ScheduledMessageOperatingTime = pObj->VMS_PHSE_CHNG_CYCL;    /* 필수 계획된 메시지의 동작시간(초) */
+                pObj->STATE.ModuleOperatingTemperature    = pObj->VMS_CMNC_ERR_BASS_VAL; /* 필수 모듈 전원이 꺼지는 온도값(℃) */
+                pObj->STATE.FanOperatingTemperature       = pObj->FAN_MTNS_TMPR;         /* 필수 Fan 동작 기준 온도값(℃) */
+                pObj->STATE.HeaterOperatingTemperature    = pObj->HETR_MTNS_TMPR;        /* 필수 Heater 동작 기준 온도값(℃) */
+                pObj->STATE.ModuleBasicFailureRate        = pObj->VMS_MODL_ERR_RATE;     /* 선택 모듈 장애율 (한 개의 모듈을 장애로 처리하기 위한 픽셀의 백분율값) */
+#endif
+				FLists.Push(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::LoadStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+#if 0
+//CMNC_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
+
+#if 0
+    sQry = "SELECT *                                                        \r\n"
+           "  FROM TB_VMS_CTLR_STTS A, TB_VMS_CTLR B                        \r\n"
+           " WHERE A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR                        \r\n"
+           "   AND A.UPDT_DT >= TO_CHAR(SYSDATE-5/1440, 'YYYYMMDDHH24MISS') \r\n";
+#else
+    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-5/1440, 'YYYYMMDDHH24MISS') \r\n";
+#endif
+
+    FLists.Lock();
+    try
+    {
+        TVmsCtlr *pObj = NULL;
+
+#if 0
+        FOR_STL(TVmsCtlr*, pTmp, FLists)
+        {
+            pTmp->STATE.Comm = vms_comm_error;
+            VmsInitStatus(&pTmp->STATE);
+            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->Prepared = true;
+            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 UPDT_DT      = pADO->FieldByName("UPDT_DT")->AsString;
+                String CMNC_STTS_CD = pADO->FieldByName("CMNC_STTS_CD")->AsString;
+                if (CMNC_STTS_CD != "CMS0")
+                {
+                    //통신장애
+                    continue;
+                }
+                pObj->STATE.Comm = vms_comm_normal;
+
+                String CBOXDOOR_OPEN_STTS_CD = pADO->FieldByName("CBOX_DOOR_STTS_CD")->AsString;
+                if      (CBOXDOOR_OPEN_STTS_CD == "CDS0") pObj->STATE.DoorStatus = vms_door_close;
+                else if (CBOXDOOR_OPEN_STTS_CD == "CDS1") pObj->STATE.DoorStatus = vms_door_open;
+
+                String CBOXFAN_STTS_CD = pADO->FieldByName("FAN_STTS_CD")->AsString;
+                if      (CBOXFAN_STTS_CD == "MOS0") pObj->STATE.ModulePowerStatus = vms_module_power_on;
+                else if (CBOXFAN_STTS_CD == "MOS1") pObj->STATE.ModulePowerStatus = vms_module_power_off;
+
+                String CBOX_TMPR = pADO->FieldByName("CBOX_TMPR")->AsString;
+                pObj->STATE.BodyTemp = CBOX_TMPR.ToIntDef(0);
+
+                String CBOX_HMDT = pADO->FieldByName("BRGH_VAL")->AsString;
+                pObj->STATE.LuminanceStatus = CBOX_HMDT.ToIntDef(0);
+
+                String FAN_STTS_CD = pADO->FieldByName("FAN_STTS_CD")->AsString;
+                if      (FAN_STTS_CD == "PAS0") pObj->STATE.FanStatus = vms_fan_on;
+                else if (FAN_STTS_CD == "PAS1") pObj->STATE.FanStatus = vms_fan_off;
+
+                String HETR_STTS_CD = pADO->FieldByName("HETR_STTS_CD")->AsString;
+                if      (HETR_STTS_CD == "HTS0") pObj->STATE.HeaterStatus = vms_heater_on;
+                else if (HETR_STTS_CD == "HTS1") pObj->STATE.HeaterStatus = vms_heater_off;
+
+                String COMM_STTS_CD = pADO->FieldByName("COMM_STTS_CD")->AsString;
+                if      (COMM_STTS_CD == "CMS0") pObj->STATE.Wcomm = vms_wcomm_normal;
+                else if (COMM_STTS_CD == "CMS1") pObj->STATE.Wcomm = vms_wcomm_error;
+
+
+                pObj->CheckRunState();
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsCtlrManager::LoadStatusFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TVmsCtlrManager::LoadStatusFromDb", 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();
+
+        sQry = "DELETE TB_FCLT_INFR      \r\n"
+               " WHERE FCLT_ID = :p01    \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->VMS_CTLR_ID;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsCtlrManager::DeleteVms", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("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"
+           "          (                     \r\n"
+           "           VMS_CTLR_NMBR,       \r\n"
+           "           VMS_CTLR_ID,         \r\n"
+           "           VMS_NM,              \r\n"
+           "           VMS_CTLR_IP,         \r\n"
+           "           VMS_CTLR_PORT,       \r\n"
+           "           VMS_CTLR_LOCAL_NO,   \r\n"
+           "           VMS_TYPE_CD,         \r\n"
+           "           ISTL_LCTN_NM,        \r\n"
+           "           X_CRDN,              \r\n"
+           "           Y_CRDN,              \r\n"
+           "           DEL_YN,              \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"
+           "           VMS_MAX_PHSE_NUM,    \r\n"
+           "           PANL_ON_TIME,        \r\n"
+           "           PANL_OFF_TIME,       \r\n"
+           "           ISTL_LCTN_ADDR       \r\n"
+           "          )                     \r\n"
+           "   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";
+    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_CTLR_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->VMS_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->VMS_CTLR_IP;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->VMS_CTLR_PORT;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->VMS_CTLR_LOCAL_NO;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->VMS_TYPE_CD;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->ISTL_LCTN_NM;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->DEL_YN;
+            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->VMS_MAX_PHSE_NUM;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->PANL_ON_TIME;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->PANL_OFF_TIME;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->ISTL_LCTN_ADDR;
+
+			pADO->ExecSQL();
+
+            return MergeFcltInfo(AObj, ADbConn);
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsCtlrManager::InsertVms", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("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_CTLR_ID,         \r\n"
+           "              :p03 AS VMS_NM,              \r\n"
+           "              :p04 AS VMS_CTLR_IP,         \r\n"
+           "              :p05 AS VMS_CTLR_PORT,       \r\n"
+           "              :p06 AS VMS_CTLR_LOCAL_NO,   \r\n"
+           "              :p07 AS VMS_TYPE_CD,         \r\n"
+           "              :p08 AS ISTL_LCTN_NM,        \r\n"
+           "              :p09 AS X_CRDN,              \r\n"
+           "              :p10 AS Y_CRDN,              \r\n"
+           "              :p11 AS DEL_YN,              \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 VMS_MAX_PHSE_NUM,    \r\n"
+           "              :p18 AS PANL_ON_TIME,        \r\n"
+           "              :p19 AS PANL_OFF_TIME,       \r\n"
+           "              :p20 AS ISTL_LCTN_ADDR       \r\n"
+           "         FROM DUAL) M                                     \r\n"
+           "        ON (L.VMS_CTLR_NMBR = M.VMS_CTLR_NMBR)            \r\n"
+           "WHEN MATCHED THEN                                         \r\n"
+           "   UPDATE SET L.VMS_CTLR_ID       = M.VMS_CTLR_ID,        \r\n"
+           "              L.VMS_NM            = M.VMS_NM,             \r\n"
+           "              L.VMS_CTLR_IP       = M.VMS_CTLR_IP,        \r\n"
+           "              L.VMS_CTLR_PORT     = M.VMS_CTLR_PORT,      \r\n"
+           "              L.VMS_CTLR_LOCAL_NO = M.VMS_CTLR_LOCAL_NO,  \r\n"
+           "              L.VMS_TYPE_CD       = M.VMS_TYPE_CD,        \r\n"
+           "              L.ISTL_LCTN_NM      = M.ISTL_LCTN_NM,       \r\n"
+           "              L.X_CRDN            = M.X_CRDN,             \r\n"
+           "              L.Y_CRDN            = M.Y_CRDN,             \r\n"
+           "              L.DEL_YN            = M.DEL_YN,             \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.VMS_MAX_PHSE_NUM  = M.VMS_MAX_PHSE_NUM,   \r\n"
+           "              L.PANL_ON_TIME      = M.PANL_ON_TIME,       \r\n"
+           "              L.PANL_OFF_TIME     = M.PANL_OFF_TIME,      \r\n"
+           "              L.ISTL_LCTN_ADDR    = M.ISTL_LCTN_ADDR      \r\n"
+           "WHEN NOT MATCHED THEN                                     \r\n"
+           "   INSERT (                     \r\n"
+           "           VMS_CTLR_NMBR,       \r\n"
+           "           VMS_CTLR_ID,         \r\n"
+           "           VMS_NM,              \r\n"
+           "           VMS_CTLR_IP,         \r\n"
+           "           VMS_CTLR_PORT,       \r\n"
+           "           VMS_CTLR_LOCAL_NO,   \r\n"
+           "           VMS_TYPE_CD,         \r\n"
+           "           ISTL_LCTN_NM,        \r\n"
+           "           X_CRDN,              \r\n"
+           "           Y_CRDN,              \r\n"
+           "           DEL_YN,              \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"
+           "           VMS_MAX_PHSE_NUM,    \r\n"
+           "           PANL_ON_TIME,        \r\n"
+           "           PANL_OFF_TIME,       \r\n"
+           "           ISTL_LCTN_ADDR       \r\n"
+           "          )                     \r\n"
+           "   VALUES (                     \r\n"
+           "           M.VMS_CTLR_NMBR,     \r\n"
+           "           M.VMS_CTLR_ID,       \r\n"
+           "           M.VMS_NM,            \r\n"
+           "           M.VMS_CTLR_IP,       \r\n"
+           "           M.VMS_CTLR_PORT,     \r\n"
+           "           M.VMS_CTLR_LOCAL_NO, \r\n"
+           "           M.VMS_TYPE_CD,       \r\n"
+           "           M.ISTL_LCTN_NM,      \r\n"
+           "           M.X_CRDN,            \r\n"
+           "           M.Y_CRDN,            \r\n"
+           "           M.DEL_YN,            \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.VMS_MAX_PHSE_NUM,  \r\n"
+           "           M.PANL_ON_TIME,      \r\n"
+           "           M.PANL_OFF_TIME,     \r\n"
+           "           M.ISTL_LCTN_ADDR     \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 = AObj->VMS_CTLR_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->VMS_CTLR_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->VMS_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->VMS_CTLR_IP;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->VMS_CTLR_PORT;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->VMS_CTLR_LOCAL_NO;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->VMS_TYPE_CD;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->ISTL_LCTN_NM;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->DEL_YN;
+            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->VMS_MAX_PHSE_NUM;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->PANL_ON_TIME;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->PANL_OFF_TIME;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->ISTL_LCTN_ADDR;
+
+			pADO->ExecSQL();
+
+            return MergeFcltInfo(AObj, ADbConn);
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsCtlrManager::MergeVms", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("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)
+        {
+            DBERRORMSG("TVmsCtlrManager::MergeFcltInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("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->Prepared = true;
+			pADO->Open();
+            ANmbr = pADO->FieldByName("NEWID")->AsInteger;
+            AId = ANmbr / 10000;
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("VmsCtlrManager::GetNextVmsId", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("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"
+           " 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->ExecSQL();
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsCtlrManager::UpdateCtlrInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("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::UpdateIfscCngsSpeedInfo(int ACngsSpd, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_VMS_RLTN_IFSC         \r\n"
+           "   SET CNGS_CNFM_SPED = :p01    \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;
+
+            pADO->Parameters->ParamByName("p01")->Value = ACngsSpd;
+            pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TVmsCtlrManager::UpdateIfscCngsSpeedInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TVmsCtlrManager::UpdateIfscCngsSpeedInfo", 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;
+
+    FLists.Lock();
+    try
+    {
+        FOR_STL(TVmsCtlr*, pObj, FLists)
+        {
+            pObj->FIfscRltn.RemoveAll();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+#if 0
+    sQry = "SELECT A.VMS_CTLR_NMBR, B.VMS_IFSC_ID, B.DSPL_PRRT, \r\n"
+           "       B.CNGS_CNFM_YN, B.CNGS_CNFM_SPED             \r\n"
+           "  FROM TB_VMS_CTLR      A,                          \r\n"
+           "       TB_VMS_RLTN_IFSC 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";
+#else
+    //구미 컬럼 추가하지 않는 경우에는 alias 사용, 테이블 명칭 변경됨
+    sQry = "SELECT A.VMS_CTLR_NMBR, B.VMS_IFSC_ID, B.DSPL_PRRT, \r\n"
+           "       'N' AS CNGS_CNFM_YN, 5 AS CNGS_CNFM_SPED     \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";
+#endif
+
+    FLists.Lock();
+    try
+    {
+        String VMS_CTLR_NMBR;
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                VMS_CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
+				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;
+                    pObj->CNGS_CNFM_YN  = pADO->FieldByName("CNGS_CNFM_YN")->AsString;
+                    pObj->CNGS_CNFM_SPED= pADO->FieldByName("CNGS_CNFM_SPED")->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_RLTN_IFSC 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_RLTN_IFSC(VMS_CTLR_NMBR, VMS_IFSC_ID, DSPL_PRRT, CNGS_CNFM_YN, CNGS_CNFM_SPED) VALUES(:p01, :p02, :p03, :p04, :p05)";
+            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->Parameters->ParamByName("p04")->Value = pLink->CNGS_CNFM_YN;
+                pADO->Parameters->ParamByName("p05")->Value = pLink->CNGS_CNFM_SPED;
+    			pADO->ExecSQL();
+                ii++;
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsCtlrManager::SaveIfscRltn", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("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.*,                                                     \r\n"
+           "       TO_CHAR(SYSDATE - 8/1440, 'YYYYMMDDHH24MISS') AS SVC_DT  \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";
+
+    FLists.Lock();
+    try
+    {
+        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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String sVmsNmbr = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
+                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_VMS_MAX_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_FORM_DSPL_MTHD_CD")->AsString;
+                        pObj->VmsMsg->PHASE[nPhase].VMS_SCH_FORM_TYPE = pADO->FieldByName("VMS_SCH_FORM_TYPE")->AsInteger;
+
+                        if (pObj->VmsMsg->PHASE[nPhase].VMS_SCH_FORM_TYPE == eSchTp_video  ||
+                            pObj->VmsMsg->PHASE[nPhase].VMS_SCH_FORM_TYPE == eSchTp_stream )
+                        {
+                            pObj->VmsMsg->PHASE[nPhase].VMS_DSPL_MSG_TXT = pADO->FieldByName("VMS_DSPL_MSG_TXT")->AsString.Trim();
+                        }
+
+                        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->STATE.Comm != vms_comm_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;
+
+#if 0
+    sQry = "SELECT A.VMS_CTLR_NMBR,                                  \r\n"
+           "       A.VMS_SCH_TYPE,                                   \r\n"
+           "       A.VMS_SCH_FORM_TYPE,                              \r\n"
+           "       A.DSPL_STRT_HH,                                   \r\n"
+           "       A.DSPL_END_HH,                                    \r\n"
+           "       TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') AS CURR_HH,  \r\n"
+           "       A.USE_YN                                          \r\n"
+           "  FROM TB_VMS_DSPL_SCH A,                                \r\n"
+           "       TB_VMS_FORM     B                                 \r\n"
+           " WHERE 1=1                                               \r\n"
+//           "   AND B.VALID_YN    = 'Y'                               \r\n"
+           "   AND A.VMS_FORM_ID = B.VMS_FORM_ID                     \r\n";
+#else
+    sQry = "SELECT A.VMS_CTLR_NMBR,                                  \r\n"
+           "       A.TRFC_SITU_TYPE_CD AS VMS_SCH_TYPE,              \r\n"
+           "       A.TRFC_SITU_TYPE_CD AS VMS_SCH_FORM_TYPE,         \r\n"
+           "       A.DSPL_STRT_HH,                                   \r\n"
+           "       A.DSPL_END_HH,                                    \r\n"
+           "       TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') AS CURR_HH,  \r\n"
+           "       'Y' AS USE_YN                                     \r\n"
+           "  FROM TB_VMS_TRFC_INFR_DSPL_SCH A,                      \r\n"
+           "       TB_VMS_FORM     B                                 \r\n"
+           " WHERE 1=1                                               \r\n"
+           "   AND A.VMS_FORM_ID = B.VMS_FORM_ID                     \r\n";
+#endif
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+            ITSDb_SQLText(pADO, sQry);
+            ITSDb_SQLOpen(pADO);
+
+            TVmsCtlr *pObj;
+            int nSchType, nFormType;
+
+            for( ; !pADO->Eof; pADO->Next())
+            {
+
+                String sVmsNmbr = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
+
+                pObj = FLists.Find(sVmsNmbr);
+                if (!pObj) continue;
+
+                String sSchType = pADO->FieldByName("VMS_SCH_TYPE")->AsString.Trim();
+                if      (sSchType == "A") nSchType = enScheduleAuto;
+                else if (sSchType == "F") nSchType = enScheduleFix;
+                else if (sSchType == "B") nSchType = enScheduleBase;
+                else continue;
+
+                nFormType = pADO->FieldByName("VMS_SCH_FORM_TYPE")->AsInteger;
+                if (nFormType < eSchTp_traffic && nFormType >= eSchTp_max) continue;
+
+                pObj->FormCnt[nSchType].Total[nFormType]++;  //등록되어있는 전체 폼 숫자
+
+                if (pADO->FieldByName("USE_YN")->AsString != 'Y') 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[nSchType].Use[nFormType]++;  //사용가능 폼 숫자
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsCtlrManager::LoadVmsFormUsage", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("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_CTRL_HS(                \r\n"
+           "                          CTRL_DT,         \r\n"
+           "                          VMS_CTLR_NMBR,   \r\n"
+           "                          CTRL_TYPE,       \r\n"
+           "                          CTRL_VAL,        \r\n"
+           "                          CTRL_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)
+        {
+            DBERRORMSG("TVmsCtlrManager::InsVmsControlHs", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TVmsCtlrManager::InsVmsControlHs", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+int VmsGetFormTypeIdx(int AFormType)
+{
+    int nFormTypeIdx = -1;
+    switch(AFormType)
+    {
+    case eFormTp_traf_1:    //	소통상황(1단)
+    case eFormTp_traf_2:    //	소통상황(2단)
+    case eFormTp_traf_3:    //	소통상황(3단)
+    case eFormTp_traf_4:    //	소통상황(4단)
+    case eFormtp_figure:    //	소통상황(도형식배경소통정보)
+        nFormTypeIdx = eSchTp_traffic;
+        break;
+    case eFormTp_congest:    //	정체소통상황
+        nFormTypeIdx = eSchTp_congest;
+        break;
+    case eFormTp_incident:    //	돌발문안
+        nFormTypeIdx = eSchTp_incident;
+        break;
+    case eFormTp_gongsa:    //	공사/행사문안
+        nFormTypeIdx = eSchTp_gongsa;
+        break;
+    case eFormTp_hongbo:    //	홍보문안
+        nFormTypeIdx = eSchTp_hongbo;
+        break;
+    case eFormTp_deture:    //	우회도로
+        nFormTypeIdx = eSchTp_deture;
+        break;
+    case eFormTp_safe:    //	재난안전
+        nFormTypeIdx = eSchTp_safe;
+        break;
+    case eFormTp_video:    //	동영상
+        nFormTypeIdx = eSchTp_video;
+        break;
+    case eFormTp_stream:    //	스트리밍영상
+        nFormTypeIdx = eSchTp_stream;
+        break;
+    case eFormTp_atmp:    //	대기환경
+        nFormTypeIdx = eSchTp_atmp;
+        break;
+    case eFormTp_park:    //	주차정보
+        nFormTypeIdx = eSchTp_park;
+        break;
+    default: break;
+    }
+    return nFormTypeIdx;
+}
+

+ 255 - 0
COMMON/CDS/CDSVmsCtlrF.h

@@ -0,0 +1,255 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVmsCtlrFH
+#define CDSVmsCtlrFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+#include "CDSObjectF.h"
+//---------------------------------------------------------------------------
+#include "CenterCommF.h"
+//---------------------------------------------------------------------------
+
+typedef enum enVmsState
+{
+    state_normal = 0,
+    state_error,
+    state_module,
+} EN_VMS_STATE;
+//---------------------------------------------------------------------------
+
+typedef enum _e_schedule_mode
+{
+    enScheduleAuto,
+    enScheduleFix,
+    enScheduleBase,
+    enScheduleMax,
+} e_schedule_mode;
+//---------------------------------------------------------------------------
+typedef enum _e_form_type
+{
+    eFormTp_traf_1   = 11,  //	소통상황(1단)
+    eFormTp_traf_2   = 12,  //	소통상황(2단)
+    eFormTp_traf_3   = 13,  //	소통상황(3단)
+    eFormTp_traf_4   = 14,  //	소통상황(4단)
+    eFormtp_figure   = 15,  //	소통상황(도형식배경소통정보)
+    eFormTp_congest  = 16,  //	정체소통상황
+    eFormTp_incident = 20,  //	돌발문안
+    eFormTp_gongsa   = 30,  //	공사/행사문안
+    eFormTp_hongbo   = 40,  //	홍보문안
+    eFormTp_deture   = 50,  //	우회도로
+    eFormTp_safe     = 60,  //	재난안전
+    eFormTp_video    = 70,  //	동영상
+    eFormTp_stream   = 80,  //	스트리밍영상
+    eFormTp_atmp     = 90,  //	대기환경
+    eFormTp_park     = 91,  //	주차정보
+} e_form_type;
+
+typedef enum _e_schedule_type
+{
+    eSchTp_traffic  = 0,    //0:교통,
+    eSchTp_incident = 1,    //1:돌발,
+    eSchTp_gongsa   = 2,    //2:공사행사,
+    eSchTp_hongbo   = 3,    //3:홍보,
+    eSchTp_deture   = 4,    //4:우회,
+    eSchTp_congest  = 5,    //5:정체,
+    eSchTp_safe     = 6,    //6:안전,
+    eSchTp_video    = 7,    //7:동영상,
+    eSchTp_stream   = 8,    //8:스트리밍영상
+    eSchTp_atmp     = 9,    //9:대기환경
+    eSchTp_park     = 10,   //10:주차정보
+    eSchTp_max,
+} e_schedule_type;
+//---------------------------------------------------------------------------
+
+typedef struct tagScheduleUsage
+{
+    int Total[eSchTp_max];
+    int Use[eSchTp_max];
+} SCHEDULE_USAGE, *PSCHEDULE_USAGE;
+
+//---------------------------------------------------------------------------
+class TVmsIfscRltn
+{
+public:
+    TVmsIfscRltn();
+    ~TVmsIfscRltn();
+public:
+    String  VMS_CTLR_NMBR;  //NUMBER(10)	N			VMS 제어기 번호
+    int     VMS_IFSC_ID;    //NUMBER(10)	N			VMS 정보제공구간 ID
+    int     DSPL_PRRT;      //NUMBER(2)	    Y			표출 우선순위
+    String  CNGS_CNFM_YN;   //CHAR(1)	Y	'Y'		정체폼 정체판정 여부
+    int     CNGS_CNFM_SPED; //NUMBER(2)	Y	5		정체폼 정체판정 속도
+};
+//---------------------------------------------------------------------------
+
+typedef struct tagVmsPhase
+{
+    int                 DSPL_HH;    //표출시간
+    String              DNLD_YN;    //다운로드성공여부
+    String              DSPL_CD;    //표출방법
+    int                 VMS_SCH_FORM_TYPE;
+    String              VMS_DSPL_MSG_TXT;
+    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_VMS_MAX_FORM];
+};
+
+//---------------------------------------------------------------------------
+
+class TVmsCtlr : public TCDSObject
+{
+public:
+    TVmsCtlr();
+    ~TVmsCtlr();
+
+public:
+    String  WEB_CMRA_IP;            //	N	VARCHAR2(20)	Y			웹 카메라 아이피
+    String  WEB_CMRA_PORT;          //	N	NUMBER(5)	    Y			웹카메라 포트
+    String  WEB_CMRA_ID;            //	N	VARCHAR2(20)	Y			웹카메라 ID
+    String  WEB_CMRA_PWD;           //	N	VARCHAR2(20)	Y			웹카메라 비밀번호
+    String  STRM_SESN_NM;           //	N	VARCHAR2(200)	Y			스트리밍 세션 명
+    String  OPER_MODE;              //	N	VARCHAR2(7)	    Y	'A'		운영 모드
+    int     VMS_MAX_PHSE_NUM;       //	N	NUMBER(2)	    Y	14		VMS 최대 표출면 개수
+    int     DEF_PHSE_CHNG_CYCL;     //	N	NUMBER(3)	    Y	5		기본메시지주기
+    String  PANL_ON_TIME;           //	N	VARCHAR2(4)	    Y	'0400'	전광판 ON TIME
+    String  PANL_OFF_TIME;          //	N	VARCHAR2(4)	    Y	'0200'	전광판 OFF TIME
+    int     PANL_PWER_MODE;         //	N	NUMBER(3)	Y	2		전광판 전원 모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
+    int     FAN_MODE;               //	N	NUMBER(3)	Y	2		FAN 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
+    int     FAN_RUN_TMPR;           //	N	NUMBER(3)	Y	30		팬 동작 온도
+    int     HETR_MODE;              //	N	NUMBER(3)	Y	2		히터 동작모드(0x00:꺼짐,0x01:켜짐,0x02:자동,0x09:알수없음)
+    int     HETR_RUN_TMPR;          //	N	NUMBER(3)	Y	0		히터 동작 온도
+    int     BRGH_MODE;              //	N	NUMBER(3)	Y	2		휘도 모드(0x00:주간,0x01:야간,0x00:자동,0x09:알수없음)
+    int     BRGH_CURR_STEP;         //	N	NUMBER(3)	Y	40		휘도 현재 단계(0~100)
+    int     BRGH_WEEK_STEP;         //	N	NUMBER(3)	Y	64		휘도 주간 단계(0~100)
+    int     BRGH_NGHT_STEP;         //	N	NUMBER(3)	Y	48		휘도 야간 단계(0~100)
+    int     MODL_ERR_RATE;          //	N	NUMBER(3)	Y	10		VMS 모듈 오류 율
+    int     CMNC_FAIL_RATE;         //	N	NUMBER(3)	Y	60		VMS 통신 오류 기본 값
+    String  WEB_CMRA_CMPY;          //	N	VARCHAR2(50)	Y			웹카메라제조사(삼성카메라'Samsung')
+    String  WEB_CMRA_MDL;           //	N	VARCHAR2(126)	Y			웹카메라모델
+
+    String  ParamResTime;
+
+    String  VMS_TYPE_NM;
+
+    //크기
+    int     WIDTH, HEIGHT;
+    int     ROW_NUM, COL_NUM;
+    int     MODL_ROW_NUM, MODL_COL_NUM;
+    int     POWR_ROW_NUM, POWR_COL_NUM;
+
+    SCHEDULE_USAGE  FormCnt[enScheduleMax];
+
+    TVmsMsg *VmsMsg;
+
+    INT_VMS_STATE   STATE;
+    int             RunState;
+
+public:
+
+    void InitFormCount()
+    {
+        for (int ii = 0; ii < eSchTp_max; ii++)
+        {
+            for (int jj = 0; jj < enScheduleMax; jj++)
+            {
+                FormCnt[jj].Total[ii] = 0;
+                FormCnt[jj].Use[ii]   = 0;
+            }
+        }
+    };
+    void CheckRunState();
+    TItsMap<int, TVmsIfscRltn*>  FIfscRltn;
+
+public:
+    __property String  VMS_CTLR_NMBR     = { read = CTLR_NMBR,     write = CTLR_NMBR     };
+    __property String  VMS_CTLR_ID       = { read = CTLR_ID,       write = CTLR_ID       };
+    __property String  VMS_NM            = { read = NAME,          write = NAME          };
+    __property String  VMS_CTLR_IP       = { read = CTLR_IP,       write = CTLR_IP       };
+    __property int     VMS_CTLR_PORT     = { read = CTLR_PORT,     write = CTLR_PORT     };
+    __property int     VMS_CTLR_LOCAL_NO = { read = CTLR_LOCAL_NO, write = CTLR_LOCAL_NO };
+    __property String  VMS_TYPE_CD       = { read = TYPE_CD,       write = TYPE_CD       };
+};
+//---------------------------------------------------------------------------
+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:
+    TItsMap<String, TVmsSize*> FVmsSize;
+    TItsMap<String, TVmsCtlr*> FLists;
+
+    void InitFormCount();
+
+    int  FMinWidth, FMinHeight;
+    int  FMaxWidth, FMaxHeight;
+public:
+    bool LoadVmsSize(TADOConnection *ADbConn=NULL);
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadStatusFromDb(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 UpdateIfscCngsSpeedInfo(int ACngsSpd, 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 *VmsCtlrManager;
+//---------------------------------------------------------------------------
+void VmsInitStatus(INT_VMS_STATE *AState);
+int  VmsGetFormTypeIdx(int AFormType);
+//---------------------------------------------------------------------------
+
+#endif

+ 136 - 0
COMMON/CDS/CDSVmsDsplSchF.cpp

@@ -0,0 +1,136 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSVmsDsplSchF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TCDSVmsDsplSchManager *CDSVmsDsplSchManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+TCDSVmsDsplSchManager::TCDSVmsDsplSchManager()
+{
+}
+//---------------------------------------------------------------------------
+TCDSVmsDsplSchManager::~TCDSVmsDsplSchManager()
+{
+    Clear();
+    FPhases.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TCDSVmsDsplSchManager::Clear()
+{
+    FMaxPhase = 0;
+    FOR_STL(TCDSVmsDsplSch*, pObj, FPhases)
+    {
+        pObj->FWeeks.RemoveAll();
+    }
+}
+//---------------------------------------------------------------------------
+bool TCDSVmsDsplSchManager::LoadFromDb(TADOConnection *ADbConn, String AVMS_CTLR_NMBR, String AVMS_SCH_TYPE)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.PHASE, B.WEEK_CD, B.SCH_HH         \r\n"
+           "  FROM TB_VMS_DSPL_SCH      A,              \r\n"
+           "       TB_VMS_DSPL_SCH_WEEK B               \r\n"
+           " WHERE A.VMS_SCH_TYPE  = :p01               \r\n"
+           "   AND A.VMS_CTLR_NMBR = :p02               \r\n"
+           "   AND A.VMS_SCH_TYPE  = B.VMS_SCH_TYPE(+)  \r\n"
+           "   AND A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR(+) \r\n"
+           "   AND A.PHASE         = B.PHASE(+)         \r\n"
+           " ORDER BY A.PHASE, B.WEEK_CD                \r\n";
+
+    Clear();
+
+    FPhases.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            pADO->Parameters->ParamByName("p01")->Value = AVMS_SCH_TYPE;
+            pADO->Parameters->ParamByName("p02")->Value = AVMS_CTLR_NMBR;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                int PHASE = pADO->FieldByName("PHASE")->AsInteger;
+                TCDSVmsDsplSch *pObj = FPhases.Find(PHASE);
+                if (!pObj)
+                {
+                    pObj = new TCDSVmsDsplSch();
+                    pObj->PHASE = PHASE;
+                    FPhases.Push(PHASE, pObj);
+                }
+                if (PHASE > FMaxPhase)
+                {
+                    FMaxPhase = PHASE;
+                }
+
+                String WEEK_CD = pADO->FieldByName("WEEK_CD")->AsString;
+                if (WEEK_CD == "") continue;
+
+				TCDSVmsDsplSchWeek *pWeek = pObj->FWeeks.Find(WEEK_CD);
+                if (!pWeek)
+                {
+                    pWeek = new TCDSVmsDsplSchWeek();
+                    pWeek->WEEK_CD = WEEK_CD;
+                    pObj->FWeeks.Push(pWeek->WEEK_CD, pWeek);
+                }
+                pWeek->SCH_HH = pADO->FieldByName("SCH_HH")->AsString;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TCDSVmsDsplSchManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TCDSVmsDsplSchManager::LoadFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+
+        FOR_STL(TCDSVmsDsplSch*, pObj, FPhases)
+        {
+            for (int nWeek = 1; nWeek <= 7; nWeek++)
+            {
+				TCDSVmsDsplSchWeek *pWeek = pObj->FWeeks.Find(String(nWeek));
+                if (!pWeek)
+                {
+                    pWeek = new TCDSVmsDsplSchWeek();
+                    pWeek->WEEK_CD = String(nWeek);
+                    pObj->FWeeks.Push(pWeek->WEEK_CD, pWeek);
+                }
+            }
+        }
+
+        FPhases.UnLock();
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------

+ 67 - 0
COMMON/CDS/CDSVmsDsplSchF.h

@@ -0,0 +1,67 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVmsDsplSchFH
+#define CDSVmsDsplSchFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+//---------------------------------------------------------------------------
+#include "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  class
+*/
+class TCDSVmsDsplSchWeek
+{
+public:
+    TCDSVmsDsplSchWeek()  
+    {
+        SCH_HH = "111111111111111111111111";
+    };
+    ~TCDSVmsDsplSchWeek() {};
+
+public:
+    String  WEEK_CD;    //	N	VARCHAR2(1)	    N	                                ¿äÀÏÄÚµå(1:ÀÏ,...7:Åä)
+    String  SCH_HH;     //	N	VARCHAR2(24)	Y	'111111111111111111111111'		Ç¥Ãâ½Ã°¢
+
+};
+//---------------------------------------------------------------------------
+
+class TCDSVmsDsplSch
+{
+public:
+    TCDSVmsDsplSch()  {};
+    ~TCDSVmsDsplSch() {};
+
+public:
+    int PHASE;
+    TItsMap<String, TCDSVmsDsplSchWeek*>  FWeeks;
+
+};
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+class TCDSVmsDsplSchManager
+{
+public:
+    TCDSVmsDsplSchManager();
+    virtual ~TCDSVmsDsplSchManager();
+
+public:
+    TItsMap<int, TCDSVmsDsplSch*>  FPhases;
+    int FMaxPhase;
+
+public:
+    void Clear();
+    bool LoadFromDb(TADOConnection *ADbConn, String AVMS_CTLR_NMBR, String AVMS_SCH_TYPE);
+};
+//---------------------------------------------------------------------------
+extern TCDSVmsDsplSchManager *CDSVmsDsplSchManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 123 - 0
COMMON/CDS/CDSVmsFormF.cpp

@@ -0,0 +1,123 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSVmsFormF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+void TCDSVmsForm::Init()
+{
+}
+//---------------------------------------------------------------------------
+TCDSVmsFormManager *CDSVmsFormManager = NULL;
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+TCDSVmsFormManager::TCDSVmsFormManager()
+{
+}
+//---------------------------------------------------------------------------
+TCDSVmsFormManager::~TCDSVmsFormManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+void TCDSVmsFormManager::Init()
+{
+    FOR_STL(TCDSVmsForm*, pObj, FLists)
+    {
+        pObj->Init();
+    }
+}
+//---------------------------------------------------------------------------
+bool TCDSVmsFormManager::LoadFromDb(TADOConnection *ADbConn)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT VMS_FORM_ID, VALID_YN    \r\n"
+           "  FROM TB_VMS_FORM              \r\n";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String VMS_FORM_ID = pADO->FieldByName("VMS_FORM_ID")->AsString.Trim();
+				TCDSVmsForm *pObj = FLists.Find(VMS_FORM_ID);
+                if (!pObj)
+                {
+                    pObj = new TCDSVmsForm();
+
+                    pObj->VMS_FORM_ID = VMS_FORM_ID;
+                    FLists.Push(pObj->VMS_FORM_ID, pObj);
+                }
+
+                pObj->VALID_YN = pADO->FieldByName("VALID_YN")->AsString.Trim();
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TCDSVmsFormManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TCDSVmsFormManager::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;
+}
+//---------------------------------------------------------------------------
+void TCDSVmsFormManager::AddVmsForm(String AVMS_FORM_ID, String AVALID_YN)
+{
+    TCDSVmsForm *pObj = FLists.Find(AVMS_FORM_ID);
+    if (!pObj)
+    {
+        pObj = new TCDSVmsForm();
+
+        pObj->VMS_FORM_ID = AVMS_FORM_ID;
+        FLists.Push(pObj->VMS_FORM_ID, pObj);
+    }
+
+    pObj->VALID_YN = AVALID_YN;
+}
+//---------------------------------------------------------------------------
+bool TCDSVmsFormManager::IsValid(String AVMS_FORM_ID)
+{
+    TCDSVmsForm *pObj = FLists.Find(AVMS_FORM_ID);
+    if (!pObj)
+    {
+        return false;
+    }
+    return pObj->VALID_YN == "Y" ? true : false;
+}
+//---------------------------------------------------------------------------
+

+ 56 - 0
COMMON/CDS/CDSVmsFormF.h

@@ -0,0 +1,56 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVmsFormFH
+#define CDSVmsFormFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+//---------------------------------------------------------------------------
+#include "ITSLibF.h"
+//---------------------------------------------------------------------------
+
+/*
+*  class
+*/
+class TCDSVmsForm
+{
+public:
+    TCDSVmsForm()  {};
+    ~TCDSVmsForm() {};
+
+public:
+    String  VMS_FORM_ID;
+    String  VALID_YN;
+
+public:
+    void Init();
+
+};
+//---------------------------------------------------------------------------
+
+/*
+* Manager
+*/
+class TCDSVmsFormManager
+{
+public:
+    TCDSVmsFormManager();
+    virtual ~TCDSVmsFormManager();
+
+public:
+    TItsMap<String, TCDSVmsForm*>  FLists;
+
+public:
+    void Init();
+
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    void AddVmsForm(String AVMS_FORM_ID, String AVALID_YN);
+    bool IsValid(String AVMS_FORM_ID);
+};
+//---------------------------------------------------------------------------
+extern TCDSVmsFormManager *CDSVmsFormManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 743 - 0
COMMON/CDS/CDSVmsIfscF.cpp

@@ -0,0 +1,743 @@
+//---------------------------------------------------------------------------
+
+#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
+    USE_YN            = "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()
+{
+    PRCN_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()
+{
+    FLists.Lock();
+    try
+    {
+        FOR_STL(TVmsIfsc*, pObj, FLists)
+        {
+            pObj->InitTraffic();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+}
+//---------------------------------------------------------------------------
+
+bool TVmsIfscManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    FLists.Lock();
+    try
+    {
+        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
+
+    FLists.Lock();
+    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())
+            {
+				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->USE_YN            = pADO->FieldByName("USE_YN")->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->CNGS_SPD = pADO->FieldByName("CNGS_SPD")->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_IFSC_RLTN_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";
+
+    FLists.Lock();
+    try
+    {
+        TVmsIfsc     *pIfsc;
+        TVmsLinkIfsc *pObj;
+        int           VMS_IFSC_ID;
+        int           ORD;
+
+        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(PRCN_DT, '19000101000000') AS PRCN_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_IFSC_TRAF                                              \r\n"
+           " WHERE PRCN_DT > TO_CHAR(SYSDATE -  10 / 1440, 'YYYYMMDDHH24MISS')  \r\n";
+
+    FLists.Lock();
+    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 VMS_IFSC_ID = pADO->FieldByName("VMS_IFSC_ID")->AsInteger;
+
+				TVmsIfsc *pObj = FLists.Find(VMS_IFSC_ID);
+                if (!pObj) continue;
+
+                pObj->PRCN_DT       = pADO->FieldByName("PRCN_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_IFSC_RLTN_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_RLTN_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_TRAF 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_IFSC_TRAF_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 USE_YN = 'N' 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 USE_YN,                            \r\n"
+           "              :p07 AS ROAD_NM,                           \r\n"
+           "              :p08 AS SPOT_NM,                           \r\n"
+           "              :p09 AS AXIS_YN,                           \r\n"
+           "              :p10 AS CNGS_SPD                           \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.USE_YN            = M.USE_YN,            \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"
+           "              L.CNGS_SPD          = M.CNGS_SPD           \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"
+           "           USE_YN,                                       \r\n"
+           "           ROAD_NM,                                      \r\n"
+           "           SPOT_NM,                                      \r\n"
+           "           AXIS_YN,                                      \r\n"
+           "           CNGS_SPD )                                    \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.USE_YN,                                     \r\n"
+           "           M.ROAD_NM,                                    \r\n"
+           "           M.SPOT_NM,                                    \r\n"
+           "           M.AXIS_YN,                                    \r\n"
+           "           M.CNGS_SPD )                                  \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->USE_YN;
+            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->Parameters->ParamByName("p10")->Value = AObj->CNGS_SPD;
+			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_IFSC_RLTN_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_IFSC_RLTN_IFSC(VMS_IFSC_ID, 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 = AObj->VMS_IFSC_ID;
+                pADO->Parameters->ParamByName("p02")->Value = pLink->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;
+}
+//---------------------------------------------------------------------------
+bool TVmsIfscManager::UpdateIfscCngsSpeedInfo(int ACngsSpd, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_VMS_IFSC       \r\n"
+           "   SET CNGS_SPD  = :p01  \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;
+
+            pADO->Parameters->ParamByName("p01")->Value = ACngsSpd;
+            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;
+}
+//---------------------------------------------------------------------------
+

+ 114 - 0
COMMON/CDS/CDSVmsIfscF.h

@@ -0,0 +1,114 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVmsIfscFH
+#define CDSVmsIfscFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#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  USE_YN;             //CHAR(1)	    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  PRCN_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		통행 시간
+    int     CNGS_SPD;
+
+    void InitTraffic();
+
+public:
+    TItsMap<int, 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:
+    TItsMap<int, 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);
+    bool UpdateIfscCngsSpeedInfo(int ACngsSpd, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TVmsIfscManager *VmsIfscManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 246 - 0
COMMON/CDS/CDSVmsObjTypeF.cpp

@@ -0,0 +1,246 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSVmsObjTypeF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+//---------------------------------------------------------------------------
+TVmsTypeManager *VmsTypeManager = NULL;
+//---------------------------------------------------------------------------
+
+TVmsTypeManager::TVmsTypeManager()
+{
+}
+//---------------------------------------------------------------------------
+TVmsTypeManager::~TVmsTypeManager()
+{
+    FLists.RemoveAll();
+}
+//---------------------------------------------------------------------------
+
+bool TVmsTypeManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    FLists.Lock();
+    try
+    {
+        FLists.RemoveAll();
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+    sQry = "SELECT A.*               \r\n"
+           "  FROM TB_VMS_TYPE A     \r\n"
+           " WHERE USE_YN = 'Y'      \r\n"
+           " ORDER BY A.VMS_TYPE_CD  \r\n";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+#if 0
+                String USE_YN = pADO->FieldByName("VMS_TYPE_CD")->AsString;
+                if (USE_YN != "Y") continue;
+#endif
+
+				TVmsType *pObj = new TVmsType();
+                if (!pObj)
+                {
+                    continue;
+                }
+                pObj->VMS_TYPE_CD  = pADO->FieldByName("VMS_TYPE_CD")->AsString.Trim(); //	N	VARCHAR2(5)	    N			VMS 유형 코드
+                pObj->VMS_TYPE_NM  = pADO->FieldByName("VMS_TYPE_NM")->AsString.Trim(); //	N	VARCHAR2(40)	Y			VMS 유형 명
+                pObj->VMS_WDTH     = pADO->FieldByName("VMS_WDTH")->AsInteger;          //	N	NUMBER(3)	    Y			VMS 너비
+                pObj->VMS_HGHT     = pADO->FieldByName("VMS_HGHT")->AsInteger;          //	N	NUMBER(3)	    Y			VMS 높이
+                pObj->ROW_NUM      = pADO->FieldByName("ROW_NUM")->AsInteger;           //	N	NUMBER(3)	    Y			행 개수
+                pObj->COL_NUM      = pADO->FieldByName("COL_NUM")->AsInteger;           //	N	NUMBER(3)	    Y			열 개수
+                pObj->MODL_ROW_NUM = pADO->FieldByName("MODL_ROW_NUM")->AsInteger;      //	N	NUMBER(3)	    Y			모듈 행 개수
+                pObj->MODL_COL_NUM = pADO->FieldByName("MODL_COL_NUM")->AsInteger;      //	N	NUMBER(3)	    Y			모듈 열 개수
+                pObj->POWR_ROW_NUM = pADO->FieldByName("POWR_ROW_NUM")->AsInteger;      //	N	NUMBER(3)	    Y			전원모듈 행 개수
+                pObj->POWR_COL_NUM = pADO->FieldByName("POWR_COL_NUM")->AsInteger;      //	N	NUMBER(3)	    Y			전원모듈 열 개수
+                pObj->USE_YN       = pADO->FieldByName("USE_YN")->AsString;             //	N	CHAR(1)	        Y	'N'		사용 여부
+
+                FLists.Push(pObj->VMS_TYPE_CD, pObj);
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsTypeManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TVmsTypeManager::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;
+}
+//---------------------------------------------------------------------------
+
+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;
+
+    FLists.Lock();
+    try
+    {
+        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"
+           "       USE_YN                           \r\n"
+           "  FROM TB_VMS_FORM_OBJECT_TYPE          \r\n"
+           " WHERE USE_YN = 'Y'                     \r\n"
+           " ORDER BY TYPE, CD                      \r\n";
+
+    FLists.Lock();
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+
+            pADO->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                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;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TVmsObjTypeManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TVmsObjTypeManager::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;
+}
+//---------------------------------------------------------------------------
+
+

+ 132 - 0
COMMON/CDS/CDSVmsObjTypeF.h

@@ -0,0 +1,132 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSVmsObjTypeFH
+#define CDSVmsObjTypeFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+//---------------------------------------------------------------------------
+
+class TVmsType
+{
+public:
+    TVmsType() {};
+    ~TVmsType(){};
+public:
+    String  VMS_TYPE_CD;    //	N	VARCHAR2(5)	    N			VMS 유형 코드
+    String  VMS_TYPE_NM;    //	N	VARCHAR2(40)	Y			VMS 유형 명
+    int     VMS_WDTH;       //	N	NUMBER(3)	    Y			VMS 너비
+    int     VMS_HGHT;       //	N	NUMBER(3)	    Y			VMS 높이
+    int     ROW_NUM;        //	N	NUMBER(3)	    Y			행 개수
+    int     COL_NUM;        //	N	NUMBER(3)	    Y			열 개수
+    int     MODL_ROW_NUM;   //	N	NUMBER(3)	    Y			모듈 행 개수
+    int     MODL_COL_NUM;   //	N	NUMBER(3)	    Y			모듈 열 개수
+    int     POWR_ROW_NUM;   //	N	NUMBER(3)	    Y			전원모듈 행 개수
+    int     POWR_COL_NUM;   //	N	NUMBER(3)	    Y			전원모듈 열 개수
+    String  USE_YN;         //	N	CHAR(1)	        Y	'N'		사용 여부
+};
+//---------------------------------------------------------------------------
+class TVmsTypeManager
+{
+public:
+    TVmsTypeManager();
+    ~TVmsTypeManager();
+
+private:
+
+public:
+    TItsMap<String, TVmsType*>    FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TVmsTypeManager *VmsTypeManager;
+//---------------------------------------------------------------------------
+
+typedef enum eObjUse
+{
+    enINSERT,
+    enUPDATE,
+    enDELETE,
+} EN_OBJUSE;
+
+class TVmsObjUse
+{
+public:
+    TVmsObjUse();
+    ~TVmsObjUse();
+public:
+    int     VMS_FORM_ID;
+    int     VMS_FORM_OBJECT_ID;
+    int     MODE;
+};
+//---------------------------------------------------------------------------
+class TVmsObjUseManager
+{
+public:
+    TVmsObjUseManager();
+    ~TVmsObjUseManager();
+
+private:
+
+public:
+    TItsMap<int, TVmsObjUse*>    FLists;
+
+public:
+    bool LoadFromDb(String AFormId, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+
+class TFormObjType
+{
+public:
+    TFormObjType()  {};
+    ~TFormObjType() {};
+
+private:
+
+public:
+    int     TYPE;
+    String  NAME;
+};
+
+class TVmsObjType
+{
+public:
+    TVmsObjType();
+    ~TVmsObjType();
+
+private:
+
+public:
+    int     TYPE;
+
+    TItsMap<int, TFormObjType*>  FLists;
+
+public:
+};
+//---------------------------------------------------------------------------
+class TVmsObjTypeManager
+{
+public:
+    TVmsObjTypeManager();
+    ~TVmsObjTypeManager();
+
+private:
+
+public:
+    TItsMap<int, TVmsObjType*>   FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TVmsObjTypeManager *VmsObjTypeManager;
+//---------------------------------------------------------------------------
+
+#endif

+ 121 - 0
COMMON/CDS/CDSVmsTrafficF.cpp

@@ -0,0 +1,121 @@
+//---------------------------------------------------------------------------
+
+#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

+ 951 - 0
COMMON/CDS/CDSWCamCtlrF.cpp

@@ -0,0 +1,951 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "CDSWCamCtlrF.h"
+#include "AppGlobalF.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
+
+
+//---------------------------------------------------------------------------
+TWCamCtlr::TWCamCtlr()
+{
+}
+//---------------------------------------------------------------------------
+
+TWCamCtlr::~TWCamCtlr()
+{
+}
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+TWCamCtlrManager *WCamCtlrManager = NULL;
+//---------------------------------------------------------------------------
+
+TWCamCtlrManager::TWCamCtlrManager()
+{
+    FImgStream = NULL;
+}
+//---------------------------------------------------------------------------
+TWCamCtlrManager::~TWCamCtlrManager()
+{
+    FLists.RemoveAll();
+    if (FImgStream) delete FImgStream;
+    FImgStream = NULL;
+}
+//---------------------------------------------------------------------------
+bool TWCamCtlrManager::LoadFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT A.*,                                                             \r\n"
+           "       scp.dec_b64('DAMO','SCP','ARIA_256.SCPS',A.CMRA_PSWD) AS PWD,    \r\n"
+           "       A.WCAM_TYPE_CD,                                                  \r\n"
+           "       (SELECT CMMN_CD_KOR_NM                                           \r\n"
+           "          FROM TB_CMMN_CD                                               \r\n"
+           "         WHERE CMMN_CLSF_CD = 'WCAM'                                    \r\n"
+           "           AND CMMN_CD      = A.WCAM_TYPE_CD) AS WCAM_TYPE_NM           \r\n"
+           "  FROM TB_WCAM_CTLR A                                                   \r\n";
+           " WHERE A.DEL_YN = 'N'                                                   \r\n";
+
+    FLists.Lock();
+    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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+				TWCamCtlr *pObj = new TWCamCtlr();
+
+                pObj->WCAM_CTLR_NMBR        = pADO->FieldByName("WCAM_CTLR_NMBR")->AsString;
+                pObj->WCAM_CTLR_ID          = pADO->FieldByName("WCAM_CTLR_ID")->AsString.Trim();
+                pObj->WCAM_NM               = pADO->FieldByName("WCAM_NM")->AsString.Trim();
+                pObj->WCAM_CTLR_IP          = pADO->FieldByName("WCAM_CTLR_IP")->AsString.Trim();
+                pObj->WCAM_CTLR_PORT        = pADO->FieldByName("WCAM_CTLR_PORT")->AsInteger;
+                pObj->WCAM_CTLR_LOCAL_NO    = pADO->FieldByName("WCAM_CTLR_LOCAL_NO")->AsInteger;
+                pObj->WCAM_TYPE_CD          = pADO->FieldByName("WCAM_TYPE_CD")->AsString.Trim();
+                pObj->ISTL_LCTN_NM          = pADO->FieldByName("ISTL_LCTN_NM")->AsString.Trim();
+                pObj->X_CRDN                = pADO->FieldByName("X_CRDN")->AsFloat;
+                pObj->Y_CRDN                = pADO->FieldByName("Y_CRDN")->AsFloat;
+                pObj->DEL_YN                = pADO->FieldByName("DEL_YN")->AsString;
+                pObj->STRM_SVR_IP           = pADO->FieldByName("STRM_SVR_IP")->AsString.Trim();
+                pObj->STRM_SVR_PORT         = pADO->FieldByName("STRM_SVR_PORT")->AsString.Trim();
+                pObj->STRM_SESN_NM          = pADO->FieldByName("STRM_SESN_NM")->AsString.Trim();
+                pObj->STRM_RTSP_ADDR        = pADO->FieldByName("STRM_RTSP_ADDR")->AsString.Trim();
+                pObj->STRM_RTMP_ADDR        = pADO->FieldByName("STRM_RTMP_ADDR")->AsString.Trim();
+                pObj->STRM_HTTP_ADDR        = pADO->FieldByName("STRM_HTTP_ADDR")->AsString.Trim();
+                pObj->STRM_STOR_ADDR        = pADO->FieldByName("STRM_STOR_ADDR")->AsString.Trim();
+                pObj->CMRA_PORT             = pADO->FieldByName("CMRA_PORT")->AsInteger;
+                pObj->CMRA_ID               = pADO->FieldByName("CMRA_ID")->AsString.Trim();
+                //pObj->CMRA_PSWD             = pADO->FieldByName("CMRA_PSWD")->AsString.Trim();
+                pObj->CMRA_PSWD             = pADO->FieldByName("PWD")->AsString.Trim();
+                pObj->CMRA_CHNL             = pADO->FieldByName("CMRA_CHNL")->AsInteger;
+                pObj->LINK_ID               = pADO->FieldByName("LINK_ID")->AsString.Trim();
+                pObj->ISTL_LCTN_ADDR        = pADO->FieldByName("ISTL_LCTN_ADDR")->AsString.Trim();
+                pObj->FULL_STRM_ADDR        = pADO->FieldByName("FULL_STRM_SESN_NM")->AsString.Trim();
+                pObj->WCAM_TYPE_NM          = pADO->FieldByName("WCAM_TYPE_NM")->AsString.Trim();
+
+				FLists.Push(pObj->WCAM_CTLR_NMBR, pObj);
+                pObj->Completed  = true;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TWCamCtlrManager::LoadFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TWCamCtlrManager::LoadFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+        FLists.UnLock();
+    }
+
+    return LoadPreSet(ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TWCamCtlrManager::LoadStatusFromDb(TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT *                                                        \r\n"
+           "  FROM TB_WCAM_CTLR_STTS A,                                     \r\n"
+           "       TB_WCAM_CTLR      B                                      \r\n"
+           " WHERE A.WCAM_CTLR_NMBR = B.WCAM_CTLR_NMBR                      \r\n"
+           "   AND A.UPDT_DT >= TO_CHAR(SYSDATE-2/1440, 'YYYYMMDDHH24MISS') \r\n";
+
+    FLists.Lock();
+    try
+    {
+        FOR_STL(TWCamCtlr*, pTmp, FLists)
+        {
+            pTmp->STATE.Comm = wcam_error;
+        }
+        TWCamCtlr *pObj = 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->Prepared = true;
+            pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                String WCAM_CTLR_NMBR = pADO->FieldByName("WCAM_CTLR_NMBR")->AsString;
+                pObj = FLists.Find(WCAM_CTLR_NMBR);
+                if (!pObj) continue;
+
+                String UPDT_DT      = pADO->FieldByName("UPDT_DT")->AsString;
+                String CMNC_STTS_CD = pADO->FieldByName("CMNC_STTS_CD")->AsString;
+                if (CMNC_STTS_CD != "CMS0")
+                {
+                    //Åë½ÅÀå¾Ö
+                    continue;
+                }
+                pObj->STATE.Comm = (CMNC_STTS_CD == "CMS0") ? wcam_normal : wcam_error;
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TWCamCtlrManager::LoadStatusFromDb", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TWCamCtlrManager::LoadStatusFromDb", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TWCamCtlrManager::DeleteWCam(TWCamCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "UPDATE TB_WCAM_CTLR          \r\n"
+           "   SET DEL_YN = 'Y'          \r\n"
+           " WHERE WCAM_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->WCAM_CTLR_NMBR;
+			pADO->ExecSQL();
+
+        sQry = "DELETE TB_FCLT_INFR      \r\n"
+               " WHERE FCLT_ID = :p01    \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->WCAM_CTLR_ID;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TWCamCtlrManager::DeleteWCam", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TWCamCtlrManager::DeleteWCam", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TWCamCtlrManager::InsertWCam(TWCamCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    return MergeWCam(AObj, ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TWCamCtlrManager::UpdateWCam(TWCamCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    return MergeWCam(AObj, ADbConn);
+}
+//---------------------------------------------------------------------------
+
+bool TWCamCtlrManager::MergeWCam(TWCamCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "MERGE INTO TB_WCAM_CTLR L                                   \r\n"
+           "USING (SELECT :p01 AS WCAM_CTLR_NMBR,                       \r\n"
+           "              :p02 AS WCAM_CTLR_ID,                         \r\n"
+           "              :p03 AS WCAM_NM,                              \r\n"
+           "              :p04 AS WCAM_CTLR_IP,                         \r\n"
+           "              :p05 AS WCAM_CTLR_PORT,                       \r\n"
+           "              :p06 AS WCAM_CTLR_LOCAL_NO,                   \r\n"
+           "              :p07 AS WCAM_TYPE_CD,                         \r\n"
+           "              :p08 AS ISTL_LCTN_NM,                         \r\n"
+           "              :p09 AS X_CRDN,                               \r\n"
+           "              :p10 AS Y_CRDN,                               \r\n"
+           "              :p11 AS DEL_YN,                               \r\n"
+           "              :p12 AS STRM_SVR_IP,                          \r\n"
+           "              :p13 AS STRM_SVR_PORT,                        \r\n"
+           "              :p14 AS STRM_SESN_NM,                         \r\n"
+           "              :p15 AS STRM_RTSP_ADDR,                       \r\n"
+           "              :p16 AS STRM_RTMP_ADDR,                       \r\n"
+           "              :p17 AS STRM_HTTP_ADDR,                       \r\n"
+           "              :p18 AS STRM_STOR_ADDR,                       \r\n"
+           "              :p19 AS CMRA_PORT,                            \r\n"
+           "              :p20 AS CMRA_ID,                              \r\n"
+           "              :p21 AS CMRA_PSWD,                            \r\n"
+           "              :p22 AS CMRA_CHNL,                            \r\n"
+           "              :p23 AS LINK_ID,                              \r\n"
+           "              :p24 AS ISTL_LCTN_ADDR                        \r\n"
+           "         FROM DUAL) M                                       \r\n"
+           "        ON (L.WCAM_CTLR_NMBR = M.WCAM_CTLR_NMBR)            \r\n"
+           "WHEN MATCHED THEN                                           \r\n"
+           "   UPDATE SET L.WCAM_CTLR_ID        = M.WCAM_CTLR_ID,       \r\n"
+           "              L.WCAM_NM             = M.WCAM_NM,            \r\n"
+           "              L.WCAM_CTLR_IP        = M.WCAM_CTLR_IP,       \r\n"
+           "              L.WCAM_CTLR_PORT      = M.WCAM_CTLR_PORT,     \r\n"
+           "              L.WCAM_CTLR_LOCAL_NO  = M.WCAM_CTLR_LOCAL_NO, \r\n"
+           "              L.WCAM_TYPE_CD        = M.WCAM_TYPE_CD,       \r\n"
+           "              L.ISTL_LCTN_NM        = M.ISTL_LCTN_NM,       \r\n"
+           "              L.X_CRDN              = M.X_CRDN,             \r\n"
+           "              L.Y_CRDN              = M.Y_CRDN,             \r\n"
+           "              L.DEL_YN              = M.DEL_YN,             \r\n"
+           "              L.STRM_SVR_IP         = M.STRM_SVR_IP,        \r\n"
+           "              L.STRM_SVR_PORT       = M.STRM_SVR_PORT,      \r\n"
+           "              L.STRM_SESN_NM        = M.STRM_SESN_NM,       \r\n"
+           "              L.STRM_RTSP_ADDR      = M.STRM_RTSP_ADDR,     \r\n"
+           "              L.STRM_RTMP_ADDR      = M.STRM_RTMP_ADDR,     \r\n"
+           "              L.STRM_HTTP_ADDR      = M.STRM_HTTP_ADDR,     \r\n"
+           "              L.STRM_STOR_ADDR      = M.STRM_STOR_ADDR,     \r\n"
+           "              L.CMRA_PORT           = M.CMRA_PORT,          \r\n"
+           "              L.CMRA_ID             = M.CMRA_ID,            \r\n"
+           "              L.CMRA_PSWD           = M.CMRA_PSWD,          \r\n"
+           "              L.CMRA_CHNL           = M.CMRA_CHNL,          \r\n"
+           "              L.LINK_ID             = M.LINK_ID,            \r\n"
+           "              L.ISTL_LCTN_ADDR      = M.ISTL_LCTN_ADDR      \r\n"
+           "WHEN NOT MATCHED THEN                                       \r\n"
+           "   INSERT (WCAM_CTLR_NMBR,                                  \r\n"
+           "           WCAM_CTLR_ID,                                    \r\n"
+           "           WCAM_NM,                                         \r\n"
+           "           WCAM_CTLR_IP,                                    \r\n"
+           "           WCAM_CTLR_PORT,                                  \r\n"
+           "           WCAM_CTLR_LOCAL_NO,                              \r\n"
+           "           WCAM_TYPE_CD,                                    \r\n"
+           "           ISTL_LCTN_NM,                                    \r\n"
+           "           X_CRDN,                                          \r\n"
+           "           Y_CRDN,                                          \r\n"
+           "           DEL_YN,                                          \r\n"
+           "           STRM_SVR_IP,                                     \r\n"
+           "           STRM_SVR_PORT,                                   \r\n"
+           "           STRM_SESN_NM,                                    \r\n"
+           "           STRM_RTSP_ADDR,                                  \r\n"
+           "           STRM_RTMP_ADDR,                                  \r\n"
+           "           STRM_HTTP_ADDR,                                  \r\n"
+           "           STRM_STOR_ADDR,                                  \r\n"
+           "           CMRA_PORT,                                       \r\n"
+           "           CMRA_ID,                                         \r\n"
+           "           CMRA_PSWD,                                       \r\n"
+           "           CMRA_CHNL,                                       \r\n"
+           "           LINK_ID,                                         \r\n"
+           "           ISTL_LCTN_ADDR )                                 \r\n"
+           "   VALUES (M.WCAM_CTLR_NMBR,                                \r\n"
+           "           M.WCAM_CTLR_ID,                                  \r\n"
+           "           M.WCAM_NM,                                       \r\n"
+           "           M.WCAM_CTLR_IP,                                  \r\n"
+           "           M.WCAM_CTLR_PORT,                                \r\n"
+           "           M.WCAM_CTLR_LOCAL_NO,                            \r\n"
+           "           M.WCAM_TYPE_CD,                                  \r\n"
+           "           M.ISTL_LCTN_NM,                                  \r\n"
+           "           M.X_CRDN,                                        \r\n"
+           "           M.Y_CRDN,                                        \r\n"
+           "           M.DEL_YN,                                        \r\n"
+           "           M.STRM_SVR_IP,                                   \r\n"
+           "           M.STRM_SVR_PORT,                                 \r\n"
+           "           M.STRM_SESN_NM,                                  \r\n"
+           "           M.STRM_RTSP_ADDR,                                \r\n"
+           "           M.STRM_RTMP_ADDR,                                \r\n"
+           "           M.STRM_HTTP_ADDR,                                \r\n"
+           "           M.STRM_STOR_ADDR,                                \r\n"
+           "           M.CMRA_PORT,                                     \r\n"
+           "           M.CMRA_ID,                                       \r\n"
+           "           M.CMRA_PSWD,                                     \r\n"
+           "           M.CMRA_CHNL,                                     \r\n"
+           "           M.LINK_ID,                                       \r\n"
+           "           M.ISTL_LCTN_ADDR )                               \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->WCAM_CTLR_NMBR;
+            pADO->Parameters->ParamByName("p02")->Value = AObj->WCAM_CTLR_ID;
+            pADO->Parameters->ParamByName("p03")->Value = AObj->WCAM_NM;
+            pADO->Parameters->ParamByName("p04")->Value = AObj->WCAM_CTLR_IP;
+            pADO->Parameters->ParamByName("p05")->Value = AObj->WCAM_CTLR_PORT;
+            pADO->Parameters->ParamByName("p06")->Value = AObj->WCAM_CTLR_LOCAL_NO;
+            pADO->Parameters->ParamByName("p07")->Value = AObj->WCAM_TYPE_CD;
+            pADO->Parameters->ParamByName("p08")->Value = AObj->ISTL_LCTN_NM;
+            pADO->Parameters->ParamByName("p09")->Value = AObj->X_CRDN;
+            pADO->Parameters->ParamByName("p10")->Value = AObj->Y_CRDN;
+            pADO->Parameters->ParamByName("p11")->Value = AObj->DEL_YN;
+            pADO->Parameters->ParamByName("p12")->Value = AObj->STRM_SVR_IP;
+            pADO->Parameters->ParamByName("p13")->Value = AObj->STRM_SVR_PORT;
+            pADO->Parameters->ParamByName("p14")->Value = AObj->STRM_SESN_NM;
+            pADO->Parameters->ParamByName("p15")->Value = AObj->STRM_RTSP_ADDR;
+            pADO->Parameters->ParamByName("p16")->Value = AObj->STRM_RTMP_ADDR;
+            pADO->Parameters->ParamByName("p17")->Value = AObj->STRM_HTTP_ADDR;
+            pADO->Parameters->ParamByName("p18")->Value = AObj->STRM_STOR_ADDR;
+            pADO->Parameters->ParamByName("p19")->Value = AObj->CMRA_PORT;
+            pADO->Parameters->ParamByName("p20")->Value = AObj->CMRA_ID;
+            pADO->Parameters->ParamByName("p21")->Value = AObj->CMRA_PSWD;
+            pADO->Parameters->ParamByName("p22")->Value = AObj->CMRA_CHNL;
+            pADO->Parameters->ParamByName("p23")->Value = AObj->LINK_ID;
+            pADO->Parameters->ParamByName("p24")->Value = AObj->ISTL_LCTN_ADDR;
+
+			pADO->ExecSQL();
+
+            return MergeFcltInfo(AObj, ADbConn);
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TWCamCtlrManager::MergeWCam", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TWCamCtlrManager::MergeWCam", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TWCamCtlrManager::MergeFcltInfo(TWCamCtlr *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->WCAM_CTLR_ID;
+			pADO->Parameters->ParamByName("p02")->Value = "WCAM";
+			pADO->Parameters->ParamByName("p03")->Value = AObj->WCAM_NM;
+			pADO->ExecSQL();
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TWCamCtlrManager::MergeFcltInfo", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TWCamCtlrManager::MergeFcltInfo", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TWCamCtlrManager::GetNextWCamId(int &ANmbr, int &AId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "SELECT NVL(MAX(WCAM_CTLR_NMBR), 10000) + 1 AS NEWID FROM TB_WCAM_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->Prepared = true;
+			pADO->Open();
+            ANmbr = pADO->FieldByName("NEWID")->AsInteger;
+            AId = ANmbr / 10000;
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TWCamCtlrManager::GetNextWCamId", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TWCamCtlrManager::GetNextWCamId", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+    return false;
+}
+//---------------------------------------------------------------------------
+
+bool TWCamCtlrManager::LoadPreSet(TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    FLists.Lock();
+    try
+    {
+        FOR_STL(TWCamCtlr*, pObj, FLists)
+        {
+            pObj->FLists.RemoveAll();
+        }
+    }
+    __finally
+    {
+        FLists.UnLock();
+    }
+
+    sQry = "SELECT B.*                                 \r\n"
+           "  FROM TB_WCAM_CTLR A,                     \r\n"
+           "       TB_WCAM_PSET B                      \r\n"
+           " WHERE A.WCAM_CTLR_NMBR = B.WCAM_CTLR_NMBR \r\n"
+           " ORDER BY B.WCAM_CTLR_NMBR, B.PSET_NMBR    \r\n";
+    try
+    {
+        String WCAM_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->Prepared = true;
+			pADO->Open();
+            for( ; !pADO->Eof; pADO->Next())
+            {
+                WCAM_CTLR_NMBR = pADO->FieldByName("WCAM_CTLR_NMBR")->AsString;
+				TWCamCtlr *pWCam = FLists.Find(String(WCAM_CTLR_NMBR));
+                if (!pWCam) continue;
+
+                TWCamPset *pObj = new TWCamPset();
+                if (pObj)
+                {
+                    pObj->WCAM_CTLR_NMBR = WCAM_CTLR_NMBR;
+                    pObj->PSET_NMBR      = pADO->FieldByName("PSET_NMBR")->AsInteger;
+                    pObj->PSET_NM        = pADO->FieldByName("PSET_NM")->AsString;
+                    pObj->PAN            = pADO->FieldByName("PAN")->AsInteger;
+                    pObj->TILT           = pADO->FieldByName("TILT")->AsInteger;
+                    pObj->ZOOM           = pADO->FieldByName("ZOOM")->AsInteger;
+                    pObj->FOCS           = pADO->FieldByName("FOCS")->AsInteger;
+                    pObj->ANGLE          = pADO->FieldByName("ANGLE")->AsInteger;
+                    pObj->DFLT_YN        = pADO->FieldByName("DFLT_YN")->AsString;
+
+                    pObj->DEL_YN         = "N";
+
+                    pWCam->FLists.Push(pObj->PSET_NMBR, pObj);
+                }
+            }
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORMSG("TWCamCtlrManager::LoadPreSet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORMSG("TWCamCtlrManager::LoadPreSet", 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 TWCamCtlrManager::SavePreSet(TWCamCtlr *AObj, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+    sQry = "DELETE FROM TB_WCAM_PSET WHERE WCAM_CTLR_NMBR = :p01";
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+			pADO->Parameters->ParamByName("p01")->Value = AObj->WCAM_CTLR_NMBR;
+			pADO->ExecSQL();
+
+    sQry = "INSERT INTO TB_WCAM_PSET (  \r\n"
+           "            WCAM_CTLR_NMBR, \r\n"
+           "            PSET_NMBR,      \r\n"
+           "            PSET_NM,        \r\n"
+           "            PAN,            \r\n"
+           "            TILT,           \r\n"
+           "            ZOOM,           \r\n"
+           "            FOCS,           \r\n"
+           "            ANGLE,          \r\n"
+           "            DFLT_YN         \r\n"
+           "   ) VALUES (               \r\n"
+           "           :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"
+           "      )                     \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            FOR_STL(TWCamPset *, pObj, AObj->FLists)
+            {
+                if (pObj->DEL_YN != "N") continue;
+
+                pADO->Parameters->ParamByName("p01")->Value = pObj->WCAM_CTLR_NMBR;
+                pADO->Parameters->ParamByName("p02")->Value = pObj->PSET_NMBR;
+                pADO->Parameters->ParamByName("p03")->Value = pObj->PSET_NM;
+                pADO->Parameters->ParamByName("p04")->Value = pObj->PAN;
+                pADO->Parameters->ParamByName("p05")->Value = pObj->TILT;
+                pADO->Parameters->ParamByName("p06")->Value = pObj->ZOOM;
+                pADO->Parameters->ParamByName("p07")->Value = pObj->FOCS;
+                pADO->Parameters->ParamByName("p08")->Value = pObj->ANGLE;
+                pADO->Parameters->ParamByName("p09")->Value = pObj->DFLT_YN;
+
+    			pADO->ExecSQL();
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TWCamCtlrManager::SavePreSet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TWCamCtlrManager::SavePreSet", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TWCamCtlrManager::DeletePreSet(TWCamCtlr *AObj, int APsetNmbr, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    TWCamPset* pObj = AObj->FLists.Find(APsetNmbr);
+    if (!pObj) return false;
+
+    sQry = "DELETE FROM TB_WCAM_PSET WHERE WCAM_CTLR_NMBR = :p01 AND PSET_NMBR = :p02";
+
+    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->WCAM_CTLR_NMBR;
+			pADO->Parameters->ParamByName("p02")->Value = APsetNmbr;
+
+			pADO->ExecSQL();
+
+            pObj->DEL_YN = "Y";
+
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TWCamCtlrManager::DeletePreSet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TWCamCtlrManager::DeletePreSet", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TWCamCtlrManager::MergePreSet(TWCamCtlr *AObj, TWCamPset* APset, TADOConnection *ADbConn/*=NULL*/)
+{
+    String sQry;
+    TADOQuery *pADO = NULL;
+
+    try
+    {
+        try
+        {
+            pADO = new TADOQuery(NULL);
+			pADO->Close();
+            pADO->Connection = (NULL != ADbConn) ? ADbConn : ITSDb_GetConnection();
+
+    sQry = "MERGE INTO TB_WCAM_PSET L                           \r\n"
+           "USING (SELECT :p01 AS WCAM_CTLR_NMBR,               \r\n"
+           "              :p02 AS PSET_NMBR,                    \r\n"
+           "              :p03 AS PSET_NM,                      \r\n"
+           "              :p04 AS PAN,                          \r\n"
+           "              :p05 AS TILT,                         \r\n"
+           "              :p06 AS ZOOM,                         \r\n"
+           "              :p07 AS FOCS,                         \r\n"
+           "              :p08 AS ANGLE,                        \r\n"
+           "              :p09 AS DFLT_YN                       \r\n"
+           "         FROM DUAL) M                               \r\n"
+           "        ON (L.WCAM_CTLR_NMBR = M.WCAM_CTLR_NMBR)    \r\n"
+           "WHEN MATCHED THEN                                   \r\n"
+           "   UPDATE SET L.PSET_NMBR   = M.PSET_NMBR,          \r\n"
+           "              L.PSET_NM     = M.PSET_NM,            \r\n"
+           "              L.PAN         = M.PAN,                \r\n"
+           "              L.TILT        = M.TILT,               \r\n"
+           "              L.ZOOM        = M.ZOOM,               \r\n"
+           "              L.FOCS        = M.FOCS,               \r\n"
+           "              L.ANGLE       = M.ANGLE,              \r\n"
+           "              L.DFLT_YN     = M.DFLT_YN             \r\n"
+           "WHEN NOT MATCHED THEN                               \r\n"
+           "   INSERT (WCAM_CTLR_NMBR,                          \r\n"
+           "           PSET_NMBR,                               \r\n"
+           "           PSET_NM,                                 \r\n"
+           "           PAN,                                     \r\n"
+           "           TILT,                                    \r\n"
+           "           ZOOM,                                    \r\n"
+           "           FOCS,                                    \r\n"
+           "           ANGLE,                                   \r\n"
+           "           DFLT_YN )                                \r\n"
+           "   VALUES (M.WCAM_CTLR_NMBR,                        \r\n"
+           "           M.PSET_NMBR,                             \r\n"
+           "           M.PSET_NM,                               \r\n"
+           "           M.PAN,                                   \r\n"
+           "           M.TILT,                                  \r\n"
+           "           M.ZOOM,                                  \r\n"
+           "           M.FOCS,                                  \r\n"
+           "           M.ANGLE,                                 \r\n"
+           "           M.DFLT_YN )                              \r\n";
+
+			pADO->SQL->Clear();
+			pADO->SQL->Text = sQry;
+            FOR_STL(TWCamPset *, pObj, AObj->FLists)
+            {
+                if (pObj->DEL_YN != "N") continue;
+
+                pADO->Parameters->ParamByName("p01")->Value = APset->WCAM_CTLR_NMBR;
+                pADO->Parameters->ParamByName("p02")->Value = APset->PSET_NMBR;
+                pADO->Parameters->ParamByName("p03")->Value = APset->PSET_NM;
+                pADO->Parameters->ParamByName("p04")->Value = APset->PAN;
+                pADO->Parameters->ParamByName("p05")->Value = APset->TILT;
+                pADO->Parameters->ParamByName("p06")->Value = APset->ZOOM;
+                pADO->Parameters->ParamByName("p07")->Value = APset->FOCS;
+                pADO->Parameters->ParamByName("p08")->Value = APset->ANGLE;
+                pADO->Parameters->ParamByName("p09")->Value = APset->DFLT_YN;
+
+    			pADO->ExecSQL();
+
+                TWCamPset* pObj = AObj->FLists.Find(APset->PSET_NMBR);
+                if (pObj)
+                {
+                    pObj->WCAM_CTLR_NMBR = APset->WCAM_CTLR_NMBR;
+                    pObj->PSET_NMBR      = APset->PSET_NMBR;
+                    pObj->PSET_NM        = APset->PSET_NM;
+                    pObj->PAN            = APset->PAN;
+                    pObj->TILT           = APset->TILT;
+                    pObj->ZOOM           = APset->ZOOM;
+                    pObj->FOCS           = APset->FOCS;
+                    pObj->ANGLE          = APset->ANGLE;
+                    pObj->DFLT_YN        = APset->DFLT_YN;
+                }
+                else
+                {
+                    AObj->FLists.Push(APset->PSET_NMBR, APset);
+                }
+            }
+            return true;
+        }
+        catch(EDatabaseError &E)
+        {
+            DBERRORLOG("TWCamCtlrManager::SavePreSet", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TWCamCtlrManager::SavePreSet", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+
+bool TWCamCtlrManager::InsWCamControlHs(String ACtlDt, String ACctvNmbr, String ACtlType, String ACtlVal, String ACtlRes, String AUserId, TADOConnection *ADbConn/*=NULL*/)
+{
+    String     sQry;
+    TADOQuery *pADO = NULL;
+
+    sQry = "INSERT INTO TB_WCAM_CTRL_HS(               \r\n"
+           "                          CTRL_DT,         \r\n"
+           "                          WCAM_CTLR_NMBR,  \r\n"
+           "                          CTRL_TYPE,       \r\n"
+           "                          CTRL_VAL,        \r\n"
+           "                          CTRL_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 = ACctvNmbr;
+            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("TWCamCtlrManager::InsWCamControlHs", String(E.ClassName()), E.Message, sQry);
+            throw Exception(String(E.ClassName()) + E.Message);
+        }
+        catch(Exception &e)
+        {
+            DBERRORLOG("TWCamCtlrManager::InsWCamControlHs", String(e.ClassName()), e.Message, sQry);
+            throw Exception(String(e.ClassName()) + e.Message);
+        }
+    }
+    __finally
+    {
+        if (pADO)
+        {
+            pADO->Close();
+            delete pADO;
+        }
+    }
+
+    return true;
+}
+//---------------------------------------------------------------------------
+

+ 128 - 0
COMMON/CDS/CDSWCamCtlrF.h

@@ -0,0 +1,128 @@
+//---------------------------------------------------------------------------
+
+#ifndef CDSWCamCtlrFH
+#define CDSWCamCtlrFH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <stdio.h>
+#include <ADODB.hpp>
+#include <DB.hpp>
+#include "ITSLibF.h"
+#include "ITSDbF.h"
+#include "CDSObjectF.h"
+//---------------------------------------------------------------------------
+#include "CenterCommF.h"
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+
+class TWCamPset
+{
+public:
+    TWCamPset()
+    {
+        PSET_NMBR = 1;
+        PSET_NM   = "";
+        PAN       = 0;
+        TILT      = 0;
+        ZOOM      = 0;
+        FOCS      = 0;
+        ANGLE     = 0;
+        DFLT_YN   = "N";
+    };
+    ~TWCamPset() {};
+
+private:
+
+public:
+    String  WCAM_CTLR_NMBR;     //	N	NUMBER(10)	    N			CCTV 제어기 번호
+    int     PSET_NMBR;          //	N	NUMBER(4)	    N			프리셋 번호
+    String  PSET_NM;            //	N	VARCHAR2(100)	N			프리셋 명
+    int     PAN;                //	N	NUMBER(4)	    Y	0		팬 값
+    int     TILT;               //	N	NUMBER(4)	    Y	0		틸트 값
+    int     ZOOM;               //	N	NUMBER(4)	    Y	0		줌 값
+    int     FOCS;               //	N	NUMBER(4)	    Y	0		포커스 값
+    int     ANGLE;              //	N	NUMBER(4)	    Y	0		각도
+    String  DFLT_YN;            //	N	CHAR(1)	        Y	'N'		디폴트 여부
+
+public:
+    String  DEL_YN;
+
+};
+
+class TWCamCtlr : public TCDSObject
+{
+public:
+    TWCamCtlr();
+    ~TWCamCtlr();
+
+public:
+    String  STRM_SVR_IP;        //	N	VARCHAR2(20)	Y			스트리밍 서버 아이피
+    String  STRM_SVR_PORT;      //	N	VARCHAR2(5)	    Y			스트리밍 서버 포트
+    String  STRM_SESN_NM;       //	N	VARCHAR2(200)	Y			스트리밍 세션 명
+    String  STRM_RTSP_ADDR;     //	N	VARCHAR2(200)	Y			스트리밍 RTSP 주소
+    String  STRM_RTMP_ADDR;     //	N	VARCHAR2(200)	Y			스트리밍 RTMP 주소
+    String  STRM_HTTP_ADDR;     //	N	VARCHAR2(200)	Y			스트리밍 HTTP 주소
+    String  STRM_STOR_ADDR;     //	N	VARCHAR2(200)	Y			스트리밍 저장 주소
+    int     CMRA_PORT;          //	N	NUMBER(5)	    Y	1852	웹카메라 제어 포트
+    String  CMRA_ID;            //	N	VARCHAR2(20)	Y	'root'	웹카메라 제어 ID
+    String  CMRA_PSWD;          //	N	VARCHAR2(20)	Y	'1234'	웹카메라 제어 PSWD
+    int     CMRA_CHNL;          //	N	NUMBER(5)	    Y	1		웹카메라제어 CHANNEL
+    String  LINK_ID;            //	N	NUMBER(10)	    Y			링크ID
+    String  FULL_STRM_ADDR;
+    String  WCAM_TYPE_NM;
+
+public:
+    INT_WCAM_STATE  STATE;
+
+    TItsMap<int, TWCamPset*> FLists;
+
+public:
+    __property String  WCAM_CTLR_NMBR     = { read = CTLR_NMBR,     write = CTLR_NMBR     };
+    __property String  WCAM_CTLR_ID       = { read = CTLR_ID,       write = CTLR_ID       };
+    __property String  WCAM_NM            = { read = NAME,          write = NAME          };
+    __property String  WCAM_CTLR_IP       = { read = CTLR_IP,       write = CTLR_IP       };
+    __property int     WCAM_CTLR_PORT     = { read = CTLR_PORT,     write = CTLR_PORT     };
+    __property int     WCAM_CTLR_LOCAL_NO = { read = CTLR_LOCAL_NO, write = CTLR_LOCAL_NO };
+    __property String  WCAM_TYPE_CD       = { read = TYPE_CD,       write = TYPE_CD       };
+
+};
+//---------------------------------------------------------------------------
+typedef std::map<String, TWCamCtlr*>::iterator   WCamIterator;
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+class TWCamCtlrManager
+{
+public:
+    TWCamCtlrManager();
+    ~TWCamCtlrManager();
+
+private:
+	TStream *FImgStream;
+
+public:
+    TItsMap<String, TWCamCtlr*> FLists;
+
+public:
+    bool LoadFromDb(TADOConnection *ADbConn=NULL);
+    bool LoadStatusFromDb(TADOConnection *ADbConn=NULL);
+    bool DeleteWCam(TWCamCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool InsertWCam(TWCamCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool UpdateWCam(TWCamCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeWCam(TWCamCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool MergeFcltInfo(TWCamCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool GetNextWCamId(int &ANmbr, int &AId, TADOConnection *ADbConn=NULL);
+
+    bool LoadPreSet(TADOConnection *ADbConn=NULL);
+    bool SavePreSet(TWCamCtlr *AObj, TADOConnection *ADbConn=NULL);
+    bool DeletePreSet(TWCamCtlr *AObj, int APsetNmbr, TADOConnection *ADbConn=NULL);
+    bool MergePreSet(TWCamCtlr *AObj, TWCamPset* APset, TADOConnection *ADbConn=NULL);
+
+    bool InsWCamControlHs(String ACtlDt, String ACctvNmbr, String ACtlType, String ACtlVal, String ACtlRes, String AUserId, TADOConnection *ADbConn=NULL);
+};
+//---------------------------------------------------------------------------
+extern TWCamCtlrManager *WCamCtlrManager;
+//---------------------------------------------------------------------------
+
+#endif

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