Commit a77fbb94 by NitefullWind

1. 实现订单结算。

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