ParkSysView.cpp
上传用户:trilite
上传日期:2007-04-24
资源大小:261k
文件大小:12k
源码类别:

酒店行业

开发平台:

Visual C++

  1. // ParkSysView.cpp : implementation of the CParkSysView class
  2. //
  3. #include "stdafx.h"
  4. #include "ParkSys.h"
  5. #include "ParkSysDoc.h"
  6. #include "ParkSysView.h"
  7. #include "readprice.h"
  8. #include <atlbase.h>
  9. #include "led.h"
  10. #include "InputBox.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CParkSysView
  18. IMPLEMENT_DYNCREATE(CParkSysView, CFormView)
  19. BEGIN_MESSAGE_MAP(CParkSysView, CFormView)
  20. //{{AFX_MSG_MAP(CParkSysView)
  21. ON_COMMAND(ID_GENERATE_ACCOUNT, OnGenerateAccount)
  22. ON_WM_CTLCOLOR()
  23. ON_WM_CANCELMODE()
  24. ON_COMMAND(ID_CHAREGE, OnCharge)
  25. //}}AFX_MSG_MAP
  26. // Standard printing commands
  27. END_MESSAGE_MAP()
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CParkSysView construction/destruction
  30. CParkSysView::CParkSysView()
  31. : CFormView(CParkSysView::IDD)
  32. {
  33. //{{AFX_DATA_INIT(CParkSysView)
  34. m_enCardID = _T("");
  35. m_enInTime = _T("");
  36. m_exCardID = _T("");
  37. m_exChargeNum = _T("");
  38. m_exInTime = _T("");
  39. m_exOutTime = _T("");
  40. m_exUseTime = _T("");
  41. m_NowCarNum = 0;
  42. m_TotalCarNum = 0;
  43. //}}AFX_DATA_INIT
  44. // TODO: add construction code here
  45. }
  46. CParkSysView::~CParkSysView()
  47. {
  48. CParkSysApp *app = (CParkSysApp *)AfxGetApp();
  49. app->database.Close();
  50. }
  51. void CParkSysView::DoDataExchange(CDataExchange* pDX)
  52. {
  53. CFormView::DoDataExchange(pDX);
  54. //{{AFX_DATA_MAP(CParkSysView)
  55. DDX_Control(pDX, IDC_EX_ANI, m_aviEx);
  56. DDX_Control(pDX, IDC_EN_ANI, m_aviEn);
  57. DDX_Control(pDX, IDC_INIMAGE, m_bmpIn);
  58. DDX_Text(pDX, IDC_EN_CARDID, m_enCardID);
  59. DDX_Text(pDX, IDC_EN_INTIME, m_enInTime);
  60. DDX_Text(pDX, IDC_EX_CARDID, m_exCardID);
  61. DDX_Text(pDX, IDC_EX_CHARGENUM, m_exChargeNum);
  62. DDX_Text(pDX, IDC_EX_INTIME, m_exInTime);
  63. DDX_Text(pDX, IDC_EX_OUTTIME, m_exOutTime);
  64. DDX_Text(pDX, IDC_EX_USETIME, m_exUseTime);
  65. DDX_Text(pDX, IDC_NOWCARNUM, m_NowCarNum);
  66. DDX_Text(pDX, IDC_TOTALCARNUM, m_TotalCarNum);
  67. //}}AFX_DATA_MAP
  68. }
  69. BOOL CParkSysView::PreCreateWindow(CREATESTRUCT& cs)
  70. {
  71. // 初始化串口
  72. //入口
  73. CRegKey regKey;
  74. regKey.Open(HKEY_CURRENT_USER,_T("Software\ParkSys\CommSet"));
  75. //条码打印机
  76. DWORD LabelPrinter;
  77. regKey.QueryValue(LabelPrinter, _T("LPComm"));
  78. LabelPrinter+=1;
  79. if (m_CommLP.InitPort(this, LabelPrinter, 9600, 'N',8,1))
  80. m_CommLP.StartMonitoring();
  81. else
  82. MessageBox("条码打印机连接错误",NULL,MB_OK | MB_ICONERROR);
  83. //电子显示屏
  84. DWORD LED;
  85. regKey.QueryValue(LED, _T("LEDComm"));
  86. LED+=1;
  87. if (m_CommLED.InitPort(this, LED, 9600, 'N',8,1))
  88. {
  89. m_CommLED.StartMonitoring();
  90. }
  91. else
  92. MessageBox("电子显示屏连接错误",NULL,MB_OK | MB_ICONERROR);
  93. //初始化参数
  94. //显示车位
  95. CParkSysApp *app = (CParkSysApp *)AfxGetApp();
  96. CCountTime rs_CountTime( &app->database );
  97. rs_CountTime.Open();
  98. while(!rs_CountTime.IsEOF())
  99. {
  100. m_NowCarNum += 1;
  101. rs_CountTime.MoveNext();
  102. }
  103. rs_CountTime.Close();
  104. //显示总的车位数
  105. regKey.Open(HKEY_CURRENT_USER,_T("Software\ParkSys\ParaSet"));
  106. regKey.QueryValue(m_TotalCarNum, _T("Park_capacity"));
  107. regKey.Close();
  108. return CFormView::PreCreateWindow(cs);
  109. }
  110. /////////////////////////////////////////////////////////////////////////////
  111. // CParkSysView printing
  112. /////////////////////////////////////////////////////////////////////////////
  113. // CParkSysView diagnostics
  114. /////////////////////////////////////////////////////////////////////////////
  115. // CParkSysView message handlers
  116. void CParkSysView::DisplayImage(CLongBinary* image)
  117. {
  118. DWORD lsize = image->m_dwDataLength;
  119. HANDLE ghandle = image->m_hData;
  120. DWORD s = GlobalSize(ghandle);
  121. void* p = GlobalLock(ghandle);
  122. DWORD nBytesToWrite = lsize;
  123. /*#if defined(_DEBUG)
  124. AfxMessageBox("check the existance of carout.bmp");
  125. #endif*/
  126. CString str = ((CParkSysApp *)AfxGetApp())->ExtractFilePath();
  127. str += "carout.bmp";
  128. HANDLE hFile = CreateFile(str,
  129. GENERIC_WRITE,
  130. /*FILE_SHARE_WRITE | FILE_SHARE_READ*/0,NULL,
  131. CREATE_ALWAYS,0,0);
  132. ASSERT(hFile != INVALID_HANDLE_VALUE);
  133. BOOL reval = WriteFile(hFile,p,nBytesToWrite,
  134. &nBytesToWrite, NULL);
  135. CloseHandle(hFile);
  136. /*#if defined(_DEBUG)
  137. AfxMessageBox("check the content of carout.bmp");
  138. #endif*/
  139. BOOL val = GlobalUnlock(ghandle);
  140. HGLOBAL h = GlobalFree(ghandle);
  141. CFile fBmp;
  142. fBmp.Open(str, CFile::modeRead);
  143. DWORD dwLength=fBmp.GetLength();
  144. fBmp.Close();
  145. if (dwLength > 0)
  146. {
  147. TRY
  148. {
  149. DeleteObject(m_bmpIn.SetBitmap((HBITMAP)LoadFromFile(str)));
  150. }
  151. CATCH_ALL(e)
  152. {
  153. AfxMessageBox("Delphi DLL LoadFromFile发生错误!");
  154. THROW_LAST();
  155. }
  156. END_CATCH_ALL
  157. }
  158. else
  159. {
  160. AfxMessageBox("Carout.bmp长度为零!");
  161. }
  162. UpdateData(FALSE);
  163. }                                       
  164. void CParkSysView::OnGrabimage(CString strCardID)
  165. {
  166. CParkSysApp* app = (CParkSysApp *)AfxGetApp();
  167. CString str = app->ExtractFilePath();
  168. str += "carin.dib";
  169. BOOL revalue = capFileSaveDIB(app->avi.m_hWndCap, (LPCTSTR)str);
  170. UpdateWindow();
  171. //判断如果保存图像不成功,那么就直接返回。
  172. if (!revalue)
  173. {
  174. AfxMessageBox("保存图像失败,程序还将继续,但是,在此车出门的时候您不能进行比对。");
  175. return;
  176. }
  177. HANDLE hFile = CreateFile(str,GENERIC_READ,
  178. 0/*FILE_SHARE_READ |FILE_SHARE_WRITE*/,NULL, //读写共享
  179. OPEN_EXISTING,0,0);
  180. ASSERT(hFile != INVALID_HANDLE_VALUE);
  181. DWORD hsize;
  182. DWORD lsize = GetFileSize(hFile, &hsize);
  183. HGLOBAL ghandle = GlobalAlloc(GMEM_MOVEABLE, lsize);
  184. DWORD s = GlobalSize(ghandle);
  185. void* p = GlobalLock(ghandle);
  186. DWORD nBytesToRead = lsize;
  187. BOOL reval = TRUE;
  188. reval = ReadFile(hFile,p,nBytesToRead, &nBytesToRead, NULL);
  189. CloseHandle(hFile);
  190. CLongBinary image;
  191. CCountTime rs_CountTime( &app->database );
  192. //转换2进制文件为16进制文件
  193. CString csSQL = "UPDATE TAB_COUNTTIME SET CAR_IMAGE=0x";
  194. LPTSTR szTemp = new TCHAR[ lsize*2 + 1 ];
  195. extern const TCHAR HEX[256][2];
  196. for (DWORD i = 0; i < lsize; i++)
  197. {
  198. * (szTemp + (i << 1)) = HEX[(unsigned char)*((BYTE*)p + i)][0];
  199. * (szTemp + (i << 1) + 1) = HEX[(unsigned char)*((BYTE*)p + i)][1];
  200. }
  201. szTemp[ lsize*2 ] = 0;
  202. csSQL += szTemp;
  203. csSQL += " WHERE CARD_ID='" + strCardID+"'";
  204. app->database.ExecuteSQL( csSQL );
  205. delete []szTemp;
  206. BOOL val = GlobalUnlock(ghandle);
  207. HGLOBAL h = GlobalFree(ghandle);
  208. }
  209. void CParkSysView::CreateNewLabel()
  210. {
  211. DWORD CardID;
  212. CRegKey regKey;
  213. regKey.Open(HKEY_CURRENT_USER,_T("Software\ParkSys\ParaSet"));
  214. regKey.QueryValue(CardID, _T("LabelCardID"));
  215. if (CardID>=99999)
  216. CardID=0;
  217. CardID += 1;
  218. regKey.SetValue(CardID, _T("LabelCardID"));
  219. regKey.Close();
  220. CParkSysApp* app = (CParkSysApp*)AfxGetApp();
  221. CCountTime rs_CountTime( &app->database );
  222. rs_CountTime.Open();
  223. CardID += 30000000;
  224. char buff[20];
  225. _itoa(CardID, buff, 10);
  226. CString strCardID = buff;
  227. rs_CountTime.AddNew();
  228. rs_CountTime.m_CARD_ID = strCardID;
  229. CTime inTime = CTime::GetCurrentTime();
  230. rs_CountTime.m_IN_TIME = inTime;
  231. rs_CountTime.Update();
  232. rs_CountTime.Close();
  233. //使用Zebra Corp. ZPL II 编码向支持ZPL的条形码打印机发送打印指令。
  234. // ZPL 的意思是 Zebra Programming Language
  235. CString strFormat = "^XAnr"
  236. "^FO200,200^BY3nr"
  237. "^BCN,100,Y,N,N^FD%d^FSnr"
  238. "^FO100,400^FD%s^FSnr"
  239. "^XZnr";
  240. CString strZPLLabel;
  241. //把数据填入到上面的ZPL串中。卡号CardID,进入时间 YYYY-mm-dd hh:MM:SS
  242. strZPLLabel.Format(strFormat, CardID, inTime.Format("%Y-%m-%d %H:%M:%S"));
  243. m_CommLP.WriteToPort(strZPLLabel.GetBuffer(strZPLLabel.GetLength() + 1));
  244. strZPLLabel.ReleaseBuffer();
  245. OnGrabimage(strCardID); //抓取一幅汽车进入图像
  246. m_NowCarNum += 1;
  247. m_enCardID = strCardID;
  248. m_enInTime = inTime.Format("%Y-%m-%d %H:%M:%S");
  249. UpdateData(FALSE);
  250. }
  251. BOOL CParkSysView::Charge(CString cardid, double &cyFee)
  252. {
  253. CParkSysApp *app = (CParkSysApp *)AfxGetApp();
  254. cyFee = 0.0;
  255. CTime inTime;
  256. CTime outTime = CTime::GetCurrentTime();
  257. CTimeSpan spanTime;
  258. CCountTime rs_counttime(&app->database);
  259. rs_counttime.m_strFilter = "Card_ID = '" + cardid + "'";
  260. rs_counttime.Open();
  261. rs_counttime.MoveFirst();
  262. inTime = rs_counttime.m_IN_TIME;
  263. rs_counttime.Close();
  264. //显示卡号
  265. m_exCardID = cardid;
  266. //显示进出时间
  267. spanTime = outTime - inTime;
  268. m_exInTime = inTime.Format( "%Y-%m-%d %H:%M:%S" );
  269. m_exOutTime += outTime.Format( "%Y-%m-%d %H:%M:%S" );
  270. m_exUseTime = spanTime.Format( "%D天%H小时%M分%S秒" );
  271. do
  272. {
  273. if (inTime>=outTime)
  274. {
  275. AfxMessageBox("系统时间错误");
  276. break;
  277. }
  278. if(cardid >= "30000000")
  279. {
  280. double fHours = spanTime.GetTotalMinutes() / 60.0;
  281. //retCode = m_StoredProcFee.PRC_FEE_PC_HOUR(cardid, fHours, &mFee);
  282. //每小时停车费2元RMB
  283. cyFee = fHours * 2.0; 
  284. CString strMoney;
  285. strMoney.Format("%0.4lf元", cyFee);
  286. m_exChargeNum = strMoney;
  287. UpdateData(FALSE);//显示金额
  288. CLED led(&m_CommLED);
  289. led.TakeEffect(CString("!\纸卡收费") + strMoney + "\!@@");
  290. CWaitCursor wait;
  291. CReadPrice readprice;
  292. readprice.ReadPrice(atof(strMoney));
  293. wait.Restore();
  294. if (AfxMessageBox("纸卡用户按时付费,交易结束后按确定,否则按取消。"
  295. , MB_OKCANCEL | MB_ICONINFORMATION) != IDOK)
  296. {
  297. break;
  298. }
  299. }
  300. UpdateData(FALSE);//显示信息
  301. return TRUE;
  302. }while(false);
  303. UpdateData(FALSE);//显示信息
  304. return FALSE;
  305. }
  306. void CParkSysView::OnGenerateAccount() 
  307. {
  308. CreateNewLabel();
  309. m_aviEn.Play();
  310. }
  311. HBRUSH CParkSysView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  312. {
  313. HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
  314. char szClassName[50] = {0};
  315. GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName));
  316. if (strnicmp(szClassName, "EDIT", sizeof(szClassName)) == 0)
  317. {
  318. CBrush brush(RGB(255, 255, 200));
  319. hbr = (HBRUSH)brush.Detach();
  320. pDC->SetBkMode(TRANSPARENT);
  321. }
  322. // TODO: Return a different brush if the default is not desired
  323. return hbr;
  324. }
  325. void CParkSysView::OnCharge() 
  326. {
  327. CString strCardID;
  328. CInputBox inputBox("收费", "请扫描或者输入卡号:", &strCardID);
  329. if (IDOK == inputBox.DoModal())
  330. {
  331. //出车
  332. BOOL ret = CheckCarOut(strCardID);
  333. if (ret)
  334. {
  335. m_aviEx.Play();
  336. }
  337. //计算车辆数量
  338. RefreshCarCount(strCardID);
  339. }
  340. }
  341. LONG CParkSysView::RefreshCarCount(CString strCardID)
  342. {
  343. //得到目前停车场中的车辆数。
  344. CParkSysApp *app = (CParkSysApp *)AfxGetApp();
  345. CCountTime rs_CountTime( &app->database );
  346. rs_CountTime.Open();
  347. if( rs_CountTime.GetRecordCount() != 0 )
  348. {
  349. rs_CountTime.MoveFirst();
  350. }
  351. int RecordCount = 0;
  352. while( !rs_CountTime.IsEOF() )
  353. {
  354. rs_CountTime.MoveNext();
  355. RecordCount += 1;
  356. }
  357. rs_CountTime.Close();
  358. m_NowCarNum = RecordCount;
  359. UpdateData( FALSE );
  360. return 0;
  361. }
  362. BOOL CParkSysView::CheckCarOut(CString strCardID)
  363. {
  364. CParkSysApp *app = (CParkSysApp *)AfxGetApp();
  365. //显示进门的图象
  366. CCountTime rs_CountTime( &app->database );
  367. rs_CountTime.m_strFilter = "TAB_COUNTTIME.CARD_ID='"
  368. + strCardID+"'";
  369. rs_CountTime.Open();
  370. DisplayImage(&rs_CountTime.m_CAR_IMAGE);
  371. rs_CountTime.Close();
  372. //开始收费
  373. double cyFee = 0.0; //金额
  374. BOOL ret = Charge(strCardID, cyFee); 
  375. if(ret)
  376. {
  377. //保存记录和把该车占用的车位还原。
  378. ret = app->database.BeginTrans();
  379. if(ret)
  380. {
  381. TRY
  382. {
  383.  const char * sqlTemplate = "insert into tab_history_card select card_id,"
  384. " in_time, GetDate(), %lf, car_image from"
  385. " tab_counttime where card_id = '%s'";
  386. CString strSQL;
  387. strSQL.Format(sqlTemplate, cyFee, strCardID);
  388. app->database.ExecuteSQL(strSQL);
  389. strSQL = "delete from tab_counttime where"
  390. " Card_id like '" + strCardID + "'";
  391. app->database.ExecuteSQL(strSQL);
  392. ret = app->database.CommitTrans();
  393. if(ret)
  394. --m_NowCarNum;
  395. }
  396. CATCH(CDBException, e)
  397. {
  398. app->database.Rollback();
  399. ret = FALSE;
  400. }
  401. END_CATCH
  402. }
  403. }
  404. UpdateData(FALSE);
  405. return ret;
  406. }