Commit 941e58fa by wuyang.zou

<1> 远端PosAgent服务掉线,插件程序异常奔溃问题

<2> 美好咖啡订单标识
<3> 微信拼单昵称存储
<4> 高德-Curbside: 街送标识 & 制作时间实时刷新
parent d11860bf
......@@ -19,8 +19,10 @@ SocketCommunicate::SocketCommunicate(ThreadSocket *parent) : ThreadSocket(parent
_storeId = "";
_macAddress = "";
_hostName = "";
_workStationNum = "0";
_localIp = "";
_localPort = 0;
_localPort = 24409;
_httpLoginResult = false;
_openTcpChannel = false;
_pcsPluginVersion = APP_VERSION;
......@@ -46,8 +48,9 @@ SocketCommunicate::~SocketCommunicate()
if ( _sslSocket ) {
_sslSocket->disconnectFromHost(); // free Host And Port Resource;
delete _sslSocket;
_sslSocket = nullptr;
// https://doc.qt.io/archives/qtjambi-4.5.2_01/com/trolltech/qt/network/QAbstractSocket.html#disconnectFromHost()
// Will Emit signal: disconnected() , Then Trigger Slot: deleteLater()
// delete _sslSocket; _sslSocket = nullptr;
}
emit quit();
......@@ -68,17 +71,20 @@ void SocketCommunicate::setPosMetaData(const QVariantMap &posMetaData)
bool SocketCommunicate::connectTcpSvr()
{
if( 0 == _tcpSvrIp.length() || 0 == _tcpSvrPort ) {
QLOG_ERROR() << "connectTcpSvr::_tcpSvrIp / _tcpSvrPort Is Invalid";
QLOG_ERROR() << "connectTcpSvr:: _tcpSvrIp / _tcpSvrPort Is Invalid";
return false;
}
QLOG_INFO() << QString("connectTcpSvr::SvrIp & SvrPort: %1:%2 ").arg( _tcpSvrIp ).arg( _tcpSvrPort );
QLOG_INFO() << QString("connectTcpSvr:: SvrIp & SvrPort: %1:%2 ").arg( _tcpSvrIp ).arg( _tcpSvrPort );
_sslSocket = new QSslSocket();
while ( !_sslSocket ) {
_sslSocket = new QSslSocket();
};
// 绑定 sslSocket Connect成功后 触发 Lambda 槽函数: <1> 重置超时标志: _isTimeout 为 False; <2> 发出连接成功信号中断阻塞模式;
connect(_sslSocket, &QSslSocket::connected, [this] () { _isTimeout = false; emit connected(); } );
// 解除 sslSocket 长连接后 触发 Lambda 槽函数: <1> 释放 _sslSocket 内存;
// 解除 sslSocket 长连接后 触发 Lambda 槽函数: <1> 释放 _sslSocket 内存; 【服务端断开: 此时Socket会触发disconnect信号, 后续触发 deleteLater(), 慎重空指针 】
connect(_sslSocket, SIGNAL( disconnected() ), _sslSocket, SLOT( deleteLater() ) );
// 绑定 sslSocket 异常时 触发 SocketCommunicate::quit 信号函数
......@@ -91,12 +97,12 @@ bool SocketCommunicate::connectTcpSvr()
connect(_sslSocket, &QSslSocket::bytesWritten, [this] (quint64 writebyte) { Q_UNUSED(writebyte); _isTimeout = false; emit writeReady(); } );
//下载证书接口(需要门店号 & 设备号)待调试, 评估是否需要保存证书文件:
QLOG_INFO() << "connectTcpSvr::Get Certificate From Url: ......................";
QLOG_INFO() << "connectTcpSvr:: Get Certificate From Url: ......................";
std::string tempMacAddress = "";
int getMacRet = MacTool::GetMacByAdaptersAddresses( tempMacAddress );
if ( !getMacRet) {
QLOG_ERROR() << "MacTool::GetMacByAdaptersAddresses Falied";
QLOG_ERROR() << "connectTcpSvr:: MacTool::GetMacByAdaptersAddresses Falied";
// 是否需要弹框提示 伙伴.
}
_macAddress = tempMacAddress.c_str();
......@@ -108,36 +114,47 @@ bool SocketCommunicate::connectTcpSvr()
QString requestError;
int requestErrorNum = 0;
// 如果获取证书失败,需要循环获取,且频次需要越来越低;
do {
if ( S_GetRequest( reqCertificateRealUrl, outCertificateData, requestError) ) {
outCertificateJson = QJsonDocument::fromJson(outCertificateData).object();
if ( outCertificateJson.contains(JSON_DATA) && true == outCertificateJson[JSON_TCP_STA_RST].toBool()
&& QString("200") == outCertificateJson[JSON_TCP_STA_CODE].toString() ) {
QString encryptPublicKey = outCertificateJson[JSON_DATA].toObject()[JSON_KEY_PUBLIC_KEY].toString();
QString encryptPrivateKey = outCertificateJson[JSON_DATA].toObject()[JSON_KEY_PRIVATE_KEY].toString();
if ( 0 == _certPublishKey.length() || 0 == _certPrivateKey.length() ) {
do {
if ( S_GetRequest( reqCertificateRealUrl, outCertificateData, requestError) ) {
outCertificateJson = QJsonDocument::fromJson(outCertificateData).object();
if ( outCertificateJson.contains(JSON_DATA) && true == outCertificateJson[JSON_TCP_STA_RST].toBool()
&& QString("200") == outCertificateJson[JSON_TCP_STA_CODE].toString() ) {
QString encryptPublicKey = outCertificateJson[JSON_DATA].toObject()[JSON_KEY_PUBLIC_KEY].toString();
QString encryptPrivateKey = outCertificateJson[JSON_DATA].toObject()[JSON_KEY_PRIVATE_KEY].toString();
QLOG_INFO()<< QString("connectTcpSvr:: Get Certificate Url: %1 , encryptPublicKey: %2 , encryptPrivateKey: %3 ;")
.arg( reqCertificateRealUrl ).arg( encryptPublicKey ).arg( encryptPrivateKey ) ;
if ( !SocketCommuProcess::getRealPubKeyPriKey( encryptPublicKey, encryptPrivateKey, _certPublishKey, _certPrivateKey ) ) {
requestErrorNum++;
QLOG_INFO()<< QString("connectTcpSvr:: getRealPubKeyPriKey Failed, encryptPublicKey: %1 , encryptPrivateKey: %2 ").arg( encryptPublicKey ).arg( encryptPrivateKey );
if (requestErrorNum < 5 ) {
Sleep(2*60*1000);
} else {
Sleep(5*60*1000);
}
QLOG_INFO()<< QString("Get Certificate Url: %1 , encryptPublicKey: %2 , encryptPrivateKey: %3 ;")
.arg( reqCertificateRealUrl ).arg( encryptPublicKey ).arg( encryptPrivateKey ) ;
} else {
requestErrorNum = 0;
break;
}
if ( !SocketCommuProcess::getRealPubKeyPriKey( encryptPublicKey, encryptPrivateKey, _certPublishKey, _certPrivateKey ) ) {
} else {
requestErrorNum++;
QLOG_INFO()<< QString("getRealPubKeyPriKey Failed, encryptPublicKey: %1 , encryptPrivateKey: %2 ").arg( encryptPublicKey ).arg( encryptPrivateKey );
QLOG_ERROR() <<QString("connectTcpSvr:: Get Certificate Url: %1 , ErrorMsg: %2 , RspErrorMsg: %3 , requestErrorNum: %4 , outRspData: %5")
.arg( reqCertificateRealUrl ).arg( requestError ).arg( outCertificateJson[JSON_MSG].toString() ).arg( requestErrorNum).arg( QString(outCertificateData) );
if (requestErrorNum < 5 ) {
Sleep(2*60*1000);
} else {
Sleep(5*60*1000);
}
} else {
requestErrorNum = 0;
break;
}
} else {
requestErrorNum++;
QLOG_ERROR() <<QString("Get Certificate Url: %1 , ErrorMsg: %2 , RspErrorMsg: %3 , requestErrorNum: %4 , outRspData: %5")
.arg( reqCertificateRealUrl ).arg( requestError ).arg( outCertificateJson[JSON_MSG].toString() ).arg( requestErrorNum).arg( QString(outCertificateData) );
QLOG_ERROR() <<QString("connectTcpSvr:: Get Certificate Url: %1 ,ErrorMsg: %2, outRspData: %3 ").arg( reqCertificateRealUrl ).arg( requestError ).arg( QString(outCertificateData) );
if (requestErrorNum < 5 ) {
Sleep(2*60*1000);
} else {
......@@ -145,22 +162,14 @@ bool SocketCommunicate::connectTcpSvr()
}
}
} else {
requestErrorNum++;
QLOG_ERROR() <<QString("Get Certificate Url: %1 ,ErrorMsg: %2, outRspData: %3 ").arg( reqCertificateRealUrl ).arg( requestError ).arg( QString(outCertificateData) );
if (requestErrorNum < 5 ) {
Sleep(2*60*1000);
} else {
Sleep(5*60*1000);
}
}
} while(1);
} while(1);
}
_sslSocket->ignoreSslErrors();
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setPeerVerifyMode(QSslSocket::VerifyNone);
_sslSocket->setSslConfiguration(config);
QLOG_INFO() <<" _sslSocket->errorString: "<< _sslSocket->errorString();
_isTimeout = true;
// 无证书, 故无法使用 connectToHostEncrypted , 否则 提示: refuse connect;
_sslSocket->connectToHost(_tcpSvrIp, _tcpSvrPort);
......@@ -177,12 +186,14 @@ bool SocketCommunicate::connectTcpSvr()
// Connect Tcp Svr Success, Then Lambda Fuc Will Change Flag: _isTimeout = false;
if ( _isTimeout ) {
QLOG_ERROR() <<" ErrorMsg: "<< _sslSocket->errorString() << " ErrorCode: "<<_sslSocket->sslErrors() << " Timeout: "<< _isTimeout;
QLOG_ERROR() <<"connectTcpSvr:: ErrorMsg: "<< _sslSocket->errorString() << " ErrorCode: "<<_sslSocket->sslErrors() << " Timeout: "<< _isTimeout;
} else {
QLOG_INFO() <<QString(" connectTcpSvr Success, _tcpSvrIp: %1 , _tcpSvrPort: %2 ").arg( _tcpSvrIp ).arg( _tcpSvrPort );
QLOG_INFO() <<QString("connectTcpSvr:: Success, _tcpSvrIp: %1 , _tcpSvrPort: %2 ").arg( _tcpSvrIp ).arg( _tcpSvrPort );
//连接 Server IP + Port 成功后,设置MetaData;
QVariantMap tmpMap;
tmpMap.insert(JSON_TCP_DEVICE_ID , _macAddress);
tmpMap.insert(JSON_TCP_DEVICE_HOST_NAME , _hostName);
tmpMap.insert(JSON_TCP_DEVICE_WORKS_NUM , _workStationNum);
tmpMap.insert(JSON_TCP_DEVICE_IP , _localIp);
tmpMap.insert(JSON_TCP_DEVICE_PORT , _localPort);
tmpMap.insert(JSON_TCP_DEVICE_TYPE , "pcsPlugin");
......@@ -220,7 +231,13 @@ bool SocketCommunicate::loginTcpSvr()
QLOG_INFO() << "loginTcpSvr:: Tcp Login Request QByteArray : " << requestdata.toHex();
_isTimeout = true;
_sslSocket->write(requestdata);
if ( _sslSocket && _sslSocket->isOpen() && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) {
_sslSocket->write(requestdata);
} else {
QLOG_INFO() << "loginTcpSvr:: _sslSocket Is Null Or _sslSocket->isOpen() Is False Or _sslSocket Is Not ConnectedState ";
if ( _sslSocket ) _sslSocket->disconnectFromHost();
return false;
}
{
QEventLoop loop; QTimer timer;
......@@ -233,8 +250,8 @@ bool SocketCommunicate::loginTcpSvr()
// Login Tcp Svr Success, Then Lambda Fuc Will Change Flag: _isTimeout = false;
if(_isTimeout) {
QLOG_ERROR() << "loginTcpServer:: Send Login Request Msg To PosAgent Failed: " << _sslSocket->errorString();
_sslSocket->disconnectFromHost();
QLOG_ERROR() << "loginTcpServer:: Send Login Request Msg To PosAgent Failed: " << ( _sslSocket ? _sslSocket->errorString() : " _sslSocket Is Null ") ;
if ( _sslSocket ) _sslSocket->disconnectFromHost();
return false;
} else {
QLOG_INFO() << "loginTcpServer:: Send Login Request Msg To PosAgent Success";
......@@ -252,30 +269,31 @@ bool SocketCommunicate::loginTcpSvr()
}
if(_isTimeout) {
QLOG_ERROR() << "loginTcpServer:: Receive Login Response Msg From PosAgent Failed, TimeOut: true sslSocketError: " << _sslSocket->errorString();
_sslSocket->disconnectFromHost();
QLOG_ERROR() << "loginTcpServer:: Receive Login Response Msg From PosAgent Failed, TimeOut: true sslSocketError: " << ( _sslSocket ? _sslSocket->errorString() : " _sslSocket Is Null ");
if ( _sslSocket ) _sslSocket->disconnectFromHost();
return false;
}
QByteArray headByteData = _sslSocket->read(sizeof(Data_Head));
QByteArray headByteData = ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ? _sslSocket->read(sizeof(Data_Head)) : "" ;
Data_Head outDataHead = {0};
if ( !SocketCommuProcess::getHeadAllData( headByteData, outDataHead ) )
{
if ( CMD_AUTH_LOGIN_RESP != outDataHead.type) {
QLOG_ERROR() << "loginTcpServer:: Login Receive Head Failed / Not Login Response ";
_sslSocket->disconnectFromHost();
return false;
if ( _sslSocket ) _sslSocket->disconnectFromHost();
} else {
QLOG_INFO() << "loginTcpServer:: Login Receive Head Successed ";
QLOG_INFO() << "loginTcpServer:: Login Receive Head Successed, But headByteData Too Short Or Type Error ";
}
return false;
}
QByteArray body = _sslSocket->read(outDataHead.length);
QByteArray body = ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ? _sslSocket->read(outDataHead.length) : "" ;
QJsonDocument jsonDocument = QJsonDocument::fromJson(body);
if(jsonDocument.isNull()) {
QLOG_ERROR() << "loginTcpServer:: Login Receive Body Is Null / Empty";
_sslSocket->disconnectFromHost();
if ( _sslSocket ) _sslSocket->disconnectFromHost();
return false;
}
......@@ -286,23 +304,28 @@ bool SocketCommunicate::loginTcpSvr()
return true;
} else {
QLOG_ERROR() << "loginTcpServer:: Receive Login Response Json Body No Contains Key:'ok' Or Key:'ok'->value Not True";
_sslSocket->disconnectFromHost();
if ( _sslSocket ) _sslSocket->disconnectFromHost();
return false;
}
}
void SocketCommunicate::acceptTcpSvrSendMsg()
{
_socketHeartTimer = new QTimer(this);
connect(_socketHeartTimer,&QTimer::timeout,this,&SocketCommunicate::sendSocketHeart);
_socketHeartTimer->start(1000*80);
_socketHeartTimer->start( SOCKET_HEARTBEAT_INTERVAL * 1000 );
while(!_stopFlag && !_needTcpLogin)
{
QLOG_INFO() << "acceptTcpSvrSendMsg:: Wait Recv Socket Msg ............";
QLOG_INFO() << "acceptTcpSvrSendMsg:: Wait Recv Socket Msg ....................................";
if ( _sslSocket && QAbstractSocket::ConnectedState != _sslSocket->state() ) {
QLOG_INFO() << "acceptTcpSvrSendMsg:: Before Waitting Recv Socket Msg, Check _sslSocket->state() != ConnectedState, _sslSocket Is Invalid, Wait Reconnect...... ";
break;
}
_isTimeout = true;
{
QEventLoop loop;
......@@ -310,24 +333,28 @@ void SocketCommunicate::acceptTcpSvrSendMsg()
connect(this, &SocketCommunicate::quit, &loop, &QEventLoop::quit);
connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
connect(this, &SocketCommunicate::readReady, &loop, &QEventLoop::quit);
timer.start(150*1000);
timer.start(120*1000);
loop.exec();
}
if(_isTimeout) {
if ( !_sslSocket || ( QAbstractSocket::ConnectedState != _sslSocket->state() ) ) {
QLOG_INFO() << "acceptTcpSvrSendMsg:: Wait Recv Socket Msg, _sslSocket Is Null Or Not ConnectedState, Maybe Had Been Closed By Remote PosAgent Service";
break;
}
QDateTime tmpCurDateTime = QDateTime::currentDateTime();
int seconds = tmpCurDateTime.secsTo(_socketHeartBeatDateTime);
if ( abs(seconds) > 90 ) {
if ( abs(seconds) > ( SOCKET_HEARTBEAT_INTERVAL + 20 ) ) {
QLOG_ERROR() << "acceptTcpSvrSendMsg:: Nothing Recv, Timeout , Wait Retry Connect Server...... ";
break;
} else {
QLOG_INFO() << "acceptTcpSvrSendMsg:: Nothing Recv, Continue Wait Recv Msg Because Diff Last HeartBeat Stamps < 90 , Value: " << abs(seconds);
QLOG_INFO() << "acceptTcpSvrSendMsg:: Nothing Recv, Continue Wait Recv Msg Because Diff Last HeartBeat Stamps < ( SOCKET_HEARTBEAT_INTERVAL + 20 ) , Value: " << abs(seconds);
continue;
}
}
// <1> Read Socket Msg Head;
QByteArray headByteData = _sslSocket->read(sizeof(Data_Head));
QByteArray headByteData = ( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->read( sizeof( Data_Head ) ) : "";
if ( 0 == headByteData.size() ) {
// 当定时器触发主动向 POSAgent 发送心跳请求后, 此处会接收到 0 字节 ReadReady 事件,应该忽略此种情况,继续接受数据.
QLOG_INFO() << "acceptTcpSvrSendMsg:: Receive Head Data Size Is Zore, Continue Recv...... ";
......@@ -338,7 +365,7 @@ void SocketCommunicate::acceptTcpSvrSendMsg()
if ( !SocketCommuProcess::getHeadAllData( headByteData, outDataHead ) ) {
//清空内部缓冲器重新读
QLOG_ERROR() << "acceptTcpSvrSendMsg:: Receive Head Data Failed / Not Normal Response ";
_sslSocket->readAll();
( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->readAll() : "" ;
continue;
}
......@@ -353,11 +380,11 @@ void SocketCommunicate::acceptTcpSvrSendMsg()
//<1.1> Case: Recv HeartBeat Msg;
if(outDataHead.type == CMD_RECV_HEARTBEAT_REQ)
{
_sslSocket->read(outDataHead.length);
( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->read(outDataHead.length) : "";
// Prepare Response Server Heart Beat
SocketCommuProcess::getByteFormatHeartResp(data);
QLOG_INFO() << "acceptTcpSvrSendMsg:: Prepare HeartBeat Response Data For PosAgnet, Sequence: " << outDataHead.sequence <<" Heart Beat: " << data.toHex();
int len = _sslSocket->write(data);
int len = ( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->write(data) : 0 ;
_isTimeout = true;
{
......@@ -371,8 +398,14 @@ void SocketCommunicate::acceptTcpSvrSendMsg()
}
// Sync Heart Beat Communicate Sunccess Stamp;
if ( !_isTimeout ) {
if ( !_isTimeout && ( 0 != len ) ) {
_socketHeartBeatDateTime = QDateTime::currentDateTime();
} else {
if ( !_sslSocket || ( _sslSocket && ( QAbstractSocket::ConnectedState != _sslSocket->state() ) ) || 0 == len ) {
QLOG_INFO() << "acceptTcpSvrSendMsg:: _sslSocket Is Null Or Not ConnectedState, Write Data Len : "<< len
<<" Maybe Had Been Closed By Remote PosAgent Service ";
break;
}
}
QLOG_INFO() << "acceptTcpSvrSendMsg:: Socket Write Heart Beat Response Data , Sequence: " << outDataHead.sequence <<" Len: " << len
<< ( _isTimeout ? " TimeOut" : " Success")<< " syncHeartBeatStamp: "<<_socketHeartBeatDateTime.toString("yyyy-MM-dd hh:mm:ss");
......@@ -382,7 +415,7 @@ void SocketCommunicate::acceptTcpSvrSendMsg()
else if(outDataHead.type == CMD_RECV_MSG_REQ)
{
// Recv Server Push OrderStatus Msg;
QByteArray msgData = _sslSocket->read(outDataHead.length);
QByteArray msgData = ( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->read(outDataHead.length) : "";
QLOG_INFO() << "acceptTcpSvrSendMsg:: Recv PosAgnet Push OrderStatus, Sequence: " << outDataHead.sequence << " Msg: " << msgData.data();
// Check Server Push Msg Is Valid
......@@ -399,9 +432,8 @@ void SocketCommunicate::acceptTcpSvrSendMsg()
}
// Prepare Response Data For Server Push OrderStatus;
SocketCommuProcess::getByteFormatMsgResp(data, outDataHead.sequence , inputJsonObj);
QLOG_INFO() << "acceptTcpSvrSendMsg:: Prepare Response Data For PosAgnet Push OrderStatus, Sequence: " << outDataHead.sequence
<< " MsgData: " << data.toHex();
int len = _sslSocket->write(data);
QLOG_INFO() << "acceptTcpSvrSendMsg:: Prepare Response Data For PosAgnet Push OrderStatus, Sequence: " << outDataHead.sequence << " MsgData: " << data.toHex();
int len = ( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->write(data) : 0 ;
_isTimeout = true;
{
......@@ -414,13 +446,21 @@ void SocketCommunicate::acceptTcpSvrSendMsg()
loop.exec();
}
QLOG_INFO() << "acceptTcpSvrSendMsg:: Socket Write OrderStatus Resp Data, Sequence: " << outDataHead.sequence <<" Len: " << len << ( _isTimeout ? " TimeOut" : " Success" ) ;
if ( _isTimeout ) {
if ( !_sslSocket || ( QAbstractSocket::ConnectedState != _sslSocket->state() ) ) {
QLOG_INFO() << "acceptTcpSvrSendMsg:: _sslSocket Is Null Or Not ConnectedState, Maybe Had Been Closed By Remote PosAgent Service";
break;
}
}
continue;
}
//<1.3> Case: Recv Auth Login Resp Msg [ impossible];
else if(outDataHead.type == CMD_AUTH_LOGIN_RESP)
{
// Recv Server Response Msg Of Self Login Request ;
QByteArray msgData = _sslSocket->read(outDataHead.length);
QByteArray msgData = ( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->read(outDataHead.length) : "" ;
QLOG_INFO() << "acceptTcpSvrSendMsg:: Recv PosAgent Response Login Req , Sequence: " << outDataHead.sequence << " Msg: " << msgData.data();
// Check Server Push Msg Is Valid
if ( checkRecvMsgValid(msgData, actionId, outOrderId, outErrorMsg) ) {
......@@ -438,7 +478,7 @@ void SocketCommunicate::acceptTcpSvrSendMsg()
SocketCommuProcess::getByteFormatMsgResp(data, outDataHead.sequence, inputJsonObj);
QLOG_INFO() << "acceptTcpSvrSendMsg:: Prepare Response Data For PosAgent Response Login Request, Sequence: " << outDataHead.sequence
<< " MsgData: "<<data.toHex();
int len = _sslSocket->write(data);
int len = ( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->write(data) : 0 ;
_isTimeout = true;
{
......@@ -452,13 +492,22 @@ void SocketCommunicate::acceptTcpSvrSendMsg()
}
QLOG_INFO() << "acceptTcpSvrSendMsg:: Socket Write Login Resp'Resp Data (Impossible Occur), Sequence: " << outDataHead.sequence <<" Len: "<< len
<< ( _isTimeout ? " TimeOut" : " Success") ;
if ( _isTimeout ) {
if ( !_sslSocket || ( QAbstractSocket::ConnectedState != _sslSocket->state() ) ) {
QLOG_INFO() << "acceptTcpSvrSendMsg:: _sslSocket Is Null Or Not ConnectedState, Maybe Had Been Closed By Remote PosAgent Service";
break;
}
}
continue;
}
//<1.4> Case: Recv Socket Msg Type No Process , DataHead.type Havn't Match Success [ Maybe ]; Need Response, Or POS Agent Will Still Push;
else {
// Recv Pos Agent Pushed Undefine Action Id Msg;
QByteArray msgData = _sslSocket->read(outDataHead.length);
QByteArray msgData = ( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->read(outDataHead.length) : "" ;
QLOG_INFO() << "acceptTcpSvrSendMsg:: Recv PosAgnet Push Undefine ActionId Msg , Sequence: " << outDataHead.sequence << " Msg: " << msgData.data();
// Check Server Push Msg Is Valid
if ( checkRecvMsgValid(msgData, actionId, outOrderId, outErrorMsg) ) {
inputJsonObj.insert("iscontinue", 1);
......@@ -471,11 +520,11 @@ void SocketCommunicate::acceptTcpSvrSendMsg()
inputJsonObj.insert("orderId", outOrderId);
inputJsonObj.insert("statusCode", 0);
}
// Prepare Response Data For PosAgnet Request;
SocketCommuProcess::getByteFormatMsgResp(data, outDataHead.sequence, inputJsonObj);
QLOG_INFO() << "acceptTcpSvrSendMsg:: Prepare Response Data For PosAgnet Push Undefine Msg Type, Sequence: " << outDataHead.sequence
<< " MsgData: "<<data.toHex();
int len = _sslSocket->write(data);
QLOG_INFO() << "acceptTcpSvrSendMsg:: Prepare Response Data For PosAgnet Push Undefine Msg Type, Sequence: " << outDataHead.sequence << " MsgData: "<<data.toHex();
int len = ( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->write(data) : 0 ;
_isTimeout = true;
{
......@@ -489,11 +538,19 @@ void SocketCommunicate::acceptTcpSvrSendMsg()
}
QLOG_INFO() << "acceptTcpSvrSendMsg:: Socket Write Resp Undefine Msg Type Data, Sequence: " << outDataHead.sequence <<" Len: "<< len
<< ( _isTimeout ? " TimeOut" : " Success") ;
if ( _isTimeout ) {
if ( !_sslSocket || ( QAbstractSocket::ConnectedState != _sslSocket->state() ) ) {
QLOG_INFO() << "acceptTcpSvrSendMsg:: _sslSocket Is Null Or Not ConnectedState , Maybe Had Been Closed By Remote PosAgent Service";
break;
}
}
continue;
}
QLOG_ERROR() << "acceptTcpSvrSendMsg:: Not Support This Command Type, Sequence: " << outDataHead.sequence << " MsgType: "<< outDataHead.type;
_sslSocket->readAll();
( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->readAll() : "";
break; // Occur Once Undefine CMD_TYPE , Will Break Loop Recive Msg, Until threadStart() Retry Entry;
}
......@@ -590,21 +647,39 @@ bool SocketCommunicate::sendSocketHeart()
// <0.1> Long Time No Recv PosAgnet Push Socket Heart Beat Request, Then PosPlugin Will Send HeartBeat By Self.
QDateTime tmpCurDateTime = QDateTime::currentDateTime();
int seconds = tmpCurDateTime.secsTo(_socketHeartBeatDateTime);
if ( abs(seconds) < 60 ) {
if ( abs(seconds) < SOCKET_HEARTBEAT_INTERVAL ) {
QLOG_INFO() << "sendSocketHeart:: No Need Send HeartBeat By Plugin , currentDateTime(): "
<< tmpCurDateTime.toString("yyyy-MM-dd hh:mm:ss")<< " Seconds Diff From Server Send Heart Time: "<<abs(seconds);
return true;
}
// Test Remote Server Is Down , _sslSocket->isOpen() == true But _sslSocket->state() == UnconnectedState ;
QLOG_INFO() << "sendSocketHeart:: _sslSocket->state(3:ConnectedState): " << ( _sslSocket ? _sslSocket->state() : -1 )
<< " _sslSocket->errorString: " << ( _sslSocket ? _sslSocket->errorString() : "" )
<<" _sslSocket->isOpen: "<<( _sslSocket ? _sslSocket->isOpen() : -1 ) ;
if ( !_sslSocket || ( QAbstractSocket::ConnectedState !=_sslSocket->state() ) ) {
QLOG_INFO() << "sendSocketHeart:: Check Socket Before Write, _sslSocket Is Null Or Not ConnectedState , Maybe Had Been Closed By Remote PosAgent Service ";
if ( _sslSocket && _sslSocket->isOpen() ) {
QLOG_INFO() << "sendSocketHeart:: Check Socket Before Write, _sslSocket Is Open , But Not ConnectedState , Must disconnectFromHost ";
_sslSocket->disconnectFromHost();
}
_needTcpLogin = 1;
return false;
}
// <1> Prepare Send Heart Beat Request Data;
QByteArray sendHeartBeatReq;
SocketCommuProcess::getByteFormatHeartReq(sendHeartBeatReq);
// <2> Send Heart Beat Request;
QLOG_INFO() << "sendSocketHeart:: Send HeartBeat Request By Self QByteArray : " << sendHeartBeatReq.toHex();
_isTimeout = true;
int len = ( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->write(sendHeartBeatReq) : 0;
int len = _sslSocket->write(sendHeartBeatReq);
{
QEventLoop loop; QTimer timer;
connect(this, &SocketCommunicate::quit, &loop, &QEventLoop::quit);
......@@ -615,9 +690,9 @@ bool SocketCommunicate::sendSocketHeart()
}
// Send HeartBeat Success, Then Lambda Fuc Will Change Flag: _isTimeout = false;
if(_isTimeout) {
QLOG_ERROR() << "sendSocketHeart:: Send HeartBeat To PosAgnet Failed: "<< " len: "<< len << _sslSocket->errorString();
_sslSocket->disconnectFromHost();
if(_isTimeout || 0 == len) {
QLOG_ERROR() << "sendSocketHeart:: Send HeartBeat To PosAgnet Failed: "<< " len: "<< len << ( _sslSocket ? _sslSocket->errorString() : " _sslSocket Is Null " );
if ( _sslSocket ) _sslSocket->disconnectFromHost();
_needTcpLogin = 1;
return false;
} else {
......@@ -636,31 +711,27 @@ bool SocketCommunicate::sendSocketHeart()
}
// <2.1> Read HeartBeat Response Faild;
if(_isTimeout) {
QLOG_ERROR() << "sendSocketHeart:: Receive HeartBeat Response From PosAgnet Failed, TimeOut: " << _sslSocket->errorString();
_sslSocket->disconnectFromHost();
if ( _isTimeout ) {
QLOG_ERROR() << "sendSocketHeart:: Receive HeartBeat Response From PosAgnet Failed, TimeOut: " << ( _sslSocket ? _sslSocket->errorString() : " _sslSocket Is Null ");
if ( _sslSocket ) _sslSocket->disconnectFromHost();
_needTcpLogin = 1;
return false;
}
// <2.2> Read HeartBeat Response Success;
QByteArray headByteData = _sslSocket->read( sizeof(Data_Head) );
QByteArray headByteData = ( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->read( sizeof(Data_Head) ) : "" ;
Data_Head outDataHead = {0};
if ( !SocketCommuProcess::getHeadAllData( headByteData, outDataHead ) )
{
if ( CMD_RECV_HEARTBEAT_RESP != outDataHead.type) {
QLOG_ERROR() << "sendSocketHeart:: Receive HeartBeat Head Failed / Not HeartBeat Response ";
_sslSocket->readAll();
_sslSocket->disconnectFromHost();
_needTcpLogin = 1;
return false;
} else {
QLOG_INFO() << "sendSocketHeart:: Receive HeartBeat Response Head Successed ";
}
QLOG_ERROR() << "sendSocketHeart:: Receive HeartBeat Head Failed / Msg Too Short Or Msg Type Not Match";
( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->readAll() : "" ;
if ( _sslSocket ) _sslSocket->disconnectFromHost();
_needTcpLogin = 1;
return false;
}
// <2.3> Compare Recv HeartBeat Response Body;
QByteArray body = _sslSocket->read(outDataHead.length);
// <2.3> Compare Recv HeartBeat Response Body, Maybe Recv Other Normal Type Msg, Will Miss Msg;
QByteArray body = ( _sslSocket && ( QAbstractSocket::ConnectedState == _sslSocket->state() ) ) ? _sslSocket->read(outDataHead.length) : "" ;
QLOG_INFO() << "sendSocketHeart:: Receive HeartBeat Response From PosAgnet: " << body;
// <3> To be confirmed Something;
......@@ -719,17 +790,19 @@ bool SocketCommunicate::GetSvrIpPort()
}
void SocketCommunicate::onFlowControlLoginSuccess(bool fcLoginResult, bool fcOpenTcpFlag, QString &storeId, QString &posIp, int &posPluginPort) {
void SocketCommunicate::onFlowControlLoginSuccess(bool fcLoginResult, bool fcOpenTcpFlag, QString &storeId, QString &posIp, QString &posHostName, QString &posWorkStationNum ) {
// 只有 FlowControl Http 登录成功后, FlowControl 才会发生信号 过来(跨线程);
// 存在一定概率出现跨线程 发送信号 失败;
QLOG_INFO() << QString("SocketCommunicate::onFlowControlLoginSuccess:: fcLoginResult: %1, fcOpenTcpFlag: %2 , storeId: %3 , posIp: %4 , posPluginPort: %5")
.arg( fcLoginResult?1:0 ).arg( fcOpenTcpFlag?1:0 ).arg( storeId ).arg( posIp ).arg( posPluginPort );
QLOG_INFO() << QString("SocketCommunicate::onFlowControlLoginSuccess:: fcLoginResult: %1, fcOpenTcpFlag: %2 , storeId: %3 , posIp: %4 , posHostName: %5 , posWorkStationNum: %6")
.arg( fcLoginResult?1:0 ).arg( fcOpenTcpFlag?1:0 ).arg( storeId ).arg( posIp ).arg( posHostName ).arg( posWorkStationNum );
_httpLoginResult = fcLoginResult;
_openTcpChannel = fcOpenTcpFlag;
_storeId = storeId;
// _pcsPluginVersion = APP_VERSION;
_hostName = posHostName;
_workStationNum = posWorkStationNum;
_localIp = posIp;
_localPort = posPluginPort;
}
......@@ -747,28 +820,41 @@ void SocketCommunicate::threadStart()
QLOG_INFO() << QString("Waitting HttpLogin / openTcpChannel / GetSvrIpPort Failed, Wait 60 Seconds, _httpLoginResult:%1, _openTcpChannel:%2, _stopFlag:%3")
.arg( _httpLoginResult?1:0 ).arg(_openTcpChannel?1:0).arg(_stopFlag?1:0);
Sleep(60*1000);
FlowControl::GetInstance()._GetFcMajorInfo(_httpLoginResult, _openTcpChannel, _storeId, _localIp, _localPort);
FlowControl::GetInstance()._GetFcMajorInfo(_httpLoginResult, _openTcpChannel, _storeId, _localIp, _hostName, _workStationNum);
}
// <2> 向目标 IP + 端口发起长连接 与 登录请求, 登录成功后接受 Server Response Msg;
while(!_stopFlag && _reconnectTimes < 10 ) {
while ( !_stopFlag ) {
// Reconnet Pos Agent Server Socket Rate;
if ( _reconnectTimes < 5 ) {
Sleep( 1*60*1000 );
} else if ( _reconnectTimes < 20 ) {
Sleep( 5*60*1000 );
} else {
Sleep( 10*60*1000 );
}
do {
// <2.1> Connect Svr , Establish Connection;
if( !connectTcpSvr() ) {
networkOuttime(true);
QLOG_ERROR() << "threadStart:: connectTcpSvr Failed";
_reconnectTimes++;
break;
} else {
networkOuttime(false);
_reconnectTimes = 0;
QLOG_INFO() << "threadStart:: connectTcpSvr Success, Will Login Tcp PosAgent......";
}
// <2.2> Send Login Request;
if( !loginTcpSvr() ) {
QLOG_ERROR() << "threadStart:: loginTcpSvr Failed";
_reconnectTimes++;
break ;
} else {
_reconnectTimes = 0;
QLOG_INFO() << "threadStart:: loginTcpSvr Success, Will Accept Tcp Svr Send Msg...... _reconnectTimes: "<< _reconnectTimes;
}
......@@ -782,6 +868,9 @@ void SocketCommunicate::threadStart()
} while(0);
//网络异常断开重连, 释放资源 _sslSocket;
QLOG_INFO() << QString("threadStart:: _reconnectTimes = %1 ").arg( _reconnectTimes )<<", Check Socket Is Error, Will Close _ssSocket: "
<<_sslSocket <<" _sslSocket.isopen() = "<<_sslSocket->isOpen() <<" _sslSocket.state(3:ConnectedState) = "<<_sslSocket->state();
CLOSE_SOCKES(_sslSocket);
if(_stopFlag)
......
......@@ -8,6 +8,7 @@
#include <QVariantMap>
#include <QJsonDocument>
#include <QSslSocket>
#include <qabstractsocket.h>
#include <QApplication>
#include <QHostInfo>
#include <QThread>
......@@ -22,14 +23,17 @@
#include "alertForm.h"
#define CLOSE_SOCKES(socket) do{ \
if(socket != NULL && socket->isOpen()){ \
socket->close(); \
#define CLOSE_SOCKES(socket) do{ \
if ( socket != NULL ) { \
if ( socket->isOpen() ) \
socket->close(); \
\
delete socket; \
socket = NULL; \
} \
} while(0)
#define DATAHEAD_INIT(head, mgc, ver, seq, cmd, serize, len) do{ \
head.magic = mgc; \
head.version = ver; \
......@@ -127,7 +131,7 @@ public:
//Socket Thread Recv Msg Entry
void threadStart();
void onFlowControlLoginSuccess( bool fcLoginResult, bool fcOpenTcpFlag, QString &storeId, QString &posIp, int &posPluginPort );
void onFlowControlLoginSuccess( bool fcLoginResult, bool fcOpenTcpFlag, QString &storeId, QString &posIp, QString &posHostName, QString &posWorkStationNum );
signals:
void connected();
......@@ -151,6 +155,10 @@ public:
QString _storeId;
// Mac Address;
QString _macAddress;
// HostName;
QString _hostName;
// WorkStation Id POS工作站编号;
QString _workStationNum;
// Pos Local Machine IP;
QString _localIp;
// Pos Plugin Server Port;
......
......@@ -24,6 +24,7 @@
#include <DTools/pmsOrdersData.h>
#include <QHostInfo>
#include <DTools/qtRedisClient.h>
#include "SocketCommunicate.h"
FlowControl &FlowControl::GetInstance()
{
......@@ -163,8 +164,17 @@ bool FlowControl::_AppendOrderInfo2Redis(const OrderObject* orderObject) {
void FlowControl::_GetIpAddress()
{
/***已经验证:IP地址 优先取配置文件中的[IpAddress/ip];只有没有配置的情况才会根据主机名获取ipv4的IP地址,因此为保证IP的准确性,注释通过配置文件获取ip的代码***/
std::string tempMacAddress = "";
int getMacRet = MacTool::GetMacByAdaptersAddresses( tempMacAddress );
if ( !getMacRet) {
QLOG_ERROR() << "FlowControl::_GetIpAddress MacTool->GetMacByAdaptersAddresses Falied";
}
m_posMacAddress = tempMacAddress.c_str();
QString ipAddress;
QHostInfo info = QHostInfo::fromName(QHostInfo::localHostName());
m_posHostName = info.hostName();
foreach(QHostAddress address,info.addresses()) {
if(address.protocol() == QAbstractSocket::IPv4Protocol) {
QLOG_INFO()<<QString("[<<<<---FlowControl::_GetIpAddress getFromLocalHostName:%1--->>>>]").arg(address.toString());
......@@ -172,11 +182,13 @@ void FlowControl::_GetIpAddress()
if(address.toString().length()>7 && address.toString()!= "127.0.0.1" && !(address.toString().contains("192.168."))
&& !(address.toString().contains("10.0.75.1") ) && !(address.toString().contains("172.") ) ) {
ipAddress=address.toString();
QLOG_INFO()<<QString("[<<<<---FlowControl::_GetIpAddress Request Real IpAddress:%1--->>>>]").arg(address.toString());
QLOG_INFO()<<QString("[<<<<---FlowControl::_GetIpAddress Request Real IpAddress: %1 hostName: %2 macAddress: %3 --->>>>]")
.arg(ipAddress).arg(m_posHostName).arg(m_posMacAddress);
break;
}
}
}
m_ipAddress = ipAddress;
m_ipPortAddress = ipAddress+QString(":")+QString::number(ConfigManger::GetInstance().GetHttpServerPort());
}
......@@ -495,6 +507,7 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
orderObject->inAdvanceTakemeal = 0;
orderObject->globalServiceType = 0;
orderObject->globalOrderType = 0;
orderObject->isGiftitForward = 0 ;
orderObject->FromJson(jsonObject);
orderObject->pushOrderType=0;
......@@ -519,11 +532,12 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
m_FmOrdersMap.insert(orderObject->id, orderObject);
QLOG_INFO() << QString("[<<<<---FmTakeout Valid Orders Map:Insert New Order[ OrderId: %1 OrderDesc: %2 OrderStatus: %3 "
" MakeStatus: %4 oldArriverAhead: %5 NewArriverAhead: %6 ]--->>>>]")
" MakeStatus: %4 oldArriverAhead: %5 NewArriverAhead: %6 expectDate: %7 reserveMakeTime: %8 remindTicketTime: %9 ]--->>>>]")
.arg(orderObject->id).arg( orderObject->getOrderStatusDec() ).arg(orderObject->orderStatus)
.arg(orderObject->makeStatus).arg(pmsArriveAheadFlag).arg(orderObject->inAdvanceTakemeal);
.arg(orderObject->makeStatus).arg(pmsArriveAheadFlag).arg(orderObject->inAdvanceTakemeal)
.arg(orderObject->expectDate).arg(orderObject->reserveMakeTime).arg(orderObject->remindTicketTime);
if(!pmsOrderStatusIsExistRet || !pmsMakeStatusIsExistRet || (pmsArriveAheadFlag != orderObject->inAdvanceTakemeal) ) {
if ( !pmsOrderStatusIsExistRet || !pmsMakeStatusIsExistRet || ( pmsArriveAheadFlag != orderObject->inAdvanceTakemeal ) || ( 3 == orderObject->inAdvanceTakemeal ) ) {
//程序刚启动+量大+ 异步也无碍 顾无需加锁;
m_simValidOrdersList.append(orderObject->id);
}
......@@ -537,15 +551,18 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
int oldArriverAhead = orderObject->inAdvanceTakemeal;
orderObject->FromJson(jsonObject);
QLOG_INFO() << QString("[<<<<---FmTakeout Valid Order Map:Update orderId:%1 OldStatus:%2: curStatus:%3 "
"OldMakeStatus:%4: makeStatus:%5 OldArriverAhead:%6: ArriverAhead:%7 ]--->>>>]")
QLOG_INFO() << QString("[<<<<---FmTakeout Valid Order Map:Update orderId:%1 OldStatus:%2 curStatus:%3 "
"OldMakeStatus:%4 makeStatus:%5 OldArriverAhead:%6 NewArriverAhead:%7 expectDate: %8 reserveMakeTime: %9 remindTicketTime: %10 ]--->>>>]")
.arg(orderObject->id).arg(oldStatus).arg(orderObject->orderStatus)
.arg(oldMakeStatus).arg(orderObject->makeStatus).arg(oldArriverAhead).arg(orderObject->inAdvanceTakemeal);
.arg(oldMakeStatus).arg(orderObject->makeStatus).arg(oldArriverAhead).arg(orderObject->inAdvanceTakemeal)
.arg(orderObject->expectDate).arg(orderObject->reserveMakeTime).arg(orderObject->remindTicketTime);
// 如果订单状态 或 制作状态 或 预约单提前到店 出现变化都需添加到队列;
if(oldStatus != orderObject->orderStatus || oldMakeStatus != orderObject->makeStatus || oldArriverAhead != orderObject->inAdvanceTakemeal) {
if(oldStatus != orderObject->orderStatus || oldMakeStatus != orderObject->makeStatus
|| ( oldArriverAhead != orderObject->inAdvanceTakemeal ) || ( 3 == orderObject->inAdvanceTakemeal ) ) {
bRetOrderUpdateMutex =m_OrderUpdateMutex.tryLock(VALUE_TRYLOCKMEMTIMEOUT);
if(!bRetOrderUpdateMutex) {
QLOG_INFO() << QString("[<<<<---FmTakeout _OrderAnalysis:orderId:%1 OrderStatus:%2 MakeStatus:%3 ArriverAhead:%4 Change m_OrderUpdateMutex.tryLock Failed --->>>>]")
QLOG_INFO() << QString("[<<<<---FmTakeout _OrderAnalysis:orderId:%1 OrderStatus:%2 MakeStatus:%3 ArriverAhead:%4 Changed, But m_OrderUpdateMutex.tryLock Failed --->>>>]")
.arg(orderObject->id).arg(orderObject->orderStatus).arg(orderObject->makeStatus).arg(orderObject->inAdvanceTakemeal);
} else {
m_waitUpdateOrderList.append(orderObject->id);
......@@ -561,7 +578,7 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
emit startRemind(REMIND_REQREFUND_ORDER);
}
switch (orderObject->orderStatus){
switch (orderObject->orderStatus) {
case OrderObject::NewOrder:
break;
case OrderObject::Confirmed:
......@@ -609,12 +626,13 @@ bool FlowControl::_GetStoreInfo()
}
void FlowControl::_GetFcMajorInfo(bool &loginResult, bool &openTcpChannel, QString &storeId, QString &posIp, int &posPort){
void FlowControl::_GetFcMajorInfo(bool &loginResult, bool &openTcpChannel, QString &storeId, QString &posIp, QString &posHostName, QString &posWorkStationNum){
loginResult = m_bLoginResult;
openTcpChannel = m_openTcpChannel;
storeId = m_storeId;
posIp = m_ipAddress;
posPort = ConfigManger::GetInstance().GetHttpServerPort();
posHostName = m_posHostName;
posWorkStationNum = m_posWorkstationNum;
}
QString FlowControl::_GetCashierId()
......@@ -659,6 +677,12 @@ bool FlowControl::_Login()
sendJson = DataManger::GetInstance().GetLoginData(ConfigManger::GetInstance().GetPartnerId(),m_storeId,
m_password, m_posId, m_puginVersionComments,m_ipPortAddress,m_pmsMachineNo);
// 登录新增Pos相关属性字段;
sendJson.insert(JSON_POS_IP_ADDR, m_ipAddress);
sendJson.insert(JSON_POS_WORKS_NUM, m_posWorkstationNum);
sendJson.insert(JSON_POS_HOST_NAME, m_posHostName);
sendJson.insert(JSON_POS_MAC_ADDRESS, m_posMacAddress);
emit showAlert(AlertForm::LOADING, QString::fromLocal8Bit("正在登录......"));
QLOG_INFO() << QString("[<<<<---Login--->>>>][requestData:%1]")<<sendJson;
......@@ -742,8 +766,7 @@ bool FlowControl::_Login()
if ( m_bLoginResult && m_openTcpChannel ) {
QLOG_INFO() << QString("[<<<<---Login Success, Emit Signal To SocketCommunicate Begin Connect Tcp Socket --->>>>]");
int tmpPosPluginPort = ConfigManger::GetInstance().GetHttpServerPort();
emit doLoginSuccess(true, m_openTcpChannel, m_storeId, m_ipAddress, tmpPosPluginPort );
emit doLoginSuccess(true, m_openTcpChannel, m_storeId, m_ipAddress, m_posHostName, m_posWorkstationNum );
}
return result;
......@@ -930,6 +953,11 @@ bool FlowControl::_SendHeart()
m_puginVersionComments = ConfigManger::GetInstance().GetOrderServerUrl();
sendJson = DataManger::GetInstance().GetHeartData(m_password,m_posId,m_ipPortAddress,m_puginVersionComments,m_bLastHeartIsError,m_pmsMachineNo);
sendJson.insert(JSON_POS_IP_ADDR, m_ipAddress);
sendJson.insert(JSON_POS_WORKS_NUM, m_posWorkstationNum);
sendJson.insert(JSON_POS_HOST_NAME, m_posHostName);
sendJson.insert(JSON_POS_MAC_ADDRESS, m_posMacAddress);
QLOG_INFO() << QString("[<<<<---Send Heart--->>>>][requestData:%1]")<<sendJson;
QUrl TempQUrl = ConfigManger::GetInstance().GetLoginServerUrl()+
ConfigManger::GetInstance().GetInterfaceName(INI_INTERFACE_HEART);
......@@ -1442,7 +1470,11 @@ void FlowControl::_ReportOMSRecordOrderInfo()
sendJson.insert("storeId",RepOMSRecOrderIn->storeId);
sendJson.insert("remark",RepOMSRecOrderIn->remark);
sendJson.insert("checkNo",RepOMSRecOrderIn->checkNo);
sendJson.insert("ipAddress",m_ipAddress);
sendJson.insert(JSON_IP_ADDRESS, m_ipAddress);
sendJson.insert(JSON_POS_WORKS_NUM, m_posWorkstationNum);
sendJson.insert(JSON_POS_HOST_NAME, m_posHostName);
sendJson.insert(JSON_POS_MAC_ADDRESS, m_posMacAddress);
// sendJson.insert(JSON_POS_PLUGIN_VERSION, RepOMSRecOrderIn->posPluginVersion);
sendJson.insert(JSON_PMSMACHINENO,m_pmsMachineNo);
QString orderNoTemp = RepOMSRecOrderIn->orderNo;
......
......@@ -30,7 +30,7 @@ public:
* 参数: 1. 是否登录成功; 2.门店号; 3.PosPluginIp; 4.PosPlugin Port;
* 返回: Void;
* */
void _GetFcMajorInfo(bool &loginResult, bool &openTcpChannel, QString &storeId, QString &posIp, int &posPort);
void _GetFcMajorInfo(bool &loginResult, bool &openTcpChannel, QString &storeId, QString &posIp, QString &posHostName, QString &posWorkStationNum);
/* 功能:获取收银员ID
......@@ -100,6 +100,9 @@ private:
QString m_storeId;
QString m_ipAddress = ""; // 门店POS的 IP 地址
QString m_ipPortAddress; // 门店POS的 IP+端口 地址
QString m_posHostName; // Pos 主机名;
QString m_posMacAddress; // Pos Mac地址;
QString m_posWorkstationNum; // Pos 工作站编号
QString m_pmsMachineNo; // 标志PMS 系统插件程序所在机器编号
QString m_password;
QString m_puginVersionComments;
......@@ -180,7 +183,7 @@ signals:
// void doLogin();
// http门店POS登录成功后 发送信号给 SocketCommunicate;
void doLoginSuccess(bool loginResult,bool openTcpFlag, QString &storeId, QString &posIp, int &posPort);
void doLoginSuccess(bool loginResult,bool openTcpFlag, QString &storeId, QString &posIp, QString &posHostName, QString &posWorkStationNum);
/* 功能:隐藏通知窗口
......
......@@ -203,13 +203,14 @@ bool PmsOrdersData::insertOrderData(OrderObject* orderObj,QString& pmsOrderRef)
"address_detail, consignee_name ,first_name,last_name,consignee_phone, delivery_price,delivery_discount,delivery_time, order_estimation,make_finish_time,"
"is_package, last_pay_time, address_latitude, address_longitude, oms_msrno, consumer_birthday, cancel_reason, confirm_time,customer_id,customer_gender,"
"way_bill_id,store_id,store_name,store_address,store_street, pos_id, lang, ext_info, rider_phone, rider_name, "
"displateform_fee, make_status, make_source, make_device_id,reserve_type, appointed_time,appointed_remind_template,sub_store_id,global_order_type,global_service_type ) "
"displateform_fee, make_status, make_source, make_device_id,reserve_type, appointed_time,appointed_remind_template,sub_store_id, "
"global_order_type,global_service_type,platform_source ) "
"VALUES(?, ?, ?, ?, ?,?, ?, ?, ?, ?, "
"?, ?, ?, ?, ?, ?, ?, ?, ?, ?, "
"?, ?, ?, ?, ?, ?, ?, ?, ?, ?,"
"?, ?, ?, ?, ?, ?, ?, ?, ?, ?, "
"?, ?, ?, ?, ?, ?, ?, ?, ?, ?, "
"?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
"?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" );
query.addBindValue(orderObj->id); // --非码OMS订单号
query.addBindValue(orderObj->id); // --非码OMS订单号
......@@ -278,10 +279,14 @@ bool PmsOrdersData::insertOrderData(OrderObject* orderObj,QString& pmsOrderRef)
query.addBindValue(orderObj->makeSource); // --提供制作状态来源
query.addBindValue(orderObj->makeDeviceId); // --提供制作状态设备ID
// 与 oms协定此块业务出现 歧异 故在此处转换; 【与PMS协定: businessType 10 预约;20 WSG;30 拼团】
// 与 oms协定此块业务出现 歧异 故在此处转换; 【与PMS协定: businessType -> 10: 预约; 20: WSG-用星说: 21: WSG-美好咖啡; 30: 拼团】
int tempBusinessType = orderObj->businessType.toInt();
if ( "WSG-MOD" == orderObj->channel && "4" == orderObj->platformSource)
tempBusinessType = 20;
if ( "WSG-MOD" == orderObj->channel && "4" == orderObj->platformSource) {
if ( 1 == orderObj->isGiftitForward )
tempBusinessType = 21;
else
tempBusinessType = 20;
}
if ( 7 == orderObj->orderType || 11 == orderObj->orderType )
tempBusinessType = 10;
else if (8 == orderObj->orderType) {
......@@ -294,6 +299,7 @@ bool PmsOrdersData::insertOrderData(OrderObject* orderObj,QString& pmsOrderRef)
query.addBindValue(orderObj->subStoreId); // --母子门店的子门店编号;
query.addBindValue( orderObj->globalOrderType ); // --全链路订单类型
query.addBindValue( orderObj->globalServiceType); // --全链路服务类型
query.addBindValue( orderObj->platformSource); // --平台来源枚举值
if(!query.exec()) {
QLOG_ERROR()<<"[<<<<---PmsOrdersData::insertOrderData:Insert Order Error--->>>>]"<<query.lastError().text()
......@@ -307,10 +313,10 @@ bool PmsOrdersData::insertOrderData(OrderObject* orderObj,QString& pmsOrderRef)
"last_pay_time, address_latitude, address_longitude, oms_msrno, consumer_birthday, cancel_reason, "
"confirm_time,customer_id,customer_gender,way_bill_id,store_id,store_name,store_address,store_street, "
"pos_id, lang, ext_info, rider_phone, rider_name, displateform_fee, make_status, make_source, make_device_id,"
" reserve_type, appointed_time,appointed_remind_template,sub_store_id,global_order_type,global_service_type) "
" reserve_type, appointed_time,appointed_remind_template,sub_store_id,global_order_type,global_service_type,platform_source ) "
"VALUES(%1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19, %20, "
"%21, %22, %23, %24, %25, %26, %27, %28, %29, %30, %31, %32, %33, %34, %35, %36, %37, %38, %39, %40,"
"%41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54,%55,%56,%57,%58,%59,%60)")
"%41, %42, %43, %44, %45, %46, %47, %48, %49, %50, %51, %52, %53, %54,%55,%56,%57,%58,%59,%60,%61)")
.arg(orderObj->id).arg(orderObj->id).arg(orderObj->orderStatus).arg(updateTimeString).arg(orderObj->channel)
.arg(orderObj->orderType).arg(tempOrderTypeId)
.arg(orderObj->pickupCode).arg(orderObj->totalPrice * 0.01).arg(orderObj->productPrice * 0.01).arg(orderObj->orderDiscount * 0.01)
......@@ -325,7 +331,7 @@ bool PmsOrdersData::insertOrderData(OrderObject* orderObj,QString& pmsOrderRef)
.arg("").arg(orderObj->lang).arg(orderObj->memo).arg(orderObj->riderPhone).arg(orderObj->riderName)
.arg(orderObj->disPlateformFee * 0.01).arg(orderObj->makeStatus).arg(orderObj->makeSource).arg(orderObj->makeDeviceId)
.arg( tempBusinessType ).arg(orderObj->expectDate).arg( QString::number(orderObj->inAdvanceTakemeal) + ";" + orderObj->reserveMakeTime )
.arg(orderObj->subStoreId).arg(orderObj->globalOrderType).arg(orderObj->globalServiceType);
.arg(orderObj->subStoreId).arg(orderObj->globalOrderType).arg(orderObj->globalServiceType).arg(orderObj->platformSource);
} else {
QLOG_INFO()<<QString("[<<<<---PmsOrdersData::insertOrderData:Insert OrderId %1 Into PMS Order Success--->>>>]").arg(orderObj->id);
......@@ -441,7 +447,8 @@ bool PmsOrdersData::insertProductData(const QList<dishesObject*> proList, const
query.addBindValue(dishesObjectTemp->promotionSku); // --主商品优惠sku
query.addBindValue(dishesObjectTemp->packagePrice * 0.01); // --主商品打包价格
query.addBindValue(dishesObjectTemp->defaultImage); // --主商品默认图片
query.addBindValue(dishesObjectTemp->userName); // --主商品-Owner 拼单人;
// (默认主商品的拼单人 拆字) 拆口令分配的字 |#| 拼单人昵称 例:"世" |#| "Kernel(邹伍洋)" 分割符为: "|#|"
query.addBindValue(dishesObjectTemp->userName + ( dishesObjectTemp->wechatName.length() ? "|#|" + dishesObjectTemp->wechatName : "" ) ); // 拆字 + 微信昵称
if(!query.exec()) {
QLOG_ERROR()<<QString("[<<<<---PmsOrdersData::insertProductData:Insert OrderId %1 Product code:%2 Failed --->>>>]")
......@@ -455,7 +462,7 @@ bool PmsOrdersData::insertProductData(const QList<dishesObject*> proList, const
.arg("").arg(dishesObjectTemp->qty).arg(0).arg(dishesObjectTemp->specId).arg(dishesObjectTemp->specName)
.arg("").arg(dishesObjectTemp->price * 0.01).arg(dishesObjectTemp->promotionName).arg(dishesObjectTemp->promotionPrice * 0.01)
.arg(dishesObjectTemp->promotionQty).arg(dishesObjectTemp->promotionSku).arg(dishesObjectTemp->packagePrice * 0.01).arg("")
.arg(dishesObjectTemp->userName);
.arg(dishesObjectTemp->userName + ( dishesObjectTemp->wechatName.length() ? "|#|" + dishesObjectTemp->wechatName : "" ) );
} else {
ProInIdRef = query.lastInsertId().toString();
QLOG_INFO()<<QString("[<<<<---PmsOrdersData::insertOrderProductData:Insert OrderId %1 Product Success code:%2 increaseId:%3--->>>>]")
......@@ -742,6 +749,7 @@ bool PmsOrdersData::updateOrderStatus(OrderObject* orderObj, const int &OrderSta
// 需要对应转换并更新: order_type_id;
int tempOrderTypeId = convertPosServiceTypeId( orderObj, orderObj->orderStatus);
// 预约时间 & 街送小票时间 & 车牌号 & 隐私号 PCS 使用不到, 故没有进行更新.
query.prepare(QString("update orders set order_status=%1,order_type_id=%2, global_service_type=%3, global_order_type=%4, make_status='%5',"
" make_source='%6', make_device_id='%7', appointed_remind_template ='%8' where order_id='%9'")
.arg( QString::number(OrderStatus), QString::number(tempOrderTypeId), QString::number(orderObj->globalServiceType),
......
......@@ -33,6 +33,7 @@ class dishesObject : public QObject
Q_PROPERTY (int starPromotionPrice READ getStarPromotionPrice WRITE setStarPromotionPrice)
Q_PROPERTY (QString userName READ getUserName WRITE setUserName)
Q_PROPERTY (QString wechatName READ getWechatName WRITE setWechatName)
public:
explicit dishesObject(QObject *parent = 0):QObject(parent){}
......@@ -64,6 +65,7 @@ public:
int starPromotionQty = 0;
int starPromotionPrice = 0;
QString userName = "";
QString wechatName = "" ; // 拼单-微信昵称;
QList<dishesObject*> sub_products;
......@@ -139,6 +141,9 @@ protected:
inline QString getUserName(){ return userName; }
inline void setUserName(const QString& v){ userName = v; }
inline QString getWechatName(){ return wechatName; }
inline void setWechatName(const QString& v){ wechatName = v; }
};
#endif // DISHESOBJECT_H
......@@ -146,15 +146,18 @@ QString OrderObject::getChannelName()
}
}
}else if("WSG-MOD" == channel ){
if (7 == orderType ) {
return QString::fromLocal8Bit("预-WSG");
} else if ( 8 == orderType ) {
return QString::fromLocal8Bit("拼-WSG");
} else if ( "MT-MOD" == channel ) {
if ( 7 == orderType ) {
return QString::fromLocal8Bit("预-美团-当日");
} else if ( 11 == orderType ) {
return QString::fromLocal8Bit("预-美团-隔日");
} else {
return QString::fromLocal8Bit("微信用星说");
return QString::fromLocal8Bit("美团-MOD");
}
} else if("WSG-MOD" == channel ) { // 兼容渠道名称不统一问题
return QString::fromLocal8Bit("微信用星说");
}else if("ELE" == channel){
if ( 7 == orderType ) {
return QString::fromLocal8Bit("预-饿了么-当日");
......@@ -168,11 +171,17 @@ QString OrderObject::getChannelName()
if (4 == orderType ) {
return QString::fromLocal8Bit("星-自测");
} else if ( 7 == orderType ) {
if ( "8" == platformSource ) {
return QString::fromLocal8Bit("预-街送");
}
return QString::fromLocal8Bit("预-MOP-当日");
} else if ( 11 == orderType ) {
return QString::fromLocal8Bit("预-MOP-隔日");
} else if ( 8 == orderType ) {
return QString::fromLocal8Bit("拼-MOP");
} else if (10 == orderType) {
return QString::fromLocal8Bit("星时刻");
} else {
if ( "5" == platformSource ) {
return QString::fromLocal8Bit("口碑-MOP");
......@@ -181,6 +190,9 @@ QString OrderObject::getChannelName()
}
}
} else if ( "EC-MOP" == channel ){
return QString::fromLocal8Bit("电商MOP");
}else{
return QString::fromLocal8Bit("未知");
}
......
......@@ -97,6 +97,13 @@ class OrderObject : public QObject
Q_PROPERTY (QString subStoreId READ getSubStoreId WRITE setSubStoreId)
Q_PROPERTY (int globalServiceType READ getGlobalServiceType WRITE setGlobalServiceType)
Q_PROPERTY (int globalOrderType READ getGlobalOrderType WRITE setGlobalOrderType)
Q_PROPERTY (int isGiftitForward READ getIsGiftitForward WRITE setIsGiftitForward )
Q_PROPERTY (QString remindTicketTime READ getRemindTicketTime WRITE setRemindTicketTime )
Q_PROPERTY (QString carNumber READ getCarNumber WRITE setCarNumber)
Q_PROPERTY (QString privacyPhone READ getPrivacyPhone WRITE setPrivacyPhone)
public:
OrderObject(QObject *parent=0)
:QObject(parent){}
......@@ -171,7 +178,7 @@ public:
int orderIndex = 0;
int updateTime = 0;
QString customerSex = ""; //用户性别 1-男; 2-女
QString platformSource = ""; //订单平台来源:1 app; 2 ele; 3 ors; 4 WeChat; 5 口碑;
QString platformSource = ""; //订单平台来源:1 app; 2 ele; 3 ors; 4 WeChat; 5 口碑; 6:? 7:? 8:Curbside-高德
int needInvoice = 0;
int deliveryPrice = 0; // 配送费
int deliveryDiscount = 0; // 配送费折扣
......@@ -204,6 +211,11 @@ public:
int forwardPosStatus = 0; // 正向单入机状态: 0:未知 1: 成功 2:失败;
int negativePosStatus = 0; // 负向单同上;
int isGiftitForward; // 1: 美好咖啡 ; 0: 普通wsg;
QString remindTicketTime; // 提醒小票时间
QString carNumber; // 车牌号
QString privacyPhone; // 隐私号
int deliveryStatus = 0;
int payStatus = 0;
int refundStatus = 0;
......@@ -470,6 +482,19 @@ public:
inline int getGlobalOrderType()const{return globalOrderType;}
inline void setGlobalOrderType(const int& v){globalOrderType = v;}
inline int getIsGiftitForward()const{return isGiftitForward;}
inline void setIsGiftitForward(const int& v){isGiftitForward = v;}
inline QString getRemindTicketTime()const{return remindTicketTime;}
inline void setRemindTicketTime(const QString& v){remindTicketTime = v;}
inline QString getCarNumber()const{return carNumber;}
inline void setCarNumber(const QString& v){carNumber = v;}
inline QString getPrivacyPhone()const{return privacyPhone;}
inline void setPrivacyPhone(const QString& v){privacyPhone = v;}
};
#endif // ORDEROBJECT_H
......@@ -99,8 +99,8 @@ public:
QLOG_ERROR()<<QString("RSASignWithSHA1 GetPEMKey() Failed");
return 0;
}
QLOG_INFO()<<"RSASignWithSHA1 GetPEMFormatKey(): "<< tmpPrivateKey<< "\n";
QLOG_INFO()<<"RSASignWithSHA1 GetPEMFormatKey(), End ------------------------ ";
// QLOG_INFO()<<"RSASignWithSHA1 GetPEMFormatKey(): "<< tmpPrivateKey<< "\n";
QLOG_INFO()<<"RSASignWithSHA1 GetPEMFormatKey(), Finished ------------------------ ";
OpenSSL_add_all_algorithms();
......@@ -351,7 +351,7 @@ public:
}
QLOG_INFO()<< " AESDecode debase64() Success inLen: "<< inLen << " tmpRstLen: " << strlen( (char *)tmpRst ) << " outMaxlen: "<<outMaxlen
<< " base64Length: " <<base64Length << " inBytes: "<<QString(QLatin1String( (char *)inBytes))
<<" tmpRst (Hex): "<< QByteArray( (char *)tmpRst ).toHex()<<" tmpRst (Base64): "<< QByteArray( (char *)tmpRst ).toBase64();
<<" tmpRst (Hex): "<< QByteArray( (char *)tmpRst ).toHex(); // <<" tmpRst (Base64): "<< QByteArray( (char *)tmpRst ).toBase64();
// 初始化......
EVP_CIPHER_CTX ctx;
......@@ -374,7 +374,7 @@ public:
QLOG_ERROR()<< " AESDecode EVP_DecryptUpdate() Failed , iOutLen: "<<iOutLen << " base64Length: "<< base64Length;
return 0;
}
QLOG_INFO()<< " AESDecode EVP_DecryptUpdate() Success " << " iOutLen: " << iOutLen<<" outBytes: "<<QString(QLatin1String( (char *)outBytes));
QLOG_INFO()<< " AESDecode EVP_DecryptUpdate() Success " << " iOutLen: " << iOutLen; // <<" outBytes: "<<QString(QLatin1String( (char *)outBytes));
// 完成解密......
if(!EVP_DecryptFinal_ex(&ctx, (unsigned char *)(outBytes + iOutLen), &tmpDecryptLen))
......@@ -385,7 +385,7 @@ public:
return 0;
}
QLOG_INFO()<< " AESDecode EVP_DecryptFinal_ex() Success outBytes+iOutLen: "<< QString( (char*)(outBytes+iOutLen) )
<< " tmpDecryptLen: " << tmpDecryptLen << " outBytes: " <<QString(QLatin1String( (char *)outBytes));
<< " tmpDecryptLen: " << tmpDecryptLen; // << " outBytes: " <<QString(QLatin1String( (char *)outBytes));
EVP_CIPHER_CTX_cleanup(&ctx);
......
......@@ -23,7 +23,10 @@ DetailForm::DetailForm(QWidget *parent) :
DetailForm::~DetailForm()
{
QLOG_INFO() << QString("[<<<<---DetailForm::~DetailForm: begin--->>>>]");
delete ui;
// New 时指定了父类对象指针;
QLOG_INFO() << QString("[<<<<---DetailForm::~DetailForm: end--->>>>]");
}
void DetailForm::InitData(OrderObject *orderObject)
......@@ -47,6 +50,7 @@ void DetailForm::InitData(OrderObject *orderObject)
//订单完成后,送达时间需要更新为 finishTime
QString deliveryFinishTime = "";
if (OrderObject::Finished == orderObject->orderStatus) {
deliveryFinishTime = (orderObject->finishTime.isEmpty() || 0==orderObject->finishTime.length() )? QString::fromLocal8Bit("已经送达") : orderObject->finishTime;
} else if (OrderObject::Refunded == orderObject->orderStatus) {
......@@ -54,9 +58,11 @@ void DetailForm::InitData(OrderObject *orderObject)
} else {
deliveryFinishTime = orderObject->deliveryTime;
}
if (7 == orderObject->orderType || 11 == orderObject->orderType ) {
deliveryFinishTime = deliveryFinishTime + QString::fromLocal8Bit("预约时间: ") + orderObject->expectDate;
deliveryFinishTime = deliveryFinishTime + QString::fromLocal8Bit(" 预约时间: ") + orderObject->expectDate;
}
ui->detailLab2->setText(deliveryFinishTime);
QLOG_INFO() << QString("[<<<<---DetailForm::InitData ui->detailLab2->setText --->>>>]");
......@@ -257,6 +263,11 @@ void DetailForm::InitData(OrderObject *orderObject)
ui->detailBtn2->hide();
}
//星巴克:电商-MOP 需要显示退单按钮(便于 当日退 / 跨日退);
if ( "EC-MOP" == orderObject->channel && OrderObject::Refunded != orderObject->orderStatus ) {
ui->detailBtn2->show();
}
//订单入机失败 [销售单 / 退货单] 需要显示 重新录单 按钮 方便店员再次触发录单;
if(OrderObject::SimExceptSale == orderObject->orderStatus || OrderObject::SimExceptRefund == orderObject->orderStatus) {
ui->detailBtn0->show();
......
......@@ -7,8 +7,8 @@ IDI_ICON ICON DISCARDABLE "logo.ico"
#endif
VS_VERSION_INFO VERSIONINFO
//***每次修改后编译发版必须变更版本号(preDefine.h中APP_VERSION 需要一致)***//
FILEVERSION 4,2021,9,7
PRODUCTVERSION 4,2021,9,7
FILEVERSION 4,2021,12,10
PRODUCTVERSION 4,2021,12,10
//*************************************************************************//
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
......@@ -31,8 +31,8 @@ VS_VERSION_INFO VERSIONINFO
VALUE "OriginalFilename", "PmsPlugin.exe"
VALUE "ProductName", "PMS Plugin"
//***每次修改后编译发版必须变更版本号(preDefine.h中APP_VERSION 需要一致)***//
VALUE "ProductVersion", "4.2021.9.7"
VALUE "FileVersion", "4.2021.9.7"
VALUE "ProductVersion", "4.2021.12.10"
VALUE "FileVersion", "4.2021.12.10"
//*************************************************************************//
END
END
......
......@@ -223,7 +223,8 @@ void MainForm::on_mainBtnHide_clicked()
hide();
ui->mainEdtSearch->clear();
m_padForm->hide();
if(m_detailForm){
if(m_detailForm && m_detailForm->isVisible() ) {
QLOG_INFO() << QString("[<<<<---MainForm::on_mainBtnHide_clicked: m_detailForm=--->>>>]")<< m_detailForm;
m_detailForm->hide();
}
emit showFloatForm();
......
......@@ -15,7 +15,7 @@
//#define APP_VERSION "4.2020.8.10"
//#define APP_VERSION "4.2021.1.8"
//#define APP_VERSION "4.2021.5.10"
#define APP_VERSION "4.2021.9.7"
#define APP_VERSION "4.2021.12.10"
//修正版本号时,切记修正 FmTakeout.rc 中的版本号
#define SERVER_PASSWORD "posoperator@freemud.cn"
......@@ -71,12 +71,17 @@
#define JSON_MOPSTORESTS "mopStoreStatus"
#define JSON_PASSWORD "password"
#define JSON_IPADDRESS "iPAddress"
#define JSON_IP_ADDRESS "ipAddress"
#define JSON_MACHINECODE "machineCode"
#define JSON_PMSMACHINENO "pmsMachineNo"
#define JSON_PARTNERID "partnerId"
#define JSON_ORGCODE "orgCode"
#define JSON_POSNO "posNo"
#define JSON_POS_IP_ADDR "posIp"
#define JSON_POS_WORKS_NUM "decouplePosNo"
#define JSON_POS_HOST_NAME "posHostName"
#define JSON_POS_MAC_ADDRESS "posMacAddress"
#define JSON_STORENAME "StoreName"
#define JSON_OPEN_TCP_CHANNEL "openTcpChannel"
#define JSON_USERID "userId"
......@@ -152,6 +157,8 @@
#define JSON_TCP_STA_RST "ok"
#define JSON_TCP_STA_CODE "code"
#define JSON_TCP_DEVICE_ID "deviceId"
#define JSON_TCP_DEVICE_HOST_NAME "deviceHostName"
#define JSON_TCP_DEVICE_WORKS_NUM "deviceWorkStationNum"
#define JSON_TCP_DEVICE_IP "deviceIp"
#define JSON_TCP_DEVICE_PORT "devicePort"
#define JSON_TCP_DEVICE_TYPE "deviceType"
......@@ -163,6 +170,8 @@
#define SOCKET_POST_TIMEOUT 30000
// 长连接Get请求超时 设置为 10s
#define SOCKET_GET_TIMEOUT 10000
// 长连接 向 POS Agent Server 发送心跳时间间隔(单位: 秒);
#define SOCKET_HEARTBEAT_INTERVAL 80
// ssl证书相关宏;
#define DES3_KEY_SIZE 24
......
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