Commit a2f3213e by NitefullWind

1. 直接向OLTP的服务器发起HTTP请求,不使用OLTP的dll。

parent 0ba5bc93
...@@ -26,10 +26,9 @@ FMNetWork::FMNetWork(QObject *parent) : QObject(parent) ...@@ -26,10 +26,9 @@ FMNetWork::FMNetWork(QObject *parent) : QObject(parent)
bool FMNetWork::HttpPost(QString url, QByteArray &outdata, const QByteArray &indata, QString content, QString accept, QString &error, int timeout) bool FMNetWork::HttpPost(QString url, QByteArray &outdata, const QByteArray &indata, QString content, QString accept, QString &error, int timeout)
{ {
QString path; FMPSettings setting;
ToolS::GetPath(path); QString host = setting.GetValue(VALUE_HOST, "").toString();
QString action = setting.GetValue(CONFIG_OLTP_ACTION, "FromPOS").toString();
QString host = QSettings(path + "\\" + USERCONFIG_NAME, QSettings::IniFormat).value(VALUE_HOST).toString();
QEventLoop loop; QEventLoop loop;
QTimer timer; QTimer timer;
...@@ -46,6 +45,7 @@ bool FMNetWork::HttpPost(QString url, QByteArray &outdata, const QByteArray &ind ...@@ -46,6 +45,7 @@ bool FMNetWork::HttpPost(QString url, QByteArray &outdata, const QByteArray &ind
request.setRawHeader("Accept", accept.toUtf8()); request.setRawHeader("Accept", accept.toUtf8());
request.setRawHeader("Host", host.toUtf8()); request.setRawHeader("Host", host.toUtf8());
request.setRawHeader("Authorization", "Basic dXBzLWNsaWVudDo2VGk4TjBXNzRyb1A="); request.setRawHeader("Authorization", "Basic dXBzLWNsaWVudDo2VGk4TjBXNzRyb1A=");
request.setRawHeader("SOAPAction", action.toUtf8());
QNetworkReply* reply = manger.post(request, indata); QNetworkReply* reply = manger.post(request, indata);
...@@ -83,6 +83,7 @@ QByteArray FMNetWork::CreateOLTPXML(const QJsonObject &json) ...@@ -83,6 +83,7 @@ QByteArray FMNetWork::CreateOLTPXML(const QJsonObject &json)
{ {
FMPSettings setting; FMPSettings setting;
QString reqXmlStr = QString::fromLocal8Bit("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" QString reqXmlStr = QString::fromLocal8Bit("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
"<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"><SOAP-ENV:Body>"
"<ns0:OLTP xmlns:ns0=\"http://spcc.com.cn/online\">" "<ns0:OLTP xmlns:ns0=\"http://spcc.com.cn/online\">"
"<ns0:HEADER>" "<ns0:HEADER>"
"<ns0:VER>%1</ns0:VER>" "<ns0:VER>%1</ns0:VER>"
...@@ -98,7 +99,8 @@ QByteArray FMNetWork::CreateOLTPXML(const QJsonObject &json) ...@@ -98,7 +99,8 @@ QByteArray FMNetWork::CreateOLTPXML(const QJsonObject &json)
"<ns0:AP>" "<ns0:AP>"
"%9" "%9"
"</ns0:AP>" "</ns0:AP>"
"</ns0:OLTP>"); "</ns0:OLTP>"
"</SOAP-ENV:Body></SOAP-ENV:Envelope>");
QString nsTo = "CS00400004"; QString nsTo = "CS00400004";
int type = FMTool::GetJsonValue(json, JSON_KEY_REQTYPE).toInt(sign); int type = FMTool::GetJsonValue(json, JSON_KEY_REQTYPE).toInt(sign);
if(type==sign) { if(type==sign) {
...@@ -129,115 +131,62 @@ QByteArray FMNetWork::CreateOLTPXML(const QJsonObject &json) ...@@ -129,115 +131,62 @@ QByteArray FMNetWork::CreateOLTPXML(const QJsonObject &json)
bool FMNetWork::RequestToOLTP(const QJsonObject &json, QByteArray &outdata, QString &error, int timeout) bool FMNetWork::RequestToOLTP(const QJsonObject &json, QByteArray &outdata, QString &error, int timeout)
{ {
FMPSettings setting;
char mod[MAX_PATH] = { 0 }; char mod[MAX_PATH] = { 0 };
ToolS::GetProcPath(mod); ToolS::GetProcPath(mod);
QLibrary lib(QString(mod) + "\\" + "SBKAPIWrapper.dll"); QByteArray reqXmlData = FMNetWork::CreateOLTPXML(json);
QLOG_INFO() << QString(mod) + "\\" + "SBKAPIWrapper.dll";
if(lib.load())
{
SKBAPISend skbSend = (SKBAPISend)lib.resolve("Send");
if(skbSend != NULL)
{
QEventLoop loop;
QFuture<QByteArray> future = QtConcurrent::run( [&loop, json, &error, skbSend, &setting]() ->QByteArray
{
QByteArray reqXmlData = FMNetWork::CreateOLTPXML(json);
char in[MAX_BUF_LEN] = {0};
char out[MAX_BUF_LEN] = {0};
char *guid = "";
char errMsg[MAX_BUF_LEN] = {0};
QByteArray mode = setting.GetValue(CONFIG_OLTP_MODE_BATCH, "BATCH").toByteArray();
QByteArray operation = setting.GetValue(CONFIG_OLTP_OPERATION_BATCH, "FM").toByteArray();
strcpy(in, reqXmlData.data());
QLOG_INFO() << "Request StarbucksAPI XML data: " << in << "mode: " << mode << "Operation: " << operation;
#ifdef MOCK #ifdef MOCK
QLOG_DEBUG() << "=========================================== Read debug data. ========================================"; QLOG_DEBUG() << "=========================================== Read debug data. ========================================";
int type = FMTool::GetJsonValue(json, JSON_KEY_REQTYPE).toInt(sign); int type = FMTool::GetJsonValue(json, JSON_KEY_REQTYPE).toInt(sign);
QLOG_DEBUG() << "Test req type: " << type; QLOG_DEBUG() << "Test req type: " << type;
QFile f(qApp->applicationDirPath()+QString("/test_spcc/%1.txt").arg(type)); QFile f(qApp->applicationDirPath()+QString("/test_spcc/%1.txt").arg(type));
f.open(QIODevice::ReadOnly); f.open(QIODevice::ReadOnly);
strcpy(out, f.readAll().data()); strcpy(out, f.readAll().data());
// Sleep(1000*10); Sleep(1000*3);
QLOG_DEBUG() << "=========================================== End read debug data. ===================================="; QLOG_DEBUG() << "=========================================== End read debug data. ====================================";
int result = 0; int result = 0;
#else #else
int result = skbSend(in, guid, out, errMsg, mode.data(), operation.data());
FMPSettings setting;
QString url = setting.GetValue(CONFIG_OLTP_URL, "http://172.170.4.207:8080/OLTP/WSPortal").toString();
QString uuid = QUuid::createUuid().toString();
bool httpIsOk = FMNetWork::HttpPost(url, outdata, reqXmlData, "application/soap+xml; charset=utf-8", uuid, error, timeout);
#endif //! End def MOCK #endif //! End def MOCK
QLOG_DEBUG() << "StarbucksAPI return to GBK: " << QString::fromLocal8Bit(out); QString outXMlString = QString::fromUtf8(outdata);
QString outXMlString = QString::fromLocal8Bit(out); if(!httpIsOk) {
error = "OLTP return error: \n" +error;
QLOG_INFO() << "OLTP return: " << result << " data: " << outXMlString; QLOG_ERROR() << error;
return false;
if(result!=0) { } else {
error = "OLTP return error: \n" + QString::fromLocal8Bit(errMsg); QString statcode;
QLOG_ERROR() << error; bool isOk = FMTool::SearchXMLNodeString(outXMlString, "ns0:STATCODE", statcode);
return QByteArray(); if(!isOk) {
} else { error = "Can't find xml node: ns0:STATCODE";
QString statcode; QLOG_ERROR() << error;
bool isOk = FMTool::SearchXMLNodeString(outXMlString, "ns0:STATCODE", statcode); return false;
if(!isOk) {
error = "Can't find xml node: ns0:STATCODE";
QLOG_ERROR() << error;
return QByteArray();
}
if(statcode.compare("0000")!=0) {
error = "OLTP return STATCODE is: " + statcode;
QLOG_ERROR() << error;
return QByteArray();
}
QString returnStr;
isOk = FMTool::SearchXMLNodeString(outXMlString, "ns0:AP", returnStr);
if(!isOk) {
error = "Can't find xml node: ns0:AP";
QLOG_ERROR() << error;
return QByteArray();
}
return returnStr.toUtf8();
}
return QByteArray(out);
});
QFutureWatcher<QByteArray> watcher;
watcher.setFuture(future);
QTimer timer;
timer.setSingleShot(true);
connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit()));
timer.start(timeout*1000);
loop.exec();
outdata = watcher.result();
bool isEmpty = outdata.isNull() && outdata.isEmpty();
return !isEmpty;
} }
else if(statcode.compare("0000")!=0) {
{ error = "OLTP return STATCODE is: " + statcode;
QLOG_ERROR() << "get function (Send) failed"; QLOG_ERROR() << error;
error = QString::fromLocal8Bit("加载基础组件(fun)失败"); return false;
} }
} QString returnStr;
else isOk = FMTool::SearchXMLNodeString(outXMlString, "ns0:AP", returnStr);
{ if(!isOk) {
QLOG_ERROR() << "load dll failed"; error = "Can't find xml node: ns0:AP";
error = QString::fromLocal8Bit("加载基础组件(dll)失败"); QLOG_ERROR() << error;
} return false;
}
outdata = returnStr.toUtf8();
return true;
}
return false; return false;
} }
...@@ -116,8 +116,6 @@ void RollBack::run() ...@@ -116,8 +116,6 @@ void RollBack::run()
{ {
QSqlQuery query(_db); QSqlQuery query(_db);
QLOG_WARN() << "find sql : " << "select * from orderlist";
bool flag = query.exec("select * from orderlist"); bool flag = query.exec("select * from orderlist");
if(!flag) if(!flag)
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include "DataProcess/tools.h" #include "DataProcess/tools.h"
#include "DataProcess/cretopt.h" #include "DataProcess/cretopt.h"
#include "DataProcess/fmnetwork.h" #include "DataProcess/fmnetwork.h"
#include <QUuid>
EXTERN_C IMAGE_DOS_HEADER __ImageBase; EXTERN_C IMAGE_DOS_HEADER __ImageBase;
...@@ -187,7 +188,8 @@ bool Control::SendMessageToServer(const QJsonObject &json, QByteArray &outdata, ...@@ -187,7 +188,8 @@ bool Control::SendMessageToServer(const QJsonObject &json, QByteArray &outdata,
bool isOk = false; bool isOk = false;
if(_posType==SPCC) { if(_posType==SPCC) {
isOk = SendMessageToSBKAPI(tmpjson, outdata, error, 60); int timeout = _setting.GetValue(CONFIG_OLTP_TIMEOUT, 60).toInt();
isOk = SendMessageToSBKAPI(tmpjson, outdata, error, timeout);
} else { } else {
isOk = SendMessageToPayMent(tmpjson, outdata, error); isOk = SendMessageToPayMent(tmpjson, outdata, error);
} }
...@@ -265,10 +267,8 @@ bool Control::SendMessageToPayMent(const QJsonObject &json, QByteArray &outdata, ...@@ -265,10 +267,8 @@ bool Control::SendMessageToPayMent(const QJsonObject &json, QByteArray &outdata,
bool Control::HttpPost(QString url, QByteArray &outdata, const QByteArray &indata, QString content, QString accept, QString &error, int timeout) bool Control::HttpPost(QString url, QByteArray &outdata, const QByteArray &indata, QString content, QString accept, QString &error, int timeout)
{ {
QString path; QString host = _setting.GetValue(VALUE_HOST, "").toString();
ToolS::GetPath(path); QString action = _setting.GetValue(CONFIG_OLTP_ACTION, "FromPOS").toString();
QString host = QSettings(path + "\\" + USERCONFIG_NAME, QSettings::IniFormat).value(VALUE_HOST).toString();
QEventLoop loop; QEventLoop loop;
QTimer timer; QTimer timer;
...@@ -285,6 +285,7 @@ bool Control::HttpPost(QString url, QByteArray &outdata, const QByteArray &indat ...@@ -285,6 +285,7 @@ bool Control::HttpPost(QString url, QByteArray &outdata, const QByteArray &indat
request.setRawHeader("Accept", accept.toUtf8()); request.setRawHeader("Accept", accept.toUtf8());
request.setRawHeader("Host", host.toUtf8()); request.setRawHeader("Host", host.toUtf8());
request.setRawHeader("Authorization", "Basic dXBzLWNsaWVudDo2VGk4TjBXNzRyb1A="); request.setRawHeader("Authorization", "Basic dXBzLWNsaWVudDo2VGk4TjBXNzRyb1A=");
request.setRawHeader("SOAPAction", action.toUtf8());
QNetworkReply* reply = manger.post(request, indata); QNetworkReply* reply = manger.post(request, indata);
...@@ -331,10 +332,8 @@ bool Control::HttpPost(QString url, QByteArray &outdata, const QByteArray &indat ...@@ -331,10 +332,8 @@ bool Control::HttpPost(QString url, QByteArray &outdata, const QByteArray &indat
bool Control::RollHttpPost(QString url, QByteArray &outdata, const QByteArray &indata, QString content, QString accept, QString &error, int timeout) bool Control::RollHttpPost(QString url, QByteArray &outdata, const QByteArray &indata, QString content, QString accept, QString &error, int timeout)
{ {
QString path; QString host = _setting.GetValue(VALUE_HOST, "").toString();
ToolS::GetPath(path); QString action = _setting.GetValue(CONFIG_OLTP_ACTION, "FromPOS").toString();
QString host = QSettings(path + "\\" + USERCONFIG_NAME, QSettings::IniFormat).value(VALUE_HOST).toString();
QEventLoop loop; QEventLoop loop;
QTimer timer; QTimer timer;
...@@ -351,7 +350,7 @@ bool Control::RollHttpPost(QString url, QByteArray &outdata, const QByteArray &i ...@@ -351,7 +350,7 @@ bool Control::RollHttpPost(QString url, QByteArray &outdata, const QByteArray &i
request.setRawHeader("Accept", accept.toUtf8()); request.setRawHeader("Accept", accept.toUtf8());
request.setRawHeader("Host", host.toUtf8()); request.setRawHeader("Host", host.toUtf8());
request.setRawHeader("Authorization", "Basic dXBzLWNsaWVudDo2VGk4TjBXNzRyb1A="); request.setRawHeader("Authorization", "Basic dXBzLWNsaWVudDo2VGk4TjBXNzRyb1A=");
request.setRawHeader("SOAPAction", action.toUtf8());
QNetworkReply* reply = manger.post(request, indata); QNetworkReply* reply = manger.post(request, indata);
...@@ -388,128 +387,62 @@ bool Control::RollHttpPost(QString url, QByteArray &outdata, const QByteArray &i ...@@ -388,128 +387,62 @@ bool Control::RollHttpPost(QString url, QByteArray &outdata, const QByteArray &i
bool Control::SendMessageToSBKAPI(const QJsonObject &json, QByteArray &outdata, QString &error, int timeout, bool isReversal) bool Control::SendMessageToSBKAPI(const QJsonObject &json, QByteArray &outdata, QString &error, int timeout, bool isReversal)
{ {
QByteArray reqXmlData = FMNetWork::CreateOLTPXML(json);
char mod[MAX_PATH] = { 0 };
ToolS::GetProcPath(mod);
QLibrary lib(QString(mod) + "\\" + "SBKAPIWrapper.dll");
QLOG_INFO() << QString(mod) + "\\" + "SBKAPIWrapper.dll";
if(lib.load())
{
SKBAPISend skbSend = (SKBAPISend)lib.resolve("Send");
QSharedPointer<QString> tempError(new QString());
if(skbSend != NULL)
{
QEventLoop loop;
QFuture<QByteArray> future = QtConcurrent::run( [ this, json, tempError, skbSend]() ->QByteArray
{
QByteArray reqXmlData = FMNetWork::CreateOLTPXML(json);
char in[MAX_BUF_LEN] = {0};
char out[MAX_BUF_LEN] = {0};
char *guid = "";
char errMsg[MAX_BUF_LEN] = {0};
QByteArray mode = _setting.GetValue(CONFIG_OLTP_MODE, "FM").toByteArray();
QByteArray operation = _setting.GetValue(CONFIG_OLTP_OPERATION, "FM").toByteArray();
strcpy(in, reqXmlData.data());
QLOG_INFO() << "Request StarbucksAPI XML data: " << in << "mode: " << mode << "Operation: " << operation;
#ifdef MOCK #ifdef MOCK
QLOG_DEBUG() << "=========================================== Read debug data. ========================================"; QLOG_DEBUG() << "=========================================== Read debug data. ========================================";
int type = FMTool::GetJsonValue(json, JSON_KEY_REQTYPE).toInt(sign); int type = FMTool::GetJsonValue(json, JSON_KEY_REQTYPE).toInt(sign);
QLOG_DEBUG() << "Test req type: " << type; QLOG_DEBUG() << "Test req type: " << type;
QFile f(qApp->applicationDirPath()+QString("/test_spcc/%1.txt").arg(type)); QFile f(qApp->applicationDirPath()+QString("/test_spcc/%1.txt").arg(type));
f.open(QIODevice::ReadOnly); f.open(QIODevice::ReadOnly);
strcpy(out, f.readAll().data()); strcpy(out, f.readAll().data());
Sleep(1000*3); Sleep(1000*3);
QLOG_DEBUG() << "=========================================== End read debug data. ===================================="; QLOG_DEBUG() << "=========================================== End read debug data. ====================================";
int result = 0; int result = 0;
#else #else
int result = skbSend(in, guid, out, errMsg, mode.data(), operation.data());
#endif //! End def MOCK
QString outXMlString = QString::fromLocal8Bit(out);
QLOG_INFO() << "OLTP return: " << result << " data: " << outXMlString;
if(result!=0) {
tempError->append("OLTP return error: \n" + QString::fromLocal8Bit(errMsg));
QLOG_ERROR() << tempError;
return QByteArray();
} else {
QString statcode;
bool isOk = FMTool::SearchXMLNodeString(outXMlString, "ns0:STATCODE", statcode);
if(!isOk) {
tempError->append("Can't find xml node: ns0:STATCODE");
QLOG_ERROR() << tempError;
return QByteArray();
}
if(statcode.compare("0000")!=0) {
tempError->append("OLTP return STATCODE is: " + statcode);
QLOG_ERROR() << tempError;
return QByteArray();
}
QString returnStr;
isOk = FMTool::SearchXMLNodeString(outXMlString, "ns0:AP", returnStr);
if(!isOk) {
tempError->append("Can't find xml node: ns0:AP");
QLOG_ERROR() << tempError;
return QByteArray();
}
return returnStr.toUtf8();
}
return QByteArray(out);
});
QFutureWatcher<QByteArray> watcher; QString url = _setting.GetValue(CONFIG_OLTP_URL, "http://172.170.4.207:8080/OLTP/WSPortal").toString();
watcher.setFuture(future); QString uuid = QUuid::createUuid().toString();
bool httpIsOk = false;
QTimer timer; if(isReversal) {
timer.setSingleShot(true); httpIsOk = RollHttpPost(url, outdata, reqXmlData, "application/soap+xml; charset=utf-8", uuid, error, timeout);
connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); } else {
connect(_widget, SIGNAL(Interrupt()), &loop, SLOT(quit())); httpIsOk = HttpPost(url, outdata, reqXmlData, "application/soap+xml; charset=utf-8", uuid, error, timeout);
connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit())); }
timer.start(timeout*1000); #endif //! End def MOCK
loop.exec(); QString outXMlString = QString::fromUtf8(outdata);
error = *(tempError.data()); if(!httpIsOk) {
error = "OLTP return error: \n" +error;
QLOG_ERROR() << error;
return false;
} else {
QString statcode;
bool isOk = FMTool::SearchXMLNodeString(outXMlString, "ns0:STATCODE", statcode);
if(!isOk) {
error = "Can't find xml node: ns0:STATCODE";
QLOG_ERROR() << error;
return false;
}
if(statcode.compare("0000")!=0) {
error = "OLTP return STATCODE is: " + statcode;
QLOG_ERROR() << error;
return false;
}
if(!isReversal && _isinterrupt) QString returnStr;
{ isOk = FMTool::SearchXMLNodeString(outXMlString, "ns0:AP", returnStr);
error = QString::fromLocal8Bit("收款被取消"); if(!isOk) {
return false; error = "Can't find xml node: ns0:AP";
} else if(!timer.isActive()) { QLOG_ERROR() << error;
error = QString::fromLocal8Bit("发送消息超时");
return false; return false;
} }
outdata = returnStr.toUtf8();
outdata = watcher.result(); return true;
bool isEmpty = outdata.isNull() && outdata.isEmpty();
return !isEmpty;
}
else
{
QLOG_ERROR() << "get function (Send) failed";
error = QString::fromLocal8Bit("加载基础组件(fun)失败");
} }
}
else
{
QLOG_ERROR() << "load dll failed";
error = QString::fromLocal8Bit("加载基础组件(dll)失败");
}
return false; return false;
} }
......
...@@ -93,6 +93,9 @@ ...@@ -93,6 +93,9 @@
#define CONFIG_ALL_PATH "ALL/DLLPATH" #define CONFIG_ALL_PATH "ALL/DLLPATH"
#define CONFIG_OLTP_URL "OLTP/url"
#define CONFIG_OLTP_ACTION "OLTP/action"
#define CONFIG_OLTP_TIMEOUT "OLTP/timeout"
#define CONFIG_OLTP_PATH "OLTP/DLLPATH" #define CONFIG_OLTP_PATH "OLTP/DLLPATH"
#define CONFIG_OLTP_VER "OLTP/VER" #define CONFIG_OLTP_VER "OLTP/VER"
#define CONFIG_OLTP_FROM "OLTP/FROM" #define CONFIG_OLTP_FROM "OLTP/FROM"
......
...@@ -129,12 +129,12 @@ extern "C" __declspec(dllexport) void Start(const char *indata, char *outdata) ...@@ -129,12 +129,12 @@ extern "C" __declspec(dllexport) void Start(const char *indata, char *outdata)
QsLogging::DestinationPtr consleDest(QsLogging::DestinationFactory::MakeDebugOutputDestination()); QsLogging::DestinationPtr consleDest(QsLogging::DestinationFactory::MakeDebugOutputDestination());
logger.addDestination(consleDest); logger.addDestination(consleDest);
QString errorString; // QString errorString;
if(!CopyApiDll(errorString)) { // if(!CopyApiDll(errorString)) {
// errorString = QString::fromLocal8Bit("{\"statusCode\":23, \"message\":\"%1\"}").arg(errorString); // errorString = QString::fromLocal8Bit("{\"statusCode\":23, \"message\":\"%1\"}").arg(errorString);
// strcpy(outdata, errorString.toLocal8Bit()); // strcpy(outdata, errorString.toLocal8Bit());
// return; // return;
} // }
static RollBack rollback; static RollBack rollback;
Control control(&win); Control control(&win);
......
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