Commit f0ce13d2 by NitefullWind

1. 实现保存支付插件的支付和退款信息到数据库。

parent 26425661
...@@ -68,6 +68,7 @@ bool DBOP::CreateTable(const QString &tableName) ...@@ -68,6 +68,7 @@ bool DBOP::CreateTable(const QString &tableName)
"[account] VARCHAR(50), " "[account] VARCHAR(50), "
"[trans_id] VARCHAR(50), " "[trans_id] VARCHAR(50), "
"[fm_trans_id] VARCHAR(50)," "[fm_trans_id] VARCHAR(50),"
"[third_trans_id] VARCHAR(50),"
"[orderDBID] INTEGER DEFAULT 0" "[orderDBID] INTEGER DEFAULT 0"
");"; ");";
QString tableStoreInfoSql = "CREATE TABLE [StoreInfo](" QString tableStoreInfoSql = "CREATE TABLE [StoreInfo]("
......
...@@ -50,7 +50,10 @@ SOURCES += \ ...@@ -50,7 +50,10 @@ SOURCES += \
$$PWD/database/fmp_database.cpp \ $$PWD/database/fmp_database.cpp \
$$PWD/task/tasksetstoreinfo.cpp \ $$PWD/task/tasksetstoreinfo.cpp \
$$PWD/items/storeinfo.cpp \ $$PWD/items/storeinfo.cpp \
$$PWD/windows/fmnumpad.cpp $$PWD/windows/fmnumpad.cpp \
$$PWD/task/taskqrpay.cpp \
$$PWD/task/fmtasksimple.cpp \
$$PWD/task/taskqrrefund.cpp
HEADERS +=\ HEADERS +=\
$$PWD/backup/fmbackup.h \ $$PWD/backup/fmbackup.h \
...@@ -91,7 +94,10 @@ HEADERS +=\ ...@@ -91,7 +94,10 @@ HEADERS +=\
$$PWD/database/fmp_database.h \ $$PWD/database/fmp_database.h \
$$PWD/task/tasksetstoreinfo.h \ $$PWD/task/tasksetstoreinfo.h \
$$PWD/items/storeinfo.h \ $$PWD/items/storeinfo.h \
$$PWD/windows/fmnumpad.h $$PWD/windows/fmnumpad.h \
$$PWD/task/taskqrpay.h \
$$PWD/task/fmtasksimple.h \
$$PWD/task/taskqrrefund.h
unix { unix {
target.path = /usr/lib target.path = /usr/lib
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#include "taskrefund.h" #include "taskrefund.h"
#include "taskfund.h" #include "taskfund.h"
#include "tasksetstoreinfo.h" #include "tasksetstoreinfo.h"
#include "taskqrpay.h"
#include "taskqrrefund.h"
#include <ctkPluginContext.h> #include <ctkPluginContext.h>
#undef StartService #undef StartService
#include <fmp_epay_i.h> #include <fmp_epay_i.h>
...@@ -74,9 +76,12 @@ void FMVipDispatcher::doTask(const QByteArray &reqData, QByteArray &rspData) ...@@ -74,9 +76,12 @@ void FMVipDispatcher::doTask(const QByteArray &reqData, QByteArray &rspData)
if (_ctx) { if (_ctx) {
ctkServiceReference ref =_ctx->getServiceReference<FMPePayInterface>(); ctkServiceReference ref =_ctx->getServiceReference<FMPePayInterface>();
FMPePayInterface *epay = _ctx->getService<FMPePayInterface>(ref); FMPePayInterface *epay = _ctx->getService<FMPePayInterface>(ref);
epay->DockPayRequest(reqData); // epay->DockPayRequest(reqData);
epay->StartService(); // epay->StartService();
rspData = epay->DockPayRespond(); // rspData = epay->DockPayRespond();
// epay->StopService();
TaskQRPay taskEPay(jsonObj, epay);
rspData = taskEPay.doTask();
} }
else { else {
rspData = QString::fromLocal8Bit("{\"msg:\":\"支付服务不可用\"}").toUtf8(); rspData = QString::fromLocal8Bit("{\"msg:\":\"支付服务不可用\"}").toUtf8();
...@@ -137,9 +142,12 @@ void FMVipDispatcher::doTask(const QByteArray &reqData, QByteArray &rspData) ...@@ -137,9 +142,12 @@ void FMVipDispatcher::doTask(const QByteArray &reqData, QByteArray &rspData)
if (_ctx) { if (_ctx) {
ctkServiceReference ref =_ctx->getServiceReference<FMPePayInterface>(); ctkServiceReference ref =_ctx->getServiceReference<FMPePayInterface>();
FMPePayInterface *epay = _ctx->getService<FMPePayInterface>(ref); FMPePayInterface *epay = _ctx->getService<FMPePayInterface>(ref);
epay->DockRefundRequest(reqData); // epay->DockRefundRequest(reqData);
epay->StartService(); // epay->StartService();
rspData = epay->DockRefundRespond(); // rspData = epay->DockRefundRespond();
// epay->StopService();
TaskQRRefund taskEPayRefund(jsonObj, epay);
rspData = taskEPayRefund.doTask();
} }
else { else {
rspData = QString::fromLocal8Bit("{\"msg:\":\"退款服务不可用\"}").toUtf8(); rspData = QString::fromLocal8Bit("{\"msg:\":\"退款服务不可用\"}").toUtf8();
......
...@@ -18,6 +18,7 @@ Order::Order(QObject *parent) ...@@ -18,6 +18,7 @@ Order::Order(QObject *parent)
,_productText("") ,_productText("")
,_settled(false) ,_settled(false)
,_storeInfoDBID(0) ,_storeInfoDBID(0)
,_refunded(false)
{ {
} }
......
...@@ -12,6 +12,7 @@ Pay::Pay(QObject *parent) ...@@ -12,6 +12,7 @@ Pay::Pay(QObject *parent)
,_account("") ,_account("")
,_transId("") ,_transId("")
,_fmTransId("") ,_fmTransId("")
,_thirdTransId("")
{ {
} }
...@@ -101,6 +102,16 @@ void Pay::setRefundAmount(int refundAmount) ...@@ -101,6 +102,16 @@ void Pay::setRefundAmount(int refundAmount)
_refundAmount = refundAmount; _refundAmount = refundAmount;
} }
QString Pay::thirdTransId() const
{
return _thirdTransId;
}
void Pay::setThirdTransId(const QString &thirdTransId)
{
_thirdTransId = thirdTransId;
}
QString Pay::transId() const QString Pay::transId() const
{ {
return _transId; return _transId;
......
...@@ -17,6 +17,7 @@ namespace FMItem { ...@@ -17,6 +17,7 @@ namespace FMItem {
Q_PROPERTY(QString account READ account WRITE setAccount) Q_PROPERTY(QString account READ account WRITE setAccount)
Q_PROPERTY(QString trans_id READ transId WRITE setTransId) Q_PROPERTY(QString trans_id READ transId WRITE setTransId)
Q_PROPERTY(QString fm_trans_id READ fmTransId WRITE setFmTransId) Q_PROPERTY(QString fm_trans_id READ fmTransId WRITE setFmTransId)
Q_PROPERTY(QString third_trans_id READ thirdTransId WRITE setThirdTransId)
Q_PROPERTY(int orderDBID READ orderDBID WRITE setOrderDBID) Q_PROPERTY(int orderDBID READ orderDBID WRITE setOrderDBID)
public: public:
explicit Pay(QObject *parent = 0); explicit Pay(QObject *parent = 0);
...@@ -48,6 +49,9 @@ namespace FMItem { ...@@ -48,6 +49,9 @@ namespace FMItem {
int refundAmount() const; int refundAmount() const;
void setRefundAmount(int refundAmount); void setRefundAmount(int refundAmount);
QString thirdTransId() const;
void setThirdTransId(const QString &thirdTransId);
private: private:
QString _payId; QString _payId;
QString _payStr; QString _payStr;
...@@ -58,6 +62,7 @@ namespace FMItem { ...@@ -58,6 +62,7 @@ namespace FMItem {
QString _account; QString _account;
QString _transId; QString _transId;
QString _fmTransId; QString _fmTransId;
QString _thirdTransId;
int _orderDBID; int _orderDBID;
}; };
......
#include "fmtasksimple.h"
#include <QJsonDocument>
FMTaskSimple::FMTaskSimple(QJsonObject &jsonObj, FM_TYPE fmType, Session *session, QObject *parent) :
FMTask(jsonObj, fmType, session, parent)
{
}
QByteArray FMTaskSimple::doTask()
{
#ifdef FM_DEBUG
if(!checkReqJson()) {
return errorStringJson().toUtf8();
}
#endif
RunFunction(packagePOSReq);
RunFunction(packagePOSRsp);
QJsonDocument json(posRspJsonObj);
return json.toJson(QJsonDocument::Compact);
}
#ifndef FMTASKSIMPLE_H
#define FMTASKSIMPLE_H
#include "fmtask.h"
class FMTaskSimple : public FMTask
{
Q_OBJECT
public:
explicit FMTaskSimple(QJsonObject &jsonObj, FM_TYPE fmType, Session* session = 0, QObject *parent = 0);
virtual QByteArray doTask();
protected:
virtual void packagePOSReq() = 0;
virtual void packagePOSRsp() = 0;
private:
virtual void packageServerReq() {}
};
#endif // FMTASKSIMPLE_H
#include "taskqrpay.h"
#include "items/order.h"
#include "items/pay.h"
#include "items/storeinfo.h"
#include "dbop.h"
#include <QJsonDocument>
TaskQRPay::TaskQRPay(QJsonObject &jsonObj, FMPePayInterface *epay, Session *session, QObject *parent)
:FMTaskSimple(jsonObj, FM_QR_Pay, session, parent) ,
_epay(epay)
{
Q_ASSERT(_epay != nullptr);
}
void TaskQRPay::packagePOSReq()
{
//! WARNING: 现在接口支付传来的POS订单号是transId
QString orderId = getPosJsonValue(PosProps.TransId).toString();
FMItem::Order *order = new FMItem::Order();
DBOP::GetOrderByOrderId(orderId, order);
if(order->settled()) {
QString info = QString::fromLocal8Bit("订单已结算,不能再进行支付.");
FMP_WARN() << info;
setError(FM_API_ERROR, info);
return;
}
if(order->isNew()) {
order->SetPropertiesByJson(posReqJsonObj);
order->setOrderId(orderId);
DBOP::Save(order);
}
QByteArray reqData = QJsonDocument(posReqJsonObj).toJson(QJsonDocument::Compact);
_epay->DockPayRequest(reqData);
_epay->StartService();
QByteArray rspData = _epay->DockPayRespond();
_epay->StopService();
QJsonDocument json = QJsonDocument::fromJson(rspData);
posRspJsonObj = json.object();
if(posRspJsonObj["statusCode"] == FM_API_SUCCESS) {
QJsonArray payIds = posRspJsonObj["pay_ids"].toArray();
foreach (QJsonValue payValue, payIds) {
QJsonObject payObj = payValue.toObject();
FMItem::Pay *pay = new FMItem::Pay();
pay->setPayId(payObj["pay_id"].toString());
pay->setPayStr(payObj["pay_str"].toString());
pay->setPayAmount(posRspJsonObj["paid_total_amount"].toInt());
pay->setAccount(payObj["pay_account"].toString());
pay->setTransId(posReqJsonObj["trans_id"].toString());
pay->setFmTransId(posRspJsonObj["fm_id"].toString());
pay->setThirdTransId(posRspJsonObj["fm_transId"].toString());
pay->setOrderDBID(order->DBID());
bool isOk = DBOP::Save(pay);
if(isOk) {
order->setPaidAmount(order->paidAmount()+pay->payAmount());
}
delete pay;
}
}
DBOP::Save(order);
delete order;
}
void TaskQRPay::packagePOSRsp()
{
}
#ifndef TASKQRPAY_H
#define TASKQRPAY_H
#include "fmtasksimple.h"
#include <fmp_epay_i.h>
class TaskQRPay : public FMTaskSimple
{
Q_OBJECT
public:
explicit TaskQRPay(QJsonObject &jsonObj, FMPePayInterface *epay, Session *session = 0, QObject *parent = 0);
void packagePOSReq();
void packagePOSRsp();
private:
FMPePayInterface *_epay;
};
#endif // TASKQRPAY_H
#include "taskqrrefund.h".h"
#include "items/order.h"
#include "items/pay.h"
#include "items/storeinfo.h"
#include "dbop.h"
#include <QJsonDocument>
TaskQRRefund::TaskQRRefund(QJsonObject &jsonObj, FMPePayInterface *epay, Session *session, QObject *parent)
:FMTaskSimple(jsonObj, FM_QR_Refund, session, parent) ,
_epay(epay)
{
Q_ASSERT(_epay != nullptr);
}
void TaskQRRefund::packagePOSReq()
{
//! WARNING: 现在接口支付传来的POS订单号是transId
QString orderId = getPosJsonValue(PosProps.TransId).toString();
FMItem::Order *order = new FMItem::Order();
DBOP::GetOrderByOrderId(orderId, order);
QSharedPointer<FMItem::Pay> refundPay;
QList<QSharedPointer<FMItem::Pay> > pays = DBOP::GetPaysByOrderDBId(order->DBID());
foreach (QSharedPointer<FMItem::Pay> payPointer, pays) {
//! WARNING: 临时的找第三方支付的方法
if(payPointer->transId() == orderId) {
refundPay = payPointer;
break;
}
}
QByteArray reqData = QJsonDocument(posReqJsonObj).toJson(QJsonDocument::Compact);
_epay->DockRefundRequest(reqData);
_epay->StartService();
QByteArray rspData = _epay->DockRefundRespond();
_epay->StopService();
QJsonDocument json = QJsonDocument::fromJson(rspData);
posRspJsonObj = json.object();
if(posRspJsonObj["statusCode"] == FM_API_SUCCESS) {
refundPay->setRefundAmount(refundPay->payAmount());
bool isOk = DBOP::Save(refundPay.data());
if(isOk) {
order->setPaidAmount(order->paidAmount()-refundPay->refundAmount());
}
}
DBOP::Save(order);
delete order;
}
void TaskQRRefund::packagePOSRsp()
{
}
#ifndef TASKQRREFUND_H
#define TASKQRREFUND_H
#include "fmtasksimple.h"
#include <fmp_epay_i.h>
class TaskQRRefund : public FMTaskSimple
{
Q_OBJECT
public:
explicit TaskQRRefund(QJsonObject &jsonObj, FMPePayInterface *epay, Session *session = 0, QObject *parent = 0);
void packagePOSReq();
void packagePOSRsp();
private:
FMPePayInterface *_epay;
};
#endif // TASKQRREFUND_H
#include "tasksetstoreinfo.h" #include "tasksetstoreinfo.h"
#include "items/storeinfo.h" #include "items/storeinfo.h"
#include "dbop.h" #include "dbop.h"
#include <QJsonDocument>
TaskSetStoreInfo::TaskSetStoreInfo(QJsonObject &jsonObj, QObject *parent) TaskSetStoreInfo::TaskSetStoreInfo(QJsonObject &jsonObj, QObject *parent)
: FMTaskNoWnd(jsonObj, FM_Set_Store_Info, 0, parent) : FMTaskSimple(jsonObj, FM_Set_Store_Info, 0, parent)
, _isSuccessSave(false)
{ {
} }
QByteArray TaskSetStoreInfo::doTask() void TaskSetStoreInfo::packagePOSReq()
{ {
#ifdef FM_DEBUG
if(!checkReqJson()) {
return errorStringJson().toUtf8();
}
#endif
RunFunction(packagePOSReq);
RunFunction(packageServerReq);
RunFunction(packagePOSRsp);
QJsonDocument json(posRspJsonObj);
return json.toJson(QJsonDocument::Compact);
} }
void TaskSetStoreInfo::packageServerReq() void TaskSetStoreInfo::packagePOSRsp()
{ {
FMItem::StoreInfo storeInfo; FMItem::StoreInfo storeInfo;
storeInfo.SetPropertiesByJson(posReqJsonObj); storeInfo.SetPropertiesByJson(posReqJsonObj);
_isSuccessSave = DBOP::Save(&storeInfo); bool isOk = DBOP::Save(&storeInfo);
} int statusCode = isOk ? FM_API_SUCCESS : FM_API_ERROR;
void TaskSetStoreInfo::packagePOSRsp()
{
int statusCode = _isSuccessSave ? FM_API_SUCCESS : FM_API_ERROR;
QString msg(""); QString msg("");
if(!_isSuccessSave) { if(!isOk) {
msg = QString::fromLocal8Bit("保存门店信息失败"); msg = QString::fromLocal8Bit("保存门店信息失败");
} }
posRspJsonObj[PosProps.StatusCode] = statusCode; posRspJsonObj[PosProps.StatusCode] = statusCode;
......
#ifndef TASKSETSTOREINFO_H #ifndef TASKSETSTOREINFO_H
#define TASKSETSTOREINFO_H #define TASKSETSTOREINFO_H
#include "fmtasknownd.h" #include "fmtasksimple.h"
class TaskSetStoreInfo : public FMTaskNoWnd class TaskSetStoreInfo : public FMTaskSimple
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit TaskSetStoreInfo(QJsonObject &jsonObj, QObject *parent = nullptr); explicit TaskSetStoreInfo(QJsonObject &jsonObj, QObject *parent = nullptr);
QByteArray doTask() override; void packagePOSReq() override;
void packageServerReq() override;
void packagePOSRsp() override; void packagePOSRsp() override;
bool _isSuccessSave;
}; };
#endif // TASKSETSTOREINFO_H #endif // TASKSETSTOREINFO_H
...@@ -159,7 +159,8 @@ void TestItem::test_PropertyNames_data() ...@@ -159,7 +159,8 @@ void TestItem::test_PropertyNames_data()
<< "fm_open_id" << "products" << "settled" << "refunded" << "storeInfoDBID"; << "fm_open_id" << "products" << "settled" << "refunded" << "storeInfoDBID";
QTest::newRow("Order") << qobject_cast<Item*>(gOrder) << orderPNames.length() << orderPNames; QTest::newRow("Order") << qobject_cast<Item*>(gOrder) << orderPNames.length() << orderPNames;
payPNames << "objectName" << "DBID" <<"pay_id" << "pay_str" << "pay_amount" << "refund_amount" << "dis_amount" << "account" << "trans_id" << "fm_trans_id" << "orderDBID"; payPNames << "objectName" << "DBID" <<"pay_id" << "pay_str" << "pay_amount" << "refund_amount" << "dis_amount" << "account"
<< "trans_id" << "fm_trans_id" << "third_trans_id" << "orderDBID";
QTest::newRow("Pay") << gPay << payPNames.length() << payPNames; QTest::newRow("Pay") << gPay << payPNames.length() << payPNames;
productPNames << "objectName" << "DBID" << "id" <<"quantity" << "price" << "name"; productPNames << "objectName" << "DBID" << "id" <<"quantity" << "price" << "name";
......
...@@ -57,13 +57,13 @@ void TestPlugin::test_dotask_data() ...@@ -57,13 +57,13 @@ void TestPlugin::test_dotask_data()
{ {
QTest::addColumn<QByteArray>("reqData"); QTest::addColumn<QByteArray>("reqData");
// QTest::newRow("Refund") << QByteArray("{\"fm_cmd\": 1004,\"order_id\": \"20171018003\"}"); QTest::newRow("Refund") << QByteArray("{\"fm_cmd\": 1004,\"order_id\": \"20171018003\"}");
// QTest::newRow("Refund not") << QByteArray("{\"fm_cmd\": 1004,\"order_id\": \"12345\"}"); QTest::newRow("Refund not") << QByteArray("{\"fm_cmd\": 1004,\"order_id\": \"12345\"}");
// QTest::newRow("SetStoreInfo") << QByteArray("{\"fm_cmd\": 1000,\"store_id\": \"99999\",\"pos_id\": \"1\",\"business_date\": \"20171016\",\"operator_id\": \"001\"}"); QTest::newRow("SetStoreInfo") << QByteArray("{\"fm_cmd\": 1000,\"store_id\": \"99999\",\"pos_id\": \"1\",\"business_date\": \"20171016\",\"operator_id\": \"001\"}");
// QTest::newRow("SetStoreInfo_need_posId") << QByteArray("{\"fm_cmd\": 1000,\"store_id\": \"fm9999\",\"pos_id\": \"\",\"business_date\": \"20171016\",\"operator_id\": \"001\"}"); QTest::newRow("SetStoreInfo_need_posId") << QByteArray("{\"fm_cmd\": 1000,\"store_id\": \"fm9999\",\"pos_id\": \"\",\"business_date\": \"20171016\",\"operator_id\": \"001\"}");
// QTest::newRow("SetStoreInfo_notnull_posId") << QByteArray("{\"fm_cmd\": 1000,\"store_id\": \"fm9999\",\"business_date\": \"20171016\",\"operator_id\": \"001\"}"); QTest::newRow("SetStoreInfo_notnull_posId") << QByteArray("{\"fm_cmd\": 1000,\"store_id\": \"fm9999\",\"business_date\": \"20171016\",\"operator_id\": \"001\"}");
// QTest::newRow("SetStoreInfo_error_type") << QByteArray("{\"fm_cmd\": 1000,\"store_id\": \"fm9999\",\"pos_id\": 1,\"business_date\": \"20171016\",\"operator_id\": \"001\"}"); QTest::newRow("SetStoreInfo_error_type") << QByteArray("{\"fm_cmd\": 1000,\"store_id\": \"fm9999\",\"pos_id\": 1,\"business_date\": \"20171016\",\"operator_id\": \"001\"}");
// QTest::newRow("Login") << QByteArray("{\"fm_cmd\": 1001}"); QTest::newRow("Login") << QByteArray("{\"fm_cmd\": 1001}");
QTest::newRow("Pay") << QByteArray("{" QTest::newRow("Pay") << QByteArray("{"
" \"fm_cmd\": 1003," " \"fm_cmd\": 1003,"
" \"order_amount\":900," " \"order_amount\":900,"
...@@ -86,9 +86,9 @@ void TestPlugin::test_dotask_data() ...@@ -86,9 +86,9 @@ void TestPlugin::test_dotask_data()
" }" " }"
" ]" " ]"
"}"); "}");
// QTest::newRow("Order") << QByteArray("{\"fm_cmd\": 1007,\"order_id\": \"20171018003\"}"); QTest::newRow("Order") << QByteArray("{\"fm_cmd\": 1007,\"order_id\": \"20171018003\"}");
// QTest::newRow("Fund") << QByteArray("{\"fm_cmd\": 1002,\"order_id\": \"20171018001\"}"); QTest::newRow("Fund") << QByteArray("{\"fm_cmd\": 1002,\"order_id\": \"20171018001\"}");
// QTest::newRow("CouponPay") << QByteArray("{\"fm_cmd\": 10032}"); QTest::newRow("CouponPay") << QByteArray("{\"fm_cmd\": 10032}");
} }
void TestPlugin::test_dotask() void TestPlugin::test_dotask()
......
...@@ -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 30 #define VER_BUILD 31
//! 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