diff --git a/src/api/mes/organization/index.ts b/src/api/mes/organization/index.ts index 9510afbd..738ea9b3 100644 --- a/src/api/mes/organization/index.ts +++ b/src/api/mes/organization/index.ts @@ -19,6 +19,7 @@ export interface OrganizationVO { export type DeviceParameterAnalysisNodeVO = { id: number | string name: string + parentId?: number | string equipments?: { id: number | string name: string diff --git a/src/views/mes/energydevice/EnergyDeviceForm.vue b/src/views/mes/energydevice/EnergyDeviceForm.vue index 73861c1f..37d642f4 100644 --- a/src/views/mes/energydevice/EnergyDeviceForm.vue +++ b/src/views/mes/energydevice/EnergyDeviceForm.vue @@ -29,17 +29,19 @@ - - - + /> @@ -53,7 +55,6 @@ v-model="rule.pointValue" :data="equipmentTree" :props="treeSelectProps" - check-strictly filterable clearable class="!w-full" @@ -83,7 +84,7 @@ :disabled="formData.operationRulesVOList.length <= 1" @click="removeRule" > - + @@ -108,6 +109,8 @@ import { EnergyDeviceApi, EnergyDeviceVO } from '@/api/mes/energydevice' import {EnergyTypeApi, EnergyTypeVO} from "@/api/mes/energytype"; import { OrganizationApi, DeviceParameterAnalysisNodeVO } from '@/api/mes/organization' +import { Remove } from '@element-plus/icons-vue' +import { handleTree } from '@/utils/tree' /** 能源设备 表单 */ defineOptions({ name: 'EnergyDeviceForm' }) @@ -147,7 +150,52 @@ const formRules = reactive({ const formRef = ref() // 表单 Ref const analysisLoading = ref(false) -const analysisList = ref([]) +type OrgAnalysisNode = DeviceParameterAnalysisNodeVO & { children?: OrgAnalysisNode[] } + +const analysisList = ref([]) + +const analysisTree = computed(() => { + const list = analysisList.value ?? [] + if (!list.length) return [] as OrgAnalysisNode[] + + const hasParentId = list.some((n) => (n as any).parentId !== undefined && (n as any).parentId !== null) + if (!hasParentId) { + return list.map((n) => ({ ...n })) as OrgAnalysisNode[] + } + + const cloned = list.map((n) => ({ ...n })) as OrgAnalysisNode[] + return handleTree(cloned as any[], 'id', 'parentId', 'children') as OrgAnalysisNode[] +}) + +type OrgSelectNode = { + id: number | string + name: string + children?: OrgSelectNode[] +} + +const orgSelectTree = computed(() => { + const tree = analysisTree.value ?? [] + if (!tree.length) return [] as OrgSelectNode[] + + const pruneAndAttach = (nodes: OrgAnalysisNode[]): OrgSelectNode[] => { + const kept: OrgSelectNode[] = [] + nodes.forEach((node) => { + const childNodes = Array.isArray(node.children) ? pruneAndAttach(node.children) : [] + const hasValidEquipment = (node?.equipments ?? []).some((eq) => (eq?.parameters ?? []).length > 0) + if (!hasValidEquipment && !childNodes.length) return + kept.push({ id: node.id, name: node.name, children: childNodes.length ? childNodes : undefined }) + }) + return kept + } + + return pruneAndAttach(tree) +}) + +const orgTreeSelectProps = { + label: 'name', + children: 'children', + value: 'id' +} const treeSelectProps = { label: 'name', @@ -164,15 +212,21 @@ const currentOrgNode = computed(() => { const equipmentTree = computed(() => { const equipments = currentOrgNode.value?.equipments ?? [] - return equipments.map((eq) => ({ - id: `device:${eq.id}`, - name: eq.name, - disabled: true, - children: (eq.parameters ?? []).map((p) => ({ - id: `${eq.id}:${p.id}`, - name: `${eq.name}: ${p.name}` - })) - })) + return equipments + .map((eq) => { + const params = eq.parameters ?? [] + if (!params.length) return null + return { + id: `device:${eq.id}`, + name: eq.name, + disabled: true, + children: params.map((p) => ({ + id: `${eq.id}:${p.id}`, + name: `${eq.name}: ${p.name}` + })) + } + }) + .filter(Boolean) as any[] }) /** 打开弹窗 */ diff --git a/src/views/mes/taskManagement/TaskManagementForm.vue b/src/views/mes/taskManagement/TaskManagementForm.vue index 55c5a877..197b7897 100644 --- a/src/views/mes/taskManagement/TaskManagementForm.vue +++ b/src/views/mes/taskManagement/TaskManagementForm.vue @@ -152,7 +152,9 @@ const formData = ref({ const formRules = reactive({ name: [{ required: true, message: '名称不能为空', trigger: 'blur' }], taskType: [{ required: true, message: '类型不能为空', trigger: 'change' }], - enabled: [{ required: true, message: '是否启用不能为空', trigger: 'change' }] + enabled: [{ required: true, message: '是否启用不能为空', trigger: 'change' }], + deviceList: [{ required: true, message: '设备列表不能为空', trigger: 'change' }], + projectForm: [{ required: true, message: '项目表单不能为空', trigger: 'change' }], }) const resetForm = () => {