diff --git a/src/calendar-client/src/dataManage/lunarmanager.cpp b/src/calendar-client/src/dataManage/lunarmanager.cpp index 1511e3c7d..87bdb6565 100644 --- a/src/calendar-client/src/dataManage/lunarmanager.cpp +++ b/src/calendar-client/src/dataManage/lunarmanager.cpp @@ -157,9 +157,13 @@ void LunarManager::queryLunarInfo(const QDate &startDate, const QDate &stopDate) delete dbus; return lunarInfoMap; }); - connect(w, &QFutureWatcher>::finished, this, [this, w]() { - m_lunarInfoMap = w->result(); - qCDebug(ClientLogger) << "Lunar info query completed with" << m_lunarInfoMap.size() << "days"; + connect(w, &QFutureWatcher>::finished, this, [this, w, startDate, stopDate]() { + auto result = w->result(); + for (auto it = result.constBegin(); it != result.constEnd(); ++it) { + m_lunarInfoMap[it.key()] = it.value(); + } + m_pendingQueries.remove(qMakePair(startDate, stopDate)); + qCDebug(ClientLogger) << "Lunar info query completed, total cached:" << m_lunarInfoMap.size() << "days"; w->deleteLater(); emit lunarInfoReady(); }); @@ -191,14 +195,14 @@ void LunarManager::queryFestivalInfo(const QDate &startDate, const QDate &stopDa delete dbus; return festivallist; }); - connect(w, &QFutureWatcher>::finished, this, [this, w]() { + connect(w, &QFutureWatcher>::finished, this, [this, w, startDate, stopDate]() { auto festivallist = w->result(); - m_festivalDateMap.clear(); for (const FestivalInfo &info : festivallist) { for (const HolidayInfo &h : info.listHoliday) { m_festivalDateMap[h.date] = h.status; } } + m_pendingQueries.remove(qMakePair(startDate, stopDate)); qCDebug(ClientLogger) << "Festival date map updated with" << m_festivalDateMap.size() << "days"; w->deleteLater(); emit festivalInfoReady(); @@ -274,7 +278,7 @@ QMap LunarManager::getHuangLiDayMap(const QDate &startD QMap lunarInfoMap; auto iterator = m_lunarInfoMap.begin(); while(iterator != m_lunarInfoMap.end()) { - if (iterator.key() >= startDate || iterator.key() <= stopDate) { + if (iterator.key() >= startDate && iterator.key() <= stopDate) { iterator.value(); lunarInfoMap[iterator.key()] = iterator.value(); } @@ -297,7 +301,7 @@ QMap LunarManager::getFestivalInfoDateMap(const QDate &startDate, co QMap festivalDateMap; auto iterator = m_festivalDateMap.begin(); while(iterator != m_festivalDateMap.end()) { - if (iterator.key() >= startDate || iterator.key() <= stopDate) { + if (iterator.key() >= startDate && iterator.key() <= stopDate) { iterator.value(); festivalDateMap[iterator.key()] = iterator.value(); } @@ -321,6 +325,12 @@ void LunarManager::ensureLunarDataLoaded(const QDate &startDate, const QDate &en return; } + // Prevent re-entrant queries for the same range while DBus call is in flight + auto key = qMakePair(startDate, endDate); + if (m_pendingQueries.contains(key)) { + return; + } + // Check if this range (or a superset) has already been queried for (const auto &range : m_queriedRanges) { if (startDate >= range.first && endDate <= range.second) { @@ -338,6 +348,7 @@ void LunarManager::ensureLunarDataLoaded(const QDate &startDate, const QDate &en if (cachedDays < expectedDays) { qCDebug(ClientLogger) << "Querying lunar data for range" << startDate.toString() << "to" << endDate.toString() << "expected:" << expectedDays << "cached:" << cachedDays; + m_pendingQueries.insert(key); queryLunarInfo(startDate, endDate); queryFestivalInfo(startDate, endDate); } diff --git a/src/calendar-client/src/dataManage/lunarmanager.h b/src/calendar-client/src/dataManage/lunarmanager.h index fb6aea8af..81800a0c5 100644 --- a/src/calendar-client/src/dataManage/lunarmanager.h +++ b/src/calendar-client/src/dataManage/lunarmanager.h @@ -63,6 +63,7 @@ public slots: QMap m_lunarInfoMap; //缓存的农历数据 QMap m_festivalDateMap; //缓存的节假日数据 QList> m_queriedRanges; //已查询的日期范围缓存 + QSet> m_pendingQueries; //正在查询中的范围,防止重入 }; #define gLunarManager LunarManager::getInstace() diff --git a/src/calendar-client/src/dbus/dbusaccountmanagerrequest.cpp b/src/calendar-client/src/dbus/dbusaccountmanagerrequest.cpp index f62e1d91c..1193403a6 100644 --- a/src/calendar-client/src/dbus/dbusaccountmanagerrequest.cpp +++ b/src/calendar-client/src/dbus/dbusaccountmanagerrequest.cpp @@ -6,6 +6,7 @@ #include "commondef.h" #include "dcalendargeneralsettings.h" #include +#include #include DbusAccountManagerRequest::DbusAccountManagerRequest(QObject *parent) @@ -192,9 +193,43 @@ void DbusAccountManagerRequest::slotCallFinished(CDBusPendingCallWatcher *call) //错误处理 if (call->isError()) { - qCWarning(ClientLogger) << "DBus call error - Method:" << call->reply().member() + qCWarning(ClientLogger) << "DBus call error - Method:" << call->reply().member() << "Error:" << call->error().message(); - ret = 1; + // Retry critical calls synchronously on failure + if (call->getmember() == "getAccountList") { + qCInfo(ClientLogger) << "Retrying getAccountList synchronously"; + QDBusReply reply = callWithArgumentList(QDBus::Block, "getAccountList", QList()); + if (reply.isValid()) { + DAccount::List accountList; + if (DAccount::fromJsonListString(accountList, reply.value())) { + emit signalGetAccountListFinish(accountList); + canCall = false; + } + } + if (canCall) ret = 1; + } else if (call->getmember() == "getCalendarGeneralSettings") { + qCInfo(ClientLogger) << "Retrying getCalendarGeneralSettings synchronously"; + QDBusReply reply = callWithArgumentList(QDBus::Block, "getCalendarGeneralSettings", QList()); + if (reply.isValid()) { + DCalendarGeneralSettings::Ptr ptr; + ptr.reset(new DCalendarGeneralSettings()); + if (DCalendarGeneralSettings::fromJsonString(ptr, reply.value())) { + emit signalGetGeneralSettingsFinish(ptr); + canCall = false; + } + } + if (canCall) ret = 1; + } else if (call->getmember() == "isSupportUid") { + qCInfo(ClientLogger) << "Retrying isSupportUid synchronously"; + QDBusReply reply = callWithArgumentList(QDBus::Block, "isSupportUid", QList()); + if (reply.isValid()) { + emit signalGetIsSupportUidFinish(reply.value()); + canCall = false; + } + if (canCall) ret = 1; + } else { + ret = 1; + } } else if (call->getmember() == "getAccountList") { qCDebug(ClientLogger) << "Processing getAccountList response"; QDBusPendingReply reply = *call; diff --git a/src/calendar-client/src/widget/calendarmainwindow.cpp b/src/calendar-client/src/widget/calendarmainwindow.cpp index fbfe82cf3..be54431a4 100644 --- a/src/calendar-client/src/widget/calendarmainwindow.cpp +++ b/src/calendar-client/src/widget/calendarmainwindow.cpp @@ -204,22 +204,23 @@ void Calendarmainwindow::slotCurrentDateUpdate() // qCDebug(ClientLogger) << "Calendarmainwindow::slotCurrentDateUpdate"; //获取当前时间 const QDateTime _currentDate = QDateTime::currentDateTime(); - //设置当前时间 - if (m_DayWindow) m_DayWindow->setCurrentDateTime(_currentDate); + //只对日视图更新当前时间(用于时间线绘制),仅当日视图可见时 + if (m_DayWindow && m_stackWidget->currentIndex() == DDECalendar::CalendarDayWindow) + m_DayWindow->setCurrentDateTime(_currentDate); //如果当前日期与动态图标日期不一样则重新生成动态图标 if (_currentDate.date() != CDynamicIcon::getInstance()->getDate()) { qCDebug(ClientLogger) << "Updating dynamic icon date" << "new date:" << QDate::currentDate(); CDynamicIcon::getInstance()->setDate(QDate::currentDate()); CDynamicIcon::getInstance()->setIcon(); - //更新视图数据显示 - for (int i = 0; i < m_stackWidget->count(); ++i) { - CScheduleBaseWidget *widget = qobject_cast(m_stackWidget->widget(i)); - if (widget) widget->updateData(); - } + //更新当前可见视图数据显示 + CScheduleBaseWidget *currentWidget = qobject_cast(m_stackWidget->currentWidget()); + if (currentWidget) currentWidget->updateData(); //设置年视图年数据时间显示 if (m_yearwindow) m_yearwindow->setYearData(); //更新月视图当前周横线绘制 if (m_monthWindow) m_monthWindow->setCurrentDateTime(_currentDate); + //日期变化时也要更新日视图时间 + if (m_DayWindow) m_DayWindow->setCurrentDateTime(_currentDate); } } diff --git a/src/calendar-client/src/widget/yearWidget/yearwindow.cpp b/src/calendar-client/src/widget/yearWidget/yearwindow.cpp index f4add1f08..339a8e24b 100644 --- a/src/calendar-client/src/widget/yearWidget/yearwindow.cpp +++ b/src/calendar-client/src/widget/yearWidget/yearwindow.cpp @@ -524,8 +524,7 @@ void CYearWindow::updateShowLunar() if (getShowLunar()) { QDate yearStart(getSelectDate().year(), 1, 1); QDate yearEnd(getSelectDate().year(), 12, 31); - gLunarManager->queryLunarInfo(yearStart, yearEnd); - gLunarManager->queryFestivalInfo(yearStart, yearEnd); + gLunarManager->ensureLunarDataLoaded(yearStart, yearEnd); } //获取农历信息