Files
MrleeAdmin/frontend/scanapp/pages/query/index.vue
T
2026-08-31 11:33:59 +08:00

1059 lines
23 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="query-page query-layout" :class="`theme-${themeMode}`">
<view class="query-header">
<view>
<text class="query-title">记录查询</text>
<text class="query-subtitle">快速定位扫码、批量与异常记录</text>
</view>
<u-icon name="search" color="#2f6cf6" size="34" />
</view>
<view class="query-tabs">
<view v-for="item in queryTypes" :key="item.value" class="query-tab" :class="{ 'is-active': activeQueryType === item.value }" @tap="activeQueryType = item.value">
<u-icon :name="item.icon" :color="activeQueryType === item.value ? '#ffffff' : '#9aa4b4'" size="28" />
<text>{{ item.label }}</text>
</view>
</view>
<view class="query-search-row">
<view class="query-input-wrap">
<u-input v-model="keyword" :input-mode="pdaMode ? 'none' : 'text'" clearable prefix-icon="search" placeholder="请输入单号、商品编码或操作人" placeholder-style="color: #a0a7b5;" @focus="handleKeywordInputFocus" @confirm="handleSearch" />
</view>
<view class="camera-button" :class="{ 'is-scanning': isScanning }" @tap="scanKeyword">
<u-icon name="scan" color="#ffffff" size="32" />
</view>
<view class="query-button" @tap="handleSearch">查询</view>
</view>
<view class="advanced-trigger" @tap="showAdvanced = !showAdvanced">
<view class="advanced-title">
<u-icon name="list" color="#687386" size="28" />
<text>高级筛选</text>
<text class="advanced-state">{{ showAdvanced ? '收起' : '可选' }}</text>
</view>
<u-icon :name="showAdvanced ? 'arrow-up' : 'arrow-down'" color="#9aa4b4" size="24" />
</view>
<view v-if="showAdvanced" class="advanced-panel">
<view class="filter-label">工序</view>
<view class="chip-row compact-chip-row">
<view v-for="item in processOptions" :key="item.value" class="chip" :class="{ 'is-active': activeProcess === item.value }" @tap="activeProcess = item.value">
{{ item.label }}
</view>
</view>
<view class="filter-label status-filter-label">状态</view>
<view class="chip-row compact-chip-row">
<view v-for="item in statusOptions" :key="item.value" class="chip" :class="{ 'is-active': activeStatus === item.value }" @tap="activeStatus = item.value">
{{ item.label }}
</view>
</view>
<view class="filter-actions">
<text @tap="resetFilter">重置条件</text>
<text class="filter-confirm" @tap="handleSearch">确定筛选</text>
</view>
</view>
<view class="result-header">
<text>找到 {{ filteredRecords.length }} 条结果</text>
<text>{{ currentTypeLabel }}</text>
</view>
<view v-if="filteredRecords.length" class="record-list">
<view v-for="item in filteredRecords" :key="item.id" class="record-card compact-record" @tap="showRecordDetail(item)">
<view class="record-top">
<view class="record-number">
<u-icon name="list" color="#44c653" size="28" />
<text class="record-main">{{ item.mainNo }}</text>
</view>
<view class="record-type-pill">{{ getRecordTypeLabel(item) }}</view>
</view>
<view class="record-detail-grid">
<view class="record-detail"><text>岗位:</text><text>{{ item.position }}</text></view>
<view class="record-detail"><text>工序:</text><text>{{ item.process }}</text></view>
<view class="record-detail"><text>状态:</text><text class="record-status" :class="item.statusClass">{{ item.statusLabel }}</text></view>
<view class="record-detail"><text>操作员:</text><text>{{ item.operator }}</text></view>
</view>
<view class="record-footer">
<text>{{ item.scanTime }}</text>
<u-icon name="arrow-right" color="#c1c7d0" size="24" />
</view>
</view>
</view>
<u-empty v-else mode="data" text="暂无查询结果" />
<view v-if="detailVisible && selectedRecord" class="detail-mask" @tap="closeRecordDetail">
<view class="detail-sheet" @tap.stop>
<view class="sheet-handle"></view>
<view class="detail-sheet-header">
<text>录入数据明细</text>
<u-icon name="close" color="#7d8798" size="30" @tap="closeRecordDetail" />
</view>
<text class="sheet-main-no">{{ selectedRecord.mainNo }}</text>
<view class="sheet-detail-grid">
<view class="sheet-detail-item"><text>记录类型</text><text>{{ getRecordTypeLabel(selectedRecord) }}</text></view>
<view class="sheet-detail-item"><text>录入模式</text><text>{{ selectedRecord.modeLabel }}</text></view>
<view class="sheet-detail-item"><text>岗位</text><text>{{ selectedRecord.position }}</text></view>
<view class="sheet-detail-item"><text>工序 / 步骤</text><text>{{ selectedRecord.process }} / {{ selectedRecord.step }}</text></view>
<view class="sheet-detail-item"><text>商品编码</text><text>{{ selectedRecord.productCode || '-' }}</text></view>
<view class="sheet-detail-item"><text>数量</text><text>{{ selectedRecord.quantity || '-' }}</text></view>
<view class="sheet-detail-item"><text>操作人</text><text>{{ selectedRecord.operator }}</text></view>
<view class="sheet-detail-item"><text>扫码时间</text><text>{{ selectedRecord.scanTime }}</text></view>
</view>
<view class="sheet-remark"><text>备注</text><text>{{ selectedRecord.remark }}</text></view>
</view>
</view>
</view>
</template>
<script>
// UTS 原生扫码插件仅在 App-Plus 真机/自定义基座中解析,Web 环境不加载。
// #ifdef APP-PLUS
import { openCodeScan } from '@/uni_modules/mas-code-scan'
// #endif
import { getScanRegionSetting } from '@/utils/scan-settings.js'
export default {
data() {
return {
keyword: '',
pdaMode: false,
activeQueryType: 'all',
showAdvanced: false,
isScanning: false,
activeProcess: 'all',
activeStatus: 'all',
detailVisible: false,
selectedRecord: null,
queryTypes: [
{ label: '全部', value: 'all', icon: 'search' },
{ label: '扫码记录', value: 'scan', icon: 'scan' },
{ label: '批量记录', value: 'batch', icon: 'grid-fill' },
{ label: '异常记录', value: 'abnormal', icon: 'warning-fill' }
],
processOptions: [
{ label: '全部', value: 'all' },
{ label: '总装', value: '总装' },
{ label: '质检', value: '质检' },
{ label: '包装', value: '包装' },
{ label: '组装', value: '组装' }
],
statusOptions: [
{ label: '全部', value: 'all' },
{ label: '成功', value: 'success' },
{ label: '失败', value: 'failed' }
],
records: [
{
id: 1,
queryType: 'scan',
typeLabel: '扫码记录',
mainNo: 'SO20260808001',
position: 'L1C-H',
process: '总装',
step: '开始',
operator: 'U001',
status: 'success',
statusLabel: '成功',
statusClass: 'is-success',
scanTime: '2026-08-08 18:42:13',
remark: '录入正常',
modeLabel: '订单模式',
productCode: '',
quantity: ''
},
{
id: 2,
queryType: 'scan',
typeLabel: '扫码记录',
mainNo: 'MO20260808004',
position: 'L1W-A',
process: '质检',
step: '完成',
operator: 'U003',
status: 'success',
statusLabel: '成功',
statusClass: 'is-success',
scanTime: '2026-08-08 18:31:05',
remark: '整机数据已提交',
modeLabel: '整机模式',
productCode: 'P10086',
quantity: '2'
},
{
id: 3,
queryType: 'abnormal',
typeLabel: '异常记录',
mainNo: 'SO20260808005',
position: 'L1Z-K',
process: '包装',
step: '复核',
operator: 'U002',
status: 'failed',
statusLabel: '失败',
statusClass: 'is-failed',
scanTime: '2026-08-08 18:12:44',
remark: '订单号格式不符合规则',
modeLabel: '订单模式',
productCode: '',
quantity: ''
},
{
id: 4,
queryType: 'batch',
typeLabel: '批量记录',
mainNo: 'MO20260808006',
position: 'L1P-D',
process: '总装',
step: '开始',
operator: 'U004',
status: 'success',
statusLabel: '成功',
statusClass: 'is-success',
scanTime: '2026-08-08 17:58:07',
remark: '录入正常',
modeLabel: '整机模式',
productCode: 'P10092',
quantity: '1'
}
]
}
},
computed: {
filteredRecords() {
const keyword = this.keyword.trim().toLowerCase()
return this.records.filter((item) => {
const matchKeyword = !keyword
|| String(item.mainNo).toLowerCase().includes(keyword)
|| String(item.position || '').toLowerCase().includes(keyword)
|| String(item.productCode || '').toLowerCase().includes(keyword)
|| String(item.operator).toLowerCase().includes(keyword)
const matchType = this.activeQueryType === 'all' || item.queryType === this.activeQueryType
const matchProcess = this.activeProcess === 'all' || item.process === this.activeProcess
const matchStatus = this.activeStatus === 'all' || item.status === this.activeStatus
return matchKeyword && matchType && matchProcess && matchStatus
})
},
currentTypeLabel() {
const current = this.queryTypes.find((item) => item.value === this.activeQueryType)
return current ? current.label : '全部类型'
},
successCount() {
return this.filteredRecords.filter((item) => item.status === 'success').length
},
failedCount() {
return this.filteredRecords.filter((item) => item.status === 'failed').length
}
},
watch: {
filteredRecords: {
immediate: true,
handler(list) {
if (!list.length) {
this.selectedRecord = null
this.detailVisible = false
return
}
if (!this.selectedRecord || !list.some((item) => item.id === this.selectedRecord.id)) {
this.selectedRecord = list[0]
}
}
}
},
methods: {
getCurrentUserCode() {
const user = uni.getStorageSync('scanapp_user') || {}
return user.username || user.nickname || 'U001'
},
loadPdaMode() {
const settings = uni.getStorageSync(`scanapp_settings_${this.getCurrentUserCode()}`)
this.pdaMode = settings?.pdaMode === true
},
handleKeywordInputFocus() {
// #ifdef APP-PLUS
try {
const activity = plus.android.runtimeMainActivity()
const focusedView = activity.getWindow().getDecorView().findFocus()
if (focusedView) plus.android.invoke(focusedView, 'setShowSoftInputOnFocus', !this.pdaMode)
if (this.pdaMode) uni.hideKeyboard()
} catch (error) {
if (this.pdaMode) uni.hideKeyboard()
}
// #endif
},
handleSearch() {
if (!this.filteredRecords.length) {
this.selectedRecord = null
this.detailVisible = false
return
}
if (!this.selectedRecord || !this.filteredRecords.some((item) => item.id === this.selectedRecord.id)) {
this.selectedRecord = this.filteredRecords[0]
}
},
resetFilter() {
this.keyword = ''
this.activeQueryType = 'all'
this.activeProcess = 'all'
this.activeStatus = 'all'
this.showAdvanced = false
this.detailVisible = false
this.selectedRecord = this.records[0] || null
},
scanKeyword() {
if (this.isScanning) return
// #ifdef APP-PLUS
this.isScanning = true
openCodeScan({
smartZoom: true,
vibrate: true,
scanRegion: getScanRegionSetting(),
success: (result) => {
const value = String(result?.content || '').trim()
if (!value) return
this.keyword = value
this.handleSearch()
},
fail: (error) => {
const code = Number(error?.errCode)
if (code === 9021003) return
const messageMap = {
9021001: '当前环境不支持扫码,请在 Android 自定义调试基座或正式安装包中使用',
9021002: '相机权限被拒绝,请到系统设置中开启相机权限',
9021004: '未获取到有效扫码结果,请重试'
}
uni.showToast({ title: messageMap[code] || String(error?.errMsg || '扫码插件调用异常'), icon: 'none' })
},
complete: () => {
this.isScanning = false
}
})
// #endif
// #ifndef APP-PLUS
uni.showToast({ title: '请在 Android App 中使用扫码功能', icon: 'none' })
// #endif
},
showRecordDetail(item) {
this.selectedRecord = item
this.detailVisible = true
},
closeRecordDetail() {
this.detailVisible = false
},
getRecordTypeLabel(item) {
return item.typeLabel || '记录'
}
},
onLoad() {
this.loadPdaMode()
this.selectedRecord = this.records[0] || null
},
onShow() {
this.loadPdaMode()
}
}
</script>
<style lang="scss" scoped>
.query-page {
min-height: 100vh;
padding: 28rpx 24rpx 48rpx;
box-sizing: border-box;
background: linear-gradient(180deg, #eef6ff 0%, #f4f6fb 38%, #f4f6fb 100%);
}
.hero-card,
.filter-card,
.summary-card,
.detail-card,
.list-card {
margin-top: 24rpx;
padding: 28rpx;
border: 1rpx solid rgba(255, 255, 255, 0.72);
border-radius: 28rpx;
background: #ffffff;
box-shadow: 0 16rpx 42rpx rgba(23, 35, 61, 0.06);
}
.hero-card {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 0;
padding: 34rpx 30rpx;
background: linear-gradient(135deg, #1677ff 0%, #35bfa3 100%);
}
.hero-title,
.hero-subtitle,
.card-title,
.filter-label,
.summary-value,
.summary-label,
.detail-main,
.detail-sub,
.detail-key,
.detail-value,
.record-main,
.record-sub,
.record-key,
.record-value {
display: block;
}
.hero-title {
color: #ffffff;
font-size: 38rpx;
font-weight: 800;
line-height: 1.35;
}
.hero-subtitle {
margin-top: 10rpx;
color: rgba(255, 255, 255, 0.82);
font-size: 22rpx;
line-height: 1.4;
}
.hero-icon {
display: flex;
align-items: center;
justify-content: center;
width: 86rpx;
height: 86rpx;
border-radius: 28rpx;
background: rgba(255, 255, 255, 0.18);
}
.card-title {
color: #17233d;
font-size: 28rpx;
font-weight: 700;
line-height: 1.35;
}
.search-row {
display: flex;
align-items: center;
gap: 16rpx;
margin-top: 20rpx;
}
.search-input-wrap {
flex: 1;
min-width: 0;
}
.filter-group {
margin-top: 20rpx;
}
.filter-label {
margin-bottom: 14rpx;
color: #5f6b7a;
font-size: 22rpx;
font-weight: 600;
line-height: 1.35;
}
.chip-row {
display: flex;
flex-wrap: wrap;
gap: 14rpx;
}
.chip {
padding: 14rpx 20rpx;
border-radius: 999rpx;
background: #f3f6fb;
color: #5f6b7a;
font-size: 24rpx;
line-height: 1.35;
}
.chip.is-active {
background: rgba(22, 119, 255, 0.12);
color: #1677ff;
}
.action-row {
display: flex;
justify-content: space-between;
gap: 16rpx;
margin-top: 24rpx;
}
.summary-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16rpx;
}
.summary-item {
padding: 22rpx 18rpx;
border-radius: 22rpx;
background: #f8fbff;
}
.summary-value {
color: #17233d;
font-size: 32rpx;
font-weight: 800;
line-height: 1.2;
}
.summary-value.success {
color: #19be6b;
}
.summary-value.danger {
color: #e91f3f;
}
.summary-label {
margin-top: 8rpx;
color: #8a94a6;
font-size: 20rpx;
line-height: 1.35;
}
.detail-card,
.list-card {
margin-top: 24rpx;
}
.detail-header,
.record-top {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16rpx;
}
.detail-main,
.record-main {
color: #17233d;
font-size: 28rpx;
font-weight: 700;
line-height: 1.35;
}
.detail-sub,
.record-sub {
margin-top: 6rpx;
color: #8a94a6;
font-size: 20rpx;
line-height: 1.35;
}
.status-pill {
padding: 10rpx 18rpx;
border-radius: 999rpx;
font-size: 20rpx;
font-weight: 600;
line-height: 1.35;
}
.status-pill.is-success {
background: rgba(25, 190, 107, 0.12);
color: #19be6b;
}
.status-pill.is-failed {
background: rgba(233, 31, 63, 0.12);
color: #e91f3f;
}
.detail-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 16rpx;
margin-top: 22rpx;
}
.detail-item {
padding: 18rpx 18rpx 20rpx;
border-radius: 20rpx;
background: #f8fbff;
}
.detail-key,
.record-key {
color: #8a94a6;
font-size: 20rpx;
line-height: 1.35;
}
.detail-value,
.record-value {
margin-top: 8rpx;
color: #17233d;
font-size: 22rpx;
font-weight: 600;
line-height: 1.35;
}
.record-card {
padding: 22rpx 24rpx;
border-radius: 24rpx;
background: #f8fbff;
margin-top: 18rpx;
}
.record-card.is-selected {
border: 1rpx solid rgba(22, 119, 255, 0.22);
background: #f5f9ff;
}
.record-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 16rpx;
margin-top: 18rpx;
}
.record-info {
padding: 16rpx 16rpx 18rpx;
border-radius: 18rpx;
background: #ffffff;
}
.query-page.query-layout {
padding: 24rpx 20rpx 40rpx;
background: #f5f7fb;
}
.query-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 4rpx 4rpx 20rpx;
}
.query-title,
.query-subtitle {
display: block;
}
.query-title {
color: #17233d;
font-size: 32rpx;
font-weight: 800;
line-height: 1.3;
}
.query-subtitle {
margin-top: 8rpx;
color: #8a94a6;
font-size: 18rpx;
line-height: 1.35;
}
.query-tabs {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10rpx;
margin-top: 8rpx;
}
.query-tab {
display: flex;
align-items: center;
justify-content: center;
gap: 6rpx;
height: 68rpx;
border: 1rpx solid transparent;
border-radius: 14rpx;
background: #edf0f5;
color: #7d8798;
font-size: 20rpx;
font-weight: 600;
line-height: 1;
}
.query-tab.is-active {
background: #2f6cf6;
color: #ffffff;
box-shadow: 0 10rpx 24rpx rgba(47, 108, 246, 0.22);
}
.query-search-row {
display: flex;
align-items: center;
gap: 0;
margin-top: 16rpx;
padding: 12rpx;
border: 1rpx solid #e9edf4;
border-radius: 18rpx;
background: #ffffff;
box-shadow: 0 8rpx 20rpx rgba(23, 35, 61, 0.04);
}
.query-input-wrap {
flex: 1;
min-width: 0;
height: 64rpx;
padding: 0 16rpx;
border: 1rpx solid #e3e7ef;
border-radius: 12rpx;
background: #f6f8fb;
box-sizing: border-box;
}
.camera-button,
.query-button {
display: flex;
align-items: center;
justify-content: center;
height: 64rpx;
border-radius: 12rpx;
background: #2f6cf6;
color: #ffffff;
font-size: 22rpx;
font-weight: 600;
line-height: 1;
box-shadow: 0 8rpx 18rpx rgba(47, 108, 246, 0.18);
}
.camera-button {
width: 64rpx;
margin-left: 16rpx;
flex: none;
transition: opacity 0.2s ease;
}
.camera-button.is-scanning {
opacity: 0.58;
}
.query-button {
width: 104rpx;
margin-left: 16rpx;
flex: none;
}
.advanced-trigger {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 14rpx;
padding: 18rpx 16rpx;
border: 1rpx solid #e9edf4;
border-radius: 14rpx;
background: #ffffff;
}
.advanced-title {
display: flex;
align-items: center;
gap: 8rpx;
color: #2c313a;
font-size: 22rpx;
font-weight: 600;
line-height: 1;
}
.advanced-state {
margin-left: 4rpx;
padding: 2rpx 8rpx;
border-radius: 8rpx;
background: #eef5ff;
color: #3a82ff;
font-size: 18rpx;
font-weight: 500;
}
.advanced-panel {
margin-top: 10rpx;
padding: 20rpx 18rpx 16rpx;
border: 1rpx solid #e9edf4;
border-radius: 16rpx;
background: #ffffff;
box-shadow: 0 8rpx 20rpx rgba(23, 35, 61, 0.04);
}
.status-filter-label {
margin-top: 10rpx;
}
.compact-chip-row {
gap: 10rpx;
}
.chip {
padding: 12rpx 18rpx;
border-radius: 999rpx;
background: #f1f4f8;
color: #6b778c;
font-size: 20rpx;
line-height: 1.35;
}
.chip.is-active {
background: #2f6cf6;
color: #ffffff;
}
.filter-actions {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 12rpx;
color: #6b778c;
font-size: 20rpx;
}
.filter-confirm {
color: #2f6cf6;
font-weight: 600;
}
.result-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 20rpx;
padding: 0 6rpx 8rpx;
color: #7d8798;
font-size: 18rpx;
line-height: 1.35;
}
.record-list {
margin-top: 2rpx;
}
.record-card.compact-record {
margin-top: 10rpx;
padding: 20rpx 18rpx 16rpx;
border: 1rpx solid #edf0f5;
border-radius: 16rpx;
background: #ffffff;
box-shadow: 0 8rpx 18rpx rgba(23, 35, 61, 0.04);
}
.record-top {
align-items: center;
}
.record-number {
display: flex;
align-items: center;
gap: 8rpx;
min-width: 0;
}
.record-main {
max-width: 430rpx;
overflow: hidden;
color: #17233d;
font-size: 26rpx;
font-weight: 800;
line-height: 1.35;
text-overflow: ellipsis;
white-space: nowrap;
}
.record-type-pill {
padding: 6rpx 12rpx;
border: 1rpx solid #b7ec8f;
border-radius: 999rpx;
background: #f8fff0;
color: #7ad63a;
font-size: 18rpx;
line-height: 1.35;
flex: none;
}
.record-detail-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 8rpx 18rpx;
margin-top: 16rpx;
padding-top: 14rpx;
border-top: 1rpx solid #f0f2f6;
}
.record-detail {
display: flex;
align-items: baseline;
font-size: 20rpx;
line-height: 1.55;
color: #7d8798;
}
.record-detail text:last-child {
color: #2b313b;
margin-left: 4rpx;
}
.record-status.is-success {
color: #7ad63a;
}
.record-status.is-failed {
color: #ff8a5b;
}
.record-footer {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 14rpx;
padding-top: 10rpx;
border-top: 1rpx solid #f5f6f8;
color: #9aa4b4;
font-size: 18rpx;
line-height: 1.35;
}
.detail-mask {
position: fixed;
inset: 0;
z-index: 999;
display: flex;
align-items: flex-end;
background: rgba(0, 0, 0, 0.32);
}
.sheet-handle {
width: 64rpx;
height: 8rpx;
margin: 0 auto 18rpx;
border-radius: 999rpx;
background: #dfe4ec;
}
.detail-sheet {
width: 100%;
max-height: 72vh;
overflow: auto;
padding: 22rpx 22rpx 30rpx;
border-radius: 24rpx 24rpx 0 0;
background: #ffffff;
box-shadow: 0 -16rpx 40rpx rgba(0, 0, 0, 0.08);
box-sizing: border-box;
}
.detail-sheet-header {
display: flex;
align-items: center;
justify-content: space-between;
color: #17233d;
font-size: 28rpx;
font-weight: 700;
line-height: 1.35;
}
.sheet-main-no {
display: block;
margin-top: 12rpx;
color: #17233d;
font-size: 32rpx;
font-weight: 800;
line-height: 1.35;
}
.sheet-detail-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 12rpx;
margin-top: 16rpx;
}
.sheet-detail-item {
padding: 14rpx;
border-radius: 14rpx;
background: #f8fbff;
}
.sheet-detail-item text:first-child {
display: block;
color: #7d8798;
font-size: 18rpx;
line-height: 1.35;
}
.sheet-detail-item text:last-child {
display: block;
margin-top: 4rpx;
color: #17233d;
font-size: 22rpx;
font-weight: 600;
line-height: 1.35;
}
.sheet-remark {
margin-top: 14rpx;
padding: 14rpx;
border-radius: 14rpx;
background: #f8fbff;
color: #7d8798;
font-size: 18rpx;
line-height: 1.45;
}
.sheet-remark text:last-child {
display: block;
margin-top: 4rpx;
color: #17233d;
font-size: 22rpx;
line-height: 1.45;
}
.theme-dark.query-page {
background: #151923;
}
.theme-dark .query-header,
.theme-dark .query-search-row,
.theme-dark .advanced-trigger,
.theme-dark .advanced-panel,
.theme-dark .record-card,
.theme-dark .detail-sheet {
border-color: #364152;
background: #222936;
box-shadow: none;
}
.theme-dark .query-tab:not(.is-active),
.theme-dark .query-input-wrap,
.theme-dark .chip,
.theme-dark .record-info,
.theme-dark .sheet-detail-item,
.theme-dark .sheet-remark {
border-color: #364152;
background: #1c2431;
}
.theme-dark .query-title,
.theme-dark .advanced-title,
.theme-dark .record-main,
.theme-dark .record-detail text:last-child,
.theme-dark .detail-sheet-header,
.theme-dark .sheet-main-no,
.theme-dark .sheet-detail-item text:last-child,
.theme-dark .sheet-remark text:last-child {
color: #f2f5fa;
}
.theme-dark .query-subtitle,
.theme-dark .result-header,
.theme-dark .filter-actions,
.theme-dark .record-detail,
.theme-dark .record-footer,
.theme-dark .sheet-detail-item text:first-child,
.theme-dark .sheet-remark {
color: #aeb9ca;
}
.theme-dark .record-detail-grid,
.theme-dark .record-footer {
border-color: #364152;
}
.theme-dark :deep(.u-input__input) {
color: #f2f5fa !important;
}
</style>