暂降治理评估

This commit is contained in:
2024-03-28 13:25:41 +08:00
parent 45ba496361
commit 965b18b540
44 changed files with 2748 additions and 1108 deletions

View File

@@ -0,0 +1,243 @@
<!--上传暂降数据-->
<template>
<el-dialog class='cn-operate-dialog' v-model='eventDataUploadVisible' :title='title'
style='width: 415px;height: 380px'
top='25vh'>
<el-scrollbar>
<el-form :inline='false' :model='form' label-width='120px' ref='formRef'>
<el-form-item label='业务用户'>
<el-select v-model='form.userId' filterable @change='changeUser'>
<el-option
v-for='item in userListData'
:key='item.id'
:label='item.userName'
:value='item.id'
/>
</el-select>
</el-form-item>
<el-form-item label='生产线'>
<el-select v-model='form.productLineId' filterable @change='changeProductLine'>
<el-option
v-for='item in productLineData'
:key='item.id'
:label='item.name'
:value='item.id'
/>
</el-select>
</el-form-item>
<el-form-item label='进线'>
<el-input v-model='form.incomingLineName' readonly />
</el-form-item>
<el-form-item label='暂降数据文件'>
<el-upload
v-model:file-list='fileList'
ref='uploadEventData'
action=''
:limit='1'
:on-exceed='handleExceed'
:auto-upload='false'
:on-change='choose'
>
<template #trigger>
<el-button type='primary'>选择数据文件</el-button>
</template>
</el-upload>
</el-form-item>
</el-form>
</el-scrollbar>
<template #footer>
<span class='dialog-footer'>
<el-button @click='eventDataUploadVisible = false'>取消</el-button>
<el-button type='primary' @click='submit'>确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang='ts'>
import { ref, reactive, inject } from 'vue'
import TableStore from '@/utils/tableStore'
import { ElMessage } from 'element-plus'
import { sgUserList } from '@/api/advance-boot/sgGroven/sgUser'
import { querySgProductLineByUserId } from '@/api/advance-boot/sgGroven/sgProductLine'
import type { UploadInstance, UploadProps, UploadRawFile, UploadUserFile } from 'element-plus'
import { genFileId } from 'element-plus'
import { importEventData } from '@/api/advance-boot/sgGroven/sgEvent'
import { upload } from '@/api/process-boot/terminal'
const fileList = ref<UploadUserFile[]>([])
const formRef = ref()
const tableStore = inject('tableStore') as TableStore
const eventDataUploadVisible = ref(false)
const title = ref('')
const userListData: any = ref([])
const productLineData: any = ref([])
const uploadEventData = ref<UploadInstance>()
// 注意不要和表单ref的命名冲突
const form = reactive({
userId: '',
productLineId: '',
incomingLineName: '',
incomingLineId: '',
file: null
})
//弹出界面,默认选择用户的第一个生产线的第一条进线进行数据导入
const open = async (text: string, userId: string) => {
title.value = text
resetForm()
form.file = null
fileList.value = []
// 在此处恢复默认表单
for (let key in form) {
form[key] = ''
}
//获取用户数据
await sgUserList().then(res => {
if (res.data && res.data.length > 0) {
userListData.value = res.data
} else {
ElMessage.error('请先创建用户')
}
})
if (userId) {
form.userId = userId
} else {
form.userId = userListData.value[0].id
}
//根据用户id获取所有生产线并默认选中第一个
await querySgProductLineByUserId(form.userId).then(res => {
if (res.data && res.data.length > 0) {
productLineData.value = res.data
//并且默认选中第一个生产线
const productLineObj = productLineData.value[0]
form.productLineId = productLineObj.id
//判断赋值进线信息
if (productLineObj.incomingLineId && productLineObj.incomingLineName) {
form.incomingLineId = productLineObj.incomingLineId
form.incomingLineName = productLineObj.incomingLineName
} else {
ElMessage.error('请先关联进线')
}
} else {
form.productLineId = ''
form.incomingLineId = ''
form.incomingLineName = ''
productLineData.value = []
ElMessage.error('请先创建生产线')
}
})
eventDataUploadVisible.value = true
}
//重置表单内容
const resetForm = () => {
if (formRef.value) {
formRef.value.resetFields()
}
}
/**
* 用户下拉框发生更新
*/
const changeUser = async () => {
await querySgProductLineByUserId(form.userId).then(res => {
if (res.data && res.data.length > 0) {
productLineData.value = res.data
//并且默认选中第一个生产线
const productLineObj = productLineData.value[0]
form.productLineId = productLineObj.id
//判断赋值进线信息
if (productLineObj.incomingLineId && productLineObj.incomingLineName) {
form.incomingLineId = productLineObj.incomingLineId
form.incomingLineName = productLineObj.incomingLineName
} else {
form.incomingLineId = ''
form.incomingLineName = ''
ElMessage.error('请先关联进线')
}
} else {
form.productLineId = ''
form.incomingLineId = ''
form.incomingLineName = ''
productLineData.value = []
ElMessage.error('请先创建生产线')
}
})
}
/**
* 生产线下拉框发生更新
*/
const changeProductLine = () => {
//根据产线id获取到产线实体
const tempProductData = productLineData.value.filter((obj: any) => obj.id === form.productLineId)
//判断赋值进线信息
if (tempProductData[0].incomingLineId && tempProductData[0].incomingLineName) {
form.incomingLineId = tempProductData[0].incomingLineId
form.incomingLineName = tempProductData[0].incomingLineName
} else {
ElMessage.error('请先关联进线')
}
}
/**
* 选择待上传文件
*/
const choose = (e: any) => {
form.file = e.raw
}
const handleExceed: UploadProps['onExceed'] = (files) => {
uploadEventData.value!.clearFiles()
const file = files[0] as UploadRawFile
file.uid = genFileId()
uploadEventData.value!.handleStart(file)
fileList.value = [{ name: file.name, url: '' }]
}
/**
* 提交用户表单数据
*/
const submit = async () => {
if (form.file) {
formRef.value.validate(async (valid: any) => {
if (valid) {
if (!form.incomingLineId) {
ElMessage.error('请先关联进线')
} else {
let data = new FormData()
data.append('file', form.file)
data.append('incomingLineId', form.incomingLineId)
await importEventData(data).then((res: any) => {
if (res.code == 'A0000') {
ElMessage.success('导入成功')
tableStore.index()
eventDataUploadVisible.value = false
} else {
ElMessage.error('导入失败,请检查表格文件')
}
})
}
}
})
} else {
ElMessage.error('请选择数据文件')
}
}
defineExpose({ open })
</script>
<style scoped>
.el-form-item__content div {
width: 100% !important;
}
</style>

View File

@@ -0,0 +1,221 @@
<template>
<div class='default-main'>
<!-- 表头 -->
<TableHeader date-picker>
<template v-slot:select>
<el-form-item label='用户'>
<el-select v-model='tableStore.table.params.userId' filterable @change='changeUser'>
<el-option
v-for='item in userListData'
:key='item.id'
:label='item.userName'
:value='item.id'
/>
</el-select>
</el-form-item>
</template>
<template v-slot:operation>
<!--返回按钮-->
<back-component />
</template>
</TableHeader>
<!--导入暂降数据查询框-->
<event-upload-popup ref='eventUploadPopup' />
<el-radio-group v-model='radio' id='tabTitle'>
<el-radio-button label='暂降数据' />
<el-radio-button label='电压暂降事件统计' />
<el-radio-button label='耐受曲线信息' />
</el-radio-group>
<div class='tableExtraButton'>
<el-button :icon='Upload' type='primary' @click='importEventData'>导入</el-button>
<el-button :icon='Download' type='primary' @click='exportExcel'>数据导出</el-button>
<el-button :icon='Download' type='primary' @click='exportExcelTemplate'>下载模板</el-button>
</div>
<div style='position: relative;'>
<!-- 表格 -->
<Table ref='tableRef' />
<Transition name='el-fade-in-linear' mode='out-in'>
<Sags3D ref='sags3DRef' v-if="radio == '电压暂降事件统计'" />
</Transition>
<Transition name='el-fade-in-linear' mode='out-in'>
<ToleranceCurve ref='toleranceCurveRef' v-if="radio == '耐受曲线信息'" />
</Transition>
</div>
</div>
</template>
<script setup lang='ts'>
import { Upload, Download } from '@element-plus/icons-vue'
import { ref, provide, reactive } from 'vue'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import Sags3D from './sags3D.vue'
import ToleranceCurve from './toleranceCurve.vue'
import BackComponent from '@/components/icon/back/index.vue'
import { useRoute } from 'vue-router'
import { sgUserList } from '@/api/advance-boot/sgGroven/sgUser'
import EventUploadPopup from '@/views/pqs/voltageSags/sagGovern/businessUser/event/eventUploadPopup.vue'
import { downloadTemplate, exportEventData } from '@/api/advance-boot/sgGroven/sgEvent'
const { query } = useRoute()
const userId = ref()
// 注意名字不要重复若要保持页面存活名字需要和路由admin后面的字符保持一致
defineOptions({
name: 'sagVoltageData'
})
const radio = ref('暂降数据')
const eventUploadPopup = ref()
const sags3DRef = ref()
const toleranceCurveRef = ref()
const userListData: any = reactive([])
const tableStore = new TableStore({
// 若页面表格高度需要调整请修改publicHeight(内容区域除表格外其他内容的高度)
url: '/advance-boot/sgEvent/list',
method: 'POST',
publicHeight: 40,
column: [
{ title: '序号', type: 'seq', width: '80' },
{ title: '进线', field: 'incomingLineName', minWidth: '130' },
{ title: '发生时间', field: 'startTime', minWidth: '220', sortable: true },
{ title: '暂降幅值(p.u.)', field: 'featureAmplitude', minWidth: '130', sortable: true },
{ title: '持续时间(ms)', field: 'duration', minWidth: '130', sortable: true },
{ title: '预计损失(万元)', field: 'estimatedLoss', minWidth: '130', sortable: true },
{
title: '数据来源', field: 'dataSource', minWidth: '130',
formatter: (row: any) => {
return row.dataSource == 0 ? '离线导入' : '监测点同步'
}
},
{
title: '操作',
align: 'center',
width: '230',
render: 'buttons',
buttons: [
{
name: 'productSetting',
title: '波形查看',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
disabled: row => {
return row.fileFlag !== 0
}
// click: async row => {
// dialogFormVisible.value = true
// dialogTitle.value = '前置机修改'
// formData.value = JSON.parse(JSON.stringify(row))
// }
},
{
name: 'productSetting',
title: '暂无波形',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
disabled: row => {
return row.fileFlag !== 1
}
}
]
}
],
beforeSearchFun: () => {
for (let key in tableStore.table.params) {
if (tableStore.table.params[key] === '') {
delete tableStore.table.params[key]
}
}
}
})
// 注入到子组件
provide('tableStore', tableStore)
//初始化页面
const initData = async () => {
//先查询所有用户列表
await sgUserList().then(res => {
Object.assign(userListData, res.data)
})
userId.value = query.id
tableStore.table.params.userId = userId
tableStore.index()
sags3DRef.value?.search(userId)
toleranceCurveRef.value?.search(userId)
}
initData()
//用户信息更换
const changeUser = () => {
userId.value = tableStore.table.params.userId
}
//批量导入暂降数据
const importEventData = () => {
// 弹出框,联级选择生产线--进线,上传文件
eventUploadPopup.value.open('导入暂降数据', userId.value)
}
// 导出表格
const exportExcel = () => {
const param = {}
exportEventData(param).then((res: any) => {
let blob = new Blob([res], {
type: 'application/vnd.ms-excel'
})
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.download = '暂降事件数据'
document.body.appendChild(link)
link.click()
link.remove()
})
}
//导出模板
const exportExcelTemplate = () => {
downloadTemplate().then((res: any) => {
let blob = new Blob([res], {
type: 'application/vnd.ms-excel'
})
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.download = '暂降事件模板'
document.body.appendChild(link)
link.click()
link.remove()
})
}
</script>
<style scoped>
.tableExtraButton {
position: absolute;
right: 27px;
top: 55px;
}
#tabTitle {
border-left: 1px solid var(--el-border-color);
border-right: 1px solid var(--el-border-color);
width: 100%;
padding: 0 0 5px 5px;
margin-top: -5px;
}
.cn-table-header {
border-bottom: 0 !important;
}
</style>

View File

@@ -0,0 +1,295 @@
<template>
<SecondSheet>
<div style="height: 100%; overflow: hidden">
<div class="switch-tab">
<el-radio-group v-model="radio" size="small">
<el-radio-button label="三维图" />
<el-radio-button label="表格" />
</el-radio-group>
</div>
<Table ref="tableRef" height="auto" isGroup />
<SecondSheet v-if="radio === '三维图'">
<MyEchart :options="options" v-if="options"></MyEchart>
</SecondSheet>
</div>
</SecondSheet>
</template>
<script lang="ts" setup>
import { ref, onMounted, provide } from 'vue'
import SecondSheet from '@/components/secondSheet/index.vue'
import Table from '@/components/table/index.vue'
import TableStore from '@/utils/tableStore'
import MyEchart from '@/components/echarts/MyEchart.vue'
const radio = ref('三维图')
const options = ref()
const apiData = ref()
const tableStore = new TableStore({
showPage: false,
// 若页面表格高度需要调整请修改publicHeight(内容区域除表格外其他内容的高度)
url: '/user-boot/user/list',
method: 'POST',
column: [
{
title: '电压暂降频次统计表',
children: [
{ title: '暂降福度', field: 'amplitude', width: '130' },
{
title: '持续时间',
field: 'loginName',
children: []
}
]
}
],
loadCallback: () => {
tableStore.table.data = {
lineIds: [1, 5],
type: 1,
beginDate: '2019-01-01',
endDate: '2024-12-31',
amplitudes: ['0.8~0.9', '0.7~0.8', '0.6~0.7', '0.5~0.6', '0.4~0.5', '0.1~0.4'],
durations: ['0.01~0.02', '0.02~0.05', '0.05~0.07', '0.07~0.10', '0.10~1.00'],
values: [
['0.8~0.9', '0.01~0.02', '0'],
['0.8~0.9', '0.02~0.05', '0'],
['0.8~0.9', '0.05~0.07', '0'],
['0.8~0.9', '0.07~0.10', '0'],
['0.8~0.9', '0.10~1.00', '6'],
['0.7~0.8', '0.01~0.02', '0'],
['0.7~0.8', '0.02~0.05', '0'],
['0.7~0.8', '0.05~0.07', '0'],
['0.7~0.8', '0.07~0.10', '0'],
['0.7~0.8', '0.10~1.00', '1'],
['0.6~0.7', '0.01~0.02', '0'],
['0.6~0.7', '0.02~0.05', '0'],
['0.6~0.7', '0.05~0.07', '0'],
['0.6~0.7', '0.07~0.10', '0'],
['0.6~0.7', '0.10~1.00', '2'],
['0.5~0.6', '0.01~0.02', '0'],
['0.5~0.6', '0.02~0.05', '0'],
['0.5~0.6', '0.05~0.07', '0'],
['0.5~0.6', '0.07~0.10', '0'],
['0.5~0.6', '0.10~1.00', '5'],
['0.4~0.5', '0.01~0.02', '0'],
['0.4~0.5', '0.02~0.05', '0'],
['0.4~0.5', '0.05~0.07', '0'],
['0.4~0.5', '0.07~0.10', '0'],
['0.4~0.5', '0.10~1.00', '1'],
['0.1~0.4', '0.01~0.02', '0'],
['0.1~0.4', '0.02~0.05', '0'],
['0.1~0.4', '0.05~0.07', '0'],
['0.1~0.4', '0.07~0.10', '0'],
['0.1~0.4', '0.10~1.00', '3']
],
table: {
total: 6,
rows: [
{
searchValue: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
params: {},
amplitude: '0.8~0.9',
d005_007s: '0',
d001_002s: '0',
d002_005s: '0',
d010_100s: '6',
d007_010s: '0'
},
{
searchValue: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
params: {},
amplitude: '0.7~0.8',
d005_007s: '0',
d001_002s: '0',
d002_005s: '0',
d010_100s: '1',
d007_010s: '0'
},
{
searchValue: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
params: {},
amplitude: '0.6~0.7',
d005_007s: '0',
d001_002s: '0',
d002_005s: '0',
d010_100s: '2',
d007_010s: '0'
},
{
searchValue: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
params: {},
amplitude: '0.5~0.6',
d005_007s: '0',
d001_002s: '0',
d002_005s: '0',
d010_100s: '5',
d007_010s: '0'
},
{
searchValue: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
params: {},
amplitude: '0.4~0.5',
d005_007s: '0',
d001_002s: '0',
d002_005s: '0',
d010_100s: '1',
d007_010s: '0'
},
{
searchValue: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null,
params: {},
amplitude: '0.1~0.4',
d005_007s: '0',
d001_002s: '0',
d002_005s: '0',
d010_100s: '3',
d007_010s: '0'
}
],
code: 200,
msg: '查询成功'
}
}
apiData.value = tableStore.table.data
tableStore.table.column![0].children![1].children!.push(
...(apiData.value.durations.map((item: string) => {
return {
title: item,
field: `d${item.replaceAll('.', '').replaceAll('~', '_')}s`
}
}) as any[])
)
tableStore.table.data = apiData.value.table.rows
initEchart()
}
})
// 注入到子组件
provide('tableStore', tableStore)
onMounted(() => {
search()
})
const initEchart = () => {
options.value = {
options: {
xAxis: null,
yAxis: null,
dataZoom: null,
backgroundColor: '#fff',
tooltip: {
trigger: 'axis'
},
title: {
text: '暂降密度图',
x: 'center'
},
xAxis3D: {
name: '暂降福度(p.u.)',
type: 'category',
data: apiData.value.amplitudes
},
yAxis3D: {
name: '持续时间(s)',
type: 'category',
data: apiData.value.durations
},
zAxis3D: {
name: '次数',
type: 'value'
},
grid3D: {
boxWidth: 200,
boxDepth: 80,
viewControl: {
projection: 'perspective',
distance: 250
},
light: {
main: {
intensity: 1.2,
shadow: true
},
ambient: {
intensity: 0.3
}
}
},
series: [
{
type: 'bar3D',
data: apiData.value.values.map((item: [string, string, string]) => {
return [
apiData.value.amplitudes.indexOf(item[0]),
apiData.value.durations.indexOf(item[1]),
item[2]
]
}),
shading: 'lambert',
label: {
fontSize: 16,
borderWidth: 1
},
emphasis: {
label: {
fontSize: 20,
color: '#900'
},
itemStyle: {
color: '#900'
}
}
}
]
}
}
}
const search = () => {
// 从父组件tableStore获取参数
tableStore.table.params.pageSize = 9999
tableStore.table.params.searchState = 1
tableStore.table.params.searchValue = ''
tableStore.table.params.casualUser = -1
tableStore.table.params.orderBy = ''
tableStore.index()
}
defineExpose({ search })
</script>
<style lang="scss">
.switch-tab {
position: absolute;
right: 16px;
top: 4px;
z-index: 11;
}
</style>

