Commit 62e0fa72 by NitefullWind

1. 实现退款退单。

parent a77fbb94
#include "taskrefund.h"
#include "fmviprefund.h"
#include "database/dbop.h"
//#include "items/item.h"
//#include "items/order.h"
//#include "items/pay.h"
//#include "items/storeinfo.h"
#include "taskothers.h"
#include <QSharedPointer>
#include <QJsonDocument>
#include "fmmsgwnd.h"
using namespace DB;
TaskRefund::TaskRefund(QJsonObject &jsonObj, Session *session, QObject *parent)
: FMTask(jsonObj, FM_Refund, session, parent)
, _refundAmount(0)
// , _order(new FMItem::Order(this))
, _order(new Order())
{
}
TaskRefund::~TaskRefund()
{
// delete _order;
}
void TaskRefund::packagePOSReq()
{
// QString orderId = getPosJsonValue(PosProps.OrderId).toString();
// session()->addData(PosProps.OrderId, orderId);
// FMItem::StoreInfo storeInfo;
// bool isOk = DBOP::GetLastItem(&storeInfo);
// if(isOk) {
// posReqJsonObj = storeInfo.toJson(QStringList(), posReqJsonObj);
// } else {
// QString info = QString::fromLocal8Bit("未设置门店信息,不能进行退款.");
// FMP_WARN() << info;
// setError(FM_API_ERROR, info);
// return;
// }
// DBOP::GetOrderByOrderId(orderId, _order);
// if(_order->isNew()) {
// QString info = QString::fromLocal8Bit("未找到订单信息,不能进行退款.");
// FMP_WARN() << info;
// setError(FM_API_ERROR, info);
// return;
// } else if(DBOP::GetPaysByOrderDBId(_order->DBID()).isEmpty()) {
// QString info = QString::fromLocal8Bit("订单中没有可以进行退款的支付.");
// FMP_WARN() << info;
// setError(FM_API_ERROR, info);
// return;
// }
QString orderId = getPosJsonValue(PosProps.OrderId).toString();
session()->addData(PosProps.OrderId, orderId);
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();
try {
// _transactionPay.reset(DBSP()->begin());
transaction t(DBSP()->begin());
// 检查订单是否已存在
odb::result<Order> r = DBSP()->query<Order>(query<Order>::orderId == orderId);
if(r.empty()) {
QString info = QString::fromLocal8Bit("未找到订单信息,不能进行退款.");
FMP_ERROR() << info;
setError(FM_API_ERROR, info);
} else {
_order = DBSP()->load<Order>(r.begin()->id());
// 检查订单是否已结算
if(_order->payList().isEmpty()) {
QString info = QString::fromLocal8Bit("订单中没有可以进行退款的支付.");
FMP_ERROR() << info;
setError(FM_API_ERROR, info);
return;
}
session()->addData("RefundOrderDBID", (qulonglong)(_order->id()));
}
} catch (const odb::exception &e) {
QString info = QString::fromLocal8Bit("查询订单时异常:%1").arg(e.what());
FMP_ERROR() << info;
setError(FM_API_ERROR, info);
return;
}
}
void TaskRefund::setWindow()
{
// // 已结算则直接退订单
// if(_order->settled()) {
// onRefundOrder(_order->DBID());
// }
// // 未结算,仅有一笔支付则直接退该笔支付
//// else if(_order->payList().size() == 1) {
//// onRefundPay(_order->payList().first()->DBID());
//// }
// // 其他情况显示界面
// else {
// _window = new FMVipRefund();
// connect(qobject_cast<FMVipRefund*>(_window), &FMVipRefund::refundPay, this, &TaskRefund::onRefundPay);
// connect(qobject_cast<FMVipRefund*>(_window), &FMVipRefund::refundOrder, this, &TaskRefund::onRefundOrder);
// }
// 已结算则直接退订单
if(_order->settled()) {
onRefundOrder(_order->id());
}
// 未结算,仅有一笔支付则直接退该笔支付
else if(_order->payList().size() == 1) {
QSharedPointer<Pay> firstPay = _order->payList().first().load();
onRefundPay(firstPay->id());
}
// 其他情况显示界面
else {
_window = new FMVipRefund();
connect(qobject_cast<FMVipRefund*>(_window), &FMVipRefund::refundPay, this, &TaskRefund::onRefundPay);
connect(qobject_cast<FMVipRefund*>(_window), &FMVipRefund::refundOrder, this, &TaskRefund::onRefundOrder);
}
}
void TaskRefund::packageServerReq()
......@@ -83,60 +99,80 @@ void TaskRefund::packagePOSRsp()
posRspJsonObj["refund_amount"] = _refundAmount;
}
void TaskRefund::onRefundPay(int DBID)
void TaskRefund::onRefundPay(unsigned long DBID)
{
// posReqJsonObj[PosProps.TransId] = session()->data(PosProps.TransId).toString();
// QSharedPointer<FMItem::Pay> payPointer = DBOP::GetPayByDBId(DBID);
// QSharedPointer<FMItem::Order> orderPointer = DBOP::GetOrderByDBId(payPointer->orderDBID());
// posReqJsonObj = orderPointer->toJson(QStringList(), posReqJsonObj);
// posReqJsonObj[PosProps.TransId] = payPointer->fmTransId();
// 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());
// _refundAmount += payPointer->payAmount();
// }
// if(_window!=nullptr) {
// qobject_cast<FMVipRefund*>(_window)->refresh();
// qobject_cast<FMVipRefund*>(_window)->setIsRefundSuccess(true);
// }
// } else {
// QString msg = searchJsonValue(rspObj, PosProps.Msg).toString();
// FMMsgWnd::FailureWnd(msg, _window);
// }
posReqJsonObj[PosProps.TransId] = session()->data(PosProps.TransId).toString();
try {
odb::transaction t(DBSP()->begin());
QSharedPointer<Pay> payPointer = DBSP()->load<Pay>(DBID);
posReqJsonObj[PosProps.TransId] = payPointer->fmTransId();
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());
DBSP()->persist(payPointer);
_order->setPaidAmount(_order->paidAmount() - payPointer->refundAmount());
DBSP()->persist(_order);
_refundAmount += payPointer->payAmount();
if(_window!=nullptr) {
qobject_cast<FMVipRefund*>(_window)->refresh();
qobject_cast<FMVipRefund*>(_window)->setIsRefundSuccess(true);
}
} else {
QString msg = searchJsonValue(rspObj, PosProps.Msg).toString();
FMMsgWnd::FailureWnd(msg, _window);
}
} catch (const odb::exception &e) {
QString info = QString::fromLocal8Bit("支付退款失败:%1").arg(e.what());
FMP_ERROR() << info;
setError(FM_API_ERROR, info);
return;
}
}
void TaskRefund::onRefundOrder(int DBID)
void TaskRefund::onRefundOrder(unsigned long DBID)
{
// QSharedPointer<FMItem::Order> orderPointer = DBOP::GetOrderByDBId(DBID);
// posReqJsonObj[PosProps.Fm_order_id] = orderPointer->fmOrderId();
// posReqJsonObj[PosProps.OrderId] = orderPointer->orderId();
// TaskRefundOrder refundOrder(posReqJsonObj, this);
// QByteArray rspData = refundOrder.doTask();
// QJsonObject rspObj = QJsonDocument::fromJson(rspData).object();
// if(rspObj[PosProps.StatusCode].toInt() == FM_API_SUCCESS) {
// orderPointer->setRefunded(true);
// DBOP::Save(orderPointer.data());
// if(_window!=nullptr) {
// qobject_cast<FMVipRefund*>(_window)->refresh();
// qobject_cast<FMVipRefund*>(_window)->setIsRefundSuccess(true);
// }
// _refundAmount = orderPointer->paidAmount();
// } else {
// QString msg = searchJsonValue(rspObj, PosProps.Msg).toString();
// FMMsgWnd::FailureWnd(msg, _window);
// }
Q_UNUSED(DBID);
try {
odb::transaction t(DBSP()->begin());
posReqJsonObj[PosProps.Fm_order_id] = _order->fmOrderId();
posReqJsonObj[PosProps.OrderId] = _order->orderId();
TaskRefundOrder refundOrder(posReqJsonObj, this);
QByteArray rspData = refundOrder.doTask();
QJsonObject rspObj = QJsonDocument::fromJson(rspData).object();
if(rspObj[PosProps.StatusCode].toInt() == FM_API_SUCCESS) {
_order->setRefunded(true);
DBSP()->persist(_order);
if(_window!=nullptr) {
qobject_cast<FMVipRefund*>(_window)->refresh();
qobject_cast<FMVipRefund*>(_window)->setIsRefundSuccess(true);
}
_refundAmount = _order->paidAmount();
} else {
QString msg = searchJsonValue(rspObj, PosProps.Msg).toString();
FMMsgWnd::FailureWnd(msg, _window);
}
t.commit();
} catch (const odb::exception &e) {
QString info = QString::fromLocal8Bit("订单退款失败:%1").arg(e.what());
FMP_ERROR() << info;
setError(FM_API_ERROR, info);
return;
}
}
#ifndef TASKREFUND_H
#define TASKREFUND_H
#include "fmtask.h"
//namespace FMItem {
//class Order;
//}
#include "database.h"
class TaskRefund : public FMTask
{
......@@ -20,11 +17,11 @@ private:
void packagePOSRsp();
private:
void onRefundPay(int DBID);
void onRefundOrder(int DBID);
void onRefundPay(unsigned long DBID);
void onRefundOrder(unsigned long DBID);
int _refundAmount;
// FMItem::Order *_order;
QSharedPointer<DB::Order> _order;
};
#endif // TASKREFUND_H
......@@ -5,15 +5,13 @@
#include <QMutex>
#include "fmloading.h"
#include "fmmsgwnd.h"
//#include "dbop.h"
//#include "items/order.h"
//#include "items/pay.h"
//#include "items/storeinfo.h"
using namespace DB;
FMVipRefund::FMVipRefund(QDialog *parent) :
FMVipWnd(parent),
ui(new Ui::FMVipRefund),
// order(new FMItem::Order(this)) ,
_order(new Order()) ,
_isRefundSuccess(false)
{
ui->setupUi(this);
......@@ -22,89 +20,93 @@ FMVipRefund::FMVipRefund(QDialog *parent) :
FMVipRefund::~FMVipRefund()
{
delete ui;
// delete order;
// pays.clear();
}
bool FMVipRefund::initWnd(Session *session)
{
// this->_session = session;
// ui->store_label->setText(session->data(PosProps.StoreId).toString());
// 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 orderId = session->data(PosProps.OrderId).toString();
// DBOP::GetOrderByOrderId(orderId, order);
// FMItem::StoreInfo storeInfo;
// DBOP::GetItemByDBID(order->storeInfoDBID(), &storeInfo);
// if(order->isNew()) {
// ui->textEdit_order->setText(QString::fromLocal8Bit("未找到orderId为 %1 的订单! ").arg(orderId));
// } 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->orderId()).arg(order->fmOrderId())
// .arg(order->orderAmount()/100.0).arg(order->paidAmount()/100.0)
// .arg(storeInfo.businessDate()).arg(storeInfo.operatorId())
// .arg(storeInfo.storeId()).arg(storeInfo.posId());
// if(order->refunded()) {
// orderInfo += QString::fromLocal8Bit("订单已退款\n");
// ui->btn_refund_order->setEnabled(false);
// } else if (order->settled()) {
// orderInfo += QString::fromLocal8Bit("订单已结算,可以退整单\n");
// ui->btn_refund_order->setEnabled(true);
// } else {
// orderInfo += QString::fromLocal8Bit("订单还未结算,可以选择退某笔支付\n");
// ui->btn_refund_order->setEnabled(false);
// }
// ui->textEdit_order->setText(orderInfo);
// pays = DBOP::GetPaysByOrderDBId(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);
// btn->setCursor(QCursor(Qt::PointingHandCursor));
// if((payPointer->payAmount() <= payPointer->refundAmount()) || order->settled() || order->refunded()
// || payPointer->payId()!="20001") {
// btn->setEnabled(false);
// }
// }
// row++;
// col = 0;
// }
// }
this->_session = session;
ui->store_label->setText(session->data(PosProps.StoreId).toString());
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.BusinessDate).toString());
unsigned long orderDBID = session->data("RefundOrderDBID").toULongLong();
try {
odb::transaction t(DBSP()->begin());
_order = DBSP()->load<Order>(orderDBID);
QSharedPointer<StoreInfo> storeInfo = _order->storeInfo().load();
QString orderInfo = QString::fromLocal8Bit("POS订单号:%1\n"
"非码订单号:%2\n"
"订单总额:%3 \t 已付金额:%4\n"
"营业日:%5 \t 收银员:%6\n"
"门店号:%7 \t POS号:%8\n")
.arg(_order->orderId()).arg(_order->fmOrderId())
.arg(_order->orderAmount()/100.0).arg(_order->paidAmount()/100.0)
.arg(storeInfo->businessDate()).arg(storeInfo->operatorId())
.arg(storeInfo->storeId()).arg(storeInfo->posId());
if(_order->refunded()) {
orderInfo += QString::fromLocal8Bit("订单已退款\n");
ui->btn_refund_order->setEnabled(false);
} else if (_order->settled()) {
orderInfo += QString::fromLocal8Bit("订单已结算,可以退整单\n");
ui->btn_refund_order->setEnabled(true);
} else {
orderInfo += QString::fromLocal8Bit("订单还未结算,可以选择退某笔支付\n");
ui->btn_refund_order->setEnabled(false);
}
ui->textEdit_order->setText(orderInfo);
foreach(auto payLazyPointer, _order->payList()) {
_pays.append(payLazyPointer.load());
}
} catch (const odb::exception &e) {
QString info = QString::fromLocal8Bit("查询订单时异常:%1").arg(e.what());
qDebug() << info;
return false;
}
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", (qulonglong)payPointer->id());
connect(btn, &QPushButton::clicked, this, &FMVipRefund::onBtnRefundClicked);
ui->tableWidget_pays->setCellWidget(row, col, btn);
btn->setCursor(QCursor(Qt::PointingHandCursor));
if((payPointer->payAmount() <= payPointer->refundAmount()) || _order->settled() || _order->refunded()
|| payPointer->payId()!="20001") {
btn->setEnabled(false);
}
}
row++;
col = 0;
}
return true;
}
......
......@@ -2,17 +2,12 @@
#define FMVIPREFUND_H
#include "fmvipwnd.h"
#include "database.h"
namespace Ui {
class FMVipRefund;
}
//namespace FMItem {
//class Order;
//class Pay;
//}
class FMVipRefund : public FMVipWnd
{
Q_OBJECT
......@@ -42,8 +37,8 @@ private slots:
private:
Ui::FMVipRefund *ui;
// FMItem::Order *order;
// QList<QSharedPointer<FMItem::Pay> > pays;
QSharedPointer<DB::Order> _order;
QList<QSharedPointer<DB::Pay> > _pays;
bool _isRefundSuccess;
};
......
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