Commit 7ecbe169 by NitefullWind

1. 修改一些Session的添加时机。 2. 修改readme文档。加入使用说明。

parent 2f7323be
...@@ -32,6 +32,7 @@ MainWindow::MainWindow(QWidget *parent) : ...@@ -32,6 +32,7 @@ MainWindow::MainWindow(QWidget *parent) :
highlighter = new Highlighter(ui->console->document()); highlighter = new Highlighter(ui->console->document());
connect(Setting::Instance(), &Setting::newLog, this, &MainWindow::onNewLog); connect(Setting::Instance(), &Setting::newLog, this, &MainWindow::onNewLog);
resetTransId(); resetTransId();
Setting::getSession()->addData("business_date", QDate::currentDate().toString("yyyyMMdd"));
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
...@@ -56,13 +57,31 @@ void MainWindow::InitProductList() ...@@ -56,13 +57,31 @@ void MainWindow::InitProductList()
void MainWindow::onProductSelectedChanged() void MainWindow::onProductSelectedChanged()
{ {
orderAmount = 0; orderAmount = 0;
QJsonArray productsArray;
foreach(ProductWidget* pw, productWidgeVector) { foreach(ProductWidget* pw, productWidgeVector) {
Setting::Product pro = pw->getProduct(); Setting::Product pro = pw->getProduct();
orderAmount += pro.pro_price * pw->selectedCount(); orderAmount += pro.pro_price * pw->selectedCount();
if(pw->selectedCount() > 0) {
QJsonObject proObj;
Setting::Product product = pw->getProduct();
proObj["pid"] = product.pro_id;
#ifdef KA_LXJ
proObj["price"] = product.pro_price * pw->selectedCount();
#else
proObj["price"] = product.pro_price;
#endif
proObj["consume_num"] = pw->selectedCount();
productsArray.append(proObj);
}
} }
needPayAmount = orderAmount - paidAmount; needPayAmount = orderAmount - paidAmount;
showAmountInfo(); showAmountInfo();
QString productsStr = Setting::getJsonValueString(productsArray);
Setting::Instance()->getSession()->addData("products", productsStr);
} }
void MainWindow::InitPayList() void MainWindow::InitPayList()
...@@ -80,26 +99,6 @@ void MainWindow::InitPayList() ...@@ -80,26 +99,6 @@ void MainWindow::InitPayList()
void MainWindow::onPaySelected() void MainWindow::onPaySelected()
{ {
Setting::Instance()->getSession()->addData("order_amount", orderAmount);
Setting::Instance()->getSession()->addData("paid_amount", paidAmount);
QJsonArray productsArray;
foreach (ProductWidget *pw, productWidgeVector) {
if(pw->selectedCount() > 0) {
QJsonObject proObj;
Setting::Product product = pw->getProduct();
proObj["pid"] = product.pro_id;
#ifdef KA_LXJ
proObj["price"] = product.pro_price * pw->selectedCount();
#else
proObj["price"] = product.pro_price;
#endif
proObj["consume_num"] = pw->selectedCount();
productsArray.append(proObj);
}
}
QString productsStr = Setting::getJsonValueString(productsArray);
Setting::Instance()->getSession()->addData("products", productsStr);
PayWidget *payWdiget = qobject_cast<PayWidget*>(sender()); PayWidget *payWdiget = qobject_cast<PayWidget*>(sender());
int payAmount = 0; int payAmount = 0;
...@@ -166,6 +165,23 @@ void MainWindow::showAmountInfo() ...@@ -166,6 +165,23 @@ void MainWindow::showAmountInfo()
PayWidget* pw = it.key(); PayWidget* pw = it.key();
pw->setPayAmount(it.value()); pw->setPayAmount(it.value());
} }
Setting::Instance()->getSession()->addData("order_amount", orderAmount);
Setting::Instance()->getSession()->addData("paid_amount", paidAmount);
QJsonArray payList;
foreach (PayWidget *payWidget, payWidgetMap.keys()) {
if(payWidgetMap[payWidget] <= 0) {
continue;
}
QJsonObject payObj;
payObj["pay_id"] = payWidget->getPayWay().pay_id;
payObj["pay_str"] = payWidget->getPayWay().pay_name;
payObj["pay_amount"] = payWidgetMap[payWidget];
payObj["pay_transId"] = payWidget->getPayWay().pay_transId;
payList.append(payObj);
}
Setting::Instance()->getSession()->addData("pay_ids", Setting::getJsonValueString(payList));
} }
int MainWindow::showPayDialog(int amount, bool isPay) int MainWindow::showPayDialog(int amount, bool isPay)
...@@ -251,12 +267,13 @@ void MainWindow::on_btn_reset_clicked() ...@@ -251,12 +267,13 @@ void MainWindow::on_btn_reset_clicked()
} }
payWidgetMap.clear(); payWidgetMap.clear();
ui->lineEdit_undisAmount->setText("0"); ui->lineEdit_undisAmount->setText("0");
showAmountInfo();
Setting::getSession()->clear();
resetTransId();
} else if(ui->tab_raw) { } else if(ui->tab_raw) {
ui->textEdit_raw->clear(); ui->textEdit_raw->clear();
} }
Setting::getSession()->clear();
showAmountInfo();
resetTransId();
Setting::getSession()->addData("business_date", QDate::currentDate().toString("yyyyMMdd"));
} }
void MainWindow::resetTransId() void MainWindow::resetTransId()
...@@ -293,26 +310,6 @@ void MainWindow::onBtnReqPosSelected() ...@@ -293,26 +310,6 @@ void MainWindow::onBtnReqPosSelected()
{ {
//! TODO 从文件读取,需要添加哪些session //! TODO 从文件读取,需要添加哪些session
//! NOTE 会员结算需要下面的信息
Setting::Instance()->getSession()->addData("order_amount", orderAmount);
Setting::Instance()->getSession()->addData("paid_amount", paidAmount);
QJsonArray payList;
foreach (PayWidget *payWidget, payWidgetMap.keys()) {
if(payWidgetMap[payWidget] <= 0) {
continue;
}
QJsonObject payObj;
payObj["pay_id"] = payWidget->getPayWay().pay_id;
payObj["pay_str"] = payWidget->getPayWay().pay_name;
payObj["pay_amount"] = payWidgetMap[payWidget];
payObj["pay_transId"] = payWidget->getPayWay().pay_transId;
payList.append(payObj);
}
Setting::Instance()->getSession()->addData("pay_ids", Setting::getJsonValueString(payList));
auto btn = qobject_cast<ReqDataBtn*>(sender()); auto btn = qobject_cast<ReqDataBtn*>(sender());
QJsonObject rspObj; QJsonObject rspObj;
doRequest(QString("%1_%2").arg(TagReqData).arg(btn->text()), rspObj); doRequest(QString("%1_%2").arg(TagReqData).arg(btn->text()), rspObj);
......
...@@ -13,12 +13,105 @@ ...@@ -13,12 +13,105 @@
- **原始数据**操作模式下,可保存、读取、删除请求数据并生成响应按钮。 - **原始数据**操作模式下,可保存、读取、删除请求数据并生成响应按钮。
- 支持高级版请求数据。 - 支持高级版请求数据。
## 运行说明 ## 使用说明
### 运行
将可执行文件和配置文件夹(目前必须名为postest)放在同一目录下。执行可执行程序。 将可执行文件和配置文件夹(目前必须名为postest)放在同一目录下。执行可执行程序。
### 操作
#### 模拟POS
程序界面如下图所示:
![模拟POS界面](http://172.16.12.240/zhenfei.zhang/FMTestPOS/raw/master/ScreenShots/模拟POS界面.png)
##### 共有区域
区域(1)、(6)、(7)为模拟POS和原始数据两种界面所共有的区域,两种操作模式下这些功能一样。
1. 区域(1):可以切换**模拟POS****原始数据**模式。切换时不删除任何数据信息。两种模式共享设置、Session数据(比如存储在Session中的trans_id在两种模式下相同)。
2. 区域(6):输出窗口,以不同颜色输出普通、调试、警告和错误信息。
3. 区域(7):**重置** 重置特有区域中输入的数据信息,清空所有Session,重置trans_id。**重置trans_id** 仅重新生成trans_id,其他数据不改变。**清空输出** 清空输出窗口。
##### 特有区域
区域(2)、(3)、(4)、(5)为模拟POS模式下所特有的功能。
1. 区域(2):显示配置文件中的商品信息。鼠标左键点击选中一个商品,多次点击增加商品数量,右键点击删除一个商品。
2. 区域(3):订单总额为选中的所有商品 数量\*价格 之和;待付金额为 订单总额-所有已付金额之和;不可优惠金额可任意输入。
3. 区域(4):显示配置文件中的支付方式信息。鼠标左键点击进行支付,右键点击退款。
3. 区域(5):显示配置文件中的自定义按钮。点击按钮会根据配置信息发送Socket请求。
#### 原始数据
程序界面如下图所示:
![原始数据界面](http://172.16.12.240/zhenfei.zhang/FMTestPOS/raw/master/ScreenShots/原始数据界面.png)
##### 共有区域
与模拟POS模式下相同。
##### 特有区域
区域(1)、(2)、(3)为模拟POS模式下所特有的功能。
1. 区域(1):显示配置文件中的自定义按钮。每个按钮对应一份请求数据,点击按钮会将配置文件中请求数据,填入到区域2。右键点击按钮可以删除该请求数据。
2. 区域(2):数据输入框,在此编辑请求数据。
3. 区域(3):**保存** 按钮可以将当前区域2中的请求数据保存到本地,并以按钮的形式展示在区域1。**发送** 按钮将当前区域2中的请求数据再处理后,发送Socket请求。
### 配置
#### settings.json
在该配置文件中配置程序的基础信息,包括请求的地址、端口号、是否需要SocketHeader、商品信息、支付方式信息;以及一些全局(固定)的请求数据,如门店号、POS号等,这些数据可以通过 **SETTING_** 关键字获取。
如果某个支付方式支付时需要发送Socket请求,则需要配置 **req_pay** 字段,字段值为一个请求数据文件名。
如果某个支付方式退款时需要发送Socket请求,则需要配置 **req_refund** 字段,字段值为一个请求数据文件名。
假如配置的支付方式信息如下:
```JSON
"payList": [
{
"pay_id": "20005",
"pay_name": "现金"
},
{
"pay_id": "20001",
"pay_name": "非码会员",
"req_pay":"pay",
"req_refund":"refund"
}
]
```
则在模拟POS界面会显示两种支付方式:现金和非码会员。现金支付和退款时,会直接弹窗输入支付和退款的金额;而非码会员支付和退款时,会分别从pay.json和refund.json两个文件中读取请求数据,经过处理后发送Socket请求。
#### 模拟POS界面中的自定义按钮
创建名为 ReqData_XXX.json 的请求数据文件,则会在模拟POS界面自动创建名为XXX的按钮,点击该按钮即可从ReqData_XXX.json中读取请求数据,经过处理后,发送Socket请求。
#### 原始数据界面中的自定义按钮
创建名为 ReqPOS_XXX.json 的请求数据文件,则会在模拟POS界面自动创建名为XXX的按钮,点击该按钮即可从ReqPOS_XXX.json中读取请求数据填入到数据输入框。
也可以在原始数据界面中点击**保存**按钮自动生成ReqPOS_XXX.json文件。
## 请求数据 ## 请求数据
可以在请求数据文件和原始数据界面中的数据输入框中输入具有以下特性的请求数据:
- 请求数据为Json格式,可以添加/\*\*/类型的注释。 - 请求数据为Json格式,可以添加/\*\*/类型的注释。
- 可以使用系统关键字在程序执行时自动填充请求数据。 - 可以使用系统关键字在程序执行时自动填充请求数据。关键字格式为 %关键字_名称% 在发送数据前,系统会自动将 %关键字_名称% 替换为它所对应的值。
如有以下请求数据:
```JSON
/*
这是注释
*/
{
"fm_cmd": 1003,
"store_id": "%SETTING_store_id%",
"amount": %INPUT_amount%,
"trans_id": "%SESSION_trans_id%"
}
```
在发送请求前,系统会将/\*\*/中的内容删除;store_id会从settings.json中读取strore_id的值;amount会弹窗由用户输入;trans_id会从Session中获取。
*注意:系统关键字的值是无类型的,如果需要string类型的值,则需要在%%两边加上双引号,如果需要的是number、array、object等类型的值,则不应该在关键字两边加双引号。*
## 系统关键字 ## 系统关键字
- **SETTING_** 从设置中读取数据。 - **SETTING_** 从设置中读取数据。
...@@ -28,4 +121,18 @@ ...@@ -28,4 +121,18 @@
## Session ## Session
在内存存储一些会话数据。 在内存存储一些会话数据。
###常用的Session:
| 名称 | 说明 |
|-|-|
| business_date | 当前日期,格式为yyyyMMdd |
| trans_id | 交易号,由门店号+POS号+营业员号+日期时间构成 |
| fm_id | 非码订单号 |
| fm_transId | 非码支付号 |
| fm_open_id | 非码会员fm_open_id |
| order_amount | 订单总额 |
| paid_amount | 已付金额 |
| products | 商品信息array |
| pay_ids | 支付信息array |
*暂不支持自定义添加Session* *暂不支持自定义添加Session*
\ No newline at end of file
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