Commit 26d61fae by NitefullWind

1. 实现支付。

parent 607a96ba
......@@ -167,6 +167,7 @@ inline QSharedPointer<StoreInfo> GetLastStoreInfo()
odb::transaction t (DBSP()->begin ());
StoreInfo_last storeInfo = DBSP()->query_value<StoreInfo_last>();
storeInfoP->setId(storeInfo._id);
storeInfoP->setStoreId(storeInfo._storeId);
storeInfoP->setPosId(storeInfo._posId);
storeInfoP->setBusinessDate(storeInfo._businessDate);
......@@ -174,6 +175,7 @@ inline QSharedPointer<StoreInfo> GetLastStoreInfo()
t.commit ();
} catch (const odb::exception &e) {
storeInfoP.clear();
qDebug() << "Exception: Get last store info: " << e.what();
}
return storeInfoP;
......
......@@ -123,7 +123,12 @@ void Order::setRefunded(bool refunded)
_refunded = refunded;
}
PayList Order::payList() const
PayList &Order::payList()
{
return _payList;
}
const PayList &Order::payList() const
{
return _payList;
}
......@@ -133,7 +138,12 @@ void Order::setPayList(const PayList &payList)
_payList = payList;
}
QLazySharedPointer<StoreInfo> Order::storeInfo() const
QLazySharedPointer<StoreInfo> &Order::storeInfo()
{
return _storeInfo;
}
const QLazySharedPointer<StoreInfo> &Order::storeInfo() const
{
return _storeInfo;
}
......
......@@ -13,7 +13,7 @@
#include <odb/qt/lazy-ptr.hxx>
#define DB_VERSION_BASE 1
#define DB_VERSION_CURRENT 10
#define DB_VERSION_CURRENT 12
#pragma db model version(DB_VERSION_BASE, DB_VERSION_CURRENT)
namespace DB {
......@@ -79,10 +79,12 @@ public:
bool refunded() const;
void setRefunded(bool refunded);
PayList payList() const;
PayList &payList();
const PayList &payList() const;
void setPayList(const PayList &payList);
QLazySharedPointer<StoreInfo> storeInfo() const;
QLazySharedPointer<StoreInfo> &storeInfo();
const QLazySharedPointer<StoreInfo> &storeInfo() const;
void setStoreInfo(const QLazySharedPointer<StoreInfo> &storeInfo);
unsigned long id() const;
......@@ -112,8 +114,6 @@ private:
#pragma db not_null
QLazySharedPointer<StoreInfo> _storeInfo;
QString _testCol;
};
//! Pay
......@@ -218,6 +218,8 @@ private:
query((?) + "order by id desc limit 0,1")
struct StoreInfo_last
{
#pragma db column(StoreInfo::_id)
unsigned long _id;
#pragma db column(StoreInfo::_storeId)
QString _storeId;
#pragma db column(StoreInfo::_posId)
......
<changelog xmlns="http://www.codesynthesis.com/xmlns/odb/changelog" database="sqlite" version="1">
<changeset version="10"/>
<changeset version="12"/>
<changeset version="11"/>
<changeset version="10">
<alter-table name="Order">
<drop-column name="testCol"/>
</alter-table>
</changeset>
<changeset version="9"/>
......
......@@ -118,6 +118,10 @@ bool FMTask::sendToServer(bool isShowMsg)
QByteArray data = json.toJson(QJsonDocument::Compact);
url = FMPVipSettings::instance()->getServerUrl() + "/" + ReqUrl.at(FM_Type());
#ifdef FM_DEBUG
url = "http://127.0.0.1:5000/vip/" + ReqUrl.at(FM_Type());
#endif
QByteArray rspData;
FMNetwork net;
......
......@@ -19,9 +19,11 @@ void TaskLogin::packagePOSReq()
QString msg;
if(storeInfo == nullptr) {
msg = QString::fromLocal8Bit("未设置营业信息,不能进行会员认证");
FMP_ERROR() << msg;
setError(FM_API_ERROR, msg);
return;
}
posReqJsonObj[PosProps.StoreId] = storeInfo->storeId();
posReqJsonObj[PosProps.PosId] = storeInfo->posId();
posReqJsonObj[PosProps.BusinessDate] = storeInfo->businessDate();
......
......@@ -4,64 +4,92 @@
#include "fmp_logger_i.h"
#include "fmp_vip_settings.h"
#include "fmnetwork.h"
//#include "dbop.h"
//#include "items/order.h"
//#include "items/pay.h"
//#include "items/storeinfo.h"
#include "database.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QCryptographicHash>
//using namespace FMItem;
using namespace DB;
TaskPay::TaskPay(QJsonObject &jsonObj, Session *session, QObject *parent)
:FMTask(jsonObj, FM_Pay, session, parent)
// , _order(new Order(this))
, _order(new Order())
{
}
TaskPay::~TaskPay()
{
// delete _order;
}
void TaskPay::packagePOSReq()
{
// FMItem::StoreInfo storeInfo;
// bool isOk = DBOP::GetLastItem(&storeInfo);
// if(!isOk) {
// QString info = QString::fromLocal8Bit("未设置门店信息,不能再进行支付.");
// FMP_WARN() << info;
// setError(FM_API_ERROR, info);
// return;
// }
// posReqJsonObj = storeInfo.toJson(QStringList(), posReqJsonObj);
// // 检查订单是否已结算
// QString orderId = getPosJsonValue(PosProps.OrderId).toString();
// DBOP::GetOrderByOrderId(orderId, _order);
// if(_order->settled()) {
// QString info = QString::fromLocal8Bit("订单已结算,不能再进行支付.");
// FMP_WARN() << info;
// setError(FM_API_ERROR, info);
// return;
// }
// QString fm_open_id_pos = getPosJsonValue(PosProps.Fm_open_id).toString();
// QString fm_open_id_session = session()->data(PosProps.Fm_open_id).toString();
// if(fm_open_id_session == "" || fm_open_id_pos!=fm_open_id_session || session()->data(PosProps.CanPay).toBool() == false) {
// preTask = new TaskLogin(posReqJsonObj, _session, this);
// preTask->session()->addData(PosProps.FM_Type, FM_Pay);
// preTask->doTask();
// if(preTask->error() != FM_API_SUCCESS) {
// this->setError(preTask->error(), preTask->errorString());
// }
// this->_session = preTask->session();
// }
// session()->addData(PosProps.OrderAmount, getPosJsonValue(PosProps.OrderAmount).toInt());
// session()->addData(PosProps.TransAmount, getPosJsonValue(PosProps.TransAmount).toInt());
// session()->addData(PosProps.UndisAmount, getPosJsonValue(PosProps.UndisAmount).toInt());
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;
}
QString fm_open_id_pos = getPosJsonValue(PosProps.Fm_open_id).toString();
QString fm_open_id_session = session()->data(PosProps.Fm_open_id).toString();
if(fm_open_id_session == "" || fm_open_id_pos!=fm_open_id_session || session()->data(PosProps.CanPay).toBool() == false) {
preTask = new TaskLogin(posReqJsonObj, _session, this);
preTask->session()->addData(PosProps.FM_Type, FM_Pay);
preTask->doTask();
if(preTask->error() != FM_API_SUCCESS) {
this->setError(preTask->error(), preTask->errorString());
}
this->_session = preTask->session();
}
session()->addData(PosProps.OrderAmount, getPosJsonValue(PosProps.OrderAmount).toInt());
session()->addData(PosProps.TransAmount, getPosJsonValue(PosProps.TransAmount).toInt());
session()->addData(PosProps.UndisAmount, getPosJsonValue(PosProps.UndisAmount).toInt());
//! FIXME 启用couponThread线程后,网络异常时setError函数崩溃
// couponThread = new TaskCouponThread(posReqJsonObj, _session, this);
......@@ -182,72 +210,83 @@ void TaskPay::packageServerReq()
void TaskPay::packagePOSRsp()
{
// int status = getServerJsonValue(PosProps.StatusCode).toInt();
// QString orderId = getPosJsonValue(PosProps.OrderId).toString();
// QString transId = getPosJsonValue(PosProps.TransId).toString();
// QString fm_order_id = getServerJsonValue(PosProps.Fm_order_id).toString();
// QString fm_open_id = session()->data(PosProps.Fm_open_id).toString();
int status = getServerJsonValue(PosProps.StatusCode).toInt();
QString orderId = getPosJsonValue(PosProps.OrderId).toString();
QString transId = getPosJsonValue(PosProps.TransId).toString();
QString fm_order_id = getServerJsonValue(PosProps.Fm_order_id).toString();
QString fm_open_id = session()->data(PosProps.Fm_open_id).toString();
// bool isOk = (status == FM_API_SUCCESS);
bool isOk = (status == FM_API_SUCCESS);
// posRspJsonObj[PosProps.StatusCode] = status;
// posRspJsonObj[PosProps.Msg] = getServerJsonValue(PosProps.Msg);
// posRspJsonObj[PosProps.Fm_open_id] = fm_open_id;
// posRspJsonObj[PosProps.Fm_order_id] = fm_order_id;
// posRspJsonObj[PosProps.Fm_trans_id] = fm_order_id;
posRspJsonObj[PosProps.StatusCode] = status;
posRspJsonObj[PosProps.Msg] = getServerJsonValue(PosProps.Msg);
posRspJsonObj[PosProps.Fm_open_id] = fm_open_id;
posRspJsonObj[PosProps.Fm_order_id] = fm_order_id;
posRspJsonObj[PosProps.Fm_trans_id] = fm_order_id;
// // 如果订单是新的,则保存在数据库中
// if(isOk && _order->isNew()) {
// _order->SetPropertiesByJson(posReqJsonObj);
// _order->SetPropertiesByJson(posRspJsonObj);
// FMItem::StoreInfo storeInfo;
// DBOP::GetLastItem(&storeInfo);
// _order->setStoreInfoDBID(storeInfo.DBID());
// isOk = DBOP::Save(_order);
// }
// QJsonArray servPayArray = getServerJsonValue("payList").toArray();
// //支付方式描述
// QMap<QString, QString> description;
// description["20001"] = QString::fromLocal8Bit("会员储值金支付");
// description["20002"] = QString::fromLocal8Bit("会员积分支付");
// description["20003"] = QString::fromLocal8Bit("代金券支付");
// description["20004"] = QString::fromLocal8Bit("商品券支付");
// description["20005"] = QString::fromLocal8Bit("现金支付");
// //计算总支付额
// QJsonArray pay_ids;
// int totalPaid = 0;
// for(int i = 0; i < servPayArray.size(); i++)
// {
// QJsonObject pay_id;
// int amount = servPayArray[i].toObject()[ServerProps(PosProps.Pay_amount)].toInt();
// pay_id[PosProps.Pay_id] = servPayArray[i].toObject()[ServerProps(PosProps.Pay_id)].toString();
// pay_id[PosProps.Pay_str] = description[servPayArray[i].toObject()["typeModeFlag"].toString()];
// pay_id[PosProps.Pay_amount] = amount;
// pay_id[PosProps.Coupon_code] = servPayArray[i].toObject()[ServerProps(PosProps.Coupon_code)].toString();
// pay_ids.push_back(pay_id);
// totalPaid += pay_id[PosProps.Pay_amount].toInt();
// if(isOk && amount!=0) {
// Pay *pay = new Pay();
// pay->SetPropertiesByJson(pay_id);
// pay->setTransId(transId);
// pay->setOrderDBID(_order->DBID());
// pay->setAccount(fm_open_id);
// pay->setFmTransId(transId);
// DBOP::Save(pay);
// _order->setPaidAmount(_order->paidAmount()+amount);
// DBOP::Save(_order);
// delete pay;
// }
// }
// posRspJsonObj[PosProps.PaidAmount] = totalPaid;
// posRspJsonObj[PosProps.Pay_list] = pay_ids;
// posRspJsonObj[PosProps.DisAmount] = 0;
if(isOk) {
_order->setFmOrderId(getServerJsonValue(PosProps.Fm_order_id).toString());
_order->setFmOpenId(fm_open_id);
}
QJsonArray servPayArray = getServerJsonValue(PosProps.Pay_list).toArray();
//支付方式描述
QMap<QString, QString> description;
description["20001"] = QString::fromLocal8Bit("会员储值金支付");
description["20002"] = QString::fromLocal8Bit("会员积分支付");
description["20003"] = QString::fromLocal8Bit("代金券支付");
description["20004"] = QString::fromLocal8Bit("商品券支付");
description["20005"] = QString::fromLocal8Bit("现金支付");
try {
// _transactionPay.reset(DBSP()->begin());
transaction t(DBSP()->begin());
//计算总支付额
QJsonArray pay_ids;
int totalPaid = 0;
for(int i = 0; i < servPayArray.size(); i++)
{
QJsonObject pay_id;
int amount = servPayArray[i].toObject()[ServerProps(PosProps.Pay_amount)].toInt();
pay_id[PosProps.Pay_id] = servPayArray[i].toObject()[ServerProps(PosProps.Pay_id)].toString();
pay_id[PosProps.Pay_str] = description[servPayArray[i].toObject()["typeModeFlag"].toString()];
pay_id[PosProps.Pay_amount] = amount;
pay_id[PosProps.Coupon_code] = servPayArray[i].toObject()[ServerProps(PosProps.Coupon_code)].toString();
pay_ids.push_back(pay_id);
totalPaid += pay_id[PosProps.Pay_amount].toInt();
if(isOk && amount!=0) {
QSharedPointer<Pay> pay(new Pay());
pay->setTransId(transId);
pay->setAccount(fm_open_id);
pay->setFmTransId(transId);
pay->setPayId(pay_id[PosProps.Pay_id].toString());
pay->setPayStr(pay_id[PosProps.Pay_str].toString());
pay->setPayAmount(pay_id[PosProps.Pay_amount].toInt());
pay->setDisAmount(pay_id[PosProps.DisAmount].toInt());
pay->setOrder(_order);
DBSP()->persist(pay);
_order->setPaidAmount(_order->paidAmount()+amount);
}
}
posRspJsonObj[PosProps.PaidAmount] = totalPaid;
posRspJsonObj[PosProps.Pay_list] = pay_ids;
posRspJsonObj[PosProps.DisAmount] = 0;
DBSP()->persist(_order);
t.commit();
// _transactionPay.commit();
} catch (const odb::exception &e) {
QString info = QString::fromLocal8Bit("保存订单信息失败");
setError(FM_API_ERROR, info);
FMP_ERROR() << info << e.what();
}
}
void TaskPay::onPay()
......
......@@ -2,14 +2,11 @@
#define TASKPAY_H
#include "fmtask.h"
#include "taskothers.h"
#include "database.h"
#include <QThread>
class TaskCouponThread;
//namespace FMItem {
// class Order;
//}
class TaskPay : public FMTask
{
Q_OBJECT
......@@ -28,7 +25,8 @@ private slots:
private:
TaskCouponThread *couponThread;
// FMItem::Order *_order;
QSharedPointer<DB::Order> _order;
// odb::transaction _transactionPay;
};
// 加载代金券的线程类
......
TEMPLATE = subdirs
SUBDIRS += \
# testplugin \
testplugin \
autotest
CONFIG += ordered
......@@ -5,7 +5,7 @@
#define VER_MINOR 1
#define VER_REVISION 0
#define VER_BUILD 39
#define VER_BUILD 42
//! 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