Commit 16f5697b by NitefullWind

1. 实现根据transId退款。

parent 5d1e0b74
......@@ -43,11 +43,6 @@ void DBOP::InserTable(const QString &tableName, const QString &transId, const QS
Instance()->_db->insert(tableName, hash);
}
void DBOP::GetPaysByTransId(const QString &transId, QVector<QByteArray> &payDataVec)
{
}
bool DBOP::CreateTable(const QString &tableName)
{
QString tableOrderSql = "CREATE TABLE [Order]("
......@@ -70,6 +65,7 @@ bool DBOP::CreateTable(const QString &tableName)
"[pay_id] VARCHAR(50), "
"[pay_str] VARCHAR(50), "
"[pay_amount] INT DEFAULT 0, "
"[refund_amount] INT DEFAULT 0, "
"[dis_amount] INT DEFAULT 0, "
"[account] VARCHAR(50), "
"[trans_id] VARCHAR(50), "
......@@ -161,6 +157,27 @@ QSharedPointer<FMItem::Order> DBOP::GetOrderByTransId(const QString &transId)
return order;
}
void DBOP::GetOrderByDBId(unsigned int DBID, Order *order)
{
Q_ASSERT(order != NULL);
QSqlQuery query;
QString condition = QString("id == '%1'").arg(DBID);
bool isOk = Instance()->_db->find(TABLE_ORDER, query, QStringList(), condition);
if(isOk && query.next()) {
order->SetPropertiesBySqlRecord(query.record());
} else {
FMP_WARN() << "Don't find order: " << DBID;
}
}
QSharedPointer<FMItem::Order> DBOP::GetOrderByDBId(unsigned int DBID)
{
QSharedPointer<FMItem::Order> order(new Order);
GetOrderByDBId(DBID, order.data());
return order;
}
QList<QSharedPointer<FMItem::Pay> > DBOP::GetPaysByOrderId(int orderId)
{
QList<QSharedPointer<FMItem::Pay> > payList;
......@@ -174,3 +191,24 @@ QList<QSharedPointer<FMItem::Pay> > DBOP::GetPaysByOrderId(int orderId)
}
return payList;
}
void DBOP::GetPayByDBId(unsigned int DBID, Pay *pay)
{
Q_ASSERT(pay != NULL);
QSqlQuery query;
QString condition = QString("id == '%1'").arg(DBID);
bool isOk = Instance()->_db->find(TABLE_PAY, query, QStringList(), condition);
if(isOk && query.next()) {
pay->SetPropertiesBySqlRecord(query.record());
} else {
FMP_WARN() << "Don't find pay: " << DBID;
}
}
QSharedPointer<FMItem::Pay> DBOP::GetPayByDBId(unsigned int DBID)
{
QSharedPointer<FMItem::Pay> pay(new Pay);
GetPayByDBId(DBID, pay.data());
return pay;
}
......@@ -26,12 +26,14 @@ public:
static void InsertTablePay(const QString &transId, const QString &fmId, const QByteArray &reqData, const QByteArray &rspData);
static void InsertTableOrder(const QString &transId, const QString &fmId, const QByteArray &reqData, const QByteArray &rspData);
static void GetPaysByTransId(const QString &transId, QVector<QByteArray> &payDataVec);
static void GetOrderByTransId(const QString &transId, FMItem::Order *order);
static QSharedPointer<FMItem::Order> GetOrderByTransId(const QString &transId);
static void GetOrderByDBId(unsigned int DBID, FMItem::Order* order);
static QSharedPointer<FMItem::Order> GetOrderByDBId(unsigned int DBID);
static QList<QSharedPointer<FMItem::Pay> > GetPaysByOrderId(int orderId);
static void GetPayByDBId(unsigned int DBID, FMItem::Pay *pay);
static QSharedPointer<FMItem::Pay> GetPayByDBId(unsigned int DBID);
private:
DBOP();
FMPDataBase *_db;
......
......@@ -28,7 +28,7 @@ int FMNetwork::send(const QString &url, const QByteArray &reqData, QByteArray &r
error = FM_API_SUCCESS;
FMP_INFO() << "Send Url: " << url;
FMP_INFO() << "Send Data: " << reqData;
FMP_INFO() << "Send Data: " << reqData.data();
_req->setUrl(url);
......
......@@ -7,6 +7,7 @@ Pay::Pay(QObject *parent)
,_payId("")
,_payStr("")
,_payAmount(0)
,_refundAmount(0)
,_disAmount(0)
,_account("")
,_transId("")
......@@ -90,6 +91,16 @@ void Pay::setOrderId(int orderId)
_orderId = orderId;
}
int Pay::refundAmount() const
{
return _refundAmount;
}
void Pay::setRefundAmount(int refundAmount)
{
_refundAmount = refundAmount;
}
QString Pay::transId() const
{
return _transId;
......
......@@ -12,6 +12,7 @@ namespace FMItem {
Q_PROPERTY(QString pay_id READ payId WRITE setPayId)
Q_PROPERTY(QString pay_str READ payStr WRITE setPayStr)
Q_PROPERTY(int pay_amount READ payAmount WRITE setPayAmount)
Q_PROPERTY(int refund_amount READ refundAmount WRITE setRefundAmount)
Q_PROPERTY(int discount_amount READ disAmount WRITE setDisAmount)
Q_PROPERTY(QString account READ account WRITE setAccount)
Q_PROPERTY(QString trans_id READ transId WRITE setTransId)
......@@ -44,10 +45,14 @@ namespace FMItem {
int orderId() const;
void setOrderId(int orderId);
int refundAmount() const;
void setRefundAmount(int refundAmount);
private:
QString _payId;
QString _payStr;
int _payAmount;
int _refundAmount;
int _disAmount;
QString _account;
......
......@@ -117,13 +117,17 @@ bool FMTask::sendToServer(bool isShowMsg)
QJsonDocument json(serverReqJsonObj);
QByteArray data = json.toJson(QJsonDocument::Compact);
#ifdef FMTEST
url = "http://micro-service.sandload.cn/member-pos/pos/member/" + ReqUrl.at(FM_Type());
#else
url = FMPVipSettings::instance()->getServerUrl() + "/" + ReqUrl.at(FM_Type());
#endif
QByteArray rspData;
FMNetwork net;
net.send(url, data, rspData);
FMP_INFO() << "Server rsponse: " << rspData;
FMP_INFO() << "Server rsponse: " << rspData.data();
// 网络错误
if(net.error != FM_API_SUCCESS) {
......
#include "taskrefund.h"
#include "fmviprefund.h"
#include "database/dbop.h"
#include "items/item.h"
#include "items/order.h"
#include "items/pay.h"
#include "taskothers.h"
#include <QSharedPointer>
#include <QJsonDocument>
TaskRefund::TaskRefund(QJsonObject &jsonObj, Session *session, QObject *parent)
: FMTask(jsonObj, FM_Refund, session, parent)
......@@ -15,6 +22,17 @@ TaskRefund::~TaskRefund()
void TaskRefund::setWindow()
{
_window = new FMVipRefund();
connect(qobject_cast<FMVipRefund*>(_window), &FMVipRefund::refundPay, this, &TaskRefund::onRefundPay);
QString fmId = getPosJsonValue(PosProps.Fm_id).toString();
QString transId = getPosJsonValue(PosProps.TransId).toString();
session()->addData(PosProps.Fm_id, fmId);
session()->addData(PosProps.TransId, transId);
//! TODO 需要从其他数据库查询营业日、门店信息等。
auto orderPointer = DBOP::GetOrderByTransId(transId);
posReqJsonObj = orderPointer->toJson(QStringList(), posReqJsonObj);
}
void TaskRefund::packageServerReq()
......@@ -25,3 +43,31 @@ void TaskRefund::packagePOSRsp()
{
}
void TaskRefund::onRefundPay(int DBID)
{
posReqJsonObj[PosProps.TransId] = session()->data(PosProps.TransId).toString();
QSharedPointer<FMItem::Pay> payPointer = DBOP::GetPayByDBId(DBID);
QSharedPointer<FMItem::Order> orderPointer = DBOP::GetOrderByDBId(payPointer->orderId());
posReqJsonObj = orderPointer->toJson(QStringList(), posReqJsonObj);
TaskRefundPay refundPay(posReqJsonObj, this);
QByteArray rspData = refundPay.doTask();
QJsonObject rspObj = QJsonDocument::fromJson(rspData).object();
if(rspObj[PosProps.StatusCode].toInt() == FM_API_SUCCESS) {
payPointer->setRefundAmount(payPointer->payAmount());
bool isOk = DBOP::Save(payPointer.data());
if(isOk) {
orderPointer->setPaidAmount(orderPointer->paidAmount() - payPointer->refundAmount());
isOk = DBOP::Save(orderPointer.data());
}
qobject_cast<FMVipRefund*>(_window)->refresh();
} else {
QString msg = searchJsonValue(rspObj, PosProps.Msg).toString();
FMMsgWnd::FailureWnd(msg, _window);
}
}
......@@ -13,6 +13,9 @@ private:
void setWindow() override;
void packageServerReq();
void packagePOSRsp();
private:
void onRefundPay(int DBID);
};
#endif // TASKREFUND_H
......@@ -5,10 +5,14 @@
#include <QMutex>
#include "fmloading.h"
#include "fmmsgwnd.h"
#include "dbop.h"
#include "items/order.h"
#include "items/pay.h"
FMVipRefund::FMVipRefund(QDialog *parent) :
FMVipWnd(parent),
ui(new Ui::FMVipRefund)
ui(new Ui::FMVipRefund),
order(new FMItem::Order(this))
{
ui->setupUi(this);
}
......@@ -16,6 +20,8 @@ FMVipRefund::FMVipRefund(QDialog *parent) :
FMVipRefund::~FMVipRefund()
{
delete ui;
delete order;
pays.clear();
}
bool FMVipRefund::initWnd(Session *session)
......@@ -26,6 +32,76 @@ bool FMVipRefund::initWnd(Session *session)
ui->pos_label->setText(session->data(PosProps.PosId).toString());
ui->operator_label->setText(session->data(PosProps.OperatorId).toString());
ui->bd_label->setText(session->data(PosProps.BussinessDate).toString());
QString transId = session->data(PosProps.TransId).toString();
DBOP::GetOrderByTransId(transId, order);
if(order->isNew()) {
ui->textEdit_order->setText(QString::fromLocal8Bit("未找到transId为 %1 的订单! ").arg(transId));
} else {
QString orderInfo = QString::fromLocal8Bit("POS流水号:%1\n"
"非码订单号:%2\n"
"订单总额:%3 \t 已付金额:%4\n"
"营业日:%5 \t 收银员:%6\n"
"门店号:%7 \t POS号:%8\n")
.arg(order->transId()).arg(order->fmId())
.arg(order->orderAmount()/100.0).arg(order->paidAmount()/100.0)
.arg(order->businessDate()).arg(order->operatorId())
.arg(order->storeId()).arg(order->posId());
ui->textEdit_order->setText(orderInfo);
pays = DBOP::GetPaysByOrderId(order->DBID());
int row = 0, col = 0;
foreach (auto payPointer, pays) {
if(row == 0) {
QStringList headerLabels;
headerLabels << QString::fromLocal8Bit("支付方式") << QString::fromLocal8Bit("支付金额") << QString::fromLocal8Bit("已退金额") << QString::fromLocal8Bit("操作");
ui->tableWidget_pays->setRowCount(pays.length());
ui->tableWidget_pays->setColumnCount(headerLabels.length());
ui->tableWidget_pays->setHorizontalHeaderLabels(headerLabels);
int tableWidth = ui->tableWidget_pays->width();
ui->tableWidget_pays->setColumnWidth(0, tableWidth*0.4);
ui->tableWidget_pays->setColumnWidth(1, tableWidth*0.2);
ui->tableWidget_pays->setColumnWidth(2, tableWidth*0.2);
ui->tableWidget_pays->setColumnWidth(3, tableWidth*0.17);
}
QStringList payInfo;
payInfo << payPointer->payStr() << QString::number(payPointer->payAmount() / 100.0) << QString::number(payPointer->refundAmount() / 100.0);
foreach (const QString payInfoItem, payInfo) {
ui->tableWidget_pays->setItem(row, col, new QTableWidgetItem(payInfoItem));
col ++;
}
if(payPointer->payAmount() > 0) {
auto btn = new QPushButton(QString::fromLocal8Bit("退款"), ui->tableWidget_pays);
btn->setProperty("DBID", payPointer->DBID());
connect(btn, &QPushButton::clicked, this, &FMVipRefund::onBtnRefundClicked);
ui->tableWidget_pays->setCellWidget(row, col, btn);
if(payPointer->payAmount() <= payPointer->refundAmount()) {
btn->setEnabled(false);
}
}
row++;
col = 0;
}
}
return true;
}
void FMVipRefund::onBtnRefundClicked()
{
auto btn = qobject_cast<QPushButton*>(sender());
int DBID = btn->property("DBID").toInt();
emit refundPay(DBID);
}
void FMVipRefund::refresh()
{
initWnd(this->session());
}
......@@ -8,6 +8,11 @@ namespace Ui {
class FMVipRefund;
}
namespace FMItem {
class Order;
class Pay;
}
class FMVipRefund : public FMVipWnd
{
Q_OBJECT
......@@ -18,8 +23,19 @@ public:
bool initWnd(Session *session);
void refresh();
signals:
void refundPay(int);
private slots:
void onBtnRefundClicked();
private:
Ui::FMVipRefund *ui;
FMItem::Order *order;
QList<QSharedPointer<FMItem::Pay> > pays;
};
#endif // FMVIPREFUND_H
......@@ -74,6 +74,10 @@
#payTable {
background: rgb(252, 252, 252);
}
#tableWidget_pays {
min-width: 786px; max-width:786px;
}</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
......@@ -174,13 +178,35 @@
<number>0</number>
</property>
<item>
<widget class="QTableWidget" name="payTable">
<widget class="QTextEdit" name="textEdit_order">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QTableWidget" name="tableWidget_pays">
<property name="minimumSize">
<size>
<width>0</width>
<width>788</width>
<height>0</height>
</size>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
</widget>
</item>
</layout>
......
include(../../fmvip/fmvip.pri)
QT += testlib sql
CONFIG += C++11
DEFINES += FMTEST
CONFIG += qt console warn_on depend_includepath testcase
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += tst_testplugin.cpp
CONFIG(debug, debug|release) {
LIBS += -lCTKCored -lCTKPluginFrameworkd
DESTDIR = $$PWD/../../../debug/bins
} else {
LIBS += -lCTKCore -lCTKPluginFramework
DESTDIR = $$PWD/../../../release/bins
}
# This file is used to ignore files which are generated
# ----------------------------------------------------------------------------
*~
*.autosave
*.a
*.core
*.moc
*.o
*.obj
*.orig
*.rej
*.so
*.so.*
*_pch.h.cpp
*_resource.rc
*.qm
.#*
*.*#
core
!core/
tags
.DS_Store
.directory
*.debug
Makefile*
*.prl
*.app
moc_*.cpp
ui_*.h
qrc_*.cpp
Thumbs.db
*.res
*.rc
/.qmake.cache
/.qmake.stash
# qtcreator generated files
*.pro.user*
# xemacs temporary files
*.flc
# Vim temporary files
.*.swp
# Visual Studio generated files
*.ib_pdb_index
*.idb
*.ilk
*.pdb
*.sln
*.suo
*.vcproj
*vcproj.*.*.user
*.ncb
*.sdf
*.opensdf
*.vcxproj
*vcxproj.*
# MinGW generated files
*.Debug
*.Release
# Python byte code
*.pyc
# Binaries
# --------
*.dll
*.exe
......@@ -154,7 +154,7 @@ void TestItem::test_PropertyNames_data()
<< "store_id" << "pos_id" << "operator_id" << "business_date" << "fm_open_id" << "products" << "settled";
QTest::newRow("Order") << qobject_cast<Item*>(gOrder) << orderPNames.length() << orderPNames;
payPNames << "objectName" << "DBID" <<"pay_id" << "pay_str" << "pay_amount" << "discount_amount" << "account" << "trans_id" << "payTransId" << "orderId";
payPNames << "objectName" << "DBID" <<"pay_id" << "pay_str" << "pay_amount" << "refund_amount" << "discount_amount" << "account" << "trans_id" << "payTransId" << "orderId";
QTest::newRow("Pay") << gPay << payPNames.length() << payPNames;
productPNames << "objectName" << "DBID" << "id" <<"quantity" << "price" << "name";
......@@ -179,17 +179,19 @@ void TestItem::test_DBSave_data()
Pay *pay = new Pay();
pay->setPayId("1");
pay->setPayStr("pay1");
pay->setTransId("1111");
pay->setTransId("12345");
pay->setPayAmount(100);
QTest::newRow("Pay") << qobject_cast<Item*>(pay) << true;
QTest::newRow("Order") << qobject_cast<Item*>(gOrder) << true;
gOrder->setDBID(gOrder->DBID());
gOrder->setFmId("11111");
gOrder->setTransId("11111");
gOrder->setTransId("12345");
gOrder->setOrderAmount(1000);
gOrder->setProductText("{\"pid\":\"1\"},{\"pid\":\"2\"}");
QTest::newRow("Order") << qobject_cast<Item*>(gOrder) << true;
pay->deleteLater();
}
void TestItem::test_DBSave()
......
#include <QtTest>
#include <QCoreApplication>
#include "fmvipdispatcher.h"
class TestPlugin : public QObject
{
Q_OBJECT
public:
TestPlugin();
~TestPlugin();
private:
FMVipDispatcher fmvip;
private slots:
void initTestCase();
void cleanupTestCase();
void test_dotask_data();
void test_dotask();
};
TestPlugin::TestPlugin()
{
}
TestPlugin::~TestPlugin()
{
}
void TestPlugin::initTestCase()
{
}
void TestPlugin::cleanupTestCase()
{
}
void TestPlugin::test_dotask_data()
{
QTest::addColumn<QByteArray>("reqData");
QTest::newRow("Refund") << QByteArray("{\"fm_cmd\": 1004,\"trans_id\": \"12345\"}");
// QTest::newRow("Refund not") << QByteArray("{\"fm_cmd\": 1004,\"trans_id\": \"123456\"}");
}
void TestPlugin::test_dotask()
{
QFETCH(QByteArray, reqData);
QByteArray rspData;
fmvip.doTask(reqData, rspData);
}
QTEST_MAIN(TestPlugin)
#include "tst_testplugin.moc"
TEMPLATE = subdirs
SUBDIRS += \
test
testitem \
testplugin
CONFIG += ordered
......@@ -5,7 +5,7 @@
#define VER_MINOR 1
#define VER_REVISION 0
#define VER_BUILD 12
#define VER_BUILD 13
//! 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