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 = () => {