5 changed files with 681 additions and 77 deletions
-
676src/views/common/home.vue
-
22src/views/modules/longchuang/production-plan-home-order.vue
-
22src/views/modules/longchuang/production-plan-renovation-order.vue
-
20src/views/modules/longchuang/production-work-report.vue
-
2src/views/modules/sift/advancedSearchCenter.vue
@ -1,70 +1,674 @@ |
|||
<template> |
|||
<div class="mod-home"> |
|||
<div v-if="appName==='CKP'" style="width: 100%;height: 100%"> |
|||
<iframe frameborder="0" style="width: 100%;height: 100%" :src="url"> </iframe> |
|||
<div class="mod-advanced-search-center"> |
|||
<div class="page-header"> |
|||
<div class="title">高级搜索</div> |
|||
<div class="actions"> |
|||
<el-button :loading="schemeLoading" @click="loadSavedSchemeList">刷新</el-button> |
|||
<el-button type="primary" @click="openCreateDialog()">新建</el-button> |
|||
</div> |
|||
<div v-else> |
|||
<h3>旭捷</h3> |
|||
<ul> |
|||
<li><h3>欢迎: {{ userName }}!!!</h3></li> |
|||
</ul> |
|||
</div> |
|||
|
|||
<el-empty v-if="!schemeLoading && schemeList.length === 0" description="当前用户暂无已保存方案"></el-empty> |
|||
|
|||
<div class="card-grid" v-loading="schemeLoading"> |
|||
<div |
|||
class="scheme-card" |
|||
v-for="row in schemeList" |
|||
:key="row.schemeKey" |
|||
@click="gotoSchemeResult(row)"> |
|||
<div class="count-badge">{{ row.count === null ? '-' : row.count }}</div> |
|||
<div class="scheme-title">{{ row.itemDesc || '未命名方案' }}</div> |
|||
<div class="scheme-module">{{ row.menuName }}</div> |
|||
<div class="condition-list"> |
|||
<div v-if="!row.conditionPreviewList.length" class="condition-empty">未设置条件</div> |
|||
<div v-for="(line, idx) in row.conditionPreviewList" :key="idx" class="condition-line">{{ line }}</div> |
|||
</div> |
|||
<div class="card-footer"> |
|||
<el-button type="text" size="mini" style="color:#f56c6c" :loading="deletingKey === row.schemeKey" @click.stop="deleteScheme(row)">删除</el-button> |
|||
<el-button type="text" size="mini" @click.stop="openEditDialog(row)">编辑</el-button> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<el-dialog |
|||
:title="dialogMode === 'edit' ? '编辑方案' : '新建方案'" |
|||
:visible.sync="settingDialogVisible" |
|||
width="40%" |
|||
:close-on-click-modal="false"> |
|||
<el-form :inline="true" label-position="top"> |
|||
<el-form-item label="菜单"> |
|||
<el-select |
|||
v-model="editForm.menuId" |
|||
filterable |
|||
placeholder="请选择菜单" |
|||
style="width: 220px" |
|||
:disabled="dialogMode === 'edit'" |
|||
@change="handleEditMenuChange"> |
|||
<el-option v-for="item in menuOptions" :key="item.menuId" :label="item.name" :value="item.menuId"></el-option> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="方案名称"> |
|||
<el-input v-model="editForm.itemDesc" clearable placeholder="请输入方案名称" style="width: 220px"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label=" "> |
|||
<el-button :loading="editLoading" @click="loadEditFields">读取菜单搜索字段</el-button> |
|||
<el-button type="primary" :loading="editSaving" @click="saveScheme">保存</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
|
|||
<el-table |
|||
ref="editFieldTable" |
|||
:data="editFieldList" |
|||
border |
|||
stripe |
|||
class="board-table" |
|||
height="50vh" |
|||
v-loading="editLoading" |
|||
@selection-change="handleEditSelectionChange"> |
|||
<el-table-column type="selection" width="44"></el-table-column> |
|||
<el-table-column prop="fieldCaption" label="字段名称" min-width="180" show-overflow-tooltip></el-table-column> |
|||
<el-table-column label="条件符号" width="130"> |
|||
<template slot-scope="{ row }"> |
|||
<el-select v-model="row.symbol" clearable :disabled="!isEditRowSelected(row)"> |
|||
<el-option v-for="item in symbolOptions" :key="item.value" :label="item.label" :value="item.value"></el-option> |
|||
</el-select> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="条件值" min-width="220"> |
|||
<template slot-scope="{ row }"> |
|||
<el-input v-model="row.formula" clearable :disabled="!isEditRowSelected(row)"></el-input> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
</el-dialog> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import {searchSysLanguagePack} from "../../api/sysLanguage"; |
|||
|
|||
import { |
|||
searchCenterMenuSearchFields, |
|||
saveCenterScheme, |
|||
searchSavedSchemeSummary, |
|||
searchSavedSchemeCount, |
|||
resolveSavedSchemeRoute, |
|||
searchUserSettingRecording, |
|||
updateQueryHeaderDetail, |
|||
removeQueryHeaderDetail |
|||
} from '@/api/sift/queryUserSetting' |
|||
import { resolveMenuSearchFieldsByMeta } from '../modules/sift/menuSearchFieldResolver' |
|||
|
|||
export default { |
|||
name: 'home', |
|||
data () { |
|||
return { |
|||
// url:"http://xujiesoft.vicp.net:9191/bi/Show?uid=be15368c-bceb-11ef-9785-000c29f2c2b8", |
|||
//url:"http://192.168.1.90:9191/chart/reportShow?uid=3c800188-b04b-11ef-abf0-000c2947c1cd", |
|||
url:"http://172.26.68.20:9191/bi/Show?uid=eefa66f1-b058-11ef-a145-3868dd5b136a", |
|||
appName:this.$store.state.common.appName, |
|||
schemeLoading: false, |
|||
routeResolvingKey: '', |
|||
menuFlatList: [], |
|||
schemeList: [], |
|||
settingDialogVisible: false, |
|||
dialogMode: 'create', |
|||
editLoading: false, |
|||
editSaving: false, |
|||
deleting: false, |
|||
deletingKey: '', |
|||
editFieldList: [], |
|||
editSelectedFieldNameSet: {}, |
|||
editForm: { |
|||
menuId: '', |
|||
itemNo: null, |
|||
itemDesc: '', |
|||
caseInsensitive: true |
|||
}, |
|||
symbolOptions: [ |
|||
{ value: 'eq', label: '等于' }, |
|||
{ value: 'gt', label: '大于' }, |
|||
{ value: 'ge', label: '大于等于' }, |
|||
{ value: 'lt', label: '小于' }, |
|||
{ value: 'le', label: '小于等于' }, |
|||
{ value: 'between', label: '之间' }, |
|||
{ value: 'in', label: '或者' }, |
|||
{ value: 'ne', label: '不等于' }, |
|||
{ value: 'like', label: 'LIKE' } |
|||
], |
|||
symbolLabelMap: { |
|||
eq: '=', |
|||
gt: '>', |
|||
ge: '>=', |
|||
lt: '<', |
|||
le: '<=', |
|||
between: 'between', |
|||
in: 'in', |
|||
ne: '!=', |
|||
like: 'like' |
|||
} |
|||
} |
|||
}, |
|||
computed: { |
|||
menuOptions () { |
|||
return this.menuFlatList.filter(item => item.url && !item.hasChildren && !/^https?:\/\//i.test(item.url)) |
|||
} |
|||
}, |
|||
activated () { |
|||
this.initMenuContext() |
|||
this.loadSavedSchemeList() |
|||
}, |
|||
methods: { |
|||
languageRefresh(){ |
|||
console.log("欢迎使用 旭捷管理系统!!!") |
|||
initMenuContext () { |
|||
var menuList = this.$store.state.common.menuList || [] |
|||
if (!menuList.length) { |
|||
menuList = JSON.parse(sessionStorage.getItem('menuList') || '[]') |
|||
} |
|||
this.menuFlatList = this.flattenMenuList(menuList) |
|||
}, |
|||
languagePack() { |
|||
// searchSysLanguagePack().then(({data}) => { |
|||
// this.$i18n.mergeLocaleMessage('en', data.data.en) |
|||
// this.$i18n.mergeLocaleMessage('cn', data.data.cn) |
|||
// }) |
|||
flattenMenuList (tree, result) { |
|||
var list = result || [] |
|||
if (!tree || !tree.length) { |
|||
return list |
|||
} |
|||
for (var i = 0; i < tree.length; i++) { |
|||
var item = tree[i] || {} |
|||
var childList = item.list || [] |
|||
list.push({ |
|||
menuId: item.menuId, |
|||
name: item.name, |
|||
url: item.url || '', |
|||
hasChildren: !!(childList && childList.length) |
|||
}) |
|||
if (childList && childList.length) { |
|||
this.flattenMenuList(childList, list) |
|||
} |
|||
} |
|||
return list |
|||
}, |
|||
computed: { |
|||
userName: { |
|||
get() { |
|||
return this.$store.state.user.userDisplay |
|||
extractListFromResp (data) { |
|||
if (!data) { |
|||
return [] |
|||
} |
|||
if (Array.isArray(data.rows)) { |
|||
return data.rows |
|||
} |
|||
if (Array.isArray(data.list)) { |
|||
return data.list |
|||
} |
|||
if (Array.isArray(data.data)) { |
|||
return data.data |
|||
} |
|||
return [] |
|||
}, |
|||
mainTabs: { |
|||
get() { |
|||
return this.$store.state.common.mainTabs |
|||
buildSchemeKey (item) { |
|||
return [item.menuId || '', item.itemNo || '', item.savedSearchId || item.id || ''].join('_') |
|||
}, |
|||
set(val) { |
|||
this.$store.commit('common/updateMainTabs', val) |
|||
buildConditionPreviewList (detailList) { |
|||
if (!detailList || !detailList.length) { |
|||
return [] |
|||
} |
|||
return detailList |
|||
.filter(item => item && item.symbol && item.formula) |
|||
.slice(0, 4) |
|||
.map(item => { |
|||
var fieldName = item.fieldCaption || item.fieldName || '' |
|||
var symbol = this.symbolLabelMap[item.symbol] || item.symbol |
|||
return fieldName + ' ' + symbol + ' ' + item.formula |
|||
}) |
|||
}, |
|||
toSnakeCaseFieldName (name) { |
|||
if (!name) { |
|||
return '' |
|||
} |
|||
return String(name) |
|||
.replace(/([A-Z])/g, '_$1') |
|||
.replace(/-/g, '_') |
|||
.toLowerCase() |
|||
}, |
|||
beforeMount() { |
|||
this.languageRefresh() |
|||
this.languagePack() |
|||
normalizeOriginalFieldForSql (item) { |
|||
var row = Object.assign({}, item || {}) |
|||
var fieldName = row.fieldName ? String(row.fieldName) : '' |
|||
var originalField = row.originalField ? String(row.originalField) : '' |
|||
if (!originalField && fieldName) { |
|||
row.originalField = this.toSnakeCaseFieldName(fieldName) |
|||
return row |
|||
} |
|||
if (originalField && /[A-Z]/.test(originalField) && !/\s|\(|\)|\./.test(originalField)) { |
|||
row.originalField = this.toSnakeCaseFieldName(originalField) |
|||
} |
|||
return row |
|||
}, |
|||
async loadSavedSchemeList () { |
|||
this.schemeLoading = true |
|||
try { |
|||
var userId = String(this.$store.state.user.id) |
|||
var summaryResp = await searchSavedSchemeSummary({ userId: userId }) |
|||
var summaryData = summaryResp && summaryResp.data ? summaryResp.data : {} |
|||
if (!(summaryData && summaryData.code === 0)) { |
|||
this.schemeList = [] |
|||
return |
|||
} |
|||
var summaryRows = this.extractListFromResp(summaryData).map(item => Object.assign({}, item, { count: null })) |
|||
if (!summaryRows.length) { |
|||
this.schemeList = [] |
|||
return |
|||
} |
|||
var countResp = await searchSavedSchemeCount({ |
|||
userId: userId, |
|||
schemeList: summaryRows.map(item => ({ |
|||
menuId: item.menuId, |
|||
itemNo: item.itemNo, |
|||
savedSearchId: item.savedSearchId || item.id |
|||
})) |
|||
}) |
|||
var countData = countResp && countResp.data ? countResp.data : {} |
|||
var countMap = {} |
|||
if (countData && countData.code === 0) { |
|||
this.extractListFromResp(countData).forEach(item => { |
|||
countMap[this.buildSchemeKey(item)] = item.count |
|||
}) |
|||
} |
|||
|
|||
var detailRespList = await Promise.all(summaryRows.map(item => { |
|||
return searchUserSettingRecording({ |
|||
menuId: item.menuId, |
|||
userId: userId, |
|||
itemNo: item.itemNo |
|||
}).catch(() => null) |
|||
})) |
|||
var detailMap = {} |
|||
detailRespList.forEach((resp, idx) => { |
|||
var key = this.buildSchemeKey(summaryRows[idx]) |
|||
var data = resp && resp.data ? resp.data : {} |
|||
detailMap[key] = data && data.code === 0 ? this.extractListFromResp(data) : [] |
|||
}) |
|||
|
|||
this.schemeList = summaryRows.map(item => { |
|||
var key = this.buildSchemeKey(item) |
|||
var menu = this.menuFlatList.find(m => String(m.menuId) === String(item.menuId)) |
|||
return Object.assign({}, item, { |
|||
schemeKey: key, |
|||
count: countMap[key] !== undefined ? countMap[key] : null, |
|||
menuName: item.menuName || (menu ? menu.name : ('菜单' + item.menuId)), |
|||
conditionPreviewList: this.buildConditionPreviewList(detailMap[key]) |
|||
}) |
|||
}) |
|||
} catch (e) { |
|||
this.schemeList = [] |
|||
} finally { |
|||
this.schemeLoading = false |
|||
} |
|||
}, |
|||
async gotoSchemeResult (row) { |
|||
this.routeResolvingKey = row.schemeKey |
|||
try { |
|||
var resp = await resolveSavedSchemeRoute({ |
|||
userId: String(this.$store.state.user.id), |
|||
menuId: row.menuId, |
|||
itemNo: row.itemNo, |
|||
savedSearchId: row.savedSearchId || row.id || '' |
|||
}) |
|||
var data = resp && resp.data ? resp.data : {} |
|||
if (!(data && data.code === 0)) { |
|||
this.$message.warning((data && data.msg) || '获取跳转信息失败') |
|||
return |
|||
} |
|||
var routeRows = this.extractListFromResp(data) |
|||
var routeRow = routeRows && routeRows.length ? routeRows[0] : {} |
|||
var query = { |
|||
savedSearchId: row.savedSearchId || row.id || '', |
|||
menuId: row.menuId || '', |
|||
itemNo: row.itemNo || '' |
|||
} |
|||
if (routeRow.routeName) { |
|||
this.$router.push({ name: routeRow.routeName, query: query }) |
|||
return |
|||
} |
|||
if (routeRow.routePath) { |
|||
this.$router.push({ path: routeRow.routePath, query: query }) |
|||
return |
|||
} |
|||
this.$message.warning('该方案暂不支持跳转') |
|||
} catch (e) { |
|||
this.$message.error('跳转失败') |
|||
} finally { |
|||
this.routeResolvingKey = '' |
|||
} |
|||
}, |
|||
openCreateDialog () { |
|||
this.dialogMode = 'create' |
|||
this.settingDialogVisible = true |
|||
this.newScheme() |
|||
}, |
|||
openEditDialog (row) { |
|||
this.dialogMode = 'edit' |
|||
this.settingDialogVisible = true |
|||
this.newScheme() |
|||
this.editForm.menuId = row.menuId |
|||
this.editForm.itemNo = row.itemNo |
|||
this.editForm.itemDesc = row.itemDesc |
|||
this.editForm.caseInsensitive = true |
|||
this.loadEditFields() |
|||
}, |
|||
newScheme () { |
|||
this.editForm = { |
|||
menuId: '', |
|||
itemNo: null, |
|||
itemDesc: '', |
|||
caseInsensitive: true |
|||
} |
|||
this.editFieldList = [] |
|||
this.editSelectedFieldNameSet = {} |
|||
if (this.$refs.editFieldTable) { |
|||
this.$refs.editFieldTable.clearSelection() |
|||
} |
|||
}, |
|||
handleEditMenuChange () { |
|||
if (this.dialogMode !== 'edit') { |
|||
this.editForm.itemNo = null |
|||
} |
|||
this.editFieldList = [] |
|||
this.editSelectedFieldNameSet = {} |
|||
if (this.$refs.editFieldTable) { |
|||
this.$refs.editFieldTable.clearSelection() |
|||
} |
|||
}, |
|||
async loadEditFields () { |
|||
if (!this.editForm.menuId) { |
|||
this.$message.warning('请先选择菜单') |
|||
return |
|||
} |
|||
this.editLoading = true |
|||
try { |
|||
var userId = String(this.$store.state.user.id) |
|||
var currentMenu = this.menuFlatList.find(item => String(item.menuId) === String(this.editForm.menuId)) |
|||
var list = resolveMenuSearchFieldsByMeta({ |
|||
menuId: this.editForm.menuId, |
|||
menuUrl: currentMenu ? currentMenu.url : '' |
|||
}) |
|||
|
|||
if (!list.length) { |
|||
var baseResp = await searchCenterMenuSearchFields({ |
|||
menuId: this.editForm.menuId, |
|||
userId: userId |
|||
}) |
|||
var baseData = baseResp && baseResp.data ? baseResp.data : {} |
|||
if (!(baseData && baseData.code === 0)) { |
|||
this.$message.warning((baseData && baseData.msg) || '读取菜单字段失败') |
|||
this.editFieldList = [] |
|||
return |
|||
} |
|||
list = this.extractListFromResp(baseData) |
|||
} |
|||
list = list.map((item, idx) => { |
|||
var normalizedItem = this.normalizeOriginalFieldForSql(item) |
|||
return Object.assign({}, normalizedItem, { |
|||
symbol: '', |
|||
formula: '', |
|||
sortBy: '', |
|||
orderSeq: idx + 1 |
|||
}) |
|||
}) |
|||
this.editFieldList = list |
|||
this.editSelectedFieldNameSet = {} |
|||
if (this.$refs.editFieldTable) { |
|||
this.$refs.editFieldTable.clearSelection() |
|||
} |
|||
if (this.editForm.itemNo) { |
|||
var detailResp = await searchUserSettingRecording({ |
|||
menuId: this.editForm.menuId, |
|||
userId: userId, |
|||
itemNo: this.editForm.itemNo |
|||
}) |
|||
var detailData = detailResp && detailResp.data ? detailResp.data : {} |
|||
if (detailData && detailData.code === 0) { |
|||
var detailList = this.extractListFromResp(detailData) |
|||
var detailMap = {} |
|||
detailList.forEach(item => { detailMap[item.fieldName] = item }) |
|||
var selectedMap = {} |
|||
this.editFieldList = this.editFieldList.map(item => { |
|||
var detail = detailMap[item.fieldName] |
|||
if (!detail) { |
|||
return item |
|||
} |
|||
selectedMap[item.fieldName] = true |
|||
return Object.assign({}, item, { |
|||
symbol: detail.symbol || '', |
|||
formula: detail.formula || '', |
|||
sortBy: detail.sortBy || '', |
|||
orderSeq: detail.orderSeq || item.orderSeq |
|||
}) |
|||
}) |
|||
this.editSelectedFieldNameSet = selectedMap |
|||
this.$nextTick(() => { |
|||
if (!this.$refs.editFieldTable) { |
|||
return |
|||
} |
|||
this.editFieldList.forEach(row => { |
|||
if (selectedMap[row.fieldName]) { |
|||
this.$refs.editFieldTable.toggleRowSelection(row, true) |
|||
} |
|||
}) |
|||
}) |
|||
} |
|||
} |
|||
} catch (e) { |
|||
this.$message.error('读取字段异常') |
|||
this.editFieldList = [] |
|||
} finally { |
|||
this.editLoading = false |
|||
} |
|||
}, |
|||
handleEditSelectionChange (list) { |
|||
var map = {} |
|||
list.forEach(item => { map[item.fieldName] = true }) |
|||
this.editSelectedFieldNameSet = map |
|||
}, |
|||
isEditRowSelected (row) { |
|||
return !!this.editSelectedFieldNameSet[row.fieldName] |
|||
}, |
|||
async saveScheme () { |
|||
if (!this.editForm.menuId) { |
|||
this.$message.warning('请先选择菜单') |
|||
return |
|||
} |
|||
if (!this.editForm.itemDesc || !this.editForm.itemDesc.trim()) { |
|||
this.$message.warning('请输入方案名称') |
|||
return |
|||
} |
|||
var selectedList = this.editFieldList.filter(item => this.isEditRowSelected(item)) |
|||
if (!selectedList.length) { |
|||
this.$message.warning('请至少勾选一个字段') |
|||
return |
|||
} |
|||
this.editSaving = true |
|||
try { |
|||
var userId = String(this.$store.state.user.id) |
|||
var payload = { |
|||
menuId: this.editForm.menuId, |
|||
userId: userId, |
|||
dtsName: 'ADOQResult', |
|||
itemNo: this.editForm.itemNo, |
|||
itemDesc: this.editForm.itemDesc.trim(), |
|||
caseSensitiveFlag: this.editForm.caseInsensitive ? 'N' : 'Y', |
|||
querySavedDetailList: selectedList.map(item => { |
|||
var normalizedItem = this.normalizeOriginalFieldForSql(item) |
|||
return Object.assign({}, normalizedItem, { |
|||
menuId: this.editForm.menuId, |
|||
userId: userId, |
|||
itemNo: this.editForm.itemNo, |
|||
itemDesc: this.editForm.itemDesc.trim(), |
|||
dtsName: item.dtsName || 'ADOQResult' |
|||
}) |
|||
}) |
|||
} |
|||
var resp = null |
|||
if (this.editForm.itemNo) { |
|||
resp = await updateQueryHeaderDetail(payload) |
|||
} else { |
|||
delete payload.itemNo |
|||
resp = await saveCenterScheme(payload) |
|||
} |
|||
var data = resp && resp.data ? resp.data : {} |
|||
if (data && data.code === 0) { |
|||
this.$message.success(data.msg || '保存成功') |
|||
await this.loadSavedSchemeList() |
|||
if (!this.editForm.itemNo) { |
|||
this.newScheme() |
|||
} |
|||
return |
|||
} |
|||
this.$message.warning((data && data.msg) || '保存失败') |
|||
} catch (e) { |
|||
this.$message.error('保存方案异常') |
|||
} finally { |
|||
this.editSaving = false |
|||
} |
|||
}, |
|||
async deleteScheme (row) { |
|||
if (!row || !row.itemNo) { |
|||
this.$message.warning('请选择需要删除的方案') |
|||
return |
|||
} |
|||
try { |
|||
await this.$confirm('确认删除该方案吗?', '提示', { |
|||
confirmButtonText: '确定', |
|||
cancelButtonText: '取消', |
|||
type: 'warning' |
|||
}) |
|||
} catch (e) { |
|||
return |
|||
} |
|||
this.deleting = true |
|||
this.deletingKey = row.schemeKey || '' |
|||
try { |
|||
var resp = await removeQueryHeaderDetail({ |
|||
menuId: row.menuId, |
|||
userId: String(this.$store.state.user.id), |
|||
itemNo: row.itemNo, |
|||
itemDesc: row.itemDesc |
|||
}) |
|||
var data = resp && resp.data ? resp.data : {} |
|||
if (data && data.code === 0) { |
|||
this.$message.success(data.msg || '删除成功') |
|||
await this.loadSavedSchemeList() |
|||
if (this.settingDialogVisible && |
|||
this.dialogMode === 'edit' && |
|||
String(this.editForm.menuId) === String(row.menuId) && |
|||
Number(this.editForm.itemNo) === Number(row.itemNo)) { |
|||
this.settingDialogVisible = false |
|||
this.newScheme() |
|||
} |
|||
return |
|||
} |
|||
this.$message.warning((data && data.msg) || '删除失败') |
|||
} catch (e) { |
|||
this.$message.error('删除方案异常') |
|||
} finally { |
|||
this.deleting = false |
|||
this.deletingKey = '' |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style> |
|||
.mod-home { |
|||
line-height: 1.5; |
|||
height: 91vh; |
|||
.mod-advanced-search-center { |
|||
padding: 12px; |
|||
} |
|||
|
|||
.board-table .cell { |
|||
line-height: 20px; |
|||
height: 20px; |
|||
} |
|||
|
|||
.page-header { |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: space-between; |
|||
margin-bottom: 12px; |
|||
} |
|||
|
|||
.title { |
|||
font-size: 18px; |
|||
font-weight: 600; |
|||
color: #303133; |
|||
} |
|||
|
|||
.card-grid { |
|||
display: grid; |
|||
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); |
|||
gap: 12px; |
|||
} |
|||
|
|||
.scheme-card { |
|||
position: relative; |
|||
border-radius: 10px; |
|||
border: 1px solid #ebeef5; |
|||
background: linear-gradient(160deg, #ffffff, #f7f9fc); |
|||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06); |
|||
padding: 12px; |
|||
cursor: pointer; |
|||
transition: all 0.2s ease; |
|||
} |
|||
|
|||
.scheme-card:hover { |
|||
transform: translateY(-2px); |
|||
box-shadow: 0 8px 18px rgba(0, 0, 0, 0.1); |
|||
} |
|||
|
|||
.count-badge { |
|||
position: absolute; |
|||
top: 8px; |
|||
right: 10px; |
|||
min-width: 28px; |
|||
padding: 2px 8px; |
|||
border-radius: 12px; |
|||
background: #1abc9c; |
|||
color: #fff; |
|||
font-size: 12px; |
|||
text-align: center; |
|||
} |
|||
|
|||
.scheme-title { |
|||
font-size: 15px; |
|||
font-weight: 600; |
|||
color: #303133; |
|||
margin-right: 48px; |
|||
margin-bottom: 6px; |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
.scheme-module { |
|||
font-size: 12px; |
|||
color: #909399; |
|||
margin-bottom: 8px; |
|||
} |
|||
|
|||
.condition-list { |
|||
min-height: 72px; |
|||
max-height: 84px; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
.condition-line { |
|||
font-size: 12px; |
|||
color: #606266; |
|||
line-height: 1.6; |
|||
white-space: nowrap; |
|||
text-overflow: ellipsis; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
.condition-empty { |
|||
font-size: 12px; |
|||
color: #c0c4cc; |
|||
line-height: 1.8; |
|||
} |
|||
|
|||
.card-footer { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
gap: 4px; |
|||
margin-top: 8px; |
|||
} |
|||
</style> |
|||
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue