Commit 939ebb5b by wuyang.zou

New Feature And Fix Bug

<1> 现有POS插件隔日预约单不打印预约时间的bug修复
<2> 插件支持将配送费添加到 商品列表中【且支持微信非现金折扣】
<3> 校验退货订单入机时,配送费金额被篡改;
<4> 参数化配置:支持订单先存储打印数据,后入机模式;
<5> 修正低概率 下单立刻被取消导致订单缺少入机退货单的单边账Bug;

Version: 2.2021.5.11
parent 26bc1646
Pipeline #32698 failed with stage
in 0 seconds
...@@ -58,6 +58,7 @@ FlowControl::FlowControl() ...@@ -58,6 +58,7 @@ FlowControl::FlowControl()
m_pullOrderListSocket = NULL; m_pullOrderListSocket = NULL;
m_orderCount = 0; m_orderCount = 0;
m_clickPosCount = 0; m_clickPosCount = 0;
m_hurryPrintSum = 0;
m_clearTimer=new QTimer(this); m_clearTimer=new QTimer(this);
m_heartTimer=new QTimer(this); m_heartTimer=new QTimer(this);
...@@ -66,11 +67,13 @@ FlowControl::FlowControl() ...@@ -66,11 +67,13 @@ FlowControl::FlowControl()
m_loginTimer=new QTimer(this); m_loginTimer=new QTimer(this);
m_notifySimPullTimer = new QTimer(this); m_notifySimPullTimer = new QTimer(this);
m_storageOrderTimer = new QTimer(this); m_storageOrderTimer = new QTimer(this);
m_delayGetRefundDetailTimer = new QTimer(this);
m_remindCasherBlinkFloatTimer = new QTimer(this); m_remindCasherBlinkFloatTimer = new QTimer(this);
connect(m_loginTimer,&QTimer::timeout,this,&FlowControl::_ClickToLogin); connect(m_loginTimer,&QTimer::timeout,this,&FlowControl::_ClickToLogin);
connect(m_notifySimPullTimer,&QTimer::timeout,this,&FlowControl::_ClickToNotifySimPullOrder); connect(m_notifySimPullTimer,&QTimer::timeout,this,&FlowControl::_ClickToNotifySimPullOrder);
connect(m_storageOrderTimer,&QTimer::timeout,this,&FlowControl::_StoragePosOrderData); connect(m_storageOrderTimer,&QTimer::timeout,this,&FlowControl::_StoragePosOrderData);
connect(m_delayGetRefundDetailTimer,&QTimer::timeout,this,&FlowControl::_ScanDelayGetRefundDetailList);
connect(m_remindCasherBlinkFloatTimer,&QTimer::timeout,this,&FlowControl::_RemindCasherBlinkFloatForm); connect(m_remindCasherBlinkFloatTimer,&QTimer::timeout,this,&FlowControl::_RemindCasherBlinkFloatForm);
connect(m_pullTimer,&QTimer::timeout,this,&FlowControl::_PullOrderData); connect(m_pullTimer,&QTimer::timeout,this,&FlowControl::_PullOrderData);
connect(m_reportOMSReocrdOrderTimer,&QTimer::timeout,this,&FlowControl::_ReportOMSRecordOrderInfo); connect(m_reportOMSReocrdOrderTimer,&QTimer::timeout,this,&FlowControl::_ReportOMSRecordOrderInfo);
...@@ -256,7 +259,6 @@ void FlowControl::_ClickToLogin() ...@@ -256,7 +259,6 @@ void FlowControl::_ClickToLogin()
} }
} }
void FlowControl::_SmartTriggerClickPosBtn(const bool bTimerTrigger) void FlowControl::_SmartTriggerClickPosBtn(const bool bTimerTrigger)
{ {
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---FlowControl:_SmartTriggerClickPosBtn: m_bFloatFromLockSt: --->>>>>]")<<m_bFloatFromLockSt<<QString::fromLocal8Bit(" bTimerTrigger:")<< bTimerTrigger; QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---FlowControl:_SmartTriggerClickPosBtn: m_bFloatFromLockSt: --->>>>>]")<<m_bFloatFromLockSt<<QString::fromLocal8Bit(" bTimerTrigger:")<< bTimerTrigger;
...@@ -360,7 +362,7 @@ void FlowControl::_StoragePosOrderData() { ...@@ -360,7 +362,7 @@ void FlowControl::_StoragePosOrderData() {
/***** 更新 POS本地数据库的汇总单数据 是否成功;begin:*********/ /***** 更新 POS本地数据库的汇总单数据 是否成功;begin:*********/
if ( order_p->decouplePosVersion >= 20 ) { if ( order_p->decouplePosVersion >= 20 || m_hurryPrintSum ) {
// 2.0解耦POS->不入机流程分支: 需要在此处排队时进行数据存储; // 2.0解耦POS->不入机流程分支: 需要在此处排队时进行数据存储;
if ( PrintSumBillPosDB::getInstance().isOrderSumBillExist(order_p) ) { if ( PrintSumBillPosDB::getInstance().isOrderSumBillExist(order_p) ) {
syncDbSuccessNum++; syncDbSuccessNum++;
...@@ -388,7 +390,7 @@ void FlowControl::_StoragePosOrderData() { ...@@ -388,7 +390,7 @@ void FlowControl::_StoragePosOrderData() {
/***** 更新 POS本地数据库的打印消息数据 是否成功;begin:*********/ /***** 更新 POS本地数据库的打印消息数据 是否成功;begin:*********/
if ( order_p->decouplePosVersion >= 20 ) { if ( order_p->decouplePosVersion >= 20 || m_hurryPrintSum ) {
// 2.0解耦POS->不入机流程分支: 需要在此处排队时进行数据存储; // 2.0解耦POS->不入机流程分支: 需要在此处排队时进行数据存储;
// 需要保证前面三张表订单数据都成功插入成功后,才可以考虑插入打印数据 否则 对于打印小票会出现数据欠缺异常; // 需要保证前面三张表订单数据都成功插入成功后,才可以考虑插入打印数据 否则 对于打印小票会出现数据欠缺异常;
if ( 3== syncDbSuccessNum ) { if ( 3== syncDbSuccessNum ) {
...@@ -416,33 +418,55 @@ void FlowControl::_StoragePosOrderData() { ...@@ -416,33 +418,55 @@ void FlowControl::_StoragePosOrderData() {
/***** 更新 POS本地数据库的打印消息数据 是否成功;end:********/ /***** 更新 POS本地数据库的打印消息数据 是否成功;end:********/
// 订单落库成功后.判断是否需要入机; ①不入机则汇报OMS落库成功; ②入机则有效不重复添加到待入机队列中; // 订单落库成功后.判断是否需要入机; ①不入机则汇报OMS落库成功; ②入机则有效不重复添加到待入机队列中;
if ( order_p->decouplePosVersion >= 20 ) { if ( order_p->decouplePosVersion >= 20 || m_hurryPrintSum ) {
// 2.0解耦POS->不入机流程分支: 需要在此处进行数据校验 是否都存储成功 / 并汇报存储情况; // 2.0解耦POS->不入机流程分支: 需要在此处进行数据校验 是否都存储成功 / 并汇报存储情况;
if ( 4 == syncDbSuccessNum ) { if ( 4 == syncDbSuccessNum ) {
QLOG_INFO() << QString("[<<<<---FmTakeout _StoragePosOrderData: orderId: %1 Insert 4 Tables Data Success, Prepare Report Oms--->>>>]").arg(order_p->id); QLOG_INFO() << QString("[<<<<---FmTakeout _StoragePosOrderData: orderId: %1 Insert 4 Tables Data Success, Prepare Report Oms--->>>>]").arg(order_p->id);
if ( m_hurryPrintSum ) {
errorStorageOrderMsg = QString("Advance Print SumBill: OrderId: %1 Storage Pos Local DB Success").arg(orderId);
} else {
errorStorageOrderMsg = QString("Decouple Pos: OrderId: %1 Storage Pos Local DB Success").arg(orderId); errorStorageOrderMsg = QString("Decouple Pos: OrderId: %1 Storage Pos Local DB Success").arg(orderId);
}
// 落库成功, 准备将订单数据落库成功的报文消息汇报给 OMS: // 落库成功, 准备将订单数据落库成功的报文消息汇报给 OMS:
// 销售单/退货单: 会根据订单状态 是否 = 6 进行转换后进行汇报; 进入此队列 m_storagePosOrdersList 的次数决定汇报的次数; // 销售单/退货单: 会根据订单状态 是否 = 6 进行转换后进行汇报; 进入此队列 m_storagePosOrdersList 的次数决定汇报的次数;
_AddItemToReportOmsList(order_p, 1, 1, posCheckNo, errorStorageOrderMsg); _AddItemToReportOmsList(order_p, 1, 1, posCheckNo, errorStorageOrderMsg);
// 订单:销售+退货 数据存储成功后,需要更新 订单表 销售 退货的成功标识, 减少添加到 存储队列中的频次; // 订单:销售+退货 数据存储成功后,需要更新 订单表 销售 退货的成功标识, 减少添加到 存储队列中的频次;
if ( order_p->decouplePosVersion >= 20 ) {
if ( OrderObject::Refunded == order_p->orderStatus ) { if ( OrderObject::Refunded == order_p->orderStatus ) {
SimProcOrderDB::getInstance().updateRefundOrderStatusAndChkNum(orderId, 1, posCheckNo); SimProcOrderDB::getInstance().updateRefundOrderStatusAndChkNum(orderId, 1, posCheckNo);
} else { } else {
SimProcOrderDB::getInstance().updatePushOrderStatusAndChkNum(orderId, 1, posCheckNo); SimProcOrderDB::getInstance().updatePushOrderStatusAndChkNum(orderId, 1, posCheckNo);
} }
} else {
QLOG_INFO() << QString("[<<<<---_StoragePosOrderData: orderId: %1 Is HurryPrintSum, Can't Update SimProcOrderDB Pushed/Canceled Status, Because Need Record Pos--->>>>]")
.arg(order_p->id);
}
// 解耦不入机订单, 落库成功后更新显示 详情界面上的虚拟小票号; // 解耦不入机订单, 落库成功后更新显示 详情界面上的虚拟小票号;
order_p->dataBasePosOrderCheckNo = posCheckNo; order_p->dataBasePosOrderCheckNo = posCheckNo;
} else { } else {
QLOG_ERROR() << QString("[<<<<---FmTakeout _StoragePosOrderData: orderId: %1 Insert 4 Tables Data Failed, Prepare Report Oms--->>>>]").arg(order_p->id); QLOG_ERROR() << QString("[<<<<---FmTakeout _StoragePosOrderData: orderId: %1 Insert 4 Tables Data Failed, Prepare Report Oms--->>>>]").arg(order_p->id);
errorStorageOrderMsg = QString("Decouple Pos: OrderId: %1 Storage Pos Local DB Error : %2%3%4%5 ").arg(orderId) if ( m_hurryPrintSum ) {
errorStorageOrderMsg = QString("Advance Print SumBill: OrderId: %1 Storage Pos Local DB Error : %2 %3 %4 %5 ").arg(orderId)
.arg( syncOrderProductTbRet?"":"OrderProductTb ").arg( syncOrderPromotionTbRet?"":"OrderPromotionTb ") .arg( syncOrderProductTbRet?"":"OrderProductTb ").arg( syncOrderPromotionTbRet?"":"OrderPromotionTb ")
.arg( syncOrderSumBillTbRet?"":"OrderSumBillTb ").arg( syncOrderPrtMsgTbRet?"":"OrderPrtMsgTb "); .arg( syncOrderSumBillTbRet?"":"OrderSumBillTb ").arg( syncOrderPrtMsgTbRet?"":"OrderPrtMsgTb ");
} else {
errorStorageOrderMsg = QString("Decouple Pos: OrderId: %1 Storage Pos Local DB Error : %2 %3 %4 %5 ").arg(orderId)
.arg( syncOrderProductTbRet?"":"OrderProductTb ").arg( syncOrderPromotionTbRet?"":"OrderPromotionTb ")
.arg( syncOrderSumBillTbRet?"":"OrderSumBillTb ").arg( syncOrderPrtMsgTbRet?"":"OrderPrtMsgTb ");
}
// 落库失败:准备将订单数据落库失败的报文消息汇报给 OMS; // 落库失败:准备将订单数据落库失败的报文消息汇报给 OMS;
_AddItemToReportOmsList(order_p, 1, 2, posCheckNo, errorStorageOrderMsg); _AddItemToReportOmsList(order_p, 1, 2, posCheckNo, errorStorageOrderMsg);
} }
// 针对上方 着急打印汇总单 但 还需要入机的门店,需要将订单添加到待入机队列中,等待排队入机;
if (order_p->decouplePosVersion < 20) {
// 需要入机 && 待入机队列中没有该订单;
if ( !m_simValidOrdersList.contains( order_p->id ) ) {
m_simValidOrdersList.append(order_p->id);
}
}
} else { } else {
// 非2.0解耦POS->入机流程分支: // 非2.0解耦POS->入机流程分支:
// 需要入机 && 待入机队列中没有该订单; // 需要入机 && 待入机队列中没有该订单;
...@@ -463,6 +487,123 @@ void FlowControl::_StoragePosOrderData() { ...@@ -463,6 +487,123 @@ void FlowControl::_StoragePosOrderData() {
} }
void FlowControl::_ScanDelayGetRefundDetailList() {
if ( m_delayGetRefundDetailList.isEmpty() ) {
m_delayGetRefundDetailTimer->start(25*1000);
} else {
QLOG_INFO()<< QString("[<<<<---_ScanDelayGetRefundDetailList: m_delayGetRefundDetailList size: %1 And FirstOne: %2 --->>>>>]")
.arg( m_delayGetRefundDetailList.size() ).arg( m_delayGetRefundDetailList.isEmpty()? " " : m_delayGetRefundDetailList.first()->orderId );
QLOG_INFO()<< QString("[<<<<---_ScanDelayGetRefundDetailList: m_storagePosOrdersList size: %1 And FirstOne: %2 --->>>>>]")
.arg( m_storagePosOrdersList.size() ).arg( m_storagePosOrdersList.isEmpty()? " " : m_storagePosOrdersList.first() );
QLOG_INFO()<< QString("[<<<<---_ScanDelayGetRefundDetailList: m_simValidOrdersList size: %1 And FirstOne: %2 --->>>>>]")
.arg( m_simValidOrdersList.size() ).arg( m_simValidOrdersList.empty()? " " : m_simValidOrdersList.first() );
m_delayGetRefundDetailTimer->start(15*1000);
DelayPullOrderInfo* delayPullOrder_p= nullptr;
QList<DelayPullOrderInfo*> tmpDelayRefundList;
QString tmpSimValidListFirstOrderId = m_simValidOrdersList.isEmpty() ? "" : m_simValidOrdersList.first();
QString tmpStorageListFirstOrderId = m_storagePosOrdersList.isEmpty() ? "" : m_storagePosOrdersList.first();
// 为了节约时间, 提高效率: 减少加锁/解锁频率, 优先快速判断筛选条件: SimValidList & StorageList & m_orderPullList 都是空;则无需加锁筛选;
if ( !tmpSimValidListFirstOrderId.length() && !tmpStorageListFirstOrderId.length() && m_orderPullList.empty() ) {
while( !m_delayGetRefundDetailList.empty() ) {
delayPullOrder_p = m_delayGetRefundDetailList.takeFirst();
if ( !delayPullOrder_p ) {
QLOG_ERROR()<< QString("[<<<<---_ScanDelayGetRefundDetailList: m_delayGetRefundDetailList's Fisrt Item delayPullOrder_p Is empty(3 list All Empty)--->>>>>]");
continue;
}
if ( _TryAddOrderPull(delayPullOrder_p->orderId,delayPullOrder_p->channel) ) {
delete delayPullOrder_p;
delayPullOrder_p = nullptr;
} else {
QLOG_ERROR()<< QString("[<<<<---_ScanDelayGetRefundDetailList: _TryAddOrderPull Return Failed(3 list All Empty), orderId:%1, Continue Append Delay List--->>>>>]").arg(delayPullOrder_p->orderId);
tmpDelayRefundList.append(delayPullOrder_p);
}
}
// 将临时延迟队列重新添加到 正式延迟队列中;
m_delayGetRefundDetailList = tmpDelayRefundList;
QLOG_INFO()<< QString("[<<<<---_ScanDelayGetRefundDetailList: m_delayGetRefundDetailList Scan End (3 list All Empty), Size:%1 , FirstOrderId:%2--->>>>>]")
.arg( m_delayGetRefundDetailList.size() ).arg( m_delayGetRefundDetailList.empty() ? "" : m_delayGetRefundDetailList.first()->orderId );
return;
}
// 复杂情况遍历;
bool tryLock = m_delayGetRefundDetailMutex.tryLock(VALUE_TRYLOCKMEMTIMEOUT);
if ( !tryLock ) {
QLOG_ERROR()<< QString("[<<<<---_ScanDelayGetRefundDetailList: m_delayGetRefundDetailMutex Try Lock Failed --->>>>>]");
} else {
while( !m_delayGetRefundDetailList.empty() ) {
delayPullOrder_p = m_delayGetRefundDetailList.takeFirst();
if ( !delayPullOrder_p ) {
QLOG_ERROR()<< QString("[<<<<---_ScanDelayGetRefundDetailList: m_delayGetRefundDetailList's item delayPullOrder_p Is empty--->>>>>]");
continue;
}
// Case1: 筛选处理 m_simValidOrdersList 中第一个订单,如果匹配到,则将其添加到临时延迟退单队列中;
if ( tmpSimValidListFirstOrderId.length() && delayPullOrder_p->orderId == tmpSimValidListFirstOrderId) {
tmpDelayRefundList.append(delayPullOrder_p);
QLOG_INFO()<< QString("[<<<<---_ScanDelayGetRefundDetailList:m_simValidOrdersList FirstOrderId:%1, RefundOrderId:%2 Append Delay Get Detail List--->>>>>]")
.arg( tmpSimValidListFirstOrderId ).arg( delayPullOrder_p->orderId );
continue;
}
// Case2: 筛选处理 m_storagePosOrdersList 中第一个订单,如果匹配到,则将其添加到临时延迟退单队列中;
if ( tmpStorageListFirstOrderId.length() && delayPullOrder_p->orderId == tmpStorageListFirstOrderId) {
tmpDelayRefundList.append(delayPullOrder_p);
QLOG_INFO()<< QString("[<<<<---_ScanDelayGetRefundDetailList:m_storagePosOrdersList FirstOrderId:%1, RefundOrderId:%2 Append Delay Get Detail List--->>>>>]")
.arg( tmpStorageListFirstOrderId ).arg( delayPullOrder_p->orderId );
continue;
}
// Case3: 筛选处理 遍历待获取订单详情列表, 如果匹配到待获取订单号一致,则;
if ( !m_orderPullList.empty() ) {
// 待拉取列表不空时,仅判断 待拉取列表中的第一个订单是否和 延迟退单队列 中匹配,若果匹配到 则继续保留在延迟队列中;
PullOrderInfo* tmpOrderPull = m_orderPullList.first();
if ( !tmpOrderPull ) {
QLOG_ERROR()<< QString("[<<<<---_ScanDelayGetRefundDetailList:m_orderPullList First Item Is Null, Remove It From m_orderPullList--->>>>>]");
tmpDelayRefundList.append(delayPullOrder_p);
m_orderPullList.removeFirst();
continue;
}
if (tmpOrderPull->orderId == delayPullOrder_p->orderId) {
// 已经有正在获取订单详情数据的请求还未执行完成, 则需要添加到延迟队列中: 避免在 m_orderPullList 中第一个订单状态是销售单,将可能出现 Bug;
tmpDelayRefundList.append(delayPullOrder_p);
QLOG_INFO()<< QString("[<<<<---_ScanDelayGetRefundDetailList: m_orderPullList.size()=%d , m_orderPullList.first()== RefundOrderId:%1 Append Delay Get Detail List--->>>>>]")
.arg( m_orderPullList.size() ).arg( delayPullOrder_p->orderId );
continue;
}
}
// Case4: 筛选出来 无需延迟获取退单详情的订单 需要添加到 正常的获取订单详情的队列中;
if ( _TryAddOrderPull(delayPullOrder_p->orderId,delayPullOrder_p->channel) ) {
delete delayPullOrder_p;
delayPullOrder_p = nullptr;
} else {
QLOG_ERROR()<< QString("[<<<<---_ScanDelayGetRefundDetailList: _TryAddOrderPull Return Failed, orderId:%1, Continue Append Delay List--->>>>>]").arg(delayPullOrder_p->orderId);
tmpDelayRefundList.append(delayPullOrder_p);
}
}
// 将延迟队列从新添加到 延迟队列中;
m_delayGetRefundDetailList = tmpDelayRefundList;
QLOG_INFO()<< QString("[<<<<---_ScanDelayGetRefundDetailList: m_delayGetRefundDetailList Scan End, Size:%1 , FirstOrderId:%2--->>>>>]")
.arg( m_delayGetRefundDetailList.size() ).arg( m_delayGetRefundDetailList.empty() ? "" : m_delayGetRefundDetailList.first()->orderId );
m_delayGetRefundDetailMutex.unlock();
}
}
}
void FlowControl::_RemindCasherBlinkFloatForm() void FlowControl::_RemindCasherBlinkFloatForm()
{ {
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---_RemindCasherBlinkFloatForm: m_simValidOrdersList.isEmpty()==%1--->>>>>]") QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---_RemindCasherBlinkFloatForm: m_simValidOrdersList.isEmpty()==%1--->>>>>]")
...@@ -506,6 +647,7 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject) ...@@ -506,6 +647,7 @@ void FlowControl::_OrderAnalysis(const QJsonObject& jsonObject)
orderObject->globalOrderType = 0; orderObject->globalOrderType = 0;
orderObject->storeType = 0; orderObject->storeType = 0;
orderObject->decouplePosVersion = 0; orderObject->decouplePosVersion = 0;
orderObject->deliveryAtProd = false;
orderObject->FromJson(jsonObject); orderObject->FromJson(jsonObject);
orderObject->pushOrderType=0; orderObject->pushOrderType=0;
...@@ -868,6 +1010,7 @@ bool FlowControl::_Login() ...@@ -868,6 +1010,7 @@ bool FlowControl::_Login()
DataManger::GetInstance().SetStoreId(m_storeId); DataManger::GetInstance().SetStoreId(m_storeId);
DataManger::GetInstance().SetPosIpAddress(m_ipPortAddress); DataManger::GetInstance().SetPosIpAddress(m_ipPortAddress);
DataManger::GetInstance().SetPartnerId(ConfigManger::GetInstance().GetPartnerId()); DataManger::GetInstance().SetPartnerId(ConfigManger::GetInstance().GetPartnerId());
m_hurryPrintSum = ConfigManger::GetInstance().GetHurryPrintSum();
emit hideAlert(); emit hideAlert();
emit setStoreInfo(m_storeId); emit setStoreInfo(m_storeId);
emit setCashierInfo(m_cashierName); emit setCashierInfo(m_cashierName);
...@@ -890,6 +1033,7 @@ bool FlowControl::_Login() ...@@ -890,6 +1033,7 @@ bool FlowControl::_Login()
m_clickPosCount = 0; m_clickPosCount = 0;
m_notifySimPullTimer->start(7*1000); m_notifySimPullTimer->start(7*1000);
m_storageOrderTimer->start(10*1000); m_storageOrderTimer->start(10*1000);
m_delayGetRefundDetailTimer->start(15*1000);
m_remindCasherBlinkFloatTimer->start(5*1000); m_remindCasherBlinkFloatTimer->start(5*1000);
//_AddOrderPull(QString(),QString()); //_AddOrderPull(QString(),QString());
//在登陆时再次检查数据库连接是否都正常; //在登陆时再次检查数据库连接是否都正常;
...@@ -1661,9 +1805,13 @@ void FlowControl::_CrondClearExpireOrder() ...@@ -1661,9 +1805,13 @@ void FlowControl::_CrondClearExpireOrder()
foreach (order, m_FmOrdersMap.values()) { foreach (order, m_FmOrdersMap.values()) {
QDate createDate = QDate::fromString( (order->createTime).mid(0,10),"yyyy-MM-dd"); QDate createDate = QDate::fromString( (order->createTime).mid(0,10),"yyyy-MM-dd");
// 如果是预约单 则需以预约日期为准,实现过期订单清理条件;
if ( 7 == order->orderType || 11 == order->orderType ) {
createDate = QDate::fromString( (order->expectDate).mid(0,10),"yyyy-MM-dd");
}
//QLOG_INFO()<<QString("[<<<<---_CrondClearExpireOrder-> order->createTime:%1--->>>>]").arg(order->createTime); //--按秒数来验证ok-- //QLOG_INFO()<<QString("[<<<<---_CrondClearExpireOrder-> order->createTime Or expectDate : %1--->>>>]").arg(order->createTime); //--按秒数来验证ok--
QLOG_INFO()<<QString("[<<<<---_CrondClearExpireOrder-> order createDate:%1--->>>>]").arg(createDate.toString("yyyy-MM-dd")); QLOG_INFO()<<QString("[<<<<---_CrondClearExpireOrder-> order createDate Or expectDate: %1--->>>>]").arg(createDate.toString("yyyy-MM-dd"));
//qint64 seconds = createDateTime.secsTo(currentDateTime); //--按秒数来验证ok-- //qint64 seconds = createDateTime.secsTo(currentDateTime); //--按秒数来验证ok--
qint64 days = createDate.daysTo(currentDate); qint64 days = createDate.daysTo(currentDate);
//QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---_CrondClearExpireOrder: ClearExpireOrder: 相差多少秒:%1--->>>>]").arg(seconds); //--按秒数来验证ok-- //QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---_CrondClearExpireOrder: ClearExpireOrder: 相差多少秒:%1--->>>>]").arg(seconds); //--按秒数来验证ok--
...@@ -1681,10 +1829,9 @@ void FlowControl::_CrondClearExpireOrder() ...@@ -1681,10 +1829,9 @@ void FlowControl::_CrondClearExpireOrder()
} }
SimProcOrderDB::getInstance().deleteOrderRecord(QDate::currentDate().addDays(-45).toString("yyyyMMdd")); SimProcOrderDB::getInstance().deleteOrderRecord(QDate::currentDate().addDays(-45).toString("yyyyMMdd"));
PrintSumBillPosDB::getInstance().deleteSumBillRecord( QDate::currentDate().addDays(-7).toString("yyyy-MM-dd") );
PrintCupStickPosDB::getInstance().deleteProductRecord(QDate::currentDate().addDays(-7).toString("yyyy-MM-dd")); PrintCupStickPosDB::getInstance().deleteProductRecord(QDate::currentDate().addDays(-7).toString("yyyy-MM-dd"));
PrintOrderPromotionDB::getInstance().deletePromotionRecord(QDate::currentDate().addDays(-7).toString("yyyy-MM-dd")); PrintOrderPromotionDB::getInstance().deletePromotionRecord(QDate::currentDate().addDays(-7).toString("yyyy-MM-dd"));
PrintMsgQueueDB::getInstance().deletePrintMsgRecord(QDate::currentDate().addDays(-3).toString("yyyy-MM-dd")); PrintMsgQueueDB::getInstance().deletePrintMsgRecord(QDate::currentDate().addDays(-3).toString("yyyy-MM-dd"));
} }
...@@ -1832,28 +1979,51 @@ bool FlowControl::_ResponseSimphony04Request(const QJsonObject &content, QJsonOb ...@@ -1832,28 +1979,51 @@ bool FlowControl::_ResponseSimphony04Request(const QJsonObject &content, QJsonOb
} }
//***** 更新 POS本地数据库的销售/退货 标识表中的真实小票号: 用于界面显示(不入机订单需要变更显示逻辑) *********/ //***** 更新 POS本地数据库的销售/退货 标识表中的真实小票号: 用于界面显示(不入机订单需要变更显示逻辑) *********/
if (m_hurryPrintSum) {
QLOG_INFO()<<QString("[<<<<---_ResponseSimphony04Request::orderId:%1 Is HurryPrintSum, Still Need Upate SimProcOrderDB CheckNo, Easy To Check Real Pos CheckNo--->>>>]").arg(orderId);
}
bRetReportCheckNo = SimProcOrderDB::getInstance().updatePosOrderCheckNo(orderId,posCheckNo); bRetReportCheckNo = SimProcOrderDB::getInstance().updatePosOrderCheckNo(orderId,posCheckNo);
/***** 更新 POS本地数据库的商品表 真实小票号: 解耦后,仍然有能正确打印订单数据的关联关系 begin:*********/ /***** 更新 POS本地数据库的商品表 真实小票号: 解耦后,仍然有能正确打印订单数据的关联关系 begin:*********/
bool retSyncOrderProduct = true; //默认是同步POS商品数据成功; 目前只有 businessType: 20:WSG-杯贴祝福; 30: 拼团; bool retSyncOrderProduct = true; //默认是同步POS商品数据成功; 目前只有 businessType: 20:WSG-杯贴祝福; 30: 拼团;
if ( PrintCupStickPosDB::getInstance().isOrderProductExist(order_p) ) { if ( PrintCupStickPosDB::getInstance().isOrderProductExist(order_p) ) {
if (m_hurryPrintSum) {
QLOG_INFO()<<QString("[<<<<---_ResponseSimphony04Request::orderId:%1 Is HurryPrintSum, No Need Update PrintCupStickPosDB CheckNo, Because Recive Order Had Storage, Can't Change CheckNo--->>>>]").arg(orderId);
} else {
if (!PrintCupStickPosDB::getInstance().updateOrderProductCheckNum(order_p, posCheckNo) ) if (!PrintCupStickPosDB::getInstance().updateOrderProductCheckNum(order_p, posCheckNo) )
retSyncOrderProduct = false; retSyncOrderProduct = false;
}
} else {
if (m_hurryPrintSum) {
QLOG_INFO()<<QString("[<<<<---_ResponseSimphony04Request::orderId:%1 Is HurryPrintSum, No Need Insert PrintCupStickPosDB, Because Recive Order Had Storage, Can't Change CheckNo--->>>>]").arg(orderId);
} else { } else {
if (!PrintCupStickPosDB::getInstance().insertOrderProduct(order_p, posCheckNo) ) if (!PrintCupStickPosDB::getInstance().insertOrderProduct(order_p, posCheckNo) )
retSyncOrderProduct = false; retSyncOrderProduct = false;
} }
}
/***** 更新 POS本地数据库的商品表 真实小票号;end:********/ /***** 更新 POS本地数据库的商品表 真实小票号;end:********/
/***** 更新 POS本地数据库的促销优惠表-真实小票号: 解耦后,仍然有能正确打印订单数据的关联关系:;begin:*********/ /***** 更新 POS本地数据库的促销优惠表-真实小票号: 解耦后,仍然有能正确打印订单数据的关联关系:;begin:*********/
bool retSyncOrderPromotion = true; //默认是同步POS促销优惠成功; 目前只有 businessType: 20:WSG-杯贴祝福; 30: 拼团; bool retSyncOrderPromotion = true; //默认是同步POS促销优惠成功; 目前只有 businessType: 20:WSG-杯贴祝福; 30: 拼团;
if ( PrintOrderPromotionDB::getInstance().isOrderPromotionExist(order_p) ) { if ( PrintOrderPromotionDB::getInstance().isOrderPromotionExist(order_p) ) {
if (m_hurryPrintSum) {
QLOG_INFO()<<QString("[<<<<---_ResponseSimphony04Request::orderId:%1 Is HurryPrintSum, No Need Update PrintOrderPromotionDB CheckNo, Because Recive Order Had Storage, Can't Change CheckNo--->>>>]").arg(orderId);
} else {
if (!PrintOrderPromotionDB::getInstance().updateOrderPromotionCheckNum(order_p, posCheckNo) ) if (!PrintOrderPromotionDB::getInstance().updateOrderPromotionCheckNum(order_p, posCheckNo) )
retSyncOrderPromotion = false; retSyncOrderPromotion = false;
}
} else {
if (m_hurryPrintSum) {
QLOG_INFO()<<QString("[<<<<---_ResponseSimphony04Request::orderId:%1 Is HurryPrintSum, No Need Insert PrintOrderPromotionDB, Because Recive Order Had Storage, Can't Change CheckNo--->>>>]").arg(orderId);
} else { } else {
if (!PrintOrderPromotionDB::getInstance().insertOrderPromotion(order_p, posCheckNo) ) if (!PrintOrderPromotionDB::getInstance().insertOrderPromotion(order_p, posCheckNo) )
retSyncOrderPromotion = false; retSyncOrderPromotion = false;
} }
}
/***** 更新 POS本地数据库的促销优惠数据是否成功;end:********/ /***** 更新 POS本地数据库的促销优惠数据是否成功;end:********/
bool insertPrtMsgRet = false; bool insertPrtMsgRet = false;
...@@ -1864,8 +2034,14 @@ bool FlowControl::_ResponseSimphony04Request(const QJsonObject &content, QJsonOb ...@@ -1864,8 +2034,14 @@ bool FlowControl::_ResponseSimphony04Request(const QJsonObject &content, QJsonOb
if ( PrintMsgQueueDB::getInstance().isOrderPrtMsgExist(order_p) ) { if ( PrintMsgQueueDB::getInstance().isOrderPrtMsgExist(order_p) ) {
insertPrtMsgRet = true; insertPrtMsgRet = true;
} else { } else {
if (m_hurryPrintSum) {
QLOG_INFO()<<QString("[<<<<---_ResponseSimphony04Request::orderId:%1 Is HurryPrintSum, No Need Insert PrintMsgQueueDB, Because Recive Order Had Storage, Can't Change CheckNo--->>>>]").arg(orderId);
insertPrtMsgRet = true;
} else {
insertPrtMsgRet = PrintMsgQueueDB::getInstance().insertOrderPrtMsg(order_p, posCheckNo); insertPrtMsgRet = PrintMsgQueueDB::getInstance().insertOrderPrtMsg(order_p, posCheckNo);
} }
}
QLOG_INFO()<<QString("[<<<<---PrintMsgQueueDB::insertOrderPrtMsg orderId:%1 chk_num:%2 ret:%3--->>>>]") QLOG_INFO()<<QString("[<<<<---PrintMsgQueueDB::insertOrderPrtMsg orderId:%1 chk_num:%2 ret:%3--->>>>]")
.arg(orderId).arg(posCheckNo).arg(insertPrtMsgRet?1:0); .arg(orderId).arg(posCheckNo).arg(insertPrtMsgRet?1:0);
} }
...@@ -1998,11 +2174,21 @@ bool FlowControl::_ResponseSimphony05Request(const QJsonObject &content, QJsonOb ...@@ -1998,11 +2174,21 @@ bool FlowControl::_ResponseSimphony05Request(const QJsonObject &content, QJsonOb
int retSyncOrderSum = 0; //默认是同步POS本地数据失败; int retSyncOrderSum = 0; //默认是同步POS本地数据失败;
/***********解耦前后汇总表中都会保存2条记录 ***************/ /***********解耦前后汇总表中都会保存2条记录 ***************/
if (PrintSumBillPosDB::getInstance().isOrderSumBillExist(order_p) ) { if (PrintSumBillPosDB::getInstance().isOrderSumBillExist(order_p) ) {
if ( m_hurryPrintSum ) {
// 着急打印的情况,接受到订单时就已经插入了,且无需更新小票号;
QLOG_INFO()<<QString("[<<<<---_ResponseSimphony05Request::orderId:%1 Is HurryPrintSum, No Need Update SumInfo, Because Recive Order Had Storage, Can't Change CheckNo--->>>>]").arg(orderId);
retSyncOrderSum = 1;
} else {
if ( PrintSumBillPosDB::getInstance().updateSumBillCknoAndCktime(order_p,posCheckNo,posCheckTime) ) { if ( PrintSumBillPosDB::getInstance().updateSumBillCknoAndCktime(order_p,posCheckNo,posCheckTime) ) {
retSyncOrderSum = 1; retSyncOrderSum = 1;
} }
}
} /*****POS本地数据库不存在 orderId &&posCheckNo*********/ } /*****POS本地数据库不存在 orderId &&posCheckNo*********/
else{ else{
if (m_hurryPrintSum) {
QLOG_ERROR()<<QString("[<<<<---_ResponseSimphony05Request orderId:%1 Is HurryPrintSum, But No Storage SumInfo Into DB Before Record Pos--->>>>]").arg(orderId);
}
if ( PrintSumBillPosDB::getInstance().insertOrderSumBill(order_p, posCheckNo, posCheckTime) ){ if ( PrintSumBillPosDB::getInstance().insertOrderSumBill(order_p, posCheckNo, posCheckTime) ){
retSyncOrderSum = 1; retSyncOrderSum = 1;
} }
...@@ -2245,7 +2431,7 @@ bool FlowControl::_ResponseOMS11Request(const QJsonObject &content, QJsonObject ...@@ -2245,7 +2431,7 @@ bool FlowControl::_ResponseOMS11Request(const QJsonObject &content, QJsonObject
{ {
Q_UNUSED(data); Q_UNUSED(data);
QLOG_INFO()<<__FUNCTION__; QLOG_INFO()<<__FUNCTION__;
bool result=true; bool result = true;
m_clickPosCount = 0; m_clickPosCount = 0;
if ( !m_bLoginResult ) { if ( !m_bLoginResult ) {
...@@ -2257,51 +2443,46 @@ bool FlowControl::_ResponseOMS11Request(const QJsonObject &content, QJsonObject ...@@ -2257,51 +2443,46 @@ bool FlowControl::_ResponseOMS11Request(const QJsonObject &content, QJsonObject
return false; return false;
} else { } else {
QString omsPushOrderId = content[JSON_ORDER_ID].toString(); QString omsPushOrderId = content[JSON_ORDER_ID].toString();
QString omsPushOrderChannel = content[JSON_CHANNEL].toString();
int omsPushOrderStatus = content[JSON_STATUS].toInt(); int omsPushOrderStatus = content[JSON_STATUS].toInt();
OrderObject *order_p = nullptr;
if ( 6 == omsPushOrderStatus ) { if ( 6 == omsPushOrderStatus ) {
// 避免小概率事件:①重复录单 ②单边账; // 避免小概率事件:①重复录单 ②单边账;
// Case1: 筛选处理 m_simValidOrdersList bool bRetDelayGetRefundDetailMutex =m_delayGetRefundDetailMutex.tryLock(VALUE_TRYLOCKMEMTIMEOUT);
if ( m_simValidOrdersList.contains( omsPushOrderId) ) { if( !bRetDelayGetRefundDetailMutex ) {
QString simValidFirstOne = m_simValidOrdersList.first(); QLOG_ERROR() << QString("[<<<<---_ResponseOMS11Request:orderId: %1 m_delayGetRefundDetailMutex.tryLock Failed --->>>>]").arg(omsPushOrderId);
order_p = m_FmOrdersMap.value(omsPushOrderId); error =QString::fromLocal8Bit("当前订单是退单,准备将其添加到 延迟获取退单详情队列时,加锁失败,请重新推送");
//缩小锁住订单的条件范围: 服务端推单给插件程序且插件程序拒绝本次订单状态发生变化的请求
//新增条件筛选:当正在准备录入销售单的订单(m_bFloatFromLockSt=false);
if ( omsPushOrderId == simValidFirstOne && m_bFloatFromLockSt ) {
error =QString::fromLocal8Bit("当前订单正在录POS系统,请耐心等待");
return false; return false;
}else if ( order_p && 1 == order_p->pushOrderType) {
m_OrderEntryMutex.lock();
m_simValidOrdersList.removeOne(omsPushOrderId);
m_OrderEntryMutex.unlock();
}
} }
// Case2: 筛选处理 m_storagePosOrdersList /***组装延迟拉单请求对象参数***/
if ( m_storagePosOrdersList.contains( omsPushOrderId) ) { DelayPullOrderInfo* delayOrderPull_p = new DelayPullOrderInfo();
order_p = m_FmOrdersMap.value(omsPushOrderId); if ( !delayOrderPull_p ) {
if ( order_p && 1 == order_p->pushOrderType) { QLOG_ERROR() << QString("[<<<<---_ResponseOMS11Request:orderId: %1 New DelayPullOrderInfo Failed --->>>>]").arg(omsPushOrderId);
m_storageOrderMutex.lock(); error =QString::fromLocal8Bit("当前订单是退单,准备将其添加到 延迟获取退单详情队列时,New DelayPullOrderInfo 失败,请重新推送");
m_storagePosOrdersList.removeOne(omsPushOrderId); return false;
m_storageOrderMutex.unlock();
}
} }
delayOrderPull_p->orderId=omsPushOrderId;
delayOrderPull_p->channel=omsPushOrderChannel;
m_delayGetRefundDetailList.append(delayOrderPull_p);
QLOG_INFO()<<QString("[<<<<---_ResponseOMS11Request: orderId: %1 Append Success, m_delayGetRefundDetailList size: %2 And FirstOne: %3 --->>>>>]")
.arg( omsPushOrderId ).arg( m_delayGetRefundDetailList.size() ).arg( m_delayGetRefundDetailList.isEmpty()? " " : m_delayGetRefundDetailList.first()->orderId );
m_delayGetRefundDetailMutex.unlock();
} else {
// 接受到非码oms插过来的订单,进行向队列中进行添加;
// Case3: 添加前 筛选是否已经存在待拉取的状态;
result = _TryAddOrderPull( omsPushOrderId, omsPushOrderChannel );
} }
} }
// 接受到非码oms插过来的订单,进行向队列中进行添加; if ( result ) {
// Case3: 添加前 筛选是否已经存在待拉取的状态;
result = _TryAddOrderPull(content[JSON_ORDER_ID].toString(),content[JSON_CHANNEL].toString());
if (result) {
error = QString("success"); error = QString("success");
result = true; } else {
}else {
error = QString("failed"); error = QString("failed");
result = false;
} }
} }
return result; return result;
} }
...@@ -2393,6 +2574,16 @@ bool FlowControl::_ResponseSimReqTryLogin(const QJsonObject &content,QString &er ...@@ -2393,6 +2574,16 @@ bool FlowControl::_ResponseSimReqTryLogin(const QJsonObject &content,QString &er
{ {
QLOG_INFO()<<__FUNCTION__; QLOG_INFO()<<__FUNCTION__;
m_storeId=content["storeId"].toString(); //未登陆成功前 storeId; m_storeId=content["storeId"].toString(); //未登陆成功前 storeId;
m_subStoreId = ConfigManger::GetInstance().GetSubStoreId();
// 跳过 校验配置 子门店 与 母门店的前三位是否一致;增加安全保护机制 (同时实现参数可控 校验功能 );
if ( ConfigManger::GetInstance().GetSubStoreSkipVerify() ) {
m_storeId = m_subStoreId.length()?m_subStoreId:m_storeId;
} else {
m_storeId = (m_subStoreId.length() && m_subStoreId.left(3) == m_storeId.left(3) )?m_subStoreId:m_storeId;
}
QLOG_INFO()<<QString::fromLocal8Bit("[<<<<---_ResponseSimReqTryLogin: m_storeId=%1 , m_subStoreId=%2 --->>>>>]").arg(m_storeId).arg(m_subStoreId);
m_posId=content["posId"].toString(); m_posId=content["posId"].toString();
m_cashierId=content["operatorId"].toString(); m_cashierId=content["operatorId"].toString();
m_cashierName=content["operatorName"].toString(); m_cashierName=content["operatorName"].toString();
...@@ -3201,7 +3392,8 @@ bool FlowControl::_ResponseSimReqFristOrderData(const QJsonObject &content, QJso ...@@ -3201,7 +3392,8 @@ bool FlowControl::_ResponseSimReqFristOrderData(const QJsonObject &content, QJso
//**********************************整合配送费-begin*****************************************// //**********************************整合配送费-begin*****************************************//
//向商品列表尾部 添加 配送费项 + 配送费折扣项; 【特别说明:WSG-MOD 配送费及配送费折扣信息存储 coupons中;故在此处排除】 //向商品列表尾部 添加 配送费项 + 配送费折扣项; 【特别说明:WSG-MOD 配送费及配送费折扣信息存储 coupons中;故在此处排除】
if ( orderObject->deliveryPrice > 0 && ( "MOD"==orderObject->channel || "ELE" == orderObject->channel ) ) { // 配送费>0 && 配送费没有添加到商品列表中 && 渠道: ELE or MOD;
if ( orderObject->deliveryPrice > 0 && ( "MOD"==orderObject->channel || "ELE" == orderObject->channel ) && !orderObject->deliveryAtProd ) {
QJsonObject tDeliveryFeeObj; QJsonObject tDeliveryFeeObj;
tDeliveryFeeObj.insert("consume_num", 1); tDeliveryFeeObj.insert("consume_num", 1);
tDeliveryFeeObj.insert("pid", "710000268"); //配送费SKU变更; Old: 6000101 -> New:710000268 (此key 不允许设置价格为0,故当配送费为0元时,使用老的key) tDeliveryFeeObj.insert("pid", "710000268"); //配送费SKU变更; Old: 6000101 -> New:710000268 (此key 不允许设置价格为0,故当配送费为0元时,使用老的key)
...@@ -3227,8 +3419,8 @@ bool FlowControl::_ResponseSimReqFristOrderData(const QJsonObject &content, QJso ...@@ -3227,8 +3419,8 @@ bool FlowControl::_ResponseSimReqFristOrderData(const QJsonObject &content, QJso
tDeliveryDiscountTenderBObj.insert("original_price", orderObject->tenderDeliveryDiscountB); tDeliveryDiscountTenderBObj.insert("original_price", orderObject->tenderDeliveryDiscountB);
products.push_back(tDeliveryDiscountTenderBObj); products.push_back(tDeliveryDiscountTenderBObj);
} }
//配送费是0元时:需录入配送费[非-MOP(销售退货),非-MOP测试; ]; //配送费是0元时 && 配送费没有添加到商品列表中: 需录入配送费[非-MOP(销售退货),非-MOP测试; ];
} else if ( 0 == orderObject->deliveryPrice && ( "MOD"==orderObject->channel || "ELE" == orderObject->channel ) ) { } else if ( 0 == orderObject->deliveryPrice && ( "MOD"==orderObject->channel || "ELE" == orderObject->channel ) && !orderObject->deliveryAtProd ) {
QJsonObject tDeliveryFeeZoreObj; QJsonObject tDeliveryFeeZoreObj;
tDeliveryFeeZoreObj.insert("consume_num", 1); tDeliveryFeeZoreObj.insert("consume_num", 1);
tDeliveryFeeZoreObj.insert("pid","6000101"); tDeliveryFeeZoreObj.insert("pid","6000101");
......
...@@ -60,6 +60,12 @@ private: ...@@ -60,6 +60,12 @@ private:
QString orderId; QString orderId;
}PullOrderInfo; }PullOrderInfo;
typedef struct TO_DELAY_PULL_ORDER
{
QString channel;
QString orderId;
}DelayPullOrderInfo;
typedef struct ORDER_OPERATION typedef struct ORDER_OPERATION
{ {
int operation;//1:接单,0:取消订单 int operation;//1:接单,0:取消订单
...@@ -108,6 +114,8 @@ private: ...@@ -108,6 +114,8 @@ private:
int m_orderCount; int m_orderCount;
int m_clickPosCount; int m_clickPosCount;
// int m_skipRecordPos; //使用订单级别: OrderObject->decouplePosVersion 标识; // int m_skipRecordPos; //使用订单级别: OrderObject->decouplePosVersion 标识;
// 标识是否着急打印汇总单; 1:着急打印,提前将汇总单和打印记录添加到数据库; 0:默认,不着急打印,入机后才会将汇总单和打印记录添加到数据库
int m_hurryPrintSum;
//订单清除定时器 //订单清除定时器
QTimer *m_clearTimer; QTimer *m_clearTimer;
QTimer *m_heartTimer; QTimer *m_heartTimer;
...@@ -116,6 +124,7 @@ private: ...@@ -116,6 +124,7 @@ private:
QTimer *m_loginTimer; QTimer *m_loginTimer;
QTimer *m_notifySimPullTimer; QTimer *m_notifySimPullTimer;
QTimer *m_storageOrderTimer; QTimer *m_storageOrderTimer;
QTimer *m_delayGetRefundDetailTimer;
QTimer *m_remindCasherBlinkFloatTimer; //插件程序收到外卖订单后,需要一致提醒店员[直到此外卖订单被全部录入到POS系统] QTimer *m_remindCasherBlinkFloatTimer; //插件程序收到外卖订单后,需要一致提醒店员[直到此外卖订单被全部录入到POS系统]
// 网络通信 // 网络通信
BillSocket *m_loginSocket; BillSocket *m_loginSocket;
...@@ -145,6 +154,15 @@ private: ...@@ -145,6 +154,15 @@ private:
//等待Simphony拉取的有效订单队列list[orderId] //等待Simphony拉取的有效订单队列list[orderId]
QStringList m_simValidOrdersList; QStringList m_simValidOrdersList;
// 延迟拉取订单详情的 延迟队列list [DelayPullOrderInfo]
// 场景描述: 在入机销售单时,Action1 Action5 已完成, Action4 未完成; 此时拉取退单的订单详情后,
// DB 中销售单未标识入机成功,导致入机小票是销售单, 汇报入机是退货标识; 【退单入机出现遗漏】
// 解决方案: 将所有 OMS 推送的 退单请求 添加到 延迟获取退单详情队列中; 15s 中进行筛选,给销售单入机预留更多时间,避免冲突;
// 没有冲突时,添加到 正常获取订单详情队列进行排队获取订单详情,走后续流程。
// 有冲突时,继续添加到 延迟退单队列的尾部;直到 通过筛选条件,进入正常获取订单详情队列;
QList<DelayPullOrderInfo*> m_delayGetRefundDetailList;
QMutex m_delayGetRefundDetailMutex;
//订单号与pos短号映射:[可能同时存在两种状态:1:新单记录;2:退单记录;但是小票号就存一个;] //订单号与pos短号映射:[可能同时存在两种状态:1:新单记录;2:退单记录;但是小票号就存一个;]
QMap<QString,QString> m_orderIdToPosCheckNoMap; QMap<QString,QString> m_orderIdToPosCheckNoMap;
//记录当前订单操作 //记录当前订单操作
...@@ -401,6 +419,10 @@ private slots: ...@@ -401,6 +419,10 @@ private slots:
// 功能:将队列 m_storagePosOrdersList 中的订单数据 持久化存储到POS本地数据库; // 功能:将队列 m_storagePosOrdersList 中的订单数据 持久化存储到POS本地数据库;
void _StoragePosOrderData(); void _StoragePosOrderData();
// 功能:扫描 延迟获取退单详情list, 从而保证退单入机不出现单边账(退单更新了销售单的标志与汇报结果了);
// 无效的退单请求,将被再次追加在 本延迟队列尾部;等待10s后的下次扫描;
void _ScanDelayGetRefundDetailList();
void _RemindCasherBlinkFloatForm(); void _RemindCasherBlinkFloatForm();
void _OrderAnalysis(const QJsonObject &jsonObject); void _OrderAnalysis(const QJsonObject &jsonObject);
......
...@@ -211,6 +211,7 @@ bool PrintOrderPromotionDB::insertCouponPromotion(OrderObject* orderObj, const Q ...@@ -211,6 +211,7 @@ bool PrintOrderPromotionDB::insertCouponPromotion(OrderObject* orderObj, const Q
bool PrintOrderPromotionDB::insertNormalPromotion(OrderObject* orderObj, const QString& posCheckNo){ bool PrintOrderPromotionDB::insertNormalPromotion(OrderObject* orderObj, const QString& posCheckNo){
bool insertProdPromSuc = true; bool insertProdPromSuc = true;
bool insertDeliveryPromSuc = true;
QSqlQuery query(m_sqlDb); QSqlQuery query(m_sqlDb);
QDateTime qdaTi = QDateTime::currentDateTimeUtc(); QDateTime qdaTi = QDateTime::currentDateTimeUtc();
...@@ -271,6 +272,11 @@ bool PrintOrderPromotionDB::insertNormalPromotion(OrderObject* orderObj, const Q ...@@ -271,6 +272,11 @@ bool PrintOrderPromotionDB::insertNormalPromotion(OrderObject* orderObj, const Q
insertPackageFeePlaceHolderSeq = 1; insertPackageFeePlaceHolderSeq = 1;
} }
if ( orderObj->deliveryAtProd ) {
QLOG_INFO()<<QString("[<<<<---SqlServer Database: OrderId %1 deliveryAtProd:%2 Is True, No Need Insert DeliveryFee Promotion Into tb_order_promotions --->>>>]")
.arg(orderObj->id).arg(orderObj->deliveryAtProd?1:0);
} else {
// Insert DeliveryDiscount;
if ( orderObj->deliveryDiscount ) { if ( orderObj->deliveryDiscount ) {
query.prepare("INSERT INTO tb_order_promotions(order_id, order_status, chk_num, create_datetime, " query.prepare("INSERT INTO tb_order_promotions(order_id, order_status, chk_num, create_datetime, "
" prod_seq, coupon_seq, promotion_type, discount_fee, promotion_qty, promotion_sku, promotion_name ) " " prod_seq, coupon_seq, promotion_type, discount_fee, promotion_qty, promotion_sku, promotion_name ) "
...@@ -299,13 +305,15 @@ bool PrintOrderPromotionDB::insertNormalPromotion(OrderObject* orderObj, const Q ...@@ -299,13 +305,15 @@ bool PrintOrderPromotionDB::insertNormalPromotion(OrderObject* orderObj, const Q
if(!query.exec()) { if(!query.exec()) {
QLOG_ERROR()<<"[<<<<---SqlServer Database: Insert tb_order_promotions Error--->>>>]"<<query.lastError().text()<<QString::number(query.lastError().type()); QLOG_ERROR()<<"[<<<<---SqlServer Database: Insert tb_order_promotions Error--->>>>]"<<query.lastError().text()<<QString::number(query.lastError().type());
insertProdPromSuc = false; insertDeliveryPromSuc = false;
return insertDeliveryPromSuc;
} else { } else {
QLOG_INFO()<<QString("[<<<<---SqlServer Database:Insert OrderId %1 MainProductSeq: %2 DeliveryDiscountCode: 285/10400 Into tb_order_promotions Success--->>>>]") QLOG_INFO()<<QString("[<<<<---SqlServer Database:Insert OrderId %1 MainProductSeq: %2 DeliveryDiscountCode: 285/10400 Into tb_order_promotions Success--->>>>]")
.arg(orderObj->id).arg(deliveryDiscSeq); .arg(orderObj->id).arg(deliveryDiscSeq);
} }
} }
// Insert DeliveryDiscountB;
if ( orderObj->tenderDeliveryDiscountB ) { if ( orderObj->tenderDeliveryDiscountB ) {
query.prepare("INSERT INTO tb_order_promotions(order_id, order_status, chk_num, create_datetime, " query.prepare("INSERT INTO tb_order_promotions(order_id, order_status, chk_num, create_datetime, "
" prod_seq, coupon_seq, promotion_type, discount_fee, promotion_qty, promotion_sku, promotion_name ) " " prod_seq, coupon_seq, promotion_type, discount_fee, promotion_qty, promotion_sku, promotion_name ) "
...@@ -329,14 +337,17 @@ bool PrintOrderPromotionDB::insertNormalPromotion(OrderObject* orderObj, const Q ...@@ -329,14 +337,17 @@ bool PrintOrderPromotionDB::insertNormalPromotion(OrderObject* orderObj, const Q
query.addBindValue( "DeliveryFeeTenderBDiscount" ); // --优惠名称 query.addBindValue( "DeliveryFeeTenderBDiscount" ); // --优惠名称
if(!query.exec()) { if(!query.exec()) {
QLOG_ERROR()<<"[<<<<---SqlServer Database: Insert tb_order_promotions Error--->>>>]"<<query.lastError().text()<<QString::number(query.lastError().type()); QLOG_ERROR()<<"[<<<<---SqlServer Database: Insert tb_order_promotions Error--->>>>]"<<query.lastError().text()<<QString::number(query.lastError().type());
insertProdPromSuc = false; insertDeliveryPromSuc = false;
return insertDeliveryPromSuc;
} else { } else {
QLOG_INFO()<<QString("[<<<<---SqlServer Database:Insert OrderId: %1 MainProductSeq: %2 DeliveryDiscountBCode: %3 Into tb_order_promotions Success--->>>>]") QLOG_INFO()<<QString("[<<<<---SqlServer Database:Insert OrderId: %1 MainProductSeq: %2 DeliveryDiscountBCode: %3 Into tb_order_promotions Success--->>>>]")
.arg(orderObj->id).arg(deliveryDiscBSeq).arg(orderObj->tenderDeliveryDiscountBSku); .arg(orderObj->id).arg(deliveryDiscBSeq).arg(orderObj->tenderDeliveryDiscountBSku);
} }
} }
return insertProdPromSuc; }
return insertProdPromSuc && insertDeliveryPromSuc;
} }
......
...@@ -180,9 +180,9 @@ int ConfigManger::GetSubStoreSkipVerify() ...@@ -180,9 +180,9 @@ int ConfigManger::GetSubStoreSkipVerify()
return m_config->value(INI_SUBSTORESKIPVERIFY).toInt(); return m_config->value(INI_SUBSTORESKIPVERIFY).toInt();
} }
int ConfigManger::GetSkipRecordPos() int ConfigManger::GetHurryPrintSum()
{ {
return m_config->value(INI_SKIPRECORDPOS).toInt(); return m_config->value(INI_HURRYPRINTSUM).toInt();
} }
int ConfigManger::GetNoHurryRecordPos() int ConfigManger::GetNoHurryRecordPos()
......
...@@ -141,8 +141,8 @@ public: ...@@ -141,8 +141,8 @@ public:
int GetOrderSslConfig(); int GetOrderSslConfig();
int GetSubStoreSkipVerify(); int GetSubStoreSkipVerify();
int GetSkipRecordPos();
int GetNoHurryRecordPos(); int GetNoHurryRecordPos();
int GetHurryPrintSum();
// 长连接连接 PosAgent 配置端口; // 长连接连接 PosAgent 配置端口;
int GetPosAgentSvrPort(); int GetPosAgentSvrPort();
......
...@@ -569,6 +569,10 @@ bool PrintCupStickPosDB::insertDeliveryPackageAndPack(OrderObject* orderObj, con ...@@ -569,6 +569,10 @@ bool PrintCupStickPosDB::insertDeliveryPackageAndPack(OrderObject* orderObj, con
} }
if ( orderObj->deliveryAtProd ) {
QLOG_INFO()<<QString("[<<<<---SqlServer Database: OrderId %1 deliveryAtProd:%2 Is True, No Need Insert DeliveryFee Into tb_main_prod_refinfo --->>>>]")
.arg(orderObj->id).arg(orderObj->deliveryAtProd?1:0);
} else {
// Insert Delivery Fee Into tb_main_prod_refinfo; // Insert Delivery Fee Into tb_main_prod_refinfo;
query.prepare("INSERT INTO tb_main_prod_refinfo(chk_num, order_id, order_status, create_datetime, " query.prepare("INSERT INTO tb_main_prod_refinfo(chk_num, order_id, order_status, create_datetime, "
" prod_seq, prod_code, prod_name, prod_resv5, prod_price, prod_qty, prod_optionsCode, parent_id ) " " prod_seq, prod_code, prod_name, prod_resv5, prod_price, prod_qty, prod_optionsCode, parent_id ) "
...@@ -608,6 +612,8 @@ bool PrintCupStickPosDB::insertDeliveryPackageAndPack(OrderObject* orderObj, con ...@@ -608,6 +612,8 @@ bool PrintCupStickPosDB::insertDeliveryPackageAndPack(OrderObject* orderObj, con
} }
} }
}
if ( !insertDeliveryFeeRet || !insertPackageFeeRet || !insertPackRet ) { if ( !insertDeliveryFeeRet || !insertPackageFeeRet || !insertPackRet ) {
return false; return false;
} else { } else {
......
...@@ -794,7 +794,7 @@ bool PrintSumBillPosDB::insertOrderSumBill(OrderObject* orderObj, const QString& ...@@ -794,7 +794,7 @@ bool PrintSumBillPosDB::insertOrderSumBill(OrderObject* orderObj, const QString&
int tempBusinessType = orderObj->businessType.toInt(); int tempBusinessType = orderObj->businessType.toInt();
if ( "WSG-MOD" == orderObj->channel && "4" == orderObj->platformSource) if ( "WSG-MOD" == orderObj->channel && "4" == orderObj->platformSource)
tempBusinessType = 20; tempBusinessType = 20;
if ( 7 == orderObj->orderType ) { if ( 7 == orderObj->orderType || 11 == orderObj->orderType) {
tempBusinessType = 10; tempBusinessType = 10;
} else if ( 8 == orderObj->orderType ) { } else if ( 8 == orderObj->orderType ) {
tempBusinessType = 30; tempBusinessType = 30;
...@@ -890,7 +890,7 @@ bool PrintSumBillPosDB::insertOrderSumBill(OrderObject* orderObj, const QString& ...@@ -890,7 +890,7 @@ bool PrintSumBillPosDB::insertOrderSumBill(OrderObject* orderObj, const QString&
} }
// 订单解耦前需入机订单 && 订单状态为取消 && 预约订单时,需要更新 该订单在tb_msr_customer_info表中全部记录的订单状态; // 订单解耦前需入机订单 && 订单状态为取消 && 预约订单时,需要更新 该订单在tb_msr_customer_info表中全部记录的订单状态;
if ( orderObj->decouplePosVersion < 20 && OrderObject::Refunded ==orderObj->orderStatus && 7 == orderObj->orderType) { if ( orderObj->decouplePosVersion < 20 && OrderObject::Refunded ==orderObj->orderStatus && ( 7 == orderObj->orderType || 11 == orderObj->orderType ) ) {
QSqlQuery updateQuery(m_sqlDb); QSqlQuery updateQuery(m_sqlDb);
// 销售单存 1 记录(自定义组装 小票号); 退货时 也会存 1 记录(自定义组装 小票号); 该订单号将会出现两个退货记录 且 小票号还不一致 // 销售单存 1 记录(自定义组装 小票号); 退货时 也会存 1 记录(自定义组装 小票号); 该订单号将会出现两个退货记录 且 小票号还不一致
// 2021-04-11 存在此类潜在Bug(在入口添加 仅 解耦前会有此逻辑): 预约单退货场景[或许删除 销售单记录 会避免此类问题]; // 2021-04-11 存在此类潜在Bug(在入口添加 仅 解耦前会有此逻辑): 预约单退货场景[或许删除 销售单记录 会避免此类问题];
...@@ -935,7 +935,7 @@ bool PrintSumBillPosDB::updateSumBillCknoAndCktime(OrderObject* orderObj, const ...@@ -935,7 +935,7 @@ bool PrintSumBillPosDB::updateSumBillCknoAndCktime(OrderObject* orderObj, const
.arg( posCheckNo.toInt() ).arg( posCheckOpenTime ).arg( orderObj->id ) ); .arg( posCheckNo.toInt() ).arg( posCheckOpenTime ).arg( orderObj->id ) );
} }
} else { } else {
if (OrderObject::Refunded ==orderObj->orderStatus && 7 == orderObj->orderType) { if (OrderObject::Refunded ==orderObj->orderStatus && ( 7 == orderObj->orderType || 11 == orderObj->orderType ) ) {
updateQuery.prepare(QString("update tb_msr_customer_info set chk_num = %1, create_datetime = '%2', order_status = 6 where order_id = '%3' ") updateQuery.prepare(QString("update tb_msr_customer_info set chk_num = %1, create_datetime = '%2', order_status = 6 where order_id = '%3' ")
.arg( posCheckNo.toInt() ).arg( posCheckOpenTime ).arg(orderObj->id)); .arg( posCheckNo.toInt() ).arg( posCheckOpenTime ).arg(orderObj->id));
} else { } else {
...@@ -963,7 +963,7 @@ int PrintSumBillPosDB::syncOrderDataToDB(OrderObject* orderObj) { ...@@ -963,7 +963,7 @@ int PrintSumBillPosDB::syncOrderDataToDB(OrderObject* orderObj) {
// 0: 同步失败;1: 无需同步;2: 同步成功; // 0: 同步失败;1: 无需同步;2: 同步成功;
int syncAppointOrder = 1; int syncAppointOrder = 1;
// 1、同步 预约当日订单的 "提前到店" 信息,避免出现 遗漏; // 1、同步 预约当日订单的 "提前到店" 信息,避免出现 遗漏;
if ( OrderObject::Refunded != orderObj->orderStatus && 7 == orderObj->orderType && orderObj->inAdvanceTakemeal ) { if ( OrderObject::Refunded != orderObj->orderStatus && ( 7 == orderObj->orderType || 11 == orderObj->orderType ) && orderObj->inAdvanceTakemeal ) {
syncAppointOrder = syncAppointOrderInfo(orderObj); syncAppointOrder = syncAppointOrderInfo(orderObj);
QLOG_INFO()<<QString("[<<<<---syncOrderDataToDB syncAppointOrderInfo OrderId %1 ArriverAhead:%2 syncAppointOrder:%3--->>>>]") QLOG_INFO()<<QString("[<<<<---syncOrderDataToDB syncAppointOrderInfo OrderId %1 ArriverAhead:%2 syncAppointOrder:%3--->>>>]")
.arg(orderObj->id).arg(orderObj->inAdvanceTakemeal).arg(syncAppointOrder); .arg(orderObj->id).arg(orderObj->inAdvanceTakemeal).arg(syncAppointOrder);
...@@ -1036,7 +1036,7 @@ int PrintSumBillPosDB::updateOrderDataToDB(OrderObject* orderObj, const QString ...@@ -1036,7 +1036,7 @@ int PrintSumBillPosDB::updateOrderDataToDB(OrderObject* orderObj, const QString
int updateAppointOrder = 1; int updateAppointOrder = 1;
if ("appointed_remindTemplate"==cloumnName ) { if ("appointed_remindTemplate"==cloumnName ) {
// 1、更新 预约当日订单的 "提前到店" 信息,避免出现 遗漏; // 1、更新 预约当日订单的 "提前到店" 信息,避免出现 遗漏;
if ( OrderObject::Refunded != orderObj->orderStatus && 7 == orderObj->orderType && orderObj->inAdvanceTakemeal ) { if ( OrderObject::Refunded != orderObj->orderStatus && ( 7 == orderObj->orderType || 11 == orderObj->orderType ) && orderObj->inAdvanceTakemeal ) {
updateAppointOrder = updateAppointOrderInfo(orderObj) ? 2: 0 ; updateAppointOrder = updateAppointOrderInfo(orderObj) ? 2: 0 ;
QLOG_INFO()<<QString("[<<<<---updateOrderDataToDB updateAppointOrderInfo OrderId %1 " QLOG_INFO()<<QString("[<<<<---updateOrderDataToDB updateAppointOrderInfo OrderId %1 "
"ArriverAhead:%2 updateAppointOrder:%3 lastExpectDate:%4 --->>>>]") "ArriverAhead:%2 updateAppointOrder:%3 lastExpectDate:%4 --->>>>]")
...@@ -1142,6 +1142,33 @@ bool PrintSumBillPosDB::isOrderSumBillExist(OrderObject* orderObj){ ...@@ -1142,6 +1142,33 @@ bool PrintSumBillPosDB::isOrderSumBillExist(OrderObject* orderObj){
return result; return result;
} }
bool PrintSumBillPosDB::deleteSumBillRecord(QString creatTime)
{
bool retTryLock = m_mutex.tryLock(VALUE_TRYLOCKNETTIMEOUT);
if(!retTryLock){
QLOG_ERROR()<<"[<<<<---PrintSumBillPosDB::deleteSumBillRecord Try Lock Failed--->>>>]";
return false;
}
if(!m_sqlDb.open()) {
QLOG_ERROR()<<"[<<<<---PrintSumBillPosDB::deleteSumBillRecord Open Failed--->>>>]"<<m_sqlDb.lastError().text();
m_mutex.unlock();
return false;
}
bool result=true;
QLOG_INFO()<<QString("[<<<<---PrintSumBillPosDB::begin deleteSumBillRecord create_datetime:%1--->>>>]").arg(creatTime);
QSqlQuery query(m_sqlDb);
query.prepare(QString("delete from tb_msr_customer_info where create_datetime<'%1'").arg(creatTime));
if(!query.exec()) {
QLOG_ERROR()<<query.lastError().text()<<__FUNCTION__;
result= false;
}
m_sqlDb.close();
m_mutex.unlock();
return result;
}
bool PrintSumBillPosDB::queryValue(const QString& orderId, const QString& key, QString& error, QVariant &value){ bool PrintSumBillPosDB::queryValue(const QString& orderId, const QString& key, QString& error, QVariant &value){
QMutexLocker mutex(&m_mutex); QMutexLocker mutex(&m_mutex);
if(!m_sqlDb.open()) { if(!m_sqlDb.open()) {
......
...@@ -121,6 +121,13 @@ public: ...@@ -121,6 +121,13 @@ public:
**/ **/
bool isOrderSumBillExist(OrderObject* orderObj); bool isOrderSumBillExist(OrderObject* orderObj);
/**
*功能:清除汇总账单DB 中过期记录;
*参数:[1]记录创建时间
*返回:true是,false否
**/
bool deleteSumBillRecord(QString creatTime);
bool queryValue(const QString& orderId, const QString& key, QString& error, QVariant &value); bool queryValue(const QString& orderId, const QString& key, QString& error, QVariant &value);
bool queryIsNull(const QString &orderId, const QString& key,QString &error, bool &result); bool queryIsNull(const QString &orderId, const QString& key,QString &error, bool &result);
......
...@@ -55,7 +55,11 @@ void LoaclHttpServer::run() ...@@ -55,7 +55,11 @@ void LoaclHttpServer::run()
/***将FM外卖插件中的合法有效数据返回给上面Http发过来的请求***/ /***将FM外卖插件中的合法有效数据返回给上面Http发过来的请求***/
replyObject = FlowControl::GetInstance()._PackHttpReplyJson(status, msg, data, iscontinue, orderId); replyObject = FlowControl::GetInstance()._PackHttpReplyJson(status, msg, data, iscontinue, orderId);
QLOG_INFO() << QString::fromLocal8Bit("[<<<<---FM外卖插件回应Http拉单请求后的返回结果:--->>>>]") << replyObject; QLOG_INFO() << QString::fromLocal8Bit("[<<<<---FM外卖插件回应Http拉单请求后的返回结果:--->>>>]") << replyObject;
if( !session.isNull() ) {
session->replyJsonObject(replyObject); session->replyJsonObject(replyObject);
} else {
QLOG_INFO() << QString::fromLocal8Bit("[<<<<---FM外卖插件回应Http拉单请求, Session Is Null, Skip Response --->>>>]");
}
} }
/***解析FM外卖插件HTTP服务与Http请求的会话连接是否断开: 会话连接断开***/ /***解析FM外卖插件HTTP服务与Http请求的会话连接是否断开: 会话连接断开***/
else{ else{
......
...@@ -249,7 +249,9 @@ QString OrderObject::getChannelName() ...@@ -249,7 +249,9 @@ QString OrderObject::getChannelName()
if ( 3 == orderType ) { if ( 3 == orderType ) {
return QString::fromLocal8Bit("星-客诉"); return QString::fromLocal8Bit("星-客诉");
}else if ( 7 == orderType ) { }else if ( 7 == orderType ) {
return QString::fromLocal8Bit("预-MOD"); return QString::fromLocal8Bit("预-MOD-当日");
}else if ( 11 == orderType ) {
return QString::fromLocal8Bit("预-MOD-隔日");
}else if ( 8 == orderType ) { }else if ( 8 == orderType ) {
return QString::fromLocal8Bit("拼-MOD"); return QString::fromLocal8Bit("拼-MOD");
} else { } else {
...@@ -265,7 +267,9 @@ QString OrderObject::getChannelName() ...@@ -265,7 +267,9 @@ QString OrderObject::getChannelName()
}else if("ELE" == channel){ }else if("ELE" == channel){
if ( 7 == orderType ) { if ( 7 == orderType ) {
return QString::fromLocal8Bit("预-饿了么"); return QString::fromLocal8Bit("预-饿了么-当日");
}else if ( 11 == orderType ) {
return QString::fromLocal8Bit("预-饿了么-隔日");
} else { } else {
return QString::fromLocal8Bit("饿了么"); return QString::fromLocal8Bit("饿了么");
} }
...@@ -274,7 +278,9 @@ QString OrderObject::getChannelName() ...@@ -274,7 +278,9 @@ QString OrderObject::getChannelName()
if ( 4 == orderType ) { if ( 4 == orderType ) {
return QString::fromLocal8Bit("星-自测"); return QString::fromLocal8Bit("星-自测");
} else if ( 7 == orderType ) { } else if ( 7 == orderType ) {
return QString::fromLocal8Bit("预-MOP"); return QString::fromLocal8Bit("预-MOP-当日");
} else if ( 11 == orderType ) {
return QString::fromLocal8Bit("预-MOP-隔日");
} else if ( 8 == orderType ) { } else if ( 8 == orderType ) {
return QString::fromLocal8Bit("拼-MOP"); return QString::fromLocal8Bit("拼-MOP");
} else if (10 == orderType) { } else if (10 == orderType) {
......
...@@ -96,6 +96,7 @@ class OrderObject : public QObject ...@@ -96,6 +96,7 @@ class OrderObject : public QObject
Q_PROPERTY (QString tenderDeliveryDiscountBSku READ getTenderDeliveryDiscountBSku WRITE setTenderDeliveryDiscountBSku) Q_PROPERTY (QString tenderDeliveryDiscountBSku READ getTenderDeliveryDiscountBSku WRITE setTenderDeliveryDiscountBSku)
Q_PROPERTY (int decouplePosVersion READ getDecouplePosVersion WRITE setDecouplePosVersion) Q_PROPERTY (int decouplePosVersion READ getDecouplePosVersion WRITE setDecouplePosVersion)
Q_PROPERTY (bool deliveryAtProd READ getDeliveryAtProd WRITE setDeliveryAtProd)
Q_PROPERTY (int globalServiceType READ getGlobalServiceType WRITE setGlobalServiceType) Q_PROPERTY (int globalServiceType READ getGlobalServiceType WRITE setGlobalServiceType)
Q_PROPERTY (int globalOrderType READ getGlobalOrderType WRITE setGlobalOrderType) Q_PROPERTY (int globalOrderType READ getGlobalOrderType WRITE setGlobalOrderType)
...@@ -209,6 +210,7 @@ public: ...@@ -209,6 +210,7 @@ public:
int tenderDeliveryDiscountB; // 配送费 B账户优惠金额 int tenderDeliveryDiscountB; // 配送费 B账户优惠金额
QString tenderDeliveryDiscountBSku; // 配送费 B账户优惠SKU; QString tenderDeliveryDiscountBSku; // 配送费 B账户优惠SKU;
int decouplePosVersion; // 解耦POS版本 int decouplePosVersion; // 解耦POS版本
bool deliveryAtProd; // 配送费已添加到商品列表标志;
int globalServiceType; // 全链路服务类型: globalServiceType【新增字段:int】 int globalServiceType; // 全链路服务类型: globalServiceType【新增字段:int】
int globalOrderType; // 全链路订单类型: globalOrderType 【新增字段:int】 int globalOrderType; // 全链路订单类型: globalOrderType 【新增字段:int】
...@@ -480,6 +482,9 @@ public: ...@@ -480,6 +482,9 @@ public:
inline int getDecouplePosVersion()const{return decouplePosVersion;} inline int getDecouplePosVersion()const{return decouplePosVersion;}
inline void setDecouplePosVersion(const int& v){decouplePosVersion = v;} inline void setDecouplePosVersion(const int& v){decouplePosVersion = v;}
inline bool getDeliveryAtProd()const{return deliveryAtProd;}
inline void setDeliveryAtProd(const bool& v){deliveryAtProd = v;}
inline QString getTenderDeliveryDiscountBSku()const{return tenderDeliveryDiscountBSku;} inline QString getTenderDeliveryDiscountBSku()const{return tenderDeliveryDiscountBSku;}
inline void setTenderDeliveryDiscountBSku(const QString& v){tenderDeliveryDiscountBSku = v;} inline void setTenderDeliveryDiscountBSku(const QString& v){tenderDeliveryDiscountBSku = v;}
......
...@@ -53,7 +53,7 @@ void DetailForm::InitData(OrderObject *orderObject) ...@@ -53,7 +53,7 @@ void DetailForm::InitData(OrderObject *orderObject)
} else { } else {
deliveryFinishTime = orderObject->deliveryTime; deliveryFinishTime = orderObject->deliveryTime;
} }
if (7 == orderObject->orderType) { if ( 7 == orderObject->orderType || 11 == orderObject->orderType ) {
deliveryFinishTime = deliveryFinishTime + QString::fromLocal8Bit("预约时间: ") + orderObject->expectDate; deliveryFinishTime = deliveryFinishTime + QString::fromLocal8Bit("预约时间: ") + orderObject->expectDate;
} }
ui->detailLab2->setText(deliveryFinishTime); ui->detailLab2->setText(deliveryFinishTime);
......
...@@ -7,8 +7,8 @@ IDI_ICON ICON DISCARDABLE "logo.ico" ...@@ -7,8 +7,8 @@ IDI_ICON ICON DISCARDABLE "logo.ico"
#endif #endif
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
//***每次修改后编译发版必须变更版本号(preDefine.h中APP_VERSION 需要一致)***// //***每次修改后编译发版必须变更版本号(preDefine.h中APP_VERSION 需要一致)***//
FILEVERSION 2,2021,4,19 FILEVERSION 2,2021,5,11
PRODUCTVERSION 2,2021,4,19 PRODUCTVERSION 2,2021,5,11
//*************************************************************************// //*************************************************************************//
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
...@@ -31,8 +31,8 @@ VS_VERSION_INFO VERSIONINFO ...@@ -31,8 +31,8 @@ VS_VERSION_INFO VERSIONINFO
VALUE "OriginalFilename", "fmTakeout.exe" VALUE "OriginalFilename", "fmTakeout.exe"
VALUE "ProductName", "Delivery Order Plugin" VALUE "ProductName", "Delivery Order Plugin"
//***每次修改后编译发版必须变更版本号(preDefine.h中APP_VERSION 需要一致)***// //***每次修改后编译发版必须变更版本号(preDefine.h中APP_VERSION 需要一致)***//
VALUE "ProductVersion", "2.2021.4.19" VALUE "ProductVersion", "2.2021.5.11"
VALUE "FileVersion", "2.2021.4.19" VALUE "FileVersion", "2.2021.5.11"
//*************************************************************************// //*************************************************************************//
END END
END END
......
...@@ -35,7 +35,8 @@ ...@@ -35,7 +35,8 @@
//#define APP_VERSION "2.2021.1.11" //#define APP_VERSION "2.2021.1.11"
//#define APP_VERSION "2.2021.2.22" //#define APP_VERSION "2.2021.2.22"
//#define APP_VERSION "2.2021.2.26" //#define APP_VERSION "2.2021.2.26"
#define APP_VERSION "2.2021.4.19" //#define APP_VERSION "2.2021.4.19"
#define APP_VERSION "2.2021.5.11"
//修正版本号时,切记修正 FmTakeout.rc 中的版本号 //修正版本号时,切记修正 FmTakeout.rc 中的版本号
...@@ -71,7 +72,7 @@ ...@@ -71,7 +72,7 @@
#define INI_POSNO "Software/posno" #define INI_POSNO "Software/posno"
#define INI_SUBSTOREID "Software/substoreid" #define INI_SUBSTOREID "Software/substoreid"
#define INI_SUBSTORESKIPVERIFY "Software/substoreSkipVerify" #define INI_SUBSTORESKIPVERIFY "Software/substoreSkipVerify"
#define INI_SKIPRECORDPOS "Software/skipRecordPos" #define INI_HURRYPRINTSUM "Software/hurryPrintSum"
#define INI_NOHURRYRECORDPOS "Software/noHurryRecordPos" #define INI_NOHURRYRECORDPOS "Software/noHurryRecordPos"
#define INI_PASSWORD "Software/password" #define INI_PASSWORD "Software/password"
......
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