This commit is contained in:
zhouhuang 2024-12-11 16:31:05 +08:00
commit 655361ccae
7 changed files with 178 additions and 57 deletions

View File

@ -341,6 +341,23 @@ const currentDayStatus = ref({
})
const deviceCode = ref([])
const FanList = ref([])
const getRealTimeState = (data: any) => {
if (data.iturbineoperationmode) {
if (data.iturbineoperationmode > 1 && data.iturbineoperationmode < 6) {
return 2
}
if (data.iturbineoperationmode === 21) {
return 20
}
return data.iturbineoperationmode
} else if (data.iyplevel === 10) {
return 1110
} else if (data.gridlostdetected === 1) {
return 1111
} else if (data.ibplevel === 200) {
return 1112
}
}
const StatusListData = () => {
getWindTurbineMatrixData().then((res) => {
if (res.code == 200) {
@ -437,6 +454,7 @@ const StatusListData = () => {
igenpower: item.attributeMap.igenpower,
ikwhthisday: item.attributeMap.ikwhthisday,
iturbineoperationmode: state,
processedoperationmode: state,
locked: item.attributeMap.locked,
irotorspeed: item.attributeMap.irotorspeed,
},

View File

@ -12,24 +12,24 @@
<img :class="item.standard == true ? '' : 'wind-picture'" src="~assets/dashboard/biaogan.png" alt="" />
</span>
<span class="fanlist-name"> {{ item.name }}</span>
<el-tag v-if="item.attributeMap.iturbineoperationmode === 20" class="tag-panel is-primary" type="primary">并网</el-tag>
<el-tag v-if="item.attributeMap.iturbineoperationmode === 11" class="tag-panel is-warning" type="primary">待机</el-tag>
<el-tag v-if="item.attributeMap.iturbineoperationmode === 16" class="tag-panel is-success" type="primary">启动</el-tag>
<el-tag v-if="item.attributeMap.iturbineoperationmode === 10" class="tag-panel is-maintenance" type="primary"
<el-tag v-if="item.attributeMap.processedoperationmode === 20" class="tag-panel is-primary" type="primary">并网</el-tag>
<el-tag v-if="item.attributeMap.processedoperationmode === 11" class="tag-panel is-warning" type="primary">待机</el-tag>
<el-tag v-if="item.attributeMap.processedoperationmode === 16" class="tag-panel is-success" type="primary">启动</el-tag>
<el-tag v-if="item.attributeMap.processedoperationmode === 10" class="tag-panel is-maintenance" type="primary"
>维护</el-tag
>
<el-tag v-if="item.attributeMap.iturbineoperationmode === 0" class="tag-panel is-offline" type="primary">离线</el-tag>
<el-tag v-if="item.attributeMap.iturbineoperationmode === 8" class="tag-panel info" type="primary">限功率运行</el-tag>
<el-tag v-if="item.attributeMap.iturbineoperationmode === 6" class="tag-panel is-danger" type="primary">正常停机</el-tag>
<el-tag v-if="item.attributeMap.iturbineoperationmode === 1" class="tag-panel is-danger" type="primary"
<el-tag v-if="item.attributeMap.processedoperationmode === 0" class="tag-panel is-offline" type="primary">离线</el-tag>
<el-tag v-if="item.attributeMap.processedoperationmode === 8" class="tag-panel info" type="primary">限功率运行</el-tag>
<el-tag v-if="item.attributeMap.processedoperationmode === 6" class="tag-panel is-danger" type="primary">正常停机</el-tag>
<el-tag v-if="item.attributeMap.processedoperationmode === 1" class="tag-panel is-danger" type="primary"
>外部因素导致停机</el-tag
>
<el-tag v-if="item.attributeMap.iturbineoperationmode === 2" class="tag-panel is-danger" type="primary">停机</el-tag>
<el-tag v-if="item.attributeMap.iturbineoperationmode === 1110" class="tag-panel is-info" type="primary">解缆状态</el-tag>
<el-tag v-if="item.attributeMap.iturbineoperationmode === 1111" class="tag-panel is-danger" type="primary"
<el-tag v-if="item.attributeMap.processedoperationmode === 2" class="tag-panel is-danger" type="primary">停机</el-tag>
<el-tag v-if="item.attributeMap.processedoperationmode === 1110" class="tag-panel is-info" type="primary">解缆状态</el-tag>
<el-tag v-if="item.attributeMap.processedoperationmode === 1111" class="tag-panel is-danger" type="primary"
>电网故障停机</el-tag
>
<el-tag v-if="item.attributeMap.iturbineoperationmode === 1112" class="tag-panel is-danger" type="primary"
<el-tag v-if="item.attributeMap.processedoperationmode === 1112" class="tag-panel is-danger" type="primary"
>安全链停机</el-tag
>
</div>
@ -82,7 +82,7 @@
class="control-btn"
type="primary"
@click="sendCommand('setTurbineFastStart')"
v-if="realTimeData.iturbineoperationmode !== 16"
v-if="realTimeData.processedoperationmode !== 16"
>启动</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>
@ -160,7 +160,7 @@ const contextMenuPos = ref({
y: 0,
})
const realTimeData = ref<any>({
iturbineoperationmode: 1111,
processedoperationmode: 1111,
locked: 0,
deviceId: '',
name:''
@ -168,7 +168,7 @@ const realTimeData = ref<any>({
const windContextMenu = (event: any,curnodeData) => {
contextMenuPos.value.x = event.pageX
contextMenuPos.value.y = event.pageY
realTimeData.value.iturbineoperationmode=curnodeData.attributeMap.iturbineoperationmode
realTimeData.value.processedoperationmode=curnodeData.attributeMap.processedoperationmode
realTimeData.value.locked=curnodeData.attributeMap.locked
realTimeData.value.deviceId=curnodeData.irn
realTimeData.value.name=curnodeData.name

View File

@ -29,12 +29,12 @@
<span>日期</span>
<el-date-picker
v-model="searchData.date"
type="monthrange"
type="daterange"
unlink-panels
start-placeholder="开始时间"
end-placeholder="结束时间"
format="YYYY-MM"
date-format="YYYY/MM"
format="YYYY-MM-DD"
date-format="YYYY/MM/DD"
:shortcuts="shortcuts"
@change="getListForAirBlower"
></el-date-picker>
@ -273,7 +273,7 @@ const getTreeDataList = () => {
const searchData = reactive<{ fileName: ''; date: Date[] }>({
fileName: '',
date: [dayjs().toDate(), dayjs().toDate()],
date: [dayjs().startOf('month').toDate(), dayjs().toDate()],
})
const shortcuts = [
{
@ -287,15 +287,15 @@ const shortcuts = [
{
text: '上月',
value: () => {
const start = dayjs().subtract(1, 'month').toDate()
const end = dayjs().subtract(1, 'month').toDate()
const start = dayjs().subtract(1, 'month').startOf('month').toDate()
const end = dayjs().subtract(1, 'month').endOf('month').toDate()
return [start, end]
},
},
{
text: '近三月',
value: () => {
const start = dayjs().subtract(2, 'month').toDate()
const start = dayjs().subtract(2, 'month').startOf('month').toDate()
const end = dayjs().toDate()
return [start, end]
},
@ -325,8 +325,8 @@ const changePageSetting = () => {}
const getListForAirBlower = () => {
const data = {
deviceCode: curTreeData.value.code,
startTime: dayjs(searchData.date[0]).format('YYYY-MM'),
endTime: dayjs(searchData.date[1]).format('YYYY-MM'),
startTime: dayjs(searchData.date[0]).format('YYYY-MM-DD'),
endTime: dayjs(searchData.date[1]).format('YYYY-MM-DD'),
}
if (activeName.value === 'malFunction') {

View File

@ -99,8 +99,10 @@
<el-table-column fixed="right" label="操作" min-width="80" align="center">
<template #default="scope">
<div class="tableOperate">
<template v-if="scope.row.protocol !== 79">
<a @click="openlinkPoint(scope.row)">测点</a>
<a>|</a>
</template>
<a @click="editLinkList(scope.row)">编辑</a>
<a>|</a>
<el-popconfirm title="确定删除么?" @confirm="delLinkList(scope.row)">
@ -383,8 +385,8 @@ const getNodeList = () => {
originTreeData = res.data!
clickTreeData.value = res.data![0]
nextTick(() => {
nodeTreeRef.value?.setCurrentKey(route.query?.treeKey as string ?? res.data![0].id)
getLinkData(route.query?.treeKey as string ?? res.data![0].id!)
nodeTreeRef.value?.setCurrentKey((route.query?.treeKey as string) ?? res.data![0].id)
getLinkData((route.query?.treeKey as string) ?? res.data![0].id!)
})
} else {
ElMessage.error(res.msg ?? '查询失败')
@ -504,7 +506,7 @@ const paginationOptions = reactive({
pageSizes: [20, 50, 100],
})
const changePage = ()=>{
const changePage = () => {
getLinkData(clickTreeData.value!.id!)
}
@ -534,7 +536,7 @@ const protocolList = [
{ label: 'MODBUSTCP从 *', value: 17 },
{ label: 'MODBUS', value: 80 },
{ label: 'ADS', value: 81 },
{ label: '故障日志', value: 79 },
]
const protocolPartVisible = ref(false)
@ -566,7 +568,7 @@ const openlinkPoint = (data: linkType) => {
protocol: data.protocol,
id: data.id,
prevPath: route.path,
treeKey:clickTreeData.value?.id
treeKey: clickTreeData.value?.id,
},
})
}

View File

@ -1126,6 +1126,59 @@ const formColumnList: formColumnType[] = [
otherOption: [],
},
},
{
protocol: 79,
label: '故障日志',
cardTitle:['参数设置'],
params: {
netWorkOption: [
{
key: 'rootDir',
data: {
label: 'FTP路径',
type: 'input',
value: '',
singleRow: true,
},
},
{
key: 'ftpUser',
data: {
label: 'FTP账号',
type: 'input',
value: '',
},
},
{
key: 'ftpPassword',
data: {
label: 'FTP密码',
type: 'password',
value: '',
},
},
{
key: 'ftpHost',
data: {
label: 'FTP地址',
type: 'input',
value: '',
},
},
{
key: 'deviceCode',
data: {
label: '风机编码',
type: 'input',
value: '',
},
},
],
timeOutOption: [],
otherOption: [],
},
},
]
const currentFormColumn = computed(() => {
const data = formColumnList.find((item) => item.protocol === props.protocol)!

View File

@ -110,6 +110,8 @@ export type otherOptionType = {
parity?: number
stop?: number
timeout?: number
ftpHost?: string | number
deviceCode?: string | number
}
export type protocolFormType = netWorkOptionType & timeOutOptionType & otherOptionType
@ -130,7 +132,7 @@ type paramsType = {
export type formColumnType = {
protocol: number
label: string
cardTitle: ['网络设置', '超时设置']
cardTitle: ['网络设置', '超时设置'] | ['参数设置']
params: {
netWorkOption: paramsType[]
timeOutOption: paramsType[]

View File

@ -8,6 +8,12 @@
<el-option v-for="v in statAnalysisSelectOptions.deviceId" :key="v.value" :label="v.label" :value="v.value"></el-option>
</el-select>
</div>
<div class="selectPart">
<span>风速来源</span>
<el-select v-model="statAnalysisSpeedSource" placeholder="请选择风速来源" class="statAnalysisSelect">
<el-option v-for="v in statAnalysisSelectOptions.speedSource" :key="v.value" :label="v.label" :value="v.value"></el-option>
</el-select>
</div>
</div>
<div class="topRight">
<el-button type="primary" :loading="isLoading" @click="statAnalysisOperate()">{{ t('statAnalysis.search') }}</el-button>
@ -29,17 +35,7 @@
:shortcuts="shortcuts"
/>
</div>
<div class="selectPart">
<span>风速来源</span>
<el-select v-model="statAnalysisSpeedSource" placeholder="请选择风速来源" class="statAnalysisSelect">
<el-option
v-for="v in statAnalysisSelectOptions.speedSource"
:key="v.value"
:label="v.label"
:value="v.value"
></el-option>
</el-select>
</div>
<div class="selectPart">
<span>{{ t('statAnalysis.madeinfatory') }}</span>
<el-select
@ -56,6 +52,10 @@
></el-option>
</el-select>
</div>
<div class="selectPart">
<span> 显示曲线 </span>
<el-switch v-model="AvgWindSpeedSwitch" @change="changeUpdateAvgWindSpeed"></el-switch>
</div>
</div>
</div>
</div>
@ -75,7 +75,8 @@ import * as echarts from 'echarts'
import { getCutDecimalsValue } from '/@/views/backend/equipment/airBlower/utils'
const { t } = useI18n()
const AvgWindSpeedSwitch = ref(false)
const chartType = ref('scatter') //
const statAnalysisFatory = ref('')
const statAnalysisFatoryList: any = ref([])
const statAnalysisSpeedSource = ref('AvgWindSpeed_10min')
@ -88,6 +89,28 @@ const statAnalysisSelectOptions: any = reactive({
deviceId: [],
})
const changeUpdateAvgWindSpeed = (val: any) => {
chartType.value = val ? 'line' : 'scatter'
updateChart()
}
const seriesDataInit = ref([])
const calculateData: any = ref([])
const updateChart = () => {
const series = {
type: chartType.value,
data: chartType.value === 'scatter' ? seriesDataInit.value : calculateData.value,
name: '实际值',
symbolSize: 5,
symbol: 'circle',
}
option.series[0] = series
if (!option.legend.data.includes('实际值')) {
option.legend.data.push('实际值')
}
chart.value.setOption(option)
}
const getFormattedDate = (offset: number) => {
const date = new Date()
date.setDate(date.getDate() + offset)
@ -330,19 +353,12 @@ const statAnalysisOperate = () => {
const seriesData = iGenPower.map((item: any, index: number) => {
return [getCutDecimalsValue(iWindSpeed[index], 2), getCutDecimalsValue(item, 2)]
})
seriesData.sort((a: any, b: any) => {
return a[0] - b[0]
})
const series = {
type: 'scatter',
data: seriesData,
name: '实际值',
symbolSize: 5,
symbol: 'circle',
}
option.series.push(series)
option.legend.data.push('实际值')
// seriesData.sort((a: any, b: any) => {
// return a[0] - b[0]
// })
seriesDataInit.value = seriesData
calculateData.value = calculateAverages(seriesDataInit.value)
updateChart()
}
}
if (resData1.length) {
@ -360,9 +376,11 @@ const statAnalysisOperate = () => {
option.series.push(series)
option.legend.data.push('理论值')
}
console.log('🚀 ~ .then ~ option.legend.data:', option.legend.data)
chart.value.setOption(option)
})
.catch((error) => {
console.log(error)
isLoading.value = false
ElMessage.warning(error)
})
@ -393,6 +411,34 @@ const statAnalysisExport = () => {
document.body.removeChild(a)
})
}
const calculateAverages = (data: any) => {
let maxWindSpeed = Math.max(...data.map((item: any) => item[0]))
let interval = 5 // 5m/s
let result = []
for (let windSpeed = 0; windSpeed <= maxWindSpeed; windSpeed += interval) {
let sumPower = 0
let count = 0
for (let i = 0; i < data.length; i++) {
let currentWindSpeed = data[i][0]
let currentPower = data[i][1]
if (currentWindSpeed >= windSpeed && currentWindSpeed < windSpeed + interval) {
sumPower += currentPower
count++
}
}
if (count > 0) {
let averagePower = sumPower / count
result.push([windSpeed + interval, averagePower])
}
}
return result
}
</script>
<style scoped lang="scss">
.contain {