2025-06-20 10:22:54 +08:00
|
|
|
|
<template>
|
|
|
|
|
<div class="p-2">
|
|
|
|
|
<!--查询区域-->
|
|
|
|
|
<div class="jeecg-basic-table-form-container">
|
|
|
|
|
<a-form ref="formRef" @keyup.enter.native="reload" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
|
|
|
<a-row :gutter="24">
|
|
|
|
|
<a-col :lg="6">
|
|
|
|
|
<a-form-item name="address">
|
2025-06-30 10:14:24 +08:00
|
|
|
|
<template #label><span title="SN">SN</span></template>
|
2025-06-30 14:54:10 +08:00
|
|
|
|
<j-input placeholder="请输入SN" v-model:value="queryParam.address" allow-clear ></j-input>
|
2025-06-30 10:14:24 +08:00
|
|
|
|
</a-form-item>
|
|
|
|
|
</a-col>
|
|
|
|
|
<a-col :lg="6">
|
|
|
|
|
<a-form-item name="nuId">
|
|
|
|
|
<template #label><span title="护理单元">护理单元</span></template>
|
2025-06-30 14:54:10 +08:00
|
|
|
|
<j-dict-select-tag type='list' v-model:value="queryParam.nuId" :dictCode="`nu_base_info,nu_name,nu_id`" placeholder="请选护理单元" allow-clear />
|
2025-06-20 10:22:54 +08:00
|
|
|
|
</a-form-item>
|
|
|
|
|
</a-col>
|
|
|
|
|
<a-col :xl="6" :lg="7" :md="8" :sm="24">
|
|
|
|
|
<a-button type="primary" preIcon="ant-design:search-outlined" @click="reload">查询</a-button>
|
|
|
|
|
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
|
|
|
|
|
</a-col>
|
|
|
|
|
</a-row>
|
|
|
|
|
</a-form>
|
|
|
|
|
</div>
|
|
|
|
|
<a-row>
|
|
|
|
|
<a-col v-for="(item,index) in tableData.records" :key="index" :xs="24" :sm="24" :md="12" :lg="12" :xl="8" :xxl="6" style="padding: 8px;">
|
2025-06-30 10:14:24 +08:00
|
|
|
|
<a-card style="width: 100%;border-radius: 8px;" :headStyle="{ height: '60px', padding: '0 24px' }" :bodyStyle="{ padding: '24px 24px 4px 24px' }">
|
|
|
|
|
<template #title>
|
|
|
|
|
<a-row style="font-weight: normal;">
|
|
|
|
|
<a-col :span="18" style="font-size: 14px;">
|
|
|
|
|
<div>SN:<span style="font-weight: bold;">{{item.address}}</span></div>
|
|
|
|
|
<div style="font-size: 12px;">抄表时间:{{item.readTime?item.readTime:'未抄表'}}</div>
|
2025-06-20 10:22:54 +08:00
|
|
|
|
</a-col>
|
2025-06-30 10:14:24 +08:00
|
|
|
|
<a-col :span="6" style="text-align: center;padding-top: 4px;">
|
|
|
|
|
<div :class="item.relayState=='1'?'zxClass':'lxClass'">{{item.relayState=='1'?'在线':'离线'}}</div>
|
2025-06-20 10:22:54 +08:00
|
|
|
|
</a-col>
|
|
|
|
|
</a-row>
|
|
|
|
|
</template>
|
2025-06-30 10:14:24 +08:00
|
|
|
|
<a-row>
|
2025-06-30 14:54:10 +08:00
|
|
|
|
<a-col :span="12" style="margin-top: -10px;">{{item.nuId_dictText?item.nuId_dictText:'未配置'}}</a-col>
|
2025-06-30 10:14:24 +08:00
|
|
|
|
<a-col :span="12" style="text-align: right;margin-top: -10px;">
|
|
|
|
|
<span style="text-align: right;background:#f6f6f6;padding: 2px 10px;border-radius:5px;">NUID: {{item.nuId?item.nuId:'未配置'}}</span>
|
|
|
|
|
</a-col>
|
|
|
|
|
<a-col :span="14" style="text-align: right;font-size: 44px;font-weight: bold;margin-top:18px;">
|
|
|
|
|
<span>{{item.eleValue?item.eleValue:'0.00'}}</span>
|
|
|
|
|
</a-col>
|
|
|
|
|
<a-col :span="8" style="padding: 12px 0 0 5px;margin-top:18px;">
|
|
|
|
|
<div style="font-size: 12px;margin: 5px 0 -5px 2px;padding:2px;">KWH</div>
|
|
|
|
|
<div style="margin-top:-3px;"><span style="background:#eeeeee;padding: 2px;border-radius:5px;font-size:11px;">用电量</span></div>
|
|
|
|
|
</a-col>
|
|
|
|
|
</a-row>
|
2025-06-20 10:22:54 +08:00
|
|
|
|
<a-divider />
|
|
|
|
|
<p style="text-align:center;">
|
2025-07-01 10:20:38 +08:00
|
|
|
|
<span style="display:inline-block;cursor: pointer;" @click="handleRead(item)">
|
2025-06-30 10:14:24 +08:00
|
|
|
|
<span class="tbClass"><img src="../../../../assets/iot/a1.png" style="width:20px;" /></span><br/>
|
|
|
|
|
<span class="antTitle">抄表</span>
|
|
|
|
|
</span>
|
2025-07-01 10:20:38 +08:00
|
|
|
|
<span style="display:inline-block;margin-left:10%;cursor: pointer;" @click="handleControlLz(item)">
|
2025-06-30 10:14:24 +08:00
|
|
|
|
<span class="tbClass"><img src="../../../../assets/iot/a5.png" style="width:20px;" /></span><br/>
|
|
|
|
|
<span class="antTitle">拉闸</span>
|
|
|
|
|
</span>
|
2025-07-01 10:20:38 +08:00
|
|
|
|
<span style="display:inline-block;margin-left:10%;cursor: pointer;" @click="handleControlHz(item)">
|
2025-06-30 10:14:24 +08:00
|
|
|
|
<span class="tbClass"><img src="../../../../assets/iot/a2.png" style="width:20px;" /></span><br/>
|
|
|
|
|
<span class="antTitle">合闸</span>
|
|
|
|
|
</span>
|
2025-07-01 10:20:38 +08:00
|
|
|
|
<span style="display:inline-block;margin-left:10%;cursor: pointer;" @click="handleReset(item)">
|
2025-06-30 10:14:24 +08:00
|
|
|
|
<span class="tbClass"><img src="../../../../assets/iot/a3.png" style="width:20px;" /></span><br/>
|
|
|
|
|
<span class="antTitle">清零</span>
|
|
|
|
|
</span>
|
2025-07-01 10:20:38 +08:00
|
|
|
|
<span style="display:inline-block;margin-left:10%;cursor: pointer;" @click="showApiLog(item)">
|
2025-06-30 10:14:24 +08:00
|
|
|
|
<span class="tbClass"><img src="../../../../assets/iot/a4.png" style="width:20px;" /></span><br/>
|
|
|
|
|
<span class="antTitle">日志</span>
|
|
|
|
|
</span>
|
2025-06-20 10:22:54 +08:00
|
|
|
|
</p>
|
|
|
|
|
</a-card>
|
|
|
|
|
</a-col>
|
2025-06-30 10:14:24 +08:00
|
|
|
|
<a-col v-if="tableData.total==0" >
|
|
|
|
|
<div style="margin: 30px auto;">
|
|
|
|
|
<a-empty />
|
|
|
|
|
</div>
|
|
|
|
|
</a-col>
|
2025-06-20 10:22:54 +08:00
|
|
|
|
</a-row>
|
2025-06-30 10:14:24 +08:00
|
|
|
|
<div v-if="tableData.total > 0"
|
2025-06-20 10:22:54 +08:00
|
|
|
|
style="float:right;bottom: 20px;z-index: 999;padding: 8px 16px;border-radius: 4px;display: flex;align-items: center;">
|
|
|
|
|
<span style="margin-right: 10px;">共 {{ tableData.total }} 条数据</span>
|
|
|
|
|
<Pagination showLessItems v-model:current="pageParams.pageNo" :pageSize="pageParams.pageSize" size="small"
|
|
|
|
|
show-quick-jumper :total="tableData.total" @change="reload" />
|
|
|
|
|
</div>
|
|
|
|
|
<!--引用表格-->
|
|
|
|
|
<ApiLogModal ref="apiLogModal"></ApiLogModal>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script lang="ts" name="iot-nuIotRegionInfo" setup>
|
|
|
|
|
import {reactive, ref,h,onMounted} from 'vue';
|
|
|
|
|
import { defHttp } from '/@/utils/http/axios';
|
|
|
|
|
import { Statistic } from 'ant-design-vue';
|
|
|
|
|
import {Modal} from "ant-design-vue";
|
|
|
|
|
import {list, eleReset, eleControl, eleRead } from './electricity.api';
|
|
|
|
|
import { Pagination } from 'ant-design-vue';
|
2025-06-30 10:14:24 +08:00
|
|
|
|
import { JInput } from '/@/components/Form';
|
|
|
|
|
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
|
2025-06-20 10:22:54 +08:00
|
|
|
|
|
|
|
|
|
import ApiLogModal from "@/views/iot/tq/electricity/apilog/ApiLogModal.vue";
|
|
|
|
|
import { set } from 'lodash-es';
|
|
|
|
|
|
|
|
|
|
const formRef = ref();
|
|
|
|
|
const queryParam = reactive<any>({});
|
|
|
|
|
const apiLogModal = ref();
|
|
|
|
|
const tableData = ref<any>([]);
|
|
|
|
|
const pageParams = ref({ pageNo: 1, pageSize: 8 })
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const labelCol = reactive({
|
|
|
|
|
xs:24,
|
|
|
|
|
sm:4,
|
|
|
|
|
xl:6,
|
|
|
|
|
xxl:4
|
|
|
|
|
});
|
|
|
|
|
const wrapperCol = reactive({
|
|
|
|
|
xs: 24,
|
|
|
|
|
sm: 20,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 重置
|
|
|
|
|
*/
|
|
|
|
|
function searchReset() {
|
|
|
|
|
formRef.value.resetFields();
|
|
|
|
|
//刷新数据
|
|
|
|
|
reload();
|
|
|
|
|
}
|
|
|
|
|
// 抄电表
|
|
|
|
|
async function handleRead(record) {
|
|
|
|
|
const params = {
|
|
|
|
|
'cid' : record.cid,
|
|
|
|
|
'address' : record.address,
|
|
|
|
|
};
|
|
|
|
|
await eleRead(params);
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
reload();
|
|
|
|
|
}, 4000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 电表拉闸
|
|
|
|
|
async function handleControlLz(record) {
|
|
|
|
|
if(record.relayState == '0'){
|
|
|
|
|
Modal.info({
|
|
|
|
|
title: '拉闸',
|
|
|
|
|
content: h('div', {}, [
|
|
|
|
|
h('p', '此电表已拉闸!'),
|
|
|
|
|
]),
|
|
|
|
|
onOk() {},
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const params = {
|
|
|
|
|
'cid' : record.cid,
|
|
|
|
|
'address' : record.address,
|
|
|
|
|
'type' : '10',
|
|
|
|
|
};
|
|
|
|
|
await eleControl(params);
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
reload();
|
|
|
|
|
}, 4000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 电表合闸
|
|
|
|
|
async function handleControlHz(record) {
|
|
|
|
|
if(record.relayState == '1'){
|
|
|
|
|
Modal.info({
|
|
|
|
|
title: '合闸',
|
|
|
|
|
content: h('div', {}, [
|
|
|
|
|
h('p', '此电表已合闸!'),
|
|
|
|
|
]),
|
|
|
|
|
onOk() {},
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const params = {
|
|
|
|
|
'cid' : record.cid,
|
|
|
|
|
'address' : record.address,
|
|
|
|
|
'type' : '11',
|
|
|
|
|
};
|
|
|
|
|
await eleControl(params);
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
reload();
|
|
|
|
|
}, 4000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 电表清零
|
|
|
|
|
async function handleReset(record) {
|
|
|
|
|
const params = {
|
|
|
|
|
'cid' : record.cid,
|
|
|
|
|
'address' : record.address,
|
|
|
|
|
};
|
|
|
|
|
await eleReset(params);
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
reload();
|
|
|
|
|
}, 4000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查看api日志
|
|
|
|
|
*/
|
|
|
|
|
function showApiLog(record){
|
|
|
|
|
console.log(record);
|
|
|
|
|
apiLogModal.value.disableSubmit = true;
|
|
|
|
|
apiLogModal.value.showApiLog(record);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function reload(){
|
|
|
|
|
queryParam.pageSize = pageParams.value.pageSize;
|
|
|
|
|
queryParam.pageNo = pageParams.value.pageNo;
|
|
|
|
|
defHttp.get({url: '/iot/tq/electricityMeter/list',params:queryParam}).then(res => {
|
|
|
|
|
console.log("🚀 ~ defHttp.get ~ res:", res)
|
|
|
|
|
tableData.value = res;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 自动请求并暴露内部方法
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
reload();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
<style lang="less" scoped>
|
|
|
|
|
.cardTitle{
|
|
|
|
|
background: #1ea0fa;
|
|
|
|
|
width: 100%;
|
|
|
|
|
margin: -28px -24px;
|
|
|
|
|
padding-top: 15px;
|
|
|
|
|
border-radius: 5px 5px 0px 0px;
|
|
|
|
|
color: white;
|
|
|
|
|
height: 55px;
|
|
|
|
|
display: block;
|
|
|
|
|
position: absolute;
|
|
|
|
|
}
|
2025-06-30 10:14:24 +08:00
|
|
|
|
.zxClass{
|
|
|
|
|
font-size:14px;
|
|
|
|
|
background: linear-gradient(to right, #1ea0fa, #017de9);
|
|
|
|
|
border-radius: 8px;
|
|
|
|
|
height: 35px;
|
|
|
|
|
color: white;
|
|
|
|
|
line-height: 35px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.lxClass{
|
|
|
|
|
font-size:14px;
|
|
|
|
|
background: linear-gradient(to right, #cccccc, #cccccc);
|
|
|
|
|
border-radius: 8px;
|
|
|
|
|
height: 35px;
|
|
|
|
|
color: white;
|
|
|
|
|
line-height: 35px;
|
|
|
|
|
}
|
|
|
|
|
.tbClass{
|
|
|
|
|
background: #f6f6f6;
|
|
|
|
|
padding: 8px;
|
|
|
|
|
border-radius: 5px;
|
|
|
|
|
}
|
|
|
|
|
.antTitle{
|
|
|
|
|
margin-top: 10px;
|
|
|
|
|
display: block;
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
}
|
2025-06-20 10:22:54 +08:00
|
|
|
|
</style>
|