Commit 1bdf9368 by ss.dai

完成逻辑处理

parent 2867d09b
......@@ -11,6 +11,7 @@
#include <QEventLoop>
#include <QTimer>
#include <QJsonArray>
#include <QDataStream>
FmPlugin &FmPlugin::GetInstance()
{
......@@ -18,404 +19,142 @@ FmPlugin &FmPlugin::GetInstance()
return fmPlugin;
}
bool FmPlugin::ConnectDb(const QString &host, const QString &username, const QString &password, const QString &dbname, QString &error)
void FmPlugin::SetRemoteInfo(const QString &ip, int port)
{
// 清除之前的连接
QSqlDatabase::removeDatabase(m_db.connectionName());
m_db = QSqlDatabase::addDatabase("QODBC");
m_db.setConnectOptions(QString("SQL_ATTR_LOGIN_TIMEOUT=5;SQL_ATTR_CONNECTION_TIMEOUT=5"));
m_db.setDatabaseName(QString("Driver={sql server}; server=%1; database=%2; uid=%3; pwd=%4")
.arg(host).arg(dbname).arg(username).arg(password));
if(m_db.open())
{
error = QString("success");
m_db.close();
return true;
}else
{
error = m_db.lastError().text();
return false;
}
m_host = ip;
m_port = port;
}
bool FmPlugin::GetStoreInfo(QString &storeId, QString &posId, QString &cashierId, QDateTime &dateTime, QString &error)
bool FmPlugin::DoOrderEntry(const OrderObject *orderObject, QString &error, bool bVerify)
{
if(!m_db.open())
{
error = m_db.lastError().text();
return false;
}
QSqlQuery query = QSqlQuery(m_db);
// 获取门店号
QString queryStoreId("select sys_var_value from sys_t_system where sys_var_id='g_branch_no'");
query.prepare(queryStoreId);
if (!query.exec())
{
error = query.lastError().text();
m_db.close();
return false;
}
query.next();
storeId = query.value(0).toString();
m_storeId = storeId;
// 获取营业日
QString queryDateTime("select sys_var_value from sys_t_system where sys_var_id='dBusiness'");
query.prepare(queryDateTime);
if (!query.exec())
{
error = query.lastError().text();
m_db.close();
return false;
}
query.next();
dateTime = query.value(0).toDateTime();
posId="1";
cashierId="1";
error = QString("success");
m_db.close();
QTcpSocket socket;
// 连接
socket.connectToHost(m_host, m_port);
if (socket.waitForConnected())
{
// 初始化请求数据
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_3);
out << quint32(0);
out << _GetOrderEntryData(orderObject, bVerify);
out.device()->seek(0);
out << (quint32)(block.size() - sizeof(quint32));
// 发送
socket.write(block);
if (socket.waitForBytesWritten())
{
// 接收返回
if (socket.waitForReadyRead())
{
QJsonObject recvJson = QJsonDocument::fromJson(socket.readAll()).object();
if(recvJson["statusCode"].toInt()==100)
{
socket.close();
return true;
}
bool FmPlugin::GetOnDutyCashiers(QList<CashierObject> &cashiersList, QString &error)
{
if(!m_db.open())
{
error = m_db.lastError().text();
return false;
}
// 获取在班收银员信息
QSqlQuery query = QSqlQuery(m_db);
QString queryCashiers("select * from v_km_cashshift");
query.prepare(queryCashiers);
if (!query.exec())
{
error = query.lastError().text();
m_db.close();
return false;
}else
{
while(query.next())
{
CashierObject cashierObj;
cashierObj.id = query.value(0).toString();
cashierObj.name = query.value(1).toString();
cashierObj.shiftId = query.value(2).toString();
cashierObj.shiftName = query.value(3).toString();
cashiersList.append(cashierObj);
error = recvJson["msg"].toString();
socket.close();
return false;
}
}
error = QString("success");
m_db.close();
return true;
}
bool FmPlugin::DoOrderEntry(const OrderObject *orderObject, const QString &cashierId, const QString &cashierName, const QString &shiftId, const QString &shiftName, QString &error)
{
m_orderObject = orderObject;
// if(!m_db.open())
// {
// error = m_db.lastError().text();
// return false;
// }
// // 开启事务
// if(!m_db.transaction())
// {
// error = m_db.lastError().text();
// m_db.close();
// return false;
// }
// // 插入三张临时表后执行存储过程有一个失败则回滚
// if(!_InsertInto_d_t_food_fmbill0(cashierId, cashierName, shiftId, shiftName))
// {
// error = m_db.lastError().text();
// m_db.rollback();
// m_db.close();
// return false;
// }
// if(!_InsertInto_d_t_food_fmbills0())
// {
// error = m_db.lastError().text();
// m_db.rollback();
// m_db.close();
// return false;
// }
// if(!_InsertInto_d_t_bill_fmpay0())
// {
// error = m_db.lastError().text();
// m_db.rollback();
// m_db.close();
// return false;
// }
// if(!_Exec_pr_fmwm())
// {
// error = m_db.lastError().text();
// m_db.rollback();
// m_db.close();
// return false;
// }
// // 都成功则提交
// m_db.commit();
// error = QString("success");
// m_db.close();
QSettings set("config.ini", QSettings::IniFormat);
QString host = set.value("DbServer/postUrl").toString();
QNetworkAccessManager manger;
QNetworkRequest qRequset;
qRequset.setUrl(QUrl(host+"/FMJsonInterfaceByDefault"));
qRequset.setRawHeader("Content-Type","application/x-www-form-urlencoded");
QJsonObject rootObj, cObj;
rootObj.insert("fm_cmd", "put_order");
rootObj.insert("fm_ver", "1.0");
rootObj.insert("operator_id", cashierId);
rootObj.insert("pos_id", cashierName.toInt());
rootObj.insert("store_id", "0001");
rootObj.insert("business_date", shiftName);
cObj.insert("pay_id","002");
cObj.insert("pay_str","非码外卖");
cObj.insert("pay_ebcode",orderObject->channel);
cObj.insert("pay_ebcode_str",orderObject->channelName);
cObj.insert("total_amount",orderObject->shop_fee);
cObj.insert("paid_total_amount",orderObject->shop_fee);
cObj.insert("incentives_amount",orderObject->discount_fee);
cObj.insert("invoice_amount",orderObject->shop_fee);
cObj.insert("paid_trans_id",orderObject->order_id);
cObj.insert("fm_id",orderObject->order_id);
cObj.insert("order_time",QString::number(orderObject->create_time));
rootObj.insert("pay_id", cObj);
QJsonArray tmpArray;
for(int i=0; i < orderObject->proList.count(); i++)
{
QJsonObject tmpObj;
tmpObj.insert("consume_num", orderObject->proList.at(i)->productAmount);
tmpObj.insert("pid", orderObject->proList.at(i)->pid);
tmpObj.insert("original_price", orderObject->proList.at(i)->price);
tmpArray.insert(i, tmpObj);
}
rootObj.insert("products", tmpArray);
QJsonDocument doc(rootObj);
QString strArray = QString("jsonStr=") + QString(doc.toJson( QJsonDocument::Compact));
qDebug() << strArray;
QNetworkReply *reply = manger.post(qRequset , strArray.toUtf8());
QEventLoop eventLoop;
QObject::connect(&manger, SIGNAL(networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility)), &eventLoop, SLOT(quit()));
QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
QObject::connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), &eventLoop, SLOT(quit()));
// 加用定时器防止网络出现异常长时间不返回导致的阻塞
QTimer::singleShot(10000, &eventLoop, &QEventLoop::quit);
eventLoop.exec();
if( reply->error() != QNetworkReply::NoError){
error = reply->errorString();
return false;
}
QByteArray receArray = reply->readAll();
if(receArray.size() == 0)
{
error = "nothing recved";
return false;
}
QJsonDocument doc1 = QJsonDocument::fromJson( receArray);
QJsonObject ttmp = doc1.object();
if(ttmp["statusCode"].toInt()==100)
{
return true;
}else
{
error = ttmp["msg"].toString();
error = socket.errorString();
socket.close();
return false;
}
}
bool FmPlugin::RefundOrder(const QString &orderId, QString &error)
{
QSettings set("config.ini", QSettings::IniFormat);
QString host = set.value("DbServer/postUrl").toString();
QNetworkAccessManager manger;
QNetworkRequest qRequset;
qRequset.setUrl(QUrl(host+"/FMJsonInterfaceByDefault"));
qRequset.setRawHeader("Content-Type","application/x-www-form-urlencoded");
QJsonObject rootObj;
rootObj.insert("fm_cmd", "refund_order");
rootObj.insert("fm_ver", "1.0");
rootObj.insert("fm_id", orderId);
QJsonDocument doc(rootObj);
QString strArray = QString("jsonStr=") + QString(doc.toJson( QJsonDocument::Compact));
QNetworkReply *reply = manger.post(qRequset , strArray.toUtf8());
QEventLoop eventLoop;
QObject::connect(&manger, SIGNAL(networkAccessibleChanged(QNetworkAccessManager::NetworkAccessibility)), &eventLoop, SLOT(quit()));
QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
QObject::connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), &eventLoop, SLOT(quit()));
// 加用定时器防止网络出现异常长时间不返回导致的阻塞
QTimer::singleShot(10000, &eventLoop, &QEventLoop::quit);
eventLoop.exec();
if( reply->error() != QNetworkReply::NoError){
error = reply->errorString();
return false;
}
QByteArray receArray = reply->readAll();
if(receArray.size() == 0)
{
error = "nothing recved";
return false;
}
QJsonDocument doc1 = QJsonDocument::fromJson( receArray);
QJsonObject ttmp = doc1.object();
if(ttmp["statusCode"].toInt()==100)
{
QTcpSocket socket;
// 连接
socket.connectToHost(m_host, m_port);
if (socket.waitForConnected())
{
// 初始化请求数据
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_3);
out << quint32(0);
out << _GetRefundOrderData(orderId);
out.device()->seek(0);
out << (quint32)(block.size() - sizeof(quint32));
// 发送
socket.write(block);
if (socket.waitForBytesWritten())
{
// 接收返回
if (socket.waitForReadyRead())
{
QJsonObject recvJson = QJsonDocument::fromJson(socket.readAll()).object();
if(recvJson["statusCode"].toInt()==100)
{
socket.close();
return true;
}else
{
error = ttmp["msg"].toString();
error = recvJson["msg"].toString();
socket.close();
return false;
}
}
bool FmPlugin::_InsertInto_d_t_food_fmbill0(const QString& cashierId, const QString& cashierName, const QString& shiftId, const QString& shiftName)
{
QSqlQuery query = QSqlQuery(m_db);
// 查询营业日
QDateTime dbussiness;
QString queryDateTime("select sys_var_value from sys_t_system where sys_var_id='dBusiness'");
query.prepare(queryDateTime);
if (!query.exec())
{
return false;
}
query.next();
dbussiness = query.value(0).toDateTime();
// 插入到临时表
QString queryInsert("insert into d_t_food_fmbill0(cbill_c,cbranch_c,dBusiness,"
"ccashier_c, ccashier_n, cshift_c, cshift_n,"
"iguestnum,dtbilltime,dtsettletime,noughtamt,npayamt,"
"ndisamt,sbilltype,fmwmbillid,sprovider,nfreight)"
"values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);");
query.prepare(queryInsert);
query.bindValue(0, m_orderObject->order_id);
query.bindValue(1, m_storeId);
query.bindValue(2, dbussiness);
query.bindValue(3, cashierId);
query.bindValue(4, cashierName);
query.bindValue(5, shiftId);
query.bindValue(6, shiftName);
query.bindValue(7, m_orderObject->remark.mid(m_orderObject->remark.lastIndexOf(':')+1).toInt());
query.bindValue(8, QDateTime::fromTime_t(m_orderObject->create_time));
query.bindValue(9, QDateTime::fromTime_t(m_orderObject->create_time));
query.bindValue(10, _Penny2Dollar(m_orderObject->shop_fee));
query.bindValue(11, _Penny2Dollar(m_orderObject->shop_fee));
query.bindValue(12, _Penny2Dollar(m_orderObject->discount_fee));
query.bindValue(13, QString("\351\200\201\351\244\220\345\215\225"));// 送餐单
query.bindValue(14, m_orderObject->order_id);
query.bindValue(15, m_orderObject->channelName);
query.bindValue(16, m_orderObject->pay_type.compare("在线支付") ? "0" : _Penny2Dollar(m_orderObject->send_fee));
if(!query.exec())
{
return false;
}
return true;
}
bool FmPlugin::_InsertInto_d_t_food_fmbills0()
{
QSqlQuery query = QSqlQuery(m_db);
// 插入商品详情
QString queryInsert("insert into d_t_food_fmbills0(cbill_c,cfoodbill,"
"cfood_c,cfood_n,nqty,nprc,namt)"
"values(?,?,?,?,?,?,?);");
query.prepare(queryInsert);
for(int i=0; i<m_orderObject->proList.count(); i++)
{
query.bindValue(0, m_orderObject->order_id);
query.bindValue(1, QString("%1").arg(QString::number(i+1),4,QChar('0')));
query.bindValue(2, m_orderObject->proList.at(i)->pid);
query.bindValue(3, m_orderObject->proList.at(i)->name);
query.bindValue(4, QString::number(m_orderObject->proList.at(i)->productAmount));
query.bindValue(5, _Penny2Dollar(m_orderObject->proList.at(i)->price));
query.bindValue(6, _Penny2Dollar(m_orderObject->proList.at(i)->price*m_orderObject->proList.at(i)->productAmount));
if(!query.exec())
{
return false;
}
}
return true;
error = socket.errorString();
socket.close();
return false;
}
bool FmPlugin::_InsertInto_d_t_bill_fmpay0()
QByteArray FmPlugin::_GetOrderEntryData(const OrderObject *orderObject, bool bVerify)
{
QSqlQuery query = QSqlQuery(m_db);
// 插入支付详情
QString queryInsert("insert into d_t_bill_fmpay0(cbill_c,"
"cbillpay,cpay_c,cpay_n,npayamt)"
"values(?,?,?,?,?);");
query.prepare(queryInsert);
query.bindValue(0, m_orderObject->order_id);
query.bindValue(1, "01");
QString cpay_c, cpay_n;
if(!m_orderObject->pay_type.compare("在线支付"))
QJsonObject rObj, cObj;
if(bVerify)
{
if(!m_orderObject->channel.compare("mtwm"))
{
cpay_c = QString("14");
cpay_n = QString("\347\276\216\345\233\242\345\244\226\345\215\226");//美团外卖
}else if(!m_orderObject->channel.compare("fmwd"))
{
cpay_c = QString("13");
cpay_n = QString("\345\276\256\344\277\241\345\244\226\345\215\226");//微店外卖
}
rObj.insert("fm_cmd", "put_order_check");
}else
{
cpay_c = QString("01");
cpay_n = QString("\347\216\260\351\207\221");//现金
}
query.bindValue(2, cpay_c);
query.bindValue(3, cpay_n);
query.bindValue(4, _Penny2Dollar(m_orderObject->shop_fee));
if(!query.exec())
rObj.insert("fm_cmd", "put_order");
}
rObj.insert("fm_ver", "1.0");
cObj.insert("pay_id", "002");
cObj.insert("pay_str", "非码外卖");
cObj.insert("pay_ebcode", orderObject->channel);
cObj.insert("pay_ebcode_str", orderObject->channelName);
cObj.insert("total_fee", orderObject->total_fee);
cObj.insert("discount_fee", orderObject->discount_fee);
cObj.insert("send_fee", orderObject->send_fee);
cObj.insert("user_fee", orderObject->user_fee);
cObj.insert("shop_fee", orderObject->shop_fee);
cObj.insert("invoice_amount",orderObject->shop_fee);
cObj.insert("paid_trans_id",orderObject->order_id);
cObj.insert("fm_id",orderObject->order_id);
rObj.insert("pay_id", cObj);
QJsonArray products;
for(int i=0; i < orderObject->proList.count(); i++)
{
return false;
QJsonObject tObj;
tObj.insert("consume_num", orderObject->proList.at(i)->productAmount);
tObj.insert("pid", orderObject->proList.at(i)->pid);
tObj.insert("original_price", orderObject->proList.at(i)->price);
products.insert(i, tObj);
}
return true;
}
rObj.insert("products", products);
bool FmPlugin::_Exec_pr_fmwm()
{
QSqlQuery query = QSqlQuery(m_db);
query.prepare("exec pr_fmwm ?, ? output;");
query.bindValue(0, m_orderObject->order_id);
query.bindValue(1, 0, QSql::Out);
if(!query.exec())
{
return false;
}
if(query.boundValue(1).toInt() != 1)
{
return false;
}
return true;
QJsonDocument doc(rObj);
return doc.toJson(QJsonDocument::Compact);
}
QString FmPlugin::_Penny2Dollar(int penny)
QByteArray FmPlugin::_GetRefundOrderData(const QString &orderId)
{
double dollar = (double)penny/100;
return QString::number(dollar,'f',2);
QJsonObject rObj;
rObj.insert("fm_cmd", "refund_order");
rObj.insert("fm_ver", "1.0");
rObj.insert("fm_id", orderId);
QJsonDocument doc(rObj);
return doc.toJson(QJsonDocument::Compact);
}
......@@ -6,6 +6,8 @@
#include "Model/cashierObject.h"
#include <QtSql/QSqlDatabase>
#include <QDateTime>
#include <QThread>
#include <QTcpServer>
class PluginWorker;
......@@ -14,29 +16,13 @@ class FMPLUGINSHARED_EXPORT FmPlugin
public:
static FmPlugin& GetInstance();
/* 功能:连接数据库
* 参数:[1]IP[2]用户名[3]密码[4]库名[5]错误
* 返回:是否成功
* */
bool ConnectDb(const QString& host, const QString& username, const QString& password,
const QString& dbname, QString& error);
/* 功能:获取门店信息
* 参数:[1]门店编号[2]收银机编号[3]收银员编号[4]营业日[5]错误
* 返回:是否成功
* */
bool GetStoreInfo(QString& storeId, QString& posId, QString& cashierId,
QDateTime& dateTime, QString& error);
/* 功能:获取在班收银员信息
* 参数:[1]收银员列表[2]错误信息
* 返回:是否成功
* */
bool GetOnDutyCashiers(QList<CashierObject>& cashiersList, QString& error);
void SetRemoteInfo(const QString& ip, int port);
/* 功能:写入销售单
* 参数:[1]订单对象[2]错误信息
* 参数:[1]订单对象[2]错误信息[3]是否是确认动作
* 返回:是否成功
* */
bool DoOrderEntry(OrderObject const *orderObject, const QString& cashierId, const QString& cashierName,
const QString& shiftId, const QString& shiftName, QString& error);
bool DoOrderEntry(OrderObject const *orderObject, QString& error, bool bVerify = false);
/* 功能:撤销销售单
* 参数:[1]订单编号[2]错误信息
* 返回:是否成功
......@@ -48,39 +34,23 @@ private:
FmPlugin(FmPlugin const&);
FmPlugin& operator=(FmPlugin const&);
// 数据库句柄
QSqlDatabase m_db;
// 门店号
QString m_storeId;
// 通信地址
QString m_host;
int m_port;
// 订单对象
const OrderObject *m_orderObject;
OrderObject const *m_orderObject;
/* 功能:写入表d_t_food_fmbill0
* 参数:[1]收银员ID[2]收银员姓名[3]班次ID[4]班次名称
* 返回:true成功false失败
* */
bool _InsertInto_d_t_food_fmbill0(const QString& cashierId, const QString& cashierName,
const QString& shiftId, const QString& shiftName);
/* 功能:写入表d_t_food_fmbills0
* 参数:NULL
* 返回:true成功false失败
* */
bool _InsertInto_d_t_food_fmbills0();
/* 功能:写入表d_t_food_fmpay0
* 参数:NULL
* 返回:true成功false失败
* */
bool _InsertInto_d_t_bill_fmpay0();
/* 功能:执行存储过程pr_fmwm
* 参数:NULL
* 返回:true成功false失败
/* 功能:获取写入销售单数据
* 参数:[1]订单对象
* 返回:写入销售单数据
* */
bool _Exec_pr_fmwm();
/* 功能:将【分】转化为【元】
* 参数:[1]
* 返回:
QByteArray _GetOrderEntryData(OrderObject const *orderObject, bool bVerify = false);
/* 功能:获取写入销售单数据
* 参数:[1]订单对象
* 返回:写入销售单数据
* */
QString _Penny2Dollar(int penny);
QByteArray _GetRefundOrderData(const QString& orderId);
};
#endif // FMPLUGIN_H
......@@ -20,28 +20,34 @@ FlowControl &FlowControl::GetInstance()
FlowControl::FlowControl()
{
m_bFirstRecvInfo = true;
m_timestamp = "0";
m_loginSocket = NULL;
m_pullOrderSocket = NULL;
m_procOrderSocket = NULL;
}
bool FlowControl::_GetStoreInfo()
void FlowControl::onGetNewStoreInfo(const QString &operator_id, const QString &pos_id, const QString &store_id, const QString &business_date)
{
QString error;
bool result;
m_storeId = store_id;
m_posId = pos_id;
m_cashierId = operator_id;
m_bDate = QDateTime::fromString(business_date, "yyyyMMdd");
emit showAlert(AlertForm::LOADING, "正在获取门店信息......");
QLOG_INFO() << QString("[---get storeInfo---]");
result = FmPlugin::GetInstance().GetStoreInfo(m_storeId, m_posId, m_cashierId, m_bDate, error);
QLOG_INFO() << QString("get storeInfo finsh. [result:%1][msg:%2][storeId:%3,posId:%4,cashierId:%5,bdate:%6]")
.arg(result).arg(error, m_storeId, m_posId, m_cashierId, m_bDate.toString("yyyy-MM-dd"));
if(m_bFirstRecvInfo)
{
m_bFirstRecvInfo = false;
if(!result)
m_loginSocket = new BillSocket(this);
m_pullOrderSocket = new BillSocket(this);
m_procOrderSocket = new BillSocket(this);
_Login();
}else
{
emit showAlert(AlertForm::ERROR, "获取门店信息失败!");
emit setStoreInfo(m_storeId);
emit setCashierInfo(m_cashierId);
}
return result;
}
bool FlowControl::_Login()
......@@ -51,7 +57,6 @@ bool FlowControl::_Login()
QJsonObject sendJson;
QJsonObject recvJson;
// TODO
sendJson = DataManger::GetInstance().GetLoginData(m_storeId, SERVER_PASSWORD, m_posId, m_cashierId);
emit showAlert(AlertForm::LOADING, "正在登录......");
......@@ -79,12 +84,11 @@ bool FlowControl::_Login()
}
}
/*
if(!result)
{
QLOG_INFO() << QString("%1 msec after login...").arg(VALUE_RELOGINTIME);
QTimer::singleShot(VALUE_RELOGINTIME, this, &FlowControl::_Login);
}*/
}
return result;
}
......@@ -230,32 +234,21 @@ bool FlowControl::_ConfirmOrder(const QString &orderId, const DeliverObject &del
OrderObject *orderObject = m_ordersMap.value(orderId);
emit showAlert(AlertForm::LOADING, "正在写入销售单......");
QString orderEntryError("");
// 写入销售单
QLOG_INFO() << QString("[---begin entry order---].");
if(!FmPlugin::GetInstance().DoOrderEntry(orderObject, m_cashierId, m_posId,
m_storeId, m_bDate.toString("yyyy-MM-dd"), error))
if(!FmPlugin::GetInstance().DoOrderEntry(orderObject, error))
{
QString dirPath = QString("%1/orders").arg(QApplication::applicationDirPath());
QDir dir;
dir.mkdir(dirPath);
QFile file(QString("%1/%2").arg(dirPath, orderObject->order_id));
if(!file.exists())
while(!FmPlugin::GetInstance().DoOrderEntry(orderObject, error, true))
{
file.open(QFile::WriteOnly);
file.close();
}
orderEntryError = QString("\r\n[写入销售单失败]");
QLOG_INFO() << QString("entry order failed[%1]").arg(error);
}else
{
orderEntryError = QString("\r\n[写入销售单成功]");
}
}
QLOG_INFO() << QString("[entry order success].");
QString remark(orderObject->remark), deliveryTime;
remark = remark.isEmpty()? "" : QString("\r\n[备注: %1]").arg(remark);
deliveryTime = QString("\r\n[期望送达时间: %1]").arg(orderObject->delivery_time);
emit showAlert(AlertForm::SUCCESS, QString("接单成功!%1%2%3").arg(remark).arg(deliveryTime).arg(orderEntryError));
emit showAlert(AlertForm::SUCCESS, QString("接单成功!%1%2").arg(remark).arg(deliveryTime));
// 通知主界面移动订单
int oldStatus = orderObject->status;
......@@ -487,100 +480,16 @@ bool FlowControl::_RefundOrder(const QString &orderId)
return result;
}
bool FlowControl::_GetCashiers(QList<CashierObject> &cashiersList)
{
QString strCashiers, error;
bool result;
emit showAlert(AlertForm::LOADING, "正在查询收银员信息.....");
QLOG_INFO() << QString("[---get cashiers---].");
result = FmPlugin::GetInstance().GetOnDutyCashiers(cashiersList, error);
foreach (CashierObject cashier, cashiersList)
{
strCashiers.append(QString("|%1,%2,%3,%4|").arg(cashier.id, cashier.name, cashier.shiftId, cashier.shiftName));
}
QLOG_INFO() << QString("get cashiers finsh. [result:%1][msg:%2][data:%3]").arg(result).arg(error, strCashiers);
if(!result)
{
emit showAlert(AlertForm::ERROR, "查询收银员信息失败!");
}
return result;
}
bool FlowControl::_CheckCashiers()
{
bool result = false;
QList<CashierObject> cashiersList;
if(_GetCashiers(cashiersList))
{
foreach (CashierObject cashier, cashiersList)
{
if(!cashier.id.compare(m_cashierObject.id))
{
m_cashierObject = cashier;
result = true;
break;
}
}
if(result == false)
{
emit showAlert(AlertForm::ERROR, "当前收银员已下班请重新选择!");
}
}
return result;
}
QString FlowControl::_GetJsonStr(const QJsonObject &json)
{
return QString(QJsonDocument(json).toJson(QJsonDocument::Compact)).replace("\"","");
}
bool FlowControl::_DoOrderEntry(OrderObject *orderObject)
{
}
bool FlowControl::_RefundOrder()
{
}
void FlowControl::onFlowStart()
{
m_timestamp = "0";
m_loginSocket = new BillSocket(this);
m_pullOrderSocket = new BillSocket(this);
m_procOrderSocket = new BillSocket(this);
// if(_GetStoreInfo())
// {
// _Login();
// }
return;
}
void FlowControl::onConnectDb(const QString &host, const QString &username, const QString &password, const QString &dbname)
{
QString error; bool result;
QLOG_INFO() << QString("[---connect database---]. [host:%1][username:%2][password:%3][dbname:%4]")
.arg(host, username, password, dbname);
result = FmPlugin::GetInstance().ConnectDb(host, username, password, dbname, error);
QLOG_INFO() << QString("connect finsh. [result:%1][msg:%2]").arg(result).arg(error);
emit connectDbFinsh(result, error);
return;
}
void FlowControl::onProcessOrder(const QString &operation, const QString &orderId, const DeliverObject &deliverObj)
{
if(!operation.compare(OPERATION_GETDELIVERS))
{
// 放在这检测收银员的合法性因为接单前会获取配送员
//if(_CheckCashiers())
//{
_GetDelivers(orderId);
//}
}else if(!operation.compare(OPERATION_CONFRIM))
{
_ConfirmOrder(orderId, deliverObj);
......@@ -599,36 +508,10 @@ void FlowControl::onProcessOrder(const QString &operation, const QString &orderI
}
}
void FlowControl::onGetOnDutyCashiers()
{
QList<CashierObject> cashiersList;
if(_GetCashiers(cashiersList))
{
emit hideAlert();
emit showCashierPickForm(cashiersList);
}
}
void FlowControl::onUpdateCashier(const CashierObject &cashier)
{
m_cashierObject = cashier;
}
void FlowControl::onGetOrderDetails(const QString &orderId)
{
//if(_CheckCashiers())
//{
emit hideAlert();
emit showOrderDetails(m_ordersMap.value(orderId));
//}
}
void FlowControl::onGetNewStoreInfo(const QString &operator_id, const QString &pos_id, const QString &store_id, const QString &business_date)
{
m_storeId = store_id;
m_posId = pos_id;
m_cashierId = operator_id;
m_bDate = QDateTime::fromString(business_date, "yyyyMMdd");
_Login();
}
......@@ -38,15 +38,10 @@ private:
QString m_timestamp;
// 订单容器
QMap<QString, OrderObject*> m_ordersMap;
// 当前收银员
CashierObject m_cashierObject;
// 是否第一次获取到门店信息
bool m_bFirstRecvInfo;
signals:
/* 功能:连接数据库完成
* 参数:[1]是否成功[2]错误信息
* 返回:NULL
* */
void connectDbFinsh(bool bSuccess, const QString& msg);
/* 功能:隐藏通知窗口
* 参数:NULL
* 返回:NULL
......@@ -77,7 +72,7 @@ signals:
* 返回:NULL
* */
void setNetStatus(const QString& status);
/* 功能:更改订单显示
/* 功能:更改订单显示表
* 参数:[1]订单对象[2]旧订单的状态
* 返回:NULL
* */
......@@ -87,11 +82,6 @@ signals:
* 返回:NULL
* */
void showDeliverPickForm(const QString& orderId, const QList<DeliverObject>& delivers);
/* 功能:显示收银员选择窗
* 参数:[1]收银员信息
* 返回:NULL
* */
void showCashierPickForm(const QList<CashierObject>& cashiers);
/* 功能:显示订单详情界面
* 参数:[1]收银员信息
* 返回:NULL
......@@ -99,11 +89,6 @@ signals:
void showOrderDetails(OrderObject* orderObject);
private slots:
/* 功能:获取门店信息
* 参数:NULL
* 返回:是否成功
* */
bool _GetStoreInfo();
/* 功能:登录
* 参数:NULL
* 返回:是否成功
......@@ -149,73 +134,30 @@ private slots:
* 返回:是否成功
* */
bool _RefundOrder(const QString& orderId);
/* 功能:获取收银员
* 参数:[1]收银员列表
* 返回:成功true失败false
* */
bool _GetCashiers(QList<CashierObject>& cashiersList);
/* 功能:检测收银员合法性
* 参数:NULL
* 返回:合法true不合法false
* */
bool _CheckCashiers();
/* 功能:获取Json对象的字符
* 参数:NULL
* 返回:Json字符串
* */
QString _GetJsonStr(const QJsonObject& json);
/* 功能:写入销售单
* 参数:NULL
* 返回:成功true失败false
* */
bool _DoOrderEntry(OrderObject* orderObject);
/* 功能:销售单退单
* 参数:NULL
* 返回:成功true失败false
* */
bool _RefundOrder();
public slots:
/* 功能:开启流程控制器
* 参数:NULL
* 返回:NULL
* */
void onFlowStart();
/* 功能:连接数据库
* 参数:[1]IP[2]用户名[3]密码[4]库名
/* 功能:获取到新的门店信息
* 参数:[1]操作员ID[2]POS机ID
* [3]门店ID[4]营业日
* 返回:NULL
* */
void onConnectDb(const QString& host, const QString& username,
const QString& password, const QString& dbname);
void onGetNewStoreInfo(const QString& operator_id, const QString& pos_id,
const QString& store_id, const QString& business_date);
/* 功能:处理订单
* 参数:[1]操作动作名[2]订单编号[3]配送员姓名
* 返回:NULL
* */
void onProcessOrder(const QString& operation, const QString& orderId, const DeliverObject& deliverObj);
/* 功能:获取在班收银员信息
* 参数:NULL
* 返回:NULL
* */
void onGetOnDutyCashiers();
/* 功能:更新收银员信息
* 参数:NULL
* 返回:NULL
* */
void onUpdateCashier(const CashierObject& cashier);
/* 功能:获取订单详情
* 参数:NULL
* 返回:NULL
* */
void onGetOrderDetails(const QString& orderId);
/* 功能:获取到新的门店信息
* 参数:[1]操作员ID[2]POS机ID
* [3]门店ID[4]营业日
* 返回:NULL
* */
void onGetNewStoreInfo(const QString& operator_id, const QString& pos_id,
const QString& store_id, const QString& business_date);
};
#endif // FLOWCONTROL_H
#include "refundControl.h"
#include "QsLog.h"
#include <QJsonObject>
#include <QJsonDocument>
#include "DTools/dataManger.h"
RefundControl &RefundControl::GetInstance()
{
static RefundControl rc;
return rc;
}
void RefundControl::SetListenPort(int port)
{
m_port = port;
}
// 同步模式
void RefundControl::run()
{
m_procOrderSocket = new BillSocket(this);
m_tcpServer = new QTcpServer(this);
if(!m_tcpServer->listen(QHostAddress::LocalHost, m_port))
{
QLOG_WARN() << QString("tcp server listen failed on port[%1]").arg(m_port);
return;
}
m_bContinue = true;
QByteArray recvData;
QString replyData;
QJsonParseError jsonError;
QJsonDocument jsonDoc;
while(m_bContinue)
{
if(!m_tcpServer->waitForNewConnection(60000))
{
continue;
}
QLOG_INFO() << "onNewConnecion.....";
QString error;
QString orderId, reason; int version, reqtype;
m_tcpSocket = m_tcpServer->nextPendingConnection();
if(!m_tcpSocket->waitForReadyRead())
{
m_tcpSocket->close();
continue;
}
recvData = m_tcpSocket->readAll();
QLOG_INFO() << QString("recv data.[%1]").arg(QString(recvData));
jsonDoc = QJsonDocument::fromJson(recvData, &jsonError);
if(jsonError.error == QJsonParseError::NoError)
{
QJsonObject jsonObject = jsonDoc.object();
version = jsonObject["ver"].toInt();
reqtype = jsonObject["reqtype"].toInt();
orderId = jsonObject["order_id"].toString();
reason = jsonObject["reason"].toString();
if(version == 1)
{
if(reqtype == 17)
{
QString httpError;
bool httpResult;
QJsonObject httpSendJson;
QJsonObject httpRecvJson;
httpSendJson = DataManger::GetInstance().GetRefundOrderData(reason,orderId);
QLOG_INFO() << QString("[---refund order---]. [requestData:%1]")
.arg(QString(QJsonDocument(httpSendJson).toJson(QJsonDocument::Compact).replace("\"","")));
httpResult = m_procOrderSocket->Request(httpSendJson, httpRecvJson, httpError);
QLOG_INFO() << QString("refund order finsh. [result:%1][msg:%2][recvData:%3]")
.arg(httpResult).arg(httpError)
.arg(QString(QJsonDocument(httpRecvJson).toJson(QJsonDocument::Compact).replace("\"","")));
if(httpResult)
{
if(100 == httpRecvJson["status"].toInt())
{
replyData = QString("{\"ver\":1, \"order_id\":\"%1\", \"statusCode\":100, \"msg\":\"\"}").arg(orderId);
m_tcpSocket->write(replyData.toUtf8());
m_tcpSocket->waitForBytesWritten();
m_tcpSocket->close();
continue;
}else
{
error = httpRecvJson["msg"].toString();
}
}else
{
error = httpError;
}
}else
{
error = QString("undefine reqtype [%1]").arg(reqtype);
}
}else
{
error = QString("wrong version, current[%1] right[1]").arg(version);
}
}else
{
error = "invalid data";
}
// 发生错误
replyData = QString("{\"ver\":1, \"order_id\":\"%1\", \"statusCode\":101, \"msg\":\"%2\"}").arg(orderId).arg(error);
m_tcpSocket->write(replyData.toUtf8());
m_tcpSocket->waitForBytesWritten();
m_tcpSocket->close();
continue;
}
QLOG_INFO() << "refundControl exit.";
}
/********************
* 同意订单退款控制
* *****************/
#ifndef REFUNDCONTROL_H
#define REFUNDCONTROL_H
#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include "Network/billSocket.h"
class RefundControl : public QObject
{
public:
static RefundControl& GetInstance();
void SetListenPort(int port);
private:
RefundControl(){}
RefundControl(RefundControl const&);
RefundControl& operator=(RefundControl const&);
QTcpServer *m_tcpServer;
QTcpSocket *m_tcpSocket;
int m_port;
bool m_bContinue;
BillSocket *m_procOrderSocket;
public slots:
/* 功能:开启控制器
* 参数:NULL
* 返回:NULL
* */
void run();
};
#endif // REFUNDCONTROL_H
......@@ -20,23 +20,22 @@ void SInfoControl::run()
if(!m_tcpServer->listen(QHostAddress::LocalHost, m_port))
{
QLOG_WARN() << QString("SInfoControl listen failed on port[%1]").arg(m_port);
emit listenFailed(QString("绑定端口[%1]失败!").arg(m_port));
QLOG_ERROR() << QString("SInfoControl listen failed on port[%1]").arg(m_port);
return;
}
m_bContinue = true;
QByteArray recvData;
QString replyData;
QJsonParseError jsonError;
QJsonDocument jsonDoc;
while(m_bContinue)
while(true)
{
if(!m_tcpServer->waitForNewConnection(60000))
{
continue;
}
QLOG_INFO() << "onNewConnecion.....";
QLOG_INFO() << "onNewConnecion come.....";
QString error;
QString fm_cmd, fm_ver, operator_id, pos_id, store_id, business_date;
QJsonObject store_info;
......
......@@ -21,7 +21,6 @@ private:
QTcpServer *m_tcpServer;
QTcpSocket *m_tcpSocket;
int m_port;
bool m_bContinue;
public slots:
/* 功能:开启控制器
......@@ -31,6 +30,12 @@ public slots:
void run();
signals:
/* 功能:通知主界面监听失败
* 参数:[1]失败信息
* 返回:NULL
* */
void listenFailed(const QString& error);
/* 功能:通知获取到门店信息
* 参数:[1]操作员ID[2]POS机ID
* [3]门店ID[4]营业日
......
......@@ -12,9 +12,6 @@ DbsetForm::DbsetForm(QWidget *parent) :
_Init();
connect(this, &DbsetForm::connectDb, &FlowControl::GetInstance(), &FlowControl::onConnectDb);
connect(&FlowControl::GetInstance(), &FlowControl::connectDbFinsh, this, &DbsetForm::onConnectDbFinsh);
on_dbsetBtnOk_clicked();
}
......
......@@ -37,7 +37,6 @@ SOURCES += main.cpp\
settingForm.cpp \
floatForm.cpp \
detailForm.cpp \
Control/refundControl.cpp \
Control/sinfoControl.cpp
HEADERS += \
......@@ -59,7 +58,6 @@ HEADERS += \
settingForm.h \
floatForm.h \
detailForm.h \
Control/refundControl.h \
Control/sinfoControl.h
FORMS += mainForm.ui \
......
......@@ -7,7 +7,6 @@
#include "preDefine.h"
#include "dbsetForm.h"
#include "Control/flowControl.h"
#include "Control/refundControl.h"
#include "Control/sinfoControl.h"
#include "floatForm.h"
#include "DTools/configManger.h"
......@@ -66,15 +65,6 @@ int main(int argc, char *argv[])
FlowControl::GetInstance().moveToThread(&workThread);
workThread.start();
// 将门店信息获取控制器移到工作线程
QThread sInfoThread;
SInfoControl::GetInstance().SetListenPort(ConfigManger::GetInstance().GetTcpServerPort());
SInfoControl::GetInstance().moveToThread(&sInfoThread);
QObject::connect(&sInfoThread, &QThread::started, &SInfoControl::GetInstance(), &SInfoControl::run);
sInfoThread.start();
QObject::connect(&SInfoControl::GetInstance(), &SInfoControl::getNewStoreInfo, &FlowControl::GetInstance(), &FlowControl::onGetNewStoreInfo);
FloatForm f;
MainForm w;
QObject::connect(&w, &MainForm::showFloatForm, &f, &FloatForm::onShow);
......@@ -83,5 +73,13 @@ int main(int argc, char *argv[])
QObject::connect(&f, &FloatForm::showMainForm, &w, &MainForm::show);
w.MyShow();
// 将门店信息获取控制器移到工作线程
QThread sInfoThread;
SInfoControl::GetInstance().SetListenPort(ConfigManger::GetInstance().GetTcpServerPort());
SInfoControl::GetInstance().moveToThread(&sInfoThread);
QObject::connect(&sInfoThread, &QThread::started, &SInfoControl::GetInstance(), &SInfoControl::run);
QObject::connect(&SInfoControl::GetInstance(), &SInfoControl::getNewStoreInfo, &FlowControl::GetInstance(), &FlowControl::onGetNewStoreInfo);
sInfoThread.start();
return a.exec();
}
......@@ -32,9 +32,7 @@ MainForm::MainForm(QWidget *parent) :
// 连接信号槽
connect(&m_timeTimer, &QTimer::timeout, this, &MainForm::onSetCurrentTime);
connect(this, &MainForm::flowStart, &FlowControl::GetInstance(), &FlowControl::onFlowStart);
connect(this, &MainForm::processOrder, &FlowControl::GetInstance(), &FlowControl::onProcessOrder);
connect(this, &MainForm::getOnDutyCashiers, &FlowControl::GetInstance(), &FlowControl::onGetOnDutyCashiers);
connect(this, &MainForm::getOrderDetails, &FlowControl::GetInstance(), &FlowControl::onGetOrderDetails);
connect(&FlowControl::GetInstance(), &FlowControl::hideAlert, this, &MainForm::onHideAlert);
connect(&FlowControl::GetInstance(), &FlowControl::showAlert, this, &MainForm::onShowAlert);
......@@ -44,7 +42,6 @@ MainForm::MainForm(QWidget *parent) :
connect(&FlowControl::GetInstance(), &FlowControl::setCashierInfo, this, &MainForm::onSetCashierInfo);
connect(&FlowControl::GetInstance(), &FlowControl::changeOrderStatus, this, &MainForm::onChangeOrderStatus);
connect(&FlowControl::GetInstance(), &FlowControl::showDeliverPickForm, this, &MainForm::onShowDeliverPickForm);
connect(&FlowControl::GetInstance(), &FlowControl::showCashierPickForm, this, &MainForm::onShowCashierPickForm);
connect(&FlowControl::GetInstance(), &FlowControl::showOrderDetails, this, &MainForm::onShowOrderDetails);
// 初始化界面
......@@ -67,13 +64,11 @@ void MainForm::MyShow()
m_alertForm = new AlertForm(this);
m_pickForm = new PickForm(this);
connect(m_pickForm, &PickForm::updateCashier, this, &MainForm::onUpdateCashier);
m_settingForm = new SettingForm(this);
m_detailForm = new DetailForm(this);
emit flowStart();
return;
}
......@@ -144,11 +139,6 @@ void MainForm::onMainProcBtnClicked()
emit processOrder(pBtn->property("operation").toString(), pBtn->property("orderId").toString(), DeliverObject());
}
void MainForm::on_mainBtnCashier_clicked()
{
emit getOnDutyCashiers();
}
void MainForm::on_mainBtnSet_clicked()
{
m_settingForm->show();
......@@ -160,11 +150,6 @@ void MainForm::on_mainBtnHide_clicked()
showFloatForm();
}
void MainForm::onUpdateCashier(const CashierObject &cashier)
{
//ui->mainBtnCashier->setText(cashier.name);
}
void MainForm::onShowOrderDetails(OrderObject *orderObject)
{
m_detailForm->InitData(orderObject);
......@@ -333,12 +318,6 @@ void MainForm::onShowDeliverPickForm(const QString &orderId, const QList<Deliver
m_pickForm->show();
}
void MainForm::onShowCashierPickForm(const QList<CashierObject> &cashiers)
{
m_pickForm->SetCashiersInfo(cashiers);
m_pickForm->show();
}
void MainForm::on_mainBtnUp_clicked()
{
m_currentTable->scrollToTop();
......
......@@ -70,21 +70,11 @@ private:
QPushButton *_GetTabBtnByOrderStatus(int orderStatus);
signals:
/* 功能:开启流程控制器
* 参数:NULL
* 返回:NULL
* */
void flowStart();
/* 功能:处理订单
* 参数:[1]操作动作名[2]订单编号[3]配送员信息
* 返回:NULL
* */
void processOrder(const QString& operation, const QString& orderId, const DeliverObject& deliverObj);
/* 功能:获取在班收银员
* 参数:NULL
* 返回:NULL
* */
void getOnDutyCashiers();
/* 功能:通知悬浮窗显示
* 参数:NULL
* 返回:NULL
......@@ -128,11 +118,6 @@ private slots:
* 返回:NULL
* */
void onMainProcBtnClicked();
/* 功能:选择收银员按钮对应动作
* 参数:NULL
* 返回:NULL
* */
void on_mainBtnCashier_clicked();
/* 功能:设置按钮对应动作
* 参数:NULL
* 返回:NULL
......@@ -200,16 +185,6 @@ public slots:
* 返回:NULL
* */
void onShowDeliverPickForm(const QString& orderId, const QList<DeliverObject>& delivers);
/* 功能:显示收银员选择窗口
* 参数:[1]收银员信息
* 返回:NULL
* */
void onShowCashierPickForm(const QList<CashierObject>& cashiers);
/* 功能:更新收银员信息
* 参数:NULL
* 返回:NULL
* */
void onUpdateCashier(const CashierObject& cashier);
/* 功能:显示订单详情
* 参数:NULL
* 返回:NULL
......
......@@ -1381,7 +1381,7 @@
<item>
<widget class="QLabel" name="mainLabOpeStatus">
<property name="text">
<string>正常</string>
<string/>
</property>
</widget>
</item>
......
......@@ -18,7 +18,6 @@ PickForm::PickForm(QWidget *parent) :
connect(btn, &QPushButton::toggled, this, &PickForm::onNumBtnToggled);
}
connect(this, &PickForm::processOrder, &FlowControl::GetInstance(), &FlowControl::onProcessOrder);
connect(this, &PickForm::updateCashier, &FlowControl::GetInstance(), &FlowControl::onUpdateCashier);
_Init();
}
......
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