Commit f8b41bc5 by 刘帅

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

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