View File

@@ -0,0 +1,159 @@
<template>
<SecondSheet>
<div class="tolerance-curve">
<el-form label-width="auto" :inline="true">
<el-form-item>
<el-select v-model="form.name" placeholder="Select">
<el-option
v-for="item in selectOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-select v-model="form.name" placeholder="Select">
<el-option
v-for="item in selectOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-select v-model="form.name" placeholder="Select">
<el-option
v-for="item in selectOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-form>
<div style="display: flex; flex: 1">
<el-form label-width="auto" label-position="top">
<el-form-item label="耐受曲线">
<el-select v-model="form.name" placeholder="Select">
<el-option
v-for="item in selectOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="耐受能力(膝点坐标)">
<el-select v-model="form.name" placeholder="Select">
<el-option
v-for="item in selectOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="上限曲线膝点">
<div>
<div>
<el-input-number v-model="form.num" controls-position="right" />
<span class="ml10" style="color: #333">p.u.</span>
</div>
<div class="mt10">
<el-input-number v-model="form.num" controls-position="right" />
<span class="ml10" style="color: #333">ms</span>
</div>
</div>
</el-form-item>
<el-form-item label="下限曲线膝点">
<div>
<div>
<el-input-number v-model="form.num" controls-position="right" />
<span class="ml10" style="color: #333">p.u.</span>
</div>
<div class="mt10">
<el-input-number v-model="form.num" controls-position="right" />
<span class="ml10" style="color: #333">ms</span>
</div>
</div>
</el-form-item>
</el-form>
<div style="flex: 1" class="ml10">
<MyEchart :options="options" v-if="options"></MyEchart>
</div>
</div>
</div>
</SecondSheet>
</template>
<script lang="ts" setup>
import SecondSheet from '@/components/secondSheet/index.vue'
import MyEchart from '@/components/echarts/MyEchart.vue'
import { reactive, ref } from 'vue'
const options = ref({
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [
{
data: [150, 230, 224, 218, 135, 147, 260],
type: 'line'
},
{
data: [50, 30, 124, 318, 175, 127, 160],
type: 'line'
}
],
options: {
dataZoom: null
}
})
const form = reactive({
name: '',
num: 1
})
const selectOptions = [
{
value: 'Option1',
label: 'Option1'
},
{
value: 'Option2',
label: 'Option2'
},
{
value: 'Option3',
label: 'Option3'
},
{
value: 'Option4',
label: 'Option4'
},
{
value: 'Option5',
label: 'Option5'
}
]
const search = () => {
// 从父组件tableStore获取参数
}
defineExpose({ search })
</script>
<style lang="scss">
.tolerance-curve {
display: flex;
flex-direction: column;
box-sizing: border-box;
height: 100%;
overflow: hidden;
padding: 10px;
border: 1px solid var(--el-border-color);
}
</style>

View File

@@ -1,22 +0,0 @@
<template>
<div>
<h1>暂降事件查询</h1>
<h1>{{ id }}</h1>
<el-button type='primary' @click='go(-1)' class='ml10'>返回</el-button>
</div>
</template>
<script setup lang='ts'>
import { useRouter, useRoute } from 'vue-router'
import { ref } from 'vue'
import { Plus } from '@element-plus/icons-vue'
const { push, go } = useRouter()
const { query } = useRoute()
const id = ref()
const getTableDet = async () => {
id.value = query.id
}
getTableDet()
</script>

View File

@@ -1,6 +1,6 @@
<template>
<el-dialog class='cn-operate-dialog' v-model='incomingDialogVisible' :title='title'
style='max-width: 750px;width: 400px;height: 300px' top='30vh'>
style='width: 415px;height: 300px' top='30vh'>
<el-scrollbar>
<el-form :inline='false' :model='form' label-width='120px' :rules='rules' ref='formRef'>
<el-form-item label='进线名称' prop='name'>

View File

@@ -26,6 +26,7 @@
<Table ref='tableRef'></Table>
<!--弹框-->
<user-popup ref='userPopup' />
<event-upload-popup ref='eventUploadPopup' />
</div>
</template>
@@ -39,7 +40,7 @@ import AreaCascard from '@/components/form/areaCascard/index.vue'
import { onMounted, provide, ref } from 'vue'
import { useRouter } from 'vue-router'
import { deleteSgUser } from '@/api/advance-boot/sgGroven/sgUser'
import EventUploadPopup from '@/views/pqs/voltageSags/sagGovern/businessUser/event/eventUploadPopup.vue'
import UserPopup from './userPopup.vue'
@@ -52,12 +53,13 @@ const { push } = useRouter()
const areaRef = ref()
//用户信息弹出框
const userPopup = ref()
const eventUploadPopup = ref()
const tableStore = new TableStore({
url: '/advance-boot/sgUser/list',
method: 'POST',
column: [
{ title: '序号', type: 'seq' },
{ title: '序号', type: 'seq', width: 80 },
{ title: '用户名', field: 'userName' },
{ title: '所属行业', field: 'industry' },
{ title: '所属地区', field: 'addr' },
@@ -75,7 +77,7 @@ const tableStore = new TableStore({
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: async row => {
click: row => {
push(`/admin/businessUserRouter/eventView?id=${row.id}`)
}
},
@@ -85,13 +87,10 @@ const tableStore = new TableStore({
title: '导入',
type: 'primary',
icon: 'el-icon-Delete',
render: 'basicButton'
// click: row => {
// delNode(row.id).then(res => {
// ElMessage.success('删除成功')
// tableStore.index()
// })
// }
render: 'basicButton',
click: row => {
eventUploadPopup.value.open('导入暂降数据', row.id)
}
}
]
},
@@ -104,15 +103,23 @@ const tableStore = new TableStore({
buttons: [
{
name: 'productSetting',
title: '生产线设置',
title: '生产线管理',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton'
// click: async row => {
// dialogFormVisible.value = true
// dialogTitle.value = '前置机修改'
// formData.value = JSON.parse(JSON.stringify(row))
// }
render: 'basicButton',
click: row => {
push(`/admin/businessUserRouter/productLine?id=${row.id}`)
}
},
{
name: 'productSetting',
title: '设备管理',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: row => {
push(`/admin/businessUserRouter/machine?id=${row.id}`)
}
},
{
name: 'update',

View File

@@ -0,0 +1,168 @@
<!--设备管理界面-->
<template>
<div class='default-main'>
<TableHeader>
<template v-slot:select>
<el-form-item label='生产线'>
<el-select v-model='tableStore.table.params.productLineId'>
<el-option
v-for='item in productLineList'
:key='item.id'
:label='item.name'
:value='item.id'
/>
</el-select>
</el-form-item>
</template>
<template v-slot:operation>
<el-button type='primary' @click='add' class='ml10' :icon='Plus'>新增</el-button>
<!--返回按钮-->
<back-component />
</template>
</TableHeader>
<!--表格-->
<Table ref='tableRef'></Table>
<!--设备弹出框-->
<machine-popup ref='machinePopup' />
<!--设备详细弹出框管理元器件-->
<machine-detail ref='machineDetail' />
</div>
</template>
<script setup lang='ts'>
import { Plus } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import { provide, ref, reactive } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { querySgProductLineByUserId } from '@/api/advance-boot/sgGroven/sgProductLine'
import { deleteSgMachine } from '@/api/advance-boot/sgGroven/sgMachine'
import MachinePopup from './machinePopup.vue'
import MachineDetail from '@/views/pqs/voltageSags/sagGovern/businessUser/sensitiveUnit/machineDetail.vue'
import BackComponent from '@/components/icon/back/index.vue'
let productLineList: any = ref([])
const machinePopup = ref()
const machineDetail = ref()
defineOptions({
name: 'machine'
})
const { go } = useRouter()
const { query } = useRoute()
const tableStore = new TableStore({
url: '/advance-boot/sgMachine/list',
method: 'POST',
column: [
{ title: '序号', type: 'seq', width: 80 },
{ title: '设备名称', minWidth: '160', field: 'name' },
{ title: '设备型号', minWidth: '140', field: 'type' },
{ title: '设备损失(万元)', width: '140', field: 'machineLoss' },
{ title: '原料损失(万元)', width: '140', field: 'materialLoss' },
{ title: '产线功率(kW)', width: '140', field: 'machinePower' },
{
title: '操作',
align: 'center',
render: 'buttons',
minWidth: '230',
fixed: 'right',
buttons: [
{
name: 'productSetting',
title: '元器件管理',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: async row => {
machineDetail.value.open('元器件管理', row)
}
},
{
name: 'update',
title: '编辑',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: row => {
machinePopup.value.open('修改设备', row)
}
},
{
name: 'update',
title: '删除',
type: 'danger',
icon: 'el-icon-Delete',
render: 'confirmButton',
popconfirm: {
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonType: 'danger',
title: '确定删除吗?'
},
click: row => {
deleteSgMachine(row.id).then(res => {
ElMessage.success('删除成功')
tableStore.index()
})
}
}
]
}
],
beforeSearchFun: () => {
for (let key in tableStore.table.params) {
if (tableStore.table.params[key] === '') {
delete tableStore.table.params[key]
}
}
}
})
const getTableData = async () => {
//根据用户查询下面所有的生产线,默认根据第一个生产线获取下面所有设备
await querySgProductLineByUserId(query.id).then(res => {
productLineList.value = res.data
// //如果没有传就用第一个
if (productLineList.value && productLineList.value.length > 0) {
if (query.productLineId) {
tableStore.table.params.productLineId = query.productLineId
} else {
tableStore.table.params.productLineId = productLineList.value[0].id
}
}
})
if (tableStore.table.params.productLineId) {
tableStore.index()
} else {
ElMessage.error('请新增一条生产线')
tableStore.table.loading = false
}
}
getTableData()
provide('tableStore', tableStore)
const add = () => {
if (tableStore.table.params.productLineId) {
let data = {
productLineId: tableStore.table.params.productLineId
}
machinePopup.value.open('新增设备', data)
} else {
ElMessage.error('请新增一条生产线')
}
}
</script>

View File

@@ -0,0 +1,149 @@
<!--设备的新增编辑弹出框-->
<template>
<el-dialog class='cn-operate-dialog' v-model='machineVisible' :title='title' style='width: 415px;height: 400px'
top='30vh'>
<el-scrollbar>
<el-form :inline='false' :model='form' label-width='120px' :rules='rules' ref='formRef'>
<el-form-item label='设备名' prop='name'>
<el-input v-model='form.name' placeholder='请输入设备名' clearable />
</el-form-item>
<el-form-item label='型号'>
<el-input v-model='form.type' placeholder='请输入型号' clearable />
</el-form-item>
<el-form-item label='设备损失' prop='machineLoss'>
<el-input
v-model='form.machineLoss'
placeholder='请输入设备损失'
clearable
>
<template #append>万元</template>
</el-input>
</el-form-item>
<el-form-item label='原料损失' prop='materialLoss'>
<el-input
v-model='form.materialLoss'
placeholder='请输入原料损失'
clearable
>
<template #append>万元</template>
</el-input>
</el-form-item>
<el-form-item label='功率' prop='machinePower'>
<el-input
v-model='form.machinePower'
placeholder='请输入功率'
clearable
>
<template #append>kW</template>
</el-input>
</el-form-item>
</el-form>
</el-scrollbar>
<template #footer>
<span class='dialog-footer'>
<el-button @click='machineVisible = false'>取消</el-button>
<el-button type='primary' @click='submit'>确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang='ts' setup>
import { ref, reactive, inject } from 'vue'
import { ElMessage } from 'element-plus'
import TableStore from '@/utils/tableStore'
import { addSgMachine,updateSgMachine } from '@/api/advance-boot/sgGroven/sgMachine'
const tableStore = inject('tableStore') as TableStore
const machineVisible = ref(false)
const title = ref('')
const formRef = ref()
const regex = /^[+]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$/
// 注意不要和表单ref的命名冲突
const form = reactive({
id: '',
productLineId: '',
name: '',
type: '',
machineLoss: 0,
materialLoss: 0,
machinePower: 0
})
//form表单校验规则
const rules = {
name: [{ required: true, message: '设备名不能为空', trigger: 'blur' }],
machineLoss: [
{ required: true, message: '设备损失不能为空', trigger: 'blur' },
{ pattern: regex, message: '请输入有效的数值', trigger: 'blur' }
],
materialLoss: [
{ required: true, message: '原料损失不能为空', trigger: 'blur' },
{ pattern: regex, message: '请输入有效的数值', trigger: 'blur' }
],
machinePower: [
{ required: true, message: '功率不能为空', trigger: 'blur' },
{ pattern: regex, message: '请输入有效的数值', trigger: 'blur' }
],
}
const open = (text: string, data?: any) => {
title.value = text
if (data.name) {
// 表单赋值
for (let key in form) {
form[key] = data[key]
}
} else {
resetForm()
// 在此处恢复默认表单
for (let key in form) {
form[key] = ''
}
}
form.productLineId = data.productLineId
machineVisible.value = true
}
//重置表单内容
const resetForm = () => {
if (formRef.value) {
formRef.value.resetFields()
}
}
/**
* 提交用户表单数据
*/
const submit = () => {
formRef.value.validate(async (valid: any) => {
if (valid) {
if (form.id) {
await updateSgMachine(form)
} else {
await addSgMachine(form)
}
ElMessage.success('保存成功')
tableStore.index()
machineVisible.value = false
}
})
}
/************针对tab切换*************/
defineExpose({ open })
</script>
<style scoped>
.el-upload-list__item {
transition: none !important;
}
.el-select {
min-width: 180px;
}
</style>

View File

@@ -0,0 +1,146 @@
<!--业务用户管理界面-->
<template>
<div class='default-main'>
<TableHeader>
<template v-slot:operation>
<el-button type='primary' @click='refresh' class='ml10' :icon='Refresh'>刷新</el-button>
<el-button type='primary' @click='add' class='ml10' :icon='Plus'>新增</el-button>
<!--返回按钮-->
<back-component />
</template>
</TableHeader>
<!--表格-->
<Table ref='tableRef'></Table>
<!--弹框-->
<product-popup ref='productLine' />
</div>
</template>
<script setup lang='ts'>
import { Plus, Refresh } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import { provide, ref } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { deleteSgProductLine } from '@/api/advance-boot/sgGroven/sgProductLine'
import ProductPopup from './productPopup.vue'
import BackComponent from '@/components/icon/back/index.vue'
const productLine = ref()
defineOptions({
name: 'productLine'
})
const { push } = useRouter()
const { query } = useRoute()
const tableStore = new TableStore({
url: '/advance-boot/sgProductLine/list',
method: 'POST',
column: [
{ title: '序号', type: 'seq', width: 80 },
{ title: '用户名', minWidth: '130', field: 'userName' },
{ title: '进线名称', minWidth: '130', field: 'incomingLineName' },
{ title: '产线名称', minWidth: '130', field: 'name' },
{ title: '产能损失(万元)', width: '120', field: 'capacityLoss' },
{ title: '设备损失(万元)', width: '120', field: 'machineLoss' },
{ title: '原料损失(万元)', width: '120', field: 'materialLoss' },
{ title: '产线功率(kW)', width: '120', field: 'machinePower' },
{
title: '计算模式',
titlePrefix: { message: '模式一:单次中断不计算设备、原料损失 \n 模式二:单次中断计算设备、原料损失', icon: 'vxe-icon-question-circle-fill' },
render: 'tag',
width: '120',
field: 'calcMode',
replaceValue: {
'0': '模式一',
'1': '模式二'
}
},
{
title: '操作',
align: 'center',
render: 'buttons',
minWidth: '230',
fixed: 'right',
buttons: [
{
name: 'productSetting',
title: '设备管理',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: row => {
push(`/admin/businessUserRouter/machine?id=${query.id}&productLineId=${row.id}`)
}
},
{
name: 'update',
title: '编辑',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: row => {
productLine.value.open('修改生产线', row)
}
},
{
name: 'update',
title: '删除',
type: 'danger',
icon: 'el-icon-Delete',
render: 'confirmButton',
popconfirm: {
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonType: 'danger',
title: '确定删除吗?'
},
click: row => {
deleteSgProductLine(row.id).then(res => {
ElMessage.success('删除成功')
tableStore.index()
})
}
}
]
}
],
beforeSearchFun: () => {
if (tableStore.table.params.addr) {
tableStore.table.params.addrStrOption = tableStore.table.params.addr.map(tempArray => tempArray.join('/'))
}
for (let key in tableStore.table.params) {
if (tableStore.table.params[key] === '') {
delete tableStore.table.params[key]
}
}
}
})
const getTableData = () => {
tableStore.table.params.userId = query.id
tableStore.index()
}
getTableData()
provide('tableStore', tableStore)
//新增
const add = () => {
let data = {
userId: query.id
}
productLine.value.open('新增生产线', data)
}
//刷新
const refresh = () => {
tableStore.index()
}
</script>

View File

@@ -0,0 +1,167 @@
<!--生产线的新增编辑弹出框-->
<template>
<el-dialog class='cn-operate-dialog' v-model='productLineVisible' :title='title' style='width: 415px;height: 380px'
top='30vh'>
<el-scrollbar>
<el-form :inline='false' :model='form' label-width='120px' :rules='rules' ref='formRef'>
<el-form-item label='生产线名' prop='name'>
<el-input v-model='form.name' placeholder='请输入生产线名' clearable />
</el-form-item>
<el-form-item label='关联进线' prop='incomingLineId'>
<el-select v-model='form.incomingLineId'>
<el-option
v-for='item in incomingLineList'
:key='item.id'
:label='item.name'
:value='item.id'
/>
</el-select>
</el-form-item>
<el-form-item label='计算模式' prop='calcMode'>
<el-radio-group v-model='form.calcMode'>
<el-tooltip
class='box-item'
effect='light'
content='单次中断不计算设备、原料损失'
placement='bottom-start'
>
<el-radio border label='0'>模式一</el-radio>
</el-tooltip>
<el-tooltip
class='box-item'
effect='light'
content='单次中断计算设备、原料损失'
placement='bottom-start'
>
<el-radio border label='1'>模式二</el-radio>
</el-tooltip>
</el-radio-group>
</el-form-item>
<el-form-item label='产能损失' prop='capacityLoss'>
<el-input
v-model='form.capacityLoss'
placeholder='请输入产能损失'
clearable
>
<template #append>万元</template>
</el-input>
</el-form-item>
</el-form>
</el-scrollbar>
<template #footer>
<span class='dialog-footer'>
<el-button @click='productLineVisible = false'>取消</el-button>
<el-button type='primary' @click='submit'>确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang='ts' setup>
import { ref, reactive, inject } from 'vue'
import { ElMessage } from 'element-plus'
import { querySgIncomingLineByUserId } from '@/api/advance-boot/sgGroven/incomingLine'
import { addSgProductLine, updateSgProductLine } from '@/api/advance-boot/sgGroven/sgProductLine'
import TableStore from '@/utils/tableStore'
const tableStore = inject('tableStore') as TableStore
const productLineVisible = ref(false)
const title = ref('')
const formRef = ref()
const regex = /^[+]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$/
let incomingLineList: any = reactive([])
// 注意不要和表单ref的命名冲突
const form = reactive({
id: '',
userId: '',
incomingLineId: '',
name: '',
calcMode: '',
capacityLoss: 0
})
//form表单校验规则
const rules = {
name: [{ required: true, message: '生产线名不能为空', trigger: 'blur' }],
incomingLineId: [{ required: true, message: '请关联进线', trigger: 'change' }],
calcMode: [
{ required: true, message: '请选择计算模式', trigger: 'change' }
],
capacityLoss: [
{ required: true, message: '产能损失不能为空', trigger: 'blur' },
{ pattern: regex, message: '请输入有效的数值', trigger: 'blur' }
]
}
const open = async (text: string, data?: any) => {
title.value = text
if (data.name) {
// 表单赋值
for (let key in form) {
form[key] = data[key]
}
form.calcMode = String(data.calcMode)
} else {
resetForm()
// 在此处恢复默认表单
for (let key in form) {
form[key] = ''
}
form.calcMode = '0'
}
form.userId = data.userId
await initIncomingLine()
productLineVisible.value = true
}
//重置表单内容
const resetForm = () => {
if (formRef.value) {
formRef.value.resetFields()
}
}
//初始化进线下拉框
const initIncomingLine = async () => {
//根据业务用户id去查找
await querySgIncomingLineByUserId(form.userId).then(res => {
//将进线数据赋值到下来框中
incomingLineList = res.data
})
}
/**
* 提交用户表单数据
*/
const submit = () => {
formRef.value.validate(async (valid: any) => {
if (valid) {
if (form.id) {
await updateSgProductLine(form)
} else {
await addSgProductLine(form)
}
ElMessage.success('保存成功')
tableStore.index()
productLineVisible.value = false
}
})
}
/************针对tab切换*************/
defineExpose({ open })
</script>
<style scoped>
.el-upload-list__item {
transition: none !important;
}
.el-select {
min-width: 180px;
}
</style>

View File

@@ -0,0 +1,93 @@
<!--设备详情页面包含设备基础信息元器件列表信息-->
<template>
<el-dialog class='cn-operate-dialog' v-model='machineDetailVisible' :title='title' style='width: 900px;'>
<el-scrollbar>
<el-form :inline='false' :model='form' label-width='120px' ref='formRef'>
<el-form-item label='设备名称'>
<el-input v-model='form.name' readonly />
</el-form-item>
<el-row>
<el-col :span='12'>
<el-form-item label='设备型号'>
<el-input v-model='form.type' readonly />
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label='设备损失'>
<el-input v-model='form.machineLoss' readonly>
<template #append>万元</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span='12'>
<el-form-item label='原料损失'>
<el-input v-model='form.materialLoss' readonly>
<template #append>万元</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='12'>
<el-form-item label='功率'>
<el-input v-model='form.machinePower' readonly>
<template #append>kW</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!--元器件表格-->
<unit-table ref='unitTable' />
</el-scrollbar>
<template #footer>
<span class='dialog-footer'>
<el-button @click='machineDetailVisible = false'>关闭</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang='ts' setup>
import { ref, reactive, nextTick } from 'vue'
import UnitTable from '@/views/pqs/voltageSags/sagGovern/businessUser/sensitiveUnit/unitTable.vue'
// 注意不要和表单ref的命名冲突
const form = reactive<any>({
id: '',
name: '',
type: '',
machineLoss: '',
materialLoss: '',
machinePower: ''
})
const unitTable = ref()
const machineDetailVisible = ref(false)
const title = ref('')
//回显设备基础信息
const open = (text: string, data?: any) => {
title.value = text
machineDetailVisible.value = true
if (data) {
// 表单赋值
for (let key in form) {
form[key] = data[key]
}
}
//查询元器件数据 todo...
//待子组件渲染完毕
nextTick(() => {
unitTable.value.getTableData(form.id)
})
}
defineExpose({ open })
</script>
<style scoped>
.el-form-item {
margin-bottom: 10px !important;
}
</style>

View File

@@ -0,0 +1,202 @@
<!--元器件的新增编辑弹出框-->
<template>
<el-dialog class='cn-operate-dialog' v-model='unitVisible' :title='title' style='width: 415px;height: 500px'
top='10vh'>
<el-scrollbar>
<el-form :inline='false' :model='form' label-width='135px' :rules='rules' ref='formRef'>
<el-form-item label='元器件名' prop='name'>
<el-input v-model='form.name' placeholder='请输入元器件名' clearable />
</el-form-item>
<el-form-item label='灵敏度' prop='sensitivity'>
<el-select v-model='form.sensitivity'>
<el-option
v-for='item in sensitivityList'
:key='item.value'
:label='item.name'
:value='item.value'
/>
</el-select>
</el-form-item>
<el-form-item label='耐受能力是否标准' prop='standardFlag'>
<el-radio-group v-model='form.standardFlag'>
<el-radio border label='1'></el-radio>
<el-radio border label='0'></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label='上限-持续时间' prop='vtcTimeUpper'>
<el-input
v-model='form.vtcTimeUpper'
placeholder='请输入持续时间'
clearable
>
<template #append>ms</template>
</el-input>
</el-form-item>
<el-form-item label='上限-暂降幅值' prop='vtcAmpUpper'>
<el-input
v-model='form.vtcAmpUpper'
placeholder='请输入暂降幅值'
clearable
>
<template #append>p.u.</template>
</el-input>
</el-form-item>
<el-form-item label='下限-持续时间' prop='vtcTimeLower'>
<el-input
v-model='form.vtcTimeLower'
placeholder='请输入持续时间'
clearable
>
<template #append>ms</template>
</el-input>
</el-form-item>
<el-form-item label='下限-暂降幅值' prop='vtcAmpLower'>
<el-input
v-model='form.vtcAmpLower'
placeholder='请输入暂降幅值'
clearable
>
<template #append>p.u.</template>
</el-input>
</el-form-item>
</el-form>
</el-scrollbar>
<template #footer>
<span class='dialog-footer'>
<el-button @click='unitVisible = false'>取消</el-button>
<el-button type='primary' @click='submit'>确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang='ts' setup>
import { ref, reactive, inject } from 'vue'
import { ElMessage } from 'element-plus'
import TableStore from '@/utils/tableStore'
import { addSgSensitiveUnit,updateSgSensitiveUnit } from '@/api/advance-boot/sgGroven/sgSensitiveUnit'
const tableStore = inject('tableStore') as TableStore
const unitVisible = ref(false)
const title = ref('')
const formRef = ref()
const sensitivityList = ref(
[
{
name: '平均',
value: '0'
},
{
name: '高',
value: '1'
},
{
name: '中',
value: '2'
},
{
name: '低',
value: '3'
}
]
)
const regex = /^[+]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$/
// 注意不要和表单ref的命名冲突
const form = reactive({
id: '',
machineId: '',
name: '',
sensitivity: '',
standardFlag: '',
vtcTimeUpper: 0,
vtcAmpUpper: 0,
vtcTimeLower: 0,
vtcAmpLower: 0
})
//form表单校验规则
const rules = {
name: [{ required: true, message: '设备名不能为空', trigger: 'blur' }],
sensitivity: [{ required: true, message: '灵敏度不能为空', trigger: 'change' }],
standardFlag: [{ required: true, message: '耐受能力不能为空', trigger: 'change' }],
vtcTimeUpper: [
{ required: true, message: '持续时间不能为空', trigger: 'blur' },
{ pattern: regex, message: '请输入有效的数值', trigger: 'blur' }
],
vtcAmpUpper: [
{ required: true, message: '暂降幅值不能为空', trigger: 'blur' },
{ pattern: regex, message: '请输入有效的数值', trigger: 'blur' }
],
vtcTimeLower: [
{ required: true, message: '持续时间不能为空', trigger: 'blur' },
{ pattern: regex, message: '请输入有效的数值', trigger: 'blur' }
],
vtcAmpLower: [
{ required: true, message: '暂降幅值不能为空', trigger: 'blur' },
{ pattern: regex, message: '请输入有效的数值', trigger: 'blur' }
]
}
const open = (text: string, data?: any) => {
title.value = text
if (data.name) {
// 表单赋值
for (let key in form) {
form[key] = data[key]
}
form.sensitivity = String(data.sensitivity)
form.standardFlag = String(data.standardFlag)
} else {
resetForm()
// 在此处恢复默认表单
for (let key in form) {
form[key] = ''
}
form.sensitivity = '0'
form.standardFlag = '1'
}
form.machineId = data.machineId
unitVisible.value = true
}
//重置表单内容
const resetForm = () => {
if (formRef.value) {
formRef.value.resetFields()
}
}
/**
* 提交用户表单数据
*/
const submit = () => {
formRef.value.validate(async (valid: any) => {
if (valid) {
if (form.id) {
await updateSgSensitiveUnit(form)
} else {
await addSgSensitiveUnit(form)
}
ElMessage.success('保存成功')
tableStore.index()
unitVisible.value = false
}
})
}
defineExpose({ open })
</script>
<style scoped>
.cn-operate-dialog .el-form {
width: calc(100% - 10px)
}
</style>

View File

@@ -0,0 +1,145 @@
<!--进线管理界面-->
<template>
<div class='default-main unitButton'>
<TableHeader style='padding: 0 0 !important;'>
<template v-slot:operation>
<el-button type='primary' @click='add' class='ml10' :icon='Plus'>新增</el-button>
</template>
</TableHeader>
<!--表格-->
<Table ref='tableRef' isGroup></Table>
<!--弹框-->
<unit-popup ref='unitPopup' />
</div>
</template>
<script setup lang='ts'>
import { provide, ref } from 'vue'
import { Plus } from '@element-plus/icons-vue'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import TableStore from '@/utils/tableStore'
import UnitPopup from '@/views/pqs/voltageSags/sagGovern/businessUser/sensitiveUnit/unitPopup.vue'
const unitPopup = ref()
const tableStore = new TableStore({
url: '/advance-boot/sgSensitiveUnit/list',
method: 'POST',
publicHeight: 300,
showPage: false,
column: [
{ title: '元器件名称', width: 110, field: 'name' },
{
title: '灵敏度', width: 80, field: 'sensitivity',
formatter: (row: any) => {
let temp
switch (row.sensitivity) {
case 1:
temp = '高'
break
case 2:
temp = '中'
break
case 3:
temp = '低'
break
default:
temp = '标准'
}
return temp
}
},
{
title: '耐受能力', width: 90, field: 'standardFlag',
formatter: (row: any) => {
return row.standardFlag == 0 ? '否' : '是'
}
},
{
title: '上限曲线',
children: [
{ title: '持续时间(ms)', width: '110', field: 'vtcTimeUpper' },
{ title: '暂降幅值(p.u.)', width: '110', field: 'vtcAmpUpper' }
]
},
{
title: '下限曲线',
children: [
{ title: '持续时间(ms)', width: '110', field: 'vtcTimeLower' },
{ title: '暂降幅值(p.u.)', width: '110', field: 'vtcAmpLower' }
]
},
{
title: '操作',
align: 'center',
render: 'buttons',
width: '140',
fixed: 'right',
buttons: [
{
name: 'update',
title: '编辑',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: row => {
unitPopup.value.open('修改元器件', row)
}
},
{
name: 'update',
title: '删除',
type: 'danger',
icon: 'el-icon-Delete',
render: 'confirmButton',
popconfirm: {
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonType: 'danger',
title: '确定删除吗?'
},
click: row => {
// deleteSgMachine(row.id).then(res => {
// ElMessage.success('删除成功')
// tableStore.index()
// })
}
}
]
}
],
beforeSearchFun: () => {
for (let key in tableStore.table.params) {
if (tableStore.table.params[key] === '') {
delete tableStore.table.params[key]
}
}
}
})
const getTableData = (tempId: string) => {
tableStore.table.params.machineId = tempId
tableStore.index()
}
/**********新增、编辑元器件************/
//新增进线信息
const add = () => {
const data = {
machineId: tableStore.table.params.machineId
}
unitPopup.value.open('新增元器件', data)
}
provide('tableStore', tableStore)
defineExpose({ getTableData })
</script>
<style >
.unitButton .table-header {
padding: 5px 15px !important;
}
</style>

View File

@@ -40,16 +40,17 @@
</el-form-item>
<el-form-item label='企业照片'>
<div>
<el-image style="width: 200px;height: 200px;" :src='userLogo.url' :preview-src-list="[userLogo.url]" v-if="userLogo.url"></el-image>
<el-upload
action=''
:show-file-list="false"
:auto-upload='false'
accept='.png,.jpg'
:on-change='chooseImage'
>
<el-button type="primary">上传图片</el-button>
</el-upload>
<el-image style='width: 200px;height: 200px;' :src='userLogo.url'
:preview-src-list='[userLogo.url]' v-if='userLogo.url'></el-image>
<el-upload
action=''
:show-file-list='false'
:auto-upload='false'
accept='.png,.jpg'
:on-change='chooseImage'
>
<el-button type='primary'>上传图片</el-button>
</el-upload>
</div>
</el-form-item>
</el-tab-pane>
@@ -57,10 +58,6 @@
<el-tab-pane label='进线' name='incomingLine'>
<IncomingTable ref='incomingTable'></IncomingTable>
</el-tab-pane>
<el-tab-pane label='生产线' name='productLine'>
生产线
</el-tab-pane>
</el-tabs>
</el-form>
</el-scrollbar>
@@ -75,7 +72,7 @@
</el-dialog>
</template>
<script lang='ts' setup>
import { ref, inject, onMounted, reactive, provide, nextTick } from 'vue'
import { ref, inject, reactive, nextTick } from 'vue'
import { ElMessage } from 'element-plus'
import type { UploadProps, UploadUserFile } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
@@ -106,7 +103,7 @@ const dialogVisibleLogo = ref(false)
const form = reactive<anyObj>({
id: '',
userName: '',
keyUser: '',
keyUser: '1',
industry: '',
addr: [],
addrStrOption: '',
@@ -126,6 +123,7 @@ const resetForm = () => {
if (formRef.value) {
formRef.value.resetFields()
}
}
const open = (text: string, data?: anyObj) => {
@@ -140,7 +138,7 @@ const open = (text: string, data?: anyObj) => {
}
form.addr = data.addr.split('/')
form.keyUser = String(data.keyUser)
if(form.userLogo){
if (form.userLogo) {
userLogo.url = fullUrl(form.userLogo)
// 图片的name我不知道
}

View File

@@ -0,0 +1,163 @@
<!--业务用户管理界面-->
<template>
<div class='default-main'>
<TableHeader>
<template v-slot:select>
<el-form-item label='用户'>
<el-select v-model='tableStore.table.params.userId' filterable clearable>
<el-option
v-for='item in userListData'
:key='item.id'
:label='item.userName'
:value='item.id'
/>
</el-select>
</el-form-item>
</template>
<template v-slot:operation>
<el-button type='primary' @click='add' class='ml10' :icon='Plus'>新增治理方案</el-button>
</template>
</TableHeader>
<!--表格-->
<Table ref='tableRef' isGroup></Table>
</div>
</template>
<script setup lang='ts'>
import { Plus } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue'
import { onMounted, provide, ref } from 'vue'
import { useRouter } from 'vue-router'
import { deleteSgUser, sgUserList } from '@/api/advance-boot/sgGroven/sgUser'
defineOptions({
name: 'governSchemeHistory'
})
const { push } = useRouter()
const userListData: any = ref([])
const tableStore = new TableStore({
url: '/advance-boot/sgUser/list',
method: 'POST',
column: [
{ title: '序号', type: 'seq', width: 80 },
{ title: '用户', field: 'userName' },
{ title: '生产线名称', field: 'productLineName' },
{ title: '期望回报周期', field: 'payBackPeriod' },
{ title: '数据时间范围', field: 'timeScope' },
{ title: '治理容量', field: 'governPower' },
{
title: '最佳方案',
children: [
{
title: '方案名称', width: '110', field: 'schemeType',
formatter: (row: any) => {
let temp
switch (row.schemeType) {
case 1:
temp = 'AVC'
break
case 2:
temp = 'AVC-RTS'
break
case 3:
temp = '快切'
break
default:
temp = 'UPS'
}
return temp
}
},
{ title: '初期投资(万元)', width: '110', field: 'initialInvest' },
{ title: '投资回收期', width: '110', field: 'payBackYear' },
{ title: '治理效果(万元/年)', width: '110', field: 'governEffectMoney' }
]
},
{
title: '操作',
align: 'center',
width: '150',
render: 'buttons',
buttons: [
{
name: 'productSetting',
title: '详情',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: row => {
push(`/admin/businessUserRouter/productLine?id=${row.id}`)
}
},
{
name: 'update',
title: '删除',
type: 'danger',
icon: 'el-icon-Delete',
render: 'confirmButton',
popconfirm: {
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonType: 'danger',
title: '确定删除吗?'
},
click: row => {
deleteSgUser(row.id).then(res => {
ElMessage.success('删除成功')
tableStore.index()
})
}
}
]
}
],
beforeSearchFun: () => {
if (tableStore.table.params.addr) {
tableStore.table.params.addrStrOption = tableStore.table.params.addr.map(tempArray => tempArray.join('/'))
}
for (let key in tableStore.table.params) {
if (tableStore.table.params[key] === '') {
delete tableStore.table.params[key]
}
}
}
})
onMounted(() => {
// 加载数据
tableStore.index()
})
tableStore.table.params.userId = ''
provide('tableStore', tableStore)
//初始化用户下拉选择框
const initUserSelect = async () => {
await sgUserList().then(res => {
if (res.data && res.data.length > 0) {
userListData.value = res.data
}
})
}
initUserSelect()
//新增用户信息
const add = () => {
let userId = undefined
if (tableStore.table.params.userId) {
userId = tableStore.table.params.userId
}
push(`/admin/sagGovernScheme/schemeCalc?userId=${userId}`)
}
</script>

View File

@@ -0,0 +1,529 @@
<!--暂降治理参数准备页面-->
<template>
<el-form :inline='false' :model='form' label-width='135px' :rules='rules' ref='formRef'>
<!--基础数据-->
<div class='singleParamContent'>
<el-divider content-position='left' class='divider'>
<span class='dividerFontStyle'>基本信息</span>
</el-divider>
<el-row>
<el-col :span='7'>
<el-form-item label='用户' prop='userId'>
<el-select v-model='form.userId' @change='changeUser'>
<el-option
v-for='item in userListData'
:key='item.id'
:label='item.userName'
:value='item.id'
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span='7' :offset='1'>
<el-form-item label='生产线' prop='productLineId'>
<el-select v-model='form.productLineId' filterable>
<el-option
v-for='item in productLineData'
:key='item.id'
:label='item.name'
:value='item.id'
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span='9'>
<el-button style='height: 72px;position: absolute;right: 0;' type='primary' @click='calcSag'>开始评估
</el-button>
</el-col>
<el-col :span='7'>
<el-form-item label='期望回收周期' prop='payBackPeriod'>
<el-select v-model='form.payBackPeriod'>
<el-option
v-for='item in 5'
:key='item'
:label='item+"年"'
:value='item'
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span='12' :offset='1'>
<el-form-item label='参考数据范围' style='grid-column: span 2; max-width: unset'>
<date-picker ref='datePickerRef'></date-picker>
</el-form-item>
</el-col>
</el-row>
</div>
<!--UPS参数-->
<div class='singleParamContent'>
<el-divider content-position='left' class='divider'>
<span class='dividerFontStyle'>UPS补偿</span>
</el-divider>
<el-row>
<el-col :span='7'>
<el-form-item label='购置价格' prop='ups.price'>
<el-input
v-model='form.ups.price'
clearable
>
<template #append>万元/kVA</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='7' :offset='1'>
<el-form-item label='补偿能力' prop='ups.compensation'>
<el-input
v-model='form.ups.compensation'
clearable
>
<template #append>p.u.</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='7' :offset='1'>
<el-form-item label='年维护费' prop='ups.maintainFee'>
<el-input
v-model='form.ups.maintainFee'
clearable
>
<template #append>万元/kVA</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='7'>
<el-form-item label='响应时间' prop='ups.responseTime'>
<el-input
v-model='form.ups.responseTime'
clearable
>
<template #append>ms</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='7' :offset='1'>
<el-form-item label='后备时间' prop='ups.backupTime'>
<el-input
v-model='form.ups.backupTime'
clearable
>
<template #append>s</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
</div>
<!--AVC参数-->
<div class='singleParamContent'>
<el-divider content-position='left' class='divider'>
<span class='dividerFontStyle'>AVC补偿</span>
</el-divider>
<el-row>
<el-col :span='7'>
<el-form-item label='购置价格' prop='avc.price'>
<el-input
v-model='form.avc.price'
clearable
>
<template #append>万元/kVA</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='7' :offset='1'>
<el-form-item label='补偿能力' prop='avc.compensation'>
<el-input
v-model='form.avc.compensation'
clearable
>
<template #append>p.u.</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='7' :offset='1'>
<el-form-item label='年维护费' prop='avc.maintainFee'>
<el-input
v-model='form.avc.maintainFee'
clearable
>
<template #append>万元/kVA</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='7'>
<el-form-item label='响应时间' prop='avc.responseTime'>
<el-input
v-model='form.avc.responseTime'
clearable
>
<template #append>ms</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='7' :offset='1'>
<el-form-item label='后备时间' prop='avc.backupTime'>
<el-input
v-model='form.avc.backupTime'
clearable
>
<template #append>s</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
</div>
<!--快切参数-->
<div class='singleParamContent'>
<el-divider content-position='left' class='divider'>
<span class='dividerFontStyle'>快切开关</span>
</el-divider>
<el-row>
<el-col :span='7'>
<el-form-item label='备用进线' prop='quick.incomingLineId'>
<el-select v-model='form.quick.incomingLineId'>
<el-option
v-for='item in incomingLineListData'
:key='item.id'
:label='item.name'
:value='item.id'
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span='7' :offset='1'>
<el-form-item label='设备容量' prop='quick.governMachinePower'>
<el-input
v-model='form.quick.governMachinePower'
clearable
>
<template #append>kVA</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='7' :offset='1'>
<el-form-item label='购置价格' prop='quick.price'>
<el-input
v-model='form.quick.price'
clearable
>
<template #append>万元</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='7'>
<el-form-item label='建设成本' prop='quick.buildFee'>
<el-input
v-model='form.quick.buildFee'
clearable
>
<template #append>kVA</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='7' :offset='1'>
<el-form-item label='年维护费用' prop='quick.quickMaintainFee'>
<el-input
v-model='form.quick.quickMaintainFee'
clearable
>
<template #append>万元</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span='7' :offset='1'>
<el-form-item label='动作时间' prop='quick.actionTime'>
<el-input
v-model='form.quick.actionTime'
clearable
>
<template #append>ms</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
</template>
<script setup lang='ts'>
import DatePicker from '@/components/form/datePicker/index.vue'
import { ref, reactive, onMounted } from 'vue'
import emitter from '@/utils/emitter'
import { numberRegex } from '@/utils/regexPattern'
import { querySgProductLineByUserId } from '@/api/advance-boot/sgGroven/sgProductLine'
import { ElMessage } from 'element-plus'
import { sgUserList } from '@/api/advance-boot/sgGroven/sgUser'
import { querySgIncomingLineByUserId } from '@/api/advance-boot/sgGroven/incomingLine'
import { calc } from '@/api/advance-boot/sgGroven/sgScheme'
defineOptions({
name: 'calcParamPrepare'
})
const props = defineProps(['userId'])
const productLineOwnIncomingLineId = ref('')
const formRef = ref()
const datePickerRef = ref()
const userListData: any = ref([])
const productLineData: any = ref([])
const incomingLineListData: any = ref([])
// 注意不要和表单ref的命名冲突
let form = reactive({
userId: '',
productLineId: '',
startTime: '',
endTime: '',
payBackPeriod: 5,
ups: {
price: 0.145,
compensation: 1,
maintainFee: 0.001,
responseTime: 1,
backupTime: 900
},
avc: {
price: 0.25,
compensation: 0.3,
maintainFee: 0.001,
responseTime: 1,
backupTime: 3
},
quick: {
governMachinePower: 252,
price: 50,
buildFee: 10,
quickMaintainFee: 0.5,
actionTime: 20,
incomingLineId: ''
}
})
//form表单校验规则
const rules = {
userId: [{ required: true, message: '用户必选', trigger: 'change' }],
productLineId: [{ required: true, message: '生产线必选', trigger: 'change' }],
payBackPeriod: [{ required: true, message: '期望回收周期必填', trigger: 'change' }],
ups: {
price: [
{ required: true, message: '购置价格不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
compensation: [
{ required: true, message: '补偿能力不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
maintainFee: [
{ required: true, message: '年维护费不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
responseTime: [
{ required: true, message: '响应时间不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
backupTime: [
{ required: true, message: '后备时间不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
]
},
avc: {
price: [
{ required: true, message: '购置价格不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
compensation: [
{ required: true, message: '补偿能力不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
maintainFee: [
{ required: true, message: '年维护费不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
responseTime: [
{ required: true, message: '响应时间不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
backupTime: [
{ required: true, message: '后备时间不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
]
},
quick: {
governMachinePower: [
{ required: true, message: '设备容量不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
price: [
{ required: true, message: '购置价格不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
buildFee: [
{ required: true, message: '构建成本不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
quickMaintainFee: [
{ required: true, message: '年维护费不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
actionTime: [
{ required: true, message: '动作时间不能为空', trigger: 'blur' },
{ pattern: numberRegex, message: '请输入有效的数值', trigger: 'blur' }
],
incomingLineId: [{ required: true, message: '备用进线必选', trigger: 'change' }]
}
}
/**
* 用户下拉框发生更新
*/
const changeUser = async () => {
await querySgProductLineByUserId(form.userId).then(res => {
if (res.data && res.data.length > 0) {
productLineData.value = res.data
//并且默认选中第一个生产线
const productLineObj = productLineData.value[0]
form.productLineId = productLineObj.id
} else {
form.productLineId = ''
productLineData.value = []
ElMessage.error('请先创建生产线')
}
})
}
//初始化用户下拉框
const initUserData = async () => {
//获取用户数据
await sgUserList().then(res => {
if (res.data && res.data.length > 0) {
userListData.value = res.data
} else {
ElMessage.error('请先创建用户')
}
})
//如果传了用户id,则用,否则默认第一个用户
if (props.userId !== 'undefined') {
form.userId = String(props.userId)
} else {
form.userId = userListData.value[0].id
}
//查询生产线数据赋值
await querySgProductLineByUserId(form.userId).then(res => {
if (res.data && res.data.length > 0) {
productLineData.value = res.data
//并且默认选中第一个生产线
const productLineObj = productLineData.value[0]
form.productLineId = productLineObj.id
if (!productLineObj.incomingLineId) {
ElMessage.error('该生产线没有关联实际进线')
} else {
productLineOwnIncomingLineId.value = productLineObj.incomingLineId
}
} else {
form.productLineId = ''
productLineData.value = []
ElMessage.error('请先创建生产线')
}
})
//查询进线数据赋值
await querySgIncomingLineByUserId(form.userId).then(res => {
if (res.data && res.data.length > 0) {
//将当前生产线的进线过滤掉,剩余的交给备用进行选择
let allIncomingLineData = res.data.filter((obj: any) => obj.incomingLineId !== productLineOwnIncomingLineId.value)
if (allIncomingLineData.length > 0) {
form.quick.incomingLineId = allIncomingLineData[0].id
incomingLineListData.value = allIncomingLineData
} else {
form.quick.incomingLineId = ''
incomingLineListData.value = []
ElMessage.error('请先创建备用进线')
}
} else {
form.quick.incomingLineId = ''
incomingLineListData.value = []
ElMessage.error('请先创建备用进线')
}
})
}
/**
* 挂载时初始化数据内容
*/
onMounted(() => {
initUserData()
form.startTime = datePickerRef.value.timeValue[0]
form.endTime = datePickerRef.value.timeValue[1]
})
/**
* 计算暂降治理
*/
function calcSag() {
formRef.value.validate(async (valid: any, errorMsg: any) => {
if (valid) {
//将所有参数传递到后端进行数据计算
form.startTime = datePickerRef.value.timeValue[0]
form.endTime = datePickerRef.value.timeValue[1]
await calc(form).then(res => {
//先通知父组件打开历史页面
emitter.emit('schemeRadio', '评估计算结果')
//再将历史数据传递到历史页面
emitter.emit('send-scheme-result', res.data)
})
} else {
for (const item in errorMsg) {
ElMessage.error(errorMsg[item][0].message)
}
}
})
}
</script>
<style scoped>
.divider {
font-family: AlimamaDongFangDaKai;
}
@keyframes colorChange {
0% {
color: #205CE8;
}
100% {
color: #32B9FC;
}
}
.dividerFontStyle {
font-size: 25px !important;
animation: colorChange 3s infinite;
}
.singleParamContent {
padding: 5px 30px;
}
</style>

View File

@@ -0,0 +1,81 @@
<!--最佳治理方案计算页面-->
<template>
<div ref='governTotalContent' class='governTotalContentDiv'>
<!--返回按钮-->
<back-component />
<!--切换radio的导航-->
<div class='schemeNav'>
<el-radio-group v-model='radio'>
<el-radio-button label='治理评估准备' />
<el-radio-button label='评估计算结果' />
</el-radio-group>
</div>
<div class='schemeContent' ref='schemeContent'>
<calc-param v-show='radio=="治理评估准备"' :user-id='query.userId' />
<scheme-result v-show='radio=="评估计算结果"' />
</div>
</div>
</template>
<script setup lang='ts'>
import { ref, reactive, onMounted, onUnmounted } from 'vue'
import emitter from '@/utils/emitter'
import { mainHeight } from '@/utils/layout'
import { useRoute } from 'vue-router'
import BackComponent from '@/components/icon/back/index.vue'
import CalcParam from '@/views/pqs/voltageSags/sagGovern/scheme/schemeCalc/calcParam.vue'
import SchemeResult from '@/views/pqs/voltageSags/sagGovern/scheme/schemeCalc/schemeResult.vue'
const { query } = useRoute()
const governTotalContent = ref()
const schemeContent = ref()
const radio = ref('治理评估准备')
emitter.on('schemeRadio', (value: strig) => {
radio.value = value
})
onMounted(() => {
governTotalContent.value.style.height = mainHeight().height
schemeContent.value.style.height = mainHeight(75).height
schemeContent.value.style.maxheight = mainHeight(75).height
schemeContent.value.style.overflowY = 'scroll'
// form.startTime = datePickerRef.value.timeValue[0]
// form.endTime = datePickerRef.value.timeValue[1]
})
//解绑数据监听
onUnmounted(() => {
// 解绑事件
emitter.off('schemeRadio')
})
</script>
<style scoped>
.governTotalContentDiv {
background-clip: content-box;
display: -webkit-flex; /* Safari */
display: flex;
flex-wrap: wrap;
background-color: #FFFFFF;
padding: 10px;
}
.schemeNav {
height: 55px;
background: #FFFFFF;
width: 100%;
display: flex;
justify-content: center;
}
.schemeContent {
width: 100%;
}
</style>

View File

@@ -0,0 +1,34 @@
<!--各方案治理后的数据回显-->
<template>
<div>
<h1>待回显</h1>
</div>
</template>
<script setup lang='ts'>
import emitter from '@/utils/emitter'
import DatePicker from '@/components/form/datePicker/index.vue'
import { ref, reactive, onMounted, onUnmounted } from 'vue'
import { numberRegex } from '@/utils/regexPattern'
import { querySgProductLineByUserId } from '@/api/advance-boot/sgGroven/sgProductLine'
import { ElMessage } from 'element-plus'
defineOptions({
name: 'schemeResult'
})
//监听治理后返回的数据
// 绑定事件
emitter.on('send-scheme-result', (value:any) => {
console.log('send-scheme-result事件被触发', value)
})
//解绑数据监听
onUnmounted(() => {
// 解绑事件
emitter.off('send-scheme-result')
})
</script>
<style>
</style>