Commit 05bdde09 by wuyang.zou

增强 Aliy 双活备用功能:插件登录 & 列表获取 & 心跳 & 自检单 的双活尝试;

增强 Aliy 推单指定 callBackUrl : 拉单详情 & 退单 & 订单入机汇报 使用 callBackUrl;
优化 拉单详情获取 3次失败则放弃, 获取订单列表 3次失败后,切备用地址再尝试3次, 依旧失败则丢弃;

Version: 2.2022.1.18
parent 0fa7e499
......@@ -52,6 +52,9 @@ FlowControl::~FlowControl()
FlowControl::FlowControl()
{
m_bLoginResult =false;
m_loginErrorCount = 0;
m_sendHeartErrorCount = 0;
m_bCreateSelfCheckOrderError = false;
m_openTcpChannel = false;
m_bFirstRecvInfo = true;
m_bFloatFromLockSt = false;
......@@ -80,6 +83,7 @@ FlowControl::FlowControl()
m_orderCount = 0;
m_clickPosCount = 0;
m_hurryPrintSum = 0;
m_serviceCallBackUrl = "";
m_clearTimer=new QTimer(this);
m_heartTimer=new QTimer(this);
......@@ -203,6 +207,7 @@ void FlowControl::_AddOrderPull(const QString &orderId, const QString &channel,
orderPull->channel=channel;
orderPull->pageNumber=pageNumber;
orderPull->pageSize=pageSize;
orderPull->pullErrorCount = 0;
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---FlowControl::_AddOrderPull orderId:%1--->>>>]").arg(orderId);
m_orderPullList.append(orderPull);
m_PullOrderDataMutex.unlock();
......@@ -212,7 +217,7 @@ void FlowControl::_AddOrderPull(const QString &orderId, const QString &channel,
}
bool FlowControl::_TryAddOrderPull(const QString &orderId, const QString &channel, const int &pageNumber, const int &pageSize)
bool FlowControl::_TryAddOrderPull(const QString &orderId, const QString &channel, const QString &callBackUrl, const int &pageNumber, const int &pageSize)
{
bool btryLock = m_PullOrderDataMutex.tryLock(VALUE_TRYLOCKNETTIMEOUT);
if (btryLock) {
......@@ -245,8 +250,10 @@ bool FlowControl::_TryAddOrderPull(const QString &orderId, const QString &channe
PullOrderInfo* orderPull = new PullOrderInfo();
orderPull->orderId=orderId;
orderPull->channel=channel;
orderPull->callBackUrl = callBackUrl;
orderPull->pageNumber=pageNumber;
orderPull->pageSize=pageSize;
orderPull->pullErrorCount = 0;
m_orderPullList.append(orderPull);
m_PullOrderDataMutex.unlock();
......@@ -624,7 +631,7 @@ void FlowControl::_ScanDelayGetRefundDetailList() {
QLOG_ERROR()<< QString("[<<<<---_ScanDelayGetRefundDetailList: m_delayGetRefundDetailList's Fisrt Item delayPullOrder_p Is empty(3 list All Empty)--->>>>>]");
continue;
}
if ( _TryAddOrderPull(delayPullOrder_p->orderId,delayPullOrder_p->channel) ) {
if ( _TryAddOrderPull( delayPullOrder_p->orderId, delayPullOrder_p->channel, delayPullOrder_p->callBackUrl ) ) {
delete delayPullOrder_p;
delayPullOrder_p = nullptr;
} else {
......@@ -692,7 +699,7 @@ void FlowControl::_ScanDelayGetRefundDetailList() {
}
// Case4: 筛选出来 无需延迟获取退单详情的订单 需要添加到 正常的获取订单详情的队列中;
if ( _TryAddOrderPull(delayPullOrder_p->orderId,delayPullOrder_p->channel) ) {
if ( _TryAddOrderPull( delayPullOrder_p->orderId, delayPullOrder_p->channel, delayPullOrder_p->callBackUrl ) ) {
delete delayPullOrder_p;
delayPullOrder_p = nullptr;
} else {
......@@ -777,6 +784,7 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
orderObject->dataBaseIsORSPushInt = 0;
orderObject->dataBaseIsORSCancleInt = 0;
orderObject->dataBasePosOrderCheckNo = "";
orderObject->callBackUrl = "";
//插件程序内存中没有此订单时需要从数据库中获取该订单标志数据;同时在接受到退单情况时,也需要从数据库中重新获取(防止内存中标志数据未更新[入机后未更新]);
bool retGetDbOrderAllFlag = SimProcOrderDB::getInstance().getDbOrderAllFlag(orderObject->id,orderObject->dataBaseIsOrderExistInt,orderObject->dataBaseIsPushInt,
......@@ -1088,6 +1096,7 @@ bool FlowControl::_SimValidOrdersListIsEmpty(){
bool FlowControl::_Login()
{
QString error;
QString url;
bool result;
QJsonObject sendJson;
QJsonObject recvJson;
......@@ -1105,7 +1114,6 @@ bool FlowControl::_Login()
}
m_puginVersionComments = ConfigManger::GetInstance().GetOrderServerUrl();
sendJson = DataManger::GetInstance().GetLoginData(ConfigManger::GetInstance().GetPartnerId(),m_storeId,
m_password, m_posId, m_cashierId, m_ipPortAddress, m_puginVersionComments);
// 登录新增Pos相关属性字段;
......@@ -1115,26 +1123,34 @@ bool FlowControl::_Login()
sendJson.insert(JSON_POS_MAC_ADDRESS, m_posMacAddress);
emit showAlert(AlertForm::LOADING, QString::fromLocal8Bit("正在登录......"));
QLOG_INFO() << QString("[<<<<---Login--->>>>][requestData:%1]")<<sendJson;
if(ConfigManger::GetInstance().GetLoginSslConfig())
{
if ( ConfigManger::GetInstance().GetLoginSslConfig() ) {
m_loginSocket->SetSslConfig();
QLOG_INFO() << QString("[<<<<---_Login Set ssl Config--->>>>]");
}
QLOG_INFO()<<ConfigManger::GetInstance().GetLoginServerUrl()+
ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_ILOGIN);
m_loginSocket->SetUrl(QUrl(ConfigManger::GetInstance().GetLoginServerUrl()+
ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_ILOGIN)));
QLOG_INFO() << QString("[<<<<---_Login Qurl: --->>>>]")<<m_loginSocket->GetUrl();
// 如果前3次使用初始地址登录失败 3 次, 则切换使用 备用地址 再尝试3次, 合计超过6次,则切回初始地址继续登录;
if ( m_serviceCallBackUrl.length() && m_loginErrorCount > 2 && m_loginErrorCount < 6 ) {
url = m_serviceCallBackUrl + "/pos/" + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_ILOGIN);
sendJson.remove(JSON_PLUGINVERSIONCOMMENTS);
sendJson.insert(JSON_PLUGINVERSIONCOMMENTS, m_serviceCallBackUrl);
} else {
url = ConfigManger::GetInstance().GetLoginServerUrl() + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_ILOGIN);
}
m_loginSocket->SetUrl(QUrl( url ));
QLOG_INFO() << QString("[<<<<---_Login Qurl: %1 --->>>>][requestData: ]").arg(url) << sendJson;
result = m_loginSocket->PostRequest(sendJson, recvJson, error);
QLOG_INFO() << QString("[<<<<---Login Finshed--->>>>][result:%1][msg:%2][recvData:").arg(result).arg(error)<<recvJson;
if(!result) {
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("登录失败![网络错误]"));
m_loginErrorCount++;
} else {
if(JSON_STATUSCODE_OK != recvJson[JSON_LOGINCODE].toInt()) {
result = false;
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("登录失败![%1]").arg(recvJson[JSON_MESSAGE].toString()));
m_loginErrorCount++;
} else {
m_storeName = recvJson[JSON_STORENAME].toString();
m_openTcpChannel = recvJson[JSON_OPEN_TCP_CHANNEL].toBool();
......@@ -1163,6 +1179,7 @@ bool FlowControl::_Login()
m_pullTimer->start(1000*5);
m_reportOMSReocrdOrderTimer->start(1000*10);
m_clickPosCount = 0;
m_loginErrorCount = 0;
m_notifySimPullTimer->start(7*1000);
m_storageOrderTimer->start(10*1000);
m_delayGetRefundDetailTimer->start(15*1000);
......@@ -1211,7 +1228,7 @@ void FlowControl::_PullOrderData()
{
QLOG_INFO()<<"[<<<<----FlowControl::_PullOrderData ---->>>>>]";
if(m_orderPullList.isEmpty())
return ;
return;
emit hideAlert();
bool btryLock = m_PullOrderDataMutex.tryLock(VALUE_TRYLOCKNETTIMEOUT);
......@@ -1219,26 +1236,46 @@ void FlowControl::_PullOrderData()
QLOG_ERROR()<<"[<<<<----FlowControl::_PullOrderData Try Lock Failed ---->>>>>]";
return;
}
PullOrderInfo* info = m_orderPullList.takeFirst();
if ( info->pullErrorCount > 2 ) {
QLOG_INFO()<<QString( "[<<<<----FlowControl::_PullOrderData orderId:%1,Channel:%2,PullErrorCount:%3, CallBackUrl:%4, Pull Faild More Than 3 Times, Abandon This Item ---->>>>>]" )
.arg(info->orderId).arg(info->channel).arg(info->pullErrorCount).arg(info->callBackUrl);
m_orderPullList.removeOne(info);
// 特殊处理: 获取订单列表接口, 默认接口地址拉取失败,则尝试一次从备用OMS 回调地址在此进行拉取;
if ( info->orderId.isEmpty() && m_serviceCallBackUrl.length() && info->callBackUrl != m_serviceCallBackUrl ) {
info->callBackUrl = m_serviceCallBackUrl;
info->pullErrorCount = 0; // Pull Error Must Rest Zero, Or No Change Goto Pull All Order;
m_orderPullList.append(info);
} else {
delete info;
}
m_PullOrderDataMutex.unlock();
return;
}
if(info->orderId.isEmpty()) {
if ( _PullOrderList(info->pageSize,info->pageNumber) ) {
if ( _PullOrderList( info->pageSize, info->pageNumber, info->callBackUrl ) ) {
QLOG_INFO()<<"[<<<<----FlowControl::_PullOrderData _PullOrderList successful---->>>>>]";
m_orderPullList.removeOne(info);
delete info;
} else {
QLOG_INFO()<<"[<<<<----FlowControl::_PullOrderData _PullOrderList failed---->>>>>]";
m_orderPullList.removeOne(info);
info->pullErrorCount++;
m_orderPullList.append(info);
}
} else {
if (_PullOrderDetail(info->orderId,info->channel) ) {
if ( _PullOrderDetail( info->orderId, info->channel, info->callBackUrl ) ) {
QLOG_INFO()<<"[<<<<----FlowControl::_PullOrderData _PullOrderDetail successful---->>>>>]";
m_orderPullList.removeOne(info);
delete info;
} else {
QLOG_INFO()<<"[<<<<----FlowControl::_PullOrderData _PullOrderDetail fail---->>>>>]";
m_orderPullList.removeOne(info);
info->pullErrorCount++;
m_orderPullList.append(info);
}
}
......@@ -1247,11 +1284,12 @@ void FlowControl::_PullOrderData()
return ;
}
bool FlowControl::_PullOrderDetail(const QString& orderId, const QString& channel)
bool FlowControl::_PullOrderDetail(const QString& orderId, const QString& channel, const QString &callBackUrl)
{
if(m_pullOrderSocket==NULL)
m_pullOrderSocket =new BillSocket(this);
QString error;
QString url;
bool result;
QJsonObject recvJson;
......@@ -1261,8 +1299,12 @@ bool FlowControl::_PullOrderDetail(const QString& orderId, const QString& channe
} else {
QLOG_INFO()<<"FlowControl::_PullOrderDetail load not ssl";
}
QString url = ConfigManger::GetInstance().GetOrderServerUrl()+
ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_PULLORDER);
if ( callBackUrl.length() ) {
url = callBackUrl + "/order/" + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_PULLORDER);
} else {
url = ConfigManger::GetInstance().GetOrderServerUrl() + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_PULLORDER);
}
// 拉取订单详情接口:订单编号
url.append(orderId);
......@@ -1289,6 +1331,10 @@ bool FlowControl::_PullOrderDetail(const QString& orderId, const QString& channe
result=false;
} else {
QJsonObject order = recvJson[JSON_DATA].toObject();
if ( !order.contains("callBackUrl") ) {
order.insert( "callBackUrl", callBackUrl );
}
_OrderAnalysis(order);
}
}
......@@ -1303,12 +1349,13 @@ bool FlowControl::_PullOrderDetail(const QString& orderId, const QString& channe
return result;
}
bool FlowControl::_PullOrderList(const int &pageSize, const int &pageNo)
bool FlowControl::_PullOrderList( const int &pageSize, const int &pageNo, const QString &callBackUrl )
{
if(m_pullOrderListSocket==NULL) {
m_pullOrderListSocket =new BillSocket(this);
}
QString error;
QString url;
bool result;
QJsonObject sendJson;
QJsonObject recvJson;
......@@ -1322,13 +1369,19 @@ bool FlowControl::_PullOrderList(const int &pageSize, const int &pageNo)
} else {
QLOG_INFO()<<"FlowControl::_PullOrderList load not ssl";
}
m_pullOrderListSocket->SetUrl(QUrl(ConfigManger::GetInstance().GetOrderServerUrl()+
ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_PULLORDERLIST)));
QLOG_INFO()<<ConfigManger::GetInstance().GetOrderServerUrl()+
ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_PULLORDERLIST)<< " requestData: " <<sendJson;
if ( callBackUrl.length() ) {
url = callBackUrl + "/order/" + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_PULLORDERLIST);
} else {
url = ConfigManger::GetInstance().GetOrderServerUrl() + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_PULLORDERLIST);
}
m_pullOrderListSocket->SetUrl(QUrl( url ));
QLOG_INFO()<< url << " requestData: " <<sendJson;
result = m_pullOrderListSocket->PostRequest(sendJson, recvJson, error);
QLOG_INFO() << QString("[<<<<---FlowControl::_PullOrderList:Pull Order List Finish.--->>>>][result:%1][msg:%2]")
.arg(result).arg(error)<<recvJson;
QLOG_INFO() << QString("[<<<<---FlowControl::_PullOrderList:Pull Order List Finish.--->>>>][result:%1][msg:%2]").arg(result).arg(error)<<recvJson;
if(!result) {
emit setNetStatus(QString::fromLocal8Bit("<font color='#ff0000'>网络不稳定,正在重试</font>"));
} else {
......@@ -1358,6 +1411,8 @@ bool FlowControl::_PullOrderList(const int &pageSize, const int &pageNo)
orderPull->channel=QString();
orderPull->pageNumber=pageNo+1;
orderPull->pageSize=pageSize;
orderPull->pullErrorCount = 0;
orderPull->callBackUrl = callBackUrl;
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---FlowControl::_PullOrderList: Next Page Order List :pageNo:%1 pageSize:%2--->>>>]").arg(pageNo+1).arg(pageSize);
m_orderPullList.append(orderPull);
//避免出现存在多页数据,导致出现死锁;
......@@ -1381,6 +1436,7 @@ bool FlowControl::_PullOrderList(const int &pageSize, const int &pageNo)
bool FlowControl::_SendHeart()
{
QString error;
QString url;
bool result;
QJsonObject sendJson;
QJsonObject recvJson;
......@@ -1392,27 +1448,36 @@ bool FlowControl::_SendHeart()
sendJson.insert(JSON_POS_HOST_NAME, m_posHostName);
sendJson.insert(JSON_POS_MAC_ADDRESS, m_posMacAddress);
QLOG_INFO() << QString("[<<<<---Send Heart--->>>>][requestData:%1]")<<sendJson;
m_loginSocket->SetUrl(QUrl(ConfigManger::GetInstance().GetLoginServerUrl()+
ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_HEART)));
// 如果前3次使用初始地址心跳失败 3 次, 则切换使用 备用地址 再尝试3次, 合计超过6次,则切回初始地址继续心跳;
if ( m_serviceCallBackUrl.length() && m_sendHeartErrorCount > 2 && m_sendHeartErrorCount < 6 ) {
url = m_serviceCallBackUrl + "/pos/" + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_HEART);
sendJson.remove(JSON_PLUGINVERSIONCOMMENTS);
sendJson.insert(JSON_PLUGINVERSIONCOMMENTS, m_serviceCallBackUrl);
} else {
url = ConfigManger::GetInstance().GetLoginServerUrl() + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_HEART);
}
m_loginSocket->SetUrl(QUrl( url ) );
QLOG_INFO() << QString("[<<<<---Send Heart--->>>>][Url: %1, RequestData: ]").arg(url) << sendJson;
result = m_loginSocket->PostRequest(sendJson, recvJson, error);
QLOG_INFO() << QString("[<<<<---Send Heart Finish--->>>>][result:%1][msg:%2][recvData:%3]")
.arg(result).arg(error)<<recvJson;
if(!result)
{
QLOG_INFO() << QString("[<<<<---Send Heart Finish--->>>>][result:%1][msg:%2][recvData:%3]").arg(result).arg(error)<<recvJson;
if ( !result ) {
m_bLastHeartIsError = true;
m_sendHeartErrorCount++;
emit setNetStatus(QString::fromLocal8Bit("<font color='#ff0000'>网络不稳定,正在重试</font>"));
emit doUpdateStoreStatus(0, 0, 0, 0); //NetWork Is Error , Refresh Store Default Status;
}else
{
} else {
QLOG_INFO() << QString("[<<<<---Send Heart Finish: code:%1--->>>>]").arg(recvJson[JSON_LOGINCODE].toInt());
if(JSON_STATUSCODE_OK != recvJson[JSON_LOGINCODE].toInt())
{
result = false;
m_bLastHeartIsError = true;
m_sendHeartErrorCount++;
emit setNetStatus(QString::fromLocal8Bit("<font color='#ff0000'>网络不稳定,正在重试</font>"));
emit doUpdateStoreStatus(0, 0, 0, 0); //Interface Return Error , Refresh Store Default Status;
}else{
} else {
result = true;
emit setNetStatus(QString::fromLocal8Bit("<font color='#f5f5f5'>正常</font>"));
//只有上一次心跳是异常:才根据心跳来展示门店营业状态 [数据延迟比较严重:同时也需要通过OMS推门店状态给插件]
......@@ -1446,14 +1511,6 @@ bool FlowControl::_ConfirmOrder(const QString &orderId)
return result;
}
bool FlowControl::_RefuseOrder(const QString &orderId, int refuseCode,const QString reason)
{
Q_UNUSED(orderId);
Q_UNUSED(refuseCode);
Q_UNUSED(reason);
bool result = false;
return result;
}
bool FlowControl::_SendOrder(const QString& orderId)
{
......@@ -1469,18 +1526,14 @@ bool FlowControl::_CompleteOrder(const QString& orderId)
return result;
}
bool FlowControl::_RefuseRefund(const QString& orderId)
{
Q_UNUSED(orderId);
bool result = false;
return result;
}
bool FlowControl::_RefundOrder(const QString &orderId,int reasonCode,const QString& reason,const QString& dishesListString)
{
QLOG_INFO() << QString("[<<<<---FlowControl::_RefundOrder--->>>>][orderId:%1 reasonCode:%2 reason:%3 dishesListString:]").arg(orderId).arg(reasonCode).arg(reason).arg(dishesListString);
QString error;
QString url;
QString callBackUrl = "";
bool result;
QJsonObject sendJson;
QJsonObject recvJson;
......@@ -1488,7 +1541,17 @@ bool FlowControl::_RefundOrder(const QString &orderId,int reasonCode,const QStri
emit showAlert(AlertForm::LOADING, QString::fromLocal8Bit("正在通信......"));
QLOG_INFO() << QString("[<<<<---Refund Order Begin--->>>>][requestData:%1]")<<sendJson;
// 如果退款原因:商品已售完,使用下面接口; // 如果退款原因:其他,都同意使用一个接口;
m_procOrderSocket->SetUrl(QUrl(ConfigManger::GetInstance().GetOrderServerUrl() + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_CANCLE)));
if ( m_FmOrdersMap.value(orderId) ) {
callBackUrl = m_FmOrdersMap.value(orderId)->callBackUrl;
}
if ( callBackUrl.length() ) {
url = callBackUrl + "/order/" + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_CANCLE);
} else {
url = ConfigManger::GetInstance().GetOrderServerUrl() + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_CANCLE);
}
m_procOrderSocket->SetUrl(QUrl( url ) );
QLOG_INFO() << QString("[<<<<<-----_RefundOrder: orderId:%1 URL: ----->>>>>]").arg(orderId)<< m_procOrderSocket->GetUrl();
if(ConfigManger::GetInstance().GetOrderSslConfig()) {
......@@ -1645,7 +1708,10 @@ void FlowControl::_ReportOMSRecordOrderInfo()
//准备https请求,准备向OMS汇报订单的入机情况;
if(m_reportOMSRecordOrderSocket==NULL)
m_reportOMSRecordOrderSocket =new BillSocket(this);
QString error;
QString url;
QString callBackUrl;
bool result;
QJsonObject sendJson;
QJsonObject recvJson;
......@@ -1668,10 +1734,20 @@ void FlowControl::_ReportOMSRecordOrderInfo()
sendJson.insert(JSON_POS_PLUGIN_VERSION, RepOMSRecOrderIn->posPluginVersion);
QLOG_INFO() << QString("[<<<<---_ReportOMSRecordOrderInfo:Begin--->>>>][requestData:%1]")<<sendJson;
m_reportOMSRecordOrderSocket->SetUrl(QUrl(ConfigManger::GetInstance().GetLoginServerUrl()+
ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_REPORTOMSRECORDORDER)));
QLOG_INFO()<<QString("[<<<<---Report OMS Record Order Entry POS Info--->>>>][requestUrl:]") << ConfigManger::GetInstance().GetLoginServerUrl() +
ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_REPORTOMSRECORDORDER);
// 查找到 orderObject point 后,查找到 callBackUrl ;
if ( m_FmOrdersMap.value( RepOMSRecOrderIn->orderNo ) ) {
callBackUrl = m_FmOrdersMap.value( RepOMSRecOrderIn->orderNo )->callBackUrl;
}
if ( callBackUrl.length() ) {
url = callBackUrl + "/pos/" + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_REPORTOMSRECORDORDER);
} else {
url = ConfigManger::GetInstance().GetLoginServerUrl() + ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_REPORTOMSRECORDORDER);
}
m_reportOMSRecordOrderSocket->SetUrl( QUrl( url ) );
QLOG_INFO()<<QString("[<<<<---Report OMS Record Order Entry POS Info--->>>>][requestUrl:]") << url;
result = m_reportOMSRecordOrderSocket->PostRequest(sendJson, recvJson, error);
QLOG_INFO() << QString("[<<<<---Report OMS Record Order Entry POS Info Finish--->>>>][result:%1][msg:%2][orderId:%3]")
.arg(result).arg(error).arg( RepOMSRecOrderIn->orderNo )<<recvJson;
......@@ -1704,6 +1780,7 @@ void FlowControl::_ReportOMSRecordOrderInfo()
}
}
m_RepOMSRecordOrderMutex.unlock();
}
......@@ -1838,6 +1915,7 @@ void FlowControl::onSendSelfCheck()
return;
}
QString error;
QString url;
bool result;
QJsonObject sendJson;
QJsonObject recvJson;
......@@ -1850,20 +1928,29 @@ void FlowControl::onSendSelfCheck()
} else {
QLOG_INFO()<<"load not ssl";
}
QString url = ConfigManger::GetInstance().GetOrderServerUrl()+ "pos/create/checkOrder";
if ( m_serviceCallBackUrl.length() && m_bCreateSelfCheckOrderError ) {
url = m_serviceCallBackUrl + "/order/"+ "pos/create/checkOrder";
} else {
url = ConfigManger::GetInstance().GetOrderServerUrl()+ "pos/create/checkOrder";
}
QLOG_INFO() << QString("[<<<<---FlowControl::onSendSelfCheck Begin--->>>>][ requestUrl:%1 , requestData:] ").arg(url) << sendJson;
m_procOrderSocket->SetUrl(QUrl(url));
result = m_procOrderSocket->PostRequest(sendJson, recvJson, error);
QLOG_INFO() << QString("[<<<<---Get onSendSelfCheck:Finish--->>>>][result:%1][msg:%2] [recvData:] ")
.arg(result).arg(error)<<recvJson;
QLOG_INFO() << QString("[<<<<---Get onSendSelfCheck:Finish--->>>>][result:%1][msg:%2] [recvData:] ").arg(result).arg(error)<<recvJson;
if(!result) {
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("发送自测请求失败![网络错误]"));
m_bCreateSelfCheckOrderError ? m_bCreateSelfCheckOrderError = false : m_bCreateSelfCheckOrderError = true; // 一次失败一次切换主备地址;
} else {
if(JSON_STATUSCODE_OK != recvJson[JSON_ERRCODE].toInt()) {
result = false;
m_bCreateSelfCheckOrderError ? m_bCreateSelfCheckOrderError = false : m_bCreateSelfCheckOrderError = true; // 一次失败一次切换主备地址;
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("发送自测请求失败![%1]").arg(recvJson[JSON_MESSAGE].toString()));
} else {
emit showAlert(AlertForm::SUCCESS, QString::fromLocal8Bit("发送自测请求成功"));
m_bCreateSelfCheckOrderError = false;
// Test Modify Time
//emit showAlert(AlertForm::WARNNING, QString::fromLocal8Bit("用户修改 MOP 预约时间;订单尾号: 12345;"
// " 订单号: 9876543210012345678; 新预约时间: 18:00; 原预约时间: 17:30"));
......@@ -2468,6 +2555,9 @@ bool FlowControl::_ResponseOMS11Request(const QJsonObject &content, QJsonObject
if ( !m_bLoginResult ) {
error = QString::fromLocal8Bit("FMOMS未登录");
if ( content[JSON_CALL_BACK_URL].toString().length() ) {
m_serviceCallBackUrl = content[JSON_CALL_BACK_URL].toString(); // https://delposserviceapi.starbucks.net/backstage : 域名/backstage
}
return false;
} else {
if ( content[JSON_ORDER_ID].toString().isEmpty() ) {
......@@ -2476,8 +2566,13 @@ bool FlowControl::_ResponseOMS11Request(const QJsonObject &content, QJsonObject
} else {
QString omsPushOrderId = content[JSON_ORDER_ID].toString();
QString omsPushOrderChannel = content[JSON_CHANNEL].toString();
QString omsCallBackUrl= content[JSON_CALL_BACK_URL].toString(); // https://delposserviceapi.starbucks.net/backstage : 域名/backstage
int omsPushOrderStatus = content[JSON_STATUS].toInt();
if ( omsCallBackUrl.length() ) {
m_serviceCallBackUrl = omsCallBackUrl;
}
if ( 6 == omsPushOrderStatus ) {
// 避免小概率事件:①重复录单 ②单边账;
bool bRetDelayGetRefundDetailMutex =m_delayGetRefundDetailMutex.tryLock(VALUE_TRYLOCKMEMTIMEOUT);
......@@ -2496,6 +2591,7 @@ bool FlowControl::_ResponseOMS11Request(const QJsonObject &content, QJsonObject
}
delayOrderPull_p->orderId=omsPushOrderId;
delayOrderPull_p->channel=omsPushOrderChannel;
delayOrderPull_p->callBackUrl = omsCallBackUrl;
m_delayGetRefundDetailList.append(delayOrderPull_p);
QLOG_INFO()<<QString("[<<<<---_ResponseOMS11Request: orderId: %1 Append Success, m_delayGetRefundDetailList size: %2 And FirstOne: %3 --->>>>>]")
.arg( omsPushOrderId ).arg( m_delayGetRefundDetailList.size() ).arg( m_delayGetRefundDetailList.isEmpty()? " " : m_delayGetRefundDetailList.first()->orderId );
......@@ -2504,7 +2600,7 @@ bool FlowControl::_ResponseOMS11Request(const QJsonObject &content, QJsonObject
} else {
// 接受到非码oms插过来的订单,进行向队列中进行添加;
// Case3: 添加前 筛选是否已经存在待拉取的状态;
result = _TryAddOrderPull( omsPushOrderId, omsPushOrderChannel );
result = _TryAddOrderPull( omsPushOrderId, omsPushOrderChannel, omsCallBackUrl );
}
}
......@@ -3417,7 +3513,7 @@ void FlowControl::onProcessOrder(const QString &operation, const QString &orderI
_CompleteOrder(orderId);
}else if(!operation.compare(OPERATION_REFUSEREFUND))
{
_RefuseRefund(orderId);
}else if(!operation.compare(OPERATION_REFUNDORDER))
{
_RefundOrder(orderId,5,QString::fromLocal8Bit("同意退款"),QString());
......@@ -3477,6 +3573,7 @@ void FlowControl::onGetEcMopOrderDetails(const QString& orderId, const QString&
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("扫描订单号异常") );
return;
} else {
QString callBackUrl = "";
// 入参有效;
// 判断插件是否登录成功了,没有登录成功,弹框提示;
if ( !m_bLoginResult ) {
......@@ -3484,11 +3581,16 @@ void FlowControl::onGetEcMopOrderDetails(const QString& orderId, const QString&
return;
}
// 组装请求报文 [ 含门店编号:便于 OMS 校验此订单是否属于本门店 ] , 获取订单详情数据 ;[ 失败则弹框提示]
bool pullOrderDetailRet = _PullOrderDetail( orderId, channel);
if ( m_FmOrdersMap.value(orderId) ) {
callBackUrl = m_FmOrdersMap.value(orderId)->callBackUrl;
}
bool pullOrderDetailRet = _PullOrderDetail( orderId, channel , callBackUrl );
if ( pullOrderDetailRet ) {
// 展示跳转订单详情页面; // 同一线程, 理论无需 Sleep
Sleep(1000*3);
emit showOrderDetails(m_FmOrdersMap.value(orderId));
emit showOrderDetails( m_FmOrdersMap.value(orderId) );
}
}
......@@ -3529,7 +3631,6 @@ void FlowControl::onSerachOrder(const QString &text)
void FlowControl::onProcessRejectOrder(const QString &orderId, const int &reasonCode,const QString &reason)
{
_RefuseOrder(orderId, reasonCode,reason);
}
......@@ -3562,6 +3663,8 @@ void FlowControl::onProcessReTryInputOrder(const QString &orderId)
orderPull->channel=TempOrderObject->channel;
orderPull->pageNumber=1;
orderPull->pageSize=30;
orderPull->pullErrorCount = 0;
orderPull->callBackUrl = TempOrderObject->callBackUrl;
m_orderPullList.append(orderPull);
m_PullOrderDataMutex.unlock();
}
......
......@@ -66,12 +66,15 @@ private:
int pageNumber;
QString channel;
QString orderId;
int pullErrorCount;
QString callBackUrl;
}PullOrderInfo;
typedef struct TO_DELAY_PULL_ORDER
{
QString channel;
QString orderId;
QString callBackUrl;
}DelayPullOrderInfo;
typedef struct ORDER_OPERATION
......@@ -152,12 +155,14 @@ private:
// 是否第一次获取到门店信息
bool m_bFirstRecvInfo;
bool m_bLoginResult;
int m_loginErrorCount;
int m_sendHeartErrorCount;
bool m_bCreateSelfCheckOrderError;
bool m_openTcpChannel;
bool m_bOperateResult;
// 标记目前悬浮框是否 锁住状态[false:悬浮框解锁状态; true:悬浮框锁住状态];
bool m_bFloatFromLockSt;
// HttpServer
//JQHttpServer::TcpServerManage* m_tcpServerManage;
LoaclHttpServer* loaclHttpServer;
QMap<QString, QMultiMap<QString, dishesObject> >m_dishesMap;
......@@ -201,6 +206,9 @@ private:
bool m_initPrintOrderPromotionDBRet;
bool m_initCheckPoskeyExistPosDBRet;
// 新增: 记录OMS备用服务的 CallBackUrl 地址; 便于OMS服务异常时,具备热切换功能: 登录 + 订单列表 + 心跳 + 自检单;
QString m_serviceCallBackUrl;
signals:
// 发送信号给自己 做登陆
void doLogin();
......@@ -336,12 +344,12 @@ private slots:
* 参数:[1]订单编号
* 返回:是否成功
* */
bool _PullOrderDetail(const QString &orderId, const QString& channel);
bool _PullOrderDetail( const QString &orderId, const QString &channel, const QString &callBackUrl );
/* 功能:拉取订单
* 参数:NULL
* 返回:是否成功
* */
bool _PullOrderList(const int &pageSize, const int &pageNo);
bool _PullOrderList( const int &pageSize, const int &pageNo, const QString &callBackUrl );
/* 功能:发送心跳
* 参数:NULL
* 返回:是否成功
......@@ -352,11 +360,7 @@ private slots:
* 返回:是否成功
* */
bool _ConfirmOrder(const QString& orderId);
/* 功能:拒绝订单
* 参数:[1]订单编号[2]拒单原因
* 返回:是否成功
* */
bool _RefuseOrder(const QString& orderId, int refuseCode, const QString reason);
/* 功能:送出订单
* 参数:[1]订单编号
* 返回:是否成功
......@@ -367,11 +371,7 @@ private slots:
* 返回:是否成功
* */
bool _CompleteOrder(const QString& orderId);
/* 功能:拒绝退单
* 参数:NULL
* 返回:是否成功
* */
bool _RefuseRefund(const QString& orderId);
/* 功能:退单
* 参数:NULL
* 返回:是否成功
......@@ -405,7 +405,7 @@ private slots:
void _GetIpAddress();
void _AddOrderPull(const QString& orderId=0,const QString& channel=0,const int& pageNumber=1,const int& pageSize=30);
// 避免获取较多历史订单的同时,OMS又有推单过来,导致死锁;
bool _TryAddOrderPull(const QString &orderId=0, const QString &channel=0, const int &pageNumber=1, const int &pageSize=30);
bool _TryAddOrderPull(const QString &orderId=0, const QString &channel=0, const QString &callBackUrl="", const int &pageNumber=1, const int &pageSize=30);
//点击屏幕指定区域
void _ClickOMSAssignArea();
......
......@@ -109,6 +109,7 @@ class OrderObject : public QObject
Q_PROPERTY (QString remindTicketTime READ getRemindTicketTime WRITE setRemindTicketTime )
Q_PROPERTY (QString carNumber READ getCarNumber WRITE setCarNumber)
Q_PROPERTY (QString privacyPhone READ getPrivacyPhone WRITE setPrivacyPhone)
Q_PROPERTY (QString callBackUrl READ getCallBackUrl WRITE setCallBackUrl)
public:
OrderObject(QObject *parent=0)
......@@ -235,6 +236,7 @@ public:
QString remindTicketTime; // 提醒小票时间
QString carNumber; // 车牌号
QString privacyPhone; // 隐私号
QString callBackUrl; // 为阿里云配置新域名, 用于获取订单详情, 和汇报订单入机情况: 拉取订单详情成功时手动添加到订单json报文体中为了入机汇报接口;
int forwardPosStatus; // 正向单入机状态: 0:未知 1: 成功 2:失败;
int negativePosStatus; // 负向单同上;
......@@ -537,6 +539,9 @@ public:
inline QString getPrivacyPhone()const{return privacyPhone;}
inline void setPrivacyPhone(const QString& v){privacyPhone = v;}
inline QString getCallBackUrl()const{return callBackUrl;}
inline void setCallBackUrl(const QString& v){callBackUrl = v;}
};
#endif // ORDEROBJECT_H
......@@ -158,6 +158,7 @@
#define JSON_STORE_ID "storeId"
#define JSON_POSIPADDRESS "posAddress"
#define JSON_CHANNEL "channel"
#define JSON_CALL_BACK_URL "callBackUrl"
#define JSON_BUSINESSSTATUS "business_status"
#define JSON_CODE "code"
#define JSON_PAGENUMBER "pageNo"
......
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