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
64b5e5f3
Commit
64b5e5f3
authored
Jun 30, 2018
by
wuyang.zou
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix bug: 新增 MSR_NO 卡号信息 + 新增 同步POS本地数据库打印信息是否成功
parent
d1e25051
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
285 additions
and
119 deletions
+285
-119
fmTakeout/Control/flowControl.cpp
+199
-94
fmTakeout/Control/flowControl.h
+77
-16
fmTakeout/Model/orderObject.h
+9
-9
No files found.
fmTakeout/Control/flowControl.cpp
View file @
64b5e5f3
...
...
@@ -45,7 +45,7 @@ FlowControl::FlowControl()
connect
(
m_loginTimer
,
&
QTimer
::
timeout
,
this
,
&
FlowControl
::
_ClickToLogin
);
connect
(
m_pullTimer
,
&
QTimer
::
timeout
,
this
,
&
FlowControl
::
_PullOrder
);
connect
(
m_clearTimer
,
&
QTimer
::
timeout
,
this
,
&
FlowControl
::
_C
lear
Order
);
connect
(
m_clearTimer
,
&
QTimer
::
timeout
,
this
,
&
FlowControl
::
_C
rondClearExpire
Order
);
connect
(
m_heartTimer
,
&
QTimer
::
timeout
,
this
,
&
FlowControl
::
_SendHeart
);
connect
(
this
,
&
FlowControl
::
doPullOrder
,
this
,
&
FlowControl
::
_GetOrder
);
connect
(
this
,
&
FlowControl
::
doConfirmOrder
,
this
,
&
FlowControl
::
_ConfirmOrder
,
Qt
::
BlockingQueuedConnection
);
...
...
@@ -80,17 +80,17 @@ FlowControl::FlowControl()
}
/***解析Simphony_Script Request json格式: 解析成功***/
else
{
/***
?????
***/
if
(
_
GetReplyJson
(
recvObject
,
data
,
msg
))
/***
解析:FM外卖插件为响应Simphony请求准备返回数据:准备返回数据成功
***/
if
(
_
ResponseSimphonyRequest
(
recvObject
,
data
,
msg
))
{
status
=
100
;
}
/***
?????
***/
/***
解析:FM外卖插件为响应Simphony请求准备返回数据:准备返回数据失败
***/
else
{
status
=
0
;
}
/***
?????
***/
if
(
!
m_
ordersEntry
List
.
isEmpty
())
/***
解析:等待Simphony获取的有效订单列表是否为空: sim有效订单列表不为空
***/
if
(
!
m_
simValidOrders
List
.
isEmpty
())
{
iscontinue
=
1
;
}
...
...
@@ -174,7 +174,7 @@ void FlowControl::_ClickOMSAssignArea()
void
FlowControl
::
_ClickToLogin
()
{
if
(
!
m_bLoginResult
||!
m_
ordersEntry
List
.
isEmpty
())
if
(
!
m_bLoginResult
||!
m_
simValidOrders
List
.
isEmpty
())
{
QLOG_INFO
()
<<
QString
::
fromLocal8Bit
(
"[<<<<---触发按钮点击事件:FM外卖插件20s后再次尝试登陆--->>>>]"
);
_ClickOMSAssignArea
();
...
...
@@ -184,8 +184,8 @@ void FlowControl::_ClickToLogin()
void
FlowControl
::
_OrderAnalysis
(
const
QJsonObject
&
jsonObject
)
{
OrderObject
*
orderObject
=
NULL
;
orderObject
=
m_
simValidOrderMapQueue
.
value
(
jsonObject
[
JSON_ID
].
toString
());
/***<1>:
待Simphony拉取的有效订单队列中不存在此订单:整合数据并插入到此订单队列
中 ***/
orderObject
=
m_
FmOrdersMap
.
value
(
jsonObject
[
JSON_ID
].
toString
());
/***<1>:
FM插件维护的有效订单容器中不存在此订单:整合数据并插入到此订单容器
中 ***/
if
(
orderObject
==
NULL
)
{
orderObject
=
new
OrderObject
(
this
);
...
...
@@ -193,8 +193,8 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
orderObject
->
isPush
=
false
;
orderObject
->
isCancle
=
false
;
m_
simValidOrderMapQueue
.
insert
(
orderObject
->
id
,
orderObject
);
QLOG_INFO
()
<<
QString
(
"[<<<<---
Simphony Valid Order MapQueue
:Insert New Order[%1:%2]--->>>>][data:]"
)
m_
FmOrdersMap
.
insert
(
orderObject
->
id
,
orderObject
);
QLOG_INFO
()
<<
QString
(
"[<<<<---
FmTakeout Valid Orders Map
:Insert New Order[%1:%2]--->>>>][data:]"
)
.
arg
(
orderObject
->
id
,
orderObject
->
getOrderStatusDec
())
<<
jsonObject
;
if
(
!
SimProcOrderDB
::
getInstance
().
isOrderExit
(
orderObject
->
id
))
{
...
...
@@ -206,12 +206,12 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
}
emit
changeOrderStatus
(
orderObject
);
}
/***<2>:
待Simphony拉取的有效订单队列中存在此订单:更新订单队列
中此订单的订单状态***/
/***<2>:
FM插件维护的有效订单容器中存在此订单:更新订单容器
中此订单的订单状态***/
else
{
int
oldStatus
=
orderObject
->
orderStatus
;
orderObject
->
FromJson
(
jsonObject
);
QLOG_INFO
()
<<
QString
(
"[<<<<---
Simphony Valid Order MapQueue
:Update OldOrder Status[%1:%2]--->>>>].[data:%3]"
)
QLOG_INFO
()
<<
QString
(
"[<<<<---
FmTakeout Valid Order Map
:Update OldOrder Status[%1:%2]--->>>>].[data:%3]"
)
.
arg
(
orderObject
->
id
,
orderObject
->
getOrderStatusDec
())
<<
jsonObject
;
if
(
oldStatus
!=
orderObject
->
orderStatus
)
{
...
...
@@ -232,7 +232,7 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
{
orderObject
->
isCancle
=
true
;
}
QString
posOrderCheckNo
=
m_orderIdToPos
SalesId
Map
.
value
(
orderObject
->
id
);
QString
posOrderCheckNo
=
m_orderIdToPos
CheckNo
Map
.
value
(
orderObject
->
id
);
if
(
posOrderCheckNo
.
isEmpty
())
{
SimProcOrderDB
::
getInstance
().
getPosOrderCheckNo
(
orderObject
->
id
,
posOrderCheckNo
);
...
...
@@ -248,12 +248,12 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
/***case:新订单、确认订单、已配送订单、待配送订单、完成订单、请求退单: 订单还没push到POS[POS没有模拟点单或没有返回小票号]***/
if
(
!
orderObject
->
isPush
)
{
orderObject
->
pu
t
Type
=
1
;
orderObject
->
pu
t
Times
=
0
;
orderObject
->
pu
shOrder
Type
=
1
;
orderObject
->
pu
shOrder
Times
=
0
;
m_OrderEntryMutex
.
lock
();
if
(
!
m_
ordersEntry
List
.
contains
(
orderObject
->
id
))
if
(
!
m_
simValidOrders
List
.
contains
(
orderObject
->
id
))
{
m_
ordersEntry
List
.
append
(
orderObject
->
id
);
m_
simValidOrders
List
.
append
(
orderObject
->
id
);
}
m_OrderEntryMutex
.
unlock
();
_ClickOMSAssignArea
();
...
...
@@ -269,7 +269,7 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
if
(
!
orderObject
->
isPush
)
{
m_OrderEntryMutex
.
lock
();
m_
ordersEntry
List
.
removeOne
(
orderObject
->
id
);
m_
simValidOrders
List
.
removeOne
(
orderObject
->
id
);
m_OrderEntryMutex
.
unlock
();
}
/***case:校验此订单是否已经push到POS:订单已经push到POS***/
...
...
@@ -277,12 +277,12 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
/***case:校验此订单push到POS后的小票号是否空:[POS已模拟点单且返回小票号]***/
if
(
!
posOrderCheckNo
.
isEmpty
())
{
orderObject
->
pu
t
Type
=
0
;
orderObject
->
pu
t
Times
=
0
;
orderObject
->
pu
shOrder
Type
=
0
;
orderObject
->
pu
shOrder
Times
=
0
;
m_OrderEntryMutex
.
lock
();
if
(
!
m_
ordersEntry
List
.
contains
(
orderObject
->
id
))
if
(
!
m_
simValidOrders
List
.
contains
(
orderObject
->
id
))
{
m_
ordersEntry
List
.
append
(
orderObject
->
id
);
m_
simValidOrders
List
.
append
(
orderObject
->
id
);
}
_ClickOMSAssignArea
();
m_OrderEntryMutex
.
unlock
();
...
...
@@ -586,7 +586,7 @@ bool FlowControl::_ConfirmOrder(const QString &orderId)
if
(
1
==
status
)
{
int
orderStatus
=
data
[
JSON_ORDERSTATUS
].
toInt
();
OrderObject
*
orderObject
=
m_
simValidOrderMapQueue
.
value
(
orderId
);
OrderObject
*
orderObject
=
m_
FmOrdersMap
.
value
(
orderId
);
int
oldOrderStatus
=
orderObject
->
orderStatus
;
orderObject
->
orderStatus
=
orderStatus
;
emit
changeOrderStatus
(
orderObject
,
oldOrderStatus
);
...
...
@@ -627,7 +627,7 @@ bool FlowControl::_RefuseOrder(const QString &orderId, int refuseCode,const QStr
{
emit
showAlert
(
AlertForm
::
SUCCESS
,
QString
::
fromLocal8Bit
(
"拒单成功!"
));
// 通知主界面移动订单
OrderObject
*
orderObject
=
m_
simValidOrderMapQueue
.
value
(
orderId
);
OrderObject
*
orderObject
=
m_
FmOrdersMap
.
value
(
orderId
);
int
oldStatus
=
orderObject
->
orderStatus
;
orderObject
->
orderStatus
=
recvJson
[
JSON_STATUS
].
toInt
();
emit
changeOrderStatus
(
orderObject
,
oldStatus
);
...
...
@@ -640,7 +640,7 @@ bool FlowControl::_RefuseOrder(const QString &orderId, int refuseCode,const QStr
bool
FlowControl
::
_SendOrder
(
const
QString
&
orderId
)
{
//TODO
// if(m_
simValidOrderMapQueue.value(orderId)->riderName.isEmpty()&&m_simValidOrderMapQueue
.value(orderId)->delivery_type==1)
// if(m_
FmOrdersMap.value(orderId)->riderName.isEmpty()&&m_FmOrdersMap
.value(orderId)->delivery_type==1)
// {
// emit showAlert(AlertForm::MSGERROR,QString::fromLocal8Bit("配送员暂未接单,请等待"));
// return true;
...
...
@@ -671,7 +671,7 @@ bool FlowControl::_SendOrder(const QString& orderId)
emit
showAlert
(
AlertForm
::
SUCCESS
,
QString
::
fromLocal8Bit
(
"送出成功!"
));
// 通知主界面移动订单
OrderObject
*
orderObject
=
m_
simValidOrderMapQueue
.
value
(
orderId
);
OrderObject
*
orderObject
=
m_
FmOrdersMap
.
value
(
orderId
);
int
oldStatus
=
orderObject
->
orderStatus
;
orderObject
->
orderStatus
=
recvJson
[
JSON_STATUS
].
toInt
();
// TODO 服务器端现还未开发
...
...
@@ -711,7 +711,7 @@ bool FlowControl::_CompleteOrder(const QString& orderId)
emit
showAlert
(
AlertForm
::
SUCCESS
,
QString
::
fromLocal8Bit
(
"完成成功!"
));
// 通知主界面移动订单
OrderObject
*
orderObject
=
m_
simValidOrderMapQueue
.
value
(
orderId
);
OrderObject
*
orderObject
=
m_
FmOrdersMap
.
value
(
orderId
);
int
oldStatus
=
orderObject
->
orderStatus
;
orderObject
->
orderStatus
=
recvJson
[
JSON_STATUS
].
toInt
();
emit
changeOrderStatus
(
orderObject
,
oldStatus
);
...
...
@@ -750,7 +750,7 @@ bool FlowControl::_RefuseRefund(const QString& orderId)
emit
showAlert
(
AlertForm
::
SUCCESS
,
QString
::
fromLocal8Bit
(
"拒绝退单成功!"
));
// 通知主界面移动订单
OrderObject
*
orderObject
=
m_
simValidOrderMapQueue
.
value
(
orderId
);
OrderObject
*
orderObject
=
m_
FmOrdersMap
.
value
(
orderId
);
int
oldStatus
=
orderObject
->
orderStatus
;
orderObject
->
orderStatus
=
recvJson
[
JSON_STATUS
].
toInt
();
// TODO 服务器端现还未开发
...
...
@@ -769,7 +769,7 @@ bool FlowControl::_RefundOrder(const QString &orderId,int reasonCode,const QStri
QJsonObject
sendJson
;
QJsonObject
recvJson
;
sendJson
=
DataManger
::
GetInstance
().
GetRefundOrderData
(
reasonCode
,
reason
,
orderId
,
m_
simValidOrderMapQueue
.
value
(
orderId
)
->
channel
);
sendJson
=
DataManger
::
GetInstance
().
GetRefundOrderData
(
reasonCode
,
reason
,
orderId
,
m_
FmOrdersMap
.
value
(
orderId
)
->
channel
);
emit
showAlert
(
AlertForm
::
LOADING
,
QString
::
fromLocal8Bit
(
"正在通信......"
));
...
...
@@ -803,7 +803,7 @@ bool FlowControl::_RefundOrder(const QString &orderId,int reasonCode,const QStri
if
(
1
==
status
)
{
int
orderStatus
=
data
[
JSON_ORDERSTATUS
].
toInt
();
OrderObject
*
orderObject
=
m_
simValidOrderMapQueue
.
value
(
orderId
);
OrderObject
*
orderObject
=
m_
FmOrdersMap
.
value
(
orderId
);
int
oldOrderStatus
=
orderObject
->
orderStatus
;
orderObject
->
orderStatus
=
orderStatus
;
emit
changeOrderStatus
(
orderObject
,
oldOrderStatus
);
...
...
@@ -829,9 +829,7 @@ QJsonObject FlowControl::_PackHttpReplyJson(const int status, const QString &msg
rObj
.
insert
(
"statusCode"
,
status
);
rObj
.
insert
(
"msg"
,
msg
);
rObj
.
insert
(
"iscontinue"
,
iscontinue
);
//if(!data.isEmpty()){
rObj
.
insert
(
"data"
,
data
);
//}
rObj
.
insert
(
"data"
,
data
);
return
rObj
;
}
...
...
@@ -1052,37 +1050,38 @@ void FlowControl::onDailyReport()
}
}
void
FlowControl
::
_C
lear
Order
()
void
FlowControl
::
_C
rondClearExpire
Order
()
{
QDateTime
currentDateTime
=
QDateTime
::
currentDateTime
();
OrderObject
*
order
=
NULL
;
m_OrderEntryMutex
.
lock
();
foreach
(
order
,
m_
simValidOrderMapQueue
.
values
())
{
foreach
(
order
,
m_
FmOrdersMap
.
values
())
{
QDateTime
createDateTime
=
QDateTime
::
fromTime_t
(
order
->
updateTime
);
qint64
days
=
createDateTime
.
daysTo
(
currentDateTime
);
if
(
days
>=
2
)
{
QLOG_INFO
()
<<
QString
(
"[<<<<---C
lear
Order: orderID:%1--->>>>]"
).
arg
(
order
->
id
);
QLOG_INFO
()
<<
QString
(
"[<<<<---C
rond Clear Expire
Order: orderID:%1--->>>>]"
).
arg
(
order
->
id
);
emit
clearorder
(
order
->
id
,
order
->
orderStatus
);
m_simValidOrderMapQueue
.
value
(
order
->
id
)
->
deleteLater
();
m_ordersEntryList
.
removeOne
(
order
->
id
);
delete
m_simValidOrderMapQueue
.
take
(
order
->
id
);
m_FmOrdersMap
.
value
(
order
->
id
)
->
deleteLater
();
m_simValidOrdersList
.
removeOne
(
order
->
id
);
delete
m_FmOrdersMap
.
take
(
order
->
id
);
}
}
m_OrderEntryMutex
.
unlock
();
SimProcOrderDB
::
getInstance
().
deleteOrderRecord
(
QDate
::
currentDate
().
addMonths
(
-
1
).
toString
(
"yyyyMMdd"
));
}
bool
FlowControl
::
_
GetReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
bool
FlowControl
::
_
ResponseSimphonyRequest
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
{
QLOG_INFO
()
<<
__FUNCTION__
;
bool
result
=
true
;
/****校验Simphony_Script请求参数有效性: 校验参数->actionId不存在****/
if
(
!
content
.
contains
(
"actionId"
))
{
error
=
QString
::
fromLocal8Bit
(
"
未知的请求
"
);
error
=
QString
::
fromLocal8Bit
(
"
解析Simphony_Script请求参数:参数中没有actionId
"
);
result
=
false
;
}
/****校验Simphony_Script请求参数有效性: 校验参数->actionId存在****/
else
{
int
actionId
;
if
(
content
[
"actionId"
].
isString
())
...
...
@@ -1092,27 +1091,31 @@ bool FlowControl::_GetReplyJson(const QJsonObject &content,QJsonObject &data, QS
else
{
actionId
=
content
[
"actionId"
].
toInt
();
}
/****校验请求参数actionId的具体数值:****/
switch
(
actionId
)
{
case
1
:
//simphony拉取订单
result
=
_
Get01ReplyJson
(
content
,
data
,
error
);
result
=
_
ResponseSimphony01Request
(
content
,
data
,
error
);
break
;
case
2
:
//simphony确认接单
result
=
_
Get02ReplyJson
(
content
,
data
,
error
);
result
=
_
ResponseSimphony02Request
(
content
,
data
,
error
);
break
;
case
3
:
//simphony取消接单
result
=
_Get03ReplyJson
(
content
,
data
,
error
);
result
=
_ResponseSimphony03Request
(
content
,
data
,
error
);
break
;
case
4
:
//simphony汇报小票号信息回复
result
=
_ResponseSimphony04Request
(
content
,
data
,
error
);
break
;
case
4
:
//simphony消息
回复
result
=
_
Get04ReplyJson
(
content
,
data
,
error
);
case
5
:
//simphony更新订单数据到POS本地数据库以便POS打印小票及汇总单信息
回复
result
=
_
ResponseSimphony05Request
(
content
,
data
,
error
);
break
;
case
11
:
//推送订单
result
=
_
Get11ReplyJson
(
content
,
data
,
error
);
result
=
_
ResponseSimphony11Request
(
content
,
data
,
error
);
break
;
case
12
:
//推送门店营业状态
result
=
_
Get12ReplyJson
(
content
,
data
,
error
);
result
=
_
ResponseSimphony12Request
(
content
,
data
,
error
);
break
;
default
:
error
=
QString
::
fromLocal8Bit
(
"
未知的请求
"
);
error
=
QString
::
fromLocal8Bit
(
"
解析Simphony_Script请求actionId值不在规定的接口文档内
"
);
result
=
false
;
break
;
}
...
...
@@ -1120,27 +1123,27 @@ bool FlowControl::_GetReplyJson(const QJsonObject &content,QJsonObject &data, QS
return
result
;
}
bool
FlowControl
::
_
Get01ReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
bool
FlowControl
::
_
ResponseSimphony01Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
{
QLOG_INFO
()
<<
__FUNCTION__
;
bool
result
=
true
;
if
(
!
m_bLoginResult
&&
content
.
contains
(
"storeId"
))
{
result
=
_
GetLoginReplyJso
n
(
content
,
error
);
result
=
_
ResponseSimReqTryLogi
n
(
content
,
error
);
}
if
(
result
/*&&content.contains("orderId")*/
){
result
=
_
GetQueryReplyJson
(
data
,
error
,
content
[
"orderId"
].
toString
());
result
=
_
ResponseSimReqFristOrderData
(
data
,
error
,
content
[
"orderId"
].
toString
());
}
else
{
result
=
false
;
if
(
error
.
isEmpty
())
{
error
=
QString
::
fromLocal8Bit
(
"
请求参数错误
"
);
error
=
QString
::
fromLocal8Bit
(
"
准备响应Simphony_Script请求前登陆门店失败
"
);
}
}
return
result
;
}
bool
FlowControl
::
_
Get02ReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
bool
FlowControl
::
_
ResponseSimphony02Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
{
return
true
;
//TODO
...
...
@@ -1148,7 +1151,7 @@ bool FlowControl::_Get02ReplyJson(const QJsonObject &content, QJsonObject &data,
bool result = true;
if(m_bLoginResult&&content.contains("orderId")){
QString orderId=content["orderId"].toString();
if(m_
simValidOrderMapQueue
.contains(orderId))
if(m_
FmOrdersMap
.contains(orderId))
{
emit doStartOperateTimer();
emit doConfirmOrder(orderId);
...
...
@@ -1176,7 +1179,7 @@ bool FlowControl::_Get02ReplyJson(const QJsonObject &content, QJsonObject &data,
}
return result;*/
}
bool
FlowControl
::
_
Get03ReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
bool
FlowControl
::
_
ResponseSimphony03Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
{
return
true
;
//TODO
...
...
@@ -1184,7 +1187,7 @@ bool FlowControl::_Get03ReplyJson(const QJsonObject &content, QJsonObject &data,
bool result = true;
if(m_bLoginResult&&content.contains("orderId")){
QString orderId=content["orderId"].toString();
if(m_
simValidOrderMapQueue
.contains(orderId))
if(m_
FmOrdersMap
.contains(orderId))
{
emit doStartOperateTimer();
emit doRefundOrder(orderId,-1,QString::fromLocal8Bit("同意退款"));
...
...
@@ -1214,59 +1217,157 @@ bool FlowControl::_Get03ReplyJson(const QJsonObject &content, QJsonObject &data,
}
return result;*/
}
bool
FlowControl
::
_
Get04ReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
bool
FlowControl
::
_
ResponseSimphony04Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
{
QLOG_INFO
()
<<
__FUNCTION__
;
bool
result
=
true
;
if
(
m_bLoginResult
&&
content
.
contains
(
"orderId"
)){
QString
orderId
=
content
[
"orderId"
].
toString
();
QString
pos
SaleId
=
content
[
"posSaleId"
].
toString
();
if
(
pos
SaleId
.
isEmpty
())
QString
pos
CheckNo
=
content
[
"posSaleId"
].
toString
();
if
(
pos
CheckNo
.
isEmpty
())
{
pos
SaleId
=
m_orderIdToPosSalesId
Map
.
value
(
orderId
);
pos
CheckNo
=
m_orderIdToPosCheckNo
Map
.
value
(
orderId
);
}
if
(
!
pos
SaleId
.
isEmpty
()
&&!
orderId
.
isEmpty
())
if
(
!
pos
CheckNo
.
isEmpty
()
&&!
orderId
.
isEmpty
())
{
if
(
!
m_orderIdToPos
SalesId
Map
.
contains
(
orderId
))
if
(
!
m_orderIdToPos
CheckNo
Map
.
contains
(
orderId
))
{
QLOG_INFO
()
<<
QString
::
fromLocal8Bit
(
"
%1订单已经成功推送给simphony
"
).
arg
(
orderId
);
m_orderIdToPos
SalesIdMap
.
insert
(
orderId
,
posSaleId
);
QLOG_INFO
()
<<
QString
::
fromLocal8Bit
(
"
[<<<<---Simphony_Script请求[04:返回小票号] %1订单已经成功推送给simphony:--->>>>]
"
).
arg
(
orderId
);
m_orderIdToPos
CheckNoMap
.
insert
(
orderId
,
posCheckNo
);
}
OrderObject
*
order_p
=
m_
simValidOrderMapQueue
.
value
(
orderId
);
OrderObject
*
order_p
=
m_
FmOrdersMap
.
value
(
orderId
);
if
(
!
order_p
){
QLOG_ERROR
()
<<
QString
::
fromLocal8Bit
(
"
%1订单并不存在m_orderMap[键值对]中;m_simValidOrderMapQueue.size()=%2"
).
arg
(
orderId
).
arg
(
m_simValidOrderMapQueue
.
size
());
QLOG_ERROR
()
<<
QString
::
fromLocal8Bit
(
"
[<<<<---%1订单并不存在m_FmOrdersMap[键值对]中;m_FmOrdersMap.size()=%2--->>>>]"
).
arg
(
orderId
).
arg
(
m_FmOrdersMap
.
size
());
result
=
false
;
error
=
QString
::
fromLocal8Bit
(
"%1订单并不存在m_
orderMap[键值对]中;m_simValidOrderMapQueue.size()=%2"
).
arg
(
orderId
).
arg
(
m_simValidOrderMapQueue
.
size
());
error
=
QString
::
fromLocal8Bit
(
"%1订单并不存在m_
FmOrdersMap[键值对]中;m_FmOrdersMap.size()=%2"
).
arg
(
orderId
).
arg
(
m_FmOrdersMap
.
size
());
return
result
;
}
if
(
m_
ordersEntry
List
.
contains
(
orderId
))
if
(
m_
simValidOrders
List
.
contains
(
orderId
))
{
if
(
order_p
->
pu
t
Type
==
1
)
if
(
order_p
->
pu
shOrder
Type
==
1
)
{
SimProcOrderDB
::
getInstance
().
updatePushOrderStatus
(
orderId
,
1
);
SimProcOrderDB
::
getInstance
().
updatePosOrderCheckNo
(
orderId
,
pos
SaleId
);
SimProcOrderDB
::
getInstance
().
updatePosOrderCheckNo
(
orderId
,
pos
CheckNo
);
}
else
{
SimProcOrderDB
::
getInstance
().
updateRefundOrderStatus
(
orderId
,
1
);
}
m_OrderEntryMutex
.
lock
();
m_
ordersEntry
List
.
removeOne
(
orderId
);
m_
simValidOrders
List
.
removeOne
(
orderId
);
m_OrderEntryMutex
.
unlock
();
}
else
{
order_p
->
isCancle
=
false
;
order_p
->
isPush
=
true
;
order_p
->
putType
=
0
;
order_p
->
putTimes
=
0
;
order_p
->
pushOrderType
=
0
;
order_p
->
pushOrderTimes
=
0
;
m_OrderEntryMutex
.
lock
();
if
(
!
m_simValidOrdersList
.
contains
(
orderId
))
{
m_simValidOrdersList
.
append
(
orderId
);
}
m_OrderEntryMutex
.
unlock
();
}
}
else
{
result
=
false
;
error
=
QString
::
fromLocal8Bit
(
"订单号或者短号不能为空"
);
}
}
else
{
result
=
false
;
error
=
QString
::
fromLocal8Bit
(
"请求参数错误"
);
}
return
result
;
}
bool
FlowControl
::
_ResponseSimphony05Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
{
// 从 _ResponseSimphony04Request 函数拷贝过来;未做任何改动;【后期将用05代替04的业务】
QLOG_INFO
()
<<
__FUNCTION__
;
bool
result
=
true
;
if
(
m_bLoginResult
&&
content
.
contains
(
"orderId"
)){
QString
orderId
=
content
[
"orderId"
].
toString
();
QString
posCheckNo
=
content
[
"posSaleId"
].
toString
();
if
(
posCheckNo
.
isEmpty
())
{
posCheckNo
=
m_orderIdToPosCheckNoMap
.
value
(
orderId
);
}
if
(
!
posCheckNo
.
isEmpty
()
&&!
orderId
.
isEmpty
())
{
if
(
!
m_orderIdToPosCheckNoMap
.
contains
(
orderId
))
{
QLOG_INFO
()
<<
QString
::
fromLocal8Bit
(
"[<<<<---Simphony_Script请求[05:返回小票号,同时更新POS本地数据库打印] %1订单已经成功推送给simphony:--->>>>]"
).
arg
(
orderId
);
m_orderIdToPosCheckNoMap
.
insert
(
orderId
,
posCheckNo
);
}
OrderObject
*
order_p
=
m_FmOrdersMap
.
value
(
orderId
);
if
(
!
order_p
){
QLOG_ERROR
()
<<
QString
::
fromLocal8Bit
(
"[<<<<---%1订单并不存在m_FmOrdersMap[键值对]中;m_FmOrdersMap.size()=%2--->>>>]"
).
arg
(
orderId
).
arg
(
m_FmOrdersMap
.
size
());
result
=
false
;
error
=
QString
::
fromLocal8Bit
(
"%1订单并不存在m_FmOrdersMap[键值对]中;m_FmOrdersMap.size()=%2"
).
arg
(
orderId
).
arg
(
m_FmOrdersMap
.
size
());
return
result
;
}
if
(
m_simValidOrdersList
.
contains
(
orderId
))
{
/**** action:04:功能:目前先不使用;
if(order_p->pushOrderType==1)
{
SimProcOrderDB::getInstance().updatePushOrderStatus(orderId,1);
SimProcOrderDB::getInstance().updatePosOrderCheckNo(orderId,posCheckNo);
}
else
{
SimProcOrderDB::getInstance().updateRefundOrderStatus(orderId,1);
}
****/
/***** 更新 POS本地数据库的打印信息是否成功;begin:*********/
int
retSyncOrderPrintInfo
=
1
;
// int retSyncOrderPrintInfo = 0;
/***** 更新 POS本地数据库的打印信息是否成功;end:********/
/***** 解析 同步更新POS本地数据库是否成功:retSyncOrderPrintInfo:1->成功********/
if
(
retSyncOrderPrintInfo
){
//m_OrderEntryMutex.lock();
//m_simValidOrdersList.removeOne(orderId);
//m_OrderEntryMutex.unlock();
QJsonObject
rObj
,
cObj
;
rObj
.
insert
(
"fm_cmd"
,
""
);
rObj
.
insert
(
"fm_ver"
,
"1.0"
);
cObj
.
insert
(
"pay_id"
,
"002"
);
cObj
.
insert
(
"pay_str"
,
QString
::
fromLocal8Bit
(
"非码外卖"
));
cObj
.
insert
(
"retSyncOrderPrintInfo"
,
retSyncOrderPrintInfo
);
//同步POS本地数据库打印信息结果:[1:同步成功;0:同步失败]
cObj
.
insert
(
"paid_trans_id"
,
orderId
);
cObj
.
insert
(
"pos_sale_id"
,
posCheckNo
);
cObj
.
insert
(
"products_fee"
,
order_p
->
productPrice
);
// 商品金额
cObj
.
insert
(
"discount_fee"
,
0
);
// 优惠总额
cObj
.
insert
(
"msr_card_no"
,
(
order_p
->
msr_no
.
length
()
==
0
)
?
order_p
->
customerId
:
order_p
->
msr_no
);
// MSR卡号
rObj
.
insert
(
"pay_id"
,
cObj
);
data
=
rObj
;
}
/***** 解析 同步更新POS本地数据库是否成功:retSyncOrderPrintInfo:0->失败*****/
else
{
result
=
false
;
error
=
QString
::
fromLocal8Bit
(
"POS本地数据库的打印信息操作失败"
);
}
}
else
{
/**** action:04:功能:目前先不使用;
order_p->isCancle = false;
order_p->isPush = true;
order_p->pushOrderType = 0;
order_p->pushOrderTimes=0;
****/
m_OrderEntryMutex
.
lock
();
if
(
!
m_
ordersEntry
List
.
contains
(
orderId
))
if
(
!
m_
simValidOrders
List
.
contains
(
orderId
))
{
m_
ordersEntry
List
.
append
(
orderId
);
m_
simValidOrders
List
.
append
(
orderId
);
}
m_OrderEntryMutex
.
unlock
();
}
...
...
@@ -1282,12 +1383,14 @@ bool FlowControl::_Get04ReplyJson(const QJsonObject &content, QJsonObject &data,
}
return
result
;
}
bool
FlowControl
::
_Get11ReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
bool
FlowControl
::
_ResponseSimphony11Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
{
QLOG_INFO
()
<<
__FUNCTION__
;
bool
result
=
true
;
if
(
!
m_bLoginResult
){
error
=
QString
(
"FMOMS未登录"
);
error
=
QString
::
fromLocal8Bit
(
"FMOMS未登录"
);
return
false
;
}
else
{
...
...
@@ -1302,7 +1405,7 @@ bool FlowControl::_Get11ReplyJson(const QJsonObject &content, QJsonObject &data,
}
return
result
;
}
bool
FlowControl
::
_
Get12ReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
bool
FlowControl
::
_
ResponseSimphony12Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
)
{
if
(
!
content
[
"storeId"
].
toString
().
compare
(
m_storeId
))
{
...
...
@@ -1317,7 +1420,7 @@ bool FlowControl::_Get12ReplyJson(const QJsonObject &content, QJsonObject &data,
return
false
;
}
bool
FlowControl
::
_
GetLoginReplyJso
n
(
const
QJsonObject
&
content
,
QString
&
error
)
bool
FlowControl
::
_
ResponseSimReqTryLogi
n
(
const
QJsonObject
&
content
,
QString
&
error
)
{
QLOG_INFO
()
<<
__FUNCTION__
;
m_storeId
=
content
[
"storeId"
].
toString
();
...
...
@@ -1331,7 +1434,7 @@ bool FlowControl::_GetLoginReplyJson(const QJsonObject &content,QString &error)
return
true
;
}
bool
FlowControl
::
_
GetQueryReplyJson
(
QJsonObject
&
data
,
QString
&
error
,
const
QString
&
orderId
)
bool
FlowControl
::
_
ResponseSimReqFristOrderData
(
QJsonObject
&
data
,
QString
&
error
,
const
QString
&
orderId
)
{
QLOG_INFO
()
<<
__FUNCTION__
<<
error
<<
orderId
;
bool
result
=
true
;
...
...
@@ -1340,7 +1443,7 @@ bool FlowControl::_GetQueryReplyJson(QJsonObject &data, QString &error, const QS
error
=
QString
::
fromLocal8Bit
(
"FMOMS 未登录"
);
return
false
;
}
if
(
m_
ordersEntry
List
.
isEmpty
())
if
(
m_
simValidOrders
List
.
isEmpty
())
{
error
=
QString
::
fromLocal8Bit
(
"没有新订单待拉取"
);
result
=
true
;
...
...
@@ -1348,24 +1451,24 @@ bool FlowControl::_GetQueryReplyJson(QJsonObject &data, QString &error, const QS
else
{
error
.
clear
();
QString
orderId
=
m_
ordersEntry
List
.
first
();
QString
orderId
=
m_
simValidOrders
List
.
first
();
int
pullNum
=
MAXPUTTIMES
;
foreach
(
auto
value
,
m_
ordersEntry
List
)
{
int
num
=
m_
simValidOrderMapQueue
.
value
(
value
)
->
put
Times
;
foreach
(
auto
value
,
m_
simValidOrders
List
)
{
int
num
=
m_
FmOrdersMap
.
value
(
value
)
->
pushOrder
Times
;
if
(
pullNum
>
num
)
{
pullNum
=
num
;
orderId
=
value
;
}
}
OrderObject
*
orderObject
=
m_
simValidOrderMapQueue
.
value
(
orderId
);
if
(
MAXPUTTIMES
==
orderObject
->
pu
t
Times
)
OrderObject
*
orderObject
=
m_
FmOrdersMap
.
value
(
orderId
);
if
(
MAXPUTTIMES
==
orderObject
->
pu
shOrder
Times
)
{
orderObject
->
pu
t
Times
=
0
;
orderObject
->
pu
shOrder
Times
=
0
;
}
orderObject
->
pu
tTimes
=
orderObject
->
put
Times
+
1
;
orderObject
->
pu
shOrderTimes
=
orderObject
->
pushOrder
Times
+
1
;
QJsonObject
rObj
,
cObj
;
if
(
orderObject
->
pu
t
Type
==
1
)
if
(
orderObject
->
pu
shOrder
Type
==
1
)
{
rObj
.
insert
(
"fm_cmd"
,
"put_order"
);
}
...
...
@@ -1393,6 +1496,8 @@ bool FlowControl::_GetQueryReplyJson(QJsonObject &data, QString &error, const QS
cObj
.
insert
(
"service_fee"
,
/*orderObject->service_fee*/
0
);
// 平台佣金
cObj
.
insert
(
"discount_fee"
,
/*orderObject->discount_fee*/
0
);
// 优惠总额
cObj
.
insert
(
"dis_shop_fee"
,
/*orderObject->dis_shop_fee*/
0
);
// 商家承担优惠金额
cObj
.
insert
(
"msr_card_no"
,
(
orderObject
->
msr_no
.
length
()
==
0
)
?
orderObject
->
customerId
:
orderObject
->
msr_no
);
// MSR卡号
cObj
.
insert
(
"retSyncOrderPrintInfo"
,
0
);
// 同步POS本地数据库打印信息结果:[1:同步成功;0:同步失败; 默认:0]
cObj
.
insert
(
"dis_platform_fee"
,
/*orderObject->dis_platform_fee*/
0
);
// 平台承担优惠金额
cObj
.
insert
(
"send_fee"
,
orderObject
->
deliveryPrice
);
// 配送费
cObj
.
insert
(
"shop_fee"
,
/*orderObject->total_fee-orderObject->send_fee-orderObject->service_fee-orderObject->dis_shop_fee*/
0
);
// 商户能够拿到的钱(去除平台佣金)
...
...
@@ -1526,7 +1631,7 @@ void FlowControl::onProcessOrder(const QString &operation, const QString &orderI
void
FlowControl
::
onGetOrderDetails
(
const
QString
&
orderId
)
{
emit
hideAlert
();
emit
showOrderDetails
(
m_
simValidOrderMapQueue
.
value
(
orderId
));
emit
showOrderDetails
(
m_
FmOrdersMap
.
value
(
orderId
));
}
void
FlowControl
::
onSerachOrder
(
const
QString
&
text
)
...
...
@@ -1536,7 +1641,7 @@ void FlowControl::onSerachOrder(const QString &text)
{
QMap
<
QString
,
OrderObject
*>::
iterator
order
;
for
(
order
=
m_
simValidOrderMapQueue
.
begin
();
order
!=
m_simValidOrderMapQueue
.
end
();
order
++
)
for
(
order
=
m_
FmOrdersMap
.
begin
();
order
!=
m_FmOrdersMap
.
end
();
order
++
)
{
QString
orderId
=
order
.
key
();
QString
phoneId
=
order
.
value
()
->
phone
;
...
...
fmTakeout/Control/flowControl.h
View file @
64b5e5f3
...
...
@@ -66,8 +66,8 @@ private:
BillSocket
*
m_pullOrderListSocket
;
BillSocket
*
m_procOrderSocket
;
BillSocket
*
m_pullDishesSocket
;
//
为Simphony在FM外卖插件中维护<有效待拉取订单>的
容器
QMap
<
QString
,
OrderObject
*>
m_
simValidOrderMapQueue
;
//
FM外卖插件维护的有效订单
容器
QMap
<
QString
,
OrderObject
*>
m_
FmOrdersMap
;
// 是否第一次获取到门店信息
bool
m_bFirstRecvInfo
;
bool
m_bLoginResult
;
...
...
@@ -76,10 +76,10 @@ private:
JQHttpServer
::
TcpServerManage
*
m_tcpServerManage
;
QMap
<
QString
,
QMultiMap
<
QString
,
dishesObject
>
>
m_dishesMap
;
//
入账list
QStringList
m_
ordersEntry
List
;
//
等待Simphony拉取的有效订单队列list[orderId]
QStringList
m_
simValidOrders
List
;
//订单号与pos短号映射
QMap
<
QString
,
QString
>
m_orderIdToPos
SalesId
Map
;
QMap
<
QString
,
QString
>
m_orderIdToPos
CheckNo
Map
;
//记录当前订单操作
QMap
<
QString
,
int
>
m_orderOperatePair
;
//订单拉取记录
...
...
@@ -243,20 +243,81 @@ private slots:
* */
QJsonObject
_PackHttpReplyJson
(
const
int
status
,
const
QString
&
msg
,
const
QJsonObject
&
data
,
const
int
&
iscontinue
);
/**
*功能:
清空订单Map里
的订单
*功能:
定时清空订单Map里两天前
的订单
*参数:无
*返回:无
**/
void
_ClearOrder
();
bool
_GetReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
bool
_Get01ReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
bool
_Get02ReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
bool
_Get03ReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
bool
_Get04ReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
bool
_Get11ReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
bool
_Get12ReplyJson
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
bool
_GetLoginReplyJson
(
const
QJsonObject
&
content
,
QString
&
error
);
bool
_GetQueryReplyJson
(
QJsonObject
&
data
,
QString
&
error
,
const
QString
&
orderId
);
void
_CrondClearExpireOrder
();
/**
*功能:FM外卖插件为响应Simphony请求准备返回数据
*参数:1、请求json参数;2、准备返回请求数据的Buff;3、返回错误信息;
*返回:是否准备成功;
**/
bool
_ResponseSimphonyRequest
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
/**
*功能:FM外卖插件为响应Simphony请求[action:01 -> 拉取订单]准备返回数据
*参数:1、请求json参数;2、准备返回请求数据的Buff;3、返回错误信息;
*返回:是否准备成功;
**/
bool
_ResponseSimphony01Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
/**
*功能:FM外卖插件为响应Simphony请求[action:02 -> 确认订单]准备返回数据
*参数:1、请求json参数;2、准备返回请求数据的Buff;3、返回错误信息;
*返回:是否准备成功;
**/
bool
_ResponseSimphony02Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
/**
*功能:FM外卖插件为响应Simphony请求[action:03 -> 取消订单]准备返回数据
*参数:1、请求json参数;2、准备返回请求数据的Buff;3、返回错误信息;
*返回:是否准备成功;
**/
bool
_ResponseSimphony03Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
/**
*功能:FM外卖插件为响应Simphony请求[action:04 -> 汇报订单Sim/POS产生的小票号]准备返回数据
*参数:1、请求json参数;2、准备返回请求数据的Buff;3、返回错误信息;
*返回:是否准备成功;
**/
bool
_ResponseSimphony04Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
/**
*功能:FM外卖插件为响应Simphony请求[action:05 -> simphony更新订单数据到POS本地数据库以以便POS打印小票及汇总单信息]准备返回数据
*参数:1、请求json参数;2、准备返回请求数据的Buff;3、返回错误信息;
*返回:是否准备成功;
**/
bool
_ResponseSimphony05Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
/**
*功能:FM外卖插件为响应Simphony请求[action:11 -> Sim/POS推送订单到FM插件]准备返回数据
*参数:1、请求json参数;2、准备返回请求数据的Buff;3、返回错误信息;
*返回:是否准备成功;
**/
bool
_ResponseSimphony11Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
/**
*功能:FM外卖插件为响应Simphony请求[action:12 -> Sim/POS推送门店营业状态]准备返回数据
*参数:1、请求json参数;2、准备返回请求数据的Buff;3、返回错误信息;
*返回:是否准备成功;
**/
bool
_ResponseSimphony12Request
(
const
QJsonObject
&
content
,
QJsonObject
&
data
,
QString
&
error
);
/**
*功能:FM外卖插件响应Simphony请求时,如果外卖插件未登录则进行登陆;
*参数:1、请求json参数;2、返回错误信息;
*返回:是否登陆成功;
**/
bool
_ResponseSimReqTryLogin
(
const
QJsonObject
&
content
,
QString
&
error
);
/**
*功能:FM外卖插件为响应Simphony请求[查询FM插件第一条订单数据作为返回数据]准备返回数据
*参数:1、请求json参数;2、准备返回请求数据的Buff;3、返回错误信息;
*返回:是否准备成功;
**/
bool
_ResponseSimReqFristOrderData
(
QJsonObject
&
data
,
QString
&
error
,
const
QString
&
orderId
);
// 单位转换
QString
_Penny2Dollar
(
int
penny
);
...
...
fmTakeout/Model/orderObject.h
View file @
64b5e5f3
...
...
@@ -86,17 +86,17 @@ public:
QString
watercourseId
;
//流水号(取餐号)
QString
customerId
;
//用户编号
QString
customerName
;
//用户名称
QString
posCheckNo
;
QString
posCheckNo
;
// POS小票号
QString
phone
;
QString
msr_no
;
QString
msr_no
;
//msr卡号
QString
storeId
;
QString
storeName
;
QString
storeAddress
;
QString
channel
;
QString
payWay
;
QString
deliveryTime
;
QString
riderName
;
QString
riderPhone
;
QString
deliveryTime
;
//配送时间
QString
riderName
;
//骑手名
QString
riderPhone
;
//骑手电话
QString
createTime
;
QString
confirmTime
;
QString
sendTime
;
...
...
@@ -107,8 +107,8 @@ public:
QString
invoiceType
;
QString
invoiceTitle
;
QString
invoiceTaxpayerId
;
QString
firstName
;
QString
lastName
;
QString
firstName
;
//用户名字;
QString
lastName
;
//用户姓;
QString
longitude
;
QString
latitude
;
QString
street
;
...
...
@@ -125,8 +125,8 @@ public:
int
payStatus
;
int
refundStatus
;
int
deliveryChannel
;
int
pu
t
Type
;
int
pu
t
Times
;
int
pu
shOrder
Type
;
int
pu
shOrder
Times
;
bool
isPush
;
bool
isCancle
;
QString
getChannelName
();
...
...
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