SMS0010MF.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. /****************************************************************************
  2. * @source :
  3. * @description :
  4. ****************************************************************************
  5. * DATE AUTHOR DESCRIPTION
  6. * --------------------------------------------------------------------------
  7. * 2011/12/24 정승호 최초작성
  8. *
  9. ****************************************************************************/
  10. //---------------------------------------------------------------------------
  11. #include <vcl.h>
  12. #include "ITSSkinF.h"
  13. #include "ITSUtilF.h"
  14. #include "ITSDbF.h"
  15. #include "AppGlobalF.h"
  16. #include "CDSCodeF.h"
  17. #include "CDSNodeF.h"
  18. #include "CDSLinkF.h"
  19. #include "CDSServiceLinkF.h"
  20. #include "CDSRoadF.h"
  21. #pragma hdrstop
  22. #include "SMS0010MF.h"
  23. #include "ITSSEL2MF.h"
  24. #include "ITSSELAMF.h"
  25. //---------------------------------------------------------------------------
  26. #pragma package(smart_init)
  27. #pragma link "cxButtons"
  28. #pragma link "cxClasses"
  29. #pragma link "cxContainer"
  30. #pragma link "cxControls"
  31. #pragma link "cxCustomData"
  32. #pragma link "cxData"
  33. #pragma link "cxDataStorage"
  34. #pragma link "cxDropDownEdit"
  35. #pragma link "cxEdit"
  36. #pragma link "cxFilter"
  37. #pragma link "cxGraphics"
  38. #pragma link "cxGrid"
  39. #pragma link "cxGridCustomTableView"
  40. #pragma link "cxGridCustomView"
  41. #pragma link "cxGridLevel"
  42. #pragma link "cxGridTableView"
  43. #pragma link "cxGroupBox"
  44. #pragma link "cxLabel"
  45. #pragma link "cxLookAndFeelPainters"
  46. #pragma link "cxLookAndFeels"
  47. #pragma link "cxMaskEdit"
  48. #pragma link "cxSpinEdit"
  49. #pragma link "cxSplitter"
  50. #pragma link "cxStyles"
  51. #pragma link "cxTextEdit"
  52. #pragma link "cxTimeEdit"
  53. #pragma link "dxSkinBlack"
  54. #pragma link "dxSkinBlue"
  55. #pragma link "dxSkinCaramel"
  56. #pragma link "dxSkinCoffee"
  57. #pragma link "dxSkinDarkRoom"
  58. #pragma link "dxSkinDarkSide"
  59. #pragma link "dxSkinFoggy"
  60. #pragma link "dxSkinGlassOceans"
  61. #pragma link "dxSkiniMaginary"
  62. #pragma link "dxSkinLilian"
  63. #pragma link "dxSkinLiquidSky"
  64. #pragma link "dxSkinLondonLiquidSky"
  65. #pragma link "dxSkinMcSkin"
  66. #pragma link "dxSkinMoneyTwins"
  67. #pragma link "dxSkinOffice2007Black"
  68. #pragma link "dxSkinOffice2007Blue"
  69. #pragma link "dxSkinOffice2007Green"
  70. #pragma link "dxSkinOffice2007Pink"
  71. #pragma link "dxSkinOffice2007Silver"
  72. #pragma link "dxSkinOffice2010Black"
  73. #pragma link "dxSkinOffice2010Blue"
  74. #pragma link "dxSkinOffice2010Silver"
  75. #pragma link "dxSkinsCore"
  76. #pragma link "dxSkinscxPCPainter"
  77. #pragma link "dxSkinSeven"
  78. #pragma link "dxSkinSharp"
  79. #pragma link "dxSkinSilver"
  80. #pragma link "dxSkinStardust"
  81. #pragma link "cxCalc"
  82. #pragma link "cxButtonEdit"
  83. #pragma link "cxCheckBox"
  84. #pragma link "cxMemo"
  85. #pragma resource "*.dfm"
  86. TSMS0010M *SMS0010M = NULL;
  87. //---------------------------------------------------------------------------
  88. __fastcall TSMS0010M::TSMS0010M(TComponent* Owner)
  89. : TForm(Owner)
  90. {
  91. ITSSkin_Load(this);
  92. CMM_LoadForm(g_sFormsDir, this);
  93. FTitle = "SMS 문자발송";
  94. }
  95. //---------------------------------------------------------------------------
  96. /*
  97. * 닫기버튼 이나 x버튼 클릭시 공통으로 처리하는 로직이들어간다..
  98. * Form과 DataModule class를 delete시킨다.
  99. * arguments
  100. *
  101. * return
  102. * void
  103. */
  104. void __fastcall TSMS0010M::CommClose()
  105. {
  106. try
  107. {
  108. CMM_SaveForm(g_sFormsDir, this);
  109. }
  110. catch(...)
  111. {
  112. }
  113. }
  114. //---------------------------------------------------------------------------
  115. /*
  116. * form 초기화
  117. *
  118. * arguments
  119. *
  120. * return
  121. * void
  122. */
  123. void __fastcall TSMS0010M::FormInit()
  124. {
  125. memoSMS->Lines->Clear();
  126. }
  127. //---------------------------------------------------------------------------
  128. /*
  129. * Form을 보여줄때 호출되는 event 메서드이다.
  130. * arguments
  131. * Sender : event handler 객체
  132. * return
  133. * void
  134. */
  135. void __fastcall TSMS0010M::FormShow(TObject *Sender)
  136. {
  137. Refresh();
  138. FormInit();
  139. TmrShow->Enabled = true;
  140. }
  141. //---------------------------------------------------------------------------
  142. /*
  143. * Form이 Show되고 난 후 최초 1회 수행되는 타이머 이벤트
  144. * arguments
  145. * Sender : event handler 객체
  146. * return
  147. * void
  148. */
  149. void __fastcall TSMS0010M::TmrShowTimer(TObject *Sender)
  150. {
  151. TmrShow->Enabled = false;
  152. BtnSearchClick((TObject*)BtnSearch);
  153. }
  154. //---------------------------------------------------------------------------
  155. /*
  156. * Search 버튼 클릭 이벤트 핸들러
  157. * arguments
  158. * Sender : event handler 객체
  159. * return
  160. * void
  161. */
  162. void __fastcall TSMS0010M::BtnSearchClick(TObject *Sender)
  163. {
  164. RefreshData();
  165. }
  166. //---------------------------------------------------------------------------
  167. /*
  168. * Refresh Data Event Function
  169. * arguments
  170. *
  171. * return
  172. * void
  173. */
  174. void __fastcall TSMS0010M::RefreshData()
  175. {
  176. SelSmsUserList();
  177. }
  178. //---------------------------------------------------------------------------
  179. void __fastcall TSMS0010M::SelSmsUserList()
  180. {
  181. TSqlCursor sqlCrs;
  182. String sQry;
  183. TADOQuery *pADO = ADOQry;
  184. TcxGridTableView *pTvList = TvList1;
  185. TcxDataController *pGDC = pTvList->DataController;
  186. CMM_ClearGridTableView(pTvList);
  187. sQry = "SELECT A.SMS_USER_ID, \r\n"
  188. " A.SMS_USER_NM, \r\n"
  189. " A.SMS_USER_TEL, \r\n"
  190. " A.SMS_USER_EXPL, \r\n"
  191. " A.SMS_RPLY_TEL, \r\n"
  192. " A.RGST_DT \r\n"
  193. " FROM TB_SMS_USER A \r\n"
  194. " ORDER BY A.SMS_USER_ID \r\n";
  195. try
  196. {
  197. pADO->Connection = ITSDb_GetConnection();
  198. ITSDb_SQLText(pADO, sQry);
  199. ITSDb_SQLOpen(pADO);
  200. int nRow = 0;
  201. try
  202. {
  203. pTvList->BeginUpdate();
  204. pGDC->RecordCount = pADO->RecordCount;
  205. for( ; !pADO->Eof; pADO->Next(), nRow++)
  206. {
  207. pGDC->Values[nRow][ColumnSel->Index] = true;
  208. pGDC->Values[nRow][AColumn02->Index] = pADO->FieldByName("SMS_USER_ID")->AsString;
  209. pGDC->Values[nRow][AColumn03->Index] = pADO->FieldByName("SMS_USER_NM")->AsString;
  210. pGDC->Values[nRow][AColumn04->Index] = pADO->FieldByName("SMS_USER_TEL")->AsString;
  211. pGDC->Values[nRow][AColumn05->Index] = pADO->FieldByName("SMS_RPLY_TEL")->AsString;
  212. pGDC->Values[nRow][AColumn06->Index] = pADO->FieldByName("SMS_USER_EXPL")->AsString;
  213. //pGDC->Values[nRow][AColumn07->Index] = ITSUtil_StrToTime(pADO->FieldByName("RGST_DT")->AsString);
  214. }
  215. }
  216. __finally
  217. {
  218. if (pADO)
  219. {
  220. pADO->Close();
  221. }
  222. pTvList->EndUpdate();
  223. //LblRecords->Caption = FormatFloat("##,##0", pGDC->RecordCount) + " 건";
  224. }
  225. }
  226. catch(EDatabaseError &E)
  227. {
  228. ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
  229. throw Exception(String(E.ClassName()) + E.Message);
  230. }
  231. catch(...)
  232. {
  233. ::PostMessage(Application->MainForm->Handle, (UINT)(WM_USER+0xF4), (WPARAM)0xB2, (LPARAM)0xB2);
  234. throw Exception("알수없는 오류가 발생하였습니다.");
  235. }
  236. }
  237. //---------------------------------------------------------------------------
  238. /*
  239. * Close 버튼 클릭 이벤트 핸들러
  240. * arguments
  241. * Sender : event handler 객체
  242. * return
  243. * void
  244. */
  245. void __fastcall TSMS0010M::BtnCloseClick(TObject *Sender)
  246. {
  247. Close();
  248. }
  249. //---------------------------------------------------------------------------
  250. void __fastcall TSMS0010M::FormClose(TObject *Sender, TCloseAction &Action)
  251. {
  252. CommClose();
  253. SMS0010M = NULL;
  254. Action = caFree;
  255. }
  256. //---------------------------------------------------------------------------
  257. bool __fastcall TSMS0010M::CheckField()
  258. {
  259. String sMsg = memoSMS->Lines->Text.Trim();
  260. if (sMsg == "")
  261. {
  262. Application->MessageBox(L"SMS 발송문자를 확인 하세요.", Caption.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  263. return false;
  264. }
  265. int nSelCount = CMM_GetCheckCount(TvList1, ColumnSel->Index);
  266. if (nSelCount == 0)
  267. {
  268. Application->MessageBox(L"SMS 발송대상자가 선택되지 않았습니다.\r\nSMS 발송대상자을 체크하여 선택하십시요.",
  269. Caption.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  270. return false;
  271. }
  272. return true;
  273. }
  274. //---------------------------------------------------------------------------
  275. bool __fastcall TSMS0010M::GetMsgNewId(int &ANewId)
  276. {
  277. String sQry;
  278. TADOQuery *pADO = NULL;
  279. ANewId = 0;
  280. sQry = "SELECT NVL(MAX(SMS_SEQ), 0) + 1 AS NEWID \r\n"
  281. " FROM TB_SMS_SEND_PNST \r\n";
  282. try
  283. {
  284. try
  285. {
  286. pADO = new TADOQuery(NULL);
  287. pADO->Close();
  288. pADO->Connection = ITSDb_GetConnection();
  289. pADO->SQL->Clear();
  290. pADO->SQL->Text = sQry;
  291. pADO->Open();
  292. ANewId = pADO->FieldByName("NEWID")->AsInteger;
  293. return true;
  294. }
  295. catch(EDatabaseError &E)
  296. {
  297. throw Exception(String(E.ClassName()) + E.Message);
  298. }
  299. catch(Exception &exception)
  300. {
  301. throw Exception(String(exception.ClassName()) + exception.Message);
  302. }
  303. catch(...)
  304. {
  305. throw Exception("알수없는 DB 오류가 발생하였습니다.");
  306. }
  307. }
  308. __finally
  309. {
  310. if (pADO)
  311. {
  312. pADO->Close();
  313. delete pADO;
  314. }
  315. }
  316. return false;
  317. }
  318. //---------------------------------------------------------------------------
  319. void __fastcall TSMS0010M::SaveSmsSendMsg(TADOConnection *ADbCon/*=NULL*/, bool ALocal/*=true*/)
  320. {
  321. if (!ADbCon) ADbCon = ITSDb_GetConnection();
  322. TADOQuery *pADO = NULL;
  323. String sQry;
  324. String sSendMsg = memoSMS->Lines->Text.Trim();
  325. int nNewId = 0;
  326. try
  327. {
  328. if (ALocal)
  329. {
  330. if (!GetMsgNewId(nNewId))
  331. {
  332. return;
  333. }
  334. }
  335. if (ALocal)
  336. {
  337. sQry = "INSERT INTO TB_SMS_SEND_PNST(SMS_SEQ, \r\n"
  338. " SEND_TEL, \r\n"
  339. " RPLY_TEL, \r\n"
  340. " SEND_MSG, \r\n"
  341. " SMS_CRTN_DT) \r\n"
  342. " VALUES(:p01, \r\n"
  343. " :p02, \r\n"
  344. " :p03, \r\n"
  345. " :p04, \r\n"
  346. " TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS')) \r\n";
  347. }
  348. else
  349. {
  350. sQry = "INSERT INTO EM_TRAN(TRAN_PR, \r\n"
  351. " TRAN_PHONE, \r\n"
  352. " TRAN_CALLBACK, \r\n"
  353. " TRAN_STATUS, \r\n"
  354. " TRAN_DATE, \r\n"
  355. " TRAN_MSG, \r\n"
  356. " TRAN_TYPE) \r\n"
  357. " VALUES(EM_TRAN_PR.NEXTVAL, \r\n"
  358. " :p02, \r\n"
  359. " :p03, \r\n"
  360. " '1', \r\n"
  361. " SYSDATE, \r\n"
  362. " :p04, \r\n"
  363. " 4 ) \r\n";
  364. }
  365. TvList1->BeginUpdate();
  366. try
  367. {
  368. pADO = new TADOQuery(NULL);
  369. pADO->Close();
  370. pADO->Connection = ADbCon;
  371. ITSDb_SQLText(pADO, sQry);
  372. ADbCon->BeginTrans();
  373. int nRowCnt = TvList1->ViewData->RecordCount;
  374. for (int ii = 0; ii < nRowCnt; ii++)
  375. {
  376. TcxCustomGridRow* ARow = TvList1->ViewData->Rows[ii];
  377. if (((bool)ARow->Values[ColumnSel->Index]))
  378. {
  379. String sCallTel = ARow->Values[AColumn04->Index];
  380. String sBackTel = ARow->Values[AColumn05->Index];
  381. if (ALocal)
  382. {
  383. ITSDb_SQLBind(pADO, "p01", String(nNewId++));
  384. }
  385. ITSDb_SQLBind(pADO, "p02", sCallTel);
  386. ITSDb_SQLBind(pADO, "p03", sBackTel);
  387. ITSDb_SQLBind(pADO, "p04", sSendMsg);
  388. ITSDb_SQLExec(pADO);
  389. }
  390. }
  391. ADbCon->CommitTrans();
  392. Application->MessageBox(L"선택하신 SMS 발송대상자에게 SMS 메시지 전송을 정상적으로 요청하였습니다.",
  393. Caption.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  394. }
  395. catch(EDatabaseError &E)
  396. {
  397. ADbCon->RollbackTrans();
  398. ShowMessage(String(E.ClassName()) + E.Message);
  399. }
  400. catch(Exception &exception)
  401. {
  402. ADbCon->RollbackTrans();
  403. ShowMessage(String(exception.ClassName()) + exception.Message);
  404. }
  405. catch(...)
  406. {
  407. ADbCon->RollbackTrans();
  408. ShowMessage("데이터 작업 중에 알수없는 DB 오류가 발생하였습니다.");
  409. }
  410. }
  411. __finally
  412. {
  413. if (pADO)
  414. {
  415. pADO->Close();
  416. delete pADO;
  417. }
  418. TvList1->EndUpdate();
  419. }
  420. }
  421. //---------------------------------------------------------------------------
  422. void __fastcall TSMS0010M::BtnOperatorInputClick(TObject *Sender)
  423. {
  424. if (!CheckField()) return;
  425. if (Application->MessageBox(L"SMS 메시지를 전송 하시겠습니까?", L"SMS 메시지 전송", MB_YESNO|MB_ICONQUESTION|MB_APPLMODAL) != IDYES) return;
  426. bool bRemote = false;
  427. TADOConnection *pConnection = NULL;
  428. String sDbConnString;
  429. if (bRemote)
  430. {
  431. #if 0
  432. sDbConnString = "";
  433. sDbConnString += "Provider=" + g_AppCfg.smsdb.sProvider;
  434. sDbConnString += ";Password=" + g_AppCfg.smsdb.sPassword;
  435. sDbConnString += ";Persist Security Info=True";
  436. sDbConnString += ";User ID=" + g_AppCfg.smsdb.sUserName;
  437. sDbConnString += ";Data Source=" + g_AppCfg.smsdb.sServerName;
  438. #endif
  439. }
  440. try
  441. {
  442. if (bRemote)
  443. {
  444. pConnection = new TADOConnection(NULL);
  445. if (!DbConnect(pConnection, sDbConnString))
  446. {
  447. Application->MessageBox(L"SMS 데이터베이스와 연결에 실패하였습니다.",
  448. L"SMS 데이터베이스 연결 실패", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  449. return;
  450. }
  451. SaveSmsSendMsg(pConnection, false);
  452. }
  453. else
  454. {
  455. SaveSmsSendMsg();
  456. }
  457. }
  458. __finally
  459. {
  460. if (bRemote)
  461. {
  462. DbClose(pConnection);
  463. delete pConnection;
  464. pConnection = NULL;
  465. }
  466. }
  467. }
  468. //---------------------------------------------------------------------------
  469. bool __fastcall TSMS0010M::DbConnect(TADOConnection *AConnection, String AConnString)
  470. {
  471. if (!AConnection) return false;
  472. try
  473. {
  474. AConnection->ConnectionString = AConnString;
  475. AConnection->KeepConnection = true;
  476. AConnection->LoginPrompt = false;
  477. AConnection->Open();
  478. }
  479. catch(EDatabaseError &E)
  480. {
  481. ShowMessage(E.Message);
  482. return false;
  483. }
  484. catch (Exception &e)
  485. {
  486. ShowMessage(e.Message);
  487. return false;
  488. }
  489. catch (...)
  490. {
  491. ShowMessage("데이터베이스 연결실패-알수없는 오류");
  492. return false;
  493. }
  494. return true;
  495. }
  496. //---------------------------------------------------------------------------
  497. void __fastcall TSMS0010M::DbClose(TADOConnection *AConnection)
  498. {
  499. if (!AConnection) return;
  500. if (AConnection->Connected)
  501. {
  502. AConnection->Close();
  503. }
  504. }
  505. //---------------------------------------------------------------------------
  506. void __fastcall TSMS0010M::TvList1MouseMove(TObject *Sender, TShiftState Shift, int X,
  507. int Y)
  508. {
  509. try
  510. {
  511. TcxGridSite *ASite = (TcxGridSite *)Sender;
  512. //Screen->Cursor = crDefault;
  513. //TcxCustomGridHitTest *AHitTest = tvSel->GetHitTest(X, Y);
  514. TcxCustomGridHitTest *AHitTest = dynamic_cast<TcxGridRecordHitTest*>(ASite->ViewInfo->GetHitTest(X, Y));
  515. if (dynamic_cast<TcxGridRecordHitTest*>(ASite->ViewInfo->GetHitTest(X, Y)))
  516. {
  517. int ARow = ((TcxGridRecordCellHitTest*)AHitTest)->GridRecord->Index;
  518. if (((TcxGridRecordCellHitTest*)AHitTest)->Item == NULL) return;
  519. int ACol = ((TcxGridRecordCellHitTest*)AHitTest)->Item->Index;
  520. if (ACol == ColumnSel->Index &&
  521. ARow < ASite->GridView->DataController->RecordCount-1)
  522. {
  523. Screen->Cursor = crHandPoint;
  524. }
  525. }
  526. else
  527. {
  528. Screen->Cursor = crDefault;
  529. }
  530. }
  531. catch(...)
  532. {
  533. }
  534. }
  535. //---------------------------------------------------------------------------
  536. void __fastcall TSMS0010M::BtnAllSelectClick(TObject *Sender)
  537. {
  538. TcxButton *pBtn = (TcxButton*)Sender;
  539. CMM_CheckAllListItem(TvList1, ColumnSel->Index, pBtn->Tag);
  540. }
  541. //---------------------------------------------------------------------------
  542. void __fastcall TSMS0010M::BtnCnfmCancelClick(TObject *Sender)
  543. {
  544. memoSMS->Lines->Clear();
  545. }
  546. //---------------------------------------------------------------------------