Commit a77fbb94 by NitefullWind

1. 实现订单结算。

parent 26d61fae
...@@ -4,141 +4,180 @@ ...@@ -4,141 +4,180 @@
#include "fmp_logger_i.h" #include "fmp_logger_i.h"
#include "fmmsgwnd.h" #include "fmmsgwnd.h"
#include "fmp_vip_settings.h" #include "fmp_vip_settings.h"
//#include "dbop.h"
//#include "items/order.h"
//#include "items/pay.h"
//#include "items/storeinfo.h"
#include <QDateTime> #include <QDateTime>
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonArray> #include <QJsonArray>
#include <QCryptographicHash> #include <QCryptographicHash>
using namespace DB;
TaskFinal::TaskFinal(QJsonObject &jsonObj, Session *session, QObject *parent) TaskFinal::TaskFinal(QJsonObject &jsonObj, Session *session, QObject *parent)
:FMTaskNoWnd(jsonObj, FM_Final, session, parent) :FMTaskNoWnd(jsonObj, FM_Final, session, parent)
// ,_order(new FMItem::Order(this)) ,_order(new Order())
,isUseVipPay(false) ,isUseVipPay(false)
{ {
} }
TaskFinal::~TaskFinal() TaskFinal::~TaskFinal()
{ {
// delete _order;
} }
void TaskFinal::packagePOSReq() void TaskFinal::packagePOSReq()
{ {
// FMItem::StoreInfo storeInfo; QSharedPointer<StoreInfo> storeInfo = GetLastStoreInfo();
// bool isOk = DBOP::GetLastItem(&storeInfo); if(storeInfo == nullptr) {
// if(isOk) { QString info = QString::fromLocal8Bit("未设置门店信息,不能进行支付.");
// posReqJsonObj = storeInfo.toJson(QStringList(), posReqJsonObj); setError(FM_API_ERROR, info);
// _order->setStoreInfoDBID(storeInfo.DBID()); return;
// } else { }
// QString info = QString::fromLocal8Bit("未设置门店信息,不能进行结算.");
// FMP_WARN() << info; posReqJsonObj[PosProps.StoreId] = storeInfo->storeId();
// setError(FM_API_ERROR, info); posReqJsonObj[PosProps.PosId] = storeInfo->posId();
// return; posReqJsonObj[PosProps.BusinessDate] = storeInfo->businessDate();
// } posReqJsonObj[PosProps.OperatorId] = storeInfo->operatorId();
// QString orderId = getPosJsonValue(PosProps.OrderId).toString(); QString orderId = getPosJsonValue(PosProps.OrderId).toString();
// DBOP::GetOrderByOrderId(orderId, _order);
try {
// if(_order->isNew()) { // _transactionPay.reset(DBSP()->begin());
// _order->SetPropertiesByJson(posReqJsonObj); transaction t(DBSP()->begin());
// DBOP::Save(_order); // 检查订单是否已存在
// } else if(_order->settled()) { odb::result<Order> r = DBSP()->query<Order>(query<Order>::orderId == orderId);
// QString info = QString::fromLocal8Bit("订单已结算,不能重复结算.");
// FMP_WARN() << info; if(r.empty()) {
// setError(FM_API_ERROR, info); _order->setStoreInfo(storeInfo);
// }
_order->setOrderId(getPosJsonValue(PosProps.OrderId).toString());
_order->setOrderAmount(getPosJsonValue(PosProps.OrderAmount).toInt());
_order->setUndisAmount(getPosJsonValue(PosProps.UndisAmount).toInt());
QJsonObject productObj = getPosJsonValue(PosProps.Products).toObject();
QString productText = QJsonDocument(productObj).toJson(QJsonDocument::Compact);
_order->setProductText(productText);
DBSP()->persist(_order);
t.commit();
} else {
_order = DBSP()->load<Order>(r.begin()->id());
// 检查订单是否已结算
if(_order->settled()) {
QString info = QString::fromLocal8Bit("订单已结算,不能重复结算.");
FMP_ERROR() << info;
setError(FM_API_ERROR, info);
return;
}
}
} catch (const odb::exception &e) {
QString info = QString::fromLocal8Bit("查询订单时异常:%1").arg(e.what());
FMP_ERROR() << info;
setError(FM_API_ERROR, info);
return;
}
} }
void TaskFinal::packageServerReq() void TaskFinal::packageServerReq()
{ {
// QMap<QString, QString> key2proMap; QJsonObject dataObj;
// QStringList keys; dataObj[ServerProps(PosProps.Fm_order_id)] = _order->fmOrderId();
// QJsonObject dataObj; dataObj[ServerProps(PosProps.Fm_open_id)] = _order->fmOpenId();
// keys << PosProps.Fm_open_id << PosProps.OrderAmount << PosProps.PaidAmount << PosProps.Fm_order_id << PosProps.TransId; dataObj[ServerProps(PosProps.OrderAmount)] = _order->orderAmount();
// key2proMap.clear(); dataObj[ServerProps(PosProps.PaidAmount)] = _order->paidAmount();
// foreach (QString key, keys) { dataObj[ServerProps(PosProps.TransId)] = getPosJsonValue(PosProps.OrderId);
// key2proMap[ServerProps(key)] = key;
// } try {
// dataObj = _order->toJson(key2proMap, dataObj); transaction t(DBSP()->begin());
// dataObj[ServerProps(PosProps.TransId)] = getPosJsonValue(PosProps.OrderId);
QSharedPointer<StoreInfo> storeInfo = _order->storeInfo().load();
// FMItem::StoreInfo storeInfo; dataObj[ServerProps(PosProps.StoreId)] = storeInfo->storeId();
// bool isOk = DBOP::GetItemByDBID(_order->storeInfoDBID(), &storeInfo); dataObj[ServerProps(PosProps.PosId)] = storeInfo->posId();
// if(isOk) { dataObj[ServerProps(PosProps.BusinessDate)] = storeInfo->businessDate();
// dataObj[ServerProps(PosProps.BussinessDate)] = storeInfo.businessDate(); dataObj[ServerProps(PosProps.OperatorId)] = storeInfo->operatorId();
// }
// Products
// // Products QString productText = _order->productText();
// QString productText = _order->productText(); QStringList proKeys;
// QStringList proKeys; proKeys << PosProps.ConsumeNum << PosProps.ProductId << PosProps.Price;
// proKeys << PosProps.ConsumeNum << PosProps.ProductId << PosProps.Price; foreach (const QString &proKey, proKeys) {
// foreach (const QString &proKey, proKeys) { productText = productText.replace(proKey, ServerProps(proKey));
// productText = productText.replace(proKey, ServerProps(proKey)); dataObj[ServerProps(PosProps.PaidAmount)] = _order->orderAmount();
// dataObj[ServerProps(PosProps.PaidAmount)] = _order->orderAmount(); }
// } QJsonArray proArray = QJsonDocument::fromJson(_order->productText().toUtf8()).array();
// QJsonArray proArray = QJsonDocument::fromJson(_order->productText().toUtf8()).array(); dataObj[ServerProps(PosProps.Products)] = proArray;
// dataObj[ServerProps(PosProps.Products)] = proArray;
// QJsonArray proArray = QJsonDocument::fromJson(_order->productText().toUtf8()).array();
//// QJsonArray proArray = QJsonDocument::fromJson(_order->productText().toUtf8()).array(); // foreach (QJsonValue proValue, proArray) {
//// foreach (QJsonValue proValue, proArray) { // QJsonObject proObj;
//// QJsonObject proObj; // QStringList proKeys;
//// QStringList proKeys; // proKeys << PosProps.ConsumeNum << PosProps.ProductId << PosProps.Price;
//// proKeys << PosProps.ConsumeNum << PosProps.ProductId << PosProps.Price; // foreach (const QString &proKey, proKeys) {
//// foreach (const QString &proKey, proKeys) { // proObj[ServerProps(proKey)] = proValue.toObject()[proKey];
//// proObj[ServerProps(proKey)] = proValue.toObject()[proKey]; // }
//// }
// }
//// }
// 将POS新传的支付方式加入已付到金额中
// // 从数据库读取支付信息 foreach (QJsonValue payValue, getPosJsonValue(PosProps.Pay_list).toArray()) {
// QList<QSharedPointer<FMItem::Pay> > payList = DBOP::GetPaysByOrderDBId(_order->DBID()); QJsonObject pay_id = payValue.toObject();
QSharedPointer<Pay> payPointer(new Pay());
// // 将POS新传的支付方式加入已付到金额中 payPointer->setPayId(pay_id[PosProps.Pay_id].toString());
// foreach (QJsonValue payValue, getPosJsonValue(PosProps.Pay_list).toArray()) { if(payPointer->payId() == "20001" || payPointer->payId() == "10001" || payPointer->payId() == "10004") {
// QJsonObject pay_id = payValue.toObject(); FMP_WARN() << QString::fromLocal8Bit("POS无需传会员支付和非码支付信息.");
// QSharedPointer<FMItem::Pay> payPointer = QSharedPointer<FMItem::Pay>(new FMItem::Pay(this)); continue;
// payPointer->SetPropertiesByJson(pay_id); } else {
// payPointer->setOrderDBID(_order->DBID()); payPointer->setPayStr(pay_id[PosProps.Pay_str].toString());
// if(payPointer->payId() == "20001" || payPointer->payId() == "10001" || payPointer->payId() == "10004") { payPointer->setPayAmount(pay_id[PosProps.Pay_amount].toInt());
// FMP_WARN() << QString::fromLocal8Bit("POS无需传会员支付和非码支付信息."); payPointer->setDisAmount(pay_id[PosProps.DisAmount].toInt());
// continue; payPointer->setOrder(_order);
// } else {
// _order->setPaidAmount(_order->paidAmount() + payPointer->payAmount()); DBSP()->persist(payPointer);
// payList.append(payPointer);
// } _order->setPaidAmount(_order->paidAmount() + payPointer->payAmount());
// } }
}
// // 如果订单还未付完,默认以现金补全
// if(_order->orderAmount() > _order->paidAmount()) { // 如果订单还未付完,默认以现金补全
// QSharedPointer<FMItem::Pay> cashPay = QSharedPointer<FMItem::Pay>(new FMItem::Pay()); if(_order->orderAmount() > _order->paidAmount()) {
// cashPay->setPayId("20005"); QSharedPointer<Pay> cashPay(new Pay());
// cashPay->setPayStr(QString::fromLocal8Bit("现金支付(默认)")); cashPay->setPayId("20005");
// cashPay->setPayAmount(_order->orderAmount() - _order->paidAmount()); cashPay->setPayStr(QString::fromLocal8Bit("现金支付(默认)"));
// cashPay->setOrderDBID(_order->DBID()); cashPay->setPayAmount(_order->orderAmount() - _order->paidAmount());
// bool isOk = DBOP::Save(cashPay.data()); cashPay->setOrder(_order);
// if(isOk) {
// _order->setPaidAmount(_order->orderAmount()); DBSP()->persist(cashPay);
// payList.append(cashPay);
// } _order->setPaidAmount(_order->orderAmount());
// } }
// // 转成服务端需要的payArray DBSP()->persist(_order);
// QJsonArray payArray;
// for (QList<QSharedPointer<FMItem::Pay> >::const_iterator it = payList.constBegin(); it!=payList.constEnd(); it++) { // 从数据库读取支付信息
// QJsonObject payObj; PayList payList = _order->payList();
// payObj[ServerProps(PosProps.Amount)] = it->data()->payAmount();
// payObj[ServerProps(PosProps.TransId)] = it->data()->transId(); // 转成服务端需要的payArray
// payObj["thirdPayTransId"] = it->data()->fmTransId(); QJsonArray payArray;
// payObj["typeModeFlag"] = it->data()->payId(); for (PayList::const_iterator it = payList.constBegin(); it!=payList.constEnd(); it++) {
// payArray.append(payObj); QJsonObject payObj;
// } payObj[ServerProps(PosProps.Amount)] = it->load()->payAmount();
payObj[ServerProps(PosProps.TransId)] = it->load()->transId();
// dataObj[ServerProps(PosProps.Pay_list)] = payArray; payObj["thirdPayTransId"] = it->load()->fmTransId();
payObj["typeModeFlag"] = it->load()->payId();
// serverReqJsonObj["data"] = dataObj; payArray.append(payObj);
}
dataObj[ServerProps(PosProps.Pay_list)] = payArray;
t.commit();
} catch (const odb::exception &e) {
QString info = QString::fromLocal8Bit("保存订单信息时出错:").arg(e.what());
FMP_ERROR() << info;
qDebug() << info;
setError(FM_API_ERROR, info);
}
serverReqJsonObj["data"] = dataObj;
} }
bool TaskFinal::sendToServer(bool isShowMsg) bool TaskFinal::sendToServer(bool isShowMsg)
...@@ -171,21 +210,21 @@ bool TaskFinal::sendToServer(bool isShowMsg) ...@@ -171,21 +210,21 @@ bool TaskFinal::sendToServer(bool isShowMsg)
void TaskFinal::packagePOSRsp() void TaskFinal::packagePOSRsp()
{ {
// std::vector<QString> p; std::vector<QString> p;
// p.push_back(PosProps.StatusCode); p.push_back(PosProps.StatusCode);
// p.push_back(PosProps.Msg); p.push_back(PosProps.Msg);
// p.push_back(PosProps.Fm_order_id); p.push_back(PosProps.Fm_order_id);
// foreach(auto prop , p) foreach(auto prop , p)
// { {
// posRspJsonObj[prop] = getServerJsonValue(prop); posRspJsonObj[prop] = getServerJsonValue(prop);
// } }
// QJsonObject ext; QJsonObject ext;
// ext[PosProps.Print] = getServerJsonValue(PosProps.Print1); ext[PosProps.Print] = getServerJsonValue(PosProps.Print1);
// posRspJsonObj["ext"] = ext; posRspJsonObj["ext"] = ext;
// if(getServerJsonValue(PosProps.StatusCode).toInt() == FM_API_SUCCESS) { if(getServerJsonValue(PosProps.StatusCode).toInt() == FM_API_SUCCESS) {
// // 保存其它支付方式 // // 保存其它支付方式
// foreach(QJsonValue payVluae, getPosJsonValue(PosProps.Pay_list).toArray()) { // foreach(QJsonValue payVluae, getPosJsonValue(PosProps.Pay_list).toArray()) {
...@@ -200,10 +239,18 @@ void TaskFinal::packagePOSRsp() ...@@ -200,10 +239,18 @@ void TaskFinal::packagePOSRsp()
// } // }
// } // }
// _order->setFmOrderId(getServerJsonValue(PosProps.Fm_order_id).toString()); try {
// _order->setSettled(true); transaction t(DBSP()->begin());
// DBOP::Save(_order); _order->setFmOrderId(getServerJsonValue(PosProps.Fm_order_id).toString());
// } _order->setSettled(true);
DBSP()->update(_order);
t.commit();
} catch (const exception &e) {
QString info = QString::fromLocal8Bit("保存订单信息时出错:").arg(e.what());
FMP_ERROR() << info;
setError(FM_API_ERROR, info);
}
}
} }
QString TaskFinal::backup() QString TaskFinal::backup()
......
#ifndef TASKFINAL_H #ifndef TASKFINAL_H
#define TASKFINAL_H #define TASKFINAL_H
#include "fmtasknownd.h" #include "fmtasknownd.h"
#include "database.h"
//namespace FMItem {
//class Order;
//}
class TaskFinal : public FMTaskNoWnd class TaskFinal : public FMTaskNoWnd
{ {
...@@ -21,7 +18,7 @@ public: ...@@ -21,7 +18,7 @@ public:
private: private:
QString backup(); QString backup();
// FMItem::Order *_order; QSharedPointer<DB::Order> _order;
bool isUseVipPay; bool isUseVipPay;
}; };
......
...@@ -26,6 +26,22 @@ protected: ...@@ -26,6 +26,22 @@ protected:
} }
}; };
TEST_F(TestDBQuery, Load)
{
try {
transaction t(DBSP()->begin());
QSharedPointer<Order> order = DBSP()->load<Order>(1);
EXPECT_NE(order, nullptr);
order->storeInfo().load();
EXPECT_EQ(order->storeInfo()->storeId(), "fm9999");
} catch (const odb::exception &e) {
FAIL() << "Exception: " << e.what();
}
}
TEST_F(TestDBQuery, Query) TEST_F(TestDBQuery, Query)
{ {
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#define VER_MINOR 1 #define VER_MINOR 1
#define VER_REVISION 0 #define VER_REVISION 0
#define VER_BUILD 42 #define VER_BUILD 43
//! Convert version numbers to string //! Convert version numbers to string
#define _STR(S) #S #define _STR(S) #S
......
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