联调 新增检测脚本

This commit is contained in:
GGJ
2025-02-18 16:36:54 +08:00
parent 4f622da52c
commit ce92a1d645
13 changed files with 603 additions and 313 deletions

View File

@@ -26,3 +26,7 @@ export const updatePqScript = (params: TestScript.ResTestScript) => {
export const deletePqScript = (params: string[]) => { export const deletePqScript = (params: string[]) => {
return http.post(`/pqScript/delete`, params) return http.post(`/pqScript/delete`, params)
} }
//添加检测脚本
export const addScriptDtls = (params: any) => {
return http.post(`/pqScript/addScriptDtls`, params)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View File

@@ -58,7 +58,14 @@ const props = defineProps({
}) })
const tableData = ref<any[]>([]) const tableData = ref<any[]>([])
onMounted(async () => { onMounted(async () => {
let data = await getDictTreeByCode({ code: 'Script_Error' }) let data = await getDictTreeByCode({
name: '',
id: '',
pid: '',
pids: '',
code: 'Script_Error',
sort: 0
})
data.data[0].children.forEach((item: any, i: number) => { data.data[0].children.forEach((item: any, i: number) => {
tableData.value.push({ tableData.value.push({

View File

@@ -0,0 +1,196 @@
let scriptForm = {
value: '',
label: '',
subType: '', //tabcode
fFreq: 50.01, //频率
channelList: [
{
channelFlag: false, //通道使能
harmFlag: false, //谐波使能
inHarmFlag: false, //间谐波使能
flickerFlag: false, //闪变使能
dipFlag: false, //暂态使能
fAmp: 0, //幅值
fPhase: 0, //相角
harmList: [
// {
// harm: 2, //谐波次数
// fAmp: 0, //谐波含有率
// fPhase: 0 // 谐波相角
// },
], //谐波
inHarmList: [
{
inharm: 0, //间谐波次数
fAmp: 0, //间谐波含有率
fPhase: 0 // 间谐波相角
}
], //间谐波
flickerData: {
fChagValue: 0, //电压变动幅度
fChagFre: 0, //波动频度
waveFluType: 0, //波动类型
waveType: 0, //波类型
fDutyCycle: 0 //占空比
}, //闪变
dipData: {
fTransValue: 0, // 暂态幅值
fRetainTime: 0 // 暂态持续时间
} //暂态
},
{
channelFlag: false, //通道使能
harmFlag: false, //谐波使能
inHarmFlag: false, //间谐波使能
flickerFlag: false, //闪变使能
dipFlag: false, //暂态使能
fAmp: 0, //幅值
fPhase: 0, //相角
harmList: [], //谐波
inHarmList: [
{
inharm: 1, //间谐波次数
fAmp: 0, //间谐波含有率
fPhase: 0 // 间谐波相角
}
], //间谐波
flickerData: {
fChagValue: 0, //电压变动幅度
fChagFre: 0, //波动频度
waveFluType: 0, //波动类型
waveType: 0, //波类型
fDutyCycle: 0 //占空比
}, //闪变
dipData: {
fTransValue: 0, // 暂态幅值
fRetainTime: 0 // 暂态持续时间
} //暂态
},
{
channelFlag: false, //通道使能
harmFlag: false, //谐波使能
inHarmFlag: false, //间谐波使能
flickerFlag: false, //闪变使能
dipFlag: false, //暂态使能
fAmp: 0, //幅值
fPhase: 0, //相角
harmList: [], //谐波
inHarmList: [
{
inharm: 1, //间谐波次数
fAmp: 0, //间谐波含有率
fPhase: 0 // 间谐波相角
}
], //间谐波
flickerData: {
fChagValue: 0, //电压变动幅度
fChagFre: 0, //波动频度
waveFluType: 0, //波动类型
waveType: 0, //波类型
fDutyCycle: 0 //占空比
}, //闪变
dipData: {
fTransValue: 0, // 暂态幅值
fRetainTime: 0 // 暂态持续时间
} //暂态
},
{
channelFlag: false, //通道使能
harmFlag: false, //谐波使能
inHarmFlag: false, //间谐波使能
flickerFlag: false, //闪变使能
dipFlag: false, //暂态使能
fAmp: 0, //幅值
fPhase: 0, //相角
harmList: [], //谐波
inHarmList: [
{
inharm: 1, //间谐波次数
fAmp: 0, //间谐波含有率
fPhase: 0 // 间谐波相角
}
], //间谐波
flickerData: {
fChagValue: 0, //电压变动幅度
fChagFre: 0, //波动频度
waveFluType: 0, //波动类型
waveType: 0, //波类型
fDutyCycle: 0 //占空比
}, //闪变
dipData: {
fTransValue: 0, // 暂态幅值
fRetainTime: 0 // 暂态持续时间
} //暂态
},
{
channelFlag: false, //通道使能
harmFlag: false, //谐波使能
inHarmFlag: false, //间谐波使能
flickerFlag: false, //闪变使能
dipFlag: false, //暂态使能
fAmp: 0, //幅值
fPhase: 0, //相角
harmList: [], //谐波
inHarmList: [
{
inharm: 1, //间谐波次数
fAmp: 0, //间谐波含有率
fPhase: 0 // 间谐波相角
}
], //间谐波
flickerData: {
fChagValue: 0, //电压变动幅度
fChagFre: 0, //波动频度
waveFluType: 0, //波动类型
waveType: 0, //波类型
fDutyCycle: 0 //占空比
}, //闪变
dipData: {
fTransValue: 0, // 暂态幅值
fRetainTime: 0 // 暂态持续时间
} //暂态
},
{
channelFlag: false, //通道使能
harmFlag: false, //谐波使能
inHarmFlag: false, //间谐波使能
flickerFlag: false, //闪变使能
dipFlag: false, //暂态使能
fAmp: 0, //幅值
fPhase: 0, //相角
harmList: [], //谐波
inHarmList: [
{
inharm: 1, //间谐波次数
fAmp: 0, //间谐波含有率
fPhase: 0 // 间谐波相角
}
], //间谐波
flickerData: {
fChagValue: 0, //电压变动幅度
fChagFre: 0, //波动频度
waveFluType: 0, //波动类型
waveType: 0, //波类型
fDutyCycle: 0 //占空比
}, //闪变
dipData: {
fTransValue: 0, // 暂态幅值
fRetainTime: 0 // 暂态持续时间
} //暂态
}
]
}
// 追加谐波
function getScriptForm() {
for (let i = 2; i < 51; i++) {
scriptForm.channelList.forEach(item => {
item.harmList.push({
harm: i, //谐波次数
fAmp: 0, //谐波含有率
fPhase: 0 // 谐波相角
})
})
}
}
getScriptForm()
export default scriptForm

View File

@@ -5,12 +5,12 @@
<el-tab-pane label="检测"> <el-tab-pane label="检测">
<!-- 全局设置菜单内容 --> <!-- 全局设置菜单内容 -->
<div style="height: 295px"> <div style="height: 295px">
<el-radio-group v-model="radio"> <el-radio-group v-model="subType">
<el-radio <el-radio
v-for="item in tabChildren" v-for="item in tabChildren"
:key="item" :key="item"
:label="item.label" :label="item.label"
:value="item.value" :value="item.code"
border border
style="margin: 0 0 10px 10px" style="margin: 0 0 10px 10px"
/> />
@@ -37,23 +37,45 @@
<el-table-column prop="L1" label="值" width="180" align="center"> <el-table-column prop="L1" label="值" width="180" align="center">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<span> <span>
{{ row.frequency === 'V' ? '电压' : '电流' }}{{ form.children[$index].fAmp {{ row.frequency === 'V' ? '电压' : '电流' }}{{ form.channelList[$index].fAmp
}}{{ row.frequency === 'V' ? 'V' : 'A' }} 相角{{ form.children[$index].fPhase }}° }}{{ valueCode == 'Absolute' ? (row.frequency === 'V' ? 'V' : 'A') : '%' }} 相角{{
form.channelList[$index].fPhase
}}°
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="85"> <el-table-column label="操作" width="85">
<template #default="{}"> <template #default="{ row, $index }">
<el-button type="primary" link :icon="Bottom">复制</el-button> <el-button type="primary" v-if="$index != 4" link :icon="CopyDocument">复制</el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center"> <el-table-column label="操作" align="center">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-checkbox-group v-model="form.children[$index].checkboxGroup"> <el-checkbox-button
<el-checkbox-button v-for="item in GroupList" :key="item.value" :value="item.value"> v-model="form.channelList[$index].channelFlag"
{{ item.label }} label="通道使能"
</el-checkbox-button> size="small"
</el-checkbox-group> />
<el-checkbox-button
v-model="form.channelList[$index].harmFlag"
label="谐波使能"
size="small"
/>
<el-checkbox-button
v-model="form.channelList[$index].inHarmFlag"
label="间谐波使能"
size="small"
/>
<el-checkbox-button
v-model="form.channelList[$index].flickerFlag"
label="闪变使能"
size="small"
/>
<el-checkbox-button
v-model="form.channelList[$index].dipFlag"
label="暂态使能"
size="small"
/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -66,7 +88,7 @@
<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">
<el-input style="width: 100px" v-model="form.fFreq" /> <el-input type="number" style="width: 100px" v-model="form.fFreq" />
<label>Hz</label> <label>Hz</label>
</div> </div>
</el-form-item> </el-form-item>
@@ -81,19 +103,19 @@
</div> </div>
<div style="margin-top: 10px"> <div style="margin-top: 10px">
<el-tabs type="border-card" class="custom-tabs"> <el-tabs type="border-card" class="custom-tabs">
<el-tab-pane label="电压/电流编辑"> <el-tab-pane label="电压/电流编辑" v-if="childForm[0].channelFlag || childForm[1].channelFlag">
<TestScriptVolCurTab :childForm="childForm" /> <TestScriptVolCurTab :childForm="childForm" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="谐波编辑"> <el-tab-pane label="谐波编辑" v-if="childForm[0].harmFlag || childForm[1].harmFlag">
<TestScriptHarmTab :childForm="childForm" /> <TestScriptHarmTab :childForm="childForm" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="间谐波编辑"> <el-tab-pane label="间谐波编辑" v-if="childForm[0].inHarmFlag || childForm[1].inHarmFlag">
<TestScriptInHarmTab :childForm="childForm" /> <TestScriptInHarmTab :childForm="childForm" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="闪变编辑"> <el-tab-pane label="闪变编辑" v-if="childForm[0].flickerFlag || childForm[1].flickerFlag">
<TestScriptFlickerTab :childForm="childForm" /> <TestScriptFlickerTab :childForm="childForm" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="暂态编辑"> <el-tab-pane label="暂态编辑" v-if="childForm[0].dipFlag || childForm[1].dipFlag">
<TestScriptDipTab :childForm="childForm" /> <TestScriptDipTab :childForm="childForm" />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
@@ -121,116 +143,34 @@ 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'
import { useDictStore } from '@/stores/modules/dict'
import { addScriptDtls } from '@/api/device/testScript'
import scriptForm from './scriptForm'
const emit = defineEmits(['addTab']) const emit = defineEmits(['addTab'])
interface TabOption { const dictStore = useDictStore()
label: string
name: string
value: string
children?: TabOption[]
}
const props = defineProps({ const props = defineProps({
options: { options: {
type: Array as PropType<TabOption[]>, type: [Array, Object],
required: true required: true
}, },
activeName: { activeName: {
type: String, type: String,
required: true required: true
},
formContent: {
type: Object,
required: true
} }
}) })
const GroupList = [ console.log(`123`, props.formContent)
{ // let valueType
label: '通道使能', const form: any = ref(scriptForm)
value: 'channelFlag'
},
{
label: '谐波使能',
value: 'harmFlag'
},
{
label: '间谐波使能',
value: 'inHarmFlag'
},
{
label: '闪变使能',
value: 'flickerFlag'
},
{
label: '暂态使能',
value: 'dipFlag'
}
]
const form: any = ref({
value: '',
label: '',
fFreq: 50,
children: [
{
checkboxGroup: ['channelFlag','harmFlag'],//通道选择
fAmp: 0, //幅值
fPhase: 0, //相角
harmList: [
{
harm: 1, //谐波次数
fAmp: 0, //谐波含有率
fPhase: 0 // 谐波相角
}
], //谐波
inHarmList: [
{
inharm: 1, //间谐波次数
fAmp: 0, //间谐波含有率
fPhase: 0 // 间谐波相角
}
], //间谐波
flickerData: {
fChagValue: 0,//电压变动幅度
fChagFre: 0, //波动频度
waveFluType: 0, //波动类型
waveType: 0, //波类型
fDutyCycle: 0, //占空比
}, //闪变
dipData: {
fTransValue: 0, // 暂态幅值
fRetainTime: 0 // 暂态持续时间
} //暂态
},
{
checkboxGroup: [],
fAmp: 0,
fPhase: 0
},
{
checkboxGroup: [],
fAmp: 0,
fPhase: 0
},
{
checkboxGroup: [],
fAmp: 0,
fPhase: 0
},
{
checkboxGroup: [],
fAmp: 0,
fPhase: 0
},
{
checkboxGroup: [],
fAmp: 0,
fPhase: 0
}
]
})
const childForm: any = ref([]) const childForm: any = ref([])
const ScriptValueType = ref('')
const dialogVisible = ref(false) const dialogVisible = ref(false)
const dialogTitle = ref() const dialogTitle = ref()
const setValueTable = ref() const valueCode = ref() //Absolute绝对值
const buttonTypeOptions = ['default', 'text', 'success', 'warning', 'info', 'primary', 'danger'] as const
const tableData = [ const tableData = [
{ name: 'L1', frequency: 'V', electricity: 0, fPhase: 0, sort: 0 }, { name: 'L1', frequency: 'V', electricity: 0, fPhase: 0, sort: 0 },
@@ -240,7 +180,7 @@ const tableData = [
{ name: 'L3', frequency: 'V', electricity: 0, fPhase: 0, sort: 2 }, { name: 'L3', frequency: 'V', electricity: 0, fPhase: 0, sort: 2 },
{ name: 'L3', frequency: 'I', electricity: 0, fPhase: 0, sort: 2 } { name: 'L3', frequency: 'I', electricity: 0, fPhase: 0, sort: 2 }
] ]
const radio = ref('') const subType = ref('')
const tabChildren: any = 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 }) => {
@@ -271,8 +211,8 @@ const handleRowClick = async (row: any, column: any) => {
if (column.label == '相别') { if (column.label == '相别') {
childForm.value = [] childForm.value = []
selectedRow.value = row.name selectedRow.value = row.name
childForm.value.push(form.value.children[row.sort * 2]) childForm.value.push(form.value.channelList[row.sort * 2])
childForm.value.push(form.value.children[row.sort * 2 + 1]) childForm.value.push(form.value.channelList[row.sort * 2 + 1])
console.log('🚀 ~ handleRowClick ~ childForm.value:', childForm.value) console.log('🚀 ~ handleRowClick ~ childForm.value:', childForm.value)
} }
@@ -286,10 +226,20 @@ const close = () => {
// 保存数据 // 保存数据
const save = () => { const save = () => {
dialogVisible.value = false console.log('🚀 ~ save ~ form.value:', form.value)
form.value.value = radio.value
form.value.label = tabChildren.value.filter(item => item.value == radio.value)[0].label // dialogVisible.value = false
emit('addTab', form.value) form.value.subType = subType.value
form.value.label = tabChildren.value.filter((item: any) => item.code == subType.value)[0].label
let copyForm = JSON.parse(JSON.stringify(form.value))
copyForm.channelList.forEach((channel: any) => {
// 筛选出 fAmp 和 fPhase 不同时为 0 的对象
channel.harmList = channel.harmList.filter((item: any) => item.fAmp !== 0 || item.fPhase !== 0)
})
addScriptDtls({ ...copyForm, id: props.formContent.id }).then(res => {})
// emit('addTab', form.value)
} }
// 打开弹窗,可能是新增,也可能是编辑 // 打开弹窗,可能是新增,也可能是编辑
@@ -298,8 +248,12 @@ const open = (sign: string, row: any) => {
dialogTitle.value = sign === 'add' ? '新增检测项目信息' : '编辑检测项目信息' dialogTitle.value = sign === 'add' ? '新增检测项目信息' : '编辑检测项目信息'
// 添加选择检测项目 // 添加选择检测项目
tabChildren.value = props.options.filter(item => item.value == props.activeName)[0].children || [] tabChildren.value = props.options.filter(item => item.value == props.activeName)[0].children || []
radio.value = tabChildren.value[0].value || '' subType.value = tabChildren.value[0].code || ''
handleRowClick({ name: 'L1', sort: 0 }, { label: '相别' }) handleRowClick({ name: 'L1', sort: 0 }, { label: '相别' })
dictStore.getDictData('Script_Value_Type')
valueCode.value = dictStore
.getDictData('Script_Value_Type')
.filter(item => item.id == props.formContent.valueType)[0].code
} }
// 打开 drawer(新增、编辑) // 打开 drawer(新增、编辑)

View File

@@ -6,7 +6,7 @@
</div> </div>
<div class="data-check-content"> <div class="data-check-content">
<div class="content-tree"> <div class="content-tree">
<Tree :scriptId="props.scriptId" /> <Tree :formContent="props.formContent" />
</div> </div>
<div class="content-tree" style="width: 400px"> <div class="content-tree" style="width: 400px">
<Commun :options="props.options" /> <Commun :options="props.options" />
@@ -91,7 +91,13 @@
</div> </div>
</div> </div>
<TestProjectPopup ref="testProjectPopup" :options="props.options" :activeName="activeName" @addTab="addTab" /> <TestProjectPopup
ref="testProjectPopupRef"
:options="props.options"
:activeName="activeName"
@addTab="addTab"
:formContent="props.formContent"
/>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@@ -104,9 +110,10 @@ 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'
interface TabOption { interface TabOption {
label: string label?: string
name: string name?: string
value: string value?: string
code?: string
children?: TabOption[] children?: TabOption[]
} }
@@ -115,13 +122,13 @@ const props = defineProps({
type: Array as PropType<TabOption[]>, type: Array as PropType<TabOption[]>,
required: true required: true
}, },
scriptId: { formContent: {
type: String, type: Object,
required: true required: true
} }
}) })
const activeName = ref('') const activeName = ref('')
const testProjectPopup = ref() const testProjectPopupRef = 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°' },
@@ -136,38 +143,41 @@ const tabData: any = ref([])
const openDialog = (titleType: string, row: Partial<TestScript.ResTestScript> = {}) => { const openDialog = (titleType: string, row: Partial<TestScript.ResTestScript> = {}) => {
if (titleType == 'add') { if (titleType == 'add') {
} }
testProjectPopup.value?.open(titleType, row) testProjectPopupRef.value?.open(titleType, row)
} }
// 新增保存 // 新增保存
const addTab = (row: any) => { const addTab = (row: any) => {
let data = JSON.parse(JSON.stringify(row))
let flag = true // let data = JSON.parse(JSON.stringify(row))
let list: any = {} // let flag = true
let childrenList = {} // let list: any = {}
tabData.value.forEach(item => { // let childrenList: any = {}
if (item.value == activeName.value) { // tabData.value.forEach(item => {
// item.children.push(JSON.parse(JSON.stringify(row))) // if (item.value == activeName.value) {
list = item // // item.children.push(JSON.parse(JSON.stringify(row)))
item.children.forEach(k => { // list = item
if (k.value == row.value) { // item.children.forEach(k => {
flag = false // if (k.value == row.value) {
childrenList = k // flag = false
} // childrenList = k
}) // }
} // })
}) // }
if (flag) { // })
list.children.push(data) // if (flag) {
} else { // list.children.push(data)
childrenList.children.push(data) // } else {
} // childrenList.children.push(data)
console.log('🚀 ~ addTab ~ tabData.value:', tabData.value) // }
} }
onMounted(() => { onMounted(() => {
console.log('🚀 ~ onMounted ~ props.options:', props.options)
props.options.forEach(item => { props.options.forEach(item => {
tabData.value.push({ tabData.value.push({
label: item.label.replace(/准确度|检测/g, ''), label: item.label.replace(/准确度|检测/g, ''),
value: item.value, value: item.value,
code: item.code,
children: [] children: []
}) })
}) })

View File

@@ -1,44 +1,90 @@
<template> <template>
<div class="editor-container"> <div class="editor-container">
<div class="left-editor"> <div class="left-editor">
<!-- 左侧编辑区域内容 --> <!-- 左侧编辑区域内容 -->
</div> <img src="@/assets/images/transient.png" />
<div class="right-editor"> <div class="inputTop">
<!-- 右侧编辑区域内容 --> <el-input v-model="form[0].dipData.fValue" style="width: 150px; left: 4%" :disabled="!form[0].dipFlag">
<el-form-item label-width="120px" label="设定幅度(%)"> <template #append>S</template>
<el-input v-model="input1" style="width: 150px;" /> </el-input>
</el-form-item> <el-input v-model="form[0].dipData.fValue" style="width: 150px; left: 22%" :disabled="!form[0].dipFlag">
<el-form-item label-width="120px" label="持续时间(周波)"> <template #append>S</template>
<el-input v-model="input2" style="width: 150px;"/> </el-input>
</el-form-item> <el-input v-model="form[0].dipData.fValue" style="width: 150px; left: 40%" :disabled="!form[0].dipFlag">
</div> <template #append>S</template>
</div> </el-input>
</div>
<div class="inputBottom">
<el-input v-model="form[0].dipData.fValue" style="width: 150px; left: 21%" :disabled="!form[0].dipFlag">
<template #append>S</template>
</el-input>
<el-input v-model="form[0].dipData.fValue" style="width: 150px; left: 40%" :disabled="!form[0].dipFlag">
<template #append>S</template>
</el-input>
</div>
</div>
<div class="right-editor">
<!-- 右侧编辑区域内容 -->
<el-form-item label-width="120px" label="设定幅度(%)">
<el-input v-model="form[0].dipData.fTransValue" style="width: 150px" :disabled="!form[0].dipFlag"/>
</el-form-item>
<el-form-item label-width="120px" label="持续时间(周波)">
<el-input v-model="form[0].dipData.fRetainTime" style="width: 150px" :disabled="!form[0].dipFlag"/>
</el-form-item>
</div>
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
const input1 = ref('') import { onMounted, ref, watch } from 'vue'
const input2 = ref('') const props = defineProps({
childForm: {
type: Array,
required: true
}
})
const form: any = computed({
get() {
return props.childForm
},
set(value) {}
})
</script> </script>
<style scoped> <style lang="scss" scoped>
canvas { canvas {
border: 1px solid #ccc; border: 1px solid #ccc;
} }
.editor-container { .editor-container {
display: flex; display: flex;
height: 100%; height: 100%;
width: 100%;
} }
.left-editor { .left-editor {
flex: 3; /* 左侧区域占据 3/4 的宽度 */ flex: 1; /* 左侧区域占据 3/4 的宽度 */
margin-left: 150px; /* 可选:添加间距 */ position: relative;
img {
width: 90%;
height: 150px;
margin: 0 10px 20px;
}
.inputTop {
position: absolute;
top: 20px;
width: 100%;
}
.inputBottom {
position: absolute;
bottom: -5px;
width: 100%;
}
} }
.right-editor { .right-editor {
flex: 1; /* 右侧区域占据 1/4 的宽度 */ width: 400px;
margin-right: 250px; /* 向左侧移动一点 */ /* margin-right: 250px; 向左侧移动一点 */
} }
</style> </style>

View File

@@ -1,82 +1,103 @@
<template> <template>
<div class="tabs-container"> <div class="tabs-container">
<el-tabs type="border-card" class="fixed-width-tabs" style="height: 100%;"> <el-tabs type="border-card" class="fixed-width-tabs" style="height: 100%">
<el-tab-pane label="Modulation"> <el-tab-pane label="Modulation">
<!-- 全局设置菜单内容 --> <!-- 全局设置菜单内容 -->
<div> <div>
<el-form-item label="电压变动幅度(%)" label-width="140px" prop='name'> <el-form-item label="电压变动幅度(%)" label-width="140px" prop="name">
<el-input style="width: 150px;"/> <el-input style="width: 150px" v-model="form[0].flickerData.fChagValue" :disabled="!form[0].flickerFlag"/>
</el-form-item> </el-form-item>
</div> </div>
<div class="form-container"> <div class="form-container">
<el-form-item label="波动频度(/min/Hz)" label-width="140px" prop='name'> <el-form-item label="波动频度(/min/Hz)" label-width="140px" prop="name">
<el-input style="width: 150px;"/> <el-input style="width: 150px" v-model="form[0].flickerData.fChagFre" :disabled="!form[0].flickerFlag"/>
</el-form-item> </el-form-item>
<el-form-item label="波动类型" prop='name'> <el-form-item label="波动类型" prop="name">
<el-select placeholder="请选择波动类型" style="width: 150px;"> <el-select
<el-option label="Hz" :value="1"></el-option> placeholder="请选择波动类型"
<el-option label="CPM" :value="0"></el-option> style="width: 150px"
</el-select> v-model="form[0].flickerData.waveFluType"
</el-form-item> :disabled="!form[0].flickerFlag"
</div> >
</el-tab-pane> <el-option label="Hz" :value="1"></el-option>
</el-tabs> <el-option label="CPM" :value="0"></el-option>
<el-tabs type="border-card" class="fixed-width-tabs" style="height: 100%;"> </el-select>
<el-tab-pane label="WaveForm"> </el-form-item>
<!-- 全局设置菜单内容 --> </div>
<div > </el-tab-pane>
<el-form-item label="波类型" label-width="100px" prop='name'> </el-tabs>
<el-select placeholder="请选择波类型" style="width: 150px;"> <el-tabs type="border-card" class="fixed-width-tabs" style="height: 100%">
<el-option label="RECT" :value="2"></el-option> <el-tab-pane label="WaveForm">
<el-option label="SIN" :value="1"></el-option> <!-- 全局设置菜单内容 -->
<el-option label="SQU" :value="0"></el-option> <div>
</el-select> <el-form-item label="波类型" label-width="100px" prop="name">
</el-form-item> <el-select
</div> placeholder="请选择波类型"
<div > style="width: 150px"
<el-form-item label="占空比(%)" label-width="100px" prop='name'> v-model="form[0].flickerData.waveType"
<el-input style="width: 150px;"/> :disabled="!form[0].flickerFlag"
</el-form-item> >
</div> <el-option label="RECT" :value="2"></el-option>
</el-tab-pane> <el-option label="SIN" :value="1"></el-option>
</el-tabs> <el-option label="SQU" :value="0"></el-option>
</el-select>
</el-form-item>
</div>
<div>
<el-form-item label="占空比(%)" label-width="100px" prop="name">
<el-input style="width: 150px" v-model="form[0].flickerData.fDutyCycle" :disabled="!form[0].flickerFlag"/>
</el-form-item>
</div>
</el-tab-pane>
</el-tabs>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, ref, watch } from 'vue'
const props = defineProps({
childForm: {
type: Array,
required: true
}
})
const form: any = computed({
get() {
return props.childForm
},
set(value) {}
})
</script> </script>
<style scoped> <style scoped>
.form-container { .form-container {
display: flex; display: flex;
justify-content: space-between; /* 使两个 el-form-item 之间有间距 */ justify-content: space-between; /* 使两个 el-form-item 之间有间距 */
align-items: center; /* 使两个 el-form-item 垂直居中对齐 */ align-items: center; /* 使两个 el-form-item 垂直居中对齐 */
} }
.tabs-container { .tabs-container {
display: flex; display: flex;
justify-content: center; /* 使两个 el-tabs 居中对齐 */ justify-content: center; /* 使两个 el-tabs 居中对齐 */
align-items: stretch; /* 使两个 el-tabs 高度拉伸 */ align-items: stretch; /* 使两个 el-tabs 高度拉伸 */
height: 100%; height: 100%;
padding: 0 20px; /* 可选:添加左右间距 */ padding: 0 20px; /* 可选:添加左右间距 */
} }
.fixed-width-tabs { .fixed-width-tabs {
margin-right: 100px; /* 可选:添加右侧间距 */
margin-right: 100px; /* 可选:添加右侧间距 */
} }
.fixed-width-tabs:last-child { .fixed-width-tabs:last-child {
margin-right: 0; /* 最后一个 el-tabs 不需要右侧间距 */ margin-right: 0; /* 最后一个 el-tabs 不需要右侧间距 */
} }
.el-tab-pane { .el-tab-pane {
display: flex; display: flex;
flex-direction: column; /* 确保内容上下排列 */ flex-direction: column; /* 确保内容上下排列 */
} }
.el-form-item { .el-form-item {
margin-bottom: 20px; /* 可选:添加表单项之间的间距 */ margin-bottom: 20px; /* 可选:添加表单项之间的间距 */
} }
</style> </style>

View File

@@ -7,17 +7,17 @@
<el-table :data="tableData1" border size="small" class="half-width-table"> <el-table :data="tableData1" border size="small" class="half-width-table">
<el-table-column prop="date" align="center" label="次数" width="60" /> <el-table-column prop="date" align="center" label="次数" width="60" />
<el-table-column prop="date" align="center" label="谐波含有率" width="120"> <el-table-column prop="date" align="center" label="谐波含有率" width="120">
<template #default="scope"> <template #default="{ row, $index }">
<div class="input-label-container"> <div class="input-label-container">
<el-input size="small" /> <el-input type="number" size="small" v-model="form[0].harmList[$index].fAmp" :disabled="!form[0].harmFlag"/>
<label>%</label> <label>%</label>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="name" label="谐波相角" align="center" width="120"> <el-table-column prop="name" label="谐波相角" align="center" width="120">
<template #default="scope"> <template #default="{ row, $index }">
<div class="input-label-container"> <div class="input-label-container">
<el-input size="small" /> <el-input type="number" size="small" v-model="form[0].harmList[$index].fPhase" :disabled="!form[0].harmFlag"/>
<label>°</label> <label>°</label>
</div> </div>
</template> </template>
@@ -26,17 +26,17 @@
<el-table :data="tableData2" border size="small" class="half-width-table"> <el-table :data="tableData2" border size="small" class="half-width-table">
<el-table-column prop="date" label="次数" align="center" width="60" /> <el-table-column prop="date" label="次数" align="center" width="60" />
<el-table-column prop="date" label="谐波含有率" align="center" width="120"> <el-table-column prop="date" label="谐波含有率" align="center" width="120">
<template #default="scope"> <template #default="{ row, $index }">
<div class="input-label-container"> <div class="input-label-container">
<el-input size="small" /> <el-input type="number" size="small" v-model="form[0].harmList[$index + 24].fAmp" :disabled="!form[0].harmFlag"/>
<label>%</label> <label>%</label>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="name" label="谐波相角" align="center" width="120"> <el-table-column prop="name" label="谐波相角" align="center" width="120">
<template #default="scope"> <template #default="{ row, $index }">
<div class="input-label-container"> <div class="input-label-container">
<el-input size="small" /> <el-input type="number" size="small" v-model="form[0].harmList[$index+24].fPhase" :disabled="!form[0].harmFlag"/>
<label>°</label> <label>°</label>
</div> </div>
</template> </template>
@@ -52,17 +52,17 @@
<el-table :data="tableData1" border size="small" class="half-width-table"> <el-table :data="tableData1" border size="small" class="half-width-table">
<el-table-column prop="date" label="次数" align="center" width="60" /> <el-table-column prop="date" label="次数" align="center" width="60" />
<el-table-column prop="date" label="谐波含有率" align="center" width="120"> <el-table-column prop="date" label="谐波含有率" align="center" width="120">
<template #default="scope"> <template #default="{ row, $index }">
<div class="input-label-container"> <div class="input-label-container">
<el-input size="small" /> <el-input type="number" size="small" v-model="form[1].harmList[$index].fAmp" :disabled="!form[1].harmFlag"/>
<label>%</label> <label>%</label>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="name" align="center" label="谐波相角" width="120"> <el-table-column prop="name" align="center" label="谐波相角" width="120">
<template #default="scope"> <template #default="{ row, $index }">
<div class="input-label-container"> <div class="input-label-container">
<el-input size="small" /> <el-input type="number" size="small" v-model="form[1].harmList[$index].fPhase" :disabled="!form[1].harmFlag"/>
<label>°</label> <label>°</label>
</div> </div>
</template> </template>
@@ -71,17 +71,17 @@
<el-table :data="tableData2" border size="small" class="half-width-table"> <el-table :data="tableData2" border size="small" class="half-width-table">
<el-table-column prop="date" label="次数" align="center" width="60" /> <el-table-column prop="date" label="次数" align="center" width="60" />
<el-table-column prop="date" label="谐波含有率" align="center" width="120"> <el-table-column prop="date" label="谐波含有率" align="center" width="120">
<template #default="scope"> <template #default="{ row, $index }">
<div class="input-label-container"> <div class="input-label-container">
<el-input size="small" /> <el-input type="number" size="small" v-model="form[1].harmList[$index + 24].fAmp" :disabled="!form[1].harmFlag"/>
<label>%</label> <label>%</label>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="name" label="谐波相角" align="center" width="120"> <el-table-column prop="name" label="谐波相角" align="center" width="120">
<template #default="scope"> <template #default="{ row, $index }">
<div class="input-label-container"> <div class="input-label-container">
<el-input size="small" /> <el-input type="number" size="small" v-model="form[1].harmList[$index+24].fPhase" :disabled="!form[1].harmFlag"/>
<label>°</label> <label>°</label>
</div> </div>
</template> </template>
@@ -95,6 +95,19 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { ref } from 'vue'
const props = defineProps({
childForm: {
type: Array,
required: true
}
})
const form:any = computed({
get() {
return props.childForm
},
set(value) {}
})
// 定义表格数据项的类型 // 定义表格数据项的类型
interface TableItem { interface TableItem {
@@ -108,7 +121,7 @@ interface TableItem {
const tableData1 = ref<TableItem[]>([]) const tableData1 = ref<TableItem[]>([])
const tableData2 = ref<TableItem[]>([]) const tableData2 = ref<TableItem[]>([])
for (let i = 1; i <= 25; i++) { for (let i = 2; i <= 25; i++) {
tableData1.value.push({ tableData1.value.push({
date: i.toString(), date: i.toString(),
harmonicRate: `谐波含有率${i}`, harmonicRate: `谐波含有率${i}`,

View File

@@ -1,66 +1,92 @@
<template> <template>
<div class="tabs-container"> <div>
<el-tabs type="border-card" class="fixed-width-tabs" style="height: 100%;"> <div class="container">
<el-tab-pane label="间谐波A"> <el-form-item label="频率" label-width="80px">
<!-- 全局设置菜单内容 --> <el-input v-model="form[0].inHarmList[0].inharm" :disabled="!form[0].inHarmFlag" />
<div>
<el-form-item label="含有率(%)" prop='name'>
<el-input />
</el-form-item> </el-form-item>
</div>
<div> <el-form-item label="含有率(%)" label-width="80px">
<el-form-item label="间谐波次数" prop='name'> <el-input v-model="form[0].inHarmList[0].fAmp" :disabled="!form[0].inHarmFlag" />
<el-input />
</el-form-item> </el-form-item>
</div>
</el-tab-pane> <el-form-item label="相角(°)" label-width="80px">
</el-tabs> <el-input v-model="form[0].inHarmList[0].fPhase" :disabled="!form[0].inHarmFlag" />
<el-tabs type="border-card" class="fixed-width-tabs" style="height: 100%;">
<el-tab-pane label="间谐波B">
<!-- 全局设置菜单内容 -->
<div>
<el-form-item label="含有率(%)" prop='name'>
<el-input />
</el-form-item> </el-form-item>
</div> <el-form-item label-width="80px">
<div> <el-button type="primary" @click="inHarmFlagAdd">添加</el-button>
<el-form-item label="间谐波次数" prop='name'>
<el-input />
</el-form-item> </el-form-item>
</div> </div>
</el-tab-pane> <div class="container" v-for="item in num" :key="item">
</el-tabs> <el-form-item label="频率" label-width="80px">
<el-input v-model="form[0].inHarmList[item].inharm" :disabled="!form[0].inHarmFlag" />
</el-form-item>
<el-form-item label="含有率(%)" label-width="80px">
<el-input v-model="form[0].inHarmList[item].fAmp" :disabled="!form[0].inHarmFlag" />
</el-form-item>
<el-form-item label="相角(°)" label-width="80px">
<el-input v-model="form[0].inHarmList[item].fPhase" :disabled="!form[0].inHarmFlag" />
</el-form-item>
<el-form-item label-width="80px">
<el-button type="primary" @click="inHarmFlagDelete(item)">删除</el-button>
</el-form-item>
</div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'
const props = defineProps({
childForm: {
type: Array,
required: true
}
})
const form: any = computed({
get() {
return props.childForm
},
set(value) {}
})
const num = ref(0)
// 添加间谐波
const inHarmFlagAdd = () => {
props.childForm[0].inHarmList.push({ inharm: '0', fAmp: '0', fPhase: '0' })
num.value += 1
}
// 删除
const inHarmFlagDelete = (number: number) => {
props.childForm[0].inHarmList.splice(number, 1)
num.value -= 1
}
</script> </script>
<style scoped> <style lang="scss" scoped>
.tabs-container { .container {
display: flex; display: flex;
justify-content: center; /* 使两个 el-tabs 居中对齐 */ align-items: center;
align-items: stretch; /* 使两个 el-tabs 高度拉伸 */ border-bottom: 1px solid #ccc;
height: 100%; width: 100%;
padding: 0 20px; /* 可选:添加左右间距 */ margin-top: 10px;
} height: 40px;
.fixed-width-tabs {
width: 400px; /* 设置固定的宽度 */
margin-right: 100px; /* 可选:添加右侧间距 */
} }
.fixed-width-tabs:last-child { .fixed-width-tabs:last-child {
margin-right: 0; /* 最后一个 el-tabs 不需要右侧间距 */ margin-right: 0; /* 最后一个 el-tabs 不需要右侧间距 */
} }
.el-tab-pane { .el-tab-pane {
display: flex; display: flex;
flex-direction: column; /* 确保内容上下排列 */ flex-direction: column; /* 确保内容上下排列 */
} }
.el-form-item { .el-form-item {
margin-bottom: 20px; /* 可选:添加表单项之间的间距 */ margin-bottom: 20px; /* 可选:添加表单项之间的间距 */
}
:deep(.el-form-item) {
margin-bottom: 10px !important;
} }
</style> </style>

View File

@@ -31,7 +31,13 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="检测脚本值类型" prop="valueType"> <el-form-item label="检测脚本值类型" prop="valueType">
<el-select v-model="formContent.valueType" filterable clearable placeholder="请选择值类型"> <el-select
v-model="formContent.valueType"
:disabled="titleType == '编辑检测脚本'"
filterable
clearable
placeholder="请选择值类型"
>
<el-option <el-option
v-for="item in dictStore.getDictData('Script_Value_Type')" v-for="item in dictStore.getDictData('Script_Value_Type')"
:key="item.id" :key="item.id"
@@ -49,7 +55,7 @@
</el-form> </el-form>
</el-card> </el-card>
<el-card v-if="show"> <el-card v-if="show">
<TestScriptDetail :options="secondLevelOptions" :scriptId="scriptId" /> <TestScriptDetail :options="secondLevelOptions" :formContent="formContent" />
</el-card> </el-card>
</div> </div>
</template> </template>
@@ -67,7 +73,7 @@ import { useRouter } from 'vue-router'
const modeId = ref() const modeId = ref()
const show = ref(false) const show = ref(false)
const router = useRouter() const router = useRouter()
const scriptId = ref('46296b72528f805376e362df594fc669')
const secondLevelOptions: any[] = [] const secondLevelOptions: any[] = []
// 定义弹出组件元信息 // 定义弹出组件元信息
const dialogFormRef = ref() const dialogFormRef = ref()
@@ -81,8 +87,7 @@ function useMetaInfo() {
pattern: modeId.value, pattern: modeId.value,
standardName: '', standardName: '',
standardTime: '', standardTime: '',
state: 1, state: 1
valueType: ''
}) })
return { titleType, formContent } return { titleType, formContent }
} }
@@ -126,7 +131,7 @@ const closeInformation = () => {}
// 保存数据 // 保存数据
const save = () => { const save = () => {
// dialogFormRef // dialogFormRef
dialogFormRef.value.validate(valid => { dialogFormRef.value.validate((valid: boolean) => {
if (valid) { if (valid) {
if (titleType.value == '新增检测脚本') { if (titleType.value == '新增检测脚本') {
formContent.value.pattern = modeId.value formContent.value.pattern = modeId.value
@@ -134,7 +139,7 @@ const save = () => {
if (res.code === 'A0000') { if (res.code === 'A0000') {
ElMessage.success({ message: res.message }) ElMessage.success({ message: res.message })
// scriptId.value = res.data // scriptId.value = res.data
scriptId.value = '46296b72528f805376e362df594fc669' formContent.value.id = '46296b72528f805376e362df594fc669'
show.value = true show.value = true
} }
}) })
@@ -157,7 +162,6 @@ const open = async (title: string, row: any) => {
} else { } else {
let list = JSON.parse(row) let list = JSON.parse(row)
formContent.value = list formContent.value = list
scriptId.value = list.id
show.value = true show.value = true
} }
@@ -166,7 +170,15 @@ const open = async (title: string, row: any) => {
} }
// 获取树字典 // 获取树字典
const treeInfo = async (currentMode: string) => { const treeInfo = async (currentMode: string) => {
const result = await getDictTreeByCode({ code: 'Script_Indicator_Items' }) const data: Dict.ResDictTree = {
name: '',
id: '',
pid: '',
pids: '',
code: 'Script_Indicator_Items',
sort: 0
};
const result = await getDictTreeByCode(data)
const allOptions = convertToOptions(result.data as Dict.ResDictTree[]) const allOptions = convertToOptions(result.data as Dict.ResDictTree[])
secondLevelOptions.push(...(allOptions[0]?.children || [])) secondLevelOptions.push(...(allOptions[0]?.children || []))
modeId.value = dictStore.getDictData('Pattern').find(item => item.name === currentMode)?.id modeId.value = dictStore.getDictData('Pattern').find(item => item.name === currentMode)?.id
@@ -186,6 +198,7 @@ onMounted(() => {
const convertToOptions = (dictTree: Dict.ResDictTree[]): CascaderOption[] => { const convertToOptions = (dictTree: Dict.ResDictTree[]): CascaderOption[] => {
return dictTree.map(item => ({ return dictTree.map(item => ({
value: item.id, value: item.id,
code: item.code,
label: item.name, label: item.name,
children: item.children ? convertToOptions(item.children) : undefined children: item.children ? convertToOptions(item.children) : undefined
})) }))

View File

@@ -9,16 +9,16 @@
<!-- 右侧编辑区域内容 --> <!-- 右侧编辑区域内容 -->
<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-number v-model="form[0].fAmp" /> <el-input type="number" v-model="form[0].fAmp" :disabled="!form[0].channelFlag"/>
</el-form-item> </el-form-item>
<el-form-item label="电流有效值(A)"> <el-form-item label="电流有效值(A)">
<el-input-number v-model="form[0].fPhase" /> <el-input type="number"v-model="form[0].fPhase" :disabled="!form[1].channelFlag"/>
</el-form-item> </el-form-item>
<el-form-item label="电压相角(°)"> <el-form-item label="电压相角(°)">
<el-input-number v-model="form[1].fAmp" /> <el-input type="number"v-model="form[1].fAmp" :disabled="!form[0].channelFlag"/>
</el-form-item> </el-form-item>
<el-form-item label="电流相角(°)"> <el-form-item label="电流相角(°)">
<el-input-number v-model="form[1].fPhase" /> <el-input type="number"v-model="form[1].fPhase" :disabled="!form[1].channelFlag"/>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@@ -39,7 +39,7 @@ const props = defineProps({
const lineRef: any = ref() const lineRef: any = ref()
const chartsData = ref({}) const chartsData = ref({})
// 解构并创建响应式变量 // 解构并创建响应式变量
const form = computed({ const form:any = computed({
get() { get() {
return props.childForm return props.childForm
}, },

View File

@@ -14,8 +14,8 @@ import { ref, reactive } from 'vue'
import { getTreeData } from '@/api/check/test' import { getTreeData } from '@/api/check/test'
import { CheckData } from '@/api/check/interface' import { CheckData } from '@/api/check/interface'
const props = defineProps({ const props = defineProps({
scriptId: { formContent: {
type: String, type: Object,
required: true required: true
} }
}) })
@@ -27,7 +27,7 @@ const defaultProps = {
} }
const open = () => { const open = () => {
getTreeData({ getTreeData({
scriptId: props.scriptId scriptId: props.formContent.id
}).then(res => { }).then(res => {
dataTree.value = res.data dataTree.value = res.data
}) })