修改 测试脚本页面
This commit is contained in:
282
frontend/src/components/echarts/line/index.vue
Normal file
282
frontend/src/components/echarts/line/index.vue
Normal file
@@ -0,0 +1,282 @@
|
|||||||
|
<template>
|
||||||
|
<div class="chart">
|
||||||
|
<div ref="chartRef" class="my-chart" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { onBeforeUnmount, onMounted, ref, defineExpose, watch, nextTick } from 'vue'
|
||||||
|
// import echarts from './echarts'
|
||||||
|
import * as echarts from 'echarts' // 全引入
|
||||||
|
// import 'echarts/lib/component/dataZoom'
|
||||||
|
|
||||||
|
const color = [
|
||||||
|
'var(--el-color-primary)',
|
||||||
|
'#07CCCA',
|
||||||
|
'#00BFF5',
|
||||||
|
'#FFBF00',
|
||||||
|
'#77DA63',
|
||||||
|
'#D5FF6B',
|
||||||
|
'#Ff6600',
|
||||||
|
'#FF9100',
|
||||||
|
'#5B6E96',
|
||||||
|
'#66FFCC',
|
||||||
|
'#B3B3B3'
|
||||||
|
]
|
||||||
|
|
||||||
|
const chartRef = ref<HTMLDivElement>()
|
||||||
|
|
||||||
|
const props = defineProps(['options', 'isInterVal', 'pieInterVal'])
|
||||||
|
let chart: echarts.ECharts | any = null
|
||||||
|
const resizeHandler = () => {
|
||||||
|
// 不在视野中的时候不进行resize
|
||||||
|
if (!chartRef.value) return
|
||||||
|
if (chartRef.value.offsetHeight == 0) return
|
||||||
|
chart.getZr().painter.getViewportRoot().style.display = 'none'
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
chart.resize()
|
||||||
|
chart.getZr().painter.getViewportRoot().style.display = ''
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const initChart = () => {
|
||||||
|
if (!props.isInterVal && !props.pieInterVal) {
|
||||||
|
chart?.dispose()
|
||||||
|
}
|
||||||
|
// chart?.dispose()
|
||||||
|
chart = echarts.init(chartRef.value as HTMLDivElement)
|
||||||
|
const options = {
|
||||||
|
title: {
|
||||||
|
left: 'center',
|
||||||
|
// textStyle: {
|
||||||
|
color: '#000',
|
||||||
|
fontSize: 18,
|
||||||
|
// },
|
||||||
|
...(props.options?.title || null)
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow',
|
||||||
|
label: {
|
||||||
|
color: '#fff',
|
||||||
|
fontSize: 16
|
||||||
|
}
|
||||||
|
},
|
||||||
|
textStyle: {
|
||||||
|
color: '#fff',
|
||||||
|
fontStyle: 'normal',
|
||||||
|
opacity: 0.35,
|
||||||
|
fontSize: 14
|
||||||
|
},
|
||||||
|
backgroundColor: 'rgba(0,0,0,0.55)',
|
||||||
|
borderWidth: 0,
|
||||||
|
confine: true,
|
||||||
|
...(props.options?.tooltip || null)
|
||||||
|
},
|
||||||
|
|
||||||
|
legend: {
|
||||||
|
right: 20,
|
||||||
|
top: 0,
|
||||||
|
itemGap: 10,
|
||||||
|
itemStyle: {},
|
||||||
|
// textStyle: {
|
||||||
|
fontSize: 12,
|
||||||
|
padding: [2, 0, 0, 0], //[上、右、下、左]
|
||||||
|
// },
|
||||||
|
itemWidth: 15,
|
||||||
|
itemHeight: 10,
|
||||||
|
...(props.options?.legend || null)
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
top: '60px',
|
||||||
|
left: '30px',
|
||||||
|
right: '70px',
|
||||||
|
bottom: props.options?.options?.dataZoom === null ? '10px' : '40px',
|
||||||
|
containLabel: true,
|
||||||
|
...(props.options?.grid || null)
|
||||||
|
},
|
||||||
|
xAxis: props.options?.xAxis ? handlerXAxis() : null,
|
||||||
|
yAxis: props.options?.yAxis ? handlerYAxis() : null,
|
||||||
|
dataZoom: props.options?.dataZoom || [
|
||||||
|
{
|
||||||
|
type: 'inside',
|
||||||
|
height: 13,
|
||||||
|
start: 0,
|
||||||
|
bottom: '20px',
|
||||||
|
end: 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
start: 0,
|
||||||
|
height: 13,
|
||||||
|
bottom: '20px',
|
||||||
|
end: 100
|
||||||
|
}
|
||||||
|
],
|
||||||
|
color: props.options?.color || color,
|
||||||
|
series: props.options?.series,
|
||||||
|
...props.options?.options
|
||||||
|
}
|
||||||
|
// console.log(options.series,"获取x轴");
|
||||||
|
handlerBar(options)
|
||||||
|
|
||||||
|
// 处理柱状图
|
||||||
|
chart.setOption(options, true)
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
chart.resize()
|
||||||
|
}, 0)
|
||||||
|
}
|
||||||
|
const handlerBar = (options: any) => {
|
||||||
|
if (Array.isArray(options.series)) {
|
||||||
|
options.series.forEach((item: any) => {
|
||||||
|
if (item.type === 'bar') {
|
||||||
|
item.barMinHeight = 10
|
||||||
|
item.barMaxWidth = 20
|
||||||
|
item.itemStyle = Object.assign(
|
||||||
|
{
|
||||||
|
color: (params: any) => {
|
||||||
|
if (params.value == 0 || params.value == 3.14159) {
|
||||||
|
return '#ccc'
|
||||||
|
} else {
|
||||||
|
return props.options?.color
|
||||||
|
? props.options?.color[params.seriesIndex]
|
||||||
|
: color[params.seriesIndex]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
item.itemStyle
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const handlerYAxis = () => {
|
||||||
|
let temp = {
|
||||||
|
type: 'value',
|
||||||
|
nameGap: 15,
|
||||||
|
nameTextStyle: {
|
||||||
|
color: '#000'
|
||||||
|
},
|
||||||
|
splitNumber: 5,
|
||||||
|
minInterval: 1,
|
||||||
|
axisLine: {
|
||||||
|
show: true,
|
||||||
|
lineStyle: {
|
||||||
|
color: '#000'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
color: '#000',
|
||||||
|
fontSize: 14,
|
||||||
|
formatter: function (value) {
|
||||||
|
return value.toFixed(0) // 格式化显示为一位小数
|
||||||
|
}
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
lineStyle: {
|
||||||
|
// 使用深浅的间隔色
|
||||||
|
color: ['#ccc'],
|
||||||
|
type: 'dashed',
|
||||||
|
opacity: 0.5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// props.options?.xAxis 是数组还是对象
|
||||||
|
if (Array.isArray(props.options?.yAxis)) {
|
||||||
|
return props.options?.yAxis.map((item: any) => {
|
||||||
|
return {
|
||||||
|
...temp,
|
||||||
|
...item
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
...temp,
|
||||||
|
...props.options?.yAxis
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const handlerXAxis = () => {
|
||||||
|
let temp = {
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
nameTextStyle: {
|
||||||
|
color: '#000'
|
||||||
|
},
|
||||||
|
axisLine: {
|
||||||
|
// lineStyle: {
|
||||||
|
color: '#000'
|
||||||
|
// }
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
// textStyle: {
|
||||||
|
fontFamily: 'dinproRegular',
|
||||||
|
color: '#000',
|
||||||
|
fontSize: '12'
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
// boundaryGap: false,
|
||||||
|
}
|
||||||
|
// props.options?.xAxis 是数组还是对象
|
||||||
|
if (Array.isArray(props.options?.xAxis)) {
|
||||||
|
return props.options?.xAxis.map((item: any) => {
|
||||||
|
return {
|
||||||
|
...temp,
|
||||||
|
...item
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
...temp,
|
||||||
|
...props.options?.xAxis
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let throttle: ReturnType<typeof setTimeout>
|
||||||
|
// 动态计算table高度
|
||||||
|
const resizeObserver = new ResizeObserver(entries => {
|
||||||
|
for (const entry of entries) {
|
||||||
|
if (throttle) {
|
||||||
|
clearTimeout(throttle)
|
||||||
|
}
|
||||||
|
throttle = setTimeout(() => {
|
||||||
|
resizeHandler()
|
||||||
|
}, 100)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
onMounted(() => {
|
||||||
|
initChart()
|
||||||
|
resizeObserver.observe(chartRef.value!)
|
||||||
|
})
|
||||||
|
defineExpose({ initChart })
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
resizeObserver.unobserve(chartRef.value!)
|
||||||
|
chart?.dispose()
|
||||||
|
})
|
||||||
|
watch(
|
||||||
|
() => props.options,
|
||||||
|
(newVal, oldVal) => {
|
||||||
|
initChart()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.el-button {
|
||||||
|
position: absolute;
|
||||||
|
right: 0px;
|
||||||
|
top: -60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.my-chart {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -85,6 +85,22 @@ export const staticRouter: RouteRecordRaw[] = [
|
|||||||
isKeepAlive: true,
|
isKeepAlive: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "/machine/testScriptAdd",
|
||||||
|
name: "testScriptAdd",
|
||||||
|
component: () => import("@/views/machine/testScript/components/testScriptPopup.vue"),
|
||||||
|
meta: {
|
||||||
|
title: "检测脚本配置",
|
||||||
|
icon: "List",
|
||||||
|
isLink: "",
|
||||||
|
hideTab:true,
|
||||||
|
parentPath:'/machine/testScript',
|
||||||
|
isHide: false,
|
||||||
|
isFull: false,
|
||||||
|
isAffix: false,
|
||||||
|
isKeepAlive: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
// 错误页面路由
|
// 错误页面路由
|
||||||
{
|
{
|
||||||
path: "/403",
|
path: "/403",
|
||||||
|
|||||||
@@ -0,0 +1,92 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-table
|
||||||
|
:data="tableData"
|
||||||
|
:header-cell-style="{
|
||||||
|
textAlign: 'center',
|
||||||
|
backgroundColor: '#003078',
|
||||||
|
color: '#fff'
|
||||||
|
}"
|
||||||
|
stripe
|
||||||
|
height="calc(100vh - 335px)"
|
||||||
|
:style="{ overflow: 'hidden' }"
|
||||||
|
row-key="id"
|
||||||
|
default-expand-all
|
||||||
|
>
|
||||||
|
<el-table-column prop="name" label="指标" show-overflow-tooltip width="180px" />
|
||||||
|
<el-table-column align="center" label="参与误差比较">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-switch v-model="row.compare" v-if="row.show">
|
||||||
|
<template #active-action>
|
||||||
|
<span>√</span>
|
||||||
|
</template>
|
||||||
|
<template #inactive-action>
|
||||||
|
<span>×</span>
|
||||||
|
</template>
|
||||||
|
</el-switch>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="是否启用">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-switch v-model="row.enable" v-if="row.show">
|
||||||
|
<template #active-action>
|
||||||
|
<span>√</span>
|
||||||
|
</template>
|
||||||
|
<template #inactive-action>
|
||||||
|
<span>×</span>
|
||||||
|
</template>
|
||||||
|
</el-switch>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, reactive } from 'vue'
|
||||||
|
import type { Dict } from '@/api/system/dictionary/interface'
|
||||||
|
import { getDictTreeList } from '@/api/system/dictionary/dictTree'
|
||||||
|
interface TabOption {
|
||||||
|
label: string
|
||||||
|
name: string
|
||||||
|
children?: TabOption[]
|
||||||
|
}
|
||||||
|
const props = defineProps({
|
||||||
|
options: {
|
||||||
|
type: Array as PropType<TabOption[]>,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const tableData = ref<any[]>([])
|
||||||
|
onMounted(async () => {
|
||||||
|
const resDictTree: Dict.ResDictTree = {
|
||||||
|
name: '脚本-误差',
|
||||||
|
id: '',
|
||||||
|
pid: '',
|
||||||
|
pids: '',
|
||||||
|
code: 'Script_Error',
|
||||||
|
sort: 0
|
||||||
|
}
|
||||||
|
let data = await getDictTreeList(resDictTree)
|
||||||
|
|
||||||
|
data.data[0].children.forEach((item: any, i: number) => {
|
||||||
|
tableData.value.push({
|
||||||
|
id: item.id,
|
||||||
|
name: item.name,
|
||||||
|
show: false,
|
||||||
|
children: []
|
||||||
|
})
|
||||||
|
item.children.forEach((k: any) => {
|
||||||
|
tableData.value[i].children.push({
|
||||||
|
id: k.id,
|
||||||
|
name: k.name,
|
||||||
|
show: true,
|
||||||
|
compare: false,
|
||||||
|
enable: false
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// tableData.value = data.data[0].children || []
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
@@ -1,95 +1,158 @@
|
|||||||
import { ref } from "vue"
|
import { ref } from "vue"
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<el-dialog :title="dialogTitle" v-model='dialogVisible' @close="close" v-bind="dialogBig" >
|
<el-dialog :title="dialogTitle" v-model="dialogVisible" @close="close" v-bind="dialogBig" width="1400">
|
||||||
<div class='table-box'>
|
<div class="table-box">
|
||||||
<ProTable
|
<ProTable
|
||||||
ref='proTable'
|
ref="proTable"
|
||||||
:columns='columns'
|
:columns="columns"
|
||||||
:request-api="getTableList"
|
:request-api="getTableList"
|
||||||
:pagination="false"
|
:pagination="false"
|
||||||
:toolButton ='false'
|
:toolButton="false"
|
||||||
:style="{ height: '250px',maxHeight: '400px',overflow:'hidden'}"
|
:style="{ height: '530px', maxHeight: '530px', overflow: 'hidden' }"
|
||||||
>
|
>
|
||||||
<!-- :data='testScriptData' 如果要显示静态数据,就切换该配置 -->
|
<!-- :data='testScriptData' 如果要显示静态数据,就切换该配置 -->
|
||||||
<!-- 表格 header 按钮 -->
|
<!-- 表格 header 按钮 -->
|
||||||
<template #tableHeader='scope'>
|
<template #tableHeader="scope">
|
||||||
<el-button v-auth.testScript="'add'" type='primary' :icon='CirclePlus' @click="openDialog('add')">新增</el-button>
|
<el-button v-auth.testScript="'add'" type="primary" :icon="CirclePlus" @click="add">新增</el-button>
|
||||||
<el-button v-auth.testScript="'delete'" type='danger' :icon='Delete' plain :disabled='!scope.isSelected'
|
<el-button
|
||||||
@click='batchDelete(scope.selectedListIds)'>
|
v-auth.testScript="'delete'"
|
||||||
删除
|
type="danger"
|
||||||
</el-button>
|
:icon="Delete"
|
||||||
|
plain
|
||||||
|
:disabled="!scope.isSelected"
|
||||||
|
@click="batchDelete(scope.selectedListIds)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
<!-- 表格操作 -->
|
<!-- 表格操作 -->
|
||||||
<template #operation='scope'>
|
<template #operation="scope">
|
||||||
<el-button v-auth.testScript="'upgrade'" type='primary' v-if="scope.row.type !== 1" link :icon='Share' @click='updateType(scope.row)'>复制</el-button>
|
<el-button
|
||||||
<el-button v-auth.testScript="'edit'" type='primary' link :icon='EditPen' :model-value="false" @click="openDialog('edit', scope.row)">编辑</el-button>
|
v-auth.testScript="'upgrade'"
|
||||||
<el-button v-auth.testScript="'delete'" type='primary' link :icon='Delete' @click='handleDelete(scope.row)'>删除</el-button>
|
type="primary"
|
||||||
|
v-if="scope.row.type !== 1"
|
||||||
|
link
|
||||||
|
:icon="Share"
|
||||||
|
@click="copy(scope.row)"
|
||||||
|
>
|
||||||
|
复制
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
v-auth.testScript="'edit'"
|
||||||
|
type="primary"
|
||||||
|
link
|
||||||
|
:icon="EditPen"
|
||||||
|
:model-value="false"
|
||||||
|
@click="edit(scope.row)"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
v-auth.testScript="'delete'"
|
||||||
|
type="primary"
|
||||||
|
link
|
||||||
|
:icon="Delete"
|
||||||
|
@click="batchDelete(scope.row)"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
</ProTable>
|
</ProTable>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<div >
|
<div>
|
||||||
<el-button @click='close()'>取 消</el-button>
|
<el-button @click="close()">取 消</el-button>
|
||||||
<el-button type="primary" @click='save()'>保存</el-button>
|
<el-button type="primary" @click="save">保存</el-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
<el-dialog :title="dialogTitle" v-model="showForm" @close="close" width="500">
|
||||||
|
<el-form ref="form" :model="form" label-width="auto">
|
||||||
|
<el-form-item label="参考设定值类型" prop="name">
|
||||||
|
<el-input v-model="form.name" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="参考设定值子类型" prop="standardName">
|
||||||
|
<el-input v-model="form.standardName" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="参考设定值" prop="standardTime">
|
||||||
|
<el-input v-model="form.standardTime" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<div>
|
||||||
|
<el-button @click="close()">取 消</el-button>
|
||||||
|
<el-button type="primary" @click="save">保 存</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
<SetValuePopup ref='setValuePopup' />
|
<SetValuePopup ref="setValuePopup" />
|
||||||
|
</template>
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { TestScript } from '@/api/device/interface/testScript'
|
import type { TestScript } from '@/api/device/interface/testScript'
|
||||||
import type { ColumnProps } from '@/components/ProTable/interface'
|
import type { ColumnProps } from '@/components/ProTable/interface'
|
||||||
import {reactive, ref } from 'vue'
|
import { CirclePlus, EditPen, Delete, Share } from '@element-plus/icons-vue'
|
||||||
|
import { reactive, ref } from 'vue'
|
||||||
import { dialogBig } from '@/utils/elementBind'
|
import { dialogBig } from '@/utils/elementBind'
|
||||||
|
const showForm = ref(false)
|
||||||
const dialogVisible = ref(false)
|
const dialogVisible = ref(false)
|
||||||
const dialogTitle = ref('')
|
const dialogTitle = ref('')
|
||||||
|
|
||||||
|
|
||||||
// 表格配置项
|
// 表格配置项
|
||||||
const columns = reactive<ColumnProps<TestScript.ResTestScript>[]>([
|
const columns = reactive<ColumnProps<TestScript.ResTestScript>[]>([
|
||||||
{ type: 'selection', fixed: 'left', width: 70 },
|
{ type: 'selection', fixed: 'left', width: 70 },
|
||||||
{ type: 'index', fixed: 'left', width: 70, label: '序号' },
|
{ type: 'index', fixed: 'left', width: 70, label: '序号' },
|
||||||
{
|
{
|
||||||
prop: 'name',
|
prop: 'name',
|
||||||
label: '参考设定值类型',
|
label: '参考设定值类型',
|
||||||
minWidth: 350,
|
minWidth: 350
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'standardName',
|
prop: 'standardName',
|
||||||
label: '参考设定值子类型',
|
label: '参考设定值子类型',
|
||||||
minWidth: 150,
|
minWidth: 150
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: 'standardTime',
|
prop: 'standardTime',
|
||||||
label: '参考设定值',
|
label: '参考设定值',
|
||||||
minWidth: 150,
|
minWidth: 150
|
||||||
},
|
},
|
||||||
{ prop: 'operation', label: '操作', fixed: 'right', width: 250 },
|
{ prop: 'operation', label: '操作', fixed: 'right', width: 250 }
|
||||||
])
|
])
|
||||||
|
const form = ref({
|
||||||
|
name: 220,
|
||||||
|
standardName: 0,
|
||||||
|
standardTime: 0
|
||||||
|
})
|
||||||
|
|
||||||
// 打开弹窗,可能是新增,也可能是编辑
|
// 打开弹窗,可能是新增,也可能是编辑
|
||||||
const open = (sign: string,row: any) => {
|
const open = (sign: string, row: any) => {
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
dialogTitle.value = sign === 'add'? '新增检测项目信息' : '编辑检测项目信息'
|
dialogTitle.value = sign === 'add' ? '新增检测项目信息' : '编辑检测项目信息'
|
||||||
|
}
|
||||||
|
const save = () => {
|
||||||
|
dialogVisible.value = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 关闭弹窗
|
// 关闭弹窗
|
||||||
const close = () => {
|
const close = () => {
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
}
|
}
|
||||||
|
// 新增
|
||||||
|
const add = () => {
|
||||||
|
showForm.value = true
|
||||||
|
}
|
||||||
|
//编辑
|
||||||
|
const edit = (row: any) => {}
|
||||||
|
// 复制
|
||||||
|
const copy = (row: any) => {}
|
||||||
|
//批量删除
|
||||||
|
const batchDelete = (row: any) => {}
|
||||||
// 对外映射
|
// 对外映射
|
||||||
defineExpose({ open })
|
defineExpose({ open })
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped></style>
|
||||||
|
|
||||||
</style>
|
|
||||||
|
|||||||
@@ -1,27 +1,46 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog :title="dialogTitle" v-model="dialogVisible" @close="close" v-bind="dialogBig" width="1400px">
|
<el-dialog :title="dialogTitle" v-model="dialogVisible" @close="close" v-bind="dialogBig" width="1500px">
|
||||||
<div class="dialog-content">
|
<div class="dialog-content">
|
||||||
|
<el-tabs type="border-card" class="right-tabs" style="height: 100%">
|
||||||
|
<el-tab-pane label="全局设置菜单">
|
||||||
|
<!-- 全局设置菜单内容 -->
|
||||||
|
<div style="height: 295px">
|
||||||
|
<el-radio-group v-model="radio">
|
||||||
|
<el-radio
|
||||||
|
v-for="item in tabChildren"
|
||||||
|
:key="item"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"
|
||||||
|
border
|
||||||
|
style="margin: 0 0 10px 10px"
|
||||||
|
/>
|
||||||
|
<!-- <el-radio v-for="item in tabChildren" :value="item.value" border>{{ item.label }}</el-radio> -->
|
||||||
|
</el-radio-group>
|
||||||
|
</div>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
<el-tabs type="border-card" class="left-tabs" style="height: 100%">
|
<el-tabs type="border-card" class="left-tabs" style="height: 100%">
|
||||||
<el-tab-pane label="输出菜单">
|
<el-tab-pane label="输出菜单">
|
||||||
<!-- 输出菜单内容 -->
|
<!-- 输出菜单内容 -->
|
||||||
<el-table
|
<el-table
|
||||||
:data="tableData"
|
:data="tableData"
|
||||||
:header-cell-style="{ textAlign: 'center', backgroundColor: '#003078', color: '#fff' }"
|
|
||||||
:cell-style="{ textAlign: 'center' }"
|
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
:style="{ height: '295px', overflow: 'hidden' }"
|
:style="{ height: '295px', overflow: 'hidden' }"
|
||||||
:show-header="false"
|
:show-header="false"
|
||||||
:span-method="arraySpanMethod"
|
:span-method="arraySpanMethod"
|
||||||
|
:cell-style="tableStyle.cellStyle"
|
||||||
|
:header-cell-style="{ textAlign: 'center', backgroundColor: '#003078', color: '#fff' }"
|
||||||
|
@row-click="handleRowClick"
|
||||||
>
|
>
|
||||||
<el-table-column prop="sort" label="相别" width="60" />
|
<el-table-column prop="sort" label="相别" width="60" align="center" />
|
||||||
<el-table-column prop="frequency" label="电压/电流" width="90" />
|
<el-table-column prop="frequency" label="电压/电流" align="center" width="90" />
|
||||||
<el-table-column prop="L1" label="值" width="180" />
|
<el-table-column prop="L1" label="值" width="180" align="center" />
|
||||||
<el-table-column label="操作" width="80">
|
<el-table-column label="操作" width="80">
|
||||||
<template #default="{}">
|
<template #default="{}">
|
||||||
<el-button type="info" :icon="Bottom"></el-button>
|
<el-button type="primary" :icon="Bottom"></el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作">
|
<el-table-column label="操作" align="center">
|
||||||
<template #default="{ row, $index }">
|
<template #default="{ row, $index }">
|
||||||
<el-button
|
<el-button
|
||||||
:type="buttonTypes[$index].channel || 'info'"
|
:type="buttonTypes[$index].channel || 'info'"
|
||||||
@@ -61,7 +80,7 @@
|
|||||||
<el-tabs type="border-card" class="right-tabs" style="height: 100%">
|
<el-tabs type="border-card" class="right-tabs" style="height: 100%">
|
||||||
<el-tab-pane label="全局设置菜单">
|
<el-tab-pane label="全局设置菜单">
|
||||||
<!-- 全局设置菜单内容 -->
|
<!-- 全局设置菜单内容 -->
|
||||||
<div style="height: 295px;">
|
<div style="height: 295px">
|
||||||
<div class="form-item-container">
|
<div class="form-item-container">
|
||||||
<el-form-item label="频率:" prop="name">
|
<el-form-item label="频率:" prop="name">
|
||||||
<div class="input-label-container">
|
<div class="input-label-container">
|
||||||
@@ -120,6 +139,28 @@ import TestScriptHarmTab from '@/views/machine/testScript/components/testScriptH
|
|||||||
import TestScriptInHarmTab from '@/views/machine/testScript/components/testScriptInHarmTab.vue'
|
import TestScriptInHarmTab from '@/views/machine/testScript/components/testScriptInHarmTab.vue'
|
||||||
import TestScriptFlickerTab from '@/views/machine/testScript/components/testScriptFlickerTab.vue'
|
import TestScriptFlickerTab from '@/views/machine/testScript/components/testScriptFlickerTab.vue'
|
||||||
import TestScriptDipTab from '@/views/machine/testScript/components/testScriptDipTab.vue'
|
import TestScriptDipTab from '@/views/machine/testScript/components/testScriptDipTab.vue'
|
||||||
|
const emit = defineEmits(['addTab'])
|
||||||
|
interface TabOption {
|
||||||
|
label: string
|
||||||
|
name: string
|
||||||
|
value: string
|
||||||
|
children?: TabOption[]
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
options: {
|
||||||
|
type: Array as PropType<TabOption[]>,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
activeName: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const form = ref({
|
||||||
|
value: '',
|
||||||
|
label: ''
|
||||||
|
})
|
||||||
|
|
||||||
const dialogVisible = ref(false)
|
const dialogVisible = ref(false)
|
||||||
const dialogTitle = ref()
|
const dialogTitle = ref()
|
||||||
@@ -145,7 +186,8 @@ const tableData = [
|
|||||||
{ sort: 'L3', frequency: 'V', L1: '电压:57.75V 相角:0°' },
|
{ sort: 'L3', frequency: 'V', L1: '电压:57.75V 相角:0°' },
|
||||||
{ sort: 'L3', frequency: 'I', L1: '电压:57.75V 相角:0°' }
|
{ sort: 'L3', frequency: 'I', L1: '电压:57.75V 相角:0°' }
|
||||||
]
|
]
|
||||||
|
const radio = ref('')
|
||||||
|
const tabChildren: any = ref([])
|
||||||
// 定义 span-method 逻辑
|
// 定义 span-method 逻辑
|
||||||
const arraySpanMethod = ({ rowIndex, columnIndex }: { rowIndex: number; columnIndex: number }) => {
|
const arraySpanMethod = ({ rowIndex, columnIndex }: { rowIndex: number; columnIndex: number }) => {
|
||||||
if (columnIndex === 0 || columnIndex === 3) {
|
if (columnIndex === 0 || columnIndex === 3) {
|
||||||
@@ -163,6 +205,17 @@ const arraySpanMethod = ({ rowIndex, columnIndex }: { rowIndex: number; columnIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const selectedRow = ref('L1')
|
||||||
|
const tableStyle = {
|
||||||
|
cellStyle: ({ row }: { row: any }) => {
|
||||||
|
return row.sort === selectedRow.value
|
||||||
|
? { backgroundColor: '#dcdcdc' } // 设置选中行的背景颜色
|
||||||
|
: {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const handleRowClick = async (row: any) => {
|
||||||
|
selectedRow.value = row.sort
|
||||||
|
}
|
||||||
|
|
||||||
// 切换按钮类型
|
// 切换按钮类型
|
||||||
const toggleType = (
|
const toggleType = (
|
||||||
@@ -182,7 +235,11 @@ const close = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 保存数据
|
// 保存数据
|
||||||
const save = () => {}
|
const save = () => {
|
||||||
|
form.value.value = radio.value
|
||||||
|
form.value.label = tabChildren.value.filter(item => item.value == radio.value)[0].label
|
||||||
|
emit('addTab', form.value)
|
||||||
|
}
|
||||||
|
|
||||||
// 打开弹窗,可能是新增,也可能是编辑
|
// 打开弹窗,可能是新增,也可能是编辑
|
||||||
const open = (sign: string, row: any) => {
|
const open = (sign: string, row: any) => {
|
||||||
@@ -199,6 +256,8 @@ const open = (sign: string, row: any) => {
|
|||||||
transient: 'info'
|
transient: 'info'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
tabChildren.value = props.options.filter(item => item.value == props.activeName)[0].children || []
|
||||||
|
radio.value = tabChildren.value[0].value || ''
|
||||||
}
|
}
|
||||||
|
|
||||||
// 打开 drawer(新增、编辑)
|
// 打开 drawer(新增、编辑)
|
||||||
@@ -226,12 +285,12 @@ defineExpose({ open })
|
|||||||
}
|
}
|
||||||
|
|
||||||
.left-tabs {
|
.left-tabs {
|
||||||
flex: 3; /* 左侧 tab 占据 3/4 的宽度 */
|
width: 980px;
|
||||||
margin-right: 10px; /* 可选:添加间距 */
|
margin: 0 10px; /* 可选:添加间距 */
|
||||||
}
|
}
|
||||||
|
|
||||||
.right-tabs {
|
.right-tabs {
|
||||||
flex: 1; /* 右侧 tab 占据 1/4 的宽度 */
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-item-container {
|
.form-item-container {
|
||||||
|
|||||||
@@ -1,36 +1,32 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="divider-container">
|
<div class="divider-container">
|
||||||
<el-divider style="width: 400px">检测脚本信息</el-divider>
|
<el-divider style="width: 300px" content-position="left">检测脚本信息</el-divider>
|
||||||
<el-divider style="width: 1300px">检测项目概要信息</el-divider>
|
<el-divider style="width: 400px" content-position="left">通讯脚本</el-divider>
|
||||||
|
<el-divider style="flex: 1" content-position="left">检测项目概要信息</el-divider>
|
||||||
</div>
|
</div>
|
||||||
<div class="data-check-content">
|
<div class="data-check-content">
|
||||||
<div class="content-tree">
|
<div class="content-tree">
|
||||||
<Tree />
|
<Tree />
|
||||||
</div>
|
</div>
|
||||||
|
<div class="content-tree" style="width: 400px">
|
||||||
|
<Commun :options="props.options" />
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="content-right-Tabs" style="height: 570px; width: 100px">
|
<div class="content-right-Tabs" style="height: calc(100vh - 335px); width: 100px">
|
||||||
<el-tabs type="border-card" style="height: 100%">
|
<el-tabs type="border-card" style="height: 100%" v-model="activeName">
|
||||||
<el-tab-pane
|
<el-tab-pane v-for="tab in tabData" :key="tab.value" :label="tab.label" :name="tab.value">
|
||||||
v-for="tab in props.options"
|
<div class="dialog-footer">
|
||||||
:key="tab.name"
|
<el-button :icon="CirclePlus" type="primary" @click="openDialog('add')">新增</el-button>
|
||||||
:label="tab.label.replace(/准确度|检测/g, '')"
|
<el-button :icon="CirclePlus" type="primary" @click="openAddDialog()">保存测试项</el-button>
|
||||||
:name="tab.name"
|
</div>
|
||||||
>
|
|
||||||
<!-- 频率tab -->
|
<!-- 频率tab -->
|
||||||
<el-tabs type="border-card" style="height: 500px">
|
<el-tabs type="border-card">
|
||||||
<el-tab-pane
|
<el-tab-pane
|
||||||
v-for="subTab in tab.children || []"
|
v-for="subTab in tab.children || []"
|
||||||
:key="subTab.name"
|
:key="subTab.name"
|
||||||
:label="subTab.label"
|
:label="subTab.label"
|
||||||
:name="subTab.name"
|
:name="subTab.name"
|
||||||
>
|
>
|
||||||
<!-- 子标签页内容 -->
|
|
||||||
<div class="dialog-footer">
|
|
||||||
<el-button :icon="CirclePlus" type="primary" @click="openDialog('add')">新增</el-button>
|
|
||||||
<el-button :icon="CirclePlus" type="primary" @click="openAddDialog()">
|
|
||||||
保存测试项
|
|
||||||
</el-button>
|
|
||||||
</div>
|
|
||||||
<div class="table-container">
|
<div class="table-container">
|
||||||
<el-table
|
<el-table
|
||||||
:data="tableData"
|
:data="tableData"
|
||||||
@@ -40,8 +36,7 @@
|
|||||||
color: '#fff'
|
color: '#fff'
|
||||||
}"
|
}"
|
||||||
:cell-style="{ textAlign: 'center' }"
|
:cell-style="{ textAlign: 'center' }"
|
||||||
style="width: 100%"
|
height="calc(100vh - 515px)"
|
||||||
:style="{ height: '390px', overflow: 'hidden' }"
|
|
||||||
>
|
>
|
||||||
<el-table-column prop="sort" label="组次" width="60" />
|
<el-table-column prop="sort" label="组次" width="60" />
|
||||||
<el-table-column prop="frequency" label="频率(Hz)" width="100" />
|
<el-table-column prop="frequency" label="频率(Hz)" width="100" />
|
||||||
@@ -89,9 +84,6 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="dialog-footer" style="margin-top: 20px;">
|
|
||||||
|
|
||||||
</div> -->
|
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
@@ -99,22 +91,22 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<TestProjectPopup ref="testProjectPopup" />
|
<TestProjectPopup ref="testProjectPopup" :options="props.options" :activeName="activeName" @addTab="addTab" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { type PropType, ref } from 'vue'
|
import { type PropType, ref, nextTick } from 'vue'
|
||||||
import Tree from './tree.vue'
|
import Tree from './tree.vue'
|
||||||
|
import Commun from './communication.vue'
|
||||||
import type { CascaderOption } from 'element-plus'
|
import type { CascaderOption } from 'element-plus'
|
||||||
import { CirclePlus, Delete, EditPen, CopyDocument } from '@element-plus/icons-vue'
|
import { CirclePlus, Delete, EditPen, CopyDocument } from '@element-plus/icons-vue'
|
||||||
import type { TestScript } from '@/api/device/interface/testScript'
|
import type { TestScript } from '@/api/device/interface/testScript'
|
||||||
import TestProjectPopup from '@/views/machine/testScript/components/testProjectPopup.vue'
|
import TestProjectPopup from '@/views/machine/testScript/components/testProjectPopup.vue'
|
||||||
|
|
||||||
const testProjectPopup = ref()
|
|
||||||
|
|
||||||
interface TabOption {
|
interface TabOption {
|
||||||
label: string
|
label: string
|
||||||
name: string
|
name: string
|
||||||
|
value: string
|
||||||
children?: TabOption[]
|
children?: TabOption[]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,7 +116,8 @@ const props = defineProps({
|
|||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
const activeName = ref('')
|
||||||
|
const testProjectPopup = ref()
|
||||||
const tableData = [
|
const tableData = [
|
||||||
{ sort: 1, frequency: 42.5, L1: '电压:57.75V 相角:0°', L2: '电压:57.75V 相角:120°', L3: '电压:57.75V 相角:-120°' },
|
{ sort: 1, frequency: 42.5, L1: '电压:57.75V 相角:0°', L2: '电压:57.75V 相角:120°', L3: '电压:57.75V 相角:-120°' },
|
||||||
{ sort: 2, frequency: 50, L1: '电压:57.75V 相角:0°', L2: '电压:57.75V 相角:120°', L3: '电压:57.75V 相角:-120°' },
|
{ sort: 2, frequency: 50, L1: '电压:57.75V 相角:0°', L2: '电压:57.75V 相角:120°', L3: '电压:57.75V 相角:-120°' },
|
||||||
@@ -133,116 +126,45 @@ const tableData = [
|
|||||||
{ sort: 5, frequency: 57.5, L1: '电压:57.75V 相角:0°', L2: '电压:57.75V 相角:120°', L3: '电压:57.75V 相角:-120°' },
|
{ sort: 5, frequency: 57.5, L1: '电压:57.75V 相角:0°', L2: '电压:57.75V 相角:120°', L3: '电压:57.75V 相角:-120°' },
|
||||||
{ sort: 6, frequency: 57.5, L1: '电压:57.75V 相角:0°', L2: '电压:57.75V 相角:120°', L3: '电压:57.75V 相角:-120°' }
|
{ sort: 6, frequency: 57.5, L1: '电压:57.75V 相角:0°', L2: '电压:57.75V 相角:120°', L3: '电压:57.75V 相角:-120°' }
|
||||||
]
|
]
|
||||||
|
const tabData: any = ref([])
|
||||||
const tabs = ref([
|
|
||||||
{
|
|
||||||
label: '频率',
|
|
||||||
name: 'resultTab',
|
|
||||||
subTabs: [
|
|
||||||
{ label: '额度工作条件下的检测', name: 'quotaConditionTab' },
|
|
||||||
{ label: '电压对频率测量的影响', name: 'voltageFrequencyImpactTab' },
|
|
||||||
{ label: '谐波对频率测量的影响', name: 'harmonicFrequencyImpactTab' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '电压',
|
|
||||||
name: 'resultTab1',
|
|
||||||
subTabs: [
|
|
||||||
{ label: '额度工作条件下的检测', name: 'quotaConditionTab1' },
|
|
||||||
{ label: '电压对频率测量的影响', name: 'voltageFrequencyImpactTab1' },
|
|
||||||
{ label: '谐波对频率测量的影响', name: 'harmonicFrequencyImpactTab1' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '电流',
|
|
||||||
name: 'resultTab2',
|
|
||||||
subTabs: [
|
|
||||||
{ label: '额度工作条件下的检测', name: 'quotaConditionTab2' },
|
|
||||||
{ label: '电压对频率测量的影响', name: 'voltageFrequencyImpactTab2' },
|
|
||||||
{ label: '谐波对频率测量的影响', name: 'harmonicFrequencyImpactTab2' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '电压不平衡度',
|
|
||||||
name: 'resultTab3',
|
|
||||||
subTabs: [
|
|
||||||
{ label: '额度工作条件下的检测', name: 'quotaConditionTab3' },
|
|
||||||
{ label: '电压对频率测量的影响', name: 'voltageFrequencyImpactTab3' },
|
|
||||||
{ label: '谐波对频率测量的影响', name: 'harmonicFrequencyImpactTab3' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '电流不平衡度',
|
|
||||||
name: 'resultTab4',
|
|
||||||
subTabs: [
|
|
||||||
{ label: '额度工作条件下的检测', name: 'quotaConditionTab4' },
|
|
||||||
{ label: '电压对频率测量的影响', name: 'voltageFrequencyImpactTab4' },
|
|
||||||
{ label: '谐波对频率测量的影响', name: 'harmonicFrequencyImpactTab4' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '谐波电压',
|
|
||||||
name: 'resultTab5',
|
|
||||||
subTabs: [
|
|
||||||
{ label: '额度工作条件下的检测', name: 'quotaConditionTab5' },
|
|
||||||
{ label: '电压对频率测量的影响', name: 'voltageFrequencyImpactTab5' },
|
|
||||||
{ label: '谐波对频率测量的影响', name: 'harmonicFrequencyImpactTab5' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '谐波电流',
|
|
||||||
name: 'resultTab6',
|
|
||||||
subTabs: [
|
|
||||||
{ label: '额度工作条件下的检测', name: 'quotaConditionTab6' },
|
|
||||||
{ label: '电压对频率测量的影响', name: 'voltageFrequencyImpactTab6' },
|
|
||||||
{ label: '谐波对频率测量的影响', name: 'harmonicFrequencyImpactTab6' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '间谐波电压',
|
|
||||||
name: 'resultTab7',
|
|
||||||
subTabs: [
|
|
||||||
{ label: '额度工作条件下的检测', name: 'quotaConditionTab7' },
|
|
||||||
{ label: '电压对频率测量的影响', name: 'voltageFrequencyImpactTab7' },
|
|
||||||
{ label: '谐波对频率测量的影响', name: 'harmonicFrequencyImpactTab7' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '间谐波电流',
|
|
||||||
name: 'resultTab8',
|
|
||||||
subTabs: [
|
|
||||||
{ label: '额度工作条件下的检测', name: 'quotaConditionTab8' },
|
|
||||||
{ label: '电压对频率测量的影响', name: 'voltageFrequencyImpactTab8' },
|
|
||||||
{ label: '谐波对频率测量的影响', name: 'harmonicFrequencyImpactTab8' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '电压暂升暂降',
|
|
||||||
name: 'resultTab9',
|
|
||||||
subTabs: [
|
|
||||||
{ label: '额度工作条件下的检测', name: 'quotaConditionTab9' },
|
|
||||||
{ label: '电压对频率测量的影响', name: 'voltageFrequencyImpactTab9' },
|
|
||||||
{ label: '谐波对频率测量的影响', name: 'harmonicFrequencyImpactTab9' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '闪变',
|
|
||||||
name: 'resultTab10',
|
|
||||||
subTabs: [
|
|
||||||
{ label: '额度工作条件下的检测', name: 'quotaConditionTab10' },
|
|
||||||
{ label: '电压对频率测量的影响', name: 'voltageFrequencyImpactTab10' },
|
|
||||||
{ label: '谐波对频率测量的影响', name: 'harmonicFrequencyImpactTab10' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 打开 drawer(新增、编辑)
|
// 打开 drawer(新增、编辑)
|
||||||
const openDialog = (titleType: string, row: Partial<TestScript.ResTestScript> = {}) => {
|
const openDialog = (titleType: string, row: Partial<TestScript.ResTestScript> = {}) => {
|
||||||
|
if (titleType == 'add') {
|
||||||
|
}
|
||||||
testProjectPopup.value?.open(titleType, row)
|
testProjectPopup.value?.open(titleType, row)
|
||||||
}
|
}
|
||||||
|
// 新增保存
|
||||||
|
const addTab = (row: any) => {
|
||||||
|
let flag = false
|
||||||
|
let list: any = {}
|
||||||
|
tabData.value.forEach(item => {
|
||||||
|
if (item.value == activeName.value) {
|
||||||
|
list = item
|
||||||
|
item.children.forEach(k => {
|
||||||
|
if (k.value == row.value) {
|
||||||
|
flag = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (flag) {
|
||||||
|
list.children.push(row)
|
||||||
|
}
|
||||||
|
// if (tab.length == 0) {
|
||||||
|
// tabData.value.filter(item => item.value == activeName.value)[0].children?.push(row)
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
onMounted(() => {
|
||||||
|
props.options.forEach(item => {
|
||||||
|
tabData.value.push({
|
||||||
|
label: item.label.replace(/准确度|检测/g, ''),
|
||||||
|
value: item.value,
|
||||||
|
children: []
|
||||||
|
})
|
||||||
|
})
|
||||||
|
activeName.value = tabData.value[0].value
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.data-check-content {
|
.data-check-content {
|
||||||
@@ -252,12 +174,12 @@ const openDialog = (titleType: string, row: Partial<TestScript.ResTestScript> =
|
|||||||
|
|
||||||
.content-tree {
|
.content-tree {
|
||||||
width: 300px;
|
width: 300px;
|
||||||
height: 560px;
|
height: calc(100vh - 335px);
|
||||||
border: 1px solid #dcdfe6;
|
border: 1px solid #dcdfe6;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
overflow: auto; /* 同时启用垂直和水平滚动 */
|
overflow: auto; /* 同时启用垂直和水平滚动 */
|
||||||
overflow-x: auto; /* 确保水平滚动条生效 */
|
overflow-x: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 确保 el-tree 内容可以超出容器宽度 */
|
/* 确保 el-tree 内容可以超出容器宽度 */
|
||||||
|
|||||||
@@ -2,11 +2,12 @@
|
|||||||
<div class="editor-container">
|
<div class="editor-container">
|
||||||
<div class="left-editor">
|
<div class="left-editor">
|
||||||
<!-- 左侧编辑区域内容 -->
|
<!-- 左侧编辑区域内容 -->
|
||||||
<canvas ref="canvas" width="700" height="165"></canvas>
|
<!-- <canvas ref="canvas" width="700" height="165"></canvas> -->
|
||||||
|
<Line :options="chartsData" style="width: 700px; height: 165px" ref="lineRef" />
|
||||||
</div>
|
</div>
|
||||||
<div class="right-editor">
|
<div class="right-editor">
|
||||||
<!-- 右侧编辑区域内容 -->
|
<!-- 右侧编辑区域内容 -->
|
||||||
<el-form :inline="true" label-width="auto" :model="form" class="form-two" >
|
<el-form :inline="true" label-width="auto" :model="form" class="form-two">
|
||||||
<el-form-item label="电压有效值(V)">
|
<el-form-item label="电压有效值(V)">
|
||||||
<el-input v-model="form.input1" />
|
<el-input v-model="form.input1" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -26,85 +27,74 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { onMounted, ref } from 'vue'
|
import { onMounted, ref } from 'vue'
|
||||||
|
import Line from '@/components/echarts/line/index.vue'
|
||||||
const form = ref({
|
const form = ref({
|
||||||
input1: 220,
|
input1: 220,
|
||||||
input2: 0,
|
input2: 0,
|
||||||
input3: 0,
|
input3: 0,
|
||||||
input4: 0
|
input4: 0
|
||||||
})
|
})
|
||||||
|
const lineRef: any = ref()
|
||||||
|
const chartsData = ref({})
|
||||||
const canvas = ref<HTMLCanvasElement | null>(null)
|
const canvas = ref<HTMLCanvasElement | null>(null)
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
if (canvas.value) {
|
drawSineWave()
|
||||||
const ctx = canvas.value.getContext('2d')
|
|
||||||
if (ctx) {
|
|
||||||
drawSineWave(ctx)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
function drawSineWave(ctx: CanvasRenderingContext2D) {
|
function drawSineWave() {
|
||||||
const width = canvas.value!.width
|
chartsData.value = {
|
||||||
const height = canvas.value!.height
|
tooltip: {
|
||||||
const amplitude = 50 // 振幅
|
show: false
|
||||||
const frequency = 0.02 // 频率
|
},
|
||||||
const offset = height / 2 // 偏移量
|
legend: {
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
top: '10px',
|
||||||
|
bottom: '10px'
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
name: '',
|
||||||
|
|
||||||
// 绘制横轴
|
boundaryGap: false,
|
||||||
ctx.beginPath()
|
splitLine: {
|
||||||
ctx.moveTo(0, offset)
|
show: true,
|
||||||
ctx.lineTo(width, offset)
|
lineStyle: {
|
||||||
ctx.strokeStyle = 'black'
|
type: 'dashed',
|
||||||
ctx.stroke()
|
color: ['#cfcfcf']
|
||||||
|
}
|
||||||
// 绘制纵轴
|
},
|
||||||
ctx.beginPath()
|
axisLabel: {
|
||||||
ctx.moveTo(0, 0)
|
show: false
|
||||||
ctx.lineTo(0, height)
|
}
|
||||||
ctx.stroke()
|
},
|
||||||
|
yAxis: {
|
||||||
// 绘制横轴刻度
|
name: '',
|
||||||
const xStep = width / 10
|
splitLine: {
|
||||||
for (let x = 0; x <= width; x += xStep) {
|
lineStyle: {
|
||||||
ctx.beginPath()
|
// 使用深浅的间隔色
|
||||||
ctx.moveTo(x, offset - 5)
|
color: ['#ccc'],
|
||||||
ctx.lineTo(x, offset + 5)
|
type: 'solid',
|
||||||
ctx.stroke()
|
opacity: 1
|
||||||
|
}
|
||||||
// 添加横轴刻度标签
|
}
|
||||||
ctx.font = '12px Arial'
|
},
|
||||||
ctx.fillStyle = 'black'
|
options: {
|
||||||
ctx.textAlign = 'center'
|
dataZoom: null,
|
||||||
ctx.fillText((x / xStep).toFixed(0), x, offset + 20)
|
series: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'line',
|
||||||
|
data: [10, -10, 10, -10, 10, -10, 10, -10, 10, -10,10],
|
||||||
|
showSymbol: false,
|
||||||
|
smooth: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 绘制纵轴刻度
|
|
||||||
const yStep = height / 10
|
|
||||||
for (let y = 0; y <= height; y += yStep) {
|
|
||||||
ctx.beginPath()
|
|
||||||
ctx.moveTo(-5, y)
|
|
||||||
ctx.lineTo(5, y)
|
|
||||||
ctx.stroke()
|
|
||||||
|
|
||||||
// 添加纵轴刻度标签
|
|
||||||
ctx.font = '12px Arial'
|
|
||||||
ctx.fillStyle = 'black'
|
|
||||||
ctx.textAlign = 'right'
|
|
||||||
ctx.fillText(((offset - y) / yStep - 5).toFixed(1), -10, y + 5)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 绘制正弦波
|
|
||||||
ctx.beginPath()
|
|
||||||
ctx.moveTo(0, offset)
|
|
||||||
|
|
||||||
for (let x = 0; x < width; x++) {
|
|
||||||
const y = offset + amplitude * Math.sin(frequency * x)
|
|
||||||
ctx.lineTo(x, y)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.strokeStyle = 'red'
|
|
||||||
ctx.lineWidth = 2
|
|
||||||
ctx.stroke()
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -119,8 +109,8 @@ canvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.left-editor {
|
.left-editor {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.right-editor {
|
.right-editor {
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-tree node-key="id" default-expand-all :data="dataTree" :props="defaultProps" />
|
<el-tree node-key="id" default-expand-all :data="dataTree" :props="defaultProps">
|
||||||
|
<template #default="{ node, data }">
|
||||||
|
<el-tooltip effect="dark" :content="data.scriptTypeName" placement="top" :hide-after="0">
|
||||||
|
<div class="custom-tree-node">
|
||||||
|
{{ data.scriptTypeName }}
|
||||||
|
</div>
|
||||||
|
</el-tooltip>
|
||||||
|
</template>
|
||||||
|
</el-tree>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, reactive } from 'vue'
|
import { ref, reactive } from 'vue'
|
||||||
@@ -22,4 +30,11 @@ onMounted(() => {
|
|||||||
open()
|
open()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped>
|
||||||
|
.custom-tree-node {
|
||||||
|
max-width: 230px;
|
||||||
|
overflow-x: hidden !important;
|
||||||
|
white-space: nowrap !important;
|
||||||
|
text-overflow: ellipsis !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
<el-button v-auth.testScript="'add'" type="primary" :icon="CirclePlus" @click="openDialog('add')">
|
<el-button v-auth.testScript="'add'" type="primary" :icon="CirclePlus" @click="openDialog('add')">
|
||||||
新增
|
新增
|
||||||
</el-button>
|
</el-button>
|
||||||
|
|
||||||
<el-button
|
<el-button
|
||||||
v-auth.testScript="'delete'"
|
v-auth.testScript="'delete'"
|
||||||
type="danger"
|
type="danger"
|
||||||
@@ -67,13 +68,14 @@ import { useDictStore } from '@/stores/modules/dict'
|
|||||||
import ComparisonPopup from './components/comparisonPopup.vue'
|
import ComparisonPopup from './components/comparisonPopup.vue'
|
||||||
import TestScriptPopup from './components/testScriptPopup.vue'
|
import TestScriptPopup from './components/testScriptPopup.vue'
|
||||||
import ValueTypePopup from './components/valueTypePopup.vue'
|
import ValueTypePopup from './components/valueTypePopup.vue'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
import { getPqScriptList, updatePqScript, deletePqScript } from '@/api/device/testScript/index'
|
import { getPqScriptList, updatePqScript, deletePqScript } from '@/api/device/testScript/index'
|
||||||
import { computed, reactive, ref } from 'vue'
|
import { computed, reactive, ref } from 'vue'
|
||||||
import { useModeStore } from '@/stores/modules/mode' // 引入模式 store
|
import { useModeStore } from '@/stores/modules/mode' // 引入模式 store
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'testScript'
|
name: 'testScript'
|
||||||
})
|
})
|
||||||
|
const router = useRouter()
|
||||||
const comparisonPopup = ref()
|
const comparisonPopup = ref()
|
||||||
const testScriptPopup = ref()
|
const testScriptPopup = ref()
|
||||||
const valueTypePopup = ref()
|
const valueTypePopup = ref()
|
||||||
@@ -144,7 +146,11 @@ const openDialog = (titleType: string, row: Partial<TestScript.ResTestScript> =
|
|||||||
} else {
|
} else {
|
||||||
if (titleType == 'add') {
|
if (titleType == 'add') {
|
||||||
// valueTypePopup.value?.open(titleType, row,modeStore.currentMode)
|
// valueTypePopup.value?.open(titleType, row,modeStore.currentMode)
|
||||||
testScriptPopup.value?.open('新增检测脚本', {}, row, modeStore.currentMode, '')
|
// testScriptPopup.value?.open('新增检测脚本', {}, row, modeStore.currentMode, '')
|
||||||
|
router.push({
|
||||||
|
path: '/machine/testScriptAdd',
|
||||||
|
state: { title: '新增检测脚本', row: row, mode: modeStore.currentMode }
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
testScriptPopup.value?.open(titleType, row, modeStore.currentMode, '')
|
testScriptPopup.value?.open(titleType, row, modeStore.currentMode, '')
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user