<template>
|
<div class="app-container">
|
<!-- 页面功能说明,仅作为描述,不作为具体字段 -->
|
<el-form :model="filters" :inline="true">
|
<!-- 监控设备基础信息筛选 -->
|
<el-form-item label="监控设备名称">
|
<el-input
|
v-model="filters.deviceName"
|
style="width: 240px"
|
placeholder="请输入监控设备名称"
|
clearable
|
:prefix-icon="Search"
|
@change="getTableData"
|
/>
|
</el-form-item>
|
<!-- 温度监测字段(英文字段 deviceModel 不变) -->
|
<el-form-item label="温度监测参数">
|
<el-input
|
v-model="filters.deviceModel"
|
style="width: 240px"
|
placeholder="请输入温度相关监测参数"
|
clearable
|
:prefix-icon="Search"
|
@change="getTableData"
|
/>
|
</el-form-item>
|
<!-- 压力监测字段(英文字段 supplierName 不变) -->
|
<el-form-item label="压力监测参数">
|
<el-input
|
v-model="filters.supplierName"
|
style="width: 240px"
|
placeholder="请输入压力相关监测参数"
|
clearable
|
:prefix-icon="Search"
|
@change="getTableData"
|
/>
|
</el-form-item>
|
<!-- 能耗监测字段(英文字段 unit 不变) -->
|
<el-form-item label="能耗监测参数">
|
<el-input
|
v-model="filters.unit"
|
style="width: 240px"
|
placeholder="请输入能耗相关监测参数"
|
clearable
|
:prefix-icon="Search"
|
@change="getTableData"
|
/>
|
</el-form-item>
|
<el-form-item label="监控日期:">
|
<el-date-picker v-model="filters.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
|
placeholder="请选择" clearable @change="changeDaterange" />
|
</el-form-item>
|
<el-form-item>
|
<el-button type="primary" @click="getTableData">搜索</el-button>
|
<el-button @click="resetFilters">重置</el-button>
|
</el-form-item>
|
</el-form>
|
<div class="table_list">
|
<div class="actions">
|
<div></div>
|
<div>
|
<el-button type="primary" @click="add" icon="Plus"> 新增 </el-button>
|
<!-- <el-button @click="handleOut" icon="download">导出</el-button> -->
|
<el-button
|
type="danger"
|
icon="Delete"
|
:disabled="multipleList.length <= 0"
|
@click="deleteRow(multipleList.map((item) => item.id))"
|
>
|
批量删除
|
</el-button>
|
</div>
|
</div>
|
<PIMTable
|
rowKey="id"
|
isSelection
|
:column="columns"
|
:tableData="dataList"
|
:page="{
|
current: pagination.currentPage,
|
size: pagination.pageSize,
|
total: pagination.total,
|
}"
|
:isShowSummary="true"
|
:summaryMethod="summaryMethod"
|
@selection-change="handleSelectionChange"
|
@pagination="changePage"
|
>
|
</PIMTable>
|
</div>
|
<Modal ref="modalRef" @success="getTableData"></Modal>
|
<el-dialog v-model="qrDialogVisible" title="二维码" width="300px">
|
<div style="text-align:center;">
|
<img :src="qrCodeUrl" alt="二维码" style="width:200px;height:200px;" />
|
<div style="margin:10px 0;">
|
<el-button type="primary" @click="downloadQRCode">下载二维码图片</el-button>
|
</div>
|
</div>
|
</el-dialog>
|
</div>
|
</template>
|
|
<script setup>
|
import { usePaginationApi } from "@/hooks/usePaginationApi";
|
// import { Search } from "@element-plus/icons-vue";
|
import { getLedgerPage, delLedger } from "@/api/equipmentManagement/ledger";
|
import { onMounted, getCurrentInstance } from "vue";
|
import Modal from "./Modal.vue";
|
import { ElMessageBox, ElMessage } from "element-plus";
|
import dayjs from "dayjs";
|
import QRCode from "qrcode";
|
import { ref } from "vue";
|
import { summarizeTable } from "@/utils/summarizeTable";
|
import {Search} from "@element-plus/icons-vue";
|
|
defineOptions({
|
// 页面功能:设备远程监控
|
name: "设备远程监控",
|
});
|
|
// 表格多选框选中项
|
const multipleList = ref([]);
|
const { proxy } = getCurrentInstance();
|
const modalRef = ref();
|
const qrDialogVisible = ref(false);
|
const qrCodeUrl = ref("");
|
const qrRowData = ref(null);
|
|
const {
|
filters,
|
columns,
|
dataList,
|
pagination,
|
getTableData,
|
resetFilters,
|
onCurrentChange,
|
} = usePaginationApi(
|
getLedgerPage,
|
{
|
deviceName: undefined,
|
deviceModel: undefined,
|
supplierName: undefined,
|
unit: undefined,
|
entryDateStart: undefined,
|
entryDateEnd: undefined,
|
},
|
[
|
{
|
label: "监控设备名称",
|
align: "center",
|
prop: "deviceName",
|
},
|
{
|
// 使用 deviceModel 字段承载温度监测相关参数
|
label: "温度监测参数",
|
align: "center",
|
prop: "deviceModel",
|
},
|
{
|
// 使用 supplierName 字段承载压力监测相关参数
|
label: "压力监测参数",
|
align: "center",
|
prop: "supplierName",
|
},
|
{
|
// 使用 unit 字段承载能耗监测相关参数
|
label: "能耗监测参数",
|
align: "center",
|
prop: "unit",
|
},
|
{
|
label: "数量",
|
align: "center",
|
prop: "number",
|
},
|
{
|
// 使用 taxIncludingPriceUnit 字段承载监控阈值上限
|
label: "监控阈值上限",
|
align: "center",
|
prop: "taxIncludingPriceUnit",
|
},
|
{
|
// 使用 taxIncludingPriceTotal 字段承载监控阈值下限
|
label: "监控阈值下限",
|
align: "center",
|
prop: "taxIncludingPriceTotal",
|
},
|
{
|
// 使用 taxRate 字段呈现实时监测值/当前读数
|
label: "实时监测值",
|
align: "center",
|
prop: "taxRate",
|
},
|
{
|
// 使用 unTaxIncludingPriceTotal 字段承载累计能耗/监控统计值
|
label: "累计能耗",
|
align: "center",
|
prop: "unTaxIncludingPriceTotal",
|
},
|
{
|
label: "监控人",
|
align: "center",
|
prop: "createUser",
|
},
|
{
|
label: "监控日期",
|
align: "center",
|
prop: "createTime",
|
},
|
{
|
dataType: "action",
|
label: "操作",
|
align: "center",
|
fixed: 'right',
|
width: 140,
|
operation: [
|
{
|
name: "编辑",
|
type: "text",
|
clickFun: (row) => {
|
edit(row.id)
|
},
|
},
|
// {
|
// name: "生成二维码",
|
// type: "text",
|
// clickFun: (row) => {
|
// showQRCode(row)
|
// },
|
// },
|
],
|
},
|
]
|
);
|
|
// 多选后做什么
|
const handleSelectionChange = (selectionList) => {
|
multipleList.value = selectionList;
|
};
|
|
const add = () => {
|
modalRef.value.openModal();
|
};
|
const edit = (id) => {
|
modalRef.value.loadForm(id);
|
};
|
const changePage = ({ page, limit }) => {
|
pagination.currentPage = page;
|
pagination.pageSize = limit;
|
onCurrentChange(page);
|
};
|
|
// 合计方法
|
const summaryMethod = (param) => {
|
return summarizeTable(
|
param,
|
['number', 'taxIncludingPriceTotal', 'unTaxIncludingPriceTotal', 'taxIncludingPriceUnit'],
|
{
|
number: { noDecimal: true },
|
taxIncludingPriceTotal: { decimalPlaces: 2 },
|
unTaxIncludingPriceTotal: { decimalPlaces: 2 }
|
}
|
);
|
};
|
|
const deleteRow = (id) => {
|
ElMessageBox.confirm("此操作将永久删除该文件, 是否继续?", "提示", {
|
confirmButtonText: "确定",
|
cancelButtonText: "取消",
|
type: "warning",
|
}).then(async () => {
|
const { code } = await delLedger(id);
|
if (code == 200) {
|
ElMessage({
|
type: "success",
|
message: "删除成功",
|
});
|
getTableData();
|
}
|
});
|
};
|
|
const changeDaterange = (value) => {
|
if (value) {
|
filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
|
filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
|
} else {
|
filters.entryDateStart = undefined;
|
filters.entryDateEnd = undefined;
|
}
|
getTableData();
|
};
|
|
const handleOut = () => {
|
ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", {
|
confirmButtonText: "确认",
|
cancelButtonText: "取消",
|
type: "warning",
|
})
|
.then(() => {
|
// 导出文件名改为设备远程监控
|
proxy.download(`/device/ledger/export`, {}, "设备远程监控.xlsx");
|
})
|
.catch(() => {
|
proxy.$modal.msg("已取消");
|
});
|
};
|
|
const showQRCode = async (row) => {
|
// 你可以自定义二维码内容,比如 row.id 或 row.deviceName
|
const qrContent = JSON.stringify(row); // 或 `${row.id}`
|
qrCodeUrl.value = await QRCode.toDataURL(qrContent);
|
qrRowData.value = row;
|
qrDialogVisible.value = true;
|
};
|
|
const downloadQRCode = () => {
|
const a = document.createElement("a");
|
a.href = qrCodeUrl.value;
|
a.download = `${qrRowData.value.deviceName || "二维码"}.png`;
|
a.click();
|
};
|
|
onMounted(() => {
|
// filters.entryDate = [
|
// dayjs().format("YYYY-MM-DD"),
|
// dayjs().add(1, "day").format("YYYY-MM-DD"),
|
// ]
|
// filters.entryDateStart = dayjs().format("YYYY-MM-DD")
|
// filters.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD")
|
getTableData();
|
});
|
</script>
|
|
<style lang="scss" scoped>
|
.table_list {
|
margin-top: unset;
|
}
|
.actions {
|
display: flex;
|
justify-content: space-between;
|
margin-bottom: 10px;
|
}
|
|
.feature-desc {
|
margin-bottom: 16px;
|
padding: 10px 12px;
|
background: #f5f7fa;
|
border-radius: 4px;
|
color: #606266;
|
font-size: 13px;
|
}
|
</style>
|