Commit 88e95e81 by wuyang.zou

1. 退货时查看收银小票和汇总单打印平台优惠

                    2. 下单2杯同样商品,一个存在优惠(且没有配料,没有加热选项),插件会录入两次优惠折扣
                    3.插件界面支持 显示平台优惠
                    4. 外卖订单入机支持 星巴克App的优惠折扣入机
                    5. sim 获取订单数据,且此笔订单的配料当成主商品且必须两个主商品以上传递插件;由于代码Bug:continue 会导致插件奔溃;
parent 80d5ce8d
......@@ -33,6 +33,9 @@ FlowControl::FlowControl()
m_bLoginResult =false;
m_bFirstRecvInfo = true;
m_bFloatFromLockSt = false;
m_initSimProcOrderDBRet = false;
m_initPrintSumBillPosDBRet = false;
m_initGetAuthPosDBRet = false;
m_loginSocket = NULL;
m_pullOrderSocket = NULL;
......@@ -60,19 +63,24 @@ FlowControl::FlowControl()
connect(this,&FlowControl::doRefundOrder,this,&FlowControl::_RefundOrder,Qt::BlockingQueuedConnection);
connect(this, &FlowControl::doLogin, this, &FlowControl::onGetNewStoreInfo,Qt::BlockingQueuedConnection);
/***打开Sqlite数据库并登陆外卖插件***/
/***打开Sql server express 数据库并登陆外卖插件***/
SimProcOrderDB::getInstance();
SimProcOrderDB::getInstance().initSimProcOrderDB();
m_initSimProcOrderDBRet = SimProcOrderDB::getInstance().initSimProcOrderDB();
/***打开SqlServer POS打印汇总信息本地数据库***/
PrintSumBillPosDB::getInstance();
if( !PrintSumBillPosDB::getInstance().initPrintSumBillPosDB() ){
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("尝试打开POS本地数据库(PrintSumBillPosDB)失败"));
}
m_initPrintSumBillPosDBRet = PrintSumBillPosDB::getInstance().initPrintSumBillPosDB();
/***打开SqlServer POS获取 当前用户 是否绑定钱箱+是否拥有退货权限 本地数据库***/
GetCaboxAReAuth::getInstance();
if( !GetCaboxAReAuth::getInstance().initGetAuthPosDB() ){
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("尝试打开POS本地数据库(GetCaboxAReAuth)失败"));
}
m_initGetAuthPosDBRet = GetCaboxAReAuth::getInstance().initGetAuthPosDB();
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---FlowControl::FlowControl() m_initSimProcOrderDBRet,m_initPrintSumBillPosDBRet,m_initGetAuthPosDBRet:--->>>>]")
<<m_initSimProcOrderDBRet <<m_initPrintSumBillPosDBRet<<m_initGetAuthPosDBRet;
// FlowControl() 初始化时,接受信号的槽对象还没有实例化,所以在此时发信号没有用;
/*if( !m_initSimProcOrderDBRet || !m_initPrintSumBillPosDBRet ) {
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("尝试打开POS本地数据库(MMXB**)失败"));
}
if(!m_initGetAuthPosDBRet){
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("尝试打开POS本地数据库(DataS**)失败"));
}*/
/*** 启动Http服务:用来响应Simphony_Script获取订单的请求***/
loaclHttpServer = new LoaclHttpServer();
loaclHttpServer->run();
......@@ -293,6 +301,10 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
orderObject = new OrderObject(this);
//初始化数据;
orderObject->orderIndex = 0;
orderObject->disPlateformFee = 0;
orderObject->orderDiscount = 0;
orderObject->deliveryDiscount = 0;
orderObject->FromJson(jsonObject);
orderObject->isPush = false;
orderObject->isCancle = false;
......@@ -309,17 +321,23 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
m_RepOMSRecordOrderMutex.lock();
RepOMSRecordOrderInfo* repOMSRecordOrder = new RepOMSRecordOrderInfo();
repOMSRecordOrder->orderNo = orderObject->id;
repOMSRecordOrder->type = orderObject->orderStatus;
repOMSRecordOrder->type = (6 == orderObject->orderStatus)?QString::fromLocal8Bit("6"):QString::fromLocal8Bit("3");
repOMSRecordOrder->status = QString::fromLocal8Bit("2");
repOMSRecordOrder->opUser = m_cashierName.isEmpty()?QString::fromLocal8Bit("POS"):m_cashierName;
repOMSRecordOrder->recordDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");;
repOMSRecordOrder->storeId = m_storeId.isEmpty()?QString::fromLocal8Bit("未知门店"):m_storeId;
repOMSRecordOrder->remark = "POS本地数据库连接出现错误,请及时检查数据库相关设置";
repOMSRecordOrder->remark = QString("POS Local DataBase Connect Error Or Table No Exist Error,Please Check DataBase Setting In Time");
repOMSRecordOrder->reqResult = 0;
//repOMSRecordOrder->checkNo = QString::fromLocal8Bit("0");
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---FlowControl::_OrderAnalysis():m_orderRecordRepOMSList.append()--->>>>]");
m_orderRecordRepOMSList.append(repOMSRecordOrder);
m_RepOMSRecordOrderMutex.unlock();
//修改订单状态,避免后面对数据库出现不稳定的POS机仍然进行录单操作;
if(6 == orderObject->orderStatus || OrderObject::SimExceptRefund == orderObject->orderStatus){
orderObject->orderStatus = OrderObject::SimExceptRefund;
} else {
orderObject->orderStatus = OrderObject::SimExceptSale;
}
}
if((OrderObject::NewOrder==orderObject->orderStatus||OrderObject::Confirmed==orderObject->orderStatus))
......@@ -613,7 +631,6 @@ bool FlowControl::_Login()
if(!result) {
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("登录失败![网络错误]"));
} else {
//if(JSON_STATUSCODE_OK != recvJson[JSON_STATUSCODE].toInt())
if(JSON_STATUSCODE_OK != recvJson[JSON_LOGINCODE].toInt()) {
result = false;
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("登录失败![%1]").arg(recvJson[JSON_MESSAGE].toString()));
......@@ -646,10 +663,19 @@ bool FlowControl::_Login()
m_clearTimer->start(1000*60*60*2); // 5分钟执行一次清理任务:正式上线需要两小时清理一次;
m_heartTimer->start(1000*60*5);
m_pullTimer->start(1000*2);
m_reportOMSReocrdOrderTimer->start(1000*3);
m_reportOMSReocrdOrderTimer->start(1000*6);
m_notifySimPullTimer->start(10*1000);
m_remindCasherBlinkFloatTimer->start(5*1000);
_AddOrderPull(QString(),QString());
//_AddOrderPull(QString(),QString());
//在登陆时再次检查数据库连接是否都正常;
if( !m_initSimProcOrderDBRet || !m_initPrintSumBillPosDBRet || !m_initGetAuthPosDBRet ) {
result = false;
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---FlowControl::_Login() m_initSimProcOrderDBRet,m_initPrintSumBillPosDBRet,m_initGetAuthPosDBRet:--->>>>]")
<<m_initSimProcOrderDBRet <<m_initPrintSumBillPosDBRet<<m_initGetAuthPosDBRet;
emit showAlert(AlertForm::MSGERROR, QString::fromLocal8Bit("尝试打开POS本地数据库(MMXB** 或 DataS**)失败"));
} else {
_AddOrderPull(QString(),QString());
}
}
}
if(!result) {
......@@ -1278,9 +1304,8 @@ void FlowControl::_ReportOMSRecordOrderInfo()
}
if(!RepOMSRecOrderIn){
QLOG_INFO()<<"[<<<<----FlowControl::_ReportOMSRecordOrderInfo RepOMSRecOrderIn Point is NULL---->>>>>]";
//delete RepOMSRecOrderIn; //空指针不能delete;
m_orderRecordRepOMSList.removeOne(RepOMSRecOrderIn);
QLOG_INFO()<<"[<<<<----FlowControl::_ReportOMSRecordOrderInfo m_orderRecordRepOMSList size: ---->>>>>]"<< m_orderRecordRepOMSList.size();
//上面的汇报OMS订单入机状态的汇报列表 遍历循环后:如果出现 RepOMSRecOrderIn == NULL;不能从List容器的头部移除已汇报成功结果【注意,必须是订单已经成功入机的订单,而非是入机失败,汇报OMS成功的订单】;
m_RepOMSRecordOrderMutex.unlock();
return ;
}
......@@ -1325,10 +1350,12 @@ void FlowControl::_ReportOMSRecordOrderInfo()
//解析汇报订单入机POS状态成功;
result=true;
if(1==RepOMSRecOrderIn->status.toInt()){
//只有订单成功入机的订单,才能将此订单从 List容器中移除;否则必须保留在此容器中 避免重复多次向OMS汇报;
QLOG_INFO()<< QString("[<<<<---Report OMS Record Order Entry POS Info successful,Remove orderId:%1--->>>>][msg->%2]").arg(RepOMSRecOrderIn->orderNo).arg(RepOMSRecOrderIn->remark);
m_orderRecordRepOMSList.removeOne(RepOMSRecOrderIn);
delete RepOMSRecOrderIn;
} else {
//订单入机失败的订单,不能从 List容器中移除;否则 同笔订单的入机异常情况,会出现多次 或一直向oms回报的情况;
RepOMSRecOrderIn->reqResult=1;
QLOG_INFO()<< QString("[<<<<---Report OMS Record Order Entry POS Info successful,Reserve orderId:%1--->>>>][msg->%2]").arg(RepOMSRecOrderIn->orderNo).arg(RepOMSRecOrderIn->remark);
}
......@@ -1598,9 +1625,9 @@ void FlowControl::_CrondClearExpireOrder()
QLOG_INFO()<<QString("[<<<<---_CrondClearExpireOrder: ClearExpireOrder: Emit Signal:Clear Order orderID:%1--->>>>]").arg(order->id);
emit clearorder(order->id,order->orderStatus);
m_FmOrdersMap.value(order->id)->deleteLater();
m_FmOrdersMap.remove(order->id);
// 任何情况情况下都不能清理 Simphony获取的有效队列【除非已经被simphony处理过的数据】;目前已经在POS 触发的Action1:_ResponseSimReqFristOrderData 中做数据清理了
// m_simValidOrdersList.removeOne(order->id);
delete m_FmOrdersMap.take(order->id);
}
}
m_OrderEntryMutex.unlock();
......@@ -1903,7 +1930,7 @@ bool FlowControl::_ResponseSimphony06Request(const QJsonObject &content, QJsonOb
QString simExceptMsg=content["simExceptMsg"].toString();
if(!simExceptCode.isEmpty()&&!orderId.isEmpty()) {
//新增一种case: 门店店员正在操作POS,从而阻塞插件程序录外卖订单,此时必须解锁悬浮框,从而减少Simphony队列中first出现OMS退单的请求;
//*********** 新增一种优化case: 门店店员正在操作POS,从而阻塞插件程序录外卖订单,此时必须解锁悬浮框,从而减少Simphony队列中first出现OMS退单的请求; begin ***********//
//此时的订单号时固定给的620620 [action:6,simExceptCode=20]
if( 20 == simExceptCode.toInt() ){
error=QString::fromLocal8Bit("Request Action06: Partner is serving Offline Customer ");
......@@ -1965,29 +1992,35 @@ bool FlowControl::_ResponseSimphony06Request(const QJsonObject &content, QJsonOb
m_orderRecordRepOMSList.append(repOMSRecordOrder);
m_RepOMSRecordOrderMutex.unlock();
}
return true;
}
//*********** 新增一种优化case: 门店店员正在操作POS,从而阻塞插件程序录外卖订单,此时必须解锁悬浮框,从而减少Simphony队列中first出现OMS退单的请求; end ***********//
//**************** 根据订单编号找到 非码订单Map容器中订单的详细信息; begin ****************//
OrderObject* order_p = m_FmOrdersMap.value(orderId);
if (!order_p) {
QLOG_ERROR()<<QString::fromLocal8Bit("[<<<<---%1订单并不存在m_FmOrdersMap[键值对]中;m_FmOrdersMap.size()=%2--->>>>]").arg(orderId).arg(m_FmOrdersMap.size());
error=QString::fromLocal8Bit("Request Action06: %1 Delivery Order Don't Exist In m_FmOrdersMap[key-map]; m_FmOrdersMap.size()=%2").arg(orderId).arg(m_FmOrdersMap.size());
emit doUnLockFloatFrom();//****************解锁悬浮框*****************//
m_bFloatFromLockSt = false; //更新悬浮框的锁定状态 =false;
return false;
}
// 判断SIM是否存在错误码:
// 0:会在汇报完小票号发送此错误码的请求给插件以便做一些特别事件: 解锁悬浮框;
// 1:SIM录单出异常:转移订单tab至异常单、请求sim的有效订单列表、解锁悬浮框:
//**************** 根据订单编号找到 非码订单Map容器中订单的详细信息; end ****************//
// 判断SIM是否存在错误码: 0:会在汇报完小票号发送此错误码的请求给插件以便做一些特别事件: 解锁悬浮框;1:SIM录单出异常:转移订单tab至异常单、请求sim的有效订单列表、解锁悬浮框:
int retProcSimExceptCode =0;
if(simExceptCode.toInt()) { //录单异常//
// 特殊处理录单异常的详细case:
if(simExceptCode.toInt()) {
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---_ResponseSimphony06Request:: OrderId:%1,simExceptCode:%2 录单异常--->>>>>]").arg(orderId).arg(simExceptCode.toInt());
//异常错误码10的case:: 常见的正常业务场景下的异常 这些异常不应该阻塞订单的多次尝试录入,如果没有尝试多次录入的机会将会出现POS机少录订单不出小票的case:更多的详细请参考Simphony脚本中错误码为10情况,
if(10 == simExceptCode.toInt()){
error=QString::fromLocal8Bit("Request Action06 :simExceptCode==10: Catch Sim Refund Auth Exception And Report Success");
retProcSimExceptCode = 1;
result=true;
} // simExceptCode.toInt() != 10 [退货授权出现异常]
}
//异常错误码非10的case::
//simExceptCode ==5: POS录单过程中 同步本地数据库小票信息出现异常时触发多次录单的异常必须捕捉,此时必须解锁悬浮框;[action:6,simExceptCode=5]
//simExceptCode ==1: POS录单过程中 POS机中没有相应的SKU 的异常必须捕捉,此时必须解锁悬浮框;[action:6,simExceptCode=1]
else {
if(m_simValidOrdersList.contains(orderId)) {
m_OrderEntryMutex.lock();
......@@ -2021,8 +2054,7 @@ bool FlowControl::_ResponseSimphony06Request(const QJsonObject &content, QJsonOb
cObj.insert("paid_trans_id",orderId);
rObj.insert("pay_id", cObj);
data = rObj;
//新增业务逻辑,针对汇报异常的订单需要;添加到 向OMS汇报入机情况的队列中;
//************* 新增业务逻辑,针对汇报异常的订单需要;添加到 向OMS汇报入机情况的队列中; Begin*************//
m_RepOMSRecordOrderMutex.lock();
RepOMSRecordOrderInfo* repOMSRecordOrder = NULL;
if(!m_orderRecordRepOMSList.isEmpty()){
......@@ -2059,7 +2091,7 @@ bool FlowControl::_ResponseSimphony06Request(const QJsonObject &content, QJsonOb
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---FlowControl::_ResponseSimphony06Request:m_orderRecordRepOMSList.append() orderId:%1 simExceptMsg:%2--->>>>]").arg(orderId).arg(simExceptMsg);
m_orderRecordRepOMSList.append(repOMSRecordOrder);
m_RepOMSRecordOrderMutex.unlock();
//************* 新增业务逻辑,针对汇报异常的订单需要;添加到 向OMS汇报入机情况的队列中; end*************//
} else {
result=false;
error=QString::fromLocal8Bit("Request Action06: Delivery OrderId And Sim Exception ErrorCode Can't Empty");
......@@ -2343,7 +2375,7 @@ bool FlowControl::_ResponseSimReqFristOrderData(const QJsonObject &content, QJso
cObj.insert("deliveryFree", (orderObject->deliveryPrice>0 && orderObject->deliveryPrice<10000)?orderObject->deliveryPrice:0);
//防止出现 deliveryPrice: NUll
cObj.insert("deliveryDiscount", (orderObject->deliveryDiscount>0 && orderObject->deliveryDiscount<10000)?orderObject->deliveryDiscount:0);
cObj.insert("orderDiscount", (orderObject->orderDiscount>0 && orderObject->orderDiscount<10000)?orderObject->orderDiscount:0);
cObj.insert("orderDiscount", orderObject->orderDiscount);
cObj.insert("waybillId", (orderObject->waybillId).length()?orderObject->waybillId:QString("0") );
cObj.insert("pos_sale_id", orderObject->posCheckNo);
cObj.insert("order_status",orderObject->orderStatus);//订单的状态
......@@ -2360,9 +2392,10 @@ bool FlowControl::_ResponseSimReqFristOrderData(const QJsonObject &content, QJso
cObj.insert("pay_ebcode_str", orderObject->channel);
//TODO
cObj.insert("products_fee", orderObject->productPrice); // 商品金额
cObj.insert("service_fee", /*orderObject->service_fee*/0); // 平台佣金
cObj.insert("discount_fee", /*orderObject->discount_fee*/0); // 优惠总额
cObj.insert("dis_shop_fee", /*orderObject->dis_shop_fee*/0); // 商家承担优惠金额
cObj.insert("service_fee", /*orderObject->service_fee*/0); // 平台佣金
cObj.insert("discount_fee", /*orderObject->disPlateformFee*/0); //平台优惠总额
//只有这个字段(discount_fee)传个Simphony(代表平台优惠给POS系统),对应的字段是dis_shop_fee :平台优惠总额 只能通过 dis_shop_fee 字段传递给 POS;
cObj.insert("dis_shop_fee", abs(orderObject->disPlateformFee)); // 商家承担优惠金额(实际传递的是: 平台优惠金额 orderObject->disPlateformFee);
//只有星巴克App 才挂MSR的虚拟卡号;第三方App MSR_NO='-1';
QString temp_MSR_NO;
if("MOD"==orderObject->channel){
......@@ -2372,11 +2405,8 @@ bool FlowControl::_ResponseSimReqFristOrderData(const QJsonObject &content, QJso
temp_MSR_NO = "-1";
}
cObj.insert("msr_card_no", temp_MSR_NO); // MSR卡号
//cObj.insert("retSyncOrderPrintInfo",0); // 同步POS本地数据库打印信息结果:[1:同步成功;0:同步失败; 默认:0]
cObj.insert("dis_platform_fee", /*orderObject->dis_platform_fee*/0); // 平台承担优惠金额
//cObj.insert("send_fee", orderObject->deliveryPrice); // 配送费上面已传;
cObj.insert("shop_fee", /*orderObject->total_fee-orderObject->send_fee-orderObject->service_fee-orderObject->dis_shop_fee*/0); // 商户能够拿到的钱(去除平台佣金)
//cObj.insert("package_fee", orderObject->packageFee); // 打包费上面已传;
cObj.insert("invoice_amount",orderObject->totalPrice);
if("ELE" == orderObject->channel){
cObj.insert("thirdPartyOrderId",orderObject->thirdPartyOrderId);
......@@ -2397,9 +2427,10 @@ bool FlowControl::_ResponseSimReqFristOrderData(const QJsonObject &content, QJso
/************************************************************************************/
rObj.insert("pay_id", cObj);
QJsonArray products;
for(int i=0; i < orderObject->proList.count(); i++)
{
QJsonObject tObj;
/**********************************************************************************/
// 循环订单的最外层商品列表;
/**********************************************************************************/
for(int i=0; i < orderObject->proList.count(); i++) {
dishesObject* dish=orderObject->proList.at(i);
// promotion优惠计数器变量;
int promotionTempNo = 0;
......@@ -2407,16 +2438,20 @@ bool FlowControl::_ResponseSimReqFristOrderData(const QJsonObject &content, QJso
if (dish->code.contains("Default",Qt::CaseInsensitive)) {
continue;
}
/**********************************************************************************/
//针对同一商品,多份数量需要将其,拆分成单份;[如果不拆分,将导致多份商品中配料价格出现 漏钱:POS中的账将会出现少金额]
/**********************************************************************************/
for (int temp_qty = 0; temp_qty < dish->qty; temp_qty++) {
//tObj.insert("consume_num", orderObject->proList.at(i)->qty);
//声明临时栈对象: 单个主商品 + 子商品列表 + 子商品;
QJsonObject tObj;
QJsonArray subProduct;
QJsonObject sObj;
tObj.insert("consume_num", 1);
tObj.insert("pid", dish->code);
tObj.insert("original_price", dish->price);
// begin 整合子商品开始;
QJsonArray subProduct;
QJsonObject sObj;
/**********************************************************************************/
// 处理原始的配料信息;
/**********************************************************************************/
if(!dish->sub_products.isEmpty()) {
for(int j=0; j < dish->sub_products.count(); j++) {
dishesObject* subDish=dish->sub_products.at(j);
......@@ -2429,18 +2464,23 @@ bool FlowControl::_ResponseSimReqFristOrderData(const QJsonObject &content, QJso
}
}
}
/**********************************************************************************/
// 处理商品的属性(热 -> 特别热)的额外配料信息;
/**********************************************************************************/
if(dish->options.length()){
sObj.insert("consume_num", 1);
sObj.insert("pid", dish->options);
sObj.insert("original_price", 0);
subProduct.insert(0, sObj);
}
/**********************************************************************************/
// 处理商品的优惠金额信息;针对单个商品多数量情况:需要将这部分优惠折扣金额放在前面 拆分数量的商品上[多少个折扣券,放在前几个商品上,一个上面下对应一个折扣项];
//单项商品的折扣数量最多不超过30个;当个优惠价格不超200元;
int promotionSum = (dish->promotionQty>0 && dish->promotionQty<30)?dish->promotionQty:0;
//单项商品的折扣数量最多不超过55个(60个会导致POS死机);当个优惠价格不超200元;
/**********************************************************************************/
int promotionSum = (dish->promotionQty>0 && dish->promotionQty<55)?dish->promotionQty:0;
int promotionPrice = (dish->promotionPrice>10 && dish->promotionPrice<20000)?dish->promotionPrice:0;
//QLOG_INFO() << QString("[---begin promotionTempNo---]")<<promotionTempNo;
//QLOG_INFO() << QString("[---promotionSum---]")<<promotionSum;
if(promotionTempNo < promotionSum){
if(promotionSum && promotionPrice && dish->promotionSku.length()){
sObj.insert("consume_num", 1);
......@@ -2448,14 +2488,18 @@ bool FlowControl::_ResponseSimReqFristOrderData(const QJsonObject &content, QJso
sObj.insert("original_price", promotionPrice);
subProduct.insert(subProduct.count(), sObj);
promotionTempNo++;
//QLOG_INFO() << QString("[---end promotionTempNo---]")<<promotionTempNo;
}
}
// 汇总插入子商品[sub_products];
//QLOG_INFO() << QString("[---subProduct---]")<<subProduct;
if(subProduct.size()){
tObj.insert("sub_products",subProduct);
} // end 整合子商品结束;
products.insert(i, tObj);
//products.insert(i, tObj); //防止default*的主商品码出现,上面代码出现continue;导致 i出现跳数,插入时出现崩溃;
products.push_back(tObj);
//QLOG_INFO() << QString("[---tObj---]")<<tObj;
}
}
......
......@@ -141,6 +141,11 @@ private:
//插件订单创造新订单,订单数据解析时,必须加锁,防止订单对象的数据被窜改;
//QMutex m_UpdateOrderObjMutex;
//新增三个bool变量用来标识 程序初始化时,两个数据库中的三张表是否能够连接正常;
bool m_initSimProcOrderDBRet;
bool m_initPrintSumBillPosDBRet;
bool m_initGetAuthPosDBRet;
signals:
// 发送信号给自己 做登陆
void doLogin();
......
......@@ -16,9 +16,9 @@ bool GetCaboxAReAuth::initGetAuthPosDB(){
m_sqlDb.setDatabaseName(dsn); //设置数据源名称
m_sqlDb.setUserName("sa"); //登录用户
m_sqlDb.setPassword("SIM29@123");
if(!m_sqlDb.open()) { //打开数据库
QLOG_ERROR()<<"[<<<<---SqlServer Open Database error:--->>>>]"<<m_sqlDb.lastError().text();
return false;
} else {
QLOG_INFO()<<"[<<<<---SqlServer Test Open database success!:--->>>>]";
m_sqlDb.close();
......
......@@ -3,7 +3,6 @@
#include "alertForm.h"
#include <QDateTime>
#include "Control/flowControl.h"
#include "preDefine.h"
PrintSumBillPosDB::PrintSumBillPosDB()
{
......@@ -13,27 +12,126 @@ PrintSumBillPosDB::PrintSumBillPosDB()
bool PrintSumBillPosDB::initPrintSumBillPosDB(){
//QString dbPath = QString(ConfigManage::Instance().databasePath());
bool bRet = false;
m_sqlDb = QSqlDatabase::addDatabase("QODBC","PrintSumBillPosDB"); //数据库驱动类型为SQL Server
if(m_sqlDb.isValid()){
if ( m_sqlDb.isValid() ) {
QLOG_INFO()<<"[<<<<---SqlServer ODBC driver is valid--->>>>]";
QString dsn="DRIVER={SQL SERVER};SERVER=127.0.0.1\\sqlexpress;DATABASE=MMXBenefits";
m_sqlDb.setDatabaseName(dsn); //设置数据源名称
m_sqlDb.setUserName("sa"); //登录用户
m_sqlDb.setPassword("SIM29@123");
if(!m_sqlDb.open()) { //打开数据库
QLOG_ERROR()<<"[<<<<---SqlServer Open Database error:--->>>>]"<<m_sqlDb.lastError().text();
bRet = false;
} else {
QLOG_INFO()<<"[<<<<---SqlServer Test Open database success!:--->>>>]";
m_sqlDb.close();
return true;
bRet = true;
}
} else {
QLOG_ERROR()<<"[<<<<---SqlServer ODBC driver no valid--->>>>]";
bRet = false;
}
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---FM TakeOut Plugin Version:2.20181130.1 Begin Add New Column--->>>>]");
bRet = alterTablePrintSumBillPosDB();
return bRet;
}
bool PrintSumBillPosDB::alterTablePrintSumBillPosDB() {
QMutexLocker mutex(&m_mutex);
int addSuccessNum = 0;
QSqlQuery query(m_sqlDb);
QString selectsql;
if(!m_sqlDb.open()) {
QLOG_ERROR()<<"[<<<<---alterTablePrintSumBillPosDB::SqlServer Database:Open Failed--->>>>]"<<m_sqlDb.lastError().text();
return false;
}
// Alter Table disPlateformFee;
selectsql = "select * from syscolumns where id=object_id('tb_msr_customer_info') and name='disPlateformFee'";
query.exec(selectsql);
if(!query.next()){
selectsql = "alter table tb_msr_customer_info add disPlateformFee int default 0 ";
if(!query.exec(selectsql)){
QLOG_ERROR()<< "[<<<<---alter table tb_msr_customer_info disPlateformFee Faild--->>>>]" <<query.lastError().text()<<QString::number(query.lastError().type());
} else { addSuccessNum++; }
} else { addSuccessNum++;}
// Alter Table memo;
selectsql = "select * from syscolumns where id=object_id('tb_msr_customer_info') and name='memo'";
query.exec(selectsql);
if(!query.next()){
selectsql = "alter table tb_msr_customer_info add memo varchar(400) null ";
if(!query.exec(selectsql)){
QLOG_ERROR()<< "[<<<<---alter table tb_msr_customer_info memo Faild--->>>>]" <<query.lastError().text()<<QString::number(query.lastError().type());
} else { addSuccessNum++; }
} else { addSuccessNum++;}
// Alter Table reserve0;
selectsql = "select * from syscolumns where id=object_id('tb_msr_customer_info') and name='reserve0'";
query.exec(selectsql);
if(!query.next()){
selectsql = "alter table tb_msr_customer_info add reserve0 int default 0 ";
if(!query.exec(selectsql)){
QLOG_ERROR()<< "[<<<<---alter table tb_msr_customer_info reserve0 Faild--->>>>]" <<query.lastError().text()<<QString::number(query.lastError().type());
} else { addSuccessNum++; }
} else { addSuccessNum++;}
// Alter Table reserve1;
selectsql = "select * from syscolumns where id=object_id('tb_msr_customer_info') and name='reserve1'";
query.exec(selectsql);
if(!query.next()){
selectsql = "alter table tb_msr_customer_info add reserve1 int null ";
if(!query.exec(selectsql)){
QLOG_ERROR()<< "[<<<<---alter table tb_msr_customer_info reserve1 Faild--->>>>]" <<query.lastError().text()<<QString::number(query.lastError().type());
} else { addSuccessNum++; }
} else { addSuccessNum++;}
// Alter Table reserve2;
selectsql = "select * from syscolumns where id=object_id('tb_msr_customer_info') and name='reserve2'";
query.exec(selectsql);
if(!query.next()){
selectsql = "alter table tb_msr_customer_info add reserve2 int null ";
if(!query.exec(selectsql)){
QLOG_ERROR()<< "[<<<<---alter table tb_msr_customer_info reserve2 Faild--->>>>]" <<query.lastError().text()<<QString::number(query.lastError().type());
} else { addSuccessNum++; }
} else { addSuccessNum++;}
// Alter Table reserve3;
selectsql = "select * from syscolumns where id=object_id('tb_msr_customer_info') and name='reserve3'";
query.exec(selectsql);
if(!query.next()){
selectsql = "alter table tb_msr_customer_info add reserve3 varchar(100) null ";
if(!query.exec(selectsql)){
QLOG_ERROR()<< "[<<<<---alter table tb_msr_customer_info reserve3 Faild--->>>>]" <<query.lastError().text()<<QString::number(query.lastError().type());
} else { addSuccessNum++; }
} else { addSuccessNum++;}
// Alter Table reserve4;
selectsql = "select * from syscolumns where id=object_id('tb_msr_customer_info') and name='reserve4'";
query.exec(selectsql);
if(!query.next()){
selectsql = "alter table tb_msr_customer_info add reserve4 varchar(200) null ";
if(!query.exec(selectsql)){
QLOG_ERROR()<< "[<<<<---alter table tb_msr_customer_info reserve4 Faild--->>>>]" <<query.lastError().text()<<QString::number(query.lastError().type());
} else { addSuccessNum++; }
} else { addSuccessNum++;}
// Alter Table reserve5;
selectsql = "select * from syscolumns where id=object_id('tb_msr_customer_info') and name='reserve5'";
query.exec(selectsql);
if(!query.next()){
selectsql = "alter table tb_msr_customer_info add reserve5 varchar(400) null; ";
if(!query.exec(selectsql)){
QLOG_ERROR()<< "[<<<<---alter table tb_msr_customer_info reserve5 Faild--->>>>]" <<query.lastError().text()<<QString::number(query.lastError().type());
} else { addSuccessNum++; }
} else { addSuccessNum++;}
m_sqlDb.close();
if (8 == addSuccessNum) {
QLOG_INFO()<<"[<<<<---alterTablePrintSumBillPosDB::addSuccessNum = 8 --->>>>]";
return true;
} else {
QLOG_ERROR()<<"[<<<<---alterTablePrintSumBillPosDB::addSuccessNum<8 = --->>>>]"<<addSuccessNum;
return false;
}
return false;
}
PrintSumBillPosDB &PrintSumBillPosDB::getInstance()
{
static PrintSumBillPosDB printSumBillPosDB;
......@@ -50,8 +148,8 @@ bool PrintSumBillPosDB::insertOrderSumBill(OrderObject* orderObj,const QString&
QSqlQuery query(m_sqlDb);
query.prepare("INSERT INTO tb_msr_customer_info(chk_num, last_name, full_name, gender, "
"is_birthday, create_datetime, created_by, modify_datetime, modified_by, accept_name, accept_address, accept_phone, order_id, "
"order_status, waybill_id, take_no, deliver_phone, deliver_name) "
"VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
"order_status, waybill_id, take_no, deliver_phone, deliver_name, disPlateformFee, memo) "
"VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
query.addBindValue(posCheckNo.toInt()); // --小票号
query.addBindValue(orderObj->lastName); // --顾客-姓
query.addBindValue(orderObj->consigneeName); // --顾客-全名
......@@ -77,6 +175,8 @@ bool PrintSumBillPosDB::insertOrderSumBill(OrderObject* orderObj,const QString&
query.addBindValue((orderObj->pickupCode).length()?orderObj->pickupCode.toInt():0 ); // --取餐号;
query.addBindValue(orderObj->riderPhone); // --配送者电话
query.addBindValue(orderObj->riderName); // -配送者名称
query.addBindValue( abs(orderObj->disPlateformFee)); // --平台优惠
query.addBindValue(orderObj->memo); // --订单备注
QLOG_INFO()<<QString("[<<<--PrintSumBillPosDB::insertOrderSumBill waybillId:%1-->>>>]").arg((orderObj->waybillId).length()?orderObj->waybillId:QString("0"));
......@@ -87,12 +187,14 @@ bool PrintSumBillPosDB::insertOrderSumBill(OrderObject* orderObj,const QString&
QLOG_INFO()<<QString("INSERT INTO tb_msr_customer_info(chk_num, last_name, full_name, gender, "
"is_birthday, create_datetime, created_by, modify_datetime, modified_by, "
"accept_name, accept_address, accept_phone, order_id, "
"waybill_id, take_no, deliver_phone, deliver_name) "
"VALUES(%1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17)").arg(posCheckNo.toInt())
"waybill_id, take_no, deliver_phone, deliver_name, disPlateformFee, memo) "
"VALUES(%1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13, %14, %15, %16, %17, %18, %19)").arg(posCheckNo.toInt())
.arg(orderObj->lastName).arg(orderObj->customerName).arg(temp_customerSex)
.arg(0).arg(qdaTi.addSecs(60*60*8).toString("yyyy-MM-dd hh:mm:ss")).arg(FlowControl::GetInstance()._GetCashierId()).arg("").arg("")
.arg(orderObj->consigneeName).arg(orderObj->addressDetail).arg(orderObj->consigneePhone).arg(orderObj->id)
.arg((orderObj->waybillId).length()?orderObj->waybillId:QString("0")).arg(orderObj->pickupCode.length()==0?0:orderObj->pickupCode.toInt()).arg(orderObj->riderPhone).arg(orderObj->riderName);
.arg((orderObj->waybillId).length()?orderObj->waybillId:QString("0"))
.arg(orderObj->pickupCode.length()==0?0:orderObj->pickupCode.toInt())
.arg(orderObj->riderPhone).arg(orderObj->riderName).arg(abs(orderObj->disPlateformFee)).arg(orderObj->memo);
} else {
QLOG_INFO()<<QString("[<<<<---SqlServer Database:Insert OrderId %1 Into customer_info Success--->>>>]").arg(orderObj->id);
result = true;
......
......@@ -10,7 +10,8 @@
#include <QObject>
#include <QMutex>
#include <Model/orderObject.h>
#include "preDefine.h"
#include "windows.h"
class PrintSumBillPosDB : public QObject
{
......@@ -27,6 +28,14 @@ public:
**/
bool initPrintSumBillPosDB();
/**
*功能:新增pos本地数据库打印小票信息表中字段;
*参数:[无]
*返回:true:新增成功,false:新增字段失败
**/
bool alterTablePrintSumBillPosDB();
/**
*功能:插入一条汇总单信息到pos本地数据库中;
*参数:[1]订单号 [2]小票号
......
......@@ -17,6 +17,7 @@ bool SimProcOrderDB::initSimProcOrderDB(){
m_sqlDb.setPassword("SIM29@123");
if(!m_sqlDb.open()) { //打开数据库
QLOG_ERROR()<<"[<<<<---SimProcOrderDB::SqlServer Open Database error:--->>>>]"<<m_sqlDb.lastError().text();
return false;
} else {
QLOG_INFO()<<"[<<<<---SimProcOrderDB::SqlServer Test Open database success!:--->>>>]";
QSqlQuery query(m_sqlDb);
......
......@@ -57,6 +57,7 @@ class OrderObject : public QObject
Q_PROPERTY (int needInvoice READ getNeedInvoice WRITE setNeedInvoice)
Q_PROPERTY (int deliveryPrice READ getDeliveryPrice WRITE setDeliveryPrice)
Q_PROPERTY (int deliveryDiscount READ getDeliveryDiscount WRITE setDeliveryDiscount)
Q_PROPERTY (int disPlateformFee READ getDisPlateformFee WRITE setDisPlateformFee)
Q_PROPERTY (int packageFee READ getPackageFee WRITE setPackageFee)
Q_PROPERTY (int packDiscount READ getPackDiscount WRITE setPackDiscount)
Q_PROPERTY (int orderDiscount READ getOrderDiscount WRITE setOrderDiscount)
......@@ -140,6 +141,7 @@ public:
int needInvoice;
int deliveryPrice; // 配送费
int deliveryDiscount; // 配送费折扣
int disPlateformFee; // 平台优惠折扣;
int packageFee; // 打包费
int packDiscount; // 打包费折扣
int orderDiscount; // 订单整单折扣金额
......@@ -297,6 +299,9 @@ public:
inline int getDeliveryDiscount()const{return deliveryDiscount;}
inline void setDeliveryDiscount(const int& v){deliveryDiscount = v;}
inline int getDisPlateformFee()const{return disPlateformFee;}
inline void setDisPlateformFee(const int& v){disPlateformFee = v;}
inline int getPackageFee()const{return packageFee;}
inline void setPackageFee(const int& v){packageFee = v;}
......
......@@ -122,47 +122,61 @@ void DetailForm::InitData(OrderObject *orderObject)
ui->detailTable0->item(pNum, 1)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum, 2, new QTableWidgetItem(QString::number(1))); // 数量
ui->detailTable0->item(pNum, 2)->setTextAlignment(Qt::AlignCenter);
pNum = pNum + 1;
// 新增展示配送费折扣项显示;
if (orderObject->deliveryDiscount > 0 && orderObject->deliveryDiscount<10000){
ui->detailTable0->insertRow(pNum+1);
ui->detailTable0->setItem(pNum+1, 0, new QTableWidgetItem( QString("( ") + QString::fromLocal8Bit("配送费折扣"))); // 配送费折扣
ui->detailTable0->item(pNum+1, 0)->setTextAlignment(Qt::AlignRight);
ui->detailTable0->setItem(pNum+1, 1, new QTableWidgetItem( QString("-") + Penny2Dollar(orderObject->deliveryDiscount))); // 价格
ui->detailTable0->item(pNum+1, 1)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum+1, 2, new QTableWidgetItem(QString::number(1) + QString(" )"))); // 数量
ui->detailTable0->item(pNum+1, 2)->setTextAlignment(Qt::AlignLeft);
ui->detailTable0->insertRow(pNum);
ui->detailTable0->setItem(pNum, 0, new QTableWidgetItem( QString("( ") + QString::fromLocal8Bit("配送费折扣"))); // 配送费折扣
ui->detailTable0->item(pNum, 0)->setTextAlignment(Qt::AlignRight);
ui->detailTable0->setItem(pNum, 1, new QTableWidgetItem( QString("-") + Penny2Dollar(orderObject->deliveryDiscount))); // 价格
ui->detailTable0->item(pNum, 1)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum, 2, new QTableWidgetItem(QString::number(1) + QString(" )"))); // 数量
ui->detailTable0->item(pNum, 2)->setTextAlignment(Qt::AlignLeft);
pNum = pNum + 1;
}
ui->detailTable0->insertRow(pNum+1);
ui->detailTable0->setItem(pNum+1, 0, new QTableWidgetItem(QString::fromLocal8Bit("包装费"))); // 包装费
ui->detailTable0->item(pNum+1, 0)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum+1, 1, new QTableWidgetItem(Penny2Dollar(orderObject->packageFee))); // 价格
ui->detailTable0->item(pNum+1, 1)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum+1, 2, new QTableWidgetItem(QString::number(1))); // 数量
ui->detailTable0->item(pNum+1, 2)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->insertRow(pNum);
ui->detailTable0->setItem(pNum, 0, new QTableWidgetItem(QString::fromLocal8Bit("包装费"))); // 包装费
ui->detailTable0->item(pNum, 0)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum, 1, new QTableWidgetItem(Penny2Dollar(orderObject->packageFee))); // 价格
ui->detailTable0->item(pNum, 1)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum, 2, new QTableWidgetItem(QString::number(1))); // 数量
ui->detailTable0->item(pNum, 2)->setTextAlignment(Qt::AlignCenter);
pNum = pNum + 1;
// 新增展示打包费折扣项显示;
if (orderObject->packDiscount> 0 && orderObject->packDiscount<10000){
ui->detailTable0->insertRow(pNum+2);
ui->detailTable0->setItem(pNum+2, 0, new QTableWidgetItem( QString("( ") + QString::fromLocal8Bit("包装费折扣"))); // 包装费折扣
ui->detailTable0->item(pNum+2, 0)->setTextAlignment(Qt::AlignRight);
ui->detailTable0->setItem(pNum+2, 1, new QTableWidgetItem( QString("-") + Penny2Dollar(orderObject->packDiscount))); // 价格
ui->detailTable0->item(pNum+2, 1)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum+2, 2, new QTableWidgetItem(QString::number(1) +QString(" )" ))); // 数量
ui->detailTable0->item(pNum+2, 2)->setTextAlignment(Qt::AlignLeft);
pNum = pNum + 2;
ui->detailTable0->insertRow(pNum);
ui->detailTable0->setItem(pNum, 0, new QTableWidgetItem( QString("( ") + QString::fromLocal8Bit("包装费折扣"))); // 包装费折扣
ui->detailTable0->item(pNum, 0)->setTextAlignment(Qt::AlignRight);
ui->detailTable0->setItem(pNum, 1, new QTableWidgetItem( QString("-") + Penny2Dollar(orderObject->packDiscount))); // 价格
ui->detailTable0->item(pNum, 1)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum, 2, new QTableWidgetItem(QString::number(1) +QString(" )" ))); // 数量
ui->detailTable0->item(pNum, 2)->setTextAlignment(Qt::AlignLeft);
pNum = pNum + 1;
}
// 新增展示整单折扣项显示;
if (orderObject->orderDiscount> 0 && orderObject->orderDiscount<100000){
ui->detailTable0->insertRow(pNum+1);
ui->detailTable0->setItem(pNum+1, 0, new QTableWidgetItem(QString::fromLocal8Bit("整单折扣")));
ui->detailTable0->item(pNum+1, 0)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum+1, 1, new QTableWidgetItem( QString("-") + Penny2Dollar(orderObject->orderDiscount))); // 价格
ui->detailTable0->item(pNum+1, 1)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum+1, 2, new QTableWidgetItem(QString::number(1))); // 数量
ui->detailTable0->item(pNum+1, 2)->setTextAlignment(Qt::AlignCenter);
if (orderObject->orderDiscount> 0){
ui->detailTable0->insertRow(pNum);
ui->detailTable0->setItem(pNum, 0, new QTableWidgetItem(QString::fromLocal8Bit("整单折扣")));
ui->detailTable0->item(pNum, 0)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum, 1, new QTableWidgetItem( QString("-") + Penny2Dollar(orderObject->orderDiscount))); // 价格
ui->detailTable0->item(pNum, 1)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum, 2, new QTableWidgetItem(QString::number(1))); // 数量
ui->detailTable0->item(pNum, 2)->setTextAlignment(Qt::AlignCenter);
pNum = pNum + 1;
}
// 新增展示平台折扣项显示;
if (abs(orderObject->disPlateformFee) > 0){
ui->detailTable0->insertRow(pNum);
ui->detailTable0->setItem(pNum, 0, new QTableWidgetItem(QString::fromLocal8Bit("平台折扣")));
ui->detailTable0->item(pNum, 0)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum, 1, new QTableWidgetItem( QString("-") + Penny2Dollar(abs(orderObject->disPlateformFee))));
ui->detailTable0->item(pNum, 1)->setTextAlignment(Qt::AlignCenter);
ui->detailTable0->setItem(pNum, 2, new QTableWidgetItem(QString::number(1))); // 数量
ui->detailTable0->item(pNum, 2)->setTextAlignment(Qt::AlignCenter);
pNum = pNum + 1;
}
//TODO
......
......@@ -7,8 +7,8 @@ IDI_ICON ICON DISCARDABLE "logo.ico"
#endif
VS_VERSION_INFO VERSIONINFO
//***每次修改后编译发版必须变更版本号(preDefine.h中APP_VERSION 需要一致)***//
FILEVERSION 2,2018,1023,1
PRODUCTVERSION 2,2018,1023,1
FILEVERSION 2,2018,1210,1
PRODUCTVERSION 2,2018,1210,1
//*************************************************************************//
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
......@@ -31,8 +31,8 @@ VS_VERSION_INFO VERSIONINFO
VALUE "OriginalFilename", "fmTakeout.exe"
VALUE "ProductName", "Delivery Order Plugin"
//***每次修改后编译发版必须变更版本号(preDefine.h中APP_VERSION 需要一致)***//
VALUE "ProductVersion", "2.2018.1023.1"
VALUE "FileVersion", "2.2018.1023.1"
VALUE "ProductVersion", "2.2018.1210.1"
VALUE "FileVersion", "2.2018.1210.1"
//*************************************************************************//
END
END
......
......@@ -11,7 +11,8 @@
//#define APP_VERSION "2.20180905.01"
//#define APP_VERSION "2.2018913.1"
//#define APP_VERSION "2.2018919.1"
#define APP_VERSION "2.20181023.1"
//#define APP_VERSION "2.20181023.1"
#define APP_VERSION "2.20181210.1"
//修正版本号时,切记修正 FmTakeout.rc 中的版本号
......
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