Commit f0ce13d2 by NitefullWind

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

parent 26425661
......@@ -68,6 +68,7 @@ bool DBOP::CreateTable(const QString &tableName)
"[account] VARCHAR(50), "
"[trans_id] VARCHAR(50), "
"[fm_trans_id] VARCHAR(50),"
"[third_trans_id] VARCHAR(50),"
"[orderDBID] INTEGER DEFAULT 0"
");";
QString tableStoreInfoSql = "CREATE TABLE [StoreInfo]("
......
......@@ -50,7 +50,10 @@ SOURCES += \
$$PWD/database/fmp_database.cpp \
$$PWD/task/tasksetstoreinfo.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 +=\
$$PWD/backup/fmbackup.h \
......@@ -91,7 +94,10 @@ HEADERS +=\
$$PWD/database/fmp_database.h \
$$PWD/task/tasksetstoreinfo.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 {
target.path = /usr/lib
......
......@@ -15,6 +15,8 @@
#include "taskrefund.h"
#include "taskfund.h"
#include "tasksetstoreinfo.h"
#include "taskqrpay.h"
#include "taskqrrefund.h"
#include <ctkPluginContext.h>
#undef StartService
#include <fmp_epay_i.h>
......@@ -74,9 +76,12 @@ void FMVipDispatcher::doTask(const QByteArray &reqData, QByteArray &rspData)
if (_ctx) {
ctkServiceReference ref =_ctx->getServiceReference<FMPePayInterface>();
FMPePayInterface *epay = _ctx->getService<FMPePayInterface>(ref);
epay->DockPayRequest(reqData);
epay->StartService();
rspData = epay->DockPayRespond();
// epay->DockPayRequest(reqData);
// epay->StartService();
// rspData = epay->DockPayRespond();
// epay->StopService();
TaskQRPay taskEPay(jsonObj, epay);
rspData = taskEPay.doTask();
}
else {
rspData = QString::fromLocal8Bit("{\"msg:\":\"支付服务不可用\"}").toUtf8();
......@@ -137,9 +142,12 @@ void FMVipDispatcher::doTask(const QByteArray &reqData, QByteArray &rspData)
if (_ctx) {
ctkServiceReference ref =_ctx->getServiceReference<FMPePayInterface>();
FMPePayInterface *epay = _ctx->getService<FMPePayInterface>(ref);
epay->DockRefundRequest(reqData);
epay->StartService();
rspData = epay->DockRefundRespond();
// epay->DockRefundRequest(reqData);
// epay->StartService();
// rspData = epay->DockRefundRespond();
// epay->StopService();
TaskQRRefund taskEPayRefund(jsonObj, epay);
rspData = taskEPayRefund.doTask();
}
else {
rspData = QString::fromLocal8Bit("{\"msg:\":\"退款服务不可用\"}").toUtf8();
......
......@@ -18,6 +18,7 @@ Order::Order(QObject *parent)
,_productText("")
,_settled(false)
,_storeInfoDBID(0)
,_refunded(false)
{
}
......
......@@ -12,6 +12,7 @@ Pay::Pay(QObject *parent)
,_account("")
,_transId("")
,_fmTransId("")
,_thirdTransId("")
{
}
......@@ -101,6 +102,16 @@ void Pay::setRefundAmount(int refundAmount)
_refundAmount = refundAmount;
}
QString Pay::thirdTransId() const
{
return _thirdTransId;
}
void Pay::setThirdTransId(const QString &thirdTransId)
{
_thirdTransId = thirdTransId;
}
QString Pay::transId() const
{
return _transId;
......
......@@ -17,6 +17,7 @@ namespace FMItem {
Q_PROPERTY(QString account READ account WRITE setAccount)
Q_PROPERTY(QString trans_id READ transId WRITE setTransId)
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)
public:
explicit Pay(QObject *parent = 0);
......@@ -48,6 +49,9 @@ namespace FMItem {
int refundAmount() const;
void setRefundAmount(int refundAmount);
QString thirdTransId() const;
void setThirdTransId(const QString &thirdTransId);
private:
QString _payId;
QString _payStr;
......@@ -58,6 +62,7 @@ namespace FMItem {
QString _account;
QString _transId;
QString _fmTransId;
QString _thirdTransId;
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 "items/storeinfo.h"
#include "dbop.h"
#include <QJsonDocument>
TaskSetStoreInfo::TaskSetStoreInfo(QJsonObject &jsonObj, QObject *parent)
: FMTaskNoWnd(jsonObj, FM_Set_Store_Info, 0, parent)
, _isSuccessSave(false)
: FMTaskSimple(jsonObj, FM_Set_Store_Info, 0, parent)
{
}
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;
storeInfo.SetPropertiesByJson(posReqJsonObj);
_isSuccessSave = DBOP::Save(&storeInfo);
}
void TaskSetStoreInfo::packagePOSRsp()
{
int statusCode = _isSuccessSave ? FM_API_SUCCESS : FM_API_ERROR;
bool isOk = DBOP::Save(&storeInfo);
int statusCode = isOk ? FM_API_SUCCESS : FM_API_ERROR;
QString msg("");
if(!_isSuccessSave) {
if(!isOk) {
msg = QString::fromLocal8Bit("保存门店信息失败");
}
posRspJsonObj[PosProps.StatusCode] = statusCode;
......
#ifndef TASKSETSTOREINFO_H
#define TASKSETSTOREINFO_H
#include "fmtasknownd.h"
#include "fmtasksimple.h"
class TaskSetStoreInfo : public FMTaskNoWnd
class TaskSetStoreInfo : public FMTaskSimple
{
Q_OBJECT
public:
explicit TaskSetStoreInfo(QJsonObject &jsonObj, QObject *parent = nullptr);
QByteArray doTask() override;
void packageServerReq() override;
void packagePOSReq() override;
void packagePOSRsp() override;
bool _isSuccessSave;
};
#endif // TASKSETSTOREINFO_H
......@@ -159,7 +159,8 @@ void TestItem::test_PropertyNames_data()
<< "fm_open_id" << "products" << "settled" << "refunded" << "storeInfoDBID";
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;
productPNames << "objectName" << "DBID" << "id" <<"quantity" << "price" << "name";
......
......@@ -57,13 +57,13 @@ void TestPlugin::test_dotask_data()
{
QTest::addColumn<QByteArray>("reqData");
// QTest::newRow("Refund") << QByteArray("{\"fm_cmd\": 1004,\"order_id\": \"20171018003\"}");
// 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_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_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("Refund") << QByteArray("{\"fm_cmd\": 1004,\"order_id\": \"20171018003\"}");
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_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_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("Pay") << QByteArray("{"
" \"fm_cmd\": 1003,"
" \"order_amount\":900,"
......@@ -86,9 +86,9 @@ void TestPlugin::test_dotask_data()
" }"
" ]"
"}");
// QTest::newRow("Order") << QByteArray("{\"fm_cmd\": 1007,\"order_id\": \"20171018003\"}");
// QTest::newRow("Fund") << QByteArray("{\"fm_cmd\": 1002,\"order_id\": \"20171018001\"}");
// QTest::newRow("CouponPay") << QByteArray("{\"fm_cmd\": 10032}");
QTest::newRow("Order") << QByteArray("{\"fm_cmd\": 1007,\"order_id\": \"20171018003\"}");
QTest::newRow("Fund") << QByteArray("{\"fm_cmd\": 1002,\"order_id\": \"20171018001\"}");
QTest::newRow("CouponPay") << QByteArray("{\"fm_cmd\": 10032}");
}
void TestPlugin::test_dotask()
......
......@@ -5,7 +5,7 @@
#define VER_MINOR 1
#define VER_REVISION 0
#define VER_BUILD 30
#define VER_BUILD 31
//! 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