Commit 3ad0cb12 by NitefullWind

1. 修改支付、结算。支持混合支付。

parent 3ff6ecbf
......@@ -54,7 +54,7 @@ bool DBOP::CreateTable(const QString &tableName)
"[undis_amount] INT DEFAULT 0, "
"[fm_open_id] VARCHAR(50), "
"[products] TEXT,"
"[settle] BOOL DEFAULT 0,"
"[settled] BOOL DEFAULT 0,"
"[storeInfoDBID] INTEGER DEFAULT 0"
");";
QString tablePaySql = "CREATE TABLE [Pay]("
......
......@@ -42,7 +42,11 @@ void FMVipDispatcher::doTask(const QByteArray &reqData, QByteArray &rspData)
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(reqData, &error);
qDebug() << error.errorString();
if(error.error != QJsonParseError::NoError) {
FMP_ERROR() << "Parse req json error: " << error.errorString();
rspData = QString::fromLocal8Bit("{\"msg:\":\"请求数据解析失败:\"}").arg(error.errorString()).toUtf8();
return;
}
QJsonObject jsonObj = doc.object();
FM_TYPE type = (FM_TYPE)jsonObj["fm_cmd"].toInt();
......
......@@ -113,6 +113,7 @@ struct PP{
Transaction = "transactions";
OrderAmount = "order_amount";
PaidAmount = "paid_amount";
TransAmount = "trans_amount";
DisAmount = "dis_amount";
UndisAmount = "undis_amount";
NeedAmount = "need_amount";
......@@ -198,6 +199,7 @@ struct PP{
QString OrderAmount ;
QString NeedAmount ;
QString PaidAmount ;
QString TransAmount ;
QString DisAmount ;
QString UndisAmount ;
QString StandardAmount ;
......
......@@ -16,7 +16,7 @@ namespace FMItem {
Q_PROPERTY(int dis_amount READ disAmount WRITE setDisAmount)
Q_PROPERTY(QString account READ account WRITE setAccount)
Q_PROPERTY(QString trans_id READ transId WRITE setTransId)
Q_PROPERTY(QString fmTransId READ fmTransId WRITE setFmTransId)
Q_PROPERTY(QString fm_trans_id READ fmTransId WRITE setFmTransId)
Q_PROPERTY(int orderDBID READ orderDBID WRITE setOrderDBID)
public:
explicit Pay(QObject *parent = 0);
......
......@@ -36,6 +36,15 @@ void TaskFinal::packagePOSReq()
posReqJsonObj = storeInfo.toJson(QStringList(), posReqJsonObj);
_order->setStoreInfoDBID(storeInfo.DBID());
}
if(_order->isNew()) {
_order->SetPropertiesByJson(posReqJsonObj);
DBOP::Save(_order);
} else if(_order->settled()) {
QString info = QString::fromLocal8Bit("订单已结算,不能重复结算.");
FMP_WARN() << info;
setError(FM_API_ERROR, info);
}
}
void TaskFinal::packageServerReq()
......@@ -79,100 +88,52 @@ void TaskFinal::packageServerReq()
// }
// Pays
QJsonArray payArray;
// 从数据库读取支付信息
QList<QSharedPointer<FMItem::Pay> > payList = DBOP::GetPaysByOrderDBId(_order->DBID());
// 将POS新传的支付方式加入已付到金额中
foreach (QJsonValue payValue, getPosJsonValue(PosProps.Pay_list).toArray()) {
QJsonObject pay_id = payValue.toObject();
QSharedPointer<FMItem::Pay> payPointer(new FMItem::Pay(this));
payPointer->SetPropertiesByJson(pay_id);
payPointer->setOrderDBID(_order->DBID());
if(payPointer->payId() == "20001" || payPointer->payId() == "10001" || payPointer->payId() == "10004") {
FMP_WARN() << QString::fromLocal8Bit("POS无需传会员支付和非码支付信息.");
continue;
} else {
_order->setPaidAmount(_order->paidAmount() + payPointer->payAmount());
payList.append(payPointer);
}
}
// 如果订单还未付完,默认以现金补全
if(_order->orderAmount() > _order->paidAmount()) {
QSharedPointer<FMItem::Pay> cashPay(new FMItem::Pay());
cashPay->setPayId("20005");
cashPay->setPayStr(QString::fromLocal8Bit("现金支付(默认)"));
cashPay->setPayAmount(_order->orderAmount() - _order->paidAmount());
cashPay->setTransId(_order->orderId());
payList.append(cashPay);
cashPay->setOrderDBID(_order->DBID());
bool isOk = DBOP::Save(cashPay.data());
if(isOk) {
_order->setPaidAmount(_order->orderAmount());
payList.append(cashPay);
}
}
// 转成服务端需要的payArray
QJsonArray payArray;
for (QList<QSharedPointer<FMItem::Pay> >::const_iterator it = payList.constBegin(); it!=payList.constEnd(); it++) {
QJsonObject payObj;
payObj[ServerProps(PosProps.Amount)] = it->data()->payAmount();
payObj[ServerProps(PosProps.TransId)] = it->data()->transId();
payObj["thirdPayTransId"] = it->data()->fmTransId();
QString typeModeFlag = it->data()->payId();
if(typeModeFlag == "20005") {
//现金支付
payObj["typeModeFlag"] = "20005";
} else if (typeModeFlag == "20010") {
payObj["typeModeFlag"] = "20010";
} else if(typeModeFlag == "10011") {
payObj["typeModeFlag"] = "10011";
} else {
payObj["typeModeFlag"] = typeModeFlag;
}
payObj["typeModeFlag"] = it->data()->payId();
payArray.append(payObj);
}
dataObj[ServerProps(PosProps.Pay_list)] = payArray;
serverReqJsonObj["data"] = dataObj;
// QJsonObject transData;
// std::vector<QString> p;
// p.push_back(PosProps.BussinessDate);
// p.push_back(PosProps.TransId);
// p.push_back(PosProps.Fm_id);
// p.push_back(PosProps.Fm_open_id);
// p.push_back(PosProps.OrderAmount);
// p.push_back(PosProps.PaidAmount);
// foreach(auto prop , p) {
// transData[ServerProps(prop)] = getPosJsonValue(prop);
// }
// if (transData[ServerProps(PosProps.PaidAmount)].toInt() == 0) {
// transData[ServerProps(PosProps.PaidAmount)] = transData[ServerProps(PosProps.OrderAmount)];
// }
// // 产品列表
// QJsonArray products;
// foreach(auto p , getPosJsonValue("products").toArray())
// {
// QJsonObject product;
// product["consumNum"] = p.toObject()["consume_num"];
// int price = p.toObject()["price"].toDouble()*100;
// product["price"] = price;
// product["productId"] = p.toObject()["pid"];
// products.append(product);
// }
// transData["productList"] = products;
// QJsonArray payList;
// foreach(auto p, getPosJsonValue(PosProps.Pay_ids).toArray())
// {
// QJsonObject pay;
// pay["amount"] = p.toObject()["pay_amount"];
// pay["thirdPayTransId"] = p.toObject()["pay_transId"].toString();
// pay["code"] = p.toObject()["code"].toString();
// pay[ServerProps(PosProps.TransId)] = getPosJsonValue(PosProps.TransId);
// QString typeModeFlag = p.toObject()["pay_id"].toString();
// if(typeModeFlag == "0101") {
// //现金支付
// pay["typeModeFlag"] = "20005";
// } else if (typeModeFlag == "0103") {
// pay["typeModeFlag"] = "20010";
// } else if(typeModeFlag == "0301") {
// pay["typeModeFlag"] = "10011";
// } else if(typeModeFlag == "0302") {
// pay["typeModeFlag"] = "10011";
// } else if(typeModeFlag == "0303") {
// pay["typeModeFlag"] = "10011";
// } else {
// pay["typeModeFlag"] = typeModeFlag;
// }
// payList.append(pay);
// }
// transData["payList"] = payList;
// serverReqJsonObj["data"] = transData;
}
bool TaskFinal::sendToServer(bool isShowMsg)
......@@ -218,7 +179,23 @@ void TaskFinal::packagePOSRsp()
ext[PosProps.Print] = getServerJsonValue(PosProps.Print1);
posRspJsonObj["ext"] = ext;
if(getServerJsonValue(PosProps.StatusCode).toInt() == FM_API_SUCCESS) {
// 保存其它支付方式
foreach(QJsonValue payVluae, getPosJsonValue(PosProps.Pay_list).toArray()) {
QJsonObject pay_id = payVluae.toObject();
int amount = pay_id[PosProps.Pay_amount].toInt();
if(amount!=0) {
FMItem::Pay *pay = new FMItem::Pay(this);
pay->SetPropertiesByJson(pay_id);
pay->setOrderDBID(_order->DBID());
DBOP::Save(pay);
delete pay;
}
}
_order->setFmOrderId(getServerJsonValue(PosProps.Fm_order_id).toString());
_order->setSettled(true);
DBOP::Save(_order);
}
......
......@@ -21,7 +21,7 @@ void TaskFund::packagePOSReq()
preTask->session()->addData(PosProps.FM_Type, FM_Fund);
preTask->doTask();
if(preTask->error() != FM_API_SUCCESS) {
setError(preTask->error());
this->setError(preTask->error(), preTask->errorString());
}
}
......
......@@ -16,15 +16,30 @@ using namespace FMItem;
TaskPay::TaskPay(QJsonObject &jsonObj, Session *session, QObject *parent)
:FMTask(jsonObj, FM_Pay, session, parent)
, _order(new Order(this))
{
}
TaskPay::~TaskPay()
{
delete _order;
}
void TaskPay::packagePOSReq()
{
FMItem::StoreInfo storeInfo;
DBOP::GetLastItem(&storeInfo);
posReqJsonObj = storeInfo.toJson(QStringList(), posReqJsonObj);
// 检查订单是否已结算
QString orderId = getPosJsonValue(PosProps.OrderId).toString();
DBOP::GetOrderByOrderId(orderId, _order);
if(_order->settled()) {
QString info = QString::fromLocal8Bit("订单已结算,不能再进行支付.");
FMP_WARN() << info;
setError(FM_API_ERROR, info);
return;
}
QString fm_open_id_pos = getPosJsonValue(PosProps.Fm_open_id).toString();
QString fm_open_id_session = session()->data(PosProps.Fm_open_id).toString();
......@@ -33,18 +48,19 @@ void TaskPay::packagePOSReq()
preTask->session()->addData(PosProps.FM_Type, FM_Pay);
preTask->doTask();
if(preTask->error() != FM_API_SUCCESS) {
setError(preTask->error());
this->setError(preTask->error(), preTask->errorString());
}
this->_session = preTask->session();
}
session()->addData(PosProps.OrderAmount, getPosJsonValue(PosProps.OrderAmount).toInt());
session()->addData(PosProps.PaidAmount, getPosJsonValue(PosProps.PaidAmount).toInt());
session()->addData(PosProps.TransAmount, getPosJsonValue(PosProps.TransAmount).toInt());
session()->addData(PosProps.UndisAmount, getPosJsonValue(PosProps.UndisAmount).toInt());
couponThread = new TaskCouponThread(posReqJsonObj, _session, this);
couponThread->start();
connect(couponThread, SIGNAL(finished(Session*)), SLOT(onGetCoupons(Session*)));
//! FIXME 启用couponThread线程后,网络异常时setError函数崩溃
// couponThread = new TaskCouponThread(posReqJsonObj, _session, this);
// couponThread->start();
// connect(couponThread, SIGNAL(finished(Session*)), SLOT(onGetCoupons(Session*)));
}
void TaskPay::onGetCoupons(Session* session)
......@@ -174,18 +190,16 @@ void TaskPay::packagePOSRsp()
posRspJsonObj[PosProps.Fm_order_id] = fm_order_id;
posRspJsonObj[PosProps.Fm_trans_id] = fm_order_id;
Order *order = new Order(this);
DBOP::GetOrderByOrderId(orderId, order);
// 如果订单是新的,则保存在数据库中
if(isOk && order->isNew()) {
order->SetPropertiesByJson(posReqJsonObj);
order->SetPropertiesByJson(posRspJsonObj);
if(isOk && _order->isNew()) {
_order->SetPropertiesByJson(posReqJsonObj);
_order->SetPropertiesByJson(posRspJsonObj);
FMItem::StoreInfo storeInfo;
DBOP::GetLastItem(&storeInfo);
order->setStoreInfoDBID(storeInfo.DBID());
_order->setStoreInfoDBID(storeInfo.DBID());
isOk = DBOP::Save(order);
isOk = DBOP::Save(_order);
}
QJsonArray servPayArray = getServerJsonValue("payList").toArray();
......@@ -216,20 +230,18 @@ void TaskPay::packagePOSRsp()
Pay *pay = new Pay(this);
pay->SetPropertiesByJson(pay_id);
pay->setTransId(transId);
pay->setOrderDBID(order->DBID());
pay->setOrderDBID(_order->DBID());
pay->setAccount(fm_open_id);
pay->setFmTransId(transId);
DBOP::Save(pay);
order->setPaidAmount(order->paidAmount()+amount);
DBOP::Save(order);
_order->setPaidAmount(_order->paidAmount()+amount);
DBOP::Save(_order);
delete pay;
}
}
posRspJsonObj[PosProps.PaidAmount] = totalPaid;
posRspJsonObj[PosProps.Pay_list] = pay_ids;
posRspJsonObj[PosProps.DisAmount] = 0;
delete order;
}
void TaskPay::onPay()
......
......@@ -6,11 +6,16 @@
class TaskCouponThread;
namespace FMItem {
class Order;
}
class TaskPay : public FMTask
{
Q_OBJECT
public:
explicit TaskPay(QJsonObject &jsonObj, Session *session = 0, QObject *parent = 0);
~TaskPay();
void packagePOSReq();
void setWindow();
......@@ -23,6 +28,7 @@ private slots:
private:
TaskCouponThread *couponThread;
FMItem::Order *_order;
};
// 加载代金券的线程类
......
......@@ -62,7 +62,7 @@ void TaskRefund::onRefundPay(int DBID)
posReqJsonObj = orderPointer->toJson(QStringList(), posReqJsonObj);
posReqJsonObj[PosProps.TransId] = orderPointer->orderId();
posReqJsonObj[PosProps.TransId] = payPointer->fmTransId();
TaskRefundPay refundPay(posReqJsonObj, this);
QByteArray rspData = refundPay.doTask();
......
......@@ -36,7 +36,7 @@ bool FMVipOrder::initWnd(Session *session)
QString score_str = QString::number(session->data(PosProps.Score).toInt());
int orderAmount = session->data(PosProps.OrderAmount).toInt();
int needPay = orderAmount - session->data(PosProps.PaidAmount).toInt();
int needPay = session->data(PosProps.TransAmount).toInt();
session->addData(PosProps.NeedAmount, needPay);
QString needPay_str = QString::number(needPay);
......
......@@ -159,7 +159,7 @@ void TestItem::test_PropertyNames_data()
<< "fm_open_id" << "products" << "settled" << "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" << "fmTransId" << "orderDBID";
payPNames << "objectName" << "DBID" <<"pay_id" << "pay_str" << "pay_amount" << "refund_amount" << "dis_amount" << "account" << "trans_id" << "fm_trans_id" << "orderDBID";
QTest::newRow("Pay") << gPay << payPNames.length() << payPNames;
productPNames << "objectName" << "DBID" << "id" <<"quantity" << "price" << "name";
......
......@@ -5,7 +5,7 @@
#define VER_MINOR 1
#define VER_REVISION 0
#define VER_BUILD 17
#define VER_BUILD 18
//! 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