CDSManagerF.cpp 111 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286
  1. //---------------------------------------------------------------------------
  2. #pragma hdrstop
  3. #include "CDSManagerF.h"
  4. #include "CDSCtlrF.h"
  5. #include "CDSIfscF.h"
  6. #include "CDSFormF.h"
  7. #include "CDSImageF.h"
  8. #include "CDSAtmpF.h"
  9. #include "CDSParkF.h"
  10. #include "VmsUtilsF.h"
  11. #include "VMSCommLibF.h"
  12. //---------------------------------------------------------------------------
  13. #pragma package(smart_init)
  14. //---------------------------------------------------------------------------
  15. TCDSManager *CDSManager = NULL;
  16. //---------------------------------------------------------------------------
  17. TCDSManager::TCDSManager()
  18. {
  19. FIsStaticCycle = false;
  20. }
  21. //---------------------------------------------------------------------------
  22. TCDSManager::~TCDSManager()
  23. {
  24. }
  25. //---------------------------------------------------------------------------
  26. int TCDSManager::ClearVmsProvideMode()
  27. {
  28. int nSelCnt= 0;
  29. DDBSTART;
  30. FFormDsplDt = Now().FormatString("yyyymmddhhnnss");
  31. CtlrItr it;
  32. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  33. {
  34. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  35. if (pObj->Server.useFlag != use_enable) continue;
  36. if (!pObj->FProvide) continue;
  37. pObj->CTRLMODE->MaxDisplayForm = 0;//pObj->VMS_MAX_PHSE_NUM; //0
  38. pObj->CTRLMODE->Enable = object_disable;
  39. pObj->CTRLMODE->SvcDate = FFormDsplDt;
  40. pObj->CTRLMODE->SaveFlag = -1;
  41. pObj->CTRLMODE->pTimer = Now();
  42. pObj->CTRLMODE->Result = false;
  43. pObj->InitSchedule(); //스케줄정보
  44. pObj->InitIncident(); //돌발정보
  45. pObj->InitEvent(); //이벤트(공사/행사)정보
  46. pObj->FExistCngsForm = false; //정체폼이 없는것으로 초기화
  47. pObj->pForms->Clear();
  48. nSelCnt++;
  49. }
  50. IDBSTOP(nSelCnt);
  51. return nSelCnt;
  52. }
  53. //---------------------------------------------------------------------------
  54. int TCDSManager::LoadVmsEventOccrInf(TADOConnection *ADbConn)
  55. {
  56. AnsiString sQry;
  57. int nSelCnt = 0;
  58. TADOQuery *pADO = NULL;
  59. DDBSTART;
  60. sQry = "SELECT V.VMS_CTLR_NMBR, V.LINK_ID, V.IFSC_ID, V.VMS_IFSC_ID, \r\n"
  61. " V.VMS_IFSC_NM, V.DSPL_STRT_NODE_NM, V.DSPL_END_NODE_NM, \r\n"
  62. " V.DETR_ID, V.DSPL_PRRT, I.INCD_OCRR_ID, I.STRT_LCTN_NM, \r\n"
  63. " V.ROAD_NM, V.SPOT_NM, \r\n"
  64. " I.END_LCTN_NM, I.OCRR_LCTN_NM, I.INCD_TITL, \r\n"
  65. " (SELECT CMMN_CD_KOR_NM \r\n"
  66. " FROM TB_CMMN_CD \r\n"
  67. " WHERE CMMN_CD = I.VMS_INCD_TYPE_CD \r\n"
  68. " AND CMMN_CLSF_CD = 'VIT') AS VMS_INCD_TYPE_NM, \r\n"
  69. " I.VMS_INCD_TYPE_CD, \r\n"
  70. " CASE WHEN I.VMS_INCD_TYPE_CD = 'VIT1' THEN \r\n"
  71. " (SELECT CMMN_CD_KOR_NM \r\n"
  72. " FROM TB_CMMN_CD \r\n"
  73. " WHERE CMMN_CD = I.VMS_INCD_DETL_TYPE_CD \r\n"
  74. " AND CMMN_CLSF_CD = 'IDT') \r\n"
  75. " ELSE \r\n"
  76. " (SELECT CMMN_CD_KOR_NM \r\n"
  77. " FROM TB_CMMN_CD \r\n"
  78. " WHERE CMMN_CD = I.VMS_INCD_DETL_TYPE_CD \r\n"
  79. " AND CMMN_CLSF_CD = 'EDT') \r\n"
  80. " END AS VMS_INCD_DETL_NM, \r\n"
  81. " I.VMS_INCD_DETL_TYPE_CD, \r\n"
  82. " (SELECT CMMN_CD_KOR_NM \r\n"
  83. " FROM TB_CMMN_CD \r\n"
  84. " WHERE CMMN_CD = I.CMTR_GRAD_CD \r\n"
  85. " AND CMMN_CLSF_CD = 'LTC') AS CMTR_GRAD_NM, \r\n"
  86. " I.VMS_INCD_RSTR_TYPE_CD, \r\n"
  87. " (SELECT CMMN_CD_KOR_NM \r\n"
  88. " FROM TB_CMMN_CD \r\n"
  89. " WHERE CMMN_CD = I.VMS_INCD_RSTR_TYPE_CD \r\n"
  90. " AND CMMN_CLSF_CD = 'VRT') AS VMS_INCD_RSTR_TYPE_NM, \r\n"
  91. " I.CMTR_GRAD_CD, \r\n"
  92. " I.INCD_CLSR_LANE, \r\n"
  93. " I.INCD_STRT_DT, \r\n"
  94. " I.INCD_END_PRAR_DT \r\n"
  95. " FROM (SELECT D.VMS_CTLR_NMBR, A.LINK_ID, \r\n"
  96. " A.IFSC_ID, B.VMS_IFSC_ID, \r\n"
  97. " C.VMS_IFSC_NM, \r\n"
  98. " C.DSPL_STRT_NODE_NM, \r\n"
  99. " C.DSPL_END_NODE_NM, \r\n"
  100. " NVL(C.DETR_ID, 0) AS DETR_ID, \r\n"
  101. " C.ROAD_NM, C.SPOT_NM, \r\n"
  102. " D.DSPL_PRRT \r\n"
  103. " FROM TB_IFSC_RLTN_LINK A, \r\n"
  104. " TB_VMS_IFSC_RLTN_IFSC B, \r\n"
  105. " TB_VMS_IFSC C, \r\n"
  106. " TB_VMS_RLTN_IFSC D \r\n"
  107. " WHERE A.IFSC_ID = B.IFSC_ID \r\n"
  108. " AND B.VMS_IFSC_ID = C.VMS_IFSC_ID \r\n"
  109. " AND C.VMS_IFSC_ID = D.VMS_IFSC_ID ) V, \r\n"
  110. " (SELECT A.*, B.INCD_TITL \r\n"
  111. " FROM TB_INCD_OCRR_VMS A, \r\n"
  112. " TB_INCD_OCRR B \r\n"
  113. " WHERE A.INCD_PRGR_STEP_CD = 'ISS2' \r\n"
  114. " AND A.VMS_DSPL_YN = 'Y' \r\n"
  115. " AND A.INCD_OCRR_ID = B.INCD_OCRR_ID \r\n"
  116. " AND A.INCD_END_PRAR_DT > TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') \r\n"
  117. " AND A.VMS_INCD_TYPE_CD IN ('VIT1', 'VIT2') ) I \r\n"
  118. " WHERE V.LINK_ID = I.LINK_ID \r\n"
  119. " ORDER BY V.VMS_CTLR_NMBR \r\n";
  120. try
  121. {
  122. pADO = new TADOQuery(NULL);
  123. pADO->Connection = ADbConn;
  124. try
  125. {
  126. SQLText(pADO, sQry, false);
  127. SQLOpen(pADO);
  128. int nIdx;
  129. for( ; !pADO->Eof; pADO->Next())
  130. {
  131. AnsiString sVmsNmbr = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
  132. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(sVmsNmbr);
  133. if (!pObj) continue;
  134. if (!pObj->FProvide) continue;
  135. AnsiString VMS_INCD_TYPE_CD = pADO->FieldByName("VMS_INCD_TYPE_CD")->AsString;
  136. AnsiString INCD_OCRR_ID = pADO->FieldByName("INCD_OCRR_ID")->AsString;
  137. VMS_EVENT_INFO *pEvt;
  138. if (VMS_INCD_TYPE_CD == "VIT1")
  139. {
  140. //사고
  141. if (pObj->INCIDENT->Count >= VMS_MAX_EVENT)
  142. {
  143. MERROR("VMS Incident Over: %s, %d", pObj->CTLR_NMBR.c_str(), pObj->INCIDENT->Count);
  144. continue;
  145. }
  146. bool bDup = false;
  147. for (int ii = 0; ii < pObj->INCIDENT->Count; ii++)
  148. {
  149. if (INCD_OCRR_ID == pObj->INCIDENT->Unit[ii].INCD_OCRR_ID)
  150. {
  151. bDup = true;
  152. break;
  153. }
  154. }
  155. if (bDup)
  156. {
  157. MERROR("VMS Incident dup: %s, %s", pObj->CTLR_NMBR.c_str(), INCD_OCRR_ID.c_str());
  158. continue;
  159. }
  160. nIdx = pObj->INCIDENT->Count;
  161. pEvt = pObj->INCIDENT;
  162. }
  163. else
  164. {
  165. //공사/행사
  166. if (pObj->EVENT->Count >= VMS_MAX_EVENT)
  167. {
  168. MERROR("VMS Event Over: %s, %d", pObj->CTLR_NMBR.c_str(), pObj->EVENT->Count);
  169. continue;
  170. }
  171. bool bDup = false;
  172. for (int ii = 0; ii < pObj->EVENT->Count; ii++)
  173. {
  174. if (INCD_OCRR_ID == pObj->EVENT->Unit[ii].INCD_OCRR_ID)
  175. {
  176. bDup = true;
  177. break;
  178. }
  179. }
  180. if (bDup)
  181. {
  182. MERROR("VMS Event dup: %s, %s", pObj->CTLR_NMBR.c_str(), INCD_OCRR_ID.c_str());
  183. continue;
  184. }
  185. nIdx = pObj->EVENT->Count;
  186. pEvt = pObj->EVENT;
  187. }
  188. pEvt->Unit[nIdx].LINK_ID = pADO->FieldByName("LINK_ID")->AsString;
  189. pEvt->Unit[nIdx].IFSC_ID = pADO->FieldByName("IFSC_ID")->AsString;
  190. pEvt->Unit[nIdx].VMS_IFSC_ID = pADO->FieldByName("VMS_IFSC_ID")->AsString;
  191. pEvt->Unit[nIdx].VMS_IFSC_NM = pADO->FieldByName("VMS_IFSC_NM")->AsString;
  192. pEvt->Unit[nIdx].DSPL_STRT_NODE_NM = pADO->FieldByName("DSPL_STRT_NODE_NM")->AsString;
  193. pEvt->Unit[nIdx].DSPL_END_NODE_NM = pADO->FieldByName("DSPL_END_NODE_NM")->AsString;
  194. pEvt->Unit[nIdx].DETR_ID = pADO->FieldByName("DETR_ID")->AsString.Trim();
  195. pEvt->Unit[nIdx].DSPL_PRRT = pADO->FieldByName("DSPL_PRRT")->AsString;
  196. pEvt->Unit[nIdx].INCD_OCRR_ID = INCD_OCRR_ID;
  197. pEvt->Unit[nIdx].STRT_LCTN_NM = pADO->FieldByName("STRT_LCTN_NM")->AsString;
  198. pEvt->Unit[nIdx].END_LCTN_NM = pADO->FieldByName("END_LCTN_NM")->AsString;
  199. if (pEvt->Unit[nIdx].STRT_LCTN_NM == "")
  200. {
  201. pEvt->Unit[nIdx].STRT_LCTN_NM = pEvt->Unit[nIdx].DSPL_STRT_NODE_NM;
  202. }
  203. if (pEvt->Unit[nIdx].END_LCTN_NM == "")
  204. {
  205. pEvt->Unit[nIdx].END_LCTN_NM = pEvt->Unit[nIdx].DSPL_END_NODE_NM;
  206. }
  207. pEvt->Unit[nIdx].OCRR_LCTN_NM = pADO->FieldByName("OCRR_LCTN_NM")->AsString;
  208. pEvt->Unit[nIdx].VMS_INCD_TYPE_NM = pADO->FieldByName("VMS_INCD_TYPE_NM")->AsString;
  209. pEvt->Unit[nIdx].VMS_INCD_TYPE_CD = pADO->FieldByName("VMS_INCD_TYPE_CD")->AsString;
  210. pEvt->Unit[nIdx].VMS_INCD_DETL_NM = pADO->FieldByName("VMS_INCD_DETL_NM")->AsString;
  211. pEvt->Unit[nIdx].VMS_INCD_DETL_TYPE_CD = pADO->FieldByName("VMS_INCD_DETL_TYPE_CD")->AsString;
  212. pEvt->Unit[nIdx].CMTR_GRAD_NM = pADO->FieldByName("CMTR_GRAD_NM")->AsString;
  213. pEvt->Unit[nIdx].CMTR_GRAD_CD = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
  214. pEvt->Unit[nIdx].INCD_CLSR_LANE = pADO->FieldByName("INCD_CLSR_LANE")->AsString;
  215. pEvt->Unit[nIdx].INCD_STRT_DT = pADO->FieldByName("INCD_STRT_DT")->AsString;
  216. pEvt->Unit[nIdx].INCD_END_PRAR_DT = pADO->FieldByName("INCD_END_PRAR_DT")->AsString;
  217. pEvt->Unit[nIdx].ROAD_NM = pADO->FieldByName("ROAD_NM")->AsString;
  218. pEvt->Unit[nIdx].SPOT_NM = pADO->FieldByName("SPOT_NM")->AsString;
  219. pEvt->Unit[nIdx].VMS_INCD_RSTR_TYPE_CD = pADO->FieldByName("VMS_INCD_RSTR_TYPE_CD")->AsString;
  220. pEvt->Unit[nIdx].VMS_INCD_RSTR_TYPE_NM = pADO->FieldByName("VMS_INCD_RSTR_TYPE_NM")->AsString;
  221. pEvt->Unit[nIdx].INCD_TITL = pADO->FieldByName("INCD_TITL")->AsString;
  222. pEvt->Count++;
  223. nSelCnt++;
  224. }
  225. }
  226. catch(EDatabaseError &E)
  227. {
  228. DBERROR(String(E.ClassName()), E.Message, sQry);
  229. return -1;
  230. }
  231. catch(Exception &e)
  232. {
  233. DBERROR(String(e.ClassName()), e.Message, sQry);
  234. return -1;
  235. }
  236. }
  237. __finally
  238. {
  239. SQLFree(pADO);
  240. }
  241. if (0)
  242. {
  243. CtlrItr it;
  244. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  245. {
  246. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  247. if (!pObj->Used) continue;
  248. MDEBUG("VMS Event(I/E): %s, %d/%d EA", pObj->CTLR_NMBR.c_str(), pObj->INCIDENT->Count, pObj->EVENT->Count);
  249. }
  250. }
  251. IDBSTOP(nSelCnt);
  252. return nSelCnt;
  253. }
  254. //---------------------------------------------------------------------------
  255. int TCDSManager::LoadVmsScheduleInfo(TADOConnection *ADbConn)
  256. {
  257. AnsiString sQry;
  258. int nSelCnt = 0;
  259. TADOQuery *pADO = NULL;
  260. DDBSTART;
  261. sQry = "SELECT * \r\n"
  262. " FROM ( \r\n"
  263. " SELECT B.*, \r\n"
  264. " SUBSTR(DECODE(TO_CHAR(SYSDATE, 'D'), '1', B.SCH_WEEK1, \r\n"
  265. " '2', B.SCH_WEEK2, \r\n"
  266. " '3', B.SCH_WEEK3, \r\n"
  267. " '4', B.SCH_WEEK4, \r\n"
  268. " '5', B.SCH_WEEK5, \r\n"
  269. " '6', B.SCH_WEEK6, \r\n"
  270. " B.SCH_WEEK7), \r\n"
  271. " TO_NUMBER(TO_CHAR(SYSDATE, 'HH24'))+1, 1) AS SCH_YN \r\n"
  272. " FROM TB_VMS_CTLR A, \r\n"
  273. " TB_VMS_DSPL_SCH B, \r\n"
  274. " TB_VMS_FORM C \r\n"
  275. " WHERE A.DEL_YN = 'N' \r\n"
  276. " AND B.USE_YN = 'Y' \r\n"
  277. " AND C.VALID_YN = 'Y' \r\n"
  278. " AND A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR \r\n"
  279. " AND A.OPER_MODE = B.VMS_SCH_TYPE \r\n"
  280. " AND B.VMS_FORM_ID = C.VMS_FORM_ID \r\n"
  281. " AND TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') BETWEEN \r\n"
  282. " B.DSPL_STRT_HH AND B.DSPL_END_HH \r\n"
  283. " ) \r\n"
  284. " WHERE SCH_YN = '1' \r\n"
  285. " ORDER BY VMS_CTLR_NMBR ASC, PHASE ASC \r\n";
  286. TCDSForm *pCDSForm;
  287. try
  288. {
  289. pADO = new TADOQuery(NULL);
  290. pADO->Connection = ADbConn;
  291. try
  292. {
  293. SQLText(pADO, sQry, false);
  294. SQLOpen(pADO);
  295. int nIdx;
  296. AnsiString VMS_SCH_TYPE; //VARCHAR2(5) N VMS 스케줄 유형(A:자동,F:고정,B:기본)
  297. int VMS_SCH_FORM_TYPE; //NUMBER(3) N VMS 폼 스케쥴 유형(0:교통,1:돌발,2:공사행사,3:홍보,4:우회,5:정체,6:안전,7:동영상,8:스트리밍영상)
  298. int PHASE; //NUMBER(2) N PHASE
  299. AnsiString VMS_FORM_ID; //NUMBER(5) Y VMS FORM ID
  300. int DSPL_HH; //NUMBER(3) Y 0 표출 시간
  301. AnsiString DSPL_STRT_HH; //VARCHAR2(14) N 표출시작시간
  302. AnsiString DSPL_END_HH; //VARCHAR2(14) N 표출종료시간
  303. AnsiString SYMB_LIB_NMBR; //NUMBER(4) Y 0 동영상인 경우 동영상 파일 심벌 아이디
  304. AnsiString STRM_ADDR; //VARCHAR2(60) Y 스트리밍인경우 스트리밍 주소
  305. bool bBottomTraffic;
  306. TCDSIfsc *pCDSIfsc;
  307. int nBottomTrafficCnt;
  308. int nFigureTrafficCnt; //////////////////////// 20200515 추가함
  309. int nFigureDisplayTm; //////////////////////// 20200515 추가함
  310. String FIGURE_VMS_IFSC_ID; //////////////////////// 20200515 추가함
  311. bool DSPL_CNGS_YN;
  312. AnsiString FRST_VMS_IFSC_ID; //NUMBER(10) Y 1단 VMS 정보제공구간 ID
  313. AnsiString SECD_VMS_IFSC_ID; //NUMBER(10) Y 2단 VMS 정보제공구간 ID
  314. AnsiString THIR_VMS_IFSC_ID; //NUMBER(10) Y 3단 VMS 정보제공구간 ID
  315. AnsiString FOUR_VMS_IFSC_ID; //NUMBER(10) Y 4단 VMS 정보제공구간 ID
  316. AnsiString FRST_IMG_IFSC_ID; //NUMBER(10) Y 1단 이미지 정보제공구간 ID
  317. AnsiString SECD_IMG_IFSC_ID; //NUMBER(10) Y 2단 이미지 정보제공구간 ID
  318. AnsiString THIR_IMG_IFSC_ID; //NUMBER(10) Y 3단 이미지 정보제공구간 ID
  319. AnsiString FOUR_IMG_IFSC_ID; //NUMBER(10) Y 4단 이미지 정보제공구간 ID
  320. for( ; !pADO->Eof; pADO->Next())
  321. {
  322. AnsiString VMS_CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
  323. //VMS 스케줄 유형(A:자동,F:고정,B:기본)
  324. VMS_SCH_TYPE = pADO->FieldByName("VMS_SCH_TYPE")->AsString;
  325. //VMS 폼 스케쥴 유형(0:교통, 1:돌발,2:공사행사, 3:홍보, 4:우회, 5:정체, 6:안전, 7:동영상, 8:스트리밍영상)
  326. VMS_SCH_FORM_TYPE = pADO->FieldByName("VMS_SCH_FORM_TYPE")->AsInteger;
  327. PHASE = pADO->FieldByName("PHASE")->AsInteger;
  328. VMS_FORM_ID = pADO->FieldByName("VMS_FORM_ID")->AsString.Trim();
  329. DSPL_HH = pADO->FieldByName("DSPL_HH")->AsInteger;
  330. DSPL_STRT_HH = pADO->FieldByName("DSPL_STRT_HH")->AsString.Trim();
  331. DSPL_END_HH = pADO->FieldByName("DSPL_END_HH")->AsString.Trim();
  332. SYMB_LIB_NMBR = pADO->FieldByName("SYMB_LIB_NMBR")->AsString.Trim();
  333. STRM_ADDR = pADO->FieldByName("STRM_ADDR")->AsString.Trim();
  334. DSPL_CNGS_YN = pADO->FieldByName("DSPL_CNGS_YN")->AsString.Trim() == "Y" ? true : false;
  335. FRST_VMS_IFSC_ID = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
  336. SECD_VMS_IFSC_ID = pADO->FieldByName("SECD_VMS_IFSC_ID")->AsString;
  337. THIR_VMS_IFSC_ID = pADO->FieldByName("THIR_VMS_IFSC_ID")->AsString;
  338. FOUR_VMS_IFSC_ID = pADO->FieldByName("FOUR_VMS_IFSC_ID")->AsString;
  339. FRST_IMG_IFSC_ID = FRST_VMS_IFSC_ID;//pADO->FieldByName("FRST_IMG_IFSC_ID")->AsString;
  340. SECD_IMG_IFSC_ID = SECD_VMS_IFSC_ID;//pADO->FieldByName("SECD_IMG_IFSC_ID")->AsString;
  341. THIR_IMG_IFSC_ID = THIR_VMS_IFSC_ID;//pADO->FieldByName("THIR_IMG_IFSC_ID")->AsString;
  342. FOUR_IMG_IFSC_ID = FOUR_VMS_IFSC_ID;//pADO->FieldByName("FOUR_IMG_IFSC_ID")->AsString;
  343. if (VMS_SCH_FORM_TYPE < eSchTp_traffic ||
  344. VMS_SCH_FORM_TYPE >= eSchTp_max)
  345. {
  346. MERROR("Unknown Form Type: VmsNmbr(%s), FormId(%s), FormScheduleType(%d)", VMS_CTLR_NMBR.c_str(), VMS_FORM_ID.c_str(), VMS_SCH_FORM_TYPE);
  347. continue;
  348. }
  349. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(VMS_CTLR_NMBR);
  350. if (!pObj)
  351. {
  352. MERROR("Not Found VMS: VmsNmbr(%s)", VMS_CTLR_NMBR.c_str());
  353. continue;
  354. }
  355. if (!pObj->FProvide)
  356. {
  357. //제공하지 않아도 돼는 VMS - mode change로 호출하는 경우임.
  358. continue;
  359. }
  360. pCDSForm = CDSFormManager->FLists.Find(VMS_FORM_ID);
  361. if (!pCDSForm)
  362. {
  363. MERROR("VMS Schedule Not Found Form: VmsNmbr(%s)-[%s]", VMS_CTLR_NMBR.c_str(), VMS_FORM_ID.c_str());
  364. continue;
  365. }
  366. if (pObj->SCHEDULE->Count >= VMS_MAX_SCHEDULE)
  367. {
  368. MERROR("VMS Schedule Count Over: %s, %d", VMS_CTLR_NMBR.c_str(), pObj->SCHEDULE->Count);
  369. continue;
  370. }
  371. //TODO: 조회정렬은 기본,고정,자동(돌발,공사,행사,우회,교통,정체폼) 순으로 조회된다.
  372. // 따라서 각 폼에 대한처리를 수행하면 된다.
  373. //==> 신규작업에서 폼 표출 우선순위적용함 ==> 조회정렬이 영향이 있는지 확인해야함.
  374. if (VMS_SCH_FORM_TYPE == eSchTp_traffic && pCDSForm->VMS_FORM_TYPE_CD == eFormTp_traf_1)
  375. {
  376. //교통정보스케쥴이고 폼의 유형이 소통정보(1단) 인경우....
  377. //해당 폼이 돌발이나 이벤트가 등록되어 있다면
  378. //폼을 생성하지 않는다.
  379. AnsiString FRST_VMS_IFSC_ID = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
  380. if (FRST_VMS_IFSC_ID != "")
  381. {
  382. for (int ii = 0; ii < pObj->SCHEDULE->Count && ii < VMS_MAX_SCHEDULE; ii++)
  383. {
  384. if (pObj->SCHEDULE->Unit[ii].VMS_SCH_FORM_TYPE == eSchTp_incident || //돌발
  385. pObj->SCHEDULE->Unit[ii].VMS_SCH_FORM_TYPE == eSchTp_gongsa || //공사/행사
  386. pObj->SCHEDULE->Unit[ii].VMS_SCH_FORM_TYPE == eSchTp_deture ) //우회
  387. {
  388. if (pObj->SCHEDULE->Unit[ii].EVENT)
  389. {
  390. if (FRST_VMS_IFSC_ID == pObj->SCHEDULE->Unit[ii].EVENT->VMS_IFSC_ID)
  391. {
  392. //폼을 생성하지 않는다.
  393. continue;
  394. }
  395. }
  396. }
  397. }
  398. }
  399. }
  400. bBottomTraffic = false;
  401. nFigureDisplayTm = DSPL_HH;
  402. FIGURE_VMS_IFSC_ID = "";
  403. nFigureTrafficCnt = 0; //전체 표출할 하단 소통정보 갯수
  404. switch(VMS_SCH_FORM_TYPE)
  405. {
  406. case eSchTp_traffic: //교통정보
  407. //도형식 소통정보 인 경우 해당 도형의 소통정보가 존재하는지 확인
  408. if (pCDSForm->VMS_FORM_TYPE_CD == eFormtp_figure)
  409. {
  410. bool bTraffic = false;
  411. TCDSImage *pBakTrfImg = CDSImageManager->FLists.Find(pCDSForm->TrfBakImgId);
  412. if (pBakTrfImg)
  413. {
  414. FOR_STL(TCDSImageCell*, pCell, pBakTrfImg->FLists)
  415. {
  416. TCDSIfsc *pTmpIfsc1 = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  417. if (pTmpIfsc1)
  418. {
  419. if (pTmpIfsc1->CMTR_GRAD_CD != "0")
  420. {
  421. FIGURE_VMS_IFSC_ID = pCell->VMS_IFSC_ID; // 하단에 표출할 정보가 없을 경우 첫번째 제공구간을 표출하기 위함. 20200515 추가함
  422. bTraffic = true; //소통정보가 하나라도 존재함
  423. break;
  424. }
  425. }
  426. }
  427. }
  428. if (bTraffic == false)
  429. {
  430. //도형식 구간의 모든 소통정보가 생성되지 않았음===> 가공서버가 죽었거나 수집되지 않았음.
  431. //표출할 내용이 없음==> skip 해야함
  432. MERROR("VMS Figure IFSC Traffic Failed: VmsNmbr(%s)-[%s]", VMS_CTLR_NMBR.c_str(), VMS_FORM_ID.c_str());
  433. continue;
  434. }
  435. }
  436. //도형식 소통정보 폼일때 하단에 정보제공구간 소통정보를 표출해야 하는 경우
  437. if (pCDSForm->VMS_FORM_TYPE_CD == eFormtp_figure && pCDSForm->TrfIfsc)
  438. {
  439. //도형식 VMS인 경우 하단에 소통정보를 표출하는 경우 다중폼이 생성됨
  440. //제공구간소통정보가 정체, 지체인 경우만 하단 소통정보를 표출함
  441. //도형식 배경셀에 등록된 구간에 대해서 표출하도록함
  442. TCDSImage *pBakTrfImg = CDSImageManager->FLists.Find(pCDSForm->TrfBakImgId);
  443. if (pBakTrfImg)
  444. {
  445. TCDSIfsc *pTmpIfsc1;
  446. //정체구간 갯수 확인
  447. FOR_STL(TCDSImageCell*, pCell, pBakTrfImg->FLists)
  448. {
  449. pTmpIfsc1 = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  450. if (pTmpIfsc1)
  451. {
  452. if (pTmpIfsc1->CMTR_GRAD_CD == "3")
  453. {
  454. bBottomTraffic = true; //도형식배경소통정보의 셀내의 구간정보 소통정보가 하나라도 있으면
  455. //도형식 소통정보를 표출함
  456. nFigureTrafficCnt++;
  457. //break;
  458. }
  459. }
  460. }
  461. //지체(서행)구간 갯수 확인
  462. FOR_STL(TCDSImageCell*, pCell, pBakTrfImg->FLists)
  463. {
  464. pTmpIfsc1 = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  465. if (pTmpIfsc1)
  466. {
  467. if (pTmpIfsc1->CMTR_GRAD_CD == "2")
  468. {
  469. bBottomTraffic = true; //도형식배경소통정보의 셀내의 구간정보 소통정보가 하나라도 있으면
  470. //도형식 소통정보를 표출함
  471. nFigureTrafficCnt++;
  472. //break;
  473. }
  474. }
  475. }
  476. //////////////////////// 20200515 추가함(S)
  477. if (FIGURE_VMS_IFSC_ID != "" && bBottomTraffic == false)
  478. {
  479. //소통정보는 존재하지만 지체, 정체가 없는 경우 하단 소통정보를 표출못하게 된다.
  480. //만일 하단 고정문자가 존재하는 경우 하단 고정문자를 표출하면 되지만
  481. //고정문자가 존재하기 않으면 하단에 표출할 정보가 없으므로 첫번째 구간의 정보를 표출하도록 한다.
  482. if (pCDSForm->TrfFixed == false)
  483. {
  484. bBottomTraffic = true; //첫번째 소통정보가 표출되도록 함
  485. nFigureTrafficCnt++;
  486. }
  487. }
  488. //////////////////////// 20200515 추가함(E)
  489. }
  490. }
  491. //도형식 소통정보 폼일때 하단에 VMS 축 소통정보를 표출해야 하는 경우
  492. if (pCDSForm->VMS_FORM_TYPE_CD == eFormtp_figure && pCDSForm->TrfAxis)
  493. {
  494. //도형식 VMS인 경우 하단에 소통정보를 표출하는 경우 다중폼이 생성됨
  495. //축 소통정보인 경우 모든 축에 대해 소통정보를 표출, 최대 표출설정값이 설정된 경우 설정값만큼만 표출되게 수정(20200515)
  496. FOR_STL(TVmsIfsc*, pIfsc, pObj->FIfscLists)
  497. {
  498. if (!pIfsc->IsUsed) continue;
  499. pCDSIfsc = CDSIfscManager->FLists.Find(pIfsc->VMS_IFSC_ID);
  500. if (!pCDSIfsc) continue;
  501. if (pCDSIfsc->AXIS_YN != "Y") continue;
  502. if (pCDSIfsc->CMTR_GRAD_CD != "0")
  503. {
  504. if (FIGURE_VMS_IFSC_ID == "")
  505. {
  506. FIGURE_VMS_IFSC_ID = pIfsc->VMS_IFSC_ID; // 하단에 표출할 정보가 없을 경우 첫번째 제공구간을 표출하기 위함. 20200515 추가함
  507. }
  508. bBottomTraffic = true;
  509. nFigureTrafficCnt++;
  510. //break;
  511. }
  512. }
  513. //////////////////////// 20200515 추가함(S)
  514. if (FIGURE_VMS_IFSC_ID != "" && bBottomTraffic == false)
  515. {
  516. //소통정보는 존재하지만 지체, 정체가 없는 경우 하단 소통정보를 표출못하게 된다.
  517. //만일 하단 고정문자가 존재하는 경우 하단 고정문자를 표출하면 되지만
  518. //고정문자가 존재하기 않으면 하단에 표출할 정보가 없으므로 첫번째 구간의 정보를 표출하도록 한다.
  519. if (pCDSForm->TrfFixed == false)
  520. {
  521. bBottomTraffic = true; //첫번째 소통정보가 표출되도록 함
  522. nFigureTrafficCnt++;
  523. }
  524. }
  525. //////////////////////// 20200515 추가함(E)
  526. }
  527. //////////////////////// 20200515 추가함(S)
  528. if (bBottomTraffic && g_AppCfg.BottomTrafficMaxCnt > 0)
  529. {
  530. //하단소통정보를 일정갯수만 표출하는 경우 표출할 소통정보가 설정값보다 크면 설정값으로 맞춘다.
  531. if (nFigureTrafficCnt > g_AppCfg.BottomTrafficMaxCnt)
  532. {
  533. nFigureTrafficCnt = g_AppCfg.BottomTrafficMaxCnt;
  534. }
  535. if (g_AppCfg.BottomTrafficCycle > 0)
  536. {
  537. int nTm = nFigureDisplayTm / nFigureTrafficCnt;
  538. if (nTm < g_AppCfg.BottomTrafficCycle)
  539. {
  540. //표출할 시간이 설정값보다 작으로 설정값으로 표출시각을 설정
  541. nFigureDisplayTm = g_AppCfg.BottomTrafficCycle;
  542. }
  543. else
  544. {
  545. nFigureDisplayTm = nTm; // 설정값보다 크면 계산된 값을 표출시각으로 설정
  546. }
  547. }
  548. }
  549. //////////////////////// 20200515 추가함(E)
  550. nBottomTrafficCnt = 0;
  551. if (bBottomTraffic)
  552. {
  553. //도형식 다중 소통정보 표출인 경우
  554. //하단소통정보를 표출하는경우 정체, 지체 순으로 표출
  555. if (pCDSForm->TrfIfsc)
  556. {
  557. //정보제공구간 소통정보 순환표출(정체)
  558. //도형식 배경셀에 등록된 구간에 대해서 표출하도록함
  559. TCDSImage *pBakTrfImg1 = CDSImageManager->FLists.Find(pCDSForm->TrfBakImgId);
  560. if (pBakTrfImg1)
  561. {
  562. FOR_STL(TCDSImageCell*, pCell, pBakTrfImg1->FLists)
  563. {
  564. TCDSIfsc *pTmpIfsc1 = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  565. if (!pTmpIfsc1) continue;
  566. if (pTmpIfsc1->CMTR_GRAD_CD != "3") continue;
  567. nIdx = pObj->SCHEDULE->Count;
  568. if (nIdx < VMS_MAX_SCHEDULE)
  569. {
  570. nIdx = pObj->SCHEDULE->Count;
  571. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  572. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  573. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  574. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  575. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = pCell->VMS_IFSC_ID;
  576. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  577. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  578. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  579. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  580. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  581. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  582. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  583. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = nFigureDisplayTm; //도형식폼이 실제로 표출될 시간
  584. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pCell->VMS_IFSC_ID; //하단 제공구간 ID
  585. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  586. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  587. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  588. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  589. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  590. pObj->SCHEDULE->Count++;
  591. nSelCnt++;
  592. nBottomTrafficCnt++;
  593. if (g_AppCfg.BottomTrafficMaxCnt > 0 && nBottomTrafficCnt >= g_AppCfg.BottomTrafficMaxCnt)
  594. {
  595. break;
  596. }
  597. }
  598. }
  599. }
  600. //정보제공구간 소통정보 순환표출(지체)
  601. //도형식 배경셀에 등록된 구간에 대해서 표출
  602. TCDSImage *pBakTrfImg2 = CDSImageManager->FLists.Find(pCDSForm->TrfBakImgId);
  603. if (pBakTrfImg2)
  604. {
  605. FOR_STL(TCDSImageCell*, pCell, pBakTrfImg2->FLists)
  606. {
  607. TCDSIfsc *pTmpIfsc1 = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  608. if (!pTmpIfsc1) continue;
  609. if (pTmpIfsc1->CMTR_GRAD_CD != "2") continue;
  610. if (g_AppCfg.BottomTrafficMaxCnt > 0 && nBottomTrafficCnt >= g_AppCfg.BottomTrafficMaxCnt)
  611. {
  612. break;
  613. }
  614. nIdx = pObj->SCHEDULE->Count;
  615. if (nIdx < VMS_MAX_SCHEDULE)
  616. {
  617. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  618. nIdx = pObj->SCHEDULE->Count;
  619. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  620. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  621. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  622. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = pCell->VMS_IFSC_ID;
  623. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = "";
  624. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = "";
  625. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = "";
  626. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = nFigureDisplayTm; //도형식폼이 실제로 표출될 시간
  627. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pCell->VMS_IFSC_ID; //하단 제공구간 ID
  628. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  629. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  630. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  631. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  632. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  633. pObj->SCHEDULE->Count++;
  634. nSelCnt++;
  635. nBottomTrafficCnt++;
  636. }
  637. }
  638. }
  639. //////////////////////// 20200515 추가함(S)
  640. if (nBottomTrafficCnt == 0)
  641. {
  642. //소통정보가 모두 소통원활이고 하단고정문자표출도 없는 경우 첫번째 정보제공구간의 소통정보를 표출하도록 한다.
  643. nIdx = pObj->SCHEDULE->Count;
  644. if (nIdx < VMS_MAX_SCHEDULE)
  645. {
  646. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  647. nIdx = pObj->SCHEDULE->Count;
  648. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  649. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  650. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  651. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FIGURE_VMS_IFSC_ID;
  652. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = "";
  653. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = "";
  654. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = "";
  655. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = nFigureDisplayTm; //도형식폼이 실제로 표출될 시간
  656. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = FIGURE_VMS_IFSC_ID; //하단 제공구간 ID
  657. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  658. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  659. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  660. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  661. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  662. pObj->SCHEDULE->Count++;
  663. nSelCnt++;
  664. nBottomTrafficCnt++;
  665. }
  666. }
  667. //////////////////////// 20200515 추가함(E)
  668. } //도형식배경소통정보 처리 완료
  669. if (pCDSForm->TrfAxis)
  670. {
  671. //축소통정보 순환표출
  672. FOR_STL(TVmsIfsc*, pIfsc, pObj->FIfscLists)
  673. {
  674. if (!pIfsc->IsUsed) continue;
  675. pCDSIfsc = CDSIfscManager->FLists.Find(pIfsc->VMS_IFSC_ID);
  676. if (!pCDSIfsc) continue;
  677. if (pCDSIfsc->AXIS_YN != "Y") continue;
  678. if (pCDSIfsc->CMTR_GRAD_CD == "0") continue;
  679. nIdx = pObj->SCHEDULE->Count;
  680. if (nIdx < VMS_MAX_SCHEDULE)
  681. {
  682. nIdx = pObj->SCHEDULE->Count;
  683. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  684. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  685. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  686. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  687. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  688. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  689. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  690. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  691. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  692. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  693. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  694. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  695. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = nFigureDisplayTm; //도형식폼이 실제로 표출될 시간
  696. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pIfsc->VMS_IFSC_ID; //하단 제공구간 ID
  697. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  698. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  699. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  700. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  701. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  702. pObj->SCHEDULE->Count++;
  703. nSelCnt++;
  704. nBottomTrafficCnt++;
  705. if (g_AppCfg.BottomTrafficMaxCnt > 0 && nBottomTrafficCnt >= g_AppCfg.BottomTrafficMaxCnt)
  706. {
  707. break;
  708. }
  709. }
  710. }
  711. //////////////////////// 20200515 추가함(S)
  712. if (nBottomTrafficCnt == 0)
  713. {
  714. //소통정보가 모두 소통원활이고 하단고정문자표출도 없는 경우 첫번째 VMS축의 소통정보를 표출하도록 한다.
  715. nIdx = pObj->SCHEDULE->Count;
  716. if (nIdx < VMS_MAX_SCHEDULE)
  717. {
  718. nIdx = pObj->SCHEDULE->Count;
  719. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  720. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  721. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  722. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  723. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FIGURE_VMS_IFSC_ID;
  724. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = FIGURE_VMS_IFSC_ID;
  725. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = FIGURE_VMS_IFSC_ID;
  726. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FIGURE_VMS_IFSC_ID;
  727. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  728. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  729. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  730. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  731. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = nFigureDisplayTm; //도형식폼이 실제로 표출될 시간
  732. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = FIGURE_VMS_IFSC_ID; //하단 제공구간 ID
  733. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  734. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  735. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  736. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  737. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  738. pObj->SCHEDULE->Count++;
  739. nSelCnt++;
  740. nBottomTrafficCnt++;
  741. }
  742. }
  743. //////////////////////// 20200515 추가함(E)
  744. }
  745. }
  746. else
  747. {
  748. //도형식 다중표출이 아닌경우(하단소통정보가 없는 경우)
  749. nIdx = pObj->SCHEDULE->Count;
  750. if (nIdx < VMS_MAX_SCHEDULE)
  751. {
  752. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  753. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  754. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  755. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  756. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  757. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  758. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  759. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  760. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  761. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  762. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  763. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  764. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  765. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  766. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  767. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  768. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  769. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  770. pObj->SCHEDULE->Count++;
  771. nSelCnt++;
  772. }
  773. }
  774. break;
  775. case eSchTp_incident: //돌발
  776. //돌발 스케줄인 경우 해당 VMS에 발생한 모든 돌발 정보를 표출하도록 스케줄 추가
  777. for (int ii = 0; ii < pObj->INCIDENT->Count; ii++)
  778. {
  779. nIdx = pObj->SCHEDULE->Count;
  780. if (nIdx < VMS_MAX_SCHEDULE)
  781. {
  782. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  783. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  784. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  785. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  786. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  787. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  788. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  789. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  790. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  791. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  792. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  793. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  794. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  795. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pObj->INCIDENT->Unit[ii].VMS_IFSC_ID;
  796. pObj->SCHEDULE->Unit[nIdx].EVENT = &pObj->INCIDENT->Unit[ii];
  797. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  798. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  799. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  800. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  801. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  802. pObj->SCHEDULE->Count++;
  803. nSelCnt++;
  804. }
  805. }
  806. break;
  807. case eSchTp_gongsa: //공사/행사문안
  808. //공사/행사 스케줄인 경우 해당 VMS에 발생한 모든 돌발 정보를 표출하도록 스케줄 추가
  809. for (int ii = 0; ii < pObj->EVENT->Count; ii++)
  810. {
  811. nIdx = pObj->SCHEDULE->Count;
  812. if (nIdx < VMS_MAX_SCHEDULE)
  813. {
  814. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  815. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  816. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  817. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  818. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  819. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  820. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  821. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  822. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  823. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  824. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  825. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  826. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  827. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pObj->EVENT->Unit[ii].VMS_IFSC_ID;
  828. pObj->SCHEDULE->Unit[nIdx].EVENT = &pObj->EVENT->Unit[ii];
  829. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  830. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  831. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  832. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  833. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  834. pObj->SCHEDULE->Count++;
  835. nSelCnt++;
  836. }
  837. }
  838. break;
  839. case eSchTp_hongbo: //홍보
  840. nIdx = pObj->SCHEDULE->Count;
  841. if (nIdx < VMS_MAX_SCHEDULE)
  842. {
  843. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  844. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  845. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  846. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  847. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  848. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  849. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  850. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  851. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  852. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  853. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  854. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  855. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  856. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  857. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  858. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  859. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  860. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  861. pObj->SCHEDULE->Count++;
  862. nSelCnt++;
  863. }
  864. break;
  865. case eSchTp_deture: //우회도로
  866. //돌발발생한 구간중 우회도로 구간이 있는경우
  867. for (int ii = 0; ii < pObj->INCIDENT->Count; ii++)
  868. {
  869. if (pObj->INCIDENT->Unit[ii].DETR_ID == "0") continue;
  870. nIdx = pObj->SCHEDULE->Count;
  871. if (nIdx < VMS_MAX_SCHEDULE)
  872. {
  873. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  874. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  875. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  876. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  877. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  878. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  879. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  880. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  881. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  882. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  883. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  884. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  885. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  886. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pObj->INCIDENT->Unit[ii].VMS_IFSC_ID;
  887. pObj->SCHEDULE->Unit[nIdx].EVENT = &pObj->INCIDENT->Unit[ii];
  888. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  889. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  890. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  891. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  892. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  893. pObj->SCHEDULE->Count++;
  894. nSelCnt++;
  895. }
  896. }
  897. //공사/행사 발생한 구간중 우회도로 구간이 있는경우
  898. for (int ii = 0; ii < pObj->EVENT->Count; ii++)
  899. {
  900. if (pObj->EVENT->Unit[ii].DETR_ID == "0") continue;
  901. nIdx = pObj->SCHEDULE->Count;
  902. if (nIdx < VMS_MAX_SCHEDULE)
  903. {
  904. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  905. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  906. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  907. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  908. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  909. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  910. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  911. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  912. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  913. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  914. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  915. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  916. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  917. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pObj->EVENT->Unit[ii].VMS_IFSC_ID;
  918. pObj->SCHEDULE->Unit[nIdx].EVENT = &pObj->EVENT->Unit[ii];
  919. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  920. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  921. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  922. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  923. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  924. pObj->SCHEDULE->Count++;
  925. nSelCnt++;
  926. }
  927. }
  928. break;
  929. case eSchTp_congest: //정체상황
  930. {
  931. //VMS에 설정된 모든 정체구간판정구간에 대하여 정체 판정
  932. int nCngsCnt = 0;
  933. FOR_STL(TVmsIfsc*, pCngs, pObj->FIfscLists)
  934. {
  935. if (!pCngs->IsUsed) continue;
  936. if (!pCngs->CNGS_CNFM_YN) continue; //정체판정이 아닌경우
  937. if (pCngs->CNGST_CNT < g_AppCfg.CngsContCnt) continue; //설정되어 있는 정체판정 횟수보다 작으면 정체아님
  938. //정체판정된 정체폼 생성
  939. //스케쥴갯수를 초과하지 않으면 폼 스케쥴추가
  940. nIdx = pObj->SCHEDULE->Count;
  941. if (nIdx < VMS_MAX_SCHEDULE && nCngsCnt <= pObj->FMaxCngsForm)
  942. {
  943. pObj->FExistCngsForm = true; // TODO: 해당 제어기에 정체폼이 존재하는지를 플래그 설정
  944. // 다른 폼들은 정체폼이 존재할때 표출할지 여부가 결정됨
  945. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  946. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  947. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  948. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  949. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = pCngs->VMS_IFSC_ID;
  950. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = "";
  951. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = "";
  952. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = "";
  953. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = "";
  954. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = "";
  955. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = "";
  956. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = "";
  957. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  958. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pCngs->VMS_IFSC_ID;
  959. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  960. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  961. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  962. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  963. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  964. pObj->SCHEDULE->Count++;
  965. nSelCnt++;
  966. }
  967. }
  968. }
  969. break;
  970. case eSchTp_video: //동영상
  971. case eSchTp_stream: //스트리밍영상
  972. nIdx = pObj->SCHEDULE->Count;
  973. if (nIdx < VMS_MAX_SCHEDULE)
  974. {
  975. //동영상명칭이나 스트리밍주소가 설정되지 않은 것은 표출하지 않는다.
  976. if ( (VMS_SCH_FORM_TYPE == eSchTp_video && SYMB_LIB_NMBR != "" && SYMB_LIB_NMBR != "200" && STRM_ADDR != "") ||
  977. (VMS_SCH_FORM_TYPE == eSchTp_stream && SYMB_LIB_NMBR != "" && SYMB_LIB_NMBR == "300" && STRM_ADDR != "") )
  978. {
  979. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  980. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  981. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  982. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  983. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  984. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  985. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  986. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  987. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  988. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  989. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  990. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  991. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  992. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  993. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  994. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  995. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  996. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  997. pObj->SCHEDULE->Count++;
  998. nSelCnt++;
  999. }
  1000. }
  1001. break;
  1002. case eSchTp_atmp: //9:대기환경
  1003. {
  1004. AnsiString ATMP_STTN_NMBR = "";
  1005. bool isAtmp = false;
  1006. if (CDSAtmpManager)
  1007. {
  1008. FOR_STL(TCDSFormObj*, pTmpObj, pCDSForm->FLists)
  1009. {
  1010. if (pTmpObj->VMS_FORM_OBJECT_TYPE_CD >= 401 && pTmpObj->VMS_FORM_OBJECT_TYPE_CD <= 413)
  1011. {
  1012. ATMP_STTN_NMBR = pTmpObj->VMS_IFSC_ID;
  1013. TCDSAtmp *pAtmp = CDSAtmpManager->FLists.Find(pTmpObj->VMS_IFSC_ID);
  1014. if (pAtmp && pAtmp->SUCCESS)
  1015. {
  1016. isAtmp = true;
  1017. break;
  1018. }
  1019. }
  1020. }
  1021. }
  1022. if (isAtmp == false)
  1023. {
  1024. //폼에 속한 대기환경의 모든 정보가 유효하지 않는 경우 폼을 생성하지 않는다.
  1025. MERROR("VMS ATMP Failed: VmsNmbr(%s)-[%s]", VMS_CTLR_NMBR.c_str(), VMS_FORM_ID.c_str());
  1026. break;
  1027. }
  1028. nIdx = pObj->SCHEDULE->Count;
  1029. if (nIdx < VMS_MAX_SCHEDULE)
  1030. {
  1031. #if 0
  1032. AnsiString ATMP_STTN_NMBR = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
  1033. TCDSAtmp *pAtmpObj = CDSAtmpManager->FLists.Find(ATMP_STTN_NMBR);
  1034. if (!pAtmpObj) break;
  1035. if (pAtmpObj->SUCCESS == false)
  1036. {
  1037. MERROR("VMS ATMP Failed: VmsNmbr(%s)-[%s], %s.%s", VMS_CTLR_NMBR.c_str(), VMS_FORM_ID.c_str(), ATMP_STTN_NMBR.c_str(), pAtmpObj->ATMP_STTN_NM.c_str());
  1038. break;
  1039. }
  1040. #endif
  1041. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1042. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1043. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1044. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1045. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = ATMP_STTN_NMBR;
  1046. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = "";
  1047. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = "";
  1048. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = "";
  1049. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = "";
  1050. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = "";
  1051. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = "";
  1052. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = "";
  1053. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1054. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1055. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1056. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1057. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1058. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1059. pObj->SCHEDULE->Count++;
  1060. nSelCnt++;
  1061. }
  1062. }
  1063. break;
  1064. case eSchTp_park: //10:주차정보
  1065. {
  1066. bool isParkingForm = false;
  1067. FOR_STL(TCDSFormObj*, pTmpObj, pCDSForm->FLists)
  1068. {
  1069. if (pTmpObj->VMS_FORM_OBJECT_TYPE_CD == 501 || pTmpObj->VMS_FORM_OBJECT_TYPE_CD == 502)
  1070. {
  1071. TCDSPark *pPark = NULL;
  1072. if (CDSParkManager) CDSParkManager->FLists.Find(pTmpObj->VMS_IFSC_ID); //주차장아이디로 주차장정보를 찾음
  1073. if (pPark && pPark->SUCCESS)
  1074. {
  1075. isParkingForm = true;
  1076. break;
  1077. }
  1078. }
  1079. }
  1080. if (isParkingForm == false)
  1081. {
  1082. //폼에 속한 주차장의 모든 정보가 유효하지 않는 경우 폼을 생성하지 않는다.
  1083. MERROR("VMS PARKING Failed: VmsNmbr(%s)-[%s]", VMS_CTLR_NMBR.c_str(), VMS_FORM_ID.c_str());
  1084. break;
  1085. }
  1086. nIdx = pObj->SCHEDULE->Count;
  1087. if (nIdx < VMS_MAX_SCHEDULE)
  1088. {
  1089. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1090. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1091. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1092. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1093. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = "";
  1094. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = "";
  1095. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = "";
  1096. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = "";
  1097. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = "";
  1098. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = "";
  1099. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = "";
  1100. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = "";
  1101. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1102. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1103. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1104. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1105. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1106. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1107. pObj->SCHEDULE->Count++;
  1108. nSelCnt++;
  1109. }
  1110. }
  1111. break;
  1112. }
  1113. }
  1114. }
  1115. catch(EDatabaseError &E)
  1116. {
  1117. DBERROR(String(E.ClassName()), E.Message, sQry);
  1118. return -1;
  1119. }
  1120. catch(Exception &e)
  1121. {
  1122. DBERROR(String(e.ClassName()), e.Message, sQry);
  1123. return -1;
  1124. }
  1125. }
  1126. __finally
  1127. {
  1128. SQLFree(pADO);
  1129. }
  1130. if (0)
  1131. {
  1132. CtlrItr it;
  1133. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1134. {
  1135. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1136. if (!pObj->Used) continue;
  1137. MDEBUG("VMS Schedule: %s, %d EA", pObj->CTLR_NMBR.c_str(), pObj->SCHEDULE->Count);
  1138. }
  1139. }
  1140. IDBSTOP(nSelCnt);
  1141. return nSelCnt;
  1142. }
  1143. //---------------------------------------------------------------------------
  1144. int TCDSManager::LoadVmsOperationMode(TADOConnection *ADbConn)
  1145. {
  1146. AnsiString sQry;
  1147. int nSelCnt = 0;
  1148. TADOQuery *pADO = NULL;
  1149. DDBSTART;
  1150. sQry = "SELECT A.VMS_CTLR_NMBR, A.OPER_MODE, \r\n"
  1151. " NVL(A.VMS_MAX_PHSE_NUM, 16) AS VMS_MAX_PHSE_NUM \r\n"
  1152. " FROM TB_VMS_CTLR A \r\n"
  1153. " WHERE A.DEL_YN = 'N' \r\n";
  1154. try
  1155. {
  1156. pADO = new TADOQuery(NULL);
  1157. pADO->Connection = ADbConn;
  1158. try
  1159. {
  1160. SQLText(pADO, sQry, false);
  1161. SQLOpen(pADO);
  1162. for( ; !pADO->Eof; pADO->Next())
  1163. {
  1164. AnsiString VMS_CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
  1165. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(VMS_CTLR_NMBR);
  1166. if (!pObj) continue;
  1167. pObj->OPER_MODE = pADO->FieldByName("OPER_MODE")->AsString.Trim();
  1168. int nMaxFormCnt = pADO->FieldByName("VMS_MAX_PHSE_NUM")->AsInteger;
  1169. if (pObj->OPER_MODE != "A" && pObj->OPER_MODE != "F" && pObj->OPER_MODE != "B")
  1170. {
  1171. pObj->OPER_MODE = "A";
  1172. }
  1173. if (pObj->OPER_MODE == "A")
  1174. pObj->DSTATE.OprMode = 'A';
  1175. else
  1176. if (pObj->OPER_MODE == "B")
  1177. pObj->DSTATE.OprMode = 'B';
  1178. else
  1179. pObj->DSTATE.OprMode = 'F';
  1180. if (pObj->CTRLMODE->Control == pObj->DSTATE.OprMode)
  1181. pObj->FModeChange = false;
  1182. else
  1183. pObj->FModeChange = true;
  1184. pObj->CTRLMODE->Control = pObj->DSTATE.OprMode;
  1185. pObj->RSTATE.OprMode = pObj->CTRLMODE->Control;
  1186. //pObj->VMS_MAX_PHSE_NUM = INT_VMS_MAX_FORM; //nMaxFormCnt;
  1187. if (pObj->VMS_MAX_PHSE_NUM > INT_VMS_MAX_FORM)
  1188. pObj->VMS_MAX_PHSE_NUM = INT_VMS_MAX_FORM;
  1189. pObj->CTRLMODE->MaxDisplayForm = pObj->VMS_MAX_PHSE_NUM;
  1190. #if 0
  1191. if (pObj->CTRLMODE->MaxDisplayForm > INT_MAX_VMS_FORM)
  1192. pObj->CTRLMODE->MaxDisplayForm = INT_MAX_VMS_FORM;
  1193. #endif
  1194. //VMS별 정체폼갯수를 제한하는 경우 여기에서 처리하도록 하자
  1195. pObj->FMaxCngsForm = VMS_MAX_CNGS_FORM; //현재는 디폴트, 즉 모든정보 생성
  1196. nSelCnt++;
  1197. }
  1198. }
  1199. catch(EDatabaseError &E)
  1200. {
  1201. DBERROR(String(E.ClassName()), E.Message, sQry);
  1202. return -1;
  1203. }
  1204. catch(Exception &e)
  1205. {
  1206. DBERROR(String(e.ClassName()), e.Message, sQry);
  1207. return -1;
  1208. }
  1209. }
  1210. __finally
  1211. {
  1212. SQLFree(pADO);
  1213. }
  1214. IDBSTOP(nSelCnt);
  1215. return nSelCnt;
  1216. }
  1217. //---------------------------------------------------------------------------
  1218. int TCDSManager::UpdateVmsProvideResult(TADOConnection *ADbConn, void *ACtlrObj)
  1219. {
  1220. int nSelCnt = 0;
  1221. AnsiString sQry;
  1222. TADOQuery *pADO = NULL;
  1223. int nFormCnt = 0;
  1224. // DDBSTART;
  1225. TCDSCtlr* AObj = (TCDSCtlr*)ACtlrObj;
  1226. if (!AObj) return VERR_MEMORY_ALLOC;
  1227. sQry = "UPDATE TB_VMS_DSPL_PRST \r\n"
  1228. " SET DSPL_DT = :p03, \r\n"
  1229. " DNLD_YN = :p04 \r\n"
  1230. " WHERE VMS_CTLR_NMBR = :p01 \r\n"
  1231. " AND PHASE <= :p02 \r\n";
  1232. String VMS_CTLR_NMBR;
  1233. String PHASE;
  1234. String DSPL_DT;
  1235. String DNLD_YN;
  1236. try
  1237. {
  1238. nFormCnt = AObj->pForms->Count();
  1239. if (nFormCnt == 0) return VERR_NONE;
  1240. pADO = new TADOQuery(NULL);
  1241. pADO->Connection = ADbConn;
  1242. VMS_CTLR_NMBR = AObj->CTLR_NMBR;
  1243. PHASE = String(nFormCnt);
  1244. DSPL_DT = AObj->CTRLMODE->SvcDate;
  1245. DNLD_YN = AObj->CTRLMODE->Result ? "Y" : "N";
  1246. int dspl_dt_mm = DSPL_DT.SubString(5, 2).ToIntDef(1);
  1247. try
  1248. {
  1249. SQLText(pADO, sQry, false);
  1250. SQLBind(pADO, "p01", VMS_CTLR_NMBR);
  1251. SQLBind(pADO, "p02", PHASE);
  1252. SQLBind(pADO, "p03", DSPL_DT);
  1253. SQLBind(pADO, "p04", DNLD_YN);
  1254. nSelCnt = SQLExec(pADO);
  1255. }
  1256. catch(EDatabaseError &E)
  1257. {
  1258. DBERROR(String(E.ClassName()), E.Message, sQry);
  1259. return -1;
  1260. }
  1261. catch(Exception &e)
  1262. {
  1263. DBERROR(String(e.ClassName()), e.Message, sQry);
  1264. return -1;
  1265. }
  1266. // 이력 저장--제공시각이 동일한게 이력으로 저장될수 있기때문에 트랜잭션을 다시시작한다.
  1267. // 이전 VMS인 경우 임...
  1268. #if 0
  1269. sQry = "INSERT INTO TB_VMS_DSPL_HS_TEMP \r\n"
  1270. " (DSPL_DT, VMS_CTLR_NMBR, PHASE, \r\n"
  1271. " VMS_SCH_TYPE, VMS_SCH_FORM_TYPE, \r\n"
  1272. " VMS_FORM_ID, DSPL_HH, \r\n"
  1273. " VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT, \r\n"
  1274. " VMS_FORM_DSPL_DRCT_CD, VMS_FORM_DSPL_MTHD_CD, \r\n"
  1275. " DNLD_YN) \r\n"
  1276. " SELECT DSPL_DT, VMS_CTLR_NMBR, PHASE, \r\n"
  1277. " VMS_SCH_TYPE, VMS_SCH_FORM_TYPE, \r\n"
  1278. " VMS_FORM_ID, DSPL_HH, \r\n"
  1279. " VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT, \r\n"
  1280. " VMS_FORM_DSPL_DRCT_CD, VMS_FORM_DSPL_MTHD_CD, \r\n"
  1281. " DNLD_YN \r\n"
  1282. " FROM TB_VMS_DSPL_PRST \r\n"
  1283. " WHERE VMS_CTLR_NMBR = :p01 \r\n"
  1284. " AND PHASE <= :p02 \r\n";
  1285. sQry.printf("INSERT INTO TB_VMS_DSPL_HS_%dTH \r\n"
  1286. " (DSPL_DT, VMS_CTLR_NMBR, PHASE, \r\n"
  1287. " VMS_SCH_TYPE, VMS_SCH_FORM_TYPE, \r\n"
  1288. " VMS_FORM_ID, DSPL_HH, \r\n"
  1289. " VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT, \r\n"
  1290. " VMS_FORM_DSPL_DRCT_CD, VMS_FORM_DSPL_MTHD_CD, \r\n"
  1291. " DNLD_YN) \r\n"
  1292. " SELECT DSPL_DT, VMS_CTLR_NMBR, PHASE, \r\n"
  1293. " VMS_SCH_TYPE, VMS_SCH_FORM_TYPE, \r\n"
  1294. " VMS_FORM_ID, DSPL_HH, \r\n"
  1295. " VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT, \r\n"
  1296. " VMS_FORM_DSPL_DRCT_CD, VMS_FORM_DSPL_MTHD_CD, \r\n"
  1297. " DNLD_YN \r\n"
  1298. " FROM TB_VMS_DSPL_PRST \r\n"
  1299. " WHERE VMS_CTLR_NMBR = :p01 \r\n"
  1300. " AND PHASE <= :p02 \r\n", dspl_dt_mm);
  1301. #else
  1302. sQry = "INSERT INTO TB_VMS_DSPL_HS \r\n"
  1303. " (DSPL_DT, VMS_CTLR_NMBR, PHASE, \r\n"
  1304. " VMS_SCH_TYPE, VMS_SCH_FORM_TYPE, \r\n"
  1305. " VMS_FORM_ID, DSPL_HH, \r\n"
  1306. " VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT, \r\n"
  1307. " VMS_FORM_DSPL_DRCT_CD, VMS_FORM_DSPL_MTHD_CD, \r\n"
  1308. " DNLD_YN) \r\n"
  1309. " SELECT DSPL_DT, VMS_CTLR_NMBR, PHASE, \r\n"
  1310. " VMS_SCH_TYPE, VMS_SCH_FORM_TYPE, \r\n"
  1311. " VMS_FORM_ID, DSPL_HH, \r\n"
  1312. " VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT, \r\n"
  1313. " VMS_FORM_DSPL_DRCT_CD, VMS_FORM_DSPL_MTHD_CD, \r\n"
  1314. " DNLD_YN \r\n"
  1315. " FROM TB_VMS_DSPL_PRST \r\n"
  1316. " WHERE VMS_CTLR_NMBR = :p01 \r\n"
  1317. " AND PHASE <= :p02 \r\n";
  1318. #endif
  1319. try
  1320. {
  1321. SQLText(pADO, sQry, false);
  1322. SQLBind(pADO, "p01", VMS_CTLR_NMBR);
  1323. SQLBind(pADO, "p02", PHASE);
  1324. nSelCnt += SQLExec(pADO);
  1325. }
  1326. catch(EDatabaseError &E)
  1327. {
  1328. DBERROR(String(E.ClassName()), E.Message, sQry);
  1329. return -1;
  1330. }
  1331. catch(Exception &e)
  1332. {
  1333. DBERROR(String(e.ClassName()), e.Message, sQry);
  1334. return -1;
  1335. }
  1336. #if 0
  1337. try
  1338. {
  1339. sQry = "TRUNCATE TABLE TB_VMS_DSPL_HS_TEMP";
  1340. SQLText(pADO, sQry, false);
  1341. nSelCnt += SQLExec(pADO);
  1342. }
  1343. catch(EDatabaseError &E)
  1344. {
  1345. DBERROR(String(E.ClassName()), E.Message, sQry);
  1346. return -1;
  1347. }
  1348. catch(Exception &e)
  1349. {
  1350. DBERROR(String(e.ClassName()), e.Message, sQry);
  1351. return -1;
  1352. }
  1353. #endif
  1354. }
  1355. __finally
  1356. {
  1357. SQLFree(pADO);
  1358. }
  1359. MINFO("DCOM %30.30s: %s, %d EA [%s]", "UpdateVmsProvideResult", AObj->CTLR_NMBR.c_str(), nFormCnt, DNLD_YN.c_str());
  1360. // IDBSTOP(nSelCnt);
  1361. return nSelCnt;
  1362. }
  1363. //---------------------------------------------------------------------------
  1364. int TCDSManager::SaveVmsProvideForm(TADOConnection *ADbConn, void *ACtlrObj)
  1365. {
  1366. // VMS 제공정보 객체 코드
  1367. typedef enum en_vms_object_type
  1368. {
  1369. vms_obj_none, /* 0:정보없음 */
  1370. vms_obj_text, /* 1:문자열 */
  1371. vms_obj_bitmap, /* 2:Bitmap ID */
  1372. vms_obj_draw, /* 3:Draw */
  1373. } EN_VMS_OBJECT_TYPE;
  1374. AnsiString sQry;
  1375. AnsiString uQry;
  1376. TADOQuery *pSADO = NULL;
  1377. TADOQuery *pUADO = NULL;
  1378. int nSelCnt = 0;
  1379. DDBSTART;
  1380. TCDSCtlr* AObj = (TCDSCtlr*)ACtlrObj;
  1381. if (!AObj) return VERR_MEMORY_ALLOC;
  1382. int nFormCnt = AObj->pForms->Count();
  1383. if (nFormCnt == 0) return VERR_NONE;
  1384. sQry = "MERGE INTO TB_VMS_DSPL_PRST L \r\n"
  1385. "USING (SELECT :p01 AS VMS_CTLR_NMBR, \r\n"
  1386. " :p02 AS PHASE, \r\n"
  1387. " :p03 AS DSPL_DT, \r\n"
  1388. " :p04 AS VMS_SCH_TYPE, \r\n"
  1389. " :p05 AS VMS_SCH_FORM_TYPE, \r\n"
  1390. " :p06 AS VMS_FORM_ID, \r\n"
  1391. " :p07 AS DSPL_HH, \r\n"
  1392. " :p08 AS VMS_DSPL_MSG_DATA, \r\n"
  1393. " :p09 AS VMS_DSPL_MSG_TXT, \r\n"
  1394. " :p10 AS VMS_FORM_DSPL_DRCT_CD, \r\n"
  1395. " :p11 AS VMS_FORM_DSPL_MTHD_CD, \r\n"
  1396. " :p12 AS DNLD_YN \r\n"
  1397. " FROM DUAL) M \r\n"
  1398. " ON (L.VMS_CTLR_NMBR = M.VMS_CTLR_NMBR AND L.PHASE = M.PHASE) \r\n"
  1399. "WHEN MATCHED THEN \r\n"
  1400. "UPDATE SET L.DSPL_DT = M.DSPL_DT, \r\n"
  1401. " L.VMS_SCH_TYPE = M.VMS_SCH_TYPE, \r\n"
  1402. " L.VMS_SCH_FORM_TYPE = M.VMS_SCH_FORM_TYPE, \r\n"
  1403. " L.VMS_FORM_ID = M.VMS_FORM_ID, \r\n"
  1404. " L.DSPL_HH = M.DSPL_HH, \r\n"
  1405. " L.VMS_DSPL_MSG_DATA = M.VMS_DSPL_MSG_DATA, \r\n"
  1406. " L.VMS_DSPL_MSG_TXT = M.VMS_DSPL_MSG_TXT, \r\n"
  1407. " L.VMS_FORM_DSPL_DRCT_CD = M.VMS_FORM_DSPL_DRCT_CD, \r\n"
  1408. " L.VMS_FORM_DSPL_MTHD_CD = M.VMS_FORM_DSPL_MTHD_CD, \r\n"
  1409. " L.DNLD_YN = M.DNLD_YN \r\n"
  1410. "WHEN NOT MATCHED THEN \r\n"
  1411. "INSERT (VMS_CTLR_NMBR, PHASE, DSPL_DT, \r\n"
  1412. " VMS_SCH_TYPE, VMS_SCH_FORM_TYPE, \r\n"
  1413. " VMS_FORM_ID, DSPL_HH, \r\n"
  1414. " VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT, \r\n"
  1415. " VMS_FORM_DSPL_DRCT_CD, VMS_FORM_DSPL_MTHD_CD, \r\n"
  1416. " DNLD_YN) \r\n"
  1417. "VALUES (M.VMS_CTLR_NMBR, M.PHASE, M.DSPL_DT, \r\n"
  1418. " M.VMS_SCH_TYPE, M.VMS_SCH_FORM_TYPE, \r\n"
  1419. " M.VMS_FORM_ID, M.DSPL_HH, \r\n"
  1420. " M.VMS_DSPL_MSG_DATA, M.VMS_DSPL_MSG_TXT, \r\n"
  1421. " M.VMS_FORM_DSPL_DRCT_CD, M.VMS_FORM_DSPL_MTHD_CD, \r\n"
  1422. " M.DNLD_YN) \r\n";
  1423. uQry = "UPDATE TB_VMS_DSPL_PRST \r\n"
  1424. " SET VMS_DSPL_MSG_IMAG = :p03 \r\n"
  1425. " WHERE VMS_CTLR_NMBR = :p01 \r\n"
  1426. " AND PHASE = :p02 \r\n";
  1427. try
  1428. {
  1429. pSADO = new TADOQuery(NULL);
  1430. pSADO->Connection = ADbConn;
  1431. pUADO = new TADOQuery(NULL);
  1432. pUADO->Connection = ADbConn;
  1433. try
  1434. {
  1435. AObj->pForms->Lock();
  1436. SQLText(pSADO, sQry, false);
  1437. SQLText(pUADO, uQry, false);
  1438. for (int ii = 0; ii < nFormCnt; ii++)
  1439. {
  1440. TVmsForm *pForm = AObj->pForms->GetItem(ii);
  1441. String VMS_CTLR_NMBR = AObj->CTLR_NMBR;
  1442. String PHASE = String(ii+1);
  1443. String DSPL_DT = AObj->CTRLMODE->SvcDate;
  1444. String VMS_SCH_TYPE = pForm->VMS_SCH_TYPE;
  1445. String VMS_SCH_FORM_TYPE = pForm->VMS_SCH_FORM_TYPE;
  1446. String VMS_FORM_ID = pForm->VMS_FORM_ID;
  1447. String DSPL_HH = String(pForm->DSPL_HH);
  1448. String VMS_DSPL_MSG_DATA = "";
  1449. String VMS_DSPL_MSG_TXT = "";
  1450. String VMS_FORM_DSPL_DRCT_CD = pForm->VMS_FORM_DSPL_DRCT_CD;
  1451. String VMS_FORM_DSPL_MTHD_CD = pForm->VMS_FORM_DSPL_MTHD_CD;
  1452. String DNLD_YN = pForm->SvcRes ? "Y" : "N";
  1453. AnsiString sTmp = "";
  1454. AnsiString sCont = "";
  1455. int nObjCnt, nObjType;
  1456. try
  1457. {
  1458. //폼종류/표출시간/배경색상
  1459. sCont.printf("%02X%02X%02X|", pForm->VMS_FORM_TYPE_CD, pForm->DSPL_HH, pForm->VMS_FORM_COLR_CD);
  1460. VMS_DSPL_MSG_DATA += sCont;
  1461. nObjCnt = pForm->Count();
  1462. for (int jj = 0; jj < nObjCnt; jj++)
  1463. {
  1464. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  1465. if (pFormObj->ImageId == "") pFormObj->ImageId = "1"; //이력저장용
  1466. if (pFormObj->TextData == "") pFormObj->TextData = " "; //이력저장용
  1467. switch(pFormObj->ObjectType)
  1468. {
  1469. case 1: //심볼
  1470. case 2: //이미지
  1471. case 167: //@우회소통정보이미지
  1472. case 200: //동영상
  1473. case 300: //스티리밍영상
  1474. case 406: //@통합대기등급 이미지
  1475. case 407: //@미세먼지등급 이미지
  1476. case 408: //@초미세먼지등급 이미지
  1477. case 413: //@오존등급이미지
  1478. nObjType = vms_obj_bitmap;
  1479. sTmp.printf("%02X%04X%04X%02X%04X%04X%s|",
  1480. pFormObj->IsBlinking,
  1481. pFormObj->PosX,
  1482. pFormObj->PosY,
  1483. pFormObj->BkColor,
  1484. pFormObj->Width,
  1485. pFormObj->Height,
  1486. pFormObj->ImageId.c_str());
  1487. sCont.printf("%02X%02X%s", nObjType, sTmp.Length(), sTmp.c_str());
  1488. VMS_DSPL_MSG_DATA += sCont;
  1489. break;
  1490. case 3: //소통정보배경이미지
  1491. case 17: //1단,소통정보이미지1
  1492. case 27: //2단,소통정보이미지2
  1493. case 37: //3단,소통정보이미지3
  1494. case 47: //4단,소통정보이미지4
  1495. {
  1496. nObjType = vms_obj_draw;
  1497. sTmp.printf("%02X%04X%04X%02X%04X%04X%s+",
  1498. pFormObj->IsBlinking,
  1499. pFormObj->PosX,
  1500. pFormObj->PosY,
  1501. pFormObj->BkColor,
  1502. pFormObj->Width,
  1503. pFormObj->Height,
  1504. pFormObj->ImageId.c_str());
  1505. sCont.printf("%02X%02X%s", nObjType, sTmp.Length(), sTmp.c_str());
  1506. VMS_DSPL_MSG_DATA += sCont;
  1507. AnsiString sVertex = "";
  1508. TCDSImage *pSymbol = CDSImageManager->FLists.Find(pFormObj->ImageId);
  1509. if (pSymbol)
  1510. {
  1511. sTmp = "";
  1512. int nCnt = 0;
  1513. FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
  1514. {
  1515. TCDSIfsc *pIfsc = NULL;
  1516. if (pFormObj->ObjectType == 3)
  1517. pIfsc = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  1518. else
  1519. pIfsc = CDSIfscManager->FLists.Find(pFormObj->IFSC_ID);
  1520. if (pIfsc)
  1521. {
  1522. sVertex.sprintf("%03d%03d%d", pCell->POSX, pCell->POSY, pIfsc->CMTR_GRAD_CD.ToIntDef(0));
  1523. sTmp += sVertex;
  1524. nCnt++;
  1525. }
  1526. }
  1527. sCont.printf("%02X%s|", nCnt, sTmp.c_str());
  1528. VMS_DSPL_MSG_DATA += sCont;
  1529. }
  1530. else
  1531. {
  1532. VMS_DSPL_MSG_DATA += "X|";
  1533. }
  1534. }
  1535. break;
  1536. default://기타 문자열
  1537. VMS_DSPL_MSG_TXT += pFormObj->TextData;
  1538. VMS_DSPL_MSG_TXT += " ";
  1539. nObjType = vms_obj_text;
  1540. sTmp.printf("%02X%04X%04X%02X%02X%02X%02X%02X%02X%s|",
  1541. pFormObj->IsBlinking,
  1542. pFormObj->PosX,
  1543. pFormObj->PosY,
  1544. pFormObj->BkColor,
  1545. pFormObj->TextFontSize,
  1546. pFormObj->TextFontColor,
  1547. pFormObj->TextFontName,
  1548. pFormObj->TextFontBold,
  1549. pFormObj->TextData.Length(),
  1550. pFormObj->TextData);
  1551. sCont.printf("%02X%02X%s", nObjType, sTmp.Length(), sTmp.c_str());
  1552. VMS_DSPL_MSG_DATA += sCont;
  1553. break;
  1554. }
  1555. }
  1556. if (VMS_DSPL_MSG_DATA.Length() > 1500) VMS_DSPL_MSG_DATA = VMS_DSPL_MSG_DATA.SubString(1, 1499);
  1557. if (VMS_DSPL_MSG_TXT.Length() > 300) VMS_DSPL_MSG_TXT = VMS_DSPL_MSG_TXT.SubString(1, 299);
  1558. SQLBind(pSADO, "p01", VMS_CTLR_NMBR);
  1559. SQLBind(pSADO, "p02", PHASE);
  1560. SQLBind(pSADO, "p03", DSPL_DT);
  1561. SQLBind(pSADO, "p04", VMS_SCH_TYPE);
  1562. SQLBind(pSADO, "p05", VMS_SCH_FORM_TYPE);
  1563. SQLBind(pSADO, "p06", VMS_FORM_ID);
  1564. SQLBind(pSADO, "p07", DSPL_HH);
  1565. SQLBind(pSADO, "p08", VMS_DSPL_MSG_DATA);
  1566. SQLBind(pSADO, "p09", VMS_DSPL_MSG_TXT);
  1567. SQLBind(pSADO, "p10", VMS_FORM_DSPL_DRCT_CD);
  1568. SQLBind(pSADO, "p11", VMS_FORM_DSPL_MTHD_CD);
  1569. SQLBind(pSADO, "p12", DNLD_YN);
  1570. SQLExec(pSADO);
  1571. try
  1572. {
  1573. SQLBind(pUADO, "p01", VMS_CTLR_NMBR);
  1574. SQLBind(pUADO, "p02", PHASE);
  1575. //pUADO->Parameters->ParamByName("p03")->LoadFromStream(pStream, ftBlob);
  1576. pUADO->Parameters->ParamByName("p03")->LoadFromStream(pForm->pStream, ftBlob);
  1577. SQLExec(pUADO);
  1578. //MINFO("[%s] FormImage Size: %d", AObj->VmsNo.c_str(), pForm->pStream->Size);
  1579. //pForm->pBitmap->SaveToFile(g_sFtpFormDir + AObj->VmsId + "\\" + PHASE + ".bmp");
  1580. //pImage->Picture->SaveToFile(g_sFtpFormDir + AObj->VmsId + "\\" + PHASE + ".bmp");
  1581. }
  1582. catch(Exception &e)
  1583. {
  1584. }
  1585. nSelCnt++;
  1586. }
  1587. __finally
  1588. {
  1589. }
  1590. }
  1591. }
  1592. catch(EDatabaseError &E)
  1593. {
  1594. DBERROR(String(E.ClassName()), E.Message, sQry);
  1595. return -1;
  1596. }
  1597. catch(Exception &e)
  1598. {
  1599. DBERROR(String(e.ClassName()), e.Message, sQry);
  1600. return -1;
  1601. }
  1602. }
  1603. __finally
  1604. {
  1605. AObj->pForms->UnLock();
  1606. SQLFree(pSADO);
  1607. SQLFree(pUADO);
  1608. }
  1609. MINFO("DCOM %30.30s: %s, %d EA", "SaveVmsProvideForm", AObj->CTLR_NMBR.c_str(), nSelCnt);
  1610. //IDBSTOP(nSelCnt);
  1611. return nSelCnt;
  1612. }
  1613. //---------------------------------------------------------------------------
  1614. int TCDSManager::LoadVmsOnOffTime(TADOConnection *ADbConn)
  1615. {
  1616. String sQry;
  1617. TADOQuery *pADO = NULL;
  1618. int nSelCnt = 0;
  1619. DDBSTART;
  1620. sQry = "SELECT A.VMS_CTLR_NMBR, \r\n"
  1621. " A.PANL_ON_TIME, \r\n"
  1622. " A.PANL_OFF_TIME \r\n"
  1623. " FROM TB_VMS_CTLR A \r\n"
  1624. " WHERE A.DEL_YN = 'N' \r\n";
  1625. BYTE OnOff, OldOnOff;
  1626. int nOnTime, nOffTime, nCurrTime;
  1627. nCurrTime = Now().FormatString("hhnn").ToIntDef(0);
  1628. try
  1629. {
  1630. try
  1631. {
  1632. pADO = new TADOQuery(NULL);
  1633. pADO->Connection = ADbConn;
  1634. SQLText(pADO, sQry, true);
  1635. SQLOpen(pADO);
  1636. for( ; !pADO->Eof; pADO->Next())
  1637. {
  1638. AnsiString VMS_CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsString.Trim();
  1639. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(VMS_CTLR_NMBR);
  1640. if (!pObj) continue;
  1641. pObj->PANL_ON_TIME = pADO->FieldByName("PANL_ON_TIME")->AsString.Trim(); // N VARCHAR2(4) Y '0400' 전광판 ON TIME
  1642. pObj->PANL_OFF_TIME = pADO->FieldByName("PANL_OFF_TIME")->AsString.Trim(); // N VARCHAR2(4) Y '0200' 전광판 OFF TIME
  1643. if (pObj->PANL_ON_TIME == "9999" || pObj->PANL_ON_TIME.Length() != 4) pObj->PANL_ON_TIME = "0000";
  1644. if (pObj->PANL_OFF_TIME == "9999" || pObj->PANL_OFF_TIME.Length() != 4) pObj->PANL_OFF_TIME = "0000";
  1645. pObj->MODULE.PowerOnTime = Now().FormatString("yyyymmdd") + pObj->PANL_ON_TIME;
  1646. pObj->MODULE.PowerOffTime = Now().FormatString("yyyymmdd") + pObj->PANL_OFF_TIME;
  1647. pObj->MODULE.Retry = VMS_MAX_RETRY_COUNT;
  1648. OldOnOff = pObj->MODULE.OnOff;
  1649. OnOff = vms_req_board_power_on;
  1650. nOnTime = pObj->PANL_ON_TIME.ToIntDef(0);
  1651. nOffTime = pObj->PANL_OFF_TIME.ToIntDef(0);
  1652. if (nOnTime != nOffTime)
  1653. {
  1654. if (nOnTime > nOffTime)
  1655. {
  1656. // 0100(off), 0500(on)
  1657. if (nCurrTime >= nOffTime && nCurrTime < nOnTime)
  1658. {
  1659. OnOff = vms_req_board_power_off;
  1660. }
  1661. }
  1662. else
  1663. if (nOffTime > nOnTime)
  1664. {
  1665. // 2300(off), 0500(on)
  1666. if (nCurrTime >= nOffTime || nCurrTime < nOnTime)
  1667. {
  1668. OnOff = vms_req_board_power_off;
  1669. }
  1670. }
  1671. }
  1672. if (OldOnOff != OnOff)
  1673. {
  1674. #if 0
  1675. if (pObj->FSession && pObj->FSession->State == eSS_Connected)
  1676. {
  1677. pObj->MODULE.IsOnOff = true;
  1678. pObj->MODULE.OnOff = OnOff;
  1679. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  1680. pMsg->Type = eVmsStatusControl;
  1681. pMsg->ObjPtr = (DWORD)pObj->FSession;
  1682. pMsg->Buff[0] = 0x01;
  1683. pMsg->Buff[1] = OnOff;
  1684. pMsg->Len = 2;
  1685. g_jobQ.PushBlocking((DWORD)pMsg);
  1686. }
  1687. #endif
  1688. }
  1689. #if 0
  1690. if (pObj->FSession && pObj->FSession->State == eSS_Connected && pObj->MODULE.OnOff != pObj->PANL_PWER_MODE)
  1691. {
  1692. pObj->MODULE.IsOnOff = true;
  1693. }
  1694. #endif
  1695. nSelCnt++;
  1696. }
  1697. }
  1698. catch(EDatabaseError &E)
  1699. {
  1700. DBERROR(String(E.ClassName()), E.Message, sQry);
  1701. return -1;
  1702. }
  1703. catch(Exception &e)
  1704. {
  1705. DBERROR(String(e.ClassName()), e.Message, sQry);
  1706. return -1;
  1707. }
  1708. }
  1709. __finally
  1710. {
  1711. SQLFree(pADO);
  1712. }
  1713. MINFO("DCOM <<< Check VMS Job Schedule: OnOffTime, %d EA", nSelCnt);
  1714. // IDBSTOP(nSelCnt);
  1715. return nSelCnt;
  1716. }
  1717. //---------------------------------------------------------------------------
  1718. int TCDSManager::LoadVmsDownLoadJob(TADOConnection *ADbConn)
  1719. {
  1720. String sQry;
  1721. TADOQuery *pADO = NULL;
  1722. int nSelCnt = 0;
  1723. int nDnIdx;
  1724. VMS_DOWNLOAD_INFO *pInfo;
  1725. //return nSelCnt;
  1726. DDBSTART;
  1727. sQry = "SELECT A.VMS_CTLR_NMBR, A.RGST_DT, \r\n"
  1728. " A.FILETYPE, A.FILEID \r\n"
  1729. " FROM TB_VMS_DOWNLOAD A \r\n"
  1730. " WHERE A.SENDSTARTDATE <= TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') \r\n"
  1731. " AND A.SENDRESULT = 0 \r\n"
  1732. " ORDER BY A.VMS_CTLR_NMBR, A.RGST_DT DESC, A.FILETYPE, A.FILEID \r\n";
  1733. CtlrItr it;
  1734. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1735. {
  1736. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1737. pObj->InitDownLoadInfo();
  1738. }
  1739. try
  1740. {
  1741. try
  1742. {
  1743. pADO = new TADOQuery(NULL);
  1744. pADO->Connection = ADbConn;
  1745. SQLText(pADO, sQry, true);
  1746. SQLOpen(pADO);
  1747. for( ; !pADO->Eof; pADO->Next())
  1748. {
  1749. AnsiString VMS_CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsString.Trim();
  1750. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(VMS_CTLR_NMBR);
  1751. if (!pObj) continue;
  1752. if (pObj->DOWNLOAD->Count < VMS_MAX_DOWNLOAD)
  1753. {
  1754. pInfo = pObj->DOWNLOAD;
  1755. nDnIdx = pInfo->Count++;
  1756. pInfo->Unit[nDnIdx].RegDate = pADO->FieldByName("RGST_DT")->AsString;
  1757. pInfo->Unit[nDnIdx].FileType = pADO->FieldByName("FILETYPE")->AsString;
  1758. pInfo->Unit[nDnIdx].FileId = pADO->FieldByName("FILEID")->AsString;
  1759. pInfo->Unit[nDnIdx].SendEndDate = Now().FormatString("yyyymmddhhnnss");
  1760. pInfo->Unit[nDnIdx].SendStep = send_wait;
  1761. pInfo->Unit[nDnIdx].SendResult = vms_download_fail;
  1762. }
  1763. nSelCnt++;
  1764. }
  1765. }
  1766. catch(EDatabaseError &E)
  1767. {
  1768. DBERROR(String(E.ClassName()), E.Message, sQry);
  1769. return -1;
  1770. }
  1771. catch(Exception &e)
  1772. {
  1773. DBERROR(String(e.ClassName()), e.Message, sQry);
  1774. return -1;
  1775. }
  1776. }
  1777. __finally
  1778. {
  1779. SQLFree(pADO);
  1780. }
  1781. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1782. {
  1783. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1784. if (pObj->DOWNLOAD->Count > 0)
  1785. {
  1786. pObj->DOWNLOAD->Enable = vms_download_enable;
  1787. pObj->DOWNLOAD->SaveFlag = false;
  1788. }
  1789. }
  1790. MINFO("DCOM <<< Check VMS Job Schedule: DownloadJob, %d EA", nSelCnt);
  1791. // IDBSTOP(nSelCnt);
  1792. return nSelCnt;
  1793. }
  1794. //---------------------------------------------------------------------------
  1795. int TCDSManager::SaveVmsDownLoadJob(TADOConnection *ADbConn, void *ACtlrObj)
  1796. {
  1797. int nSelCnt = 0;
  1798. AnsiString sQry;
  1799. TADOQuery *pADO = NULL;
  1800. DDBSTART;
  1801. TCDSCtlr* AObj = (TCDSCtlr*)ACtlrObj;
  1802. if (!AObj) return VERR_MEMORY_ALLOC;
  1803. sQry = "UPDATE TB_VMS_DOWNLOAD \r\n"
  1804. " SET SENDENDDATE = :p05, \r\n"
  1805. " SENDSTEP = :p06, \r\n"
  1806. " SENDRESULT = :p07 \r\n"
  1807. " WHERE RGST_DT = :p01 \r\n"
  1808. " AND VMS_CTLR_NMBR = :p02 \r\n"
  1809. " AND FILETYPE = :p03 \r\n"
  1810. " AND FILEID = :p04 \r\n";
  1811. try
  1812. {
  1813. pADO = new TADOQuery(NULL);
  1814. pADO->Connection = ADbConn;
  1815. try
  1816. {
  1817. SQLText(pADO, sQry, false);
  1818. for (int ii = 0; ii < AObj->DOWNLOAD->Count && ii < VMS_MAX_DOWNLOAD; ii++)
  1819. {
  1820. SQLBind(pADO, "p01", AObj->DOWNLOAD->Unit[ii].RegDate);
  1821. SQLBind(pADO, "p02", AObj->CTLR_NMBR);
  1822. SQLBind(pADO, "p03", AObj->DOWNLOAD->Unit[ii].FileType);
  1823. SQLBind(pADO, "p04", AObj->DOWNLOAD->Unit[ii].FileId);
  1824. SQLBind(pADO, "p05", AObj->DOWNLOAD->Unit[ii].SendEndDate);
  1825. SQLBind(pADO, "p06", AObj->DOWNLOAD->Unit[ii].SendStep);
  1826. SQLBind(pADO, "p07", AObj->DOWNLOAD->Unit[ii].SendResult);
  1827. nSelCnt = SQLExec(pADO);
  1828. }
  1829. pADO->Connection->CommitTrans();
  1830. }
  1831. catch(EDatabaseError &E)
  1832. {
  1833. DBERROR(String(E.ClassName()), E.Message, sQry);
  1834. return -1;
  1835. }
  1836. catch(Exception &e)
  1837. {
  1838. DBERROR(String(e.ClassName()), e.Message, sQry);
  1839. return -1;
  1840. }
  1841. }
  1842. __finally
  1843. {
  1844. SQLFree(pADO);
  1845. }
  1846. MDEBUG("SaveVmsDownLoad: End, %s", AObj->CTLR_NMBR.c_str());
  1847. IDBSTOP(nSelCnt);
  1848. return nSelCnt;
  1849. }
  1850. //---------------------------------------------------------------------------
  1851. int TCDSManager::SaveVmsDownloadForm(TADOConnection *ADbConn)
  1852. {
  1853. int nSaveVmsCnt = 0;
  1854. int nSaveFormCnt = 0;
  1855. DDBSTART;
  1856. //생성한 폼을 데이터베이스에 저장한다.
  1857. CtlrItr it;
  1858. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1859. {
  1860. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1861. if (pObj->Server.useFlag != use_enable) continue;
  1862. if (!pObj->FProvide) continue;
  1863. nSaveFormCnt += SaveVmsProvideForm(ADbConn, (void*)pObj);
  1864. nSaveVmsCnt++;
  1865. }
  1866. //생성한 폼을 제어기에 전송할 수 있도록 플래그를 설정한다.
  1867. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1868. {
  1869. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1870. if (pObj->Server.useFlag != use_enable) continue;
  1871. if (!pObj->FProvide) continue;
  1872. if (pObj->pForms->Count() > 0)
  1873. {
  1874. pObj->CTRLMODE->Enable = object_enable;
  1875. pObj->CTRLMODE->SaveFlag = false;
  1876. pObj->CTRLMODE->Result = false;
  1877. }
  1878. }
  1879. IDBSTOP(nSaveVmsCnt);
  1880. return nSaveVmsCnt;
  1881. }
  1882. //---------------------------------------------------------------------------
  1883. int TCDSManager::SendVmsDownloadForm()
  1884. {
  1885. INT_VMS_FORM_SAVE_REQ Req;
  1886. memset((char*)&Req, 0x00, sizeof(Req));
  1887. memcpy(Req.Date, FFormDsplDt.c_str(), INT_VMS_MAX_DATETIME);
  1888. return CComm_VmsFormSaveNotify(&Req);
  1889. }
  1890. //---------------------------------------------------------------------------
  1891. int TCDSManager::MakeVmsScenarioForm(TADOConnection *ADbConn)
  1892. {
  1893. int nResult = VERR_NONE;
  1894. DDBSTART;
  1895. CDSManager->ClearVmsProvideMode();
  1896. if (LOAD_DB)
  1897. {
  1898. if (CDSImageManager) CDSImageManager->LoadVmsSymbolInfo(ADbConn);
  1899. if (CDSFormManager) CDSFormManager->LoadVmsFormInfo(ADbConn);
  1900. if (CDSIfscManager) CDSIfscManager->LoadVmsIfscInfo(ADbConn);
  1901. if (CDSAtmpManager) CDSAtmpManager->LoadAtmpInfo(ADbConn);
  1902. }
  1903. //대기환경정보를 읽어온다
  1904. if (CDSAtmpManager)
  1905. {
  1906. nResult = CDSAtmpManager->LoadAtmpRtPnstInfo(ADbConn);
  1907. if (nResult < 0)
  1908. {
  1909. MERROR("LoadAtmpRtPnstInfo: error: %d", nResult);
  1910. }
  1911. }
  1912. //주차정보를 읽어온다
  1913. if (CDSParkManager)
  1914. {
  1915. nResult = CDSParkManager->LoadFromDb(ADbConn);
  1916. if (nResult < 0)
  1917. {
  1918. MERROR("CDSParkManager->LoadFromDb: error: %d", nResult);
  1919. }
  1920. }
  1921. //돌발/공사/행사가 발생한 정보를 VMS에 맵핑한다.
  1922. nResult = CDSManager->LoadVmsEventOccrInf(ADbConn);
  1923. if (nResult < 0)
  1924. {
  1925. MERROR("LoadVmsEventOccrInf: error: %d", nResult);
  1926. }
  1927. // VMS구간 소통정보를 모두 읽어오자..(데이터가 많을 경우 해당되는 정보만 읽어오도록 수정
  1928. nResult = CDSIfscManager->LoadVmsIfscTrafficInfo(ADbConn);
  1929. if (nResult < 0)
  1930. {
  1931. MERROR("LoadVmsIfscTrafficInfo: error: %d", nResult);
  1932. }
  1933. //정체폼을 위한 정체정보 판정
  1934. //스케쥴정보를 읽기전에 VMS별 정체판정조건에 따라 정체정보를 판정한다.
  1935. if (CDSManager->FIsStaticCycle)
  1936. {
  1937. try
  1938. {
  1939. CtlrItr it;
  1940. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1941. {
  1942. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1943. FOR_STL(TVmsIfsc*, pIfsc, pObj->FIfscLists)
  1944. {
  1945. if (!pIfsc->IsUsed) continue;
  1946. if (!pIfsc->CNGS_CNFM_YN) continue; //정체판정이 아닌경우
  1947. TCDSIfsc *pTrfIfsc = CDSIfscManager->FLists.Find(pIfsc->VMS_IFSC_ID);
  1948. if (!pTrfIfsc)
  1949. {
  1950. pIfsc->CNGST_CNT = 0;
  1951. continue;
  1952. }
  1953. if (pTrfIfsc->SPED <= pIfsc->CNGS_CNFM_SPED)
  1954. {
  1955. //현재속도값이 정체판정속도 이하이면 정체판정 횟수를 증가
  1956. if (pIfsc->CNGST_CNT == 0)
  1957. {
  1958. pIfsc->dtCngst = Now();
  1959. }
  1960. pIfsc->CNGST_CNT++;
  1961. }
  1962. else
  1963. {
  1964. //정체판정속도보다 크면 정체횟수를 초기화
  1965. pIfsc->CNGST_CNT = 0;
  1966. }
  1967. }
  1968. }
  1969. }
  1970. catch(Exception &e)
  1971. {
  1972. }
  1973. }
  1974. //VMS의 스케줄정보를 조회한다.
  1975. nResult = LoadVmsScheduleInfo(ADbConn);
  1976. if (nResult < 0)
  1977. {
  1978. MERROR("LoadVmsScheduleInfo: error: %d", nResult);
  1979. }
  1980. CDSManager->FIsStaticCycle = false; //정주기 정보제공주기 플래그 설정
  1981. IDBSTOP(nResult);
  1982. return nResult;
  1983. }
  1984. //---------------------------------------------------------------------------
  1985. int TCDSManager::DownloadVmsForm(TADOConnection *ADbConn, int ACommand)
  1986. {
  1987. int nResult = 0;
  1988. DDBSTART;
  1989. if (ACommand == dbm_dnld_form_cycle || ACommand == dbm_dnld_form_init)
  1990. {
  1991. //정주기 다운로드 이면 모든 VMS에 메시지다운로드 플래그 활성화 시킴
  1992. //모드변경에 의한 다운로드인경우에는 내부통신을 수신한 곳에서 플래그를 활성화 시켰음.
  1993. //1. 현재 운영모드를 다시 한번 읽음
  1994. if (LoadVmsOperationMode(ADbConn) < 0)
  1995. {
  1996. return -1;
  1997. }
  1998. //모든 VMS에 메시지다운로드 플래그 활성화 시킴
  1999. CDSCtlrManager->InitProvide(NULL);
  2000. }
  2001. nResult = MakeVmsScenarioForm(ADbConn);
  2002. IDBSTOP(nResult);
  2003. return nResult;
  2004. }
  2005. //---------------------------------------------------------------------------
  2006. int TCDSManager::SaveProvideResult(TADOConnection *ADbConn, void *AData)
  2007. {
  2008. int ii;
  2009. TCDSCtlr *pObj;
  2010. int nJobCnt = 0;
  2011. int nResult;
  2012. VMS_PROVIDE_RESULE *pSave;
  2013. DDBSTART;
  2014. pSave = (VMS_PROVIDE_RESULE*)AData;
  2015. if (!pSave)
  2016. {
  2017. MERROR("SaveProvideResult: Data NULL");
  2018. return -1;
  2019. }
  2020. switch(pSave->Type)
  2021. {
  2022. case provide_form:
  2023. {
  2024. INT_VMS_FORM_DOWNLOAD_REQ VmsSave;
  2025. memset(&VmsSave, 0x00, sizeof(VmsSave));
  2026. VmsSave.Count = 0;
  2027. MINFO("DCOM %30.30s: %d EA", "VMS Msg Provide Result Save", pSave->Count);
  2028. for (ii = 0; ii < pSave->Count && ii < MAX_VMS_PROVIDE_RESULT; ii++)
  2029. {
  2030. pObj = (TCDSCtlr*)pSave->pObj[ii];
  2031. if (!pObj) continue;
  2032. if ((nResult = UpdateVmsProvideResult(ADbConn, (void*)pObj)) < 0)
  2033. {
  2034. MERROR("ProvideSave: UpdateVmsProvideResult failed: %d", nResult);
  2035. }
  2036. else
  2037. {
  2038. nJobCnt++;
  2039. memcpy(VmsSave.Unit[VmsSave.Count].VmsId, pObj->CTLR_NMBR.c_str(), INT_VMS_MAX_ID);
  2040. memcpy(VmsSave.Unit[VmsSave.Count].Date, pObj->CTRLMODE->SvcDate.c_str(), INT_VMS_MAX_DATETIME);
  2041. VmsSave.Unit[VmsSave.Count].Result = pObj->CTRLMODE->Result ? vms_download_succ : vms_download_fail;
  2042. VmsSave.Count++;
  2043. if (VmsSave.Count >= INT_VMS_MAX_FORM_DOWNLOAD)
  2044. {
  2045. CComm_VmsFormDownLoadNotify(&VmsSave);
  2046. VmsSave.Count = 0;
  2047. }
  2048. }
  2049. }
  2050. if (VmsSave.Count > 0)
  2051. {
  2052. CComm_VmsFormDownLoadNotify(&VmsSave);
  2053. }
  2054. }
  2055. break;
  2056. case provide_download:
  2057. for (ii = 0; ii < pSave->Count && ii < MAX_VMS_PROVIDE_RESULT; ii++)
  2058. {
  2059. pObj = (TCDSCtlr*)pSave->pObj[ii];
  2060. if (!pObj) continue;
  2061. nJobCnt++;
  2062. if ((nResult = SaveVmsDownLoadJob(ADbConn, (void*)pObj)) < 0)
  2063. {
  2064. MERROR("SaveProvideResult: SaveVmsDownLoadJob failed: %d", nResult);
  2065. }
  2066. }
  2067. break;
  2068. }
  2069. IDBSTOP(nJobCnt);
  2070. return nJobCnt;
  2071. }
  2072. //---------------------------------------------------------------------------