Просмотр исходного кода

外卖订单列表改为异步

zhangyang 6 лет назад
Родитель
Сommit
20bb7ef467

BIN
bin/Win32/Debug/zhipuzi_pos_windows/db/pos.db


+ 12 - 0
bin/Win32/Debug/zhipuzi_pos_windows/skin/main.xml

@@ -55,6 +55,18 @@
 						<WaimaiOrderList name="orderlist" vscrollbar="true">
 						
 						</WaimaiOrderList>
+						
+						<HorizontalLayout name="main_orderlist_loading">
+							<Control></Control>
+							<VerticalLayout width="24">
+								<Control></Control>
+								<HorizontalLayout height="24">
+									<GifAnim bkimage="loading.gif" autosize="true"></GifAnim>
+								</HorizontalLayout>
+								<Control></Control>
+							</VerticalLayout>
+							<Control></Control>
+						</HorizontalLayout>
 					</HorizontalLayout>
 				</VerticalLayout>
 				

BIN
bin/Win32/Debug/zhipuzi_pos_windows/zhipuzi_pos_windows.exe


+ 57 - 9
zhipuzi_pos_windows/control/OrderListUI.cpp

@@ -5,50 +5,94 @@
 
 #include "ControlEx.h"
 
+OrderListUI::OrderListUI()
+{
+	
+}
+
+OrderListUI::~OrderListUI()
+{
+	
+}
+
 void OrderListUI::Refresh()
 {
+	//开始转菊花
+	this->SetVisible(false);
+
+	m_pManager->FindControl(_T("main_orderlist_loading"))->SetVisible(true);
+
+	//启动一个线程,进行网络请求操作
+	OrderListStatus* status =  new OrderListStatus;
+	status->m_status = m_status;
+	status->m_page = m_page;
+
+	std::thread t(&OrderListUI::HandleRefresh, this, status);
+	t.detach();
+}
+
+void OrderListUI::HandleRefresh(OrderListStatus* status)
+{
 	std::string url;
-	if (m_status == 1)
+	if (status->m_status == 1)
 	{
 		url = "/waimaiorder/getopenlist";
 	}
-	else if (m_status == 2)
+	else if (status->m_status == 2)
 	{
 		url = "/waimaiorder/getconfirmedlist";
 	}
-	else if (m_status == 3)
+	else if (status->m_status == 3)
 	{
 		url = "/waimaiorder/getdeliverylist";
 	}
-	else if (m_status == 4)
+	else if (status->m_status == 4)
 	{
 		url = "/waimaiorder/getsucceededlist";
 	}
-	else if (m_status == 5)
+	else if (status->m_status == 5)
 	{
 		url = "/waimaiorder/getfailedlist";
 	}
-	else if (m_status == 6)
+	else if (status->m_status == 6)
 	{
 		url = "/waimaiorder/getcancelledlist";
 	}
-	else if (m_status == 7)
+	else if (status->m_status == 7)
 	{
 		url = "/waimaiorder/getrefundlist";
 	}
 
 	//请求外卖的未处理订单,直接用当前的page值去请求
 	std::map<string, string> params;
-	params["page"] = to_string(m_page);
+	params["page"] = to_string(status->m_page);
 	std::string response;
 
 	CZhipuziHttpClient::RequestOld(url.c_str(), params, response);
 
+	//走到这里,网络请求结束了,对比状态是否发生了改变
+	if (status->m_page != m_page || status->m_status != m_status)
+	{
+		//用户已经点击了其他状态,这个状态结果无效了,直接返回
+		delete status;
+		return;
+	}
+		
+	//将网络返回结果保存起来,等待消息处理重新渲染页面
+	m_response = response;
+
+	::PostMessage(m_pManager->GetPaintWindow(), WM_ORDERLIST_REFRESH, 0, 0);
+
+	delete status;
+}
+
+void OrderListUI::DoRefresh()
+{
 	//请求成功之后,清空之前的数据
 	this->RemoveAll();
 
 	rapidjson::Document document;
-	document.Parse(response.c_str());
+	document.Parse(m_response.c_str());
 
 	if (document.HasParseError())
 	{
@@ -134,6 +178,10 @@ void OrderListUI::Refresh()
 	size.cx = 0;
 	size.cy = 0;
 	this->SetScrollPos(size);
+
+	this->SetVisible(true);
+
+	m_pManager->FindControl(_T("main_orderlist_loading"))->SetVisible(false);
 }
 
 void OrderListUI::LastPage()

+ 17 - 0
zhipuzi_pos_windows/control/OrderListUI.h

@@ -1,8 +1,19 @@
 #pragma once
 
+class OrderListStatus
+{
+public:
+	int m_status;
+	int m_page;
+};
+
 class OrderListUI : public CVerticalLayoutUI
 {
 public:
+	OrderListUI();
+
+	~OrderListUI();
+
     //刷新当前页面的内容,注意这个函数不会改变当前的订单状态以及“页数”
     void Refresh();
 
@@ -22,9 +33,15 @@ public:
 		m_page = n;
 	}
 
+	void HandleRefresh(OrderListStatus* status);
+
+	void DoRefresh();
+
 private:
     int m_status = 1; //1:未处理 2:已确认 3:配送中 4:成功 5:失败 6:已取消 7:退款中
 	int m_page = 1;
 
 	int m_total_page; //总页数
+
+	std::string m_response;
 };

+ 2 - 0
zhipuzi_pos_windows/helper/define.h

@@ -9,4 +9,6 @@
 #define WM_UPDATEPROGRESS 10006
 #define WM_DOWNLOAD_FINISH 10007
 
+#define WM_ORDERLIST_REFRESH 10008
+
 

+ 5 - 5
zhipuzi_pos_windows/wnd/CLoginWnd.cpp

@@ -354,12 +354,12 @@ void CLoginWnd::StartLogin()
 
 void CLoginWnd::HandleLogin()
 {
-	//真正登录前,先检测是否有需要更新
-	CSystem::my_sleep(1);
+	////真正登录前,先检测是否有需要更新
+	//CSystem::my_sleep(1);
 
-	//如果需要更新,那么就提示
-	PostMessage(WM_NEED_UPDATE);
-	return;
+	////如果需要更新,那么就提示
+	//PostMessage(WM_NEED_UPDATE);
+	//return;
 
     //判断账号密码是否正确
     std::wstring account, password;

+ 11 - 1
zhipuzi_pos_windows/wnd/CMainWnd.cpp

@@ -948,7 +948,9 @@ LRESULT CMainWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
     case  WM_SHOWTASK:
         lRes = OnTrayIcon(uMsg, wParam, lParam, bHandled);
         break;
-
+	case WM_ORDERLIST_REFRESH:
+		lRes = OnOrderlistRefresh(uMsg, wParam, lParam, bHandled);
+		break;
     default:
         bHandled = FALSE;
     }
@@ -1234,6 +1236,14 @@ LRESULT CMainWnd::OnTrayIcon(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHan
     return 0;
 }
 
+LRESULT CMainWnd::OnOrderlistRefresh(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
+{
+	OrderListUI* orderlist = static_cast<OrderListUI*>(m_pm.FindControl(_T("orderlist")));
+	orderlist->DoRefresh();
+
+	return 1;
+}
+
 void CMainWnd::InitSettingStatus()
 {
 	CLabelUI* version = static_cast<CLabelUI*>(m_pm.FindControl(_T("setting_version")));

+ 1 - 0
zhipuzi_pos_windows/wnd/CMainWnd.h

@@ -65,6 +65,7 @@ public:
 
     LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
 
+	LRESULT OnOrderlistRefresh(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
 
     //添加托盘图标(初始化)
     void AddTrayIcon();