物模型:查询切换模型时页码为1,查询添加名称编码参数

机构:查询切换模型时页码为1
单风机: 添加命令
控制:修改请求接口,修改调用方式
新增页面操作记录
This commit is contained in:
高云鹏 2024-11-01 16:39:32 +08:00
parent 5ee9802c4f
commit b52765db67
9 changed files with 396 additions and 65 deletions

View File

@ -1,17 +1,19 @@
import createAxios from '/@/utils/axios'
import { CommandReqType, CommandResType } from '/@/views/backend/equipment/airBlower/type'
export const sendValue146Req = (data: any) => {
return createAxios({
url: '/api/node/link/setPoint',
export const sendCommandReq = (data: CommandReqType) => {
return createAxios<never, Promise<CommandResType>>({
url: '/api/operation/command',
method: 'post',
data: data,
data: data
})
}
export const sendValue147Req = (data: any) => {
return createAxios({
url: '/api/node/link/command',
export const sendManualCommandReq = (data: CommandReqType) => {
return createAxios<never, Promise<CommandResType>>({
url: '/api/operation/manualCommand',
method: 'post',
data: data,
data: data
})
}
}

View File

@ -0,0 +1,9 @@
import createAxios from '/@/utils/axios'
import { OperatingReqType, ReturnType } from '/@/views/backend/operatingRecord/type'
export const getOperatingListReq = (data: OperatingReqType) => {
return createAxios<never, Promise<ReturnType>>({
url: '/api/operation/getEventLogList',
method: 'post',
data: data,
})
}

View File

@ -106,11 +106,19 @@
<el-tag class="control-tag" type="primary">{{ realTimeDataState }}</el-tag>
</div>
<div class="btnLeft">
<el-button v-if="realTimeData.iturbineoperationmode !== 16" class="control-btn" type="primary">启动</el-button>
<el-button v-else class="control-btn" type="primary">停机</el-button>
<el-button class="control-btn" type="primary">复位</el-button>
<el-button v-if="realTimeData.locked !== 1" class="control-btn" type="primary">锁定</el-button>
<el-button v-else class="control-btn" type="primary">解锁</el-button>
<el-button
@click="sendCommand('setTurbineFastStart')"
v-if="realTimeData.iturbineoperationmode !== 16"
class="control-btn"
type="primary"
>启动</el-button
>
<el-button @click="sendCommand('setTurbineStop')" v-else class="control-btn" type="primary">停机</el-button>
<el-button @click="sendCommand('setTurbineResetStatusCode')" class="control-btn" type="primary">复位</el-button>
<el-button @click="sendManualCommand(1)" v-if="realTimeData.locked !== 1" class="control-btn" type="primary"
>锁定</el-button
>
<el-button @click="sendManualCommand(0)" v-else class="control-btn" type="primary">解锁</el-button>
</div>
<el-tooltip content="变桨/轮毂系统">
<div @click="openSubSystem(1)" class="dot index-1"></div>
@ -206,7 +214,7 @@
</div>
<div class="summarize-panel-base">
<div>
<span class="content-number">{{ realTimeDataForSingle.windfarmmonthprodenergy }}</span>
<span class="content-number">{{ realTimeDataForSingle.monthprodenergy }}</span>
</div>
<div><span>万kWh</span></div>
<div><span>月发电量</span></div>
@ -220,7 +228,7 @@
</div>
<div class="summarize-panel-base">
<div>
<span class="content-number">{{ realTimeDataForSingle.windfarmyearprodenergy }}</span>
<span class="content-number">{{ realTimeDataForSingle.yearprodenergy }}</span>
</div>
<div><span>万kWh</span></div>
<div><span>年发电量</span></div>
@ -314,16 +322,15 @@ import { getModelAttributeListReq } from '/@/api/backend/deviceModel/request'
import { useRoute } from 'vue-router'
import Overview from './overview.vue'
import { TableInstance } from 'element-plus'
import { dayjs } from 'element-plus'
import { dayjs, ElMessage, ElMessageBox } from 'element-plus'
import { getRealTimeState, getCutDecimalsValue } from '/@/views/backend/equipment/airBlower/utils'
import { get } from 'sortablejs'
import { sendCommandReq, sendManualCommandReq } from '/@/api/backend/control/request'
const route = useRoute()
const d = new Date()
const { t } = useI18n()
let timer: any = null
let myTable = ref<TableInstance>()
const radioactiveName = ref('1')
const overviewData = reactive({
iul1_690v: '-',
@ -351,8 +358,8 @@ const realTimeDataForSingle = ref<any>({
ipitchangle: '',
iwindspeed: '-',
iwinddirection: '-',
windfarmmonthprodenergy: '-',
windfarmyearprodenergy: '-',
monthprodenergy: '-',
yearprodenergy: '-',
})
const state: {
@ -1039,11 +1046,15 @@ const createRealTimeData = async () => {
const modelList: any = await getModelList()
const realData: any = await getRealTimeData()
realTimeData.value.iturbineoperationmode = getRealTimeState(realData)
realTimeData.value.locked = realData.locked
temperatureChartsData[0].value = getCutDecimalsValue(realData.itempoutdoor_1sec)
temperatureChartsData[1].value = getCutDecimalsValue(realData.itempnacelle_1sec)
temperatureChartsData[2].value = getCutDecimalsValue(realData.itempoutdoor_1sec)
const ipitchangle = Math.min(realData.ipitchangle1, realData.ipitchangle2, realData.ipitchangle3)
realTimeDataForSingle.value.ipitchangle = ipitchangle / 1 === 0 ? ipitchangle : Math.floor(ipitchangle * 1000) / 1000
const overviewDatakeys: any = Object.keys(overviewData)
const sigleDataKeys: any = Object.keys(realTimeDataForSingle.value)
@ -1063,13 +1074,6 @@ const createRealTimeData = async () => {
if (sigleDataKeys.includes(item.attributeCode.toLowerCase())) {
realTimeDataForSingle.value[item.attributeCode.toLowerCase()] = val === '-' ? val : val
}
if (
item.attributeCode.toLowerCase() === 'ipitchangle1' ||
item.attributeCode.toLowerCase() === 'ipitchangle2' ||
item.attributeCode.toLowerCase() === 'ipitchangle3'
) {
realTimeDataForSingle.value.ipitchangle = Math.min(realTimeDataForSingle.value.ipitchangle, realVal)
}
if (overviewDatakeys.includes(item.attributeCode.toLowerCase())) {
overviewData[item.attributeCode.toLowerCase() as keyof typeof overviewData] = val === '-' ? val : val + item.unit
}
@ -1359,6 +1363,58 @@ const getAllChartData = (type: ('power' | 'trend' | 'frequency')[] = ['power', '
}
}
const sendCommand = (type: 'setTurbineFastStart' | 'setTurbineStop' | 'setTurbineResetStatusCode') => {
const sendTypeEnum = {
setTurbineFastStart: '风机快速启动指令',
setTurbineStop: '风机停机指令',
setTurbineResetStatusCode: '风机复位故障代码指令',
}
ElMessageBox.confirm('确认发送' + sendTypeEnum[type] + '吗?', '', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
const serviceName = sendTypeEnum[type]
const optDesc = serviceName + 1
sendCommandReq({
deviceId: route.query.irn as string,
serviceCode: type,
serviceName,
optDesc,
opValue: 1,
}).then((res) => {
if (res.code == 200) {
ElMessage.success('指令发送成功')
} else {
ElMessage.error('指令发送失败')
}
})
})
}
const sendManualCommand = (type: 1 | 0) => {
const serviceName = type === 0 ? '风机解锁' : '风机锁定'
ElMessageBox.confirm('确认' + serviceName + '吗?', '', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
sendManualCommandReq({
deviceId: route.query.irn as string,
serviceCode: 'Locked',
serviceName,
optDesc: serviceName + type,
opValue: type,
}).then((res) => {
if (res.code == 200) {
ElMessage.success('指令发送成功')
} else {
ElMessage.error('指令发送失败')
}
})
})
}
onMounted(() => {
getAllChartData()
createScroll()
@ -1504,6 +1560,7 @@ onUnmounted(() => {
.control-tag-left {
margin-left: 0;
border-radius: 8px 0 0 0;
background-color: #ff4949;
}
}
.btnLeft {

View File

@ -489,6 +489,11 @@ const modelContextMenu = (event: any, data: TreeNode) => {
const modelNodeClick = (target: TreeNode) => {
curContextMenuTreeData.value = JSON.parse(JSON.stringify(target))
initSortData()
modelAttributeAndServiceInputValue.value = ''
if (currentPage.value !== 1) {
currentPage.value = 1
return
}
if (ModelTabs.value === 'attribute') {
getAttributeList()
} else {
@ -632,8 +637,12 @@ const getAttributeList = ({
type?: radioGroupType
value?: string
} = {}) => {
const attributeName = modelAttributeSearchRadio.value === 'Name' ? modelAttributeAndServiceInputValue.value : undefined
const attributeCode = modelAttributeSearchRadio.value === 'Code' ? modelAttributeAndServiceInputValue.value : undefined
const requestData: GetModelAttributeType = {
iotModelId: curContextMenuTreeData.value!.id!,
attributeName,
attributeCode,
pageNum: currentPage.value,
pageSize: currentPageSize.value,
orderColumn: sortData.attributeOrderColumn,
@ -669,6 +678,7 @@ const getAttributeList = ({
} else {
if (res.rows && res.rows.length === 0) {
attributeTableData.value = []
pageTotal.value = res.total
} else {
ElMessage.error(res.msg)
}
@ -686,8 +696,12 @@ const getServiceList = ({
type?: radioGroupType
value?: string
} = {}) => {
const serviceName = modelAttributeSearchRadio.value === 'Name' ? modelAttributeAndServiceInputValue.value : undefined
const serviceCode = modelAttributeSearchRadio.value === 'Code' ? modelAttributeAndServiceInputValue.value : undefined
const requestData: GetModelServiceType = {
iotModelId: curContextMenuTreeData.value!.id!,
serviceName,
serviceCode,
pageNum: currentPage.value,
pageSize: currentPageSize.value,
orderColumn: sortData.serviceOrderColumn,
@ -711,6 +725,7 @@ const getServiceList = ({
} else {
if (res.rows && res.rows.length === 0) {
serviceTableData.value = []
pageTotal.value = res.total
} else {
ElMessage.error(res.msg)
}

View File

@ -576,6 +576,7 @@ const treeNodeClick = (nodeData: getTreeDataReturnType, node: Node) => {
originData.value = [...res]
})
}
currentPage.value = 1
clickTreeMenuData.value = nodeData
}

View File

@ -8,10 +8,10 @@ export type SelectTypeKeyUnionType = keyof SelectTypeObjType
export type TableDataObjType = {
irn:string
irn: string
name: string
model: string
iotModelId:string
iotModelId: string
iturbineoperationmode: number
belongLine: string
iwindspeed: string
@ -37,4 +37,18 @@ export type TableColumnType = {
align?: 'left' | 'right' | 'center'
custom?: 'header' | 'default'
type?: 'default' | 'selection' | 'index' | 'expand'
}
export type CommandReqType = {
deviceId: string | number,
serviceCode: string,
serviceName: string,
optDesc: string,
opValue: 0 | 1
}
export type CommandResType = {
code: number,
success: boolean,
msg: string
}

View File

@ -9,8 +9,8 @@
</el-col>
<el-col :span="10">
<div class="center">
<el-form-item label="服务名" prop="serviceName">
<el-select v-model="serviceType147Form.serviceName" placeholder="请选择服务名">
<el-form-item label="服务名" prop="serviceCode">
<el-select v-model="serviceType147Form.serviceCode" placeholder="请选择服务名">
<el-option
v-for="item in deviceServiceType147List"
:key="item.value"
@ -42,8 +42,8 @@
</el-col>
<el-col :span="10">
<div class="center">
<el-form-item label="服务名" prop="serviceName">
<el-select v-model="serviceType146Form.serviceName" placeholder="请选择服务名">
<el-form-item label="服务名" prop="serviceCode">
<el-select v-model="serviceType146Form.serviceCode" placeholder="请选择服务名">
<el-option
v-for="item in deviceServiceType146List"
:key="item.value"
@ -71,7 +71,7 @@
<script setup lang="ts">
import { ref, watch } from 'vue'
import { sendValue146Req, sendValue147Req } from '/@/api/backend/control/request'
import { sendCommandReq } from '/@/api/backend/control/request'
import { ElMessage, FormInstance } from 'element-plus'
import { getModelServiceListReq } from '/@/api/backend/deviceModel/request'
@ -96,14 +96,14 @@ const serviceType147Ref = ref<FormInstance>()
const serviceType146Ref = ref<FormInstance>()
const serviceType147Form = ref({
//
serviceName: '',
serviceCode: '',
//
opValue: null,
})
const serviceType146Form = ref({
//
serviceName: '',
serviceCode: '',
//
opValue: null,
})
@ -128,7 +128,7 @@ const init = () => {
}
const validData147 = {
serviceName: [
serviceCode: [
{
required: true,
message: '请输入服务名',
@ -145,7 +145,7 @@ const validData147 = {
}
const validData146 = {
serviceName: [
serviceCode: [
{
required: true,
message: '请输入服务名',
@ -171,43 +171,29 @@ const submit = (type: number) => {
serviceType147Ref.value?.validate((valid) => {
if (valid) {
loading.value = true
sendValue147(serviceType147Form.value)
sendValue(serviceType147Form.value as unknown as { serviceCode: string; opValue: number }, type)
}
})
} else if (type === 146) {
serviceType146Ref.value?.validate((valid) => {
if (valid) {
loading.value = true
sendValue146(serviceType146Form.value)
sendValue(serviceType146Form.value as unknown as { serviceCode: string; opValue: number }, type)
}
})
}
}
const sendValue146 = (data: any) => {
const sendValue = (data: { serviceCode: string; opValue: number }, type: 146 | 147) => {
const val = JSON.parse(JSON.stringify(data))
val.deviceId = props.deviceId
console.log(val, 146)
sendValue146Req(val)
.then((res) => {
console.log(res)
ElMessage.success('发送成功!')
})
.catch((err) => {
ElMessage.error('发送失败!')
})
.finally(() => {
loading.value = false
})
}
const sendValue147 = (data: any) => {
const val = JSON.parse(JSON.stringify(data))
val.deviceId = props.deviceId
console.log(val, 147)
sendValue147Req(val)
val.serviceName =
type === 146
? deviceServiceType146List.value.find((item) => item.value === val.serviceCode)?.label
: deviceServiceType147List.value.find((item) => item.value === val.serviceCode)?.label
val.optDesc = val.serviceName + val.opValue
sendCommandReq(val)
.then((res) => {
console.log(res)
ElMessage.success('发送成功!')
@ -239,11 +225,11 @@ watch(
(newVal) => {
if (newVal) {
serviceType147Form.value = {
serviceName: '',
serviceCode: '',
opValue: null,
}
serviceType146Form.value = {
serviceName: '',
serviceCode: '',
opValue: null,
}
serviceType147Ref.value?.resetFields()

View File

@ -0,0 +1,215 @@
<template>
<div class="operatingRecord">
<el-container class="container">
<el-header class="header">
<div class="headerPart headerPartLeft">
<span>时间</span>
<el-date-picker
v-model="datePickerValue"
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
format="YYYY-MM-DD HH:mm:ss"
date-format="YYYY/MM/DD"
time-format="HH:mm:ss"
:shortcuts="shortcuts"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
></el-date-picker>
</div>
<div class="headerPart headerPartRight">
<span>风机编号</span>
<el-select v-model="windTurbinesCode">
<el-option v-for="item in attributeCodeList" :key="item.value" :value="item.value"></el-option>
</el-select>
</div>
<el-button @click="search" :icon="Search" type="primary" class="headerBtn">查询</el-button>
</el-header>
<el-main class="main">
<el-table :data="tableData" max-height="clac(100%-120px)">
<el-table-column
v-for="item in tableColumn"
:key="item.prop"
:prop="item.prop"
:label="item.label"
align="center"
></el-table-column>
</el-table>
</el-main>
<el-footer>
<div class="footerPart">
<el-pagination
v-model:current-page="pageSetting.current"
v-model:page-size="pageSetting.pageSize"
:total="pageSetting.total"
:page-sizes="pageSetting.pageSizes"
background
:pager-count="7"
layout="total,prev, pager, next, jumper,sizes"
@change="changePageSetting"
></el-pagination>
</div>
</el-footer>
</el-container>
</div>
</template>
<script setup lang="ts">
import { Search } from '@element-plus/icons-vue'
import { ref, reactive } from 'vue'
import { dayjs, ElMessage } from 'element-plus'
import { getOperatingListReq } from '/@/api/backend/operatingRecord/request'
import type { OperatingReqType, OperatingResType } from '/@/views/backend/operatingRecord/type'
import { getAirBlowerListReq } from '/@/api/backend/airBlower/request'
const datePickerValue = ref('')
const shortcuts = [
{
text: '今天',
value: () => {
const start = dayjs().startOf('day').toDate()
const end = dayjs().endOf('day').toDate()
return [start, end]
},
},
{
text: '昨天',
value: () => {
const start = dayjs().subtract(1, 'day').startOf('day').toDate()
const end = dayjs().subtract(1, 'day').endOf('day').toDate()
return [start, end]
},
},
{
text: '前三天',
value: () => {
const start = dayjs().subtract(4, 'day').startOf('day').toDate()
const end = dayjs().subtract(1, 'day').endOf('day').toDate()
return [start, end]
},
},
]
const windTurbinesCode = ref('')
const attributeCodeList = ref<{ value: string }[]>([])
const tableData = ref<OperatingResType[]>([])
const tableColumn = [
{
label: '时间',
prop: 'optTime',
},
{
label: '设备编号',
prop: 'name',
},
{
label: '操作类型',
prop: 'attributeName',
},
{
label: '操作详情',
prop: 'optDesc',
},
{
label: '操作员',
prop: 'userName',
},
]
const pageSetting = reactive({
current: 1,
pageSize: 20,
total: 0,
pageSizes: [20, 50, 100],
})
const changePageSetting = () => {
search()
}
const getList = (data: OperatingReqType) => {
getOperatingListReq(data).then((res) => {
if (res.success) {
const data = res.data
tableData.value = data.rows
pageSetting.total = data.total
ElMessage.success('查询成功!')
}
})
}
const search = () => {
getList({
startTime: datePickerValue.value?.[0] ? dayjs(datePickerValue.value[0]).format('YYYY-MM-DD HH:mm:ss') : undefined,
endTime: datePickerValue.value?.[1] ? dayjs(datePickerValue.value[1]).format('YYYY-MM-DD HH:mm:ss') : undefined,
windTurbinesCode: windTurbinesCode.value,
pageNum: pageSetting.current,
pageSize: pageSetting.pageSize,
})
}
const getAirBlowerList = () => {
getAirBlowerListReq().then((res: any) => {
if (res.success) {
attributeCodeList.value = res.data.map((item: any) => {
return {
value: item.name,
}
})
}
})
}
getAirBlowerList()
</script>
<style lang="scss" scoped>
.operatingRecord {
width: 100%;
height: 100%;
.container {
width: 100%;
height: 100%;
.header {
display: flex;
align-items: center;
.headerPart {
display: flex;
align-items: center;
span {
display: flex;
margin-right: 10px;
}
}
.headerPartLeft {
:deep(.el-date-editor) {
width: 400px;
height: 40px;
}
}
.headerPartRight {
margin-left: 30px;
width: 286px;
span {
width: 73px;
}
:deep(.el-select__wrapper) {
width: 220px;
height: 40px;
}
}
.headerBtn {
margin-left: auto;
width: 100px;
height: 40px;
}
}
.main {
height: calc(100% - 120px);
}
.footerPart {
display: flex;
justify-content: right;
}
}
}
</style>

View File

@ -0,0 +1,32 @@
export type ReturnType = {
code: number
data: {
total: number
rows: OperatingResType[]
code: number
msg: string
}
msg: string
success: boolean
}
export type OperatingReqType = {
startTime?: string,
endTime?: string,
windTurbinesCode?: string,
userName?: string,
pageNum: number,
pageSize: number
}
export type OperatingResType = {
id: string,
userName: string,
optTime: string,
deviceId: number,
attributeCode: string,
attributeName: string,
name:string
optDesc: string
}