From 2f6ec7dae2e2822a082ca392f3c7026c37471802 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Thu, 25 Jun 2026 22:09:15 +0800 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=E7=B1=BB=E5=9E=8B=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E7=BB=84=E5=86=85=E6=95=B0=E6=8D=AE=E8=87=AA?= =?UTF-8?q?=E5=B8=A6=E7=B1=BB=E5=9E=8B=E5=80=BC(typeName/dsTypeCode),?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E4=BE=9D=E8=B5=96=E7=BC=BA=E5=A4=B1=E7=9A=84?= =?UTF-8?q?arrayType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按用户口径:类型筛选=按加载到该段的数据其自身携带的类型值的范围筛选。装置/arrayType 实测不在 ds 行数据上(data/page 不返回),故改用 ds 已带的 typeName(多为中文)作筛选维度,缺失回退 dsTypeCode (必要时全局枚举翻译)。下拉列出组内实际出现的类型;passesFilters 按 typeName/dsTypeCode 比对。 构建:app 链接通过 --- src/app/panels/columns/CategorySection.cpp | 44 +++++++++++----------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/app/panels/columns/CategorySection.cpp b/src/app/panels/columns/CategorySection.cpp index 32229c4..732bee0 100644 --- a/src/app/panels/columns/CategorySection.cpp +++ b/src/app/panels/columns/CategorySection.cpp @@ -156,40 +156,38 @@ void CategorySection::refreshArrayCombo() { const QSignalBlocker block(arrayCombo_); arrayCombo_->clear(); arrayCombo_->addItem(QStringLiteral("全部装置"), QString()); - if (dict_) { - const auto& en = dict_->arrayTypeEnum(); // 全局装置枚举 itemValue→中文 - QSet seen; - // 列出当前数据里出现过的装置值 → 中文名。兼容 ds 把装置存成 itemValue(键) 或中文名(值) 两种形态。 - for (const auto& r : rows_) { - for (const auto& kv : r.properties) { - const QString val = QString::fromStdString(kv.value); - QString name; - const auto it = en.find(kv.value); - if (it != en.end()) { - name = QString::fromStdString(it->second); // value 是 itemValue → 取中文名 - } else { - for (const auto& e : en) // value 可能直接是中文名 - if (QString::fromStdString(e.second) == val) { name = val; break; } - } - if (name.isEmpty() || seen.contains(val)) continue; - seen.insert(val); - arrayCombo_->addItem(name, val); // data=实际属性值(passesFilters 据此比对) + // 按「加载到本段的数据自身携带的类型值」的范围筛选(用户口径)。装置/arrayType 不在 ds 行数据上 + // (实测 data/page 列表无该字段),故用 ds 已带的类型名 typeName(多为中文)作筛选维度; + // typeName 缺失时回退 dsTypeCode + 全局枚举翻译。列出组内出现过的类型值。 + QSet seen; + for (const auto& r : rows_) { + QString display = QString::fromStdString(r.typeName); + QString code = display; + if (display.isEmpty() && !r.dsTypeCode.empty()) { // 无类型名 → 用 dsTypeCode(必要时枚举翻译) + code = QString::fromStdString(r.dsTypeCode); + display = code; + if (dict_) { + const auto& en = dict_->arrayTypeEnum(); + const auto it = en.find(r.dsTypeCode); + if (it != en.end()) display = QString::fromStdString(it->second); } } + if (code.isEmpty() || seen.contains(code)) continue; + seen.insert(code); + arrayCombo_->addItem(display, code); // itemData=类型值(passesFilters 据此比对 typeName/dsTypeCode) } const int idx = arrayCombo_->findData(prev); // 尽量保留上次选择 arrayCombo_->setCurrentIndex(idx >= 0 ? idx : 0); } bool CategorySection::passesFilters(const DsRow& row) const { - // 装置类型筛选(全局枚举;"全部"=空不筛):ds.properties 任一 value 命中选中 itemValue。 + // 类型筛选("全部"=空不筛):按 ds 自身类型值(typeName,回退 dsTypeCode)命中选中项。 if (spec_.hasArrayTypeFilter && arrayCombo_) { const QString sel = arrayCombo_->currentData().toString(); if (!sel.isEmpty()) { - bool hit = false; - for (const auto& kv : row.properties) - if (QString::fromStdString(kv.value) == sel) { hit = true; break; } - if (!hit) return false; + const QString t = !row.typeName.empty() ? QString::fromStdString(row.typeName) + : QString::fromStdString(row.dsTypeCode); + if (t != sel) return false; } } // 采集时间范围(collectTime 经 dict 取;缺则回退 createTime;空范围不约束)。