This commit is contained in:
guanj
2025-08-26 10:37:24 +08:00
6 changed files with 152 additions and 99 deletions

View File

@@ -1,79 +1,101 @@
<template>
<!-- 基础信息弹出框 -->
<el-dialog :model-value="dialogVisible" :title="dialogTitle" v-bind="dialogSmall" @close="close" align-center>
<div>
<el-form :model="formContent" ref='dialogFormRef' :rules='rules'>
<el-form-item label="名称" prop="name" >
<el-input v-model='formContent.name' placeholder="请输入icd名称" maxlength="32" show-word-limit/>
</el-form-item>
<el-form-item label="存储地址" prop="path" >
<el-input v-model='formContent.path' placeholder="请输入icd存储地址" maxlength="32" show-word-limit/>
</el-form-item>
</el-form>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="close()">取消</el-button>
<el-button type="primary" @click="save()" >
保存
</el-button>
</div>
</template>
</el-dialog>
<el-dialog :model-value="dialogVisible" :title="dialogTitle" v-bind="dialogSmall" @close="close" align-center>
<div>
<el-form :model="formContent" label-position="right" label-width="80" ref="dialogFormRef" :rules="rules">
<el-form-item label="名称" prop="name">
<el-input v-model="formContent.name" placeholder="请输入icd名称" maxlength="32" show-word-limit />
</el-form-item>
<el-form-item label="存储地址" prop="path">
<el-input
v-model="formContent.path"
placeholder="请输入icd存储地址"
maxlength="32"
show-word-limit
/>
</el-form-item>
<el-form-item label="是否支持电压相角、电流相角指标" prop="angle" label-width="auto">
<el-switch
v-model="formContent.angle"
:active-value="1"
:inactive-value="0"
inline-prompt
active-text=""
inactive-text=""
/>
</el-form-item>
<el-form-item label="角型接线时是否使用相别的指标来进行检测" prop="usePhaseIndex" label-width="auto">
<el-switch
v-model="formContent.usePhaseIndex"
:active-value="1"
:inactive-value="0"
inline-prompt
active-text=""
inactive-text=""
/>
</el-form-item>
</el-form>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="close()">取消</el-button>
<el-button type="primary" @click="save()">保存</el-button>
</div>
</template>
</el-dialog>
</template>
</template>
<script lang="ts" setup>
import{ ElMessage, type FormInstance,type FormItemRule } from 'element-plus'
import type { ProTableInstance } from '@/components/ProTable/interface'
import { ref,computed, Ref} from 'vue'
import { type ICD } from '@/api/device/interface/icd'
import {dialogSmall} from '@/utils/elementBind'
import { useDictStore } from '@/stores/modules/dict'
import {addICD,updateICD} from '@/api/device/icd'
const dictStore = useDictStore()
// 定义弹出组件元信息
const dialogFormRef = ref()
function useMetaInfo() {
<script lang="ts" setup>
import { ElMessage, type FormInstance, type FormItemRule } from 'element-plus'
import { computed, ref, Ref } from 'vue'
import { type ICD } from '@/api/device/interface/icd'
import { dialogSmall } from '@/utils/elementBind'
import { useDictStore } from '@/stores/modules/dict'
import { addICD, updateICD } from '@/api/device/icd'
const dictStore = useDictStore()
// 定义弹出组件元信息
const dialogFormRef = ref()
function useMetaInfo() {
const dialogVisible = ref(false)
const titleType = ref('add')
const formContent = ref<ICD.ResICD>({
id: '',
id: '',
name: '',
path: '',
state: 1,
angle: 0,
usePhaseIndex: 0
})
return { dialogVisible, titleType, formContent }
}
const { dialogVisible, titleType, formContent } = useMetaInfo()
}
const { dialogVisible, titleType, formContent } = useMetaInfo()
// 清空formContent
const resetFormContent = () => {
formContent.value = {
id: '',
id: '',
name: '',
path: '',
state: 1,
angle: 0,
usePhaseIndex: 0
}
}
let dialogTitle = computed(() => {
}
let dialogTitle = computed(() => {
return titleType.value === 'add' ? '新增ICD' : '编辑ICD'
})
})
//定义规则
const formRuleRef = ref<FormInstance>()
//定义校验规则
const rules: Ref<Record<string, Array<FormItemRule>>> = ref({
//定义规则
const formRuleRef = ref<FormInstance>()
//定义校验规则
const rules: Ref<Record<string, Array<FormItemRule>>> = ref({
name: [{ required: true, message: 'icd名称必填', trigger: 'blur' }],
path: [{ required: true, message: 'icd存储地址必填', trigger: 'blur' }],
})
path: [{ required: true, message: 'icd存储地址必填', trigger: 'blur' }]
})
// 关闭弹窗
const close = () => {
dialogVisible.value = false
@@ -81,47 +103,46 @@ const close = () => {
resetFormContent()
// 重置表单
dialogFormRef.value?.resetFields()
}
// 保存数据
const save = () => {
}
// 保存数据
const save = () => {
try {
dialogFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
if (formContent.value.id) {
await updateICD(formContent.value);
} else {
await addICD(formContent.value);
}
ElMessage.success({ message: `${dialogTitle.value}成功!` })
close()
// 刷新表格
await props.refreshTable!()
}
})
if (valid) {
if (formContent.value.id) {
await updateICD(formContent.value)
} else {
await addICD(formContent.value)
}
ElMessage.success({ message: `${dialogTitle.value}成功!` })
close()
// 刷新表格
await props.refreshTable!()
}
})
} catch (err) {
//error('验证过程中出现错误', err)
//error('验证过程中出现错误', err)
}
}
// 打开弹窗,可能是新增,也可能是编辑
const open = async (sign: string, data: ICD.ResICD) => {
}
// 打开弹窗,可能是新增,也可能是编辑
const open = async (sign: string, data: ICD.ResICD) => {
// 重置表单
dialogFormRef.value?.resetFields()
titleType.value = sign
dialogVisible.value = true
if (data.id) {
formContent.value = { ...data }
formContent.value = { ...data }
} else {
resetFormContent()
resetFormContent()
}
}
// 对外映射
defineExpose({ open })
const props = defineProps<{
refreshTable: (() => Promise<void>) | undefined;
}>()
</script>
}
// 对外映射
defineExpose({ open })
const props = defineProps<{
refreshTable: (() => Promise<void>) | undefined
}>()
</script>

View File

@@ -61,7 +61,14 @@
>
导出检测结果
</el-button>
<el-button type="primary" icon="Upload" v-auth.plan="'add_subplan'">导入检测结果</el-button>
<el-button
v-auth.plan="'add_subplan'"
type="primary"
icon="Upload"
@click="importSubCheckDataClick"
>
导入检测结果
</el-button>
<el-button type="primary" icon="Box" v-auth.plan="'add_subplan'" v-if="!isTabPlanFather">
数据合并
</el-button>
@@ -158,6 +165,7 @@
<!-- 向计划导入/导出设备对话框 -->
<PlanPopup :refresh-table="proTable?.getTableList" ref="planPopup" @update:tab="addNewChildTab" />
<DevTransfer ref="devTransfer" @update:table="addNewChildTab" />
<ImportZip ref="planCheckDataImportZip" @result="importResult" />
</template>
<script setup lang="tsx">
import { ElMessage, ElMessageBox, TabPaneName } from 'element-plus'
@@ -166,13 +174,21 @@ import PlanPopup from '@/views/plan/planList/components/planPopup.vue' // 导入
import { Plan } from '@/api/plan/interface'
import { useModeStore } from '@/stores/modules/mode' // 引入模式 store
import { ColumnProps, ProTableInstance, SearchRenderScope } from '@/components/ProTable/interface'
import { deletePlan, exportPlanCheckData, exportSubPlan, getDevListByPlanId, subPlanBindDev } from '@/api/plan/plan'
import {
deletePlan,
exportPlanCheckData,
exportSubPlan,
getDevListByPlanId,
importSubPlanCheckData,
subPlanBindDev
} from '@/api/plan/plan'
import { Device } from '@/api/device/interface/device'
import { useDictStore } from '@/stores/modules/dict'
import DevTransfer from '@/views/plan/planList/components/devTransfer.vue'
import { useHandleData } from '@/hooks/useHandleData'
import router from '@/routers'
import { useDownload } from '@/hooks/useDownload'
import ImportZip from '@/components/ImportZip/index.vue'
const dictStore = useDictStore()
const planFormContent = ref<Plan.ReqPlan>()
@@ -191,7 +207,7 @@ const isTabPlanFather = ref(true)
const planId = ref('')
const planTabDevList = ref<any[]>([])
const patternId = ref('')
const planCheckDataImportZip = ref<InstanceType<typeof ImportZip> | null>(null)
const getTableList = async (params: any) => {
if (!planFormContent.value) {
return Promise.resolve({ data: [], total: 0 })
@@ -601,6 +617,21 @@ const exportPlanCheckResultData = async () => {
() => useDownload(exportPlanCheckData, `${planFormContent.value.name}_计划检测结果`, params, false, '.zip')
)
}
const importSubCheckDataClick = () => {
const params = {
title: '导入计划检测结果',
patternId: dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? '',
importApi: importSubPlanCheckData
}
planCheckDataImportZip.value?.acceptParams(params)
}
const importResult = async (success: boolean | undefined) => {
if (success) {
await props.refreshTable!()
}
}
defineExpose({ open, handleTableDataUpdate })
interface ChildrenPlanProps {

View File

@@ -641,7 +641,7 @@ const statisticalAnalysis = async (row: Partial<Plan.ReqPlan> = {}) => {
const importSubClick = () => {
const params = {
title: '检测计划',
title: '导入检测计划',
patternId: dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? '',
importApi: importSubPlan
}