Commit d967b2ef by NitefullWind

1. 完善退款功能。

parent 3ad0cb12
...@@ -55,6 +55,7 @@ bool DBOP::CreateTable(const QString &tableName) ...@@ -55,6 +55,7 @@ bool DBOP::CreateTable(const QString &tableName)
"[fm_open_id] VARCHAR(50), " "[fm_open_id] VARCHAR(50), "
"[products] TEXT," "[products] TEXT,"
"[settled] BOOL DEFAULT 0," "[settled] BOOL DEFAULT 0,"
"[refunded] BOOL DEFAULT 0,"
"[storeInfoDBID] INTEGER DEFAULT 0" "[storeInfoDBID] INTEGER DEFAULT 0"
");"; ");";
QString tablePaySql = "CREATE TABLE [Pay](" QString tablePaySql = "CREATE TABLE [Pay]("
......
...@@ -131,3 +131,13 @@ void Order::setStoreInfoDBID(int storeInfoDBID) ...@@ -131,3 +131,13 @@ void Order::setStoreInfoDBID(int storeInfoDBID)
{ {
_storeInfoDBID = storeInfoDBID; _storeInfoDBID = storeInfoDBID;
} }
bool Order::refunded() const
{
return _refunded;
}
void Order::setRefunded(bool refunded)
{
_refunded = refunded;
}
...@@ -25,6 +25,7 @@ namespace FMItem { ...@@ -25,6 +25,7 @@ namespace FMItem {
Q_PROPERTY(QString fm_open_id READ fmOpenId WRITE setFmOpenId) Q_PROPERTY(QString fm_open_id READ fmOpenId WRITE setFmOpenId)
Q_PROPERTY(QString products READ productText WRITE setProductText) Q_PROPERTY(QString products READ productText WRITE setProductText)
Q_PROPERTY(bool settled READ settled WRITE setSettled) Q_PROPERTY(bool settled READ settled WRITE setSettled)
Q_PROPERTY(bool refunded READ refunded WRITE setRefunded)
Q_PROPERTY(int storeInfoDBID READ storeInfoDBID WRITE setStoreInfoDBID) Q_PROPERTY(int storeInfoDBID READ storeInfoDBID WRITE setStoreInfoDBID)
// Q_PROPERTY(ItemList payList READ payList WRITE setPayList) // Q_PROPERTY(ItemList payList READ payList WRITE setPayList)
// Q_PROPERTY(ProductList productList READ productList WRITE setProductList) // Q_PROPERTY(ProductList productList READ productList WRITE setProductList)
...@@ -64,6 +65,9 @@ namespace FMItem { ...@@ -64,6 +65,9 @@ namespace FMItem {
int storeInfoDBID() const; int storeInfoDBID() const;
void setStoreInfoDBID(int storeInfoDBID); void setStoreInfoDBID(int storeInfoDBID);
bool refunded() const;
void setRefunded(bool refunded);
private: private:
QString _orderId; QString _orderId;
QString _fmOrderId; QString _fmOrderId;
...@@ -76,6 +80,7 @@ namespace FMItem { ...@@ -76,6 +80,7 @@ namespace FMItem {
QString _productText; QString _productText;
bool _settled; bool _settled;
bool _refunded;
int _storeInfoDBID; int _storeInfoDBID;
......
...@@ -27,16 +27,21 @@ TaskFinal::~TaskFinal() ...@@ -27,16 +27,21 @@ TaskFinal::~TaskFinal()
void TaskFinal::packagePOSReq() void TaskFinal::packagePOSReq()
{ {
QString orderId = getPosJsonValue(PosProps.OrderId).toString();
DBOP::GetOrderByOrderId(orderId, _order);
FMItem::StoreInfo storeInfo; FMItem::StoreInfo storeInfo;
bool isOk = DBOP::GetLastItem(&storeInfo); bool isOk = DBOP::GetLastItem(&storeInfo);
if(isOk) { if(isOk) {
posReqJsonObj = storeInfo.toJson(QStringList(), posReqJsonObj); posReqJsonObj = storeInfo.toJson(QStringList(), posReqJsonObj);
_order->setStoreInfoDBID(storeInfo.DBID()); _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()) { if(_order->isNew()) {
_order->SetPropertiesByJson(posReqJsonObj); _order->SetPropertiesByJson(posReqJsonObj);
DBOP::Save(_order); DBOP::Save(_order);
......
...@@ -13,7 +13,13 @@ TaskFund::TaskFund(QJsonObject &jsonObj, QObject *parent) ...@@ -13,7 +13,13 @@ TaskFund::TaskFund(QJsonObject &jsonObj, QObject *parent)
void TaskFund::packagePOSReq() void TaskFund::packagePOSReq()
{ {
FMItem::StoreInfo storeInfo; FMItem::StoreInfo storeInfo;
DBOP::GetLastItem(&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); posReqJsonObj = storeInfo.toJson(QStringList(), posReqJsonObj);
......
...@@ -28,7 +28,13 @@ TaskPay::~TaskPay() ...@@ -28,7 +28,13 @@ TaskPay::~TaskPay()
void TaskPay::packagePOSReq() void TaskPay::packagePOSReq()
{ {
FMItem::StoreInfo storeInfo; FMItem::StoreInfo storeInfo;
DBOP::GetLastItem(&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); posReqJsonObj = storeInfo.toJson(QStringList(), posReqJsonObj);
// 检查订单是否已结算 // 检查订单是否已结算
......
#include "taskrefund.h" #include "taskrefund.h"
#include "fmviprefund.h" #include "fmviprefund.h"
#include "database/dbop.h" #include "database/dbop.h"
#include "items/item.h" #include "items/item.h"
...@@ -31,6 +31,11 @@ void TaskRefund::packagePOSReq() ...@@ -31,6 +31,11 @@ void TaskRefund::packagePOSReq()
bool isOk = DBOP::GetLastItem(&storeInfo); bool isOk = DBOP::GetLastItem(&storeInfo);
if(isOk) { if(isOk) {
posReqJsonObj = storeInfo.toJson(QStringList(), posReqJsonObj); posReqJsonObj = storeInfo.toJson(QStringList(), posReqJsonObj);
} else {
QString info = QString::fromLocal8Bit("未设置门店信息,不能进行退款.");
FMP_WARN() << info;
setError(FM_API_ERROR, info);
return;
} }
} }
...@@ -77,6 +82,7 @@ void TaskRefund::onRefundPay(int DBID) ...@@ -77,6 +82,7 @@ void TaskRefund::onRefundPay(int DBID)
} }
qobject_cast<FMVipRefund*>(_window)->refresh(); qobject_cast<FMVipRefund*>(_window)->refresh();
qobject_cast<FMVipRefund*>(_window)->setIsRefundSuccess(true);
} else { } else {
QString msg = searchJsonValue(rspObj, PosProps.Msg).toString(); QString msg = searchJsonValue(rspObj, PosProps.Msg).toString();
FMMsgWnd::FailureWnd(msg, _window); FMMsgWnd::FailureWnd(msg, _window);
...@@ -93,9 +99,10 @@ void TaskRefund::onRefundOrder(int DBID) ...@@ -93,9 +99,10 @@ void TaskRefund::onRefundOrder(int DBID)
QJsonObject rspObj = QJsonDocument::fromJson(rspData).object(); QJsonObject rspObj = QJsonDocument::fromJson(rspData).object();
if(rspObj[PosProps.StatusCode].toInt() == FM_API_SUCCESS) { if(rspObj[PosProps.StatusCode].toInt() == FM_API_SUCCESS) {
orderPointer->setPaidAmount(0); orderPointer->setRefunded(true);
DBOP::Save(orderPointer.data()); DBOP::Save(orderPointer.data());
qobject_cast<FMVipRefund*>(_window)->refresh(); qobject_cast<FMVipRefund*>(_window)->refresh();
qobject_cast<FMVipRefund*>(_window)->setIsRefundSuccess(true);
_refundAmount = orderPointer->paidAmount(); _refundAmount = orderPointer->paidAmount();
} else { } else {
......
...@@ -13,7 +13,8 @@ ...@@ -13,7 +13,8 @@
FMVipRefund::FMVipRefund(QDialog *parent) : FMVipRefund::FMVipRefund(QDialog *parent) :
FMVipWnd(parent), FMVipWnd(parent),
ui(new Ui::FMVipRefund), ui(new Ui::FMVipRefund),
order(new FMItem::Order(this)) order(new FMItem::Order(this)) ,
_isRefundSuccess(false)
{ {
ui->setupUi(this); ui->setupUi(this);
} }
...@@ -52,10 +53,15 @@ bool FMVipRefund::initWnd(Session *session) ...@@ -52,10 +53,15 @@ bool FMVipRefund::initWnd(Session *session)
.arg(order->orderAmount()/100.0).arg(order->paidAmount()/100.0) .arg(order->orderAmount()/100.0).arg(order->paidAmount()/100.0)
.arg(storeInfo.businessDate()).arg(storeInfo.operatorId()) .arg(storeInfo.businessDate()).arg(storeInfo.operatorId())
.arg(storeInfo.storeId()).arg(storeInfo.posId()); .arg(storeInfo.storeId()).arg(storeInfo.posId());
if(order->settled()) { if(order->refunded()) {
orderInfo += QString::fromLocal8Bit("订单已退款\n");
ui->btn_refund_order->setEnabled(false);
} else if (order->settled()) {
orderInfo += QString::fromLocal8Bit("订单已结算,可以退整单\n"); orderInfo += QString::fromLocal8Bit("订单已结算,可以退整单\n");
ui->btn_refund_order->setEnabled(true);
} else { } else {
orderInfo += QString::fromLocal8Bit("订单还未结算,可以选择退某笔支付\n"); orderInfo += QString::fromLocal8Bit("订单还未结算,可以选择退某笔支付\n");
ui->btn_refund_order->setEnabled(false);
} }
ui->textEdit_order->setText(orderInfo); ui->textEdit_order->setText(orderInfo);
...@@ -87,8 +93,9 @@ bool FMVipRefund::initWnd(Session *session) ...@@ -87,8 +93,9 @@ bool FMVipRefund::initWnd(Session *session)
btn->setProperty("DBID", payPointer->DBID()); btn->setProperty("DBID", payPointer->DBID());
connect(btn, &QPushButton::clicked, this, &FMVipRefund::onBtnRefundClicked); connect(btn, &QPushButton::clicked, this, &FMVipRefund::onBtnRefundClicked);
ui->tableWidget_pays->setCellWidget(row, col, btn); ui->tableWidget_pays->setCellWidget(row, col, btn);
btn->setCursor(QCursor(Qt::PointingHandCursor));
if(payPointer->payAmount() <= payPointer->refundAmount()) { if((payPointer->payAmount() <= payPointer->refundAmount()) || order->settled() || order->refunded()) {
btn->setEnabled(false); btn->setEnabled(false);
} }
} }
...@@ -119,3 +126,22 @@ void FMVipRefund::on_btn_refund_order_clicked() ...@@ -119,3 +126,22 @@ void FMVipRefund::on_btn_refund_order_clicked()
{ {
emit refundOrder(order->DBID()); emit refundOrder(order->DBID());
} }
void FMVipRefund::on_close_btn_clicked()
{
if(_isRefundSuccess) {
this->accept();
} else {
this->reject();
}
}
bool FMVipRefund::isRefundSuccess() const
{
return _isRefundSuccess;
}
void FMVipRefund::setIsRefundSuccess(bool isRefundSuccess)
{
_isRefundSuccess = isRefundSuccess;
}
...@@ -25,6 +25,9 @@ public: ...@@ -25,6 +25,9 @@ public:
void refresh(); void refresh();
bool isRefundSuccess() const;
void setIsRefundSuccess(bool isRefundSuccess);
signals: signals:
void refundPay(int); void refundPay(int);
void refundOrder(int); void refundOrder(int);
...@@ -34,11 +37,15 @@ private slots: ...@@ -34,11 +37,15 @@ private slots:
void on_btn_refund_order_clicked(); void on_btn_refund_order_clicked();
void on_close_btn_clicked();
private: private:
Ui::FMVipRefund *ui; Ui::FMVipRefund *ui;
FMItem::Order *order; FMItem::Order *order;
QList<QSharedPointer<FMItem::Pay> > pays; QList<QSharedPointer<FMItem::Pay> > pays;
bool _isRefundSuccess;
}; };
#endif // FMVIPREFUND_H #endif // FMVIPREFUND_H
...@@ -211,6 +211,9 @@ ...@@ -211,6 +211,9 @@
</item> </item>
<item> <item>
<widget class="QPushButton" name="btn_refund_order"> <widget class="QPushButton" name="btn_refund_order">
<property name="cursor">
<cursorShape>PointingHandCursor</cursorShape>
</property>
<property name="text"> <property name="text">
<string>退整单</string> <string>退整单</string>
</property> </property>
......
...@@ -156,7 +156,7 @@ void TestItem::test_PropertyNames_data() ...@@ -156,7 +156,7 @@ void TestItem::test_PropertyNames_data()
QTest::newRow("Item") << gItem << itemPNames.length() << itemPNames; QTest::newRow("Item") << gItem << itemPNames.length() << itemPNames;
orderPNames << "objectName" << "DBID" <<"order_id" << "fm_order_id" << "order_amount" << "paid_amount" << "undis_amount" orderPNames << "objectName" << "DBID" <<"order_id" << "fm_order_id" << "order_amount" << "paid_amount" << "undis_amount"
<< "fm_open_id" << "products" << "settled" << "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" << "orderDBID";
......
...@@ -47,7 +47,7 @@ void TestPlugin::test_dotask_data() ...@@ -47,7 +47,7 @@ void TestPlugin::test_dotask_data()
{ {
QTest::addColumn<QByteArray>("reqData"); QTest::addColumn<QByteArray>("reqData");
QTest::newRow("Refund") << QByteArray("{\"fm_cmd\": 1004,\"order_id\": \"20171018001\"}"); 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\"}");
...@@ -56,27 +56,27 @@ void TestPlugin::test_dotask_data() ...@@ -56,27 +56,27 @@ void TestPlugin::test_dotask_data()
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\":9000," " \"order_amount\":900,"
" \"trans_amount\": 8000," " \"trans_amount\": 800,"
" \"undis_amount\": 8000," " \"undis_amount\": 800,"
" \"order_id\": \"20171018001\"," " \"order_id\": \"20171018003\","
" \"trans_id\": \"100001\"," " \"trans_id\": \"100001\","
" \"products\": [" " \"products\": ["
" {" " {"
" \"pid\": \"0079020\"," " \"pid\": \"0079020\","
" \"name\": \"测试商品1\"," " \"name\": \"测试商品1\","
" \"price\": 1000," " \"price\": 100,"
" \"consume_num\": 1" " \"consume_num\": 1"
" }," " },"
" { " " { "
" \"pid\": \"0077842\"," " \"pid\": \"0077842\","
" \"name\": \"测试商品2\"," " \"name\": \"测试商品2\","
" \"price\": 8000," " \"price\": 800,"
" \"consume_num\": 2" " \"consume_num\": 2"
" }" " }"
" ]" " ]"
"}"); "}");
QTest::newRow("Order") << QByteArray("{\"fm_cmd\": 1007,\"order_id\": \"20171018001\"}"); 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\"}");
} }
......
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