Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
T
takeout_sbk
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
yunpeng.song
takeout_sbk
Commits
4a4803f1
Commit
4a4803f1
authored
Aug 15, 2018
by
wuyang.zou
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix bug: 解决经过一天业务逻辑后,重启插件,插件拉取门店有效订单出现死锁问题
parent
0e439129
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
58 additions
and
16 deletions
+58
-16
fmTakeout/Control/flowControl.cpp
+54
-14
fmTakeout/Control/flowControl.h
+2
-0
fmTakeout/DTools/configManger.h
+2
-2
No files found.
fmTakeout/Control/flowControl.cpp
View file @
4a4803f1
...
...
@@ -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
=
_Try
AddOrderPull
(
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
)
{
...
...
fmTakeout/Control/flowControl.h
View file @
4a4803f1
...
...
@@ -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
();
...
...
fmTakeout/DTools/configManger.h
View file @
4a4803f1
...
...
@@ -128,8 +128,8 @@ public:
QPoint
GetOMSBtnPostion
();
// 获取Simphony 为OMS所做button 相对系统屏幕最右下角的偏移位置;
int
ConfigManger
::
GetOMSBtnWidthOffset
();
int
ConfigManger
::
GetOMSBtnHeightOffset
();
int
GetOMSBtnWidthOffset
();
int
GetOMSBtnHeightOffset
();
int
GetLoginSslConfig
();
int
GetOrderSslConfig
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment