This commit is contained in:
邱贞招 2025-01-07 23:03:14 +08:00
parent c5e6b793b7
commit 7cbf1940e9
4 changed files with 220 additions and 270 deletions

View File

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询设施列表
export function listEquipment(query) {
return request({
url: '/system/hallEqu/list',
url: '/system/room/list',
method: 'get',
params: query
})

View File

@ -620,7 +620,9 @@ export default {
},
getList() {
this.loading = true;
this.queryParams.storeId = this.storeId;
if(this.storeId && this.storeId != 0){
this.queryParams.storeId = this.storeId;
}
listDevice(this.queryParams).then(response => {
this.deviceList = response.rows;
this.total = response.total;

View File

@ -1,80 +1,44 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="设施名称" prop="name">
<el-form-item label="设施名" prop="roomName">
<el-input
v-model="queryParams.name"
placeholder="请输入设施名"
v-model="queryParams.roomName"
placeholder="请输入设施名"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="sn" prop="sn">
<el-input
v-model="queryParams.sn"
placeholder="请输入sn"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="设施类型" prop="type">
<el-select v-model="queryParams.type" placeholder="请选择设施类型" clearable @change="handleQuery">
<el-form-item label="店铺" prop="storeId" v-if="!storeId">
<el-select v-model="queryParams.storeId" clearable filterable placeholder="请选择">
<el-option
v-for="dict in filteredEquipmentTypes"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="店铺名" prop="storeName" v-if="!storeId">
<el-input
v-model="queryParams.storeName"
placeholder="请输入店铺名"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="开锁方式" prop="unlockMode">
<el-select v-model="queryParams.unlockMode" placeholder="请选择开锁方式" clearable @change="handleQuery">
<el-option
v-for="dict in dict.type.ss_unlock_mode"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="开锁条件" prop="unlockCondition">
<el-select v-model="queryParams.unlockCondition" placeholder="请选择开锁条件" clearable @change="handleQuery">
<el-option
v-for="dict in dict.type.ss_unlock_condition"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="设施状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择设施状态" clearable @change="handleQuery">
<el-option
v-for="dict in dict.type.ss_equipment_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-select v-model="queryParams.tags" placeholder="请选择标签" clearable @change="handleQuery">
<el-option
v-for="dict in dict.type.ss_room_tags"
v-for="item in storeOptions"
:key="item.storeId"
:label="item.name"
:value="item.storeId"
/>
</el-select>
</el-form-item>
<el-form-item label="类型" prop="equType">
<el-select v-model="queryParams.equType" placeholder="请选择类型" clearable style="width: 240px">
<el-option
v-for="dict in dict.type.ss_hall_equ_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<!-- <el-form-item label="状态" prop="status">-->
<!-- <el-select v-model="queryParams.status" placeholder="请选择状态" clearable @change="handleQuery">-->
<!-- <el-option-->
<!-- v-for="dict in dict.type.ss_room_status"-->
<!-- :key="dict.value"-->
<!-- :label="dict.label"-->
<!-- :value="dict.value"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@ -89,7 +53,7 @@
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:equipment:add']"
v-hasPermi="['system:room:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
@ -100,7 +64,7 @@
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:equipment:edit']"
v-hasPermi="['system:room:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
@ -111,7 +75,7 @@
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:equipment:remove']"
v-hasPermi="['system:room:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
@ -121,77 +85,55 @@
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:equipment:export']"
v-hasPermi="['system:room:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="equipmentList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="onSortChange">
<el-table v-loading="loading" :data="roomList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="onSortChange">
<el-table-column type="selection" width="55" align="center" />
<template v-for="column of showColumns">
<el-table-column
:key="column.key"
:label="column.label"
:prop="column.key"
:align="column.align"
:min-width="column.minWidth"
:sort-orders="orderSorts"
:sortable="column.sortable"
:show-overflow-tooltip="column.overflow"
:width="column.width"
:key="column.key"
:label="column.label"
:prop="column.key"
:align="column.align"
:min-width="column.minWidth"
:sort-orders="orderSorts"
:sortable="column.sortable"
:show-overflow-tooltip="column.overflow"
:width="column.width"
>
<template slot-scope="d">
<template v-if="column.key === 'equipmentId'">
<template v-if="column.key === 'roomId'">
{{d.row[column.key]}}
</template>
<template v-else-if="column.key === 'type'">
<dict-tag :options="dict.type.ss_equipment_type" :value="d.row[column.key]"/>
<template v-else-if="column.key === 'roomName'">
<router-link :to="`/system/room/detail/${d.row[column.key]}`">{{d.row[column.key]}}</router-link>
</template>
<template v-else-if="column.key === 'unlockMode'">
<dict-tag :options="dict.type.ss_unlock_mode" :value="d.row[column.key]"/>
<template v-else-if="column.key === 'equType'">
<dict-tag :options="dict.type.ss_hall_equ_type" :value="d.row[column.key]"/>
</template>
<template v-else-if="column.key === 'unlockCondition'">
<dict-tag :options="dict.type.ss_unlock_condition" :value="d.row[column.key]"/>
</template>
<template v-else-if="column.key === 'status'">
<dict-tag :options="dict.type.ss_equipment_status" :value="d.row[column.key]"/>
<template v-else-if="column.key === 'tags'">
<dict-tag :options="dict.type.ss_room_tags" :value="d.row[column.key]"/>
</template>
<template v-else-if="column.key === 'picture'">
<image-preview :src="d.row[column.key]" :width="50" :height="50"/>
</template>
<template v-else-if="column.key === 'unlockTime'">
{{ formatUnlockTime(d.row[column.key]) }}
<template v-else-if="column.key === 'status'">
<dict-tag :options="dict.type.ss_room_status" :value="d.row[column.key]"/>
</template>
<template v-else-if="column.key === 'ruleIds'">
{{ formatFeeRules(d.row.feeRuleVOS) }}
<template v-else-if="column.key === 'feeRules'">
<el-tooltip placement="top" :content="getFeeRulesExplain(d.row[column.key])">
<span>{{ getFeeRulesExplain(d.row[column.key]) }}</span>
</el-tooltip>
</template>
<template v-else-if="column.key === 'sn'">
<el-link
type="primary"
@click="handleSnClick(d.row.device ? d.row.device.deviceId : '')"
>
{{ d.row.device ? d.row.device.sn : '-' }}
</el-link>
</template>
<template v-else-if="column.key === 'address'">
<el-link
type="primary"
@click="handleAddressClick(d.row.lng, d.row.lat)"
v-if="d.row.lng && d.row.lat"
>
{{ d.row.address || '-' }}
</el-link>
<span v-else>{{ d.row.address || '-' }}</span>
</template>
<template v-else-if="column.key === 'tags'">
<template v-if="d.row[column.key]">
<dict-tag
:options="dict.type.ss_room_tags"
:value="d.row[column.key]"
/>
</template>
<span v-else>-</span>
<router-link :to="`/system/deviceDetail/index/${d.row.deviceId}`" class="link-type" v-if="d.row.deviceId">
<span>{{ d.row[column.key] }}</span>
</router-link>
<span v-else>{{ d.row[column.key] }}</span>
</template>
<template v-else>
{{d.row[column.key]}}
@ -201,26 +143,19 @@
</template>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleView(scope.row)"
v-hasPermi="['system:equipment:query']"
>详情</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:equipment:edit']"
v-hasPermi="['system:room:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:equipment:remove']"
v-hasPermi="['system:room:remove']"
>删除</el-button>
</template>
</el-table-column>
@ -237,66 +172,39 @@
<!-- 添加或修改设施对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="设施名称" prop="name">
<el-input v-model="form.name" placeholder="请输入设施名" />
<el-form-item label="设施名" prop="roomName">
<el-input v-model="form.roomName" placeholder="请输入设施名" />
</el-form-item>
<el-form-item label="设施图片" prop="picture">
<el-input v-model="form.picture" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="sn" prop="deviceId">
<el-input v-model="form.deviceId" placeholder="请输入sn" />
</el-form-item>
<el-form-item label="设施类型" prop="type">
<el-select v-model="form.type" placeholder="请选择设施类型">
<el-form-item label="店铺" prop="storeId">
<el-select v-model="form.storeId" clearable filterable placeholder="请选择">
<el-option
v-for="dict in filteredEquipmentTypes"
v-for="item in storeOptions"
:key="item.storeId"
:label="item.name"
:value="item.storeId"
/>
</el-select>
</el-form-item>
<el-form-item label="类型" prop="type">
<el-select v-model="form.type" placeholder="请选择类型">
<el-option
v-for="dict in dict.type.ss_room_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="店铺名" prop="storeName">
<el-input v-model="form.storeName" placeholder="请输入店铺名" />
</el-form-item>
<el-form-item label="套餐" prop="ruleIds">
<el-input v-model="form.ruleIds" placeholder="请输入套餐" />
</el-form-item>
<el-form-item label="开锁方式" prop="unlockMode">
<el-select v-model="form.unlockMode" placeholder="请选择开锁方式">
<el-option
v-for="dict in dict.type.ss_unlock_mode"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="开锁条件" prop="unlockCondition">
<el-select v-model="form.unlockCondition" placeholder="请选择开锁条件">
<el-option
v-for="dict in dict.type.ss_unlock_condition"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="开锁时长" prop="unlockTime">
<el-input v-model="form.unlockTime" placeholder="请输入开锁时长" />
</el-form-item>
<el-form-item label="设施状态" prop="status">
<el-select v-model="form.status" placeholder="请选择设施状态">
<el-option
v-for="dict in dict.type.ss_equipment_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
<el-form-item label="图片" prop="picture">
<image-upload v-model="form.picture"/>
</el-form-item>
<el-form-item label="标签" prop="tags">
<el-select v-model="form.tags" placeholder="请选择标签">
<el-select
v-model="form.tags"
placeholder="请选择标签"
clearable
multiple
style="width: auto; min-width: 240px">
<el-option
v-for="dict in dict.type.ss_room_tags"
:key="dict.value"
@ -305,6 +213,7 @@
/>
</el-select>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
@ -315,8 +224,9 @@
</template>
<script>
import { listEquipment, getEquipment, delEquipment, addEquipment, updateEquipment } from "@/api/system/equipment";
import { listRoom, getRoom, delRoom, addRoom, updateRoom } from "@/api/system/room";
import { $showColumns } from '@/utils/mixins';
import {listStore} from "../../../api/system/store";
//
const defaultSort = {
@ -325,26 +235,23 @@ const defaultSort = {
}
export default {
name: "Equipment",
name: "Room",
mixins: [$showColumns],
dicts: ['ss_equipment_type', 'ss_unlock_mode', 'ss_unlock_condition', 'ss_equipment_status', 'ss_room_tags'],
dicts: ['ss_hall_equ_type', 'ss_room_status','ss_room_tags'],
props: ['storeId'],
data() {
return {
//
columns: [
{key: 'equipmentId', visible: true, label: '设施id', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'name', visible: true, label: '设施名称', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'picture', visible: true, label: '设施图片', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'sn', visible: true, label: 'sn', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'type', visible: true, label: '设施类型', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'storeName', visible: true, label: '店铺名', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'ruleIds', visible: true, label: '套餐', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'unlockMode', visible: true, label: '开锁方式', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'unlockCondition', visible: true, label: '开锁条件', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'unlockTime', visible: true, label: '开锁时长', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'status', visible: true, label: '设施状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'roomId', visible: true, label: '设施id', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'roomName', visible: true, label: '设施名', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'sn', visible: true, label: 'SN', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'storeName', visible: true, label: '店铺', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'picture', visible: true, label: '图片', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'equType', visible: true, label: '类型', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'feeRules', visible: true, label: '套餐', minWidth: null, sortable: false, overflow: true, align: 'center', width: null},
{key: 'tags', visible: true, label: '标签', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'status', visible: true, label: '状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
],
//
orderSorts: ['ascending', 'descending', null],
@ -352,6 +259,7 @@ export default {
loading: true,
//
ids: [],
storeOptions: [],
//
single: true,
//
@ -361,7 +269,7 @@ export default {
//
total: 0,
//
equipmentList: [],
roomList: [],
//
title: "",
//
@ -373,37 +281,46 @@ export default {
pageSize: 20,
orderByColumn: defaultSort.prop,
isAsc: defaultSort.order,
name: null,
picture: null,
roomId: null,
deviceId: null,
type: null,
storeId: null,
roomName: null,
storeName: null,
ruleIds: null,
unlockMode: null,
unlockCondition: null,
unlockTime: null,
storeId: null,
type: undefined,
type2: "2",
equType: undefined,
picture: null,
tags: [],
specification: null,
status: null,
tags: null,
merchantId: null
},
//
form: {},
//
rules: {
roomName: [
{ required: true, message: "设施名不能为空", trigger: "blur" }
],
storeId: [
{ required: true, message: "店铺不能为空", trigger: "blur" }
],
type: [
{ required: true, message: "类型不能为空", trigger: "blur" }
],
tags: [
{ required: true, message: "标签不能为空", trigger: "change" }
]
],
}
};
},
created() {
//
console.log('设备标签字典:', this.dict.type.ss_equipment_tags);
this.getList();
this.getStoreOptions();
},
methods: {
getStoreOptions() {
listStore({pageNum:1,pageSize:999 }).then(response => {
this.storeOptions = response.rows;
});
},
/** 当排序按钮被点击时触发 **/
onSortChange(column) {
if (column.order == null) {
@ -418,15 +335,12 @@ export default {
/** 查询设施列表 */
getList() {
this.loading = true;
this.queryParams.storeId = this.storeId;
listEquipment(this.queryParams).then(response => {
this.equipmentList = response.rows
.filter(item => ['2', '3'].includes(item.type))
.map(item => ({
...item,
tags: item.tags || undefined
}));
this.total = this.equipmentList.length;
if(this.storeId){
this.queryParams.storeId = this.storeId;
}
listRoom(this.queryParams).then(response => {
this.roomList = response.rows;
this.total = response.total;
this.loading = false;
});
},
@ -438,31 +352,34 @@ export default {
//
reset() {
this.form = {
equipmentId: undefined,
equipmentName: undefined,
storeId: undefined,
roomId: undefined,
roomName: undefined,
storeId: undefined,
type: undefined,
picture: undefined,
tags: undefined,
specification: undefined,
status: "0"
tags: [],
specification: undefined
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
if (Array.isArray(this.queryParams.tags) && this.queryParams.tags.length > 0) {
this.queryParams.tags = this.queryParams.tags.join(',');
}
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.queryParams.type = undefined;
this.queryParams.tags = [];
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.equipmentId)
this.ids = selection.map(item => item.roomId)
this.single = selection.length!==1
this.multiple = !selection.length
},
@ -475,8 +392,8 @@ export default {
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const equipmentId = row.equipmentId || this.ids
getEquipment(equipmentId).then(response => {
const roomId = row.roomId || this.ids
getRoom(roomId).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改设施";
@ -486,14 +403,14 @@ export default {
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.equipmentId != null) {
updateEquipment(this.form).then(response => {
if (this.form.roomId != null) {
updateRoom(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addEquipment(this.form).then(response => {
addRoom(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
@ -504,9 +421,9 @@ export default {
},
/** 删除按钮操作 */
handleDelete(row) {
const equipmentIds = row.equipmentId || this.ids;
this.$modal.confirm('是否确认删除设施编号为"' + equipmentIds + '"的数据项?').then(function() {
return delEquipment(equipmentIds);
const roomIds = row.roomId || this.ids;
this.$modal.confirm('是否确认删除设施编号为"' + roomIds + '"的数据项?').then(function() {
return delRoom(roomIds);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
@ -514,50 +431,81 @@ export default {
},
/** 导出按钮操作 */
handleExport() {
this.download('system/equipment/export', {
this.download('system/room/export', {
...this.queryParams
}, `equipment_${new Date().getTime()}.xlsx`)
}, `room_${new Date().getTime()}.xlsx`)
},
//
formatFeeRules(feeRuleVOS) {
if (!feeRuleVOS || !feeRuleVOS.length) {
/** 获取套餐说明文字 */
getFeeRulesExplain(feeRules) {
if (!feeRules || !Array.isArray(feeRules)) {
return '-';
}
return feeRuleVOS.map(rule => rule.explain).join('');
return feeRules.map(rule => rule.explain).filter(Boolean).join('');
},
//
formatUnlockTime(time) {
if (time === null || time === undefined) {
return '-';
}
return time === 0 ? '立即' : time + 's';
},
// sn
handleSnClick(deviceId) {
if (!deviceId) return;
this.$router.push({
path: `/system/deviceDetail/index/${deviceId}`
});
},
//
handleAddressClick(lng, lat) {
if (!lng || !lat) return;
window.open(`https://uri.amap.com/marker?position=${lng},${lat}&callnative=1`);
},
/** 查看详情按钮操作 */
handleView(row) {
if (row.equipmentId) {
this.$router.push({
path: `/system/equipment/detail/${row.equipmentId}`
});
}
},
},
computed: {
//
filteredEquipmentTypes() {
return this.dict.type.ss_equipment_type.filter(item => ['2', '3'].includes(item.value));
}
}
};
</script>
<style lang="scss" scoped>
.el-select {
:deep(.el-select__tags) {
flex-wrap: wrap;
//
.el-tag {
margin: 2px;
//
max-width: none;
}
}
//
:deep(.el-input__inner) {
height: auto;
min-height: 32px;
padding-top: 4px;
padding-bottom: 4px;
}
}
//
.el-select-dropdown__item {
padding: 0 10px;
height: 32px;
line-height: 32px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
//
.el-form-item {
margin-bottom: 18px;
//
.el-select {
width: auto;
min-width: 240px;
max-width: 100%;
}
}
.el-table {
:deep(.el-tooltip__trigger) {
display: inline-block;
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.link-type {
color: #11A983;
text-decoration: underline;
&:hover {
color: #11A98330;
text-decoration: underline;
}
}
</style>

View File

@ -240,9 +240,9 @@ export default {
return {
//
columns: [
{key: 'storeName', visible: true, label: '店铺', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'roomId', visible: true, label: '房间id', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'roomName', visible: true, label: '房间名', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'storeName', visible: true, label: '店铺', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'picture', visible: true, label: '图片', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'type', visible: true, label: '类型', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'feeRules', visible: true, label: '套餐', minWidth: null, sortable: false, overflow: true, align: 'center', width: null},