Commit f8b41bc5 by 刘帅

TCP通信加上包头信息,添加商品管理功能

parent a498c1bc
...@@ -58,7 +58,8 @@ FlowControl::FlowControl() ...@@ -58,7 +58,8 @@ FlowControl::FlowControl()
socket->write(replyData.toUtf8()); socket->write(replyData.toUtf8());
socket->waitForBytesWritten(1000); socket->waitForBytesWritten(1000);
} }
if(recvObj.contains("reqtype") && recvObj["reqtype"] == 25) //商品库存同步 if(recvObj.contains("reqtype") &&
( recvObj["reqtype"] == 25 || recvObj["reqtype"] == 80)) //商品库存同步
{ {
recvObj.insert("token", m_token); recvObj.insert("token", m_token);
_onStockSync(recvObj); _onStockSync(recvObj);
...@@ -128,6 +129,38 @@ int FlowControl::_ParseTcpData(QJsonObject& recvObj, QString& error) ...@@ -128,6 +129,38 @@ int FlowControl::_ParseTcpData(QJsonObject& recvObj, QString& error)
return result; return result;
} }
void FlowControl::sendTcpData(QTcpSocket *socket, QByteArray &byteArray)
{
int byteSize = byteArray.size();
QLOG_INFO() << "byteSize " << byteSize;
char* m_pFmPackage = new char[byteSize + sizeof(FMSOCKEHEADER)];
FMSOCKEHEADER header = { 0, 0, 0 };
header.flag = 0x4d46;
header.len = byteSize;
header.ver = 0x1;
memcpy(m_pFmPackage, &header, sizeof(FMSOCKEHEADER));
memcpy(m_pFmPackage + sizeof(FMSOCKEHEADER), byteArray, byteSize);
int toSendLength = byteSize + sizeof(FMSOCKEHEADER);
int curSendLength = 0;
while(curSendLength < toSendLength)
{
int rlt= socket->write(m_pFmPackage + curSendLength, toSendLength - curSendLength);
socket->waitForBytesWritten();
if(rlt == -1)
{
QLOG_ERROR() << "发送菜单数据失败";
break;
}
curSendLength += rlt;
}
delete[] m_pFmPackage;
}
void FlowControl::_onLogin() void FlowControl::_onLogin()
{ {
m_bLogged = true; m_bLogged = true;
...@@ -254,7 +287,7 @@ void FlowControl::_onProcessOrderHandle(const QString& orderId, const QString &o ...@@ -254,7 +287,7 @@ void FlowControl::_onProcessOrderHandle(const QString& orderId, const QString &o
(recvObj["refund_status"].toInt() == 100 || (recvObj["refund_status"].toInt() == 100 ||
recvObj["refund_status"].toInt() == 30)) //同意部分退款 recvObj["refund_status"].toInt() == 30)) //同意部分退款
{ {
partialRefund(order_id); partialRefund(order_id, orderObj->fm_id);
} }
onSucessful(); onSucessful();
}else }else
...@@ -291,23 +324,7 @@ void FlowControl::_onGetCode() ...@@ -291,23 +324,7 @@ void FlowControl::_onGetCode()
return; return;
} }
QByteArray byteArray = QJsonDocument(recvObj).toJson(QJsonDocument::Compact); QByteArray byteArray = QJsonDocument(recvObj).toJson(QJsonDocument::Compact);
int byteSize = byteArray.size(); sendTcpData(socket, byteArray);
int send = 0;
while(true)
{
int temp = 0;
temp = socket->write(byteArray.data() + send);
if(temp == -1) //or -1 if an error occurred
break;
send += temp;
if(send == byteSize)
break;
}
if(! socket->waitForBytesWritten(LOCAL_SOCKET_TIMEOUT))
{
QLOG_ERROR() << "write to takeaway component failed!";
return;
}
socket->disconnectFromHost(); socket->disconnectFromHost();
if (socket->state() == QAbstractSocket::UnconnectedState || if (socket->state() == QAbstractSocket::UnconnectedState ||
socket->waitForDisconnected(1000)) socket->waitForDisconnected(1000))
...@@ -324,6 +341,40 @@ void FlowControl::_onGetCode() ...@@ -324,6 +341,40 @@ void FlowControl::_onGetCode()
); );
} }
void FlowControl::_onGetMenu()
{
QByteArray request = DataManage::getMenuData(m_token);
m_http.Post(request
,[this](const QByteArray &data)
{
QLOG_INFO() << QString("获取菜单返回数据: %1").arg(QString(data).simplified());
QJsonObject recvObj = QJsonDocument::fromJson(data).object();
if(recvObj["statusCode"].toInt() == 100)
{
QTcpSocket *socket = new QTcpSocket();
socket->connectToHost("127.0.0.1", 34956);
if(! socket->waitForConnected(LOCAL_SOCKET_TIMEOUT))
{
QLOG_ERROR() << "connect takeaway component failed!";
return;
}
QByteArray byteArray = QJsonDocument(recvObj).toJson(QJsonDocument::Compact);
sendTcpData(socket, byteArray);
socket->disconnectFromHost();
if (socket->state() == QAbstractSocket::UnconnectedState ||
socket->waitForDisconnected(1000))
delete socket;
}else
{
QLOG_ERROR() << QString("菜单接口返回错误: %1").arg(recvObj["msg"].toString());
}
}
,[this](const QNetworkReply::NetworkError &error)
{
QLOG_ERROR() << QString("获取菜单失败: %1").arg(error);
}
);
}
//TODO STOCK_SYNC //TODO STOCK_SYNC
void FlowControl::_onStockSync(QJsonObject obj) void FlowControl::_onStockSync(QJsonObject obj)
...@@ -342,15 +393,16 @@ void FlowControl::_onStockSync(QJsonObject obj) ...@@ -342,15 +393,16 @@ void FlowControl::_onStockSync(QJsonObject obj)
); );
} }
void FlowControl::partialRefund(QString order_id) void FlowControl::partialRefund(QString order_id, QString fm_id)
{ {
QByteArray appendData = DataManage::getRefundDetail(m_token, order_id); QByteArray appendData = DataManage::getRefundDetail(m_token, order_id);
m_http.Post(appendData m_http.Post(appendData
,[this](const QByteArray &data) ,[this, fm_id](const QByteArray &data)
{ {
QLOG_INFO() << QString("退款详情: %1").arg(QString(data).simplified()); QLOG_INFO() << QString("退款详情: %1").arg(QString(data).simplified());
QJsonObject recvObj = QJsonDocument::fromJson(data).object(); QJsonObject recvObj = QJsonDocument::fromJson(data).object();
recvObj.insert("fm_id", fm_id);
if(recvObj["statusCode"].toInt() == 100) if(recvObj["statusCode"].toInt() == 100)
{ {
QTcpSocket *socket = new QTcpSocket(); QTcpSocket *socket = new QTcpSocket();
...@@ -360,8 +412,10 @@ void FlowControl::partialRefund(QString order_id) ...@@ -360,8 +412,10 @@ void FlowControl::partialRefund(QString order_id)
{ {
QLOG_ERROR() << "connect takeaway component failed!"; QLOG_ERROR() << "connect takeaway component failed!";
return; return;
} }
socket->write(QJsonDocument(recvObj).toJson(QJsonDocument::Compact)); QByteArray byteArray = QJsonDocument(recvObj).toJson(QJsonDocument::Compact);
sendTcpData(socket, byteArray);
if(! socket->waitForBytesWritten(LOCAL_SOCKET_TIMEOUT)) if(! socket->waitForBytesWritten(LOCAL_SOCKET_TIMEOUT))
{ {
QLOG_ERROR() << "write to takeaway component failed!"; QLOG_ERROR() << "write to takeaway component failed!";
......
...@@ -55,6 +55,7 @@ private: ...@@ -55,6 +55,7 @@ private:
* 返回:0失败 100成功 * 返回:0失败 100成功
* */ * */
int _ParseTcpData(QJsonObject& recvObj, QString& error); int _ParseTcpData(QJsonObject& recvObj, QString& error);
void sendTcpData( QTcpSocket *socket, QByteArray& byteArray);
private: private:
// 标记是否已经登陆 // 标记是否已经登陆
...@@ -71,6 +72,13 @@ private: ...@@ -71,6 +72,13 @@ private:
// 用于存储订单信息<订单ID, 订单对象> // 用于存储订单信息<订单ID, 订单对象>
QMap<QString, OrderObject*> m_ordersMap; QMap<QString, OrderObject*> m_ordersMap;
public slots:
/* 功能:获取菜单
* 参数:NULL
* 返回:NULL
* */
void _onGetMenu();
private slots: private slots:
/* 功能:登录 /* 功能:登录
* 参数:NULL * 参数:NULL
...@@ -107,7 +115,7 @@ private slots: ...@@ -107,7 +115,7 @@ private slots:
* 参数:[1]订单id * 参数:[1]订单id
* 返回:NULL * 返回:NULL
* */ * */
void partialRefund(QString order_id); void partialRefund(QString order_id, QString fm_id);
public slots: public slots:
/* 功能:请求部分退款详情 /* 功能:请求部分退款详情
......
...@@ -56,18 +56,39 @@ void Sales::onRecordSale(QJsonObject obj) ...@@ -56,18 +56,39 @@ void Sales::onRecordSale(QJsonObject obj)
{ {
QTcpSocket *socket = new QTcpSocket(); QTcpSocket *socket = new QTcpSocket();
socket->connectToHost("127.0.0.1", 34956); socket->connectToHost("127.0.0.1", 34956);
if(! socket->waitForConnected(3000)) if(! socket->waitForConnected(3000))
{ {
QLOG_ERROR() << "connect takeaway component failed!"; QLOG_ERROR() << "connect takeaway component failed!";
return; return;
} }
socket->write(QJsonDocument(obj).toJson(QJsonDocument::Compact));
if(! socket->waitForBytesWritten(3000)) QByteArray byteArray = QJsonDocument(obj).toJson(QJsonDocument::Compact);
int byteSize = byteArray.size();
char* m_pFmPackage = new char[byteSize + sizeof(FMSOCKEHEADER)];
FMSOCKEHEADER header = { 0, 0, 0 };
header.flag = 0x4d46;
header.len = byteSize;
header.ver = 0x1;
memcpy(m_pFmPackage, &header, sizeof(FMSOCKEHEADER));
memcpy(m_pFmPackage+sizeof(FMSOCKEHEADER), byteArray, byteSize);
int toSendLength = byteSize + sizeof(FMSOCKEHEADER);
int curSendLength = 0;
while(curSendLength < toSendLength)
{ {
QLOG_ERROR() << "write to takeaway component failed!"; int rlt= socket->write(m_pFmPackage + curSendLength, toSendLength - curSendLength);
return; socket->waitForBytesWritten(3000);
if(rlt == -1)
{
QLOG_ERROR() << "发送订单数据失败\n" << (const char*)byteArray;
break;
}
curSendLength += rlt;
} }
delete[] m_pFmPackage;
socket->disconnectFromHost(); socket->disconnectFromHost();
if (socket->state() == QAbstractSocket::UnconnectedState || if (socket->state() == QAbstractSocket::UnconnectedState ||
socket->waitForDisconnected(1000)) socket->waitForDisconnected(1000))
......
...@@ -86,6 +86,12 @@ MainWindow::MainWindow(QWidget *parent) : ...@@ -86,6 +86,12 @@ MainWindow::MainWindow(QWidget *parent) :
{ {
FlowControl::Instance().GetDailyInfo(); FlowControl::Instance().GetDailyInfo();
}); });
//商品管理
connect(ui->main_btnSPGL, &QPushButton::clicked, []()
{
FlowControl::Instance()._onGetMenu();
});
connect(&FlowControl::Instance(), &FlowControl::showDailyForm, [this](QList<DailyInfo> infos) connect(&FlowControl::Instance(), &FlowControl::showDailyForm, [this](QList<DailyInfo> infos)
{ {
m_dailyForm->move(pos()); m_dailyForm->move(pos());
...@@ -142,12 +148,25 @@ MainWindow::MainWindow(QWidget *parent) : ...@@ -142,12 +148,25 @@ MainWindow::MainWindow(QWidget *parent) :
if(socket->waitForConnected(1000)) if(socket->waitForConnected(1000))
{ {
socket->write("quit"); QByteArray ba("quit");
FMSOCKEHEADER header = { 0, 0, 0 };
header.flag = 0x4d46;
header.len = ba.length();
header.ver = 0x1;
char* m_pFmPackage = new char[ba.length() + sizeof(FMSOCKEHEADER)];
memcpy(m_pFmPackage, &header, sizeof(FMSOCKEHEADER));
memcpy(m_pFmPackage+sizeof(FMSOCKEHEADER), ba, ba.length());
socket->write(m_pFmPackage, ba.length() + sizeof(FMSOCKEHEADER));
if(! socket->waitForBytesWritten(1000)) if(! socket->waitForBytesWritten(1000))
{ {
QLOG_INFO() << "takeaway component maybe cannot timinate"; QLOG_INFO() << "takeaway component maybe cannot timinate";
} }
socket->disconnectFromHost(); socket->disconnectFromHost();
delete[] m_pFmPackage;
} }
if (socket->state() == QAbstractSocket::UnconnectedState || if (socket->state() == QAbstractSocket::UnconnectedState ||
socket->waitForDisconnected(1000)) socket->waitForDisconnected(1000))
......
...@@ -156,6 +156,15 @@ QByteArray DataManage::getCodeData(const QString &token) ...@@ -156,6 +156,15 @@ QByteArray DataManage::getCodeData(const QString &token)
return QJsonDocument(json).toJson().simplified(); return QJsonDocument(json).toJson().simplified();
} }
QByteArray DataManage::getMenuData(const QString &token)
{
QJsonObject json;
json.insert("reqtype", 24);
json.insert("token", token);
json.insert("channel", "eleme2");
return QJsonDocument(json).toJson().simplified();
}
QByteArray DataManage::getRefundDetail(const QString &token, const QString &orderId) QByteArray DataManage::getRefundDetail(const QString &token, const QString &orderId)
{ {
QJsonObject json, order; QJsonObject json, order;
......
...@@ -23,6 +23,7 @@ public: ...@@ -23,6 +23,7 @@ public:
static QByteArray getMenuData(const QString& token, const QString& channel); static QByteArray getMenuData(const QString& token, const QString& channel);
static QByteArray getCodeData(const QString& token); static QByteArray getCodeData(const QString& token);
static QByteArray getMenuData(const QString& token);
static QByteArray getRefundDetail(const QString& token, const QString& orderId); static QByteArray getRefundDetail(const QString& token, const QString& orderId);
}; };
......
...@@ -102,6 +102,11 @@ typedef struct DailyInfo ...@@ -102,6 +102,11 @@ typedef struct DailyInfo
int total_projected_revenue; int total_projected_revenue;
}DailyInfo; }DailyInfo;
typedef struct {
int flag;
int ver;
int len;
}FMSOCKEHEADER;
#endif // UTIL_H #endif // UTIL_H
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