Commit 4a4803f1 by wuyang.zou

fix bug: 解决经过一天业务逻辑后,重启插件,插件拉取门店有效订单出现死锁问题

parent 0e439129
......@@ -177,6 +177,26 @@ void FlowControl::_AddOrderPull(const QString &orderId, const QString &channel,
m_PullOrderDataMutex.unlock();
}
bool FlowControl::_TryAddOrderPull(const QString &orderId, const QString &channel, const int &pageNumber, const int &pageSize)
{
bool btryLock = m_PullOrderDataMutex.tryLock(2000);
if (btryLock){
/***组装从FM外卖service端的拉单请求参数***/
PullOrderInfo* orderPull = new PullOrderInfo();
orderPull->orderId=orderId;
orderPull->channel=channel;
orderPull->pageNumber=pageNumber;
orderPull->pageSize=pageSize;
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---FlowControl::_TryAddOrderPull orderId:%1--->>>>]").arg(orderId);
m_orderPullList.append(orderPull);
m_PullOrderDataMutex.unlock();
}
return btryLock;
}
//避免 此槽函数 与 拉单定时器触发的槽函数mutex阻塞挂住:因此不调用 emit doPullOrder函数;
//void FlowControl::_GetReadyForPullOrder(const QString &orderId, const QString &channel){}
......@@ -184,8 +204,11 @@ void FlowControl::_ClickOMSAssignArea()
{
// 由于星巴克POS存在两种屏幕[①大屏:1366*768 ②小屏:1024*768] 因此采用获取系统屏幕底部坐标减去一个相对距离来实现正确的点击事件(2018-08-13 初步设定:x-10,y-30);
// QPoint point=ConfigManger::GetInstance().GetOMSBtnPostion();
int nWidth = GetSystemMetrics(SM_CXSCREEN) - ConfigManger::GetInstance().GetOMSBtnWidthOffset();
int nHeight = GetSystemMetrics(SM_CYSCREEN) - ConfigManger::GetInstance().GetOMSBtnHeightOffset();
int xOffset = ConfigManger::GetInstance().GetOMSBtnWidthOffset();
int yOffset = ConfigManger::GetInstance().GetOMSBtnHeightOffset();
QLOG_INFO()<<QString::fromLocal8Bit("(yOffset%1:,yOffset:%2)").arg(xOffset).arg(yOffset);
int nWidth = GetSystemMetrics(SM_CXSCREEN) - xOffset;
int nHeight = GetSystemMetrics(SM_CYSCREEN) - yOffset;
QLOG_INFO()<<QString::fromLocal8Bit("(x%1:,y:%2)").arg(nWidth).arg(nHeight);
SetCursorPos(nWidth,nHeight);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
......@@ -613,7 +636,6 @@ bool FlowControl::_PullOrderDetail(const QString& orderId)
{
m_pullTimer->start(1000*10);
// 如果某次拉订单列表出现失败;此函数的外层函数 _PullOrderData:会将本次拉单对象存起来,等待下次拉取;
//_AddOrderPull(orderId);
}else{
m_pullTimer->start(1000*2);
}
......@@ -634,7 +656,7 @@ bool FlowControl::_PullOrderList(const int &pageSize, const int &pageNo)
int ordertotalSum;
sendJson = DataManger::GetInstance().GetPullOrderListData(pageNo,pageSize);
QLOG_INFO() << QString("[<<<<---Pull Order List--->>>>][requestData:]")<<sendJson;
QLOG_INFO() << QString("[<<<<---FlowControl::_PullOrderList: Pull Order List--->>>>][requestData:]")<<sendJson;
if(ConfigManger::GetInstance().GetOrderSslConfig())
{
// m_pullOrderSocket->SetSslConfig();
......@@ -649,7 +671,7 @@ bool FlowControl::_PullOrderList(const int &pageSize, const int &pageNo)
QLOG_INFO()<<ConfigManger::GetInstance().GetOrderServerUrl()+
ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_PULLORDERLIST)<< " requestData: " <<sendJson;
result = m_pullOrderListSocket->PostRequest(sendJson, recvJson, error);
QLOG_INFO() << QString("[<<<<---Pull Order List Finish.--->>>>][result:%1][msg:%2]")
QLOG_INFO() << QString("[<<<<---FlowControl::_PullOrderList:Pull Order List Finish.--->>>>][result:%1][msg:%2]")
.arg(result).arg(error)<<recvJson;
if(!result)
{
......@@ -661,7 +683,7 @@ bool FlowControl::_PullOrderList(const int &pageSize, const int &pageNo)
if(JSON_STATUSCODE_OK != recvJson[JSON_ERRCODE].toInt())
{
QString error = recvJson[JSON_ERRMSG].toString();
QLOG_ERROR() << QString("[<<<<---Pull Order List Error--->>>>][msg->%1]").arg(error);
QLOG_ERROR() << QString("[<<<<---FlowControl::_PullOrderList:Pull Order List Error--->>>>][msg->%1]").arg(error);
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("获取订单失败![%1]").arg(error));
result=false;
}else
......@@ -678,9 +700,18 @@ bool FlowControl::_PullOrderList(const int &pageSize, const int &pageNo)
m_orderCount+=50;
if(m_orderCount<ordertotalSum)
{
_AddOrderPull(QString(),QString(),pageNo+1,pageSize);
//避免出现存在多页数据,导致出现死锁: 先调用定时器的timeout 触发槽函数:_PullOrderData,
//_PullOrderData:内部会有加锁并且会调用分页获取订单函数_AddOrderPull(QString(),QString(),pageNo+1,pageSize): 内部也有加锁,所以导致死锁;
//_AddOrderPull(QString(),QString(),pageNo+1,pageSize);
/***组装从FM外卖service端的拉单请求参数***/
PullOrderInfo* orderPull = new PullOrderInfo();
orderPull->orderId=QString();
orderPull->channel=QString();
orderPull->pageNumber=pageNo+1;
orderPull->pageSize=pageSize;
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---FlowControl::_PullOrderList: Next Page Order List :pageNo:%1--->>>>]").arg(pageNo+1);
m_orderPullList.append(orderPull);
//避免出现存在多页数据,导致出现死锁;
//_PullOrderData();
}
}
}
......@@ -689,7 +720,6 @@ bool FlowControl::_PullOrderList(const int &pageSize, const int &pageNo)
{
m_pullTimer->start(1000*10);
// 如果某次拉订单列表出现失败;此函数的外层函数 _PullOrderData: 还会将本次拉单列表存起来等待下次拉取;
//_AddOrderPull(QString(),QString(),pageNo,pageSize);
}
QLOG_INFO()<<"[<<<<---Pull Order List Result--->>>>]"<< result;
return result;
......@@ -1037,11 +1067,12 @@ bool FlowControl::_RefundOrder(const QString &orderId,int reasonCode,const QStri
orderObject->orderStatus = orderStatus;
emit changeOrderStatus(orderObject, oldOrderStatus);
emit doHideMainShowFloatFrom();
emit doLockFloatForm();
//退货订单,将此订单添加到simphony 模拟点单列表中;
QLOG_INFO() << QString("[<<<<---FmTakeout _RefundOrder: orderObject->id:%1 , orderObject->orderStatus:%2 --->>>>]").arg(orderObject->id).arg(orderObject->orderStatus);
QLOG_INFO() << QString("[<<<<---FmTakeout _RefundOrder: orderObject->id:%1 , orderObject->isCancle:%2 --->>>>]").arg(orderObject->id).arg(orderObject->isCancle);
if (OrderObject::Refunded == orderObject->orderStatus && OrderObject::SimExcept != oldOrderStatus) {
//只有退单成功 且 是录POS 成功的才进行加锁;
emit doLockFloatForm();
//能退单成功就肯定能断言,此订单是没有录过退货的
// 判断Simphony 队列中的订单是否已经存在:不存在(Simphony已经点单完成后会移除)则添加; 如果存在(说明此订单还拟点单),则需要直接向现存在Sim有效队列中的记录移除;没有模
m_OrderEntryMutex.lock();
......@@ -1060,6 +1091,10 @@ bool FlowControl::_RefundOrder(const QString &orderId,int reasonCode,const QStri
QLOG_INFO() << QString("[<<<<---FmTakeout _RefundOrder: _ClickOMSAssignArea --->>>>]");
m_OrderEntryMutex.unlock();
_ClickOMSAssignArea(); //必须执行,否则退货,点击取消后,就不会再提醒了;
} else if(OrderObject::SimExcept == oldOrderStatus) {
m_OrderEntryMutex.lock();
m_simValidOrdersList.removeOne(orderObject->id);
m_OrderEntryMutex.unlock();
}
//m_OrderEntryMutex.unlock(); //必须放开锁的范围;否则会出错;
} else {
......@@ -1656,12 +1691,17 @@ bool FlowControl::_ResponseOMS11Request(const QJsonObject &content, QJsonObject
return false;
}
// 接受到非码oms插过来的订单,进行向队列中进行添加;
_AddOrderPull(content[JSON_ORDER_ID].toString(),content[JSON_CHANNEL].toString());
result = _TryAddOrderPull(content[JSON_ORDER_ID].toString(),content[JSON_CHANNEL].toString());
/***组装从FM外卖service端的拉单请求参数***/
error = QString("success");
result = true;
if (result) {
error = QString("success");
result = true;
}else {
error = QString("failed");
result = false;
}
}
return result;
return result;
}
bool FlowControl::_ResponseSimphony12Request(const QJsonObject &content, QJsonObject &data, QString &error)
{
......
......@@ -364,6 +364,8 @@ private slots:
QString _GetIpAddress();
void _AddOrderPull(const QString& orderId=0,const QString& channel=0,const int& pageNumber=1,const int& pageSize=100);
// 避免获取较多历史订单的同时,OMS又有推单过来,导致死锁;
bool _TryAddOrderPull(const QString &orderId=0, const QString &channel=0, const int &pageNumber=1, const int &pageSize=100);
//点击屏幕指定区域
void _ClickOMSAssignArea();
......
......@@ -128,8 +128,8 @@ public:
QPoint GetOMSBtnPostion();
// 获取Simphony 为OMS所做button 相对系统屏幕最右下角的偏移位置;
int ConfigManger::GetOMSBtnWidthOffset();
int ConfigManger::GetOMSBtnHeightOffset();
int GetOMSBtnWidthOffset();
int GetOMSBtnHeightOffset();
int GetLoginSslConfig();
int GetOrderSslConfig();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment