Files
guoxue-admin/src/views/apps/equipment/index/index.vue
T
南宁网宿科技 13bed2bafb Initial commit
2023-06-03 23:57:39 +08:00

378 lines
10 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>
<div class="page">
<a-page-header :ghost="false" title="设备管理">
<div class="ele-text-secondary"> 设备管理,云芯威电池管理定制模块。 </div>
</a-page-header>
<div class="ele-body">
<a-card :bordered="false">
<!-- 表格 -->
<ele-pro-table
ref="tableRef"
row-key="equipmentId"
:columns="columns"
:height="tableHeight"
:datasource="datasource"
v-model:selection="selection"
:scroll="{ x: 3000 }"
>
<template #toolbar>
<search
:selection="selection"
@search="reload"
@add="openEdit"
@remove="removeBatch"
/>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'image'">
<a-image :src="record.image" :width="40" />
</template>
<template v-if="column.key === 'equipmentCode'">
<span>{{ record.equipmentCode }}</span>
</template>
<template v-if="column.key === 'equipmentName'">
{{ record.equipmentName }}
</template>
<template v-if="column.key === 'merchantName'">
<div style="display: flex; flex-direction: column">
<span>{{ record.merchantName }}</span>
<span class="ele-text-placeholder">
商户编号:{{ record.merchantCode }}
</span>
</div>
</template>
<template v-if="column.key === 'user'">
<User v-if="record.user" :record="record.user" />
</template>
<template v-if="column.key === 'qrcode'">
<a-image :src="record.qrcode" :width="50" />
</template>
<template v-if="column.key === 'batteryPrice'">
<strong class="ele-text-danger">
¥{{ record.batteryPrice }}
</strong>
</template>
<template v-if="column.key === 'batteryRent'">
<strong class="ele-text-danger">
¥{{ record.batteryRent }}/月
</strong>
</template>
<template v-if="column.key === 'batteryDeposit'">
<strong class="ele-text-danger">
¥{{ record.batteryDeposit }}
</strong>
</template>
<template v-if="column.key === 'batteryInsurance'">
<strong class="ele-text-danger">
¥{{ record.batteryInsurance }}
</strong>
</template>
<template v-if="column.key === 'isOnline'">
<a-tag v-if="record.status === 0" color="green">正常</a-tag>
<a-tag v-if="record.status === 1" color="orange">异常</a-tag>
</template>
<template v-if="column.key === 'comments'">
<a-tooltip :title="record.comments" placement="topLeft">
{{ record.comments }}
</a-tooltip>
</template>
<template v-if="column.key === 'userId'">
<a-tag v-if="record.userId === 0" color="orange">未绑定</a-tag>
<a-tag v-else color="green">已绑定</a-tag>
</template>
<template v-if="column.key === 'createTime'">
<a-tooltip :title="`${toDateString(record.createTime)}`">
{{ timeAgo(record.createTime) }}
</a-tooltip>
</template>
<template v-if="column.key === 'action'">
<a-space>
<a-button @click="openEdit(record)">修改</a-button>
<!-- <a-divider type="vertical" />-->
<!-- <a-popconfirm-->
<!-- title="确定要删除此记录吗?"-->
<!-- @confirm="remove(record)"-->
<!-- >-->
<!-- <a class="ele-text-danger">删除</a>-->
<!-- </a-popconfirm>-->
</a-space>
</template>
</template>
</ele-pro-table>
</a-card>
<!-- 编辑弹窗 -->
<equipment-edit
v-model:visible="showEdit"
:data="current"
@done="reload"
/>
</div>
</div>
</template>
<!--suppress TypeScriptValidateTypes -->
<script lang="ts" setup>
import { timeAgo } from 'ele-admin-pro';
import { createVNode, computed, ref } from 'vue';
import { message, Modal } from 'ant-design-vue';
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import type { EleProTable } from 'ele-admin-pro';
import type {
DatasourceFunction,
ColumnItem
} from 'ele-admin-pro/es/ele-pro-table/types';
import { toDateString } from 'ele-admin-pro';
import Search from './components/search.vue';
import EquipmentEdit from './components/equipment-edit.vue';
import { pageEquipment, removeBatchEquipment } from '@/api/apps/equipment';
import type { Equipment, EquipmentParam } from '@/api/apps/equipment/model';
// import { Category } from '@/api/goods/category/model';
// import { getDictionaryOptions } from '@/utils/common';
// import { useUserStore } from '@/store/modules/user';
// 表格实例
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
// 当前用户信息
// const brand = getDictionaryOptions('serverBrand');
// 表格列配置
const columns = ref<ColumnItem[]>([
{
key: 'index',
width: 48,
align: 'center',
fixed: 'left',
hideInSetting: true,
customRender: ({ index }) => index + (tableRef.value?.tableIndex ?? 0)
},
{
title: '操作',
key: 'action',
width: 90,
fixed: 'left',
align: 'center',
hideInSetting: true
},
{
title: '二维码',
dataIndex: 'qrcode',
key: 'qrcode',
fixed: 'left',
align: 'center',
width: 80
},
{
title: '设备编号',
dataIndex: 'equipmentCode',
key: 'equipmentCode'
},
{
title: '所属商户',
dataIndex: 'merchantName',
key: 'merchantName',
sorter: true,
width: 220,
ellipsis: true
},
{
title: '用户信息',
dataIndex: 'user',
key: 'user'
},
{
title: '设备名称',
dataIndex: 'equipmentName',
key: 'equipmentName'
},
{
title: '激活状态',
dataIndex: 'isCtive',
sorter: true
},
{
title: '在线状态',
dataIndex: 'isOnline',
sorter: true,
ellipsis: true
},
{
title: '电池型号',
dataIndex: 'batteryModel',
sorter: true,
ellipsis: true
},
{
title: 'BMS',
dataIndex: 'bms',
ellipsis: true
},
{
title: '工作状态',
dataIndex: 'workingStatus',
sorter: true,
ellipsis: true
},
{
title: '租赁状态',
dataIndex: 'leaseStatus',
sorter: true,
key: 'leaseStatus'
},
{
title: '电池状态',
dataIndex: 'batteryStatus',
sorter: true,
key: 'batteryStatus',
showSorterTooltip: false,
customRender: ({ text }) => ['上架', '下架'][text]
},
{
title: '电池电量',
dataIndex: 'batteryPower',
sorter: true,
key: 'batteryPower'
},
{
title: '排序',
dataIndex: 'sortNumber',
sorter: true
},
{
title: '创建时间',
dataIndex: 'createTime',
key: 'createTime',
sorter: true,
ellipsis: true,
hideInTable: true,
customRender: ({ text }) => toDateString(text)
},
{
title: '绑定状态',
dataIndex: 'userId',
key: 'userId',
fixed: 'right',
width: 100,
align: 'center',
sorter: true
}
]);
// 表格选中数据
const selection = ref<Equipment[]>([]);
// 当前编辑数据
const current = ref<Equipment | null>(null);
// 是否显示编辑弹窗
const showEdit = ref(false);
// 树形数据
// const data = ref<Category[]>([]);
// 表格数据源
const datasource: DatasourceFunction = ({
page,
limit,
where,
orders,
filters
}) => {
// if (filters) {
// where.brand = filters.brand;
// }
return pageEquipment({ ...where, ...orders, ...filters, page, limit });
};
/* 搜索 */
const reload = (where?: EquipmentParam) => {
selection.value = [];
tableRef?.value?.reload({ where: where });
};
// 搜索是否展开
const searchExpand = ref(false);
// 表格固定高度
const fixedHeight = ref(false);
// 表格高度
const tableHeight = computed(() => {
return fixedHeight.value
? searchExpand.value
? 'calc(100vh - 618px)'
: 'calc(100vh - 562px)'
: void 0;
});
/* 打开编辑弹窗 */
const openEdit = (row?: Equipment) => {
current.value = row ?? null;
showEdit.value = true;
};
/* 打开用户详情弹窗 */
// const openInfo = (row?: Equipment) => {
// current.value = row ?? null;
// showEdit.value = true;
// };
/* 删除单个 */
// const remove = (row: Equipment) => {
// const hide = message.loading('请求中..', 0);
// removeEquipment(row.equipmentId)
// .then((msg) => {
// hide();
// message.success(msg);
// reload();
// })
// .catch((e) => {
// hide();
// message.error(e.message);
// });
// };
/* 批量删除 */
const removeBatch = () => {
if (!selection.value.length) {
message.error('请至少选择一条数据');
return;
}
Modal.confirm({
title: '提示',
content: '确定要删除选中的记录吗?',
icon: createVNode(ExclamationCircleOutlined),
maskClosable: true,
onOk: () => {
const hide = message.loading('请求中..', 0);
removeBatchEquipment(selection.value.map((d) => d.equipmentId))
.then((msg) => {
hide();
message.success(msg);
reload();
})
.catch((e) => {
hide();
message.error(e.message);
});
}
});
};
</script>
<script lang="ts">
export default {
name: 'EquipmentIndex'
};
</script>
<style lang="less" scoped>
// 文字超出隐藏(两行)
// 需要设置文字容器的宽度
.twoline-hide {
width: 320px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
white-space: normal;
}
</style>