CDSManagerF.cpp 146 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117
  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. //DWORD dwTick = GetTickCount();
  30. //JOBSTART;
  31. FFormDsplDt = Now().FormatString("yyyymmddhhnnss");
  32. CtlrItr it;
  33. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  34. {
  35. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  36. if (pObj->Server.useFlag != use_enable) continue;
  37. if (!pObj->FProvide) continue;
  38. pObj->CTRLMODE->MaxDisplayForm = 0;//pObj->VMS_MAX_PHSE_NUM; //0
  39. pObj->CTRLMODE->Enable = object_disable;
  40. pObj->CTRLMODE->SvcDate = FFormDsplDt;
  41. pObj->CTRLMODE->SaveFlag = true;
  42. pObj->CTRLMODE->pTimer = Now();
  43. pObj->CTRLMODE->Result = false;
  44. pObj->InitEVehicle(); // 긴급차량우선신호
  45. pObj->InitSchedule(); //스케줄정보
  46. pObj->InitIncident(); //돌발정보
  47. pObj->InitEvent(); //이벤트(공사/행사)정보
  48. pObj->FExistCngsForm = false; //정체폼이 없는것으로 초기화
  49. pObj->pForms->Clear();
  50. nSelCnt++;
  51. }
  52. //JOBEND(dwTick);
  53. //if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  54. // TIMEDELAY(nSelCnt, dwTick);
  55. //}
  56. return nSelCnt;
  57. }
  58. //---------------------------------------------------------------------------
  59. int TCDSManager::CheckVmsEVehicleInf(TADOConnection *ADbConn)
  60. {
  61. AnsiString sQry;
  62. int nSelCnt = 0;
  63. TADOQuery *pADO = NULL;
  64. DWORD dwTick = GetTickCount();
  65. SELSTART;
  66. // 하나의 VMS에 긴급차량우선신호 가 2개 이상존재할 경우...
  67. // 하나의 VMS에 긴급차량우선선호 진행중, 운행완료 상태가 존재하는 경우...
  68. // 운행중,,,운행중,,,운행중 ===> 운행중이 하나라도 존재하면 최종 상태는 운행중
  69. //
  70. sQry = "SELECT COUNT(1) AS EVEHICLE_CNT \r\n"
  71. " FROM PRIO_SGNL_REQ_INFR A \r\n"
  72. " INNER JOIN PRIO_SGNL_OPER_IXR B \r\n"
  73. " ON A.SRVC_ID = B.SRVC_ID \r\n"
  74. " INNER JOIN TB_VMS_RLTN_IXR C \r\n"
  75. " ON B.IXR_NMBR = C.SGNL_IXR_NMBR \r\n"
  76. " WHERE A.END_YN = 'N' \r\n";
  77. try
  78. {
  79. pADO = new TADOQuery(NULL);
  80. pADO->Connection = ADbConn;
  81. try
  82. {
  83. SQLText(pADO, sQry, false);
  84. SQLOpen(pADO);
  85. int nIdx;
  86. for( ; !pADO->Eof; pADO->Next())
  87. {
  88. nSelCnt = pADO->FieldByName("EVEHICLE_CNT")->AsInteger;
  89. }
  90. }
  91. catch(EDatabaseError &E)
  92. {
  93. DBERROR(String(E.ClassName()), E.Message, sQry);
  94. return -1;
  95. }
  96. catch(Exception &e)
  97. {
  98. DBERROR(String(e.ClassName()), e.Message, sQry);
  99. return -1;
  100. }
  101. }
  102. __finally
  103. {
  104. SQLFree(pADO);
  105. }
  106. if (nSelCnt == 0) {
  107. // 현재시점에 긴급차량우선신호가 발생하지 않은경우 이전 긴급차량우선신호가 발생했는지 확인
  108. // ===> 긴급차량우선신호 운영종료 메시지를 전송하여야 함
  109. // ===> 긴급차량우선신호 운영종료 메시지를 전송한후 일정시간이 지난후 일반스케쥴 메시지 전송
  110. CtlrItr it;
  111. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  112. {
  113. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  114. if (pObj->Server.useFlag != use_enable) continue;
  115. if ((pObj->EVEHICLE->IsOcurr || pObj->EVEHICLE->IsEnd) && COMM_TimeDiff(pObj->EVEHICLE->dtOcurr) <= 60) {
  116. MINFO(" INF-.DATA: %25.25s: %s, Ocurr(%d), End(%d), TM(%d)", __MYFUNC__,
  117. pObj->CTLR_NMBR.c_str(), pObj->EVEHICLE->IsOcurr ? 1 : 0, pObj->EVEHICLE->IsEnd ? 1: 0, COMM_TimeDiff(pObj->EVEHICLE->dtOcurr));
  118. nSelCnt++;
  119. }
  120. }
  121. }
  122. SELEND(nSelCnt, dwTick);
  123. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  124. TIMEDELAY(nSelCnt, dwTick);
  125. }
  126. return nSelCnt;
  127. }
  128. //---------------------------------------------------------------------------
  129. int TCDSManager::LoadVmsEVehicleInf(TADOConnection *ADbConn, int ACommand)
  130. {
  131. AnsiString sQry;
  132. int nSelCnt = 0;
  133. TADOQuery *pADO = NULL;
  134. DWORD dwTick = GetTickCount();
  135. SELSTART;
  136. CtlrItr it;
  137. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  138. {
  139. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  140. pObj->InitEVehicle(); // 긴급차량우선신호
  141. }
  142. sQry = "SELECT VMS_CTLR_NMBR AS VMS_CTLR_NMBR, SRVC_ID, COUNT(1) AS IXR_CNT \r\n"
  143. " FROM ( \r\n"
  144. "SELECT A.EMRG_VHCL_ID, A.SRVC_ID, A.END_YN, B.IXR_NMBR, B.IXR_ORD, C.VMS_CTLR_NMBR \r\n"
  145. " FROM PRIO_SGNL_REQ_INFR A \r\n"
  146. " INNER JOIN PRIO_SGNL_OPER_IXR B \r\n"
  147. " ON A.SRVC_ID = B.SRVC_ID \r\n"
  148. " INNER JOIN TB_VMS_RLTN_IXR C \r\n"
  149. " ON B.IXR_NMBR = C.SGNL_IXR_NMBR \r\n"
  150. " WHERE A.END_YN = 'N' \r\n"
  151. " ) \r\n"
  152. " GROUP BY VMS_CTLR_NMBR, SRVC_ID \r\n";
  153. try
  154. {
  155. pADO = new TADOQuery(NULL);
  156. pADO->Connection = ADbConn;
  157. try
  158. {
  159. SQLText(pADO, sQry, false);
  160. SQLOpen(pADO);
  161. int nIdx;
  162. for( ; !pADO->Eof; pADO->Next())
  163. {
  164. AnsiString VMS_CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
  165. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(VMS_CTLR_NMBR);
  166. if (!pObj) continue;
  167. if (ACommand != dbm_check_evehicle_alarm) {
  168. // 긴급차량우선신호 체크 메시지가 아닌 경우 모두 다운로드할 수 있도록 플래그 설정
  169. // 정주기 인 경우 무조건 다운로드 할 수 있도록(DB 이력 무조건 입력)....
  170. pObj->EVEHICLE->IsDownload = false;
  171. pObj->EVEHICLE->IsEVechFirst = false;
  172. }
  173. if (!pObj->EVEHICLE->IsOcurr) {
  174. pObj->EVEHICLE->IsDownload = false;
  175. pObj->EVEHICLE->IsEVechFirst = false;
  176. }
  177. pObj->EVEHICLE->IsOcurr = true;
  178. pObj->EVEHICLE->dtOcurr = Now();
  179. pObj->EVEHICLE->IsEnd = false;
  180. AnsiString SRVC_ID = pADO->FieldByName("SRVC_ID")->AsString;
  181. int IXR_CNT = pADO->FieldByName("IXR_CNT")->AsInteger;
  182. VMS_EVEHICLE_INFO *pEvt = pObj->EVEHICLE;
  183. if (pEvt->Count >= VMS_MAX_EVEHICLE)
  184. {
  185. MERROR("VMS EVehicle Occr Count Over: %s, %d", pObj->CTLR_NMBR.c_str(), pEvt->Count);
  186. continue;
  187. }
  188. pEvt->Unit[pEvt->Count].SRVC_ID = SRVC_ID;
  189. pEvt->Unit[pEvt->Count].IXR_CNT = IXR_CNT;
  190. pEvt->Unit[pEvt->Count].SRVC_TM = Now().FormatString("yyyyMMddhhnnss");
  191. pEvt->Unit[pEvt->Count].END_YN = "N";
  192. pEvt->Count++;
  193. nSelCnt++;
  194. }
  195. }
  196. catch(EDatabaseError &E)
  197. {
  198. DBERROR(String(E.ClassName()), E.Message, sQry);
  199. return -1;
  200. }
  201. catch(Exception &e)
  202. {
  203. DBERROR(String(e.ClassName()), e.Message, sQry);
  204. return -1;
  205. }
  206. }
  207. __finally
  208. {
  209. SQLFree(pADO);
  210. }
  211. /*
  212. * 모든 VMS에 대해서 긴급차량우선신호 메시지 표출여부를 체크한다.
  213. */
  214. nSelCnt = 0;
  215. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  216. {
  217. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  218. if (pObj->Server.useFlag != use_enable) continue;
  219. if (pObj->EVEHICLE->Count > 0) {
  220. if (pObj->EVEHICLE->IsDownload) {
  221. // 이미 다운로드 하였음.
  222. MINFO(" INF-.DATA: %25.25s: EVehicle Ing-Message ..Already Download. %s, Ocurr(%d), End(%d), TM(%d), ACommand(%d)", __MYFUNC__,
  223. pObj->CTLR_NMBR.c_str(), pObj->EVEHICLE->IsOcurr ? 1 : 0, pObj->EVEHICLE->IsEnd ? 1: 0, COMM_TimeDiff(pObj->EVEHICLE->dtOcurr), ACommand);
  224. }
  225. else {
  226. if (!pObj->EVEHICLE->IsEVechFirst || (pObj->Server.commState == comm_open)) {
  227. // 다운로드 하지 못하였는데 통신상태가 정상인 경우 다운로드 재실행
  228. nSelCnt++;
  229. }
  230. MINFO(" INF-.DATA: %25.25s: EVehicle Ing-Message ....First Download. %s, Ocurr(%d), End(%d), TM(%d), ACommand(%d)", __MYFUNC__,
  231. pObj->CTLR_NMBR.c_str(), pObj->EVEHICLE->IsOcurr ? 1 : 0, pObj->EVEHICLE->IsEnd ? 1: 0, COMM_TimeDiff(pObj->EVEHICLE->dtOcurr),ACommand);
  232. }
  233. continue;
  234. }
  235. if (pObj->EVEHICLE->Count == 0) {
  236. if (pObj->EVEHICLE->IsEnd) {
  237. if (COMM_TimeDiff(pObj->EVEHICLE->dtOcurr) > 60) {
  238. // 운영종료 메시지 표출 완료
  239. pObj->EVEHICLE->IsOcurr = false;
  240. pObj->EVEHICLE->IsEnd = false;
  241. nSelCnt++;
  242. MINFO(" INF-.DATA: %25.25s: EVehicle End-Message ..END. %s, Ocurr(%d), End(%d), TM(%d), ACommand(%d)", __MYFUNC__,
  243. pObj->CTLR_NMBR.c_str(), pObj->EVEHICLE->IsOcurr ? 1 : 0, pObj->EVEHICLE->IsEnd ? 1: 0, COMM_TimeDiff(pObj->EVEHICLE->dtOcurr), ACommand);
  244. }
  245. }
  246. if (pObj->EVEHICLE->IsOcurr) {
  247. pObj->EVEHICLE->dtOcurr = Now();
  248. pObj->EVEHICLE->IsOcurr = false;
  249. pObj->EVEHICLE->IsEnd = true;
  250. pObj->EVEHICLE->IsDownload = false;
  251. pObj->EVEHICLE->IsEVechFirst = false;
  252. nSelCnt++;
  253. MINFO(" INF-.DATA: %25.25s: EVehicle End-Message START. %s, Ocurr(%d), End(%d), TM(%d), ACommand(%d)", __MYFUNC__,
  254. pObj->CTLR_NMBR.c_str(), pObj->EVEHICLE->IsOcurr ? 1 : 0, pObj->EVEHICLE->IsEnd ? 1: 0, COMM_TimeDiff(pObj->EVEHICLE->dtOcurr), ACommand);
  255. }
  256. }
  257. }
  258. if (0)
  259. {
  260. CtlrItr it;
  261. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  262. {
  263. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  264. if (!pObj->Used) continue;
  265. MDEBUG(" INF-.DATA: %25.25s: EVehicle Message. %s, %d EA.", __MYFUNC__, pObj->CTLR_NMBR.c_str(), pObj->EVEHICLE->Count);
  266. }
  267. }
  268. MINFO(" INF-.DATA: %25.25s: EVehicle. ACommand(%s), %d EA.", __MYFUNC__, (ACommand == dbm_check_evehicle_alarm) ? "CHECK" : "CYCLE", nSelCnt);
  269. SELEND(nSelCnt, dwTick);
  270. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  271. TIMEDELAY(nSelCnt, dwTick);
  272. }
  273. return nSelCnt;
  274. }
  275. //---------------------------------------------------------------------------
  276. int TCDSManager::LoadVmsEventOccrInf(TADOConnection *ADbConn)
  277. {
  278. AnsiString sQry;
  279. int nSelCnt = 0;
  280. TADOQuery *pADO = NULL;
  281. DWORD dwTick = GetTickCount();
  282. SELSTART;
  283. sQry = "SELECT V.VMS_CTLR_NMBR, V.LINK_ID, V.IFSC_ID, V.VMS_IFSC_ID, \r\n"
  284. " V.VMS_IFSC_NM, V.DSPL_STRT_NODE_NM, V.DSPL_END_NODE_NM, \r\n"
  285. " V.DETR_ID, V.DSPL_PRRT, I.INCD_OCRR_ID, I.STRT_LCTN_NM, \r\n"
  286. " V.ROAD_NM, V.SPOT_NM, \r\n"
  287. " I.END_LCTN_NM, I.OCRR_LCTN_NM, I.INCD_TITL, \r\n"
  288. " (SELECT CMMN_CD_KOR_NM \r\n"
  289. " FROM TB_CMMN_CD \r\n"
  290. " WHERE CMMN_CD = I.VMS_INCD_TYPE_CD \r\n"
  291. " AND CMMN_CLSF_CD = 'VIT') AS VMS_INCD_TYPE_NM, \r\n"
  292. " I.VMS_INCD_TYPE_CD, \r\n"
  293. " CASE WHEN I.VMS_INCD_TYPE_CD = 'VIT1' THEN \r\n"
  294. " (SELECT CMMN_CD_KOR_NM \r\n"
  295. " FROM TB_CMMN_CD \r\n"
  296. " WHERE CMMN_CD = I.VMS_INCD_DETL_TYPE_CD \r\n"
  297. " AND CMMN_CLSF_CD = 'IDT') \r\n"
  298. " ELSE \r\n"
  299. " (SELECT CMMN_CD_KOR_NM \r\n"
  300. " FROM TB_CMMN_CD \r\n"
  301. " WHERE CMMN_CD = I.VMS_INCD_DETL_TYPE_CD \r\n"
  302. " AND CMMN_CLSF_CD = 'EDT') \r\n"
  303. " END AS VMS_INCD_DETL_NM, \r\n"
  304. " I.VMS_INCD_DETL_TYPE_CD, \r\n"
  305. " (SELECT CMMN_CD_KOR_NM \r\n"
  306. " FROM TB_CMMN_CD \r\n"
  307. " WHERE CMMN_CD = I.CMTR_GRAD_CD \r\n"
  308. " AND CMMN_CLSF_CD = 'LTCU') AS CMTR_GRAD_NM, \r\n"
  309. #if 0
  310. " (SELECT CMMN_CD_KOR_NM \r\n"
  311. " FROM TB_CMMN_CD \r\n"
  312. " WHERE CMMN_CD = I.CMTR_GRAD_CD \r\n"
  313. " AND CMMN_CLSF_CD = 'LTC') AS CMTR_GRAD_NM, \r\n"
  314. #endif
  315. #if 0
  316. " I.VMS_INCD_RSTR_TYPE_CD, \r\n"
  317. " (SELECT CMMN_CD_KOR_NM \r\n"
  318. " FROM TB_CMMN_CD \r\n"
  319. " WHERE CMMN_CD = I.VMS_INCD_RSTR_TYPE_CD \r\n"
  320. " AND CMMN_CLSF_CD = 'VRT') AS VMS_INCD_RSTR_TYPE_NM, \r\n"
  321. #endif
  322. " I.CMTR_GRAD_CD, \r\n"
  323. " I.INCD_CLSR_LANE, \r\n"
  324. " I.INCD_STRT_DT, \r\n"
  325. " I.INCD_END_PRAR_DT \r\n"
  326. " FROM (SELECT D.VMS_CTLR_NMBR, A.LINK_ID, \r\n"
  327. " A.IFSC_ID, B.VMS_IFSC_ID, \r\n"
  328. " C.VMS_IFSC_NM, \r\n"
  329. " C.DSPL_STRT_NODE_NM, \r\n"
  330. " C.DSPL_END_NODE_NM, \r\n"
  331. " NVL(C.DETR_ID, 0) AS DETR_ID, \r\n"
  332. " C.ROAD_NM, C.SPOT_NM, \r\n"
  333. " D.DSPL_PRRT \r\n"
  334. " FROM TB_IFSC_RLTN_LINK A, \r\n"
  335. " TB_VMS_IFSC_RLTN_IFSC B, \r\n"
  336. " TB_VMS_IFSC C, \r\n"
  337. " TB_VMS_RLTN_IFSC D \r\n"
  338. " WHERE A.IFSC_ID = B.IFSC_ID \r\n"
  339. " AND B.VMS_IFSC_ID = C.VMS_IFSC_ID \r\n"
  340. " AND C.VMS_IFSC_ID = D.VMS_IFSC_ID ) V, \r\n"
  341. " (SELECT A.*, B.INCD_TITL \r\n"
  342. " FROM TB_INCD_OCRR_VMS A, \r\n"
  343. " TB_INCD_OCRR B \r\n"
  344. " WHERE A.INCD_PRGR_STEP_CD = 'ISS2' \r\n"
  345. " AND A.VMS_DSPL_YN = 'Y' \r\n"
  346. " AND A.INCD_OCRR_ID = B.INCD_OCRR_ID \r\n"
  347. " AND A.INCD_END_PRAR_DT > TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') \r\n"
  348. " AND A.VMS_INCD_TYPE_CD IN ('VIT1', 'VIT2') ) I \r\n"
  349. " WHERE V.LINK_ID = I.LINK_ID \r\n"
  350. " ORDER BY V.VMS_CTLR_NMBR \r\n";
  351. try
  352. {
  353. pADO = new TADOQuery(NULL);
  354. pADO->Connection = ADbConn;
  355. try
  356. {
  357. SQLText(pADO, sQry, false);
  358. SQLOpen(pADO);
  359. int nIdx;
  360. for( ; !pADO->Eof; pADO->Next())
  361. {
  362. AnsiString sVmsNmbr = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
  363. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(sVmsNmbr);
  364. if (!pObj) continue;
  365. if (!pObj->FProvide) continue;
  366. AnsiString VMS_INCD_TYPE_CD = pADO->FieldByName("VMS_INCD_TYPE_CD")->AsString;
  367. AnsiString INCD_OCRR_ID = pADO->FieldByName("INCD_OCRR_ID")->AsString;
  368. VMS_EVENT_INFO *pEvt;
  369. if (VMS_INCD_TYPE_CD == "VIT1")
  370. {
  371. //사고
  372. if (pObj->INCIDENT->Count >= VMS_MAX_EVENT)
  373. {
  374. MERROR("VMS Incident Over: %s, %d", pObj->CTLR_NMBR.c_str(), pObj->INCIDENT->Count);
  375. continue;
  376. }
  377. bool bDup = false;
  378. for (int ii = 0; ii < pObj->INCIDENT->Count; ii++)
  379. {
  380. if (INCD_OCRR_ID == pObj->INCIDENT->Unit[ii].INCD_OCRR_ID)
  381. {
  382. bDup = true;
  383. break;
  384. }
  385. }
  386. if (bDup)
  387. {
  388. MERROR("VMS Incident dup: %s, %s", pObj->CTLR_NMBR.c_str(), INCD_OCRR_ID.c_str());
  389. continue;
  390. }
  391. nIdx = pObj->INCIDENT->Count;
  392. pEvt = pObj->INCIDENT;
  393. }
  394. else
  395. {
  396. //공사/행사
  397. if (pObj->EVENT->Count >= VMS_MAX_EVENT)
  398. {
  399. MERROR("VMS Event Over: %s, %d", pObj->CTLR_NMBR.c_str(), pObj->EVENT->Count);
  400. continue;
  401. }
  402. bool bDup = false;
  403. for (int ii = 0; ii < pObj->EVENT->Count; ii++)
  404. {
  405. if (INCD_OCRR_ID == pObj->EVENT->Unit[ii].INCD_OCRR_ID)
  406. {
  407. bDup = true;
  408. break;
  409. }
  410. }
  411. if (bDup)
  412. {
  413. MERROR("VMS Event dup: %s, %s", pObj->CTLR_NMBR.c_str(), INCD_OCRR_ID.c_str());
  414. continue;
  415. }
  416. nIdx = pObj->EVENT->Count;
  417. pEvt = pObj->EVENT;
  418. }
  419. pEvt->Unit[nIdx].LINK_ID = pADO->FieldByName("LINK_ID")->AsString;
  420. pEvt->Unit[nIdx].IFSC_ID = pADO->FieldByName("IFSC_ID")->AsString;
  421. pEvt->Unit[nIdx].VMS_IFSC_ID = pADO->FieldByName("VMS_IFSC_ID")->AsString;
  422. pEvt->Unit[nIdx].VMS_IFSC_NM = pADO->FieldByName("VMS_IFSC_NM")->AsString;
  423. pEvt->Unit[nIdx].DSPL_STRT_NODE_NM = pADO->FieldByName("DSPL_STRT_NODE_NM")->AsString;
  424. pEvt->Unit[nIdx].DSPL_END_NODE_NM = pADO->FieldByName("DSPL_END_NODE_NM")->AsString;
  425. pEvt->Unit[nIdx].DETR_ID = pADO->FieldByName("DETR_ID")->AsString.Trim();
  426. pEvt->Unit[nIdx].DSPL_PRRT = pADO->FieldByName("DSPL_PRRT")->AsString;
  427. pEvt->Unit[nIdx].INCD_OCRR_ID = INCD_OCRR_ID;
  428. pEvt->Unit[nIdx].STRT_LCTN_NM = pADO->FieldByName("STRT_LCTN_NM")->AsString;
  429. pEvt->Unit[nIdx].END_LCTN_NM = pADO->FieldByName("END_LCTN_NM")->AsString;
  430. if (pEvt->Unit[nIdx].STRT_LCTN_NM == "")
  431. {
  432. pEvt->Unit[nIdx].STRT_LCTN_NM = pEvt->Unit[nIdx].DSPL_STRT_NODE_NM;
  433. }
  434. if (pEvt->Unit[nIdx].END_LCTN_NM == "")
  435. {
  436. pEvt->Unit[nIdx].END_LCTN_NM = pEvt->Unit[nIdx].DSPL_END_NODE_NM;
  437. }
  438. pEvt->Unit[nIdx].OCRR_LCTN_NM = pADO->FieldByName("OCRR_LCTN_NM")->AsString;
  439. pEvt->Unit[nIdx].VMS_INCD_TYPE_NM = pADO->FieldByName("VMS_INCD_TYPE_NM")->AsString;
  440. pEvt->Unit[nIdx].VMS_INCD_TYPE_CD = pADO->FieldByName("VMS_INCD_TYPE_CD")->AsString;
  441. pEvt->Unit[nIdx].VMS_INCD_DETL_NM = pADO->FieldByName("VMS_INCD_DETL_NM")->AsString;
  442. pEvt->Unit[nIdx].VMS_INCD_DETL_TYPE_CD = pADO->FieldByName("VMS_INCD_DETL_TYPE_CD")->AsString;
  443. pEvt->Unit[nIdx].CMTR_GRAD_NM = pADO->FieldByName("CMTR_GRAD_NM")->AsString;
  444. pEvt->Unit[nIdx].CMTR_GRAD_CD = pADO->FieldByName("CMTR_GRAD_CD")->AsString;
  445. pEvt->Unit[nIdx].INCD_CLSR_LANE = pADO->FieldByName("INCD_CLSR_LANE")->AsString;
  446. pEvt->Unit[nIdx].INCD_STRT_DT = pADO->FieldByName("INCD_STRT_DT")->AsString;
  447. pEvt->Unit[nIdx].INCD_END_PRAR_DT = pADO->FieldByName("INCD_END_PRAR_DT")->AsString;
  448. pEvt->Unit[nIdx].ROAD_NM = pADO->FieldByName("ROAD_NM")->AsString;
  449. pEvt->Unit[nIdx].SPOT_NM = pADO->FieldByName("SPOT_NM")->AsString;
  450. #if 0
  451. pEvt->Unit[nIdx].VMS_INCD_RSTR_TYPE_CD = pADO->FieldByName("VMS_INCD_RSTR_TYPE_CD")->AsString;
  452. pEvt->Unit[nIdx].VMS_INCD_RSTR_TYPE_NM = pADO->FieldByName("VMS_INCD_RSTR_TYPE_NM")->AsString;
  453. #else
  454. pEvt->Unit[nIdx].VMS_INCD_RSTR_TYPE_CD = "X";
  455. pEvt->Unit[nIdx].VMS_INCD_RSTR_TYPE_NM = "주의요망";
  456. #endif
  457. pEvt->Unit[nIdx].INCD_TITL = pADO->FieldByName("INCD_TITL")->AsString;
  458. pEvt->Count++;
  459. nSelCnt++;
  460. }
  461. }
  462. catch(EDatabaseError &E)
  463. {
  464. DBERROR(String(E.ClassName()), E.Message, sQry);
  465. return -1;
  466. }
  467. catch(Exception &e)
  468. {
  469. DBERROR(String(e.ClassName()), e.Message, sQry);
  470. return -1;
  471. }
  472. }
  473. __finally
  474. {
  475. SQLFree(pADO);
  476. }
  477. if (0)
  478. {
  479. CtlrItr it;
  480. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  481. {
  482. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  483. if (!pObj->Used) continue;
  484. MDEBUG("VMS Event(I/E): %s, %d/%d EA.", pObj->CTLR_NMBR.c_str(), pObj->INCIDENT->Count, pObj->EVENT->Count);
  485. }
  486. }
  487. SELEND(nSelCnt, dwTick);
  488. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  489. TIMEDELAY(nSelCnt, dwTick);
  490. }
  491. return nSelCnt;
  492. }
  493. //---------------------------------------------------------------------------
  494. int TCDSManager::LoadVmsScheduleInfo(TADOConnection *ADbConn)
  495. {
  496. AnsiString sQry;
  497. int nSelCnt = 0;
  498. TADOQuery *pADO = NULL;
  499. DWORD dwTick = GetTickCount();
  500. SELSTART;
  501. sQry = "SELECT * \r\n"
  502. " FROM ( \r\n"
  503. " SELECT B.*, C.VMS_FORM_TYPE_CD, \r\n"
  504. " C.VMS_FORM_DSPL_DRCT_CD AS VMS_FORM_SUB_TYPE_CD, \r\n"
  505. " SUBSTR(DECODE(TO_CHAR(SYSDATE, 'D'), '1', B.SCH_WEEK1, \r\n"
  506. " '2', B.SCH_WEEK2, \r\n"
  507. " '3', B.SCH_WEEK3, \r\n"
  508. " '4', B.SCH_WEEK4, \r\n"
  509. " '5', B.SCH_WEEK5, \r\n"
  510. " '6', B.SCH_WEEK6, \r\n"
  511. " B.SCH_WEEK7), \r\n"
  512. " TO_NUMBER(TO_CHAR(SYSDATE, 'HH24'))+1, 1) AS SCH_YN \r\n"
  513. " FROM TB_VMS_CTLR A, \r\n"
  514. " TB_VMS_DSPL_SCH B, \r\n"
  515. " TB_VMS_FORM C \r\n"
  516. " WHERE A.DEL_YN = 'N' \r\n"
  517. " AND B.USE_YN = 'Y' \r\n"
  518. " AND C.VALID_YN = 'Y' \r\n"
  519. " AND A.VMS_CTLR_NMBR = B.VMS_CTLR_NMBR \r\n"
  520. " AND A.OPER_MODE = B.VMS_SCH_TYPE \r\n"
  521. " AND B.VMS_FORM_ID = C.VMS_FORM_ID \r\n"
  522. " AND TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') BETWEEN \r\n"
  523. " B.DSPL_STRT_HH AND B.DSPL_END_HH \r\n"
  524. " ) \r\n"
  525. " WHERE SCH_YN = '1' \r\n"
  526. " ORDER BY VMS_CTLR_NMBR ASC, PHASE ASC \r\n";
  527. TCDSForm *pCDSForm;
  528. //VMS_FORM_DSPL_DRCT_CD
  529. try
  530. {
  531. pADO = new TADOQuery(NULL);
  532. pADO->Connection = ADbConn;
  533. try
  534. {
  535. SQLText(pADO, sQry, false);
  536. SQLOpen(pADO);
  537. int nIdx;
  538. AnsiString VMS_SCH_TYPE; //VARCHAR2(5) N VMS 스케줄 유형(A:자동,F:고정,B:기본)
  539. int VMS_SCH_FORM_TYPE; //NUMBER(3) N VMS 폼 스케쥴 유형(0:교통,1:돌발,2:공사행사,3:홍보,4:우회,5:정체,6:안전,7:동영상,8:스트리밍영상)
  540. int PHASE; //NUMBER(2) N PHASE
  541. AnsiString VMS_FORM_ID; //NUMBER(5) Y VMS FORM ID
  542. int DSPL_HH; //NUMBER(3) Y 0 표출 시간
  543. AnsiString DSPL_STRT_HH; //VARCHAR2(14) N 표출시작시간
  544. AnsiString DSPL_END_HH; //VARCHAR2(14) N 표출종료시간
  545. AnsiString SYMB_LIB_NMBR; //NUMBER(4) Y 0 동영상인 경우 동영상 파일 심벌 아이디
  546. AnsiString STRM_ADDR; //VARCHAR2(60) Y 스트리밍인경우 스트리밍 주소
  547. bool bBottomTraffic;
  548. TCDSIfsc *pCDSIfsc;
  549. int nBottomTrafficCnt;
  550. int nFigureTrafficCnt; //////////////////////// 20200515 추가함
  551. int nFigureDisplayTm; //////////////////////// 20200515 추가함
  552. String FIGURE_VMS_IFSC_ID; //////////////////////// 20200515 추가함
  553. bool DSPL_CNGS_YN;
  554. AnsiString FRST_VMS_IFSC_ID; //NUMBER(10) Y 1단 VMS 정보제공구간 ID
  555. AnsiString SECD_VMS_IFSC_ID; //NUMBER(10) Y 2단 VMS 정보제공구간 ID
  556. AnsiString THIR_VMS_IFSC_ID; //NUMBER(10) Y 3단 VMS 정보제공구간 ID
  557. AnsiString FOUR_VMS_IFSC_ID; //NUMBER(10) Y 4단 VMS 정보제공구간 ID
  558. AnsiString FRST_IMG_IFSC_ID; //NUMBER(10) Y 1단 이미지 정보제공구간 ID
  559. AnsiString SECD_IMG_IFSC_ID; //NUMBER(10) Y 2단 이미지 정보제공구간 ID
  560. AnsiString THIR_IMG_IFSC_ID; //NUMBER(10) Y 3단 이미지 정보제공구간 ID
  561. AnsiString FOUR_IMG_IFSC_ID; //NUMBER(10) Y 4단 이미지 정보제공구간 ID
  562. for( ; !pADO->Eof; pADO->Next())
  563. {
  564. AnsiString VMS_CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
  565. //VMS 스케줄 유형(A:자동,F:고정,B:기본)
  566. VMS_SCH_TYPE = pADO->FieldByName("VMS_SCH_TYPE")->AsString;
  567. //VMS 폼 스케쥴 유형(0:교통, 1:돌발,2:공사행사, 3:홍보, 4:우회, 5:정체, 6:안전, 7:동영상, 8:스트리밍영상)
  568. VMS_SCH_FORM_TYPE = pADO->FieldByName("VMS_SCH_FORM_TYPE")->AsInteger;
  569. PHASE = pADO->FieldByName("PHASE")->AsInteger;
  570. VMS_FORM_ID = pADO->FieldByName("VMS_FORM_ID")->AsString.Trim();
  571. DSPL_HH = pADO->FieldByName("DSPL_HH")->AsInteger;
  572. DSPL_STRT_HH = pADO->FieldByName("DSPL_STRT_HH")->AsString.Trim();
  573. DSPL_END_HH = pADO->FieldByName("DSPL_END_HH")->AsString.Trim();
  574. SYMB_LIB_NMBR = pADO->FieldByName("SYMB_LIB_NMBR")->AsString.Trim();
  575. STRM_ADDR = pADO->FieldByName("STRM_ADDR")->AsString.Trim();
  576. DSPL_CNGS_YN = pADO->FieldByName("DSPL_CNGS_YN")->AsString.Trim() == "Y" ? true : false;
  577. FRST_VMS_IFSC_ID = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString.Trim();
  578. SECD_VMS_IFSC_ID = pADO->FieldByName("SECD_VMS_IFSC_ID")->AsString.Trim();
  579. THIR_VMS_IFSC_ID = pADO->FieldByName("THIR_VMS_IFSC_ID")->AsString.Trim();
  580. FOUR_VMS_IFSC_ID = pADO->FieldByName("FOUR_VMS_IFSC_ID")->AsString.Trim();
  581. FRST_IMG_IFSC_ID = FRST_VMS_IFSC_ID;//pADO->FieldByName("FRST_IMG_IFSC_ID")->AsString;
  582. SECD_IMG_IFSC_ID = SECD_VMS_IFSC_ID;//pADO->FieldByName("SECD_IMG_IFSC_ID")->AsString;
  583. THIR_IMG_IFSC_ID = THIR_VMS_IFSC_ID;//pADO->FieldByName("THIR_IMG_IFSC_ID")->AsString;
  584. FOUR_IMG_IFSC_ID = FOUR_VMS_IFSC_ID;//pADO->FieldByName("FOUR_IMG_IFSC_ID")->AsString;
  585. if (VMS_SCH_FORM_TYPE < eSchTp_traffic ||
  586. VMS_SCH_FORM_TYPE >= eSchTp_max)
  587. {
  588. MERROR("LoadVmsScheduleInfo: Unknown Form Type: VmsNmbr(%s), FormId(%s), FormScheduleType(%d)", VMS_CTLR_NMBR.c_str(), VMS_FORM_ID.c_str(), VMS_SCH_FORM_TYPE);
  589. continue;
  590. }
  591. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(VMS_CTLR_NMBR);
  592. if (!pObj)
  593. {
  594. MERROR("LoadVmsScheduleInfo: Not Found VMS: VmsNmbr(%s)", VMS_CTLR_NMBR.c_str());
  595. continue;
  596. }
  597. if (!pObj->FProvide)
  598. {
  599. //제공하지 않아도 돼는 VMS - mode change로 호출하는 경우임.
  600. continue;
  601. }
  602. pCDSForm = CDSFormManager->FLists.Find(VMS_FORM_ID);
  603. if (!pCDSForm)
  604. {
  605. MERROR("LoadVmsScheduleInfo: VMS Schedule Not Found Form: VmsNmbr(%s)-[%s]", VMS_CTLR_NMBR.c_str(), VMS_FORM_ID.c_str());
  606. continue;
  607. }
  608. if (pObj->SCHEDULE->Count >= VMS_MAX_SCHEDULE)
  609. {
  610. MERROR("LoadVmsScheduleInfo: VMS Schedule Count Over: %s, %d", VMS_CTLR_NMBR.c_str(), pObj->SCHEDULE->Count);
  611. continue;
  612. }
  613. //TODO: 조회정렬은 기본,고정,자동(돌발,공사,행사,우회,교통,정체폼) 순으로 조회된다.
  614. // 따라서 각 폼에 대한처리를 수행하면 된다.
  615. //==> 신규작업에서 폼 표출 우선순위적용함 ==> 조회정렬이 영향이 있는지 확인해야함.
  616. //eFormTp_traf_1 = 11, // 소통상황(1단)
  617. //eFormTp_traf_2 = 12, // 소통상황(2단)
  618. //eFormTp_traf_3 = 13, // 소통상황(3단)
  619. //eFormTp_traf_4 = 14, // 소통상황(4단)
  620. bool isIncidentForm = false;
  621. if (VMS_SCH_FORM_TYPE == eSchTp_traffic && pCDSForm->VMS_FORM_TYPE_CD == eFormTp_traf_1)
  622. {
  623. //교통정보스케쥴이고 폼의 유형이 소통정보(1단) 인경우....
  624. //해당 폼이 돌발이나 이벤트가 등록되어 있다면
  625. //폼을 생성하지 않는다.
  626. AnsiString FRST_VMS_IFSC_ID = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
  627. if (FRST_VMS_IFSC_ID != "" && FRST_VMS_IFSC_ID != "0")
  628. {
  629. for (int ii = 0; ii < pObj->SCHEDULE->Count && ii < VMS_MAX_SCHEDULE; ii++)
  630. {
  631. if (pObj->SCHEDULE->Unit[ii].VMS_SCH_FORM_TYPE == eSchTp_incident || //돌발
  632. pObj->SCHEDULE->Unit[ii].VMS_SCH_FORM_TYPE == eSchTp_gongsa || //공사/행사
  633. pObj->SCHEDULE->Unit[ii].VMS_SCH_FORM_TYPE == eSchTp_deture ) //우회
  634. {
  635. if (pObj->SCHEDULE->Unit[ii].EVENT)
  636. {
  637. if (FRST_VMS_IFSC_ID == pObj->SCHEDULE->Unit[ii].EVENT->VMS_IFSC_ID)
  638. {
  639. //폼을 생성하지 않는다.
  640. // TODO: 상위 순회루틴으로 빠져나가지 않음.
  641. isIncidentForm = true;
  642. break;
  643. //continue;
  644. }
  645. }
  646. }
  647. }
  648. }
  649. }
  650. if (isIncidentForm) {
  651. continue;
  652. }
  653. bBottomTraffic = false;
  654. nFigureDisplayTm = DSPL_HH;
  655. FIGURE_VMS_IFSC_ID = "";
  656. nFigureTrafficCnt = 0; //전체 표출할 하단 소통정보 갯수
  657. switch(VMS_SCH_FORM_TYPE)
  658. {
  659. case eSchTp_traffic: //교통정보
  660. //도형식 소통정보 인 경우 해당 도형의 소통정보가 존재하는지 확인
  661. if (pCDSForm->VMS_FORM_TYPE_CD == eFormtp_figure)
  662. {
  663. bool bTraffic = false;
  664. TCDSImage *pBakTrfImg = CDSImageManager->FLists.Find(pCDSForm->TrfBakImgId);
  665. if (pBakTrfImg)
  666. {
  667. FOR_STL(TCDSImageCell*, pCell, pBakTrfImg->FLists)
  668. {
  669. TCDSIfsc *pTmpIfsc1 = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  670. if (pTmpIfsc1)
  671. {
  672. if (pTmpIfsc1->CMTR_GRAD_CD != "0")
  673. {
  674. FIGURE_VMS_IFSC_ID = pCell->VMS_IFSC_ID; // 하단에 표출할 정보가 없을 경우 첫번째 제공구간을 표출하기 위함. 20200515 추가함
  675. bTraffic = true; //소통정보가 하나라도 존재함
  676. break;
  677. }
  678. }
  679. }
  680. }
  681. /////////////////////////////////////////////////////// TODO 20200528 ==> 민간정보 연계에서 정보가 수집되지 않는 경우 가 종종 있어서
  682. /////////////////////////////////////////////////////// 도형식 소통정보를 채우지 못한다.
  683. /////////////////////////////////////////////////////// 결측구간이 3구간 이상이면 도형식 소통정보 표출하지 말자
  684. if (bTraffic)
  685. {
  686. int nMissingCnt = 0;
  687. TCDSIfsc *pTmpIfsc1;
  688. FOR_STL(TCDSImageCell*, pCell, pBakTrfImg->FLists)
  689. {
  690. if (pCell->IsDup) continue; //중복 VMS_IFSC_ID 인 경우 skip...
  691. pTmpIfsc1 = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  692. if (pTmpIfsc1)
  693. {
  694. if (pTmpIfsc1->CMTR_GRAD_CD == "0")
  695. {
  696. nMissingCnt++;
  697. }
  698. }
  699. }
  700. if (nMissingCnt >= 3)
  701. {
  702. bTraffic == false;
  703. MERROR("LoadVmsScheduleInfo: VMS Figure IFSC Traffic Missing count over: VmsNmbr(%s)-[%s], %d EA Missing", VMS_CTLR_NMBR.c_str(), VMS_FORM_ID.c_str(), nMissingCnt);
  704. }
  705. }
  706. if (bTraffic == false)
  707. {
  708. //도형식 구간의 모든 소통정보가 생성되지 않았음===> 가공서버가 죽었거나 수집되지 않았음.
  709. //표출할 내용이 없음==> skip 해야함
  710. MERROR("LoadVmsScheduleInfo: VMS Figure IFSC Traffic Failed: VmsNmbr(%s)-[%s]", VMS_CTLR_NMBR.c_str(), VMS_FORM_ID.c_str());
  711. continue;
  712. }
  713. }
  714. //도형식 소통정보 폼일때 하단에 정보제공구간 소통정보를 표출해야 하는 경우
  715. if (pCDSForm->VMS_FORM_TYPE_CD == eFormtp_figure && pCDSForm->TrfIfsc)
  716. {
  717. //도형식 VMS인 경우 하단에 소통정보를 표출하는 경우 다중폼이 생성됨
  718. //제공구간소통정보가 정체, 지체인 경우만 하단 소통정보를 표출함
  719. //도형식 배경셀에 등록된 구간에 대해서 표출하도록함
  720. TCDSImage *pBakTrfImg = CDSImageManager->FLists.Find(pCDSForm->TrfBakImgId);
  721. if (pBakTrfImg)
  722. {
  723. TCDSIfsc *pTmpIfsc1;
  724. //정체구간 갯수 확인
  725. FOR_STL(TCDSImageCell*, pCell, pBakTrfImg->FLists)
  726. {
  727. if (pCell->IsDup) continue; //중복 VMS_IFSC_ID 인 경우 skip...
  728. pTmpIfsc1 = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  729. if (pTmpIfsc1)
  730. {
  731. if (pTmpIfsc1->CMTR_GRAD_CD == "3")
  732. {
  733. bBottomTraffic = true; //도형식배경소통정보의 셀내의 구간정보 소통정보가 하나라도 있으면
  734. //도형식 소통정보를 표출함
  735. nFigureTrafficCnt++;
  736. //break;
  737. }
  738. }
  739. }
  740. //지체(서행)구간 갯수 확인
  741. FOR_STL(TCDSImageCell*, pCell, pBakTrfImg->FLists)
  742. {
  743. if (pCell->IsDup) continue; //중복 VMS_IFSC_ID 인 경우 skip...
  744. pTmpIfsc1 = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  745. if (pTmpIfsc1)
  746. {
  747. if (pTmpIfsc1->CMTR_GRAD_CD == "2")
  748. {
  749. bBottomTraffic = true; //도형식배경소통정보의 셀내의 구간정보 소통정보가 하나라도 있으면
  750. //도형식 소통정보를 표출함
  751. nFigureTrafficCnt++;
  752. //break;
  753. }
  754. }
  755. }
  756. //////////////////////// 20200515 추가함(S)
  757. if (FIGURE_VMS_IFSC_ID != "" && bBottomTraffic == false)
  758. {
  759. //소통정보는 존재하지만 지체, 정체가 없는 경우 하단 소통정보를 표출못하게 된다.
  760. //만일 하단 고정문자가 존재하는 경우 하단 고정문자를 표출하면 되지만
  761. //고정문자가 존재하기 않으면 하단에 표출할 정보가 없으므로 첫번째 구간의 정보를 표출하도록 한다.
  762. if (pCDSForm->TrfFixed == false)
  763. {
  764. bBottomTraffic = true; //첫번째 소통정보가 표출되도록 함
  765. nFigureTrafficCnt++;
  766. }
  767. }
  768. //////////////////////// 20200515 추가함(E)
  769. }
  770. }
  771. //도형식 소통정보 폼일때 하단에 VMS 축 소통정보를 표출해야 하는 경우
  772. if (pCDSForm->VMS_FORM_TYPE_CD == eFormtp_figure && pCDSForm->TrfAxis)
  773. {
  774. //도형식 VMS인 경우 하단에 소통정보를 표출하는 경우 다중폼이 생성됨
  775. //축 소통정보인 경우 모든 축에 대해 소통정보를 표출, 최대 표출설정값이 설정된 경우 설정값만큼만 표출되게 수정(20200515)
  776. FOR_STL(TVmsIfsc*, pIfsc, pObj->FIfscLists)
  777. {
  778. if (!pIfsc->IsUsed) continue;
  779. pCDSIfsc = CDSIfscManager->FLists.Find(pIfsc->VMS_IFSC_ID);
  780. if (!pCDSIfsc) continue;
  781. if (pCDSIfsc->AXIS_YN != "Y") continue;
  782. if (pCDSIfsc->CMTR_GRAD_CD != "0")
  783. {
  784. if (FIGURE_VMS_IFSC_ID == "")
  785. {
  786. FIGURE_VMS_IFSC_ID = pIfsc->VMS_IFSC_ID; // 하단에 표출할 정보가 없을 경우 첫번째 제공구간을 표출하기 위함. 20200515 추가함
  787. }
  788. bBottomTraffic = true;
  789. nFigureTrafficCnt++;
  790. //break;
  791. }
  792. }
  793. //////////////////////// 20200515 추가함(S)
  794. if (FIGURE_VMS_IFSC_ID != "" && bBottomTraffic == false)
  795. {
  796. //소통정보는 존재하지만 지체, 정체가 없는 경우 하단 소통정보를 표출못하게 된다.
  797. //만일 하단 고정문자가 존재하는 경우 하단 고정문자를 표출하면 되지만
  798. //고정문자가 존재하기 않으면 하단에 표출할 정보가 없으므로 첫번째 구간의 정보를 표출하도록 한다.
  799. if (pCDSForm->TrfFixed == false)
  800. {
  801. bBottomTraffic = true; //첫번째 소통정보가 표출되도록 함
  802. nFigureTrafficCnt++;
  803. }
  804. }
  805. //////////////////////// 20200515 추가함(E)
  806. }
  807. //////////////////////// 20200515 추가함(S)
  808. if (bBottomTraffic && g_AppCfg.BottomTrafficMaxCnt > 0)
  809. {
  810. //하단소통정보를 일정갯수만 표출하는 경우 표출할 소통정보가 설정값보다 크면 설정값으로 맞춘다.
  811. if (nFigureTrafficCnt > g_AppCfg.BottomTrafficMaxCnt)
  812. {
  813. nFigureTrafficCnt = g_AppCfg.BottomTrafficMaxCnt;
  814. }
  815. if (g_AppCfg.BottomTrafficCycle > 0)
  816. {
  817. int nTm = nFigureDisplayTm / nFigureTrafficCnt;
  818. if (nTm < g_AppCfg.BottomTrafficCycle)
  819. {
  820. //표출할 시간이 설정값보다 작으로 설정값으로 표출시각을 설정
  821. nFigureDisplayTm = g_AppCfg.BottomTrafficCycle;
  822. }
  823. else
  824. {
  825. nFigureDisplayTm = nTm; // 설정값보다 크면 계산된 값을 표출시각으로 설정
  826. }
  827. }
  828. }
  829. //////////////////////// 20200515 추가함(E)
  830. nBottomTrafficCnt = 0;
  831. if (bBottomTraffic)
  832. {
  833. //도형식 다중 소통정보 표출인 경우
  834. //하단소통정보를 표출하는경우 정체, 지체 순으로 표출
  835. if (pCDSForm->TrfIfsc)
  836. {
  837. //정보제공구간 소통정보 순환표출(정체)
  838. //도형식 배경셀에 등록된 구간에 대해서 표출하도록함
  839. TCDSImage *pBakTrfImg1 = CDSImageManager->FLists.Find(pCDSForm->TrfBakImgId);
  840. if (pBakTrfImg1)
  841. {
  842. FOR_STL(TCDSImageCell*, pCell, pBakTrfImg1->FLists)
  843. {
  844. if (pCell->IsDup) continue; //중복 VMS_IFSC_ID 인 경우 skip...
  845. TCDSIfsc *pTmpIfsc1 = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  846. if (!pTmpIfsc1) continue;
  847. if (pTmpIfsc1->CMTR_GRAD_CD != "3") continue;
  848. nIdx = pObj->SCHEDULE->Count;
  849. if (nIdx < VMS_MAX_SCHEDULE)
  850. {
  851. nIdx = pObj->SCHEDULE->Count;
  852. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  853. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  854. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  855. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  856. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = pCell->VMS_IFSC_ID;
  857. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  858. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  859. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  860. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  861. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  862. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  863. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  864. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = nFigureDisplayTm; //도형식폼이 실제로 표출될 시간
  865. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pCell->VMS_IFSC_ID; //하단 제공구간 ID
  866. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  867. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  868. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  869. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  870. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  871. pObj->SCHEDULE->Count++;
  872. nSelCnt++;
  873. nBottomTrafficCnt++;
  874. if (g_AppCfg.BottomTrafficMaxCnt > 0 && nBottomTrafficCnt >= g_AppCfg.BottomTrafficMaxCnt)
  875. {
  876. break;
  877. }
  878. }
  879. }
  880. }
  881. //정보제공구간 소통정보 순환표출(지체)
  882. //도형식 배경셀에 등록된 구간에 대해서 표출
  883. TCDSImage *pBakTrfImg2 = CDSImageManager->FLists.Find(pCDSForm->TrfBakImgId);
  884. if (pBakTrfImg2)
  885. {
  886. FOR_STL(TCDSImageCell*, pCell, pBakTrfImg2->FLists)
  887. {
  888. if (pCell->IsDup) continue; //중복 VMS_IFSC_ID 인 경우 skip...
  889. TCDSIfsc *pTmpIfsc1 = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  890. if (!pTmpIfsc1) continue;
  891. if (pTmpIfsc1->CMTR_GRAD_CD != "2") continue;
  892. if (g_AppCfg.BottomTrafficMaxCnt > 0 && nBottomTrafficCnt >= g_AppCfg.BottomTrafficMaxCnt)
  893. {
  894. break;
  895. }
  896. nIdx = pObj->SCHEDULE->Count;
  897. if (nIdx < VMS_MAX_SCHEDULE)
  898. {
  899. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  900. nIdx = pObj->SCHEDULE->Count;
  901. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  902. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  903. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  904. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = pCell->VMS_IFSC_ID;
  905. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = "";
  906. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = "";
  907. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = "";
  908. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = nFigureDisplayTm; //도형식폼이 실제로 표출될 시간
  909. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pCell->VMS_IFSC_ID; //하단 제공구간 ID
  910. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  911. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  912. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  913. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  914. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  915. pObj->SCHEDULE->Count++;
  916. nSelCnt++;
  917. nBottomTrafficCnt++;
  918. }
  919. }
  920. }
  921. //////////////////////// 20200515 추가함(S)
  922. if (nBottomTrafficCnt == 0)
  923. {
  924. //소통정보가 모두 소통원활이고 하단고정문자표출도 없는 경우 첫번째 정보제공구간의 소통정보를 표출하도록 한다.
  925. nIdx = pObj->SCHEDULE->Count;
  926. if (nIdx < VMS_MAX_SCHEDULE)
  927. {
  928. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  929. nIdx = pObj->SCHEDULE->Count;
  930. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  931. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  932. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  933. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FIGURE_VMS_IFSC_ID;
  934. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = "";
  935. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = "";
  936. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = "";
  937. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = nFigureDisplayTm; //도형식폼이 실제로 표출될 시간
  938. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = FIGURE_VMS_IFSC_ID; //하단 제공구간 ID
  939. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  940. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  941. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  942. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  943. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  944. pObj->SCHEDULE->Count++;
  945. nSelCnt++;
  946. nBottomTrafficCnt++;
  947. }
  948. }
  949. //////////////////////// 20200515 추가함(E)
  950. } //도형식배경소통정보 처리 완료
  951. if (pCDSForm->TrfAxis)
  952. {
  953. //축소통정보 순환표출
  954. FOR_STL(TVmsIfsc*, pIfsc, pObj->FIfscLists)
  955. {
  956. if (!pIfsc->IsUsed) continue;
  957. pCDSIfsc = CDSIfscManager->FLists.Find(pIfsc->VMS_IFSC_ID);
  958. if (!pCDSIfsc) continue;
  959. if (pCDSIfsc->AXIS_YN != "Y") continue;
  960. if (pCDSIfsc->CMTR_GRAD_CD == "0") continue;
  961. nIdx = pObj->SCHEDULE->Count;
  962. if (nIdx < VMS_MAX_SCHEDULE)
  963. {
  964. nIdx = pObj->SCHEDULE->Count;
  965. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  966. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  967. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  968. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  969. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  970. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  971. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  972. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  973. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  974. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  975. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  976. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  977. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = nFigureDisplayTm; //도형식폼이 실제로 표출될 시간
  978. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pIfsc->VMS_IFSC_ID; //하단 제공구간 ID
  979. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  980. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  981. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  982. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  983. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  984. pObj->SCHEDULE->Count++;
  985. nSelCnt++;
  986. nBottomTrafficCnt++;
  987. if (g_AppCfg.BottomTrafficMaxCnt > 0 && nBottomTrafficCnt >= g_AppCfg.BottomTrafficMaxCnt)
  988. {
  989. break;
  990. }
  991. }
  992. }
  993. //////////////////////// 20200515 추가함(S)
  994. if (nBottomTrafficCnt == 0)
  995. {
  996. //소통정보가 모두 소통원활이고 하단고정문자표출도 없는 경우 첫번째 VMS축의 소통정보를 표출하도록 한다.
  997. nIdx = pObj->SCHEDULE->Count;
  998. if (nIdx < VMS_MAX_SCHEDULE)
  999. {
  1000. nIdx = pObj->SCHEDULE->Count;
  1001. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1002. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1003. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1004. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1005. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FIGURE_VMS_IFSC_ID;
  1006. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = FIGURE_VMS_IFSC_ID;
  1007. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = FIGURE_VMS_IFSC_ID;
  1008. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FIGURE_VMS_IFSC_ID;
  1009. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  1010. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  1011. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  1012. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  1013. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = nFigureDisplayTm; //도형식폼이 실제로 표출될 시간
  1014. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = FIGURE_VMS_IFSC_ID; //하단 제공구간 ID
  1015. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1016. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1017. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1018. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1019. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1020. pObj->SCHEDULE->Count++;
  1021. nSelCnt++;
  1022. nBottomTrafficCnt++;
  1023. }
  1024. }
  1025. //////////////////////// 20200515 추가함(E)
  1026. }
  1027. }
  1028. else
  1029. {
  1030. //도형식 다중표출이 아닌경우(하단소통정보가 없는 경우)
  1031. nIdx = pObj->SCHEDULE->Count;
  1032. if (nIdx < VMS_MAX_SCHEDULE)
  1033. {
  1034. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1035. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1036. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1037. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1038. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  1039. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  1040. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  1041. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  1042. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  1043. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  1044. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  1045. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  1046. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1047. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1048. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1049. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1050. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1051. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1052. pObj->SCHEDULE->Count++;
  1053. nSelCnt++;
  1054. }
  1055. }
  1056. break;
  1057. case eSchTp_incident: //돌발
  1058. //돌발 스케줄인 경우 해당 VMS에 발생한 모든 돌발 정보를 표출하도록 스케줄 추가
  1059. for (int ii = 0; ii < pObj->INCIDENT->Count; ii++)
  1060. {
  1061. nIdx = pObj->SCHEDULE->Count;
  1062. if (nIdx < VMS_MAX_SCHEDULE)
  1063. {
  1064. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1065. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1066. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1067. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1068. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  1069. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  1070. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  1071. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  1072. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  1073. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  1074. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  1075. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  1076. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1077. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pObj->INCIDENT->Unit[ii].VMS_IFSC_ID;
  1078. pObj->SCHEDULE->Unit[nIdx].EVENT = &pObj->INCIDENT->Unit[ii];
  1079. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1080. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1081. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1082. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1083. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1084. pObj->SCHEDULE->Count++;
  1085. nSelCnt++;
  1086. }
  1087. }
  1088. break;
  1089. case eSchTp_gongsa: //공사/행사문안
  1090. //공사/행사 스케줄인 경우 해당 VMS에 발생한 모든 돌발 정보를 표출하도록 스케줄 추가
  1091. for (int ii = 0; ii < pObj->EVENT->Count; ii++)
  1092. {
  1093. nIdx = pObj->SCHEDULE->Count;
  1094. if (nIdx < VMS_MAX_SCHEDULE)
  1095. {
  1096. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1097. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1098. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1099. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1100. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  1101. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  1102. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  1103. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  1104. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  1105. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  1106. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  1107. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  1108. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1109. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pObj->EVENT->Unit[ii].VMS_IFSC_ID;
  1110. pObj->SCHEDULE->Unit[nIdx].EVENT = &pObj->EVENT->Unit[ii];
  1111. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1112. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1113. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1114. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1115. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1116. pObj->SCHEDULE->Count++;
  1117. nSelCnt++;
  1118. }
  1119. }
  1120. break;
  1121. case eSchTp_hongbo: //홍보
  1122. nIdx = pObj->SCHEDULE->Count;
  1123. if (nIdx < VMS_MAX_SCHEDULE)
  1124. {
  1125. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1126. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1127. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1128. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1129. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  1130. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  1131. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  1132. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  1133. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  1134. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  1135. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  1136. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  1137. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1138. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1139. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1140. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1141. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1142. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1143. pObj->SCHEDULE->Count++;
  1144. nSelCnt++;
  1145. }
  1146. break;
  1147. case eSchTp_deture: //우회도로
  1148. //돌발발생한 구간중 우회도로 구간이 있는경우
  1149. for (int ii = 0; ii < pObj->INCIDENT->Count; ii++)
  1150. {
  1151. if (pObj->INCIDENT->Unit[ii].DETR_ID == "0") continue;
  1152. nIdx = pObj->SCHEDULE->Count;
  1153. if (nIdx < VMS_MAX_SCHEDULE)
  1154. {
  1155. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1156. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1157. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1158. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1159. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  1160. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  1161. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  1162. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  1163. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  1164. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  1165. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  1166. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  1167. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1168. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pObj->INCIDENT->Unit[ii].VMS_IFSC_ID;
  1169. pObj->SCHEDULE->Unit[nIdx].EVENT = &pObj->INCIDENT->Unit[ii];
  1170. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1171. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1172. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1173. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1174. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1175. pObj->SCHEDULE->Count++;
  1176. nSelCnt++;
  1177. }
  1178. }
  1179. //공사/행사 발생한 구간중 우회도로 구간이 있는경우
  1180. for (int ii = 0; ii < pObj->EVENT->Count; ii++)
  1181. {
  1182. if (pObj->EVENT->Unit[ii].DETR_ID == "0") continue;
  1183. nIdx = pObj->SCHEDULE->Count;
  1184. if (nIdx < VMS_MAX_SCHEDULE)
  1185. {
  1186. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1187. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1188. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1189. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1190. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  1191. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  1192. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  1193. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  1194. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  1195. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  1196. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  1197. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  1198. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1199. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pObj->EVENT->Unit[ii].VMS_IFSC_ID;
  1200. pObj->SCHEDULE->Unit[nIdx].EVENT = &pObj->EVENT->Unit[ii];
  1201. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1202. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1203. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1204. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1205. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1206. pObj->SCHEDULE->Count++;
  1207. nSelCnt++;
  1208. }
  1209. }
  1210. break;
  1211. case eSchTp_congest: //정체상황
  1212. {
  1213. //VMS에 설정된 모든 정체구간판정구간에 대하여 정체 판정
  1214. int nCngsCnt = 0;
  1215. FOR_STL(TVmsIfsc*, pCngs, pObj->FIfscLists)
  1216. {
  1217. if (!pCngs->IsUsed) continue;
  1218. if (!pCngs->CNGS_CNFM_YN) continue; //정체판정이 아닌경우
  1219. if (pCngs->CNGST_CNT < g_AppCfg.CngsContCnt) continue; //설정되어 있는 정체판정 횟수보다 작으면 정체아님
  1220. //정체판정된 정체폼 생성
  1221. //스케쥴갯수를 초과하지 않으면 폼 스케쥴추가
  1222. nIdx = pObj->SCHEDULE->Count;
  1223. if (nIdx < VMS_MAX_SCHEDULE && nCngsCnt <= pObj->FMaxCngsForm)
  1224. {
  1225. pObj->FExistCngsForm = true; // TODO: 해당 제어기에 정체폼이 존재하는지를 플래그 설정
  1226. // 다른 폼들은 정체폼이 존재할때 표출할지 여부가 결정됨
  1227. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1228. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1229. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1230. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1231. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = pCngs->VMS_IFSC_ID;
  1232. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = "";
  1233. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = "";
  1234. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = "";
  1235. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = "";
  1236. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = "";
  1237. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = "";
  1238. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = "";
  1239. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1240. pObj->SCHEDULE->Unit[nIdx].VMS_IFSC_ID = pCngs->VMS_IFSC_ID;
  1241. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1242. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1243. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1244. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1245. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1246. pObj->SCHEDULE->Count++;
  1247. nSelCnt++;
  1248. }
  1249. }
  1250. }
  1251. break;
  1252. case eSchTp_video: //동영상
  1253. case eSchTp_stream: //스트리밍영상
  1254. nIdx = pObj->SCHEDULE->Count;
  1255. if (nIdx < VMS_MAX_SCHEDULE)
  1256. {
  1257. //동영상명칭이나 스트리밍주소가 설정되지 않은 것은 표출하지 않는다.
  1258. if ( (VMS_SCH_FORM_TYPE == eSchTp_video && SYMB_LIB_NMBR != "" && SYMB_LIB_NMBR != "200" && STRM_ADDR != "") ||
  1259. (VMS_SCH_FORM_TYPE == eSchTp_stream && SYMB_LIB_NMBR != "" && SYMB_LIB_NMBR == "300" && STRM_ADDR != "") )
  1260. {
  1261. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1262. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1263. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1264. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1265. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  1266. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  1267. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  1268. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  1269. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  1270. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  1271. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  1272. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  1273. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1274. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1275. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1276. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1277. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1278. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1279. pObj->SCHEDULE->Count++;
  1280. nSelCnt++;
  1281. }
  1282. }
  1283. break;
  1284. case eSchTp_atmp: //9:대기환경
  1285. {
  1286. AnsiString ATMP_STTN_NMBR = "";
  1287. bool isAtmp = false;
  1288. if (CDSAtmpManager)
  1289. {
  1290. FOR_STL(TCDSFormObj*, pTmpObj, pCDSForm->FLists)
  1291. {
  1292. if (pTmpObj->VMS_FORM_OBJECT_TYPE_CD >= 401 && pTmpObj->VMS_FORM_OBJECT_TYPE_CD <= 413)
  1293. {
  1294. ATMP_STTN_NMBR = pTmpObj->VMS_IFSC_ID;
  1295. TCDSAtmp *pAtmp = CDSAtmpManager->FLists.Find(pTmpObj->VMS_IFSC_ID);
  1296. if (pAtmp && pAtmp->SUCCESS)
  1297. {
  1298. isAtmp = true;
  1299. break;
  1300. }
  1301. }
  1302. }
  1303. }
  1304. if (isAtmp == false)
  1305. {
  1306. //폼에 속한 대기환경의 모든 정보가 유효하지 않는 경우 폼을 생성하지 않는다.
  1307. MERROR("LoadVmsScheduleInfo: VMS ATMP Failed: VmsNmbr(%s)-[%s]", VMS_CTLR_NMBR.c_str(), VMS_FORM_ID.c_str());
  1308. break;
  1309. }
  1310. nIdx = pObj->SCHEDULE->Count;
  1311. if (nIdx < VMS_MAX_SCHEDULE)
  1312. {
  1313. #if 0
  1314. AnsiString ATMP_STTN_NMBR = pADO->FieldByName("FRST_VMS_IFSC_ID")->AsString;
  1315. TCDSAtmp *pAtmpObj = CDSAtmpManager->FLists.Find(ATMP_STTN_NMBR);
  1316. if (!pAtmpObj) break;
  1317. if (pAtmpObj->SUCCESS == false)
  1318. {
  1319. MERROR("LoadVmsScheduleInfo: 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());
  1320. break;
  1321. }
  1322. #endif
  1323. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1324. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1325. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1326. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1327. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = ATMP_STTN_NMBR;
  1328. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = "";
  1329. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = "";
  1330. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = "";
  1331. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = "";
  1332. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = "";
  1333. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = "";
  1334. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = "";
  1335. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1336. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1337. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1338. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1339. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1340. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1341. pObj->SCHEDULE->Count++;
  1342. nSelCnt++;
  1343. }
  1344. }
  1345. break;
  1346. case eSchTp_park: //10:주차정보
  1347. {
  1348. bool isParkingForm = false;
  1349. FOR_STL(TCDSFormObj*, pTmpObj, pCDSForm->FLists)
  1350. {
  1351. if (pTmpObj->VMS_FORM_OBJECT_TYPE_CD == 101 ||
  1352. pTmpObj->VMS_FORM_OBJECT_TYPE_CD == 102 ||
  1353. pTmpObj->VMS_FORM_OBJECT_TYPE_CD == 103 ||
  1354. pTmpObj->VMS_FORM_OBJECT_TYPE_CD == 104)
  1355. {
  1356. TCDSPark *pPark = NULL;
  1357. if (CDSParkManager) {
  1358. pPark = CDSParkManager->FLists.Find(pTmpObj->VMS_IFSC_ID); //주차장아이디로 주차장정보를 찾음
  1359. }
  1360. if (pPark && pPark->SUCCESS)
  1361. {
  1362. isParkingForm = true;
  1363. break;
  1364. }
  1365. }
  1366. }
  1367. if (isParkingForm == false)
  1368. {
  1369. //폼에 속한 주차장의 모든 정보가 유효하지 않는 경우 폼을 생성하지 않는다.
  1370. MERROR("LoadVmsScheduleInfo: VMS PARKING Failed: VmsNmbr(%s)-[%s]", VMS_CTLR_NMBR.c_str(), VMS_FORM_ID.c_str());
  1371. break;
  1372. }
  1373. nIdx = pObj->SCHEDULE->Count;
  1374. if (nIdx < VMS_MAX_SCHEDULE)
  1375. {
  1376. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1377. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1378. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1379. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1380. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = "";
  1381. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = "";
  1382. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = "";
  1383. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = "";
  1384. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = "";
  1385. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = "";
  1386. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = "";
  1387. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = "";
  1388. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1389. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1390. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1391. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1392. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1393. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1394. pObj->SCHEDULE->Count++;
  1395. nSelCnt++;
  1396. }
  1397. }
  1398. break;
  1399. case eSchTp_evehicle: //11:긴급차량우선신호
  1400. if (pCDSForm->VMS_FORM_DSPL_DRCT_CD == 0) {
  1401. pObj->IsEVehIngForm = true; // 긴급차량
  1402. }
  1403. else {
  1404. pObj->IsEVehEndForm = true;
  1405. DSPL_HH = 60; // 운영종료 메시지는 기타 메시지와 함께 내려보낸다.
  1406. }
  1407. nIdx = pObj->SCHEDULE->Count;
  1408. if (nIdx < VMS_MAX_SCHEDULE)
  1409. {
  1410. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_TYPE = VMS_SCH_TYPE;
  1411. pObj->SCHEDULE->Unit[nIdx].VMS_SCH_FORM_TYPE = VMS_SCH_FORM_TYPE;
  1412. pObj->SCHEDULE->Unit[nIdx].PHASE = PHASE;
  1413. pObj->SCHEDULE->Unit[nIdx].VMS_FORM_ID = VMS_FORM_ID;
  1414. pObj->SCHEDULE->Unit[nIdx].FRST_VMS_IFSC_ID = FRST_VMS_IFSC_ID;
  1415. pObj->SCHEDULE->Unit[nIdx].SECD_VMS_IFSC_ID = SECD_VMS_IFSC_ID;
  1416. pObj->SCHEDULE->Unit[nIdx].THIR_VMS_IFSC_ID = THIR_VMS_IFSC_ID;
  1417. pObj->SCHEDULE->Unit[nIdx].FOUR_VMS_IFSC_ID = FOUR_VMS_IFSC_ID;
  1418. pObj->SCHEDULE->Unit[nIdx].FRST_IMG_IFSC_ID = FRST_IMG_IFSC_ID;
  1419. pObj->SCHEDULE->Unit[nIdx].SECD_IMG_IFSC_ID = SECD_IMG_IFSC_ID;
  1420. pObj->SCHEDULE->Unit[nIdx].THIR_IMG_IFSC_ID = THIR_IMG_IFSC_ID;
  1421. pObj->SCHEDULE->Unit[nIdx].FOUR_IMG_IFSC_ID = FOUR_IMG_IFSC_ID;
  1422. pObj->SCHEDULE->Unit[nIdx].DSPL_HH = DSPL_HH;
  1423. pObj->SCHEDULE->Unit[nIdx].DSPL_STRT_HH = DSPL_STRT_HH;
  1424. pObj->SCHEDULE->Unit[nIdx].DSPL_END_HH = DSPL_END_HH;
  1425. pObj->SCHEDULE->Unit[nIdx].SYMB_LIB_NMBR = SYMB_LIB_NMBR;
  1426. pObj->SCHEDULE->Unit[nIdx].STRM_ADDR = STRM_ADDR;
  1427. pObj->SCHEDULE->Unit[nIdx].DSPL_CNGS_YN = DSPL_CNGS_YN;
  1428. pObj->SCHEDULE->Count++;
  1429. nSelCnt++;
  1430. }
  1431. break;
  1432. }
  1433. }
  1434. }
  1435. catch(EDatabaseError &E)
  1436. {
  1437. DBERROR(String(E.ClassName()), E.Message, sQry);
  1438. return -1;
  1439. }
  1440. catch(Exception &e)
  1441. {
  1442. DBERROR(String(e.ClassName()), e.Message, sQry);
  1443. return -1;
  1444. }
  1445. }
  1446. __finally
  1447. {
  1448. SQLFree(pADO);
  1449. }
  1450. if (0)
  1451. {
  1452. CtlrItr it;
  1453. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1454. {
  1455. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1456. if (!pObj->Used) continue;
  1457. MDEBUG("LoadVmsScheduleInfo: VMS Schedule: %s, %d EA.", pObj->CTLR_NMBR.c_str(), pObj->SCHEDULE->Count);
  1458. }
  1459. }
  1460. SELEND(nSelCnt, dwTick);
  1461. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  1462. TIMEDELAY(nSelCnt, dwTick);
  1463. }
  1464. return nSelCnt;
  1465. }
  1466. //---------------------------------------------------------------------------
  1467. int TCDSManager::LoadVmsOperationMode(TADOConnection *ADbConn)
  1468. {
  1469. AnsiString sQry;
  1470. int nSelCnt = 0;
  1471. TADOQuery *pADO = NULL;
  1472. DWORD dwTick = GetTickCount();
  1473. SELSTART;
  1474. sQry = "SELECT A.VMS_CTLR_NMBR, A.OPER_MODE, \r\n"
  1475. " NVL(A.VMS_MAX_PHSE_NUM, 16) AS VMS_MAX_PHSE_NUM \r\n"
  1476. " FROM TB_VMS_CTLR A \r\n"
  1477. " WHERE A.DEL_YN = 'N' \r\n";
  1478. try
  1479. {
  1480. pADO = new TADOQuery(NULL);
  1481. pADO->Connection = ADbConn;
  1482. try
  1483. {
  1484. SQLText(pADO, sQry, false);
  1485. SQLOpen(pADO);
  1486. for( ; !pADO->Eof; pADO->Next())
  1487. {
  1488. AnsiString VMS_CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsString;
  1489. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(VMS_CTLR_NMBR);
  1490. if (!pObj) continue;
  1491. pObj->OPER_MODE = pADO->FieldByName("OPER_MODE")->AsString.Trim();
  1492. int nMaxFormCnt = pADO->FieldByName("VMS_MAX_PHSE_NUM")->AsInteger;
  1493. if (pObj->OPER_MODE != "A" && pObj->OPER_MODE != "F" && pObj->OPER_MODE != "B")
  1494. {
  1495. pObj->OPER_MODE = "A";
  1496. }
  1497. if (pObj->OPER_MODE == "A")
  1498. pObj->DSTATE.OprMode = 'A';
  1499. else
  1500. if (pObj->OPER_MODE == "B")
  1501. pObj->DSTATE.OprMode = 'B';
  1502. else
  1503. pObj->DSTATE.OprMode = 'F';
  1504. if (pObj->CTRLMODE->Control == pObj->DSTATE.OprMode)
  1505. pObj->FModeChange = false;
  1506. else
  1507. pObj->FModeChange = true;
  1508. pObj->CTRLMODE->Control = pObj->DSTATE.OprMode;
  1509. pObj->RSTATE.OprMode = pObj->CTRLMODE->Control;
  1510. //pObj->VMS_MAX_PHSE_NUM = INT_VMS_MAX_FORM; //nMaxFormCnt;
  1511. if (pObj->VMS_MAX_PHSE_NUM > INT_VMS_MAX_FORM)
  1512. pObj->VMS_MAX_PHSE_NUM = INT_VMS_MAX_FORM;
  1513. pObj->CTRLMODE->MaxDisplayForm = pObj->VMS_MAX_PHSE_NUM;
  1514. #if 0
  1515. if (pObj->CTRLMODE->MaxDisplayForm > INT_MAX_VMS_FORM)
  1516. pObj->CTRLMODE->MaxDisplayForm = INT_MAX_VMS_FORM;
  1517. #endif
  1518. //VMS별 정체폼갯수를 제한하는 경우 여기에서 처리하도록 하자
  1519. pObj->FMaxCngsForm = VMS_MAX_CNGS_FORM; //현재는 디폴트, 즉 모든정보 생성
  1520. nSelCnt++;
  1521. }
  1522. }
  1523. catch(EDatabaseError &E)
  1524. {
  1525. DBERROR(String(E.ClassName()), E.Message, sQry);
  1526. return -1;
  1527. }
  1528. catch(Exception &e)
  1529. {
  1530. DBERROR(String(e.ClassName()), e.Message, sQry);
  1531. return -1;
  1532. }
  1533. }
  1534. __finally
  1535. {
  1536. SQLFree(pADO);
  1537. }
  1538. SELEND(nSelCnt, dwTick);
  1539. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  1540. TIMEDELAY(nSelCnt, dwTick);
  1541. }
  1542. return nSelCnt;
  1543. }
  1544. //---------------------------------------------------------------------------
  1545. int TCDSManager::InitVmsDsplPrst(TADOConnection *ADbConn)
  1546. {
  1547. int nSelCnt = 0;
  1548. AnsiString sQry;
  1549. TADOQuery *pADO = NULL;
  1550. DWORD dwTick = GetTickCount();
  1551. INSSTART;
  1552. sQry = "INSERT INTO TB_VMS_DSPL_PRST(VMS_CTLR_NMBR, PHASE, DSPL_DT, DNLD_YN) \r\n"
  1553. "SELECT VMS_CTLR_NMBR, PHASE, DSPL_DT, DNLD_YN \r\n"
  1554. " FROM (SELECT A.VMS_CTLR_NMBR, B.ORD AS PHASE, '19700101000000' AS DSPL_DT, 'N' AS DNLD_YN \r\n"
  1555. " FROM TB_VMS_CTLR A, \r\n"
  1556. " (SELECT LEVEL AS ORD FROM DUAL CONNECT BY LEVEL < 11) B \r\n"
  1557. " ) X \r\n"
  1558. " WHERE (VMS_CTLR_NMBR, PHASE) NOT IN (SELECT VMS_CTLR_NMBR, PHASE FROM TB_VMS_DSPL_PRST) \r\n"
  1559. " ORDER BY VMS_CTLR_NMBR, PHASE \r\n";
  1560. try
  1561. {
  1562. pADO = new TADOQuery(NULL);
  1563. pADO->Connection = ADbConn;
  1564. try
  1565. {
  1566. SQLText(pADO, sQry, false);
  1567. nSelCnt = SQLExec(pADO);
  1568. }
  1569. catch(EDatabaseError &E)
  1570. {
  1571. DBERROR(String(E.ClassName()), E.Message, sQry);
  1572. return -1;
  1573. }
  1574. catch(Exception &e)
  1575. {
  1576. DBERROR(String(e.ClassName()), e.Message, sQry);
  1577. return -1;
  1578. }
  1579. }
  1580. __finally
  1581. {
  1582. SQLFree(pADO);
  1583. }
  1584. INSEND(nSelCnt, dwTick);
  1585. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  1586. TIMEDELAY(nSelCnt, dwTick);
  1587. }
  1588. return nSelCnt;
  1589. }
  1590. //---------------------------------------------------------------------------
  1591. int TCDSManager::UpdateVmsProvideResult(TADOConnection *ADbConn, void *ACtlrObj)
  1592. {
  1593. int nSelCnt = 0;
  1594. AnsiString sQry;
  1595. TADOQuery *pADO = NULL;
  1596. int nFormCnt = 0;
  1597. TCDSCtlr* AObj = (TCDSCtlr*)ACtlrObj;
  1598. if (!AObj) return VERR_MEMORY_ALLOC;
  1599. DWORD dwTick = GetTickCount();
  1600. UPDSTART;
  1601. sQry = "UPDATE TB_VMS_DSPL_PRST "
  1602. " SET DSPL_DT = :p03, "
  1603. " DNLD_YN = :p04 "
  1604. " WHERE VMS_CTLR_NMBR = :p01 "
  1605. " AND PHASE <= :p02 ";
  1606. int VMS_CTLR_NMBR;
  1607. int PHASE;
  1608. String DSPL_DT;
  1609. String DNLD_YN;
  1610. try
  1611. {
  1612. nFormCnt = AObj->pForms->Count();
  1613. if (nFormCnt == 0) return VERR_NONE;
  1614. if (nFormCnt > MAX_VMS_SCENARIO_FORM) {
  1615. MINFO(" INF-ERROR: %25.25s: %s, Form Count Over: %d/%d EA.", __MYFUNC__, AObj->CTLR_NMBR.c_str(), nFormCnt, MAX_VMS_SCENARIO_FORM);
  1616. nFormCnt = MAX_VMS_SCENARIO_FORM;
  1617. }
  1618. pADO = new TADOQuery(NULL);
  1619. pADO->Connection = ADbConn;
  1620. VMS_CTLR_NMBR = AObj->CTLR_NMBR.ToIntDef(0);
  1621. PHASE = nFormCnt;
  1622. DSPL_DT = AObj->CTRLMODE->SvcDate;
  1623. DNLD_YN = AObj->CTRLMODE->Result ? "Y" : "N";
  1624. if (DNLD_YN == "Y" && (AObj->EVEHICLE->IsOcurr || AObj->EVEHICLE->IsEnd)) {
  1625. AObj->EVEHICLE->IsDownload = true;
  1626. AObj->EVEHICLE->dtDownload = Now();
  1627. }
  1628. try
  1629. {
  1630. SQLText(pADO, sQry, false);
  1631. SQLBind(pADO, "p01", VMS_CTLR_NMBR);
  1632. SQLBind(pADO, "p02", PHASE);
  1633. SQLBind(pADO, "p03", DSPL_DT);
  1634. SQLBind(pADO, "p04", DNLD_YN);
  1635. nSelCnt = SQLExec(pADO);
  1636. }
  1637. catch(EDatabaseError &E)
  1638. {
  1639. DBERROR(String(E.ClassName()), E.Message, sQry);
  1640. return -1;
  1641. }
  1642. catch(Exception &e)
  1643. {
  1644. DBERROR(String(e.ClassName()), e.Message, sQry);
  1645. return -1;
  1646. }
  1647. UPDEND(nSelCnt, dwTick);
  1648. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  1649. TIMEDELAY(nSelCnt, dwTick);
  1650. }
  1651. if (AObj->DSPL_DT == DSPL_DT)
  1652. {
  1653. MWARN(" INF-.DATA: %25.25s: %s, %d EA [%s], Already HS Insert.[%s][%d]", __MYFUNC__,
  1654. AObj->CTLR_NMBR.c_str(), nFormCnt, AnsiString(DNLD_YN).c_str(), AnsiString(AObj->DSPL_DT).c_str(), AObj->PHASE);
  1655. return nSelCnt;
  1656. }
  1657. if (AObj->EVEHICLE->IsOcurr || AObj->EVEHICLE->IsEnd) {
  1658. AObj->EVEHICLE->IsEVechFirst = true;
  1659. }
  1660. int nInsCnt = 0;
  1661. dwTick = GetTickCount();
  1662. INSSTART;
  1663. // 이력 저장--제공시각이 동일한게 이력으로 저장될수 있기때문에 트랜잭션을 다시시작한다.
  1664. // 이전 VMS인 경우 임...
  1665. sQry = "INSERT INTO TB_VMS_DSPL_HS \r\n"
  1666. " (DSPL_DT, VMS_CTLR_NMBR, PHASE, \r\n"
  1667. " VMS_SCH_TYPE, VMS_SCH_FORM_TYPE, \r\n"
  1668. " VMS_FORM_ID, DSPL_HH, \r\n"
  1669. " VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT, \r\n"
  1670. " VMS_FORM_DSPL_DRCT_CD, VMS_FORM_DSPL_MTHD_CD, \r\n"
  1671. " DNLD_YN) \r\n"
  1672. " SELECT DSPL_DT, VMS_CTLR_NMBR, PHASE, \r\n"
  1673. " VMS_SCH_TYPE, VMS_SCH_FORM_TYPE, \r\n"
  1674. " VMS_FORM_ID, DSPL_HH, \r\n"
  1675. " VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT, \r\n"
  1676. " VMS_FORM_DSPL_DRCT_CD, VMS_FORM_DSPL_MTHD_CD, \r\n"
  1677. " DNLD_YN \r\n"
  1678. " FROM TB_VMS_DSPL_PRST \r\n"
  1679. " WHERE VMS_CTLR_NMBR = :p01 \r\n"
  1680. " AND DSPL_DT = :p02 \r\n"
  1681. " AND PHASE <= :p03 \r\n";
  1682. try
  1683. {
  1684. SQLText(pADO, sQry, false);
  1685. SQLBind(pADO, "p01", VMS_CTLR_NMBR);
  1686. SQLBind(pADO, "p02", DSPL_DT);
  1687. SQLBind(pADO, "p03", PHASE);
  1688. nInsCnt = SQLExec(pADO);
  1689. nSelCnt += nInsCnt;
  1690. AObj->DSPL_DT = DSPL_DT;
  1691. AObj->PHASE = nFormCnt;
  1692. AObj->CTRLMODE->SaveFlag = true;
  1693. AObj->CTRLMODE->pTimer = Now();
  1694. MINFO(" INF-.DATA: %25.25s: %s, %d EA [%s], HS Insert.[%s][%d]", __MYFUNC__,
  1695. AObj->CTLR_NMBR.c_str(), nFormCnt, AnsiString(DNLD_YN).c_str(), AnsiString(AObj->DSPL_DT).c_str(), AObj->PHASE);
  1696. INSEND(nInsCnt, dwTick);
  1697. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  1698. TIMEDELAY(nInsCnt, dwTick);
  1699. }
  1700. }
  1701. catch(EDatabaseError &E)
  1702. {
  1703. DBERROR(String(E.ClassName()), E.Message, sQry);
  1704. return -1;
  1705. }
  1706. catch(Exception &e)
  1707. {
  1708. DBERROR(String(e.ClassName()), e.Message, sQry);
  1709. return -1;
  1710. }
  1711. }
  1712. __finally
  1713. {
  1714. SQLFree(pADO);
  1715. }
  1716. //MINFO(" INF-.DATA: %25.25s: %s, %d EA [%s]", __MYFUNC__ , AObj->CTLR_NMBR.c_str(), nFormCnt, AnsiString(DNLD_YN).c_str());
  1717. return nSelCnt;
  1718. }
  1719. //---------------------------------------------------------------------------
  1720. int TCDSManager::SaveVmsProvideForm(TADOConnection *ADbConn, void *ACtlrObj)
  1721. {
  1722. // VMS 제공정보 객체 코드
  1723. typedef enum en_vms_object_type
  1724. {
  1725. vms_obj_none, /* 0:정보없음 */
  1726. vms_obj_text, /* 1:문자열 */
  1727. vms_obj_bitmap, /* 2:Bitmap ID */
  1728. vms_obj_draw, /* 3:Draw */
  1729. } EN_VMS_OBJECT_TYPE;
  1730. AnsiString sQry;
  1731. AnsiString uQry;
  1732. TADOQuery *pADO = NULL;
  1733. int nSelCnt = 0;
  1734. TCDSCtlr* AObj = (TCDSCtlr*)ACtlrObj;
  1735. if (!AObj) return VERR_MEMORY_ALLOC;
  1736. int nFormCnt = AObj->pForms->Count();
  1737. if (nFormCnt == 0) return VERR_NONE;
  1738. if (nFormCnt > MAX_VMS_SCENARIO_FORM) {
  1739. MINFO(" INF-ERROR: %25.25s: %s, Form Count Over: %d/%d EA.", __MYFUNC__, AObj->CTLR_NMBR.c_str(), nFormCnt, MAX_VMS_SCENARIO_FORM);
  1740. nFormCnt = MAX_VMS_SCENARIO_FORM;
  1741. }
  1742. DWORD dwTick = GetTickCount();
  1743. UPDSTART;
  1744. MINFO(" INF-START: %25.25s: %s, %d EA.", __MYFUNC__, AObj->CTLR_NMBR.c_str(), nFormCnt);
  1745. if (g_AppCfg.UpdateMode == 0) {
  1746. sQry = "UPDATE TB_VMS_DSPL_PRST "
  1747. " SET DSPL_DT = :p03, "
  1748. " VMS_SCH_TYPE = :p04, "
  1749. " VMS_SCH_FORM_TYPE = :p05, "
  1750. " VMS_FORM_ID = :p06, "
  1751. " DSPL_HH = :p07, "
  1752. " VMS_DSPL_MSG_DATA = :p08, "
  1753. " VMS_DSPL_MSG_TXT = :p09, "
  1754. " VMS_FORM_DSPL_DRCT_CD = :p10, "
  1755. " VMS_FORM_DSPL_MTHD_CD = :p11, "
  1756. " VMS_DSPL_MSG_IMAG = :p12, "
  1757. " DNLD_YN = :p13 "
  1758. " WHERE VMS_CTLR_NMBR = :p01 "
  1759. " AND PHASE = :p02 ";
  1760. }
  1761. else {
  1762. sQry = "MERGE INTO TB_VMS_DSPL_PRST L \r\n"
  1763. "USING (SELECT :p01 AS VMS_CTLR_NMBR, \r\n"
  1764. " :p02 AS PHASE, \r\n"
  1765. " :p03 AS DSPL_DT, \r\n"
  1766. " :p04 AS VMS_SCH_TYPE, \r\n"
  1767. " :p05 AS VMS_SCH_FORM_TYPE, \r\n"
  1768. " :p06 AS VMS_FORM_ID, \r\n"
  1769. " :p07 AS DSPL_HH, \r\n"
  1770. " :p08 AS VMS_DSPL_MSG_DATA, \r\n"
  1771. " :p09 AS VMS_DSPL_MSG_TXT, \r\n"
  1772. " :p10 AS VMS_FORM_DSPL_DRCT_CD, \r\n"
  1773. " :p11 AS VMS_FORM_DSPL_MTHD_CD, \r\n"
  1774. " :p12 AS VMS_DSPL_MSG_IMAG, \r\n"
  1775. " :p13 AS DNLD_YN \r\n"
  1776. " FROM DUAL) M \r\n"
  1777. " ON (L.VMS_CTLR_NMBR = M.VMS_CTLR_NMBR AND L.PHASE = M.PHASE) \r\n"
  1778. "WHEN MATCHED THEN \r\n"
  1779. "UPDATE SET L.DSPL_DT = M.DSPL_DT, \r\n"
  1780. " L.VMS_SCH_TYPE = M.VMS_SCH_TYPE, \r\n"
  1781. " L.VMS_SCH_FORM_TYPE = M.VMS_SCH_FORM_TYPE, \r\n"
  1782. " L.VMS_FORM_ID = M.VMS_FORM_ID, \r\n"
  1783. " L.DSPL_HH = M.DSPL_HH, \r\n"
  1784. " L.VMS_DSPL_MSG_DATA = M.VMS_DSPL_MSG_DATA, \r\n"
  1785. " L.VMS_DSPL_MSG_TXT = M.VMS_DSPL_MSG_TXT, \r\n"
  1786. " L.VMS_FORM_DSPL_DRCT_CD = M.VMS_FORM_DSPL_DRCT_CD, \r\n"
  1787. " L.VMS_FORM_DSPL_MTHD_CD = M.VMS_FORM_DSPL_MTHD_CD, \r\n"
  1788. " L.VMS_DSPL_MSG_IMAG = M.VMS_DSPL_MSG_IMAG, \r\n"
  1789. " L.DNLD_YN = M.DNLD_YN \r\n"
  1790. "WHEN NOT MATCHED THEN \r\n"
  1791. "INSERT (VMS_CTLR_NMBR, PHASE, DSPL_DT, \r\n"
  1792. " VMS_SCH_TYPE, VMS_SCH_FORM_TYPE, \r\n"
  1793. " VMS_FORM_ID, DSPL_HH, \r\n"
  1794. " VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT, \r\n"
  1795. " VMS_FORM_DSPL_DRCT_CD, VMS_FORM_DSPL_MTHD_CD, \r\n"
  1796. " VMS_DSPL_MSG_IMAG, DNLD_YN) \r\n"
  1797. "VALUES (M.VMS_CTLR_NMBR, M.PHASE, M.DSPL_DT, \r\n"
  1798. " M.VMS_SCH_TYPE, M.VMS_SCH_FORM_TYPE, \r\n"
  1799. " M.VMS_FORM_ID, M.DSPL_HH, \r\n"
  1800. " M.VMS_DSPL_MSG_DATA, M.VMS_DSPL_MSG_TXT, \r\n"
  1801. " M.VMS_FORM_DSPL_DRCT_CD, M.VMS_FORM_DSPL_MTHD_CD, \r\n"
  1802. " M.VMS_DSPL_MSG_IMAG, M.DNLD_YN) \r\n";
  1803. }
  1804. try
  1805. {
  1806. pADO = new TADOQuery(NULL);
  1807. pADO->Connection = ADbConn;
  1808. try
  1809. {
  1810. AObj->pForms->Lock();
  1811. SQLText(pADO, sQry, false);
  1812. for (int ii = 0; ii < nFormCnt; ii++)
  1813. {
  1814. TVmsForm *pForm = AObj->pForms->GetItem(ii);
  1815. int VMS_CTLR_NMBR = AObj->CTLR_NMBR.ToIntDef(0);
  1816. int PHASE = ii+1;
  1817. String DSPL_DT = AObj->CTRLMODE->SvcDate;
  1818. int VMS_SCH_TYPE = pForm->VMS_SCH_TYPE.ToIntDef(0);
  1819. int VMS_SCH_FORM_TYPE = pForm->VMS_SCH_FORM_TYPE;
  1820. int VMS_FORM_ID = pForm->VMS_FORM_ID.ToIntDef(0);
  1821. int DSPL_HH = pForm->DSPL_HH;
  1822. String VMS_DSPL_MSG_DATA = "";
  1823. String VMS_DSPL_MSG_TXT = "";
  1824. int VMS_FORM_DSPL_DRCT_CD = pForm->VMS_FORM_DSPL_DRCT_CD.ToIntDef(0);
  1825. int VMS_FORM_DSPL_MTHD_CD = pForm->VMS_FORM_DSPL_MTHD_CD.ToIntDef(0);
  1826. String DNLD_YN = pForm->SvcRes ? "Y" : "N";
  1827. AnsiString sTmp = "";
  1828. AnsiString sCont = "";
  1829. int nObjCnt, nObjType;
  1830. try
  1831. {
  1832. //폼종류/표출시간/배경색상
  1833. sCont.printf("%02X%02X%02X|", pForm->VMS_FORM_TYPE_CD, pForm->DSPL_HH, pForm->VMS_FORM_COLR_CD);
  1834. VMS_DSPL_MSG_DATA += sCont;
  1835. nObjCnt = pForm->Count();
  1836. for (int jj = 0; jj < nObjCnt; jj++)
  1837. {
  1838. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  1839. if (pFormObj->ImageId == "") pFormObj->ImageId = "1"; //이력저장용
  1840. if (pFormObj->TextData == "") pFormObj->TextData = " "; //이력저장용
  1841. switch(pFormObj->ObjectType)
  1842. {
  1843. case 1: //심볼
  1844. case 2: //이미지
  1845. case 167: //@우회소통정보이미지
  1846. case 200: //동영상
  1847. case 300: //스티리밍영상
  1848. case 406: //@통합대기등급 이미지
  1849. case 407: //@미세먼지등급 이미지
  1850. case 408: //@초미세먼지등급 이미지
  1851. case 413: //@오존등급이미지
  1852. nObjType = vms_obj_bitmap;
  1853. sTmp.printf("%02X%04X%04X%02X%04X%04X%s|",
  1854. pFormObj->IsBlinking,
  1855. pFormObj->PosX,
  1856. pFormObj->PosY,
  1857. pFormObj->BkColor,
  1858. pFormObj->Width,
  1859. pFormObj->Height,
  1860. pFormObj->ImageId.c_str());
  1861. sCont.printf("%02X%02X%s", nObjType, sTmp.Length(), sTmp.c_str());
  1862. VMS_DSPL_MSG_DATA += sCont;
  1863. break;
  1864. case 3: //소통정보배경이미지
  1865. case 17: //1단,소통정보이미지1
  1866. case 27: //2단,소통정보이미지2
  1867. case 37: //3단,소통정보이미지3
  1868. case 47: //4단,소통정보이미지4
  1869. {
  1870. nObjType = vms_obj_draw;
  1871. sTmp.printf("%02X%04X%04X%02X%04X%04X%s+",
  1872. pFormObj->IsBlinking,
  1873. pFormObj->PosX,
  1874. pFormObj->PosY,
  1875. pFormObj->BkColor,
  1876. pFormObj->Width,
  1877. pFormObj->Height,
  1878. pFormObj->ImageId.c_str());
  1879. sCont.printf("%02X%02X%s", nObjType, sTmp.Length(), sTmp.c_str());
  1880. VMS_DSPL_MSG_DATA += sCont;
  1881. AnsiString sVertex = "";
  1882. TCDSImage *pSymbol = CDSImageManager->FLists.Find(pFormObj->ImageId);
  1883. if (pSymbol)
  1884. {
  1885. sTmp = "";
  1886. int nCnt = 0;
  1887. FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
  1888. {
  1889. TCDSIfsc *pIfsc = NULL;
  1890. if (pFormObj->ObjectType == 3)
  1891. pIfsc = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  1892. else
  1893. pIfsc = CDSIfscManager->FLists.Find(pFormObj->IFSC_ID);
  1894. if (pIfsc)
  1895. {
  1896. sVertex.sprintf("%03d%03d%d", pCell->POSX, pCell->POSY, pIfsc->CMTR_GRAD_CD.ToIntDef(0));
  1897. sTmp += sVertex;
  1898. nCnt++;
  1899. }
  1900. }
  1901. sCont.printf("%02X%s|", nCnt, sTmp.c_str());
  1902. VMS_DSPL_MSG_DATA += sCont;
  1903. }
  1904. else
  1905. {
  1906. VMS_DSPL_MSG_DATA += "X|";
  1907. }
  1908. }
  1909. break;
  1910. default://기타 문자열
  1911. VMS_DSPL_MSG_TXT += pFormObj->TextData;
  1912. VMS_DSPL_MSG_TXT += " ";
  1913. nObjType = vms_obj_text;
  1914. sTmp.printf("%02X%04X%04X%02X%02X%02X%02X%02X%02X%s|",
  1915. pFormObj->IsBlinking,
  1916. pFormObj->PosX,
  1917. pFormObj->PosY,
  1918. pFormObj->BkColor,
  1919. pFormObj->TextFontSize,
  1920. pFormObj->TextFontColor,
  1921. pFormObj->TextFontName,
  1922. pFormObj->TextFontBold,
  1923. pFormObj->TextData.Length(),
  1924. pFormObj->TextData);
  1925. sCont.printf("%02X%02X%s", nObjType, sTmp.Length(), sTmp.c_str());
  1926. VMS_DSPL_MSG_DATA += sCont;
  1927. break;
  1928. }
  1929. }
  1930. /*
  1931. * 웹접근성에서 홍보이미지도 alt 로 내용을 지원해야 하기때문에
  1932. * 폼의 설명이 우선적으로 설정되도록 프로그램 수정(20210615)
  1933. */
  1934. if (VMS_DSPL_MSG_TXT == "")
  1935. {
  1936. TCDSForm *pCDSForm = CDSFormManager->FLists.Find(pForm->VMS_FORM_ID);
  1937. if (pCDSForm)
  1938. {
  1939. if (pCDSForm->VMS_FORM_EXPL.Length() > pCDSForm->VMS_FORM_NM.Length())
  1940. {
  1941. VMS_DSPL_MSG_TXT = pCDSForm->VMS_FORM_EXPL;
  1942. }
  1943. else
  1944. {
  1945. VMS_DSPL_MSG_TXT = pCDSForm->VMS_FORM_NM;
  1946. }
  1947. }
  1948. }
  1949. if (VMS_DSPL_MSG_DATA.Length() > 1500) VMS_DSPL_MSG_DATA = VMS_DSPL_MSG_DATA.SubString(1, 1499);
  1950. if (VMS_DSPL_MSG_TXT.Length() > 400) VMS_DSPL_MSG_TXT = VMS_DSPL_MSG_TXT.SubString(1, 399);
  1951. SQLBind(pADO, "p01", VMS_CTLR_NMBR);
  1952. SQLBind(pADO, "p02", PHASE);
  1953. SQLBind(pADO, "p03", DSPL_DT);
  1954. SQLBind(pADO, "p04", VMS_SCH_TYPE);
  1955. SQLBind(pADO, "p05", VMS_SCH_FORM_TYPE);
  1956. SQLBind(pADO, "p06", VMS_FORM_ID);
  1957. SQLBind(pADO, "p07", DSPL_HH);
  1958. SQLBind(pADO, "p08", VMS_DSPL_MSG_DATA);
  1959. SQLBind(pADO, "p09", VMS_DSPL_MSG_TXT);
  1960. SQLBind(pADO, "p10", VMS_FORM_DSPL_DRCT_CD);
  1961. SQLBind(pADO, "p11", VMS_FORM_DSPL_MTHD_CD);
  1962. pADO->Parameters->ParamByName("p12")->LoadFromStream(pForm->pStream, ftBlob);
  1963. SQLBind(pADO, "p13", DNLD_YN);
  1964. SQLExec(pADO);
  1965. nSelCnt++;
  1966. }
  1967. __finally
  1968. {
  1969. }
  1970. }
  1971. }
  1972. catch(EDatabaseError &E)
  1973. {
  1974. DBERROR(String(E.ClassName()), E.Message, sQry);
  1975. return -1;
  1976. }
  1977. catch(Exception &e)
  1978. {
  1979. DBERROR(String(e.ClassName()), e.Message, sQry);
  1980. return -1;
  1981. }
  1982. }
  1983. __finally
  1984. {
  1985. AObj->pForms->UnLock();
  1986. SQLFree(pADO);
  1987. }
  1988. MINFO(" INF-..END: %25.25s: %s, %d EA. Elapsed: %u ms.", __MYFUNC__, AObj->CTLR_NMBR.c_str(), nSelCnt, JOBTIME(dwTick));
  1989. UPDEND(nSelCnt, dwTick);
  1990. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  1991. TIMEDELAY(nSelCnt, dwTick);
  1992. }
  1993. return nSelCnt;
  1994. }
  1995. //---------------------------------------------------------------------------
  1996. #if 0
  1997. int TCDSManager::SaveVmsProvideForm(TADOConnection *ADbConn, void *ACtlrObj)
  1998. {
  1999. // VMS 제공정보 객체 코드
  2000. typedef enum en_vms_object_type
  2001. {
  2002. vms_obj_none, /* 0:정보없음 */
  2003. vms_obj_text, /* 1:문자열 */
  2004. vms_obj_bitmap, /* 2:Bitmap ID */
  2005. vms_obj_draw, /* 3:Draw */
  2006. } EN_VMS_OBJECT_TYPE;
  2007. #define D_UPDATE
  2008. AnsiString sQry;
  2009. AnsiString uQry;
  2010. TADOQuery *pSADO = NULL;
  2011. TADOQuery *pUADO = NULL;
  2012. int nSelCnt = 0;
  2013. DWORD dwTick = GetTickCount();
  2014. UPDSTART;
  2015. TCDSCtlr* AObj = (TCDSCtlr*)ACtlrObj;
  2016. if (!AObj) return VERR_MEMORY_ALLOC;
  2017. int nFormCnt = AObj->pForms->Count();
  2018. if (nFormCnt == 0) return VERR_NONE;
  2019. if (nFormCnt > MAX_VMS_SCENARIO_FORM) {
  2020. MINFO(" INF-ERROR: %25.25s: %s, Form Count Over: %d/%d EA.", __MYFUNC__, AObj->CTLR_NMBR.c_str(), nFormCnt, MAX_VMS_SCENARIO_FORM);
  2021. nFormCnt = MAX_VMS_SCENARIO_FORM;
  2022. }
  2023. sQry = "MERGE INTO TB_VMS_DSPL_PRST L \r\n"
  2024. "USING (SELECT :p01 AS VMS_CTLR_NMBR, \r\n"
  2025. " :p02 AS PHASE, \r\n"
  2026. " :p03 AS DSPL_DT, \r\n"
  2027. " :p04 AS VMS_SCH_TYPE, \r\n"
  2028. " :p05 AS VMS_SCH_FORM_TYPE, \r\n"
  2029. " :p06 AS VMS_FORM_ID, \r\n"
  2030. " :p07 AS DSPL_HH, \r\n"
  2031. " :p08 AS VMS_DSPL_MSG_DATA, \r\n"
  2032. " :p09 AS VMS_DSPL_MSG_TXT, \r\n"
  2033. " :p10 AS VMS_FORM_DSPL_DRCT_CD, \r\n"
  2034. " :p11 AS VMS_FORM_DSPL_MTHD_CD, \r\n"
  2035. #ifndef D_UPDATE
  2036. " :p13 AS VMS_DSPL_MSG_IMAG, \r\n"
  2037. #endif
  2038. " :p12 AS DNLD_YN \r\n"
  2039. " FROM DUAL) M \r\n"
  2040. " ON (L.VMS_CTLR_NMBR = M.VMS_CTLR_NMBR AND L.PHASE = M.PHASE) \r\n"
  2041. "WHEN MATCHED THEN \r\n"
  2042. "UPDATE SET L.DSPL_DT = M.DSPL_DT, \r\n"
  2043. " L.VMS_SCH_TYPE = M.VMS_SCH_TYPE, \r\n"
  2044. " L.VMS_SCH_FORM_TYPE = M.VMS_SCH_FORM_TYPE, \r\n"
  2045. " L.VMS_FORM_ID = M.VMS_FORM_ID, \r\n"
  2046. " L.DSPL_HH = M.DSPL_HH, \r\n"
  2047. " L.VMS_DSPL_MSG_DATA = M.VMS_DSPL_MSG_DATA, \r\n"
  2048. " L.VMS_DSPL_MSG_TXT = M.VMS_DSPL_MSG_TXT, \r\n"
  2049. " L.VMS_FORM_DSPL_DRCT_CD = M.VMS_FORM_DSPL_DRCT_CD, \r\n"
  2050. " L.VMS_FORM_DSPL_MTHD_CD = M.VMS_FORM_DSPL_MTHD_CD, \r\n"
  2051. #ifndef D_UPDATE
  2052. " L.VMS_DSPL_MSG_IMAG = M.VMS_DSPL_MSG_IMAG, \r\n"
  2053. #endif
  2054. " L.DNLD_YN = M.DNLD_YN \r\n"
  2055. "WHEN NOT MATCHED THEN \r\n"
  2056. "INSERT (VMS_CTLR_NMBR, PHASE, DSPL_DT, \r\n"
  2057. " VMS_SCH_TYPE, VMS_SCH_FORM_TYPE, \r\n"
  2058. " VMS_FORM_ID, DSPL_HH, \r\n"
  2059. " VMS_DSPL_MSG_DATA, VMS_DSPL_MSG_TXT, \r\n"
  2060. " VMS_FORM_DSPL_DRCT_CD, VMS_FORM_DSPL_MTHD_CD, \r\n"
  2061. #ifndef D_UPDATE
  2062. " VMS_DSPL_MSG_IMAG, DNLD_YN) \r\n"
  2063. #else
  2064. " DNLD_YN) \r\n"
  2065. #endif
  2066. "VALUES (M.VMS_CTLR_NMBR, M.PHASE, M.DSPL_DT, \r\n"
  2067. " M.VMS_SCH_TYPE, M.VMS_SCH_FORM_TYPE, \r\n"
  2068. " M.VMS_FORM_ID, M.DSPL_HH, \r\n"
  2069. " M.VMS_DSPL_MSG_DATA, M.VMS_DSPL_MSG_TXT, \r\n"
  2070. " M.VMS_FORM_DSPL_DRCT_CD, M.VMS_FORM_DSPL_MTHD_CD, \r\n"
  2071. #ifndef D_UPDATE
  2072. " M.VMS_DSPL_MSG_IMAG, M.DNLD_YN) \r\n";
  2073. #else
  2074. " M.DNLD_YN) \r\n";
  2075. #endif
  2076. #ifdef D_UPDATE
  2077. uQry = "UPDATE TB_VMS_DSPL_PRST \r\n"
  2078. " SET VMS_DSPL_MSG_IMAG = :p03 \r\n"
  2079. " WHERE VMS_CTLR_NMBR = :p01 \r\n"
  2080. " AND PHASE = :p02 \r\n";
  2081. #endif
  2082. try
  2083. {
  2084. pSADO = new TADOQuery(NULL);
  2085. pSADO->Connection = ADbConn;
  2086. #ifdef D_UPDATE
  2087. pUADO = new TADOQuery(NULL);
  2088. pUADO->Connection = ADbConn;
  2089. #endif
  2090. try
  2091. {
  2092. AObj->pForms->Lock();
  2093. SQLText(pSADO, sQry, false);
  2094. #ifdef D_UPDATE
  2095. SQLText(pUADO, uQry, false);
  2096. #endif
  2097. //ADbConn->BeginTrans();
  2098. for (int ii = 0; ii < nFormCnt; ii++)
  2099. {
  2100. TVmsForm *pForm = AObj->pForms->GetItem(ii);
  2101. String VMS_CTLR_NMBR = AObj->CTLR_NMBR;
  2102. String PHASE = String(ii+1);
  2103. String DSPL_DT = AObj->CTRLMODE->SvcDate;
  2104. String VMS_SCH_TYPE = pForm->VMS_SCH_TYPE;
  2105. String VMS_SCH_FORM_TYPE = pForm->VMS_SCH_FORM_TYPE;
  2106. String VMS_FORM_ID = pForm->VMS_FORM_ID;
  2107. String DSPL_HH = String(pForm->DSPL_HH);
  2108. String VMS_DSPL_MSG_DATA = "";
  2109. String VMS_DSPL_MSG_TXT = "";
  2110. String VMS_FORM_DSPL_DRCT_CD = pForm->VMS_FORM_DSPL_DRCT_CD;
  2111. String VMS_FORM_DSPL_MTHD_CD = pForm->VMS_FORM_DSPL_MTHD_CD;
  2112. String DNLD_YN = pForm->SvcRes ? "Y" : "N";
  2113. AnsiString sTmp = "";
  2114. AnsiString sCont = "";
  2115. int nObjCnt, nObjType;
  2116. try
  2117. {
  2118. //폼종류/표출시간/배경색상
  2119. sCont.printf("%02X%02X%02X|", pForm->VMS_FORM_TYPE_CD, pForm->DSPL_HH, pForm->VMS_FORM_COLR_CD);
  2120. VMS_DSPL_MSG_DATA += sCont;
  2121. nObjCnt = pForm->Count();
  2122. for (int jj = 0; jj < nObjCnt; jj++)
  2123. {
  2124. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  2125. if (pFormObj->ImageId == "") pFormObj->ImageId = "1"; //이력저장용
  2126. if (pFormObj->TextData == "") pFormObj->TextData = " "; //이력저장용
  2127. switch(pFormObj->ObjectType)
  2128. {
  2129. case 1: //심볼
  2130. case 2: //이미지
  2131. case 167: //@우회소통정보이미지
  2132. case 200: //동영상
  2133. case 300: //스티리밍영상
  2134. case 406: //@통합대기등급 이미지
  2135. case 407: //@미세먼지등급 이미지
  2136. case 408: //@초미세먼지등급 이미지
  2137. case 413: //@오존등급이미지
  2138. nObjType = vms_obj_bitmap;
  2139. sTmp.printf("%02X%04X%04X%02X%04X%04X%s|",
  2140. pFormObj->IsBlinking,
  2141. pFormObj->PosX,
  2142. pFormObj->PosY,
  2143. pFormObj->BkColor,
  2144. pFormObj->Width,
  2145. pFormObj->Height,
  2146. pFormObj->ImageId.c_str());
  2147. sCont.printf("%02X%02X%s", nObjType, sTmp.Length(), sTmp.c_str());
  2148. VMS_DSPL_MSG_DATA += sCont;
  2149. break;
  2150. case 3: //소통정보배경이미지
  2151. case 17: //1단,소통정보이미지1
  2152. case 27: //2단,소통정보이미지2
  2153. case 37: //3단,소통정보이미지3
  2154. case 47: //4단,소통정보이미지4
  2155. {
  2156. nObjType = vms_obj_draw;
  2157. sTmp.printf("%02X%04X%04X%02X%04X%04X%s+",
  2158. pFormObj->IsBlinking,
  2159. pFormObj->PosX,
  2160. pFormObj->PosY,
  2161. pFormObj->BkColor,
  2162. pFormObj->Width,
  2163. pFormObj->Height,
  2164. pFormObj->ImageId.c_str());
  2165. sCont.printf("%02X%02X%s", nObjType, sTmp.Length(), sTmp.c_str());
  2166. VMS_DSPL_MSG_DATA += sCont;
  2167. AnsiString sVertex = "";
  2168. TCDSImage *pSymbol = CDSImageManager->FLists.Find(pFormObj->ImageId);
  2169. if (pSymbol)
  2170. {
  2171. sTmp = "";
  2172. int nCnt = 0;
  2173. FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
  2174. {
  2175. TCDSIfsc *pIfsc = NULL;
  2176. if (pFormObj->ObjectType == 3)
  2177. pIfsc = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  2178. else
  2179. pIfsc = CDSIfscManager->FLists.Find(pFormObj->IFSC_ID);
  2180. if (pIfsc)
  2181. {
  2182. sVertex.sprintf("%03d%03d%d", pCell->POSX, pCell->POSY, pIfsc->CMTR_GRAD_CD.ToIntDef(0));
  2183. sTmp += sVertex;
  2184. nCnt++;
  2185. }
  2186. }
  2187. sCont.printf("%02X%s|", nCnt, sTmp.c_str());
  2188. VMS_DSPL_MSG_DATA += sCont;
  2189. }
  2190. else
  2191. {
  2192. VMS_DSPL_MSG_DATA += "X|";
  2193. }
  2194. }
  2195. break;
  2196. default://기타 문자열
  2197. VMS_DSPL_MSG_TXT += pFormObj->TextData;
  2198. VMS_DSPL_MSG_TXT += " ";
  2199. nObjType = vms_obj_text;
  2200. sTmp.printf("%02X%04X%04X%02X%02X%02X%02X%02X%02X%s|",
  2201. pFormObj->IsBlinking,
  2202. pFormObj->PosX,
  2203. pFormObj->PosY,
  2204. pFormObj->BkColor,
  2205. pFormObj->TextFontSize,
  2206. pFormObj->TextFontColor,
  2207. pFormObj->TextFontName,
  2208. pFormObj->TextFontBold,
  2209. pFormObj->TextData.Length(),
  2210. pFormObj->TextData);
  2211. sCont.printf("%02X%02X%s", nObjType, sTmp.Length(), sTmp.c_str());
  2212. VMS_DSPL_MSG_DATA += sCont;
  2213. break;
  2214. }
  2215. }
  2216. /*
  2217. * 웹접근성에서 홍보이미지도 alt 로 내용을 지원해야 하기때문에
  2218. * 폼의 설명이 우선적으로 설정되도록 프로그램 수정(20210615)
  2219. */
  2220. if (VMS_DSPL_MSG_TXT == "")
  2221. {
  2222. TCDSForm *pCDSForm = CDSFormManager->FLists.Find(pForm->VMS_FORM_ID);
  2223. if (pCDSForm)
  2224. {
  2225. if (pCDSForm->VMS_FORM_EXPL.Length() > pCDSForm->VMS_FORM_NM.Length())
  2226. {
  2227. VMS_DSPL_MSG_TXT = pCDSForm->VMS_FORM_EXPL;
  2228. }
  2229. else
  2230. {
  2231. VMS_DSPL_MSG_TXT = pCDSForm->VMS_FORM_NM;
  2232. }
  2233. }
  2234. }
  2235. if (VMS_DSPL_MSG_DATA.Length() > 1500) VMS_DSPL_MSG_DATA = VMS_DSPL_MSG_DATA.SubString(1, 1499);
  2236. if (VMS_DSPL_MSG_TXT.Length() > 400) VMS_DSPL_MSG_TXT = VMS_DSPL_MSG_TXT.SubString(1, 399);
  2237. SQLBind(pSADO, "p01", VMS_CTLR_NMBR);
  2238. SQLBind(pSADO, "p02", PHASE);
  2239. SQLBind(pSADO, "p03", DSPL_DT);
  2240. SQLBind(pSADO, "p04", VMS_SCH_TYPE);
  2241. SQLBind(pSADO, "p05", VMS_SCH_FORM_TYPE);
  2242. SQLBind(pSADO, "p06", VMS_FORM_ID);
  2243. SQLBind(pSADO, "p07", DSPL_HH);
  2244. SQLBind(pSADO, "p08", VMS_DSPL_MSG_DATA);
  2245. SQLBind(pSADO, "p09", VMS_DSPL_MSG_TXT);
  2246. SQLBind(pSADO, "p10", VMS_FORM_DSPL_DRCT_CD);
  2247. SQLBind(pSADO, "p11", VMS_FORM_DSPL_MTHD_CD);
  2248. SQLBind(pSADO, "p12", DNLD_YN);
  2249. #ifndef D_UPDATE
  2250. pSADO->Parameters->ParamByName("p13")->LoadFromStream(pForm->pStream, ftBlob);
  2251. #endif
  2252. SQLExec(pSADO);
  2253. #ifdef D_UPDATE
  2254. try
  2255. {
  2256. SQLBind(pUADO, "p01", VMS_CTLR_NMBR);
  2257. SQLBind(pUADO, "p02", PHASE);
  2258. pUADO->Parameters->ParamByName("p03")->LoadFromStream(pForm->pStream, ftBlob);
  2259. SQLExec(pUADO);
  2260. //MINFO("[%s] FormImage Size: %d", AObj->VmsNo.c_str(), pForm->pStream->Size);
  2261. //pForm->pBitmap->SaveToFile(g_sFtpFormDir + AObj->VmsId + "\\" + PHASE + ".bmp");
  2262. //pImage->Picture->SaveToFile(g_sFtpFormDir + AObj->VmsId + "\\" + PHASE + ".bmp");
  2263. }
  2264. catch(Exception &e)
  2265. {
  2266. }
  2267. #endif
  2268. nSelCnt++;
  2269. }
  2270. __finally
  2271. {
  2272. }
  2273. }
  2274. //ADbConn->CommitTrans();
  2275. }
  2276. catch(EDatabaseError &E)
  2277. {
  2278. DBERROR(String(E.ClassName()), E.Message, sQry);
  2279. //if (ADbConn->InTransaction) {
  2280. // ADbConn->RollbackTrans();
  2281. //}
  2282. return -1;
  2283. }
  2284. catch(Exception &e)
  2285. {
  2286. DBERROR(String(e.ClassName()), e.Message, sQry);
  2287. //if (ADbConn->InTransaction) {
  2288. // ADbConn->RollbackTrans();
  2289. //}
  2290. return -1;
  2291. }
  2292. }
  2293. __finally
  2294. {
  2295. AObj->pForms->UnLock();
  2296. SQLFree(pSADO);
  2297. #ifdef D_UPDATE
  2298. SQLFree(pUADO);
  2299. #endif
  2300. }
  2301. MINFO(" INF-.DATA: %25.25s: %s, %d EA.", __MYFUNC__, AObj->CTLR_NMBR.c_str(), nSelCnt);
  2302. UPDEND(nSelCnt, dwTick);
  2303. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  2304. TIMEDELAY(nSelCnt, dwTick);
  2305. }
  2306. return nSelCnt;
  2307. }
  2308. //---------------------------------------------------------------------------
  2309. #endif
  2310. int TCDSManager::LoadVmsOnOffTime(TADOConnection *ADbConn)
  2311. {
  2312. String sQry;
  2313. TADOQuery *pADO = NULL;
  2314. int nSelCnt = 0;
  2315. DWORD dwTick = GetTickCount();
  2316. SELSTART;
  2317. sQry = "SELECT A.VMS_CTLR_NMBR, \r\n"
  2318. " A.PANL_ON_TIME, \r\n"
  2319. " A.PANL_OFF_TIME \r\n"
  2320. " FROM TB_VMS_CTLR A \r\n"
  2321. " WHERE A.DEL_YN = 'N' \r\n";
  2322. BYTE OnOff, OldOnOff;
  2323. int nOnTime, nOffTime, nCurrTime;
  2324. nCurrTime = Now().FormatString("hhnn").ToIntDef(0);
  2325. try
  2326. {
  2327. try
  2328. {
  2329. pADO = new TADOQuery(NULL);
  2330. pADO->Connection = ADbConn;
  2331. SQLText(pADO, sQry, true);
  2332. SQLOpen(pADO);
  2333. for( ; !pADO->Eof; pADO->Next())
  2334. {
  2335. AnsiString VMS_CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsString.Trim();
  2336. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(VMS_CTLR_NMBR);
  2337. if (!pObj) continue;
  2338. pObj->PANL_ON_TIME = pADO->FieldByName("PANL_ON_TIME")->AsString.Trim(); // N VARCHAR2(4) Y '0400' 전광판 ON TIME
  2339. pObj->PANL_OFF_TIME = pADO->FieldByName("PANL_OFF_TIME")->AsString.Trim(); // N VARCHAR2(4) Y '0200' 전광판 OFF TIME
  2340. if (pObj->PANL_ON_TIME == "9999" || pObj->PANL_ON_TIME.Length() != 4) pObj->PANL_ON_TIME = "0000";
  2341. if (pObj->PANL_OFF_TIME == "9999" || pObj->PANL_OFF_TIME.Length() != 4) pObj->PANL_OFF_TIME = "0000";
  2342. pObj->MODULE.PowerOnTime = Now().FormatString("yyyymmdd") + pObj->PANL_ON_TIME;
  2343. pObj->MODULE.PowerOffTime = Now().FormatString("yyyymmdd") + pObj->PANL_OFF_TIME;
  2344. pObj->MODULE.Retry = VMS_MAX_RETRY_COUNT;
  2345. OldOnOff = pObj->MODULE.OnOff;
  2346. OnOff = vms_req_board_power_on;
  2347. nOnTime = pObj->PANL_ON_TIME.ToIntDef(0);
  2348. nOffTime = pObj->PANL_OFF_TIME.ToIntDef(0);
  2349. if (nOnTime != nOffTime)
  2350. {
  2351. if (nOnTime > nOffTime)
  2352. {
  2353. // 0100(off), 0500(on)
  2354. if (nCurrTime >= nOffTime && nCurrTime < nOnTime)
  2355. {
  2356. OnOff = vms_req_board_power_off;
  2357. }
  2358. }
  2359. else
  2360. if (nOffTime > nOnTime)
  2361. {
  2362. // 2300(off), 0500(on)
  2363. if (nCurrTime >= nOffTime || nCurrTime < nOnTime)
  2364. {
  2365. OnOff = vms_req_board_power_off;
  2366. }
  2367. }
  2368. }
  2369. if (OldOnOff != OnOff)
  2370. {
  2371. if (pObj->FSession && pObj->FSession->State == eSS_Connected)
  2372. {
  2373. pObj->MODULE.IsOnOff = true;
  2374. pObj->MODULE.OnOff = OnOff;
  2375. IPC_JOB_MESSAGE *pMsg = g_jobBuff.GetBuff();
  2376. pMsg->Type = eVmsStatusControl;
  2377. pMsg->ObjPtr = (DWORD)pObj->FSession;
  2378. pMsg->Buff[0] = 0x01;
  2379. pMsg->Buff[1] = OnOff;
  2380. pMsg->Len = 2;
  2381. g_jobQ.PushBlocking((DWORD)pMsg);
  2382. }
  2383. }
  2384. #if 0
  2385. if (pObj->FSession && pObj->FSession->State == eSS_Connected && pObj->MODULE.OnOff != pObj->PANL_PWER_MODE)
  2386. {
  2387. pObj->MODULE.IsOnOff = true;
  2388. }
  2389. #endif
  2390. nSelCnt++;
  2391. }
  2392. }
  2393. catch(EDatabaseError &E)
  2394. {
  2395. DBERROR(String(E.ClassName()), E.Message, sQry);
  2396. return -1;
  2397. }
  2398. catch(Exception &e)
  2399. {
  2400. DBERROR(String(e.ClassName()), e.Message, sQry);
  2401. return -1;
  2402. }
  2403. }
  2404. __finally
  2405. {
  2406. SQLFree(pADO);
  2407. }
  2408. // MINFO("DCOM <<< Check VMS Job Schedule: OnOffTime, %d EA"., nSelCnt);
  2409. SELEND(nSelCnt, dwTick);
  2410. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  2411. TIMEDELAY(nSelCnt, dwTick);
  2412. }
  2413. return nSelCnt;
  2414. }
  2415. //---------------------------------------------------------------------------
  2416. int TCDSManager::LoadVmsDownLoadJob(TADOConnection *ADbConn)
  2417. {
  2418. String sQry;
  2419. TADOQuery *pADO = NULL;
  2420. int nSelCnt = 0;
  2421. int nDnIdx;
  2422. VMS_DOWNLOAD_INFO *pInfo;
  2423. DWORD dwTick = GetTickCount();
  2424. SELSTART;
  2425. sQry = "SELECT A.VMS_CTLR_NMBR, A.RGST_DT, \r\n"
  2426. " A.FILETYPE, A.FILEID \r\n"
  2427. " FROM TB_VMS_DOWNLOAD A \r\n"
  2428. " WHERE A.SENDSTARTDATE <= TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') \r\n"
  2429. " AND A.SENDRESULT = 0 \r\n"
  2430. " ORDER BY A.VMS_CTLR_NMBR, A.RGST_DT DESC, A.FILETYPE, A.FILEID \r\n";
  2431. CtlrItr it;
  2432. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  2433. {
  2434. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  2435. pObj->InitDownLoadInfo();
  2436. }
  2437. try
  2438. {
  2439. try
  2440. {
  2441. pADO = new TADOQuery(NULL);
  2442. pADO->Connection = ADbConn;
  2443. SQLText(pADO, sQry, true);
  2444. SQLOpen(pADO);
  2445. for( ; !pADO->Eof; pADO->Next())
  2446. {
  2447. AnsiString VMS_CTLR_NMBR = pADO->FieldByName("VMS_CTLR_NMBR")->AsString.Trim();
  2448. TCDSCtlr *pObj = CDSCtlrManager->FLists.Find(VMS_CTLR_NMBR);
  2449. if (!pObj) continue;
  2450. if (pObj->DOWNLOAD->Count < VMS_MAX_DOWNLOAD)
  2451. {
  2452. pInfo = pObj->DOWNLOAD;
  2453. nDnIdx = pInfo->Count++;
  2454. pInfo->Unit[nDnIdx].RegDate = pADO->FieldByName("RGST_DT")->AsString;
  2455. pInfo->Unit[nDnIdx].FileType = pADO->FieldByName("FILETYPE")->AsString;
  2456. pInfo->Unit[nDnIdx].FileId = pADO->FieldByName("FILEID")->AsString;
  2457. pInfo->Unit[nDnIdx].SendEndDate = Now().FormatString("yyyymmddhhnnss");
  2458. pInfo->Unit[nDnIdx].SendStep = send_wait;
  2459. pInfo->Unit[nDnIdx].SendResult = vms_download_fail;
  2460. }
  2461. nSelCnt++;
  2462. }
  2463. }
  2464. catch(EDatabaseError &E)
  2465. {
  2466. DBERROR(String(E.ClassName()), E.Message, sQry);
  2467. return -1;
  2468. }
  2469. catch(Exception &e)
  2470. {
  2471. DBERROR(String(e.ClassName()), e.Message, sQry);
  2472. return -1;
  2473. }
  2474. }
  2475. __finally
  2476. {
  2477. SQLFree(pADO);
  2478. }
  2479. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  2480. {
  2481. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  2482. if (pObj->DOWNLOAD->Count > 0)
  2483. {
  2484. pObj->DOWNLOAD->Enable = vms_download_enable;
  2485. pObj->DOWNLOAD->SaveFlag = true;
  2486. }
  2487. }
  2488. // MINFO("DCOM <<< Check VMS Job Schedule: DownloadJob, %d EA.", nSelCnt);
  2489. SELEND(nSelCnt, dwTick);
  2490. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  2491. TIMEDELAY(nSelCnt, dwTick);
  2492. }
  2493. return nSelCnt;
  2494. }
  2495. //---------------------------------------------------------------------------
  2496. int TCDSManager::SaveVmsDownLoadJob(TADOConnection *ADbConn, void *ACtlrObj)
  2497. {
  2498. int nSelCnt = 0;
  2499. AnsiString sQry;
  2500. TADOQuery *pADO = NULL;
  2501. TCDSCtlr* AObj = (TCDSCtlr*)ACtlrObj;
  2502. if (!AObj) return VERR_MEMORY_ALLOC;
  2503. DWORD dwTick = GetTickCount();
  2504. UPDSTART;
  2505. MINFO(" INF-START: %25.25s: %s", __MYFUNC__, AObj->CTLR_NMBR.c_str());
  2506. sQry = "UPDATE TB_VMS_DOWNLOAD "
  2507. " SET SENDENDDATE = :p05, "
  2508. " SENDSTEP = :p06, "
  2509. " SENDRESULT = :p07 "
  2510. " WHERE RGST_DT = :p01 "
  2511. " AND VMS_CTLR_NMBR = :p02 "
  2512. " AND FILETYPE = :p03 "
  2513. " AND FILEID = :p04 ";
  2514. try
  2515. {
  2516. pADO = new TADOQuery(NULL);
  2517. pADO->Connection = ADbConn;
  2518. try
  2519. {
  2520. SQLText(pADO, sQry, false);
  2521. for (int ii = 0; ii < AObj->DOWNLOAD->Count && ii < VMS_MAX_DOWNLOAD; ii++)
  2522. {
  2523. SQLBind(pADO, "p01", AObj->DOWNLOAD->Unit[ii].RegDate);
  2524. SQLBind(pADO, "p02", AObj->CTLR_NMBR);
  2525. SQLBind(pADO, "p03", AObj->DOWNLOAD->Unit[ii].FileType);
  2526. SQLBind(pADO, "p04", AObj->DOWNLOAD->Unit[ii].FileId);
  2527. SQLBind(pADO, "p05", AObj->DOWNLOAD->Unit[ii].SendEndDate);
  2528. SQLBind(pADO, "p06", AObj->DOWNLOAD->Unit[ii].SendStep);
  2529. SQLBind(pADO, "p07", AObj->DOWNLOAD->Unit[ii].SendResult);
  2530. nSelCnt = SQLExec(pADO);
  2531. }
  2532. //pADO->Connection->CommitTrans();
  2533. }
  2534. catch(EDatabaseError &E)
  2535. {
  2536. DBERROR(String(E.ClassName()), E.Message, sQry);
  2537. return -1;
  2538. }
  2539. catch(Exception &e)
  2540. {
  2541. DBERROR(String(e.ClassName()), e.Message, sQry);
  2542. return -1;
  2543. }
  2544. }
  2545. __finally
  2546. {
  2547. SQLFree(pADO);
  2548. }
  2549. MINFO(" INF-..END: %25.25s: %s, %d EA.", __MYFUNC__, AObj->CTLR_NMBR.c_str(), nSelCnt);
  2550. UPDEND(nSelCnt, dwTick);
  2551. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  2552. TIMEDELAY(nSelCnt, dwTick);
  2553. }
  2554. return nSelCnt;
  2555. }
  2556. //---------------------------------------------------------------------------
  2557. int TCDSManager::SaveVmsDownloadForm(TADOConnection *ADbConn)
  2558. {
  2559. int nSaveVmsCnt = 0;
  2560. int nSaveFormCnt = 0;
  2561. DWORD dwTick = GetTickCount();
  2562. JOBSTART;
  2563. //생성한 폼을 데이터베이스에 저장한다.
  2564. CtlrItr it;
  2565. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  2566. {
  2567. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  2568. if (pObj->Server.useFlag != use_enable) continue;
  2569. if (!pObj->FProvide) continue;
  2570. //PostMessage((HWND)g_AppCfg.lMainWinHandle, WM_PANEL_REFRESH, 2, (LPARAM)clYellow);
  2571. nSaveFormCnt += SaveVmsProvideForm(ADbConn, (void*)pObj);
  2572. //PostMessage((HWND)g_AppCfg.lMainWinHandle, WM_PANEL_REFRESH, 2, (LPARAM)clLime);
  2573. nSaveVmsCnt++;
  2574. }
  2575. //생성한 폼을 제어기에 전송할 수 있도록 플래그를 설정한다.
  2576. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  2577. {
  2578. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  2579. if (pObj->Server.useFlag != use_enable) continue;
  2580. if (!pObj->FProvide) continue;
  2581. if (pObj->pForms->Count() > 0)
  2582. {
  2583. pObj->CTRLMODE->Enable = object_enable;
  2584. pObj->CTRLMODE->SaveFlag = true;
  2585. pObj->CTRLMODE->Result = false;
  2586. }
  2587. }
  2588. JOBEND(dwTick);
  2589. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  2590. TIMEDELAY(nSaveVmsCnt, dwTick);
  2591. }
  2592. return nSaveVmsCnt;
  2593. }
  2594. //---------------------------------------------------------------------------
  2595. int TCDSManager::SendVmsDownloadForm()
  2596. {
  2597. INT_VMS_FORM_SAVE_REQ Req;
  2598. memset((char*)&Req, 0x00, sizeof(Req));
  2599. memcpy(Req.Date, FFormDsplDt.c_str(), INT_VMS_MAX_DATETIME);
  2600. return CComm_VmsFormSaveNotify(&Req);
  2601. }
  2602. //---------------------------------------------------------------------------
  2603. int TCDSManager::MakeVmsScenarioForm(TADOConnection *ADbConn, int ACommand)
  2604. {
  2605. int nResult = VERR_NONE;
  2606. DWORD dwTick = GetTickCount();
  2607. JOBSTART;
  2608. CDSManager->ClearVmsProvideMode();
  2609. if (LOAD_DB)
  2610. {
  2611. if (CDSFontManager) CDSFontManager->LoadFontNameInfo(ADbConn);
  2612. if (CDSImageManager) CDSImageManager->LoadVmsSymbolInfo(ADbConn);
  2613. if (CDSFormManager) CDSFormManager->LoadVmsFormInfo(ADbConn);
  2614. if (CDSIfscManager) CDSIfscManager->LoadVmsIfscInfo(ADbConn);
  2615. if (CDSAtmpManager) CDSAtmpManager->LoadAtmpInfo(ADbConn);
  2616. }
  2617. //대기환경정보를 읽어온다
  2618. if (CDSAtmpManager)
  2619. {
  2620. nResult = CDSAtmpManager->LoadAtmpRtPnstInfo(ADbConn);
  2621. if (nResult < 0)
  2622. {
  2623. MERROR("LoadAtmpRtPnstInfo: error: %d", nResult);
  2624. }
  2625. }
  2626. //주차정보를 읽어온다
  2627. if (CDSParkManager)
  2628. {
  2629. nResult = CDSParkManager->LoadFromDb(ADbConn);
  2630. if (nResult < 0)
  2631. {
  2632. MERROR("CDSParkManager->LoadFromDb: error: %d", nResult);
  2633. }
  2634. }
  2635. if (ACommand != dbm_dnld_form_eveh) {
  2636. // 긴급차량우선신호 이벤트가 아닌경우(즉, 주기 메시지 생성)
  2637. nResult = CDSManager->LoadVmsEVehicleInf(ADbConn, ACommand);
  2638. if (nResult < 0)
  2639. {
  2640. MERROR("LoadVmsEVehicleInf: error: %d", nResult);
  2641. }
  2642. }
  2643. //돌발/공사/행사가 발생한 정보를 VMS에 맵핑한다.
  2644. nResult = CDSManager->LoadVmsEventOccrInf(ADbConn);
  2645. if (nResult < 0)
  2646. {
  2647. MERROR("LoadVmsEventOccrInf: error: %d", nResult);
  2648. }
  2649. // VMS구간 소통정보를 모두 읽어오자..(데이터가 많을 경우 해당되는 정보만 읽어오도록 수정
  2650. nResult = CDSIfscManager->LoadVmsIfscTrafficInfo(ADbConn);
  2651. if (nResult < 0)
  2652. {
  2653. MERROR("LoadVmsIfscTrafficInfo: error: %d", nResult);
  2654. }
  2655. //정체폼을 위한 정체정보 판정
  2656. //스케쥴정보를 읽기전에 VMS별 정체판정조건에 따라 정체정보를 판정한다.
  2657. if (CDSManager->FIsStaticCycle)
  2658. {
  2659. try
  2660. {
  2661. CtlrItr it;
  2662. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  2663. {
  2664. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  2665. FOR_STL(TVmsIfsc*, pIfsc, pObj->FIfscLists)
  2666. {
  2667. if (!pIfsc->IsUsed) continue;
  2668. if (!pIfsc->CNGS_CNFM_YN) continue; //정체판정이 아닌경우
  2669. TCDSIfsc *pTrfIfsc = CDSIfscManager->FLists.Find(pIfsc->VMS_IFSC_ID);
  2670. if (!pTrfIfsc)
  2671. {
  2672. pIfsc->CNGST_CNT = 0;
  2673. continue;
  2674. }
  2675. if (pTrfIfsc->SPED <= pIfsc->CNGS_CNFM_SPED)
  2676. {
  2677. //현재속도값이 정체판정속도 이하이면 정체판정 횟수를 증가
  2678. if (pIfsc->CNGST_CNT == 0)
  2679. {
  2680. pIfsc->dtCngst = Now();
  2681. }
  2682. pIfsc->CNGST_CNT++;
  2683. }
  2684. else
  2685. {
  2686. //정체판정속도보다 크면 정체횟수를 초기화
  2687. pIfsc->CNGST_CNT = 0;
  2688. }
  2689. }
  2690. }
  2691. }
  2692. catch(Exception &e)
  2693. {
  2694. }
  2695. }
  2696. //VMS의 스케줄정보를 조회한다.
  2697. nResult = LoadVmsScheduleInfo(ADbConn);
  2698. if (nResult < 0)
  2699. {
  2700. MERROR("LoadVmsScheduleInfo: error: %d", nResult);
  2701. }
  2702. CDSManager->FIsStaticCycle = false; //정주기 정보제공주기 플래그 설정
  2703. JOBEND(dwTick);
  2704. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  2705. TIMEDELAY(nResult, dwTick);
  2706. }
  2707. return nResult;
  2708. }
  2709. //---------------------------------------------------------------------------
  2710. int TCDSManager::DownloadVmsForm(TADOConnection *ADbConn, int ACommand)
  2711. {
  2712. int nResult = 0;
  2713. DWORD dwTick = GetTickCount();
  2714. JOBSTART;
  2715. if (ACommand == dbm_dnld_form_cycle || ACommand == dbm_dnld_form_init)
  2716. {
  2717. //정주기 다운로드 이면 모든 VMS에 메시지다운로드 플래그 활성화 시킴
  2718. //모드변경에 의한 다운로드인경우에는 내부통신을 수신한 곳에서 플래그를 활성화 시켰음.
  2719. //1. 현재 운영모드를 다시 한번 읽음
  2720. if (LoadVmsOperationMode(ADbConn) < 0)
  2721. {
  2722. return -1;
  2723. }
  2724. //모든 VMS에 메시지다운로드 플래그 활성화 시킴
  2725. CDSCtlrManager->InitProvide(NULL);
  2726. }
  2727. nResult = MakeVmsScenarioForm(ADbConn, ACommand);
  2728. JOBEND(dwTick);
  2729. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  2730. TIMEDELAY(nResult, dwTick);
  2731. }
  2732. return nResult;
  2733. }
  2734. //---------------------------------------------------------------------------
  2735. int TCDSManager::SaveProvideResult(TADOConnection *ADbConn, void *AData)
  2736. {
  2737. int ii;
  2738. TCDSCtlr *pObj;
  2739. int nJobCnt = 0;
  2740. int nResult;
  2741. VMS_PROVIDE_RESULE *pSave;
  2742. DWORD dwTick = GetTickCount();
  2743. JOBSTART;
  2744. pSave = (VMS_PROVIDE_RESULE*)AData;
  2745. if (!pSave)
  2746. {
  2747. MERROR("SaveProvideResult: Data NULL");
  2748. return -1;
  2749. }
  2750. switch(pSave->Type)
  2751. {
  2752. case provide_form:
  2753. {
  2754. INT_VMS_FORM_DOWNLOAD_REQ VmsSave;
  2755. memset(&VmsSave, 0x00, sizeof(VmsSave));
  2756. VmsSave.Count = 0;
  2757. MINFO(" INF-.DATA: %25.25s: Save Count: %d EA.", __MYFUNC__, pSave->Count);
  2758. for (ii = 0; ii < pSave->Count && ii < MAX_VMS_PROVIDE_RESULT; ii++)
  2759. {
  2760. pObj = (TCDSCtlr*)pSave->pObj[ii];
  2761. if (!pObj) continue;
  2762. if ((nResult = UpdateVmsProvideResult(ADbConn, (void*)pObj)) < 0)
  2763. {
  2764. MERROR("ProvideSave: UpdateVmsProvideResult failed: %d", nResult);
  2765. }
  2766. else
  2767. {
  2768. nJobCnt++;
  2769. memcpy(VmsSave.Unit[VmsSave.Count].VmsId, pObj->CTLR_NMBR.c_str(), INT_VMS_MAX_ID);
  2770. memcpy(VmsSave.Unit[VmsSave.Count].Date, pObj->CTRLMODE->SvcDate.c_str(), INT_VMS_MAX_DATETIME);
  2771. VmsSave.Unit[VmsSave.Count].Result = pObj->CTRLMODE->Result ? vms_download_succ : vms_download_fail;
  2772. VmsSave.Count++;
  2773. if (VmsSave.Count >= INT_VMS_MAX_FORM_DOWNLOAD)
  2774. {
  2775. CComm_VmsFormDownLoadNotify(&VmsSave);
  2776. VmsSave.Count = 0;
  2777. }
  2778. }
  2779. }
  2780. if (VmsSave.Count > 0)
  2781. {
  2782. CComm_VmsFormDownLoadNotify(&VmsSave);
  2783. }
  2784. }
  2785. break;
  2786. case provide_download:
  2787. for (ii = 0; ii < pSave->Count && ii < MAX_VMS_PROVIDE_RESULT; ii++)
  2788. {
  2789. pObj = (TCDSCtlr*)pSave->pObj[ii];
  2790. if (!pObj) continue;
  2791. nJobCnt++;
  2792. if ((nResult = SaveVmsDownLoadJob(ADbConn, (void*)pObj)) < 0)
  2793. {
  2794. MERROR("SaveProvideResult: SaveVmsDownLoadJob failed: %d", nResult);
  2795. }
  2796. }
  2797. break;
  2798. }
  2799. JOBEND(dwTick);
  2800. if (JOBTIME(dwTick) > g_AppCfg.JobTimeout) {
  2801. TIMEDELAY(nJobCnt, dwTick);
  2802. }
  2803. return nJobCnt;
  2804. }
  2805. //---------------------------------------------------------------------------