From 1159f2e96a1a1c95c6f8b478f8353357831458de Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期五, 29 五月 2026 15:56:41 +0800
Subject: [PATCH] 新疆马铃薯 1.代码更新

---
 src/views/equipmentManagement/measurementEquipment/components/formDia.vue |   34 
 src/views/equipmentManagement/measurementEquipment/filesDia.vue           |  110 ++-
 src/views/equipmentManagement/inspectionManagement/components/formDia.vue |  626 +++++++++++++-------
 src/views/equipmentManagement/upkeep/Form/formDia.vue                     |  781 +++++++++++++++----------
 src/views/equipmentManagement/ledger/Form.vue                             |  205 ++++--
 5 files changed, 1,089 insertions(+), 667 deletions(-)

diff --git a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
index 74cbb58..c535a90 100644
--- a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
+++ b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
@@ -1,48 +1,89 @@
 <template>
   <div>
-    <el-dialog :title="operationType === 'add' ? '鏂板宸℃浠诲姟' : '缂栬緫宸℃浠诲姟'"
-               v-model="dialogVisitable" width="800px" @close="cancel">
+    <el-dialog
+      v-model="dialogVisitable"
+      :title="operationType === 'add' ? '鏂板宸℃浠诲姟' : '缂栬緫宸℃浠诲姟'"
+      width="800px"
+      @close="cancel"
+    >
       <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
         <el-row>
           <el-col :span="12">
-            <el-form-item label="璁惧鍚嶇О" prop="taskId">
-              <el-select v-model="form.taskId" @change="setDeviceModel">
+            <el-form-item label="鎵�灞炲尯鍩�" prop="areaId">
+              <el-tree-select
+                v-model="form.areaId"
+                :data="areaOptions"
+                :props="areaTreeProps"
+                node-key="id"
+                value-key="id"
+                check-strictly
+                clearable
+                filterable
+                placeholder="璇烽�夋嫨鎵�灞炲尯鍩�"
+                style="width: 100%"
+                @change="handleAreaChange"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璁惧鍚嶇О" prop="deviceLedgerIds">
+              <el-select
+                v-model="form.deviceLedgerIds"
+                multiple
+                collapse-tags
+                collapse-tags-tooltip
+                clearable
+                filterable
+                placeholder="璇烽�夋嫨璁惧"
+                style="width: 100%"
+                @change="setDeviceModels"
+              >
                 <el-option
-                  v-for="(item, index) in deviceOptions"
-                  :key="index"
+                  v-for="item in deviceOptions"
+                  :key="item.id"
                   :label="item.deviceName"
                   :value="item.id"
-                ></el-option>
+                />
               </el-select>
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row>
           <el-col :span="12">
             <el-form-item label="宸℃浜�" prop="inspector">
               <el-select v-model="form.inspector" placeholder="璇烽�夋嫨" multiple clearable>
-                <el-option v-for="item in userList" :label="item.nickName" :value="item.userId" :key="item.userId"/>
+                <el-option
+                  v-for="item in userList"
+                  :key="item.userId"
+                  :label="item.nickName"
+                  :value="item.userId"
+                />
               </el-select>
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row>
           <el-col :span="12">
-            <el-form-item label="宸℃椤圭洰" prop="inspectionProject">
-              <el-input v-model="form.inspectionProject" placeholder="璇疯緭鍏ュ贰妫�椤圭洰" type="textarea" :autosize="{ minRows: 2, maxRows: 6 }" />
+            <el-form-item label="瑙勬牸鍨嬪彿">
+              <el-input
+                v-model="form.deviceModel"
+                placeholder="鑷姩甯﹀嚭瑙勬牸鍨嬪彿"
+                disabled
+              />
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row>
           <el-col :span="12">
             <el-form-item label="澶囨敞" prop="remarks">
-              <el-input v-model="form.remarks" placeholder="璇疯緭鍏ュ娉�" type="textarea" :autosize="{ minRows: 2, maxRows: 6 }" />
+              <el-input v-model="form.remarks" placeholder="璇疯緭鍏ュ娉�" type="textarea" />
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row>
           <el-col :span="12">
             <el-form-item label="鏄惁鍚敤" prop="isEnabled">
-              <el-radio-group v-model="form.isEnabled">
-                <el-radio :value="1">鏄�</el-radio>
-                <el-radio :value="0">鍚�</el-radio>
-              </el-radio-group>
+              <el-switch
+                v-model="form.isEnabled"
+                :active-value="1"
+                :inactive-value="0"
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -50,55 +91,64 @@
           <el-col :span="12">
             <el-form-item label="浠诲姟棰戠巼" prop="frequencyType">
               <el-select v-model="form.frequencyType" placeholder="璇烽�夋嫨" clearable>
-                <el-option label="姣忔棩" value="DAILY"/>
-                <el-option label="姣忓懆" value="WEEKLY"/>
-                <el-option label="姣忔湀" value="MONTHLY"/>
-                <!-- <el-option label="瀛e害" value="QUARTERLY"/> -->
+                <el-option label="姣忔棩" value="DAILY" />
+                <el-option label="姣忓懆" value="WEEKLY" />
+                <el-option label="姣忔湀" value="MONTHLY" />
+                <el-option label="姣忓勾" value="YEARLY" />
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12" v-if="form.frequencyType === 'DAILY' && form.frequencyType">
+          <el-col :span="12" v-if="form.frequencyType === 'DAILY'">
             <el-form-item label="鏃ユ湡" prop="frequencyDetail">
-              <el-time-picker v-model="form.frequencyDetail" placeholder="閫夋嫨鏃堕棿" format="HH:mm"
-                              value-format="HH:mm" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12" v-if="form.frequencyType === 'WEEKLY' && form.frequencyType">
-            <el-form-item label="鏃ユ湡" prop="frequencyDetail">
-              <el-select v-model="form.week" placeholder="璇烽�夋嫨" clearable style="width: 50%">
-                <el-option label="鍛ㄤ竴" value="MON"/>
-                <el-option label="鍛ㄤ簩" value="TUE"/>
-                <el-option label="鍛ㄤ笁" value="WED"/>
-                <el-option label="鍛ㄥ洓" value="THU"/>
-                <el-option label="鍛ㄤ簲" value="FRI"/>
-                <el-option label="鍛ㄥ叚" value="SAT"/>
-                <el-option label="鍛ㄦ棩" value="SUN"/>
-              </el-select>
-              <el-time-picker v-model="form.time" placeholder="閫夋嫨鏃堕棿" format="HH:mm"
-                              value-format="HH:mm"  style="width: 50%"/>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12" v-if="form.frequencyType === 'MONTHLY' && form.frequencyType">
-            <el-form-item label="鏃ユ湡" prop="frequencyDetail">
-              <el-date-picker
-                  v-model="form.frequencyDetail"
-                  type="datetime"
-                  clearable
-                  placeholder="閫夋嫨寮�濮嬫棩鏈�"
-                  format="DD,HH:mm"
-                  value-format="DD,HH:mm"
+              <el-time-picker
+                v-model="form.frequencyDetail"
+                placeholder="閫夋嫨鏃堕棿"
+                format="HH:mm"
+                value-format="HH:mm"
               />
             </el-form-item>
           </el-col>
-          <el-col :span="12" v-if="form.frequencyType === 'QUARTERLY' && form.frequencyType">
+          <el-col :span="12" v-if="form.frequencyType === 'WEEKLY'">
+            <el-form-item label="鏃ユ湡" prop="frequencyDetail">
+              <el-select v-model="form.week" placeholder="璇烽�夋嫨" clearable style="width: 50%">
+                <el-option label="鍛ㄤ竴" value="MON" />
+                <el-option label="鍛ㄤ簩" value="TUE" />
+                <el-option label="鍛ㄤ笁" value="WED" />
+                <el-option label="鍛ㄥ洓" value="THU" />
+                <el-option label="鍛ㄤ簲" value="FRI" />
+                <el-option label="鍛ㄥ叚" value="SAT" />
+                <el-option label="鍛ㄦ棩" value="SUN" />
+              </el-select>
+              <el-time-picker
+                v-model="form.time"
+                placeholder="閫夋嫨鏃堕棿"
+                format="HH:mm"
+                value-format="HH:mm"
+                style="width: 50%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="form.frequencyType === 'MONTHLY'">
             <el-form-item label="鏃ユ湡" prop="frequencyDetail">
               <el-date-picker
-                  v-model="form.frequencyDetail"
-                  type="datetime"
-                  clearable
-                  placeholder="閫夋嫨寮�濮嬫棩鏈�"
-                  format="MM,DD,HH:mm"
-                  value-format="MM,DD,HH:mm"
+                v-model="form.frequencyDetail"
+                type="datetime"
+                clearable
+                placeholder="閫夋嫨寮�濮嬫棩鏈�"
+                format="DD,HH:mm"
+                value-format="DD,HH:mm"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-if="form.frequencyType === 'YEARLY'">
+            <el-form-item label="鏃ユ湡" prop="frequencyDetail">
+              <el-date-picker
+                v-model="form.frequencyDetail"
+                type="datetime"
+                clearable
+                placeholder="閫夋嫨寮�濮嬫棩鏈�"
+                format="MM,DD,HH:mm"
+                value-format="MM,DD,HH:mm"
               />
             </el-form-item>
           </el-col>
@@ -115,192 +165,312 @@
 </template>
 
 <script setup>
-import {reactive, ref, getCurrentInstance, toRefs} from "vue";
-import useUserStore from '@/store/modules/user'
-import {addOrEditTimingTask} from "@/api/inspectionManagement/index.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
+import { getCurrentInstance, reactive, ref, toRefs } from "vue";
+import useUserStore from "@/store/modules/user";
+import { addOrEditTimingTask } from "@/api/inspectionManagement/index.js";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
+import {
+  getDeviceAreaTree,
+  getDeviceAreaTreeWithDevices,
+} from "@/api/equipmentManagement/deviceArea";
 
-const { proxy } = getCurrentInstance()
-const emit = defineEmits()
-const userStore = useUserStore()
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(["closeDia"]);
+const userStore = useUserStore();
 const dialogVisitable = ref(false);
-const operationType = ref('add');
+const operationType = ref("add");
+const areaOptions = ref([]);
 const deviceOptions = ref([]);
-const data = reactive({
-  form: {
-    taskId: undefined,
-    taskName: undefined,
-    inspector: '',
-    inspectorIds: '',
-    inspectionProject: '',
-    isEnabled: 1,
-    remarks: '',
-    frequencyType: '',
-    frequencyDetail: '',
-    week: '',
-    time: ''
-  },
-	rules: {
-		taskId: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" },],
-		inspector: [{ required: true, message: "璇疯緭鍏ュ贰妫�浜�", trigger: "blur" },],
-		dateStr: [{ required: true, message: "璇烽�夋嫨鐧昏鏃堕棿", trigger: "change" }],
-		frequencyType: [{ required: true, message: "璇烽�夋嫨浠诲姟棰戠巼", trigger: "change" }],
-		frequencyDetail: [
-			{
-				required: true,
-				message: "璇烽�夋嫨鏃ユ湡",
-				trigger: "change",
-				validator: (rule, value, callback) => {
-					if (!form.value.frequencyType) {
-						callback()
-						return
-					}
-					if (form.value.frequencyType === 'WEEKLY') {
-						if (!form.value.week || !form.value.time) {
-							callback(new Error("璇烽�夋嫨鏃ユ湡鍜屾椂闂�"))
-						} else {
-							callback()
-						}
-					} else {
-						if (!value) {
-							callback(new Error("璇烽�夋嫨鏃ユ湡"))
-						} else {
-							callback()
-						}
-					}
-				}
-			}
-		],
-		week: [
-			{
-				required: true,
-				message: "璇烽�夋嫨鏄熸湡",
-				trigger: "change",
-				validator: (rule, value, callback) => {
-					if (form.value.frequencyType === 'WEEKLY' && !value) {
-						callback(new Error("璇烽�夋嫨鏄熸湡"))
-					} else {
-						callback()
-					}
-				}
-			}
-		],
-		time: [
-			{
-				required: true,
-				message: "璇烽�夋嫨鏃堕棿",
-				trigger: "change",
-				validator: (rule, value, callback) => {
-					if (form.value.frequencyType === 'WEEKLY' && !value) {
-						callback(new Error("璇烽�夋嫨鏃堕棿"))
-					} else {
-						callback()
-					}
-				}
-			}
-		]
-	}
-})
-const { form, rules } = toRefs(data)
-const userList = ref([])
-
-const loadDeviceName = async () => {
-  const { data } = await getDeviceLedger();
-  deviceOptions.value = data;
+const userList = ref([]);
+const areaTreeProps = {
+  label: "areaName",
+  children: "children",
 };
 
-const setDeviceModel = (id) => {
-  const option = deviceOptions.value.find((item) => item.id === id);
-  if (option) {
-    form.value.taskName = option.deviceName;
-  }
-}
+const data = reactive({
+  form: {
+    areaId: undefined,
+    taskId: undefined,
+    taskIds: [],
+    taskIdsStr: undefined,
+    deviceLedgerIds: [],
+    deviceLedgerIdsStr: undefined,
+    taskName: undefined,
+    deviceModel: undefined,
+    inspector: [],
+    inspectorIds: "",
+    remarks: "",
+    isEnabled: 1,
+    frequencyType: "",
+    frequencyDetail: "",
+    week: "",
+    time: "",
+  },
+  rules: {
+    areaId: [{ required: true, message: "璇烽�夋嫨鎵�灞炲尯鍩�", trigger: "change" }],
+    deviceLedgerIds: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" }],
+    inspector: [{ required: true, message: "璇烽�夋嫨宸℃浜�", trigger: "change" }],
+    frequencyType: [{ required: true, message: "璇烽�夋嫨浠诲姟棰戠巼", trigger: "change" }],
+    frequencyDetail: [
+      {
+        required: true,
+        trigger: "change",
+        validator: (rule, value, callback) => {
+          if (!form.value.frequencyType) {
+            callback();
+            return;
+          }
+          if (form.value.frequencyType === "WEEKLY") {
+            if (!form.value.week || !form.value.time) {
+              callback(new Error("璇烽�夋嫨鏃ユ湡鍜屾椂闂�"));
+            } else {
+              callback();
+            }
+            return;
+          }
+          if (!value) {
+            callback(new Error("璇烽�夋嫨鏃ユ湡"));
+            return;
+          }
+          callback();
+        },
+      },
+    ],
+  },
+});
 
-// 鎵撳紑寮规
+const { form, rules } = toRefs(data);
+
+const loadAreaTree = async () => {
+  const { data } = await getDeviceAreaTree();
+  areaOptions.value = Array.isArray(data) ? data : [];
+};
+
+const normalizeIdList = (value) => {
+  if (Array.isArray(value)) {
+    return value
+      .map((item) => Number(item))
+      .filter((item) => Number.isFinite(item));
+  }
+  if (typeof value === "string") {
+    return value
+      .split(",")
+      .map((item) => Number(item.trim()))
+      .filter((item) => Number.isFinite(item));
+  }
+  if (value !== undefined && value !== null && value !== "") {
+    const numericValue = Number(value);
+    return Number.isFinite(numericValue) ? [numericValue] : [];
+  }
+  return [];
+};
+
+const getNodeDevices = (node) => {
+  const candidates = [
+    node?.deviceList,
+    node?.devices,
+    node?.deviceLedgerList,
+    node?.deviceLedgers,
+    node?.ledgerList,
+    node?.ledgers,
+  ];
+  return candidates.find((item) => Array.isArray(item)) || [];
+};
+
+const normalizeDevice = (item) => ({
+  ...item,
+  id: item.id ?? item.deviceLedgerId,
+  deviceName: item.deviceName ?? item.name,
+  deviceModel: item.deviceModel ?? item.model,
+});
+
+const collectDevices = (node) => {
+  const currentDevices = getNodeDevices(node).map(normalizeDevice);
+  const childDevices = (node?.children || []).flatMap((child) =>
+    collectDevices(child)
+  );
+  const deviceMap = new Map();
+  [...currentDevices, ...childDevices].forEach((item) => {
+    if (item?.id !== undefined && item?.id !== null) {
+      deviceMap.set(Number(item.id), item);
+    }
+  });
+  return Array.from(deviceMap.values());
+};
+
+const findAreaNode = (nodes, areaId) => {
+  for (const node of nodes || []) {
+    if (Number(node.id) === Number(areaId)) {
+      return node;
+    }
+    const target = findAreaNode(node.children, areaId);
+    if (target) {
+      return target;
+    }
+  }
+  return null;
+};
+
+const loadDevicesByArea = async (areaId) => {
+  if (!areaId) {
+    deviceOptions.value = [];
+    return;
+  }
+  const { data } = await getDeviceAreaTreeWithDevices();
+  const treeData = Array.isArray(data) ? data : [];
+  const currentNode = findAreaNode(treeData, areaId);
+  deviceOptions.value = currentNode ? collectDevices(currentNode) : [];
+};
+
+const syncDeviceFields = (deviceIds) => {
+  const selectedIds = normalizeIdList(deviceIds);
+  const selectedDevices = selectedIds
+    .map((deviceId) =>
+      deviceOptions.value.find((item) => Number(item.id) === Number(deviceId))
+    )
+    .filter(Boolean);
+
+  form.value.deviceLedgerIds = selectedIds;
+  form.value.deviceLedgerIdsStr = selectedIds.join(",");
+  form.value.taskIds = [...selectedIds];
+  form.value.taskIdsStr = selectedIds.join(",");
+  form.value.taskId = selectedIds[0];
+  form.value.taskName = selectedDevices
+    .map((item) => item.deviceName)
+    .filter(Boolean)
+    .join(",");
+  form.value.deviceModel = selectedDevices
+    .map((item) => item.deviceModel || "-")
+    .join(",");
+};
+
+const setDeviceModels = (deviceIds) => {
+  syncDeviceFields(deviceIds);
+};
+
+const handleAreaChange = async (areaId) => {
+  form.value.taskId = undefined;
+  form.value.taskIds = [];
+  form.value.taskIdsStr = undefined;
+  form.value.deviceLedgerIds = [];
+  form.value.deviceLedgerIdsStr = undefined;
+  form.value.taskName = undefined;
+  form.value.deviceModel = undefined;
+  await loadDevicesByArea(areaId);
+};
+
+const resetForm = () => {
+  if (proxy.$refs.formRef) {
+    proxy.$refs.formRef.resetFields();
+  }
+  form.value = {
+    areaId: undefined,
+    taskId: undefined,
+    taskIds: [],
+    taskIdsStr: undefined,
+    deviceLedgerIds: [],
+    deviceLedgerIdsStr: undefined,
+    taskName: undefined,
+    deviceModel: undefined,
+    inspector: [],
+    inspectorIds: "",
+    remarks: "",
+    isEnabled: 1,
+    frequencyType: "",
+    frequencyDetail: "",
+    week: "",
+    time: "",
+  };
+};
+
 const openDialog = async (type, row) => {
-  dialogVisitable.value = true
-  operationType.value = type
-  
-  // 閲嶇疆琛ㄥ崟
+  dialogVisitable.value = true;
+  operationType.value = type;
   resetForm();
-  
-  // 鍔犺浇鐢ㄦ埛鍒楄〃
+
   userListNoPageByTenantId().then((res) => {
     userList.value = res.data;
   });
-  
-  // 鍔犺浇璁惧鍒楄〃
-  await loadDeviceName();
-  
-  if (type === 'edit' && row) {
-    form.value = {...row}
-    form.value.inspector = form.value.inspectorIds.split(',').map(Number)
-    
-    // 濡傛灉鏈夎澶嘔D锛岃嚜鍔ㄨ缃澶囦俊鎭�
-    if (form.value.taskId) {
-      setDeviceModel(form.value.taskId);
+
+  await loadAreaTree();
+
+  if (type === "edit" && row) {
+    form.value = {
+      ...form.value,
+      ...row,
+      isEnabled: Number(row.isEnabled ?? row.status ?? 1),
+      inspector: row.inspectorIds
+        ? String(row.inspectorIds)
+            .split(",")
+            .map((item) => Number(item))
+            .filter((item) => Number.isFinite(item))
+        : [],
+    };
+
+    form.value.deviceLedgerIds = normalizeIdList(
+      row.deviceLedgerIds ??
+        row.deviceLedgerIdsStr ??
+        row.taskIds ??
+        row.taskIdsStr ??
+        row.taskId
+    );
+    form.value.deviceLedgerIdsStr = form.value.deviceLedgerIds.join(",");
+    form.value.taskIds = [...form.value.deviceLedgerIds];
+    form.value.taskIdsStr = form.value.deviceLedgerIds.join(",");
+    form.value.taskId = form.value.deviceLedgerIds[0];
+
+    if (form.value.areaId) {
+      await loadDevicesByArea(form.value.areaId);
+      syncDeviceFields(form.value.deviceLedgerIds);
     }
   }
-}
+};
 
-// 鍏抽棴瀵硅瘽妗�
 const cancel = () => {
-  resetForm()
-  dialogVisitable.value = false
-  emit('closeDia')
-}
+  resetForm();
+  dialogVisitable.value = false;
+  emit("closeDia");
+};
 
-// 閲嶇疆琛ㄥ崟鍑芥暟
-const resetForm = () => {
-  if (proxy.$refs.formRef) {
-    proxy.$refs.formRef.resetFields()
-  }
-  // 閲嶇疆琛ㄥ崟鏁版嵁纭繚璁惧淇℃伅姝g‘閲嶇疆
-  form.value = {
-    taskId: undefined,
-    taskName: undefined,
-    inspector: '',
-    inspectorIds: '',
-    inspectionProject: '',
-    isEnabled: 1,
-    remarks: '',
-    frequencyType: '',
-    frequencyDetail: '',
-    week: '',
-    time: ''
-  }
-}
-
-// 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate(async valid => {
-    if (valid) {
-      try {
-        form.value.inspectorIds = form.value.inspector.join(',')
-        delete form.value.inspector
-        
-        if (form.value.frequencyType === 'WEEKLY') {
-          let frequencyDetail = ''
-          frequencyDetail = form.value.week + ',' + form.value.time
-          form.value.frequencyDetail = frequencyDetail
-        }
-        
-        let res = await userStore.getInfo()
-        form.value.registrantId = res.user.userId
-        
-        await addOrEditTimingTask(form.value)
-        cancel()
-        proxy.$modal.msgSuccess('鎻愪氦鎴愬姛')
-      } catch (error) {
-        proxy.$modal.msgError('鎻愪氦澶辫触锛岃閲嶈瘯')
-      }
+  proxy.$refs.formRef.validate(async (valid) => {
+    if (!valid) {
+      return;
     }
-  })
-}
-defineExpose({ openDialog })
+    try {
+      syncDeviceFields(form.value.deviceLedgerIds);
+      const payload = { ...form.value };
+
+      payload.inspectorIds = Array.isArray(form.value.inspector)
+        ? form.value.inspector.join(",")
+        : "";
+      delete payload.inspector;
+
+      if (payload.frequencyType === "WEEKLY") {
+        payload.frequencyDetail = `${payload.week},${payload.time}`;
+      }
+
+      const userInfo = await userStore.getInfo();
+      payload.registrantId = userInfo.user.userId;
+      payload.taskId = form.value.deviceLedgerIds[0];
+      payload.taskIds = [...form.value.deviceLedgerIds];
+      payload.taskIdsStr = form.value.deviceLedgerIds.join(",");
+      payload.deviceLedgerIds = [...form.value.deviceLedgerIds];
+      payload.deviceLedgerIdsStr = form.value.deviceLedgerIds.join(",");
+      payload.taskName = form.value.taskName;
+      payload.deviceModel = form.value.deviceModel || "-";
+      payload.isEnabled = Number(form.value.isEnabled ?? 1);
+
+      await addOrEditTimingTask(payload);
+      cancel();
+      proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+    } catch (error) {
+      proxy.$modal.msgError("鎻愪氦澶辫触锛岃閲嶈瘯");
+    }
+  });
+};
+
+defineExpose({ openDialog });
 </script>
 
-<style scoped>
-
-</style>
\ No newline at end of file
+<style scoped></style>
diff --git a/src/views/equipmentManagement/ledger/Form.vue b/src/views/equipmentManagement/ledger/Form.vue
index f1d21f2..67c772f 100644
--- a/src/views/equipmentManagement/ledger/Form.vue
+++ b/src/views/equipmentManagement/ledger/Form.vue
@@ -2,6 +2,22 @@
   <el-form :model="form" label-width="120px" :rules="formRules" ref="formRef">
     <el-row :gutter="20">
       <el-col :span="12">
+        <el-form-item label="鎵�灞炲尯鍩�" prop="areaId">
+          <el-tree-select
+            v-model="form.areaId"
+            :data="areaOptions"
+            :props="areaTreeProps"
+            node-key="id"
+            value-key="id"
+            check-strictly
+            clearable
+            filterable
+            placeholder="璇烽�夋嫨鎵�灞炲尯鍩�"
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
         <el-form-item label="璁惧鍚嶇О" prop="deviceName">
           <el-input v-model="form.deviceName" placeholder="璇疯緭鍏ヨ澶囧悕绉�" />
         </el-form-item>
@@ -11,11 +27,11 @@
           <el-input v-model="form.deviceModel" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
         </el-form-item>
       </el-col>
-      <el-col :span="12">
+      <!-- <el-col :span="12">
         <el-form-item label="璁惧鍝佺墝" prop="deviceBrand">
           <el-input v-model="form.deviceBrand" placeholder="璇疯緭鍏ヨ澶囧搧鐗�" />
         </el-form-item>
-      </el-col>
+      </el-col> -->
       <el-col :span="12">
         <el-form-item label="璁惧绫诲瀷" prop="type">
           <el-select
@@ -72,59 +88,62 @@
         <el-form-item label="鏁伴噺" prop="number">
           <el-input-number :min="1" style="width: 100%"
             v-model="form.number"
-													 disabled
             placeholder="璇疯緭鍏ユ暟閲�"
             @change="mathNum"
           />
         </el-form-item>
       </el-col>
-      <el-col :span="12">
-        <el-form-item label="鍚◣鍗曚环" prop="taxIncludingPriceUnit">
-          <el-input-number :step="0.01" :min="0" style="width: 100%"
-            v-model="form.taxIncludingPriceUnit"
-            placeholder="璇疯緭鍏ュ惈绋庡崟浠�"
-            maxlength="10"
-            @change="mathNum"
-          />
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
-        <el-form-item label="鍚◣鎬讳环" prop="taxIncludingPriceTotal">
-          <el-input
-            v-model="form.taxIncludingPriceTotal"
-            placeholder="鑷姩鐢熸垚"
-            type="number"
-            disabled
-          />
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
-        <el-form-item label="绋庣巼(%)" prop="taxRate">
-          <el-select
-            v-model="form.taxRate"
-            placeholder="璇烽�夋嫨"
-            clearable
-            @change="mathNum"
-          >
-            <el-option
-              v-for="dict in tax_rate"
-              :key="dict.value"
-              :label="dict.label"
-              :value="Number(dict.value)"
-            />
-          </el-select>
-        </el-form-item>
-      </el-col>
-      <el-col :span="12">
-        <el-form-item label="涓嶅惈绋庢�讳环" prop="unTaxIncludingPriceTotal">
-          <el-input
-            v-model="form.unTaxIncludingPriceTotal"
-            placeholder="鑷姩鐢熸垚"
-            type="number"
-            disabled
-          />
-        </el-form-item>
-      </el-col>
+<!--      <el-col :span="12">-->
+<!--        <el-form-item label="鍚◣鍗曚环" prop="taxIncludingPriceUnit">-->
+<!--          <el-input-number :step="0.01" :min="0" style="width: 100%"-->
+<!--            v-model="form.taxIncludingPriceUnit"-->
+<!--            placeholder="璇疯緭鍏ュ惈绋庡崟浠�"-->
+<!--            maxlength="10"-->
+<!--            @change="mathNum"-->
+<!--          />-->
+<!--        </el-form-item>-->
+<!--      </el-col>-->
+<!--      <el-col :span="12">-->
+<!--        <el-form-item label="鍚◣鎬讳环" prop="taxIncludingPriceTotal">-->
+<!--          <el-input-->
+<!--            v-model="form.taxIncludingPriceTotal"-->
+<!--            placeholder="鑷姩鐢熸垚"-->
+<!--            type="number"-->
+<!--            disabled-->
+<!--          />-->
+<!--        </el-form-item>-->
+<!--      </el-col>-->
+<!--      <el-col :span="12">-->
+<!--        <el-form-item label="绋庣巼(%)" prop="taxRate">-->
+<!--          &lt;!&ndash; <el-input-->
+<!--            v-model="form.taxRate"-->
+<!--            placeholder="璇疯緭鍏ョ◣鐜�"-->
+<!--            type="number"-->
+<!--          >-->
+<!--            <template #append> % </template>-->
+<!--          </el-input> &ndash;&gt;-->
+<!--          <el-select-->
+<!--            v-model="form.taxRate"-->
+<!--            placeholder="璇烽�夋嫨"-->
+<!--            clearable-->
+<!--            @change="mathNum"-->
+<!--          >-->
+<!--            <el-option label="1" :value="1" />-->
+<!--            <el-option label="6" :value="6" />-->
+<!--            <el-option label="13" :value="13" />-->
+<!--          </el-select>-->
+<!--        </el-form-item>-->
+<!--      </el-col>-->
+<!--      <el-col :span="12">-->
+<!--        <el-form-item label="涓嶅惈绋庢�讳环" prop="unTaxIncludingPriceTotal">-->
+<!--          <el-input-->
+<!--            v-model="form.unTaxIncludingPriceTotal"-->
+<!--            placeholder="鑷姩鐢熸垚"-->
+<!--            type="number"-->
+<!--            disabled-->
+<!--          />-->
+<!--        </el-form-item>-->
+<!--      </el-col>-->
       <!-- <el-col :span="12">
         <el-form-item label="褰曞叆浜�" prop="createUser">
           <el-input v-model="form.createUser" placeholder="璇疯緭鍏ュ綍鍏ヤ汉" />
@@ -156,16 +175,16 @@
 					/>
 				</el-form-item>
 			</el-col>
-      <el-col :span="24">
-        <el-form-item label="璁惧鍥剧墖" prop="storageBlobDTOs">
-          <AttachmentUploadImage
-            v-model:fileList="fileList"
-            :limit="20"
-            :fileSize="5"
-            :buttonText="'涓婁紶鍥剧墖'"
-          />
-        </el-form-item>
-      </el-col>
+			<el-col :span="12">
+				<el-form-item label="鐗╄仈璁惧" prop="isIotDevice">
+					<el-switch v-model="form.isIotDevice" :active-value="1" :inactive-value="0" />
+				</el-form-item>
+			</el-col>
+			<el-col :span="12" v-if="form.isIotDevice === 1">
+				<el-form-item label="澶栭儴缂栫爜" prop="externalCode">
+					<el-input v-model="form.externalCode" placeholder="璇疯緭鍏ュ閮ㄧ紪鐮�" />
+				</el-form-item>
+			</el-col>
     </el-row>
   </el-form>
 </template>
@@ -174,23 +193,25 @@
 import useFormData from "@/hooks/useFormData";
 // import useUserStore from "@/store/modules/user";
 import { getLedgerById } from "@/api/equipmentManagement/ledger";
+import { getDeviceAreaTree } from "@/api/equipmentManagement/deviceArea";
 import dayjs from "dayjs";
 import {
   calculateTaxIncludeTotalPrice,
   calculateTaxExclusiveTotalPrice,
 } from "@/utils/summarizeTable";
 import { ElMessage } from "element-plus";
-import { ref, getCurrentInstance, computed } from "vue";
-import AttachmentUploadImage from '@/components/AttachmentUpload/image/index.vue';
-
-const { proxy } = getCurrentInstance();
-const { tax_rate } = proxy.useDict("tax_rate");
+import { ref, onMounted } from "vue";
 
 defineOptions({
   name: "璁惧鍙拌处琛ㄥ崟",
 });
 const formRef = ref(null);
 const operationType = ref('');
+const areaOptions = ref([]);
+const areaTreeProps = {
+  label: "areaName",
+  children: "children",
+};
 // 璁惧绫诲瀷鍥哄畾閫夐」
 const deviceTypeOptions = ref([
   '鐢熶骇璁惧',
@@ -200,6 +221,7 @@
   '鍏朵粬璁惧'
 ]);
 const formRules = {
+	areaId: [{ required: true, trigger: "change", message: "璇烽�夋嫨鎵�灞炲尯鍩�" }],
 	deviceName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
 	deviceModel: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
 	type: [{ required: true, trigger: "change", message: "璇烽�夋嫨鎴栬緭鍏ヨ澶囩被鍨�" }],
@@ -221,12 +243,25 @@
 			trigger: "blur" 
 		}
 	],
+	externalCode: [
+		{ 
+			validator: (rule, value, callback) => {
+				if (form.isIotDevice === 1 && !value) {
+					callback(new Error('鐗╄仈璁惧涓烘槸鏃讹紝璇疯緭鍏ュ閮ㄧ紪鐮�'));
+				} else {
+					callback();
+				}
+			}, 
+			trigger: "blur" 
+		}
+	],
 }
 
 const { form, resetForm } = useFormData({
+  areaId: undefined, // 鍖哄煙ID
   deviceName: undefined, // 璁惧鍚嶇О
   deviceModel: undefined, // 瑙勬牸鍨嬪彿
-  deviceBrand: undefined, // 璁惧鍝佺墝
+  // deviceBrand: undefined, // 璁惧鍝佺墝
   type: undefined, // 璁惧绫诲瀷
   supplierName: undefined, // 渚涘簲鍟�
   storageLocation: undefined, // 瀛樻斁浣嶇疆
@@ -240,19 +275,9 @@
   unTaxIncludingPriceTotal: undefined, // 涓嶅惈绋庢�讳环
   // createUser: useUserStore().nickName, // 褰曞叆浜�
   createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // 褰曞叆鏃ユ湡
-	planRuntimeTime: dayjs().format("YYYY-MM-DD"), // 褰曞叆鏃ユ湡
-  storageBlobDTOs: undefined, // 璁惧鍥剧墖鎻愪氦
-  storageBlobVOs: undefined, // 璁惧鍥剧墖灞曠ず
-});
-
-const fileList = computed({
-  get() {
-    return form.storageBlobVOs || [];
-  },
-  set(val) {
-    form.storageBlobDTOs = val;
-    form.storageBlobVOs = val;
-  }
+  planRuntimeTime: dayjs().format("YYYY-MM-DD"), // 棰勮杩愯鏃堕棿
+  isIotDevice: 0, // 鏄惁涓虹墿鑱旇澶� 0-鍚� 1-鏄�
+  externalCode: undefined, // 澶栭儴缂栫爜
 });
 
 const loadForm = async (id) => {
@@ -261,9 +286,10 @@
 	}
   const { code, data } = await getLedgerById(id);
   if (code == 200) {
+    form.areaId = data.areaId;
     form.deviceName = data.deviceName;
     form.deviceModel = data.deviceModel;
-    form.deviceBrand = data.deviceBrand;
+    // form.deviceBrand = data.deviceBrand;
     form.type = data.type;
     form.supplierName = data.supplierName;
     form.storageLocation = data.storageLocation;
@@ -282,9 +308,19 @@
     } else {
       form.planRuntimeTime = undefined;
     }
-    form.storageBlobVOs = data.storageBlobVOs;
-    form.storageBlobDTOs = data.storageBlobVOs;
+    // 鐗╄仈璁惧鍜屽閮ㄧ紪鐮�
+    form.isIotDevice = data.isIotDevice ?? 0;
+    form.externalCode = data.externalCode;
   }
+};
+
+const setAreaId = (areaId) => {
+  form.areaId = areaId;
+};
+
+const loadAreaOptions = async () => {
+  const res = await getDeviceAreaTree();
+  areaOptions.value = Array.isArray(res?.data) ? res.data : Array.isArray(res) ? res : [];
 };
 
 const handleDeviceTypeChange = (value) => {
@@ -322,9 +358,14 @@
   clearValidate();
 };
 
+onMounted(() => {
+  loadAreaOptions();
+});
+
 defineExpose({
   form,
   loadForm,
+  setAreaId,
   resetForm,
   clearValidate,
   resetFormAndValidate,
diff --git a/src/views/equipmentManagement/measurementEquipment/components/formDia.vue b/src/views/equipmentManagement/measurementEquipment/components/formDia.vue
index 16ac41f..6b7feec 100644
--- a/src/views/equipmentManagement/measurementEquipment/components/formDia.vue
+++ b/src/views/equipmentManagement/measurementEquipment/components/formDia.vue
@@ -36,6 +36,15 @@
 				</el-row>
 				<el-row :gutter="30">
 					<el-col :span="12">
+						<el-form-item label="瀹夎浣嶇疆锛�" prop="instationLocation">
+							<el-input
+								v-model="form.instationLocation"
+								placeholder="璇疯緭鍏�"
+								clearable
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
 						<el-form-item label="妫�瀹氬崟浣嶏細" prop="unit">
               <el-input
                   v-model="form.unit"
@@ -44,17 +53,17 @@
               />
 						</el-form-item>
 					</el-col>
-					<el-col :span="12">
-						<el-form-item label="璇佷功缂栧彿锛�" prop="model">
+				</el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="璇佷功缂栧彿锛�" prop="model">
               <el-input
                   v-model="form.model"
                   placeholder="璇疯緭鍏�"
                   clearable
               />
             </el-form-item>
-					</el-col>
-				</el-row>
-        <el-row :gutter="30">
+          </el-col>
           <el-col :span="12">
             <el-form-item label="鏈�鏂伴壌瀹氭棩鏈燂細" prop="mostDate">
               <el-date-picker
@@ -68,6 +77,8 @@
               />
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鏈夋晥鏃ユ湡(澶�)锛�" prop="valid">
               <el-input
@@ -80,6 +91,15 @@
               >
               <template #append>鏃�</template>
               </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="妫�瀹氬懆鏈燂細" prop="cycle">
+              <el-input
+                  v-model="form.cycle"
+                  placeholder="璇疯緭鍏ユ瀹氬懆鏈�"
+                  clearable
+              />
             </el-form-item>
           </el-col>
         </el-row>
@@ -164,8 +184,10 @@
 	form: {
 		code: "",
     name: "",
+    instationLocation: "",
     mostDate:"",
 		model: "",
+    cycle:"",
 		validDate: "",
 		nextDate: "",
 		userId: "",
@@ -181,7 +203,9 @@
 		nextDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
 		userId: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
 		recordDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+    instationLocation: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
     mostDate: [{required: true, message: "璇烽�夋嫨", trigger: "change"}],
+    cycle: [{required: true, message: "璇烽�夋嫨", trigger: "blur"}],
     valid: [
       {required: true, message: "璇疯緭鍏�", trigger: "blur"},
       {
diff --git a/src/views/equipmentManagement/measurementEquipment/filesDia.vue b/src/views/equipmentManagement/measurementEquipment/filesDia.vue
index 045ebc0..ee9dc3a 100644
--- a/src/views/equipmentManagement/measurementEquipment/filesDia.vue
+++ b/src/views/equipmentManagement/measurementEquipment/filesDia.vue
@@ -1,16 +1,38 @@
 <template>
   <div>
-    <el-dialog v-model="dialogFormVisible" title="涓婁紶闄勪欢" width="50%" @close="closeDia">
+    <el-dialog
+        v-model="dialogFormVisible"
+        title="涓婁紶闄勪欢"
+        width="50%"
+        @close="closeDia"
+    >
       <div style="margin-bottom: 10px;text-align: right">
-        <el-upload v-model:file-list="fileList" class="upload-demo" :action="uploadUrl"
-          :on-success="handleUploadSuccess" :on-error="handleUploadError" name="files" :show-file-list="false"
-          :headers="headers" style="display: inline;margin-right: 10px">
+        <el-upload
+            v-model:file-list="fileList"
+            class="upload-demo"
+            :action="uploadUrl"
+            :on-success="handleUploadSuccess"
+            :on-error="handleUploadError"
+            name="file"
+            :show-file-list="false"
+            :headers="headers"
+            style="display: inline;margin-right: 10px"
+        >
           <el-button type="primary">涓婁紶闄勪欢</el-button>
         </el-upload>
         <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
       </div>
-      <PIMTable rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :tableLoading="tableLoading"
-        :isSelection="true" @selection-change="handleSelectionChange" @pagination="paginationSearch" height="500">
+      <PIMTable
+          rowKey="id"
+          :column="tableColumn"
+          :tableData="tableData"
+          :page="page"
+          :tableLoading="tableLoading"
+          :isSelection="true"
+          @selection-change="handleSelectionChange"
+          @pagination="paginationSearch"
+          height="500"
+      >
       </PIMTable>
       <template #footer>
         <div class="dialog-footer">
@@ -23,16 +45,16 @@
 </template>
 
 <script setup>
-import { ref, reactive, getCurrentInstance } from "vue";
-import { ElMessageBox } from "element-plus";
-import { getToken } from "@/utils/auth.js";
+import {ref, reactive, getCurrentInstance} from "vue";
+import {ElMessageBox} from "element-plus";
+import {getToken} from "@/utils/auth.js";
 import filePreview from '@/components/filePreview/index.vue'
 import PIMTable from "@/components/PIMTable/PIMTable.vue";
 import {
-  addStorageAttachment,
-  delStorageAttachment,
-  getStorageAttachmentList
-} from "@/api/equipmentManagement/measurementEquipment.js";
+  fileAdd,
+  fileDel,
+  fileListPage
+} from "@/api/financialManagement/revenueManagement.js";
 const { proxy } = getCurrentInstance()
 const emit = defineEmits(['close'])
 
@@ -68,9 +90,9 @@
   },
 ]);
 const page = reactive({
-  current: 1,
-  size: 100,
-  total: 0,
+	current: 1,
+	size: 100,
+	total: 0,
 });
 const tableData = ref([]);
 const fileList = ref([]);
@@ -79,25 +101,24 @@
 const headers = ref({
   Authorization: "Bearer " + getToken(),
 });
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 涓婁紶鐨勬湇鍔″櫒鍦板潃
+const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
 
 // 鎵撳紑寮规
-const openDialog = (row, type) => {
+const openDialog = (row,type) => {
   accountType.value = type;
   dialogFormVisible.value = true;
   currentId.value = row.id;
   getList()
 }
 const paginationSearch = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  // 鍓嶇鍒嗛〉鏆備笉澶勭悊锛岀洿鎺ヨ皟鐢ㄨ幏鍙栧叏閲忓垪琛�
-  getList();
+	page.current = obj.page;
+	page.size = obj.limit;
+	getList();
 };
 const getList = () => {
-  getStorageAttachmentList({ recordId: currentId.value, recordType: accountType.value }).then(res => {
-    tableData.value = res.data;
-    page.total = res.data ? res.data.length : 0;
+  fileListPage({accountId: currentId.value,accountType:accountType.value, ...page}).then(res => {
+    tableData.value = res.data.records;
+		page.total = res.data.total;
   })
 }
 // 琛ㄦ牸閫夋嫨鏁版嵁
@@ -113,25 +134,22 @@
 // 涓婁紶鎴愬姛澶勭悊
 function handleUploadSuccess(res, file) {
   // 濡傛灉涓婁紶鎴愬姛
-  if (res.code == 200 && res.data && res.data.length > 0) {
-    const newFiles = res.data.map(item => ({
-      ...item,
-      name: item.originalFilename || item.name
-    }));
-    const mergedFiles = [...(tableData.value || []), ...newFiles];
-    const storageAttachmentDTO = {
-      recordType: accountType.value,
-      recordId: currentId.value,
-      application: "file",
-      storageBlobDTOs: mergedFiles
-    };
-    addStorageAttachment(storageAttachmentDTO).then(r => {
-      proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
-      getList()
-    })
+  if (res.code == 200) {
+    const fileRow = {}
+    fileRow.name = res.data.originalName
+    fileRow.url = res.data.tempPath
+    uploadFile(fileRow)
   } else {
     proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
   }
+}
+function uploadFile(file) {
+  file.accountId = currentId.value;
+  file.accountType = accountType.value;
+  fileAdd(file).then(res => {
+    proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
+    getList()
+  })
 }
 // 涓婁紶澶辫触澶勭悊
 function handleUploadError() {
@@ -139,13 +157,13 @@
 }
 // 涓嬭浇闄勪欢
 const downLoadFile = (row) => {
-  proxy.$download.byUrl(row.url, row.originalFilename);
+  proxy.$download.name(row.url);
 }
 // 鍒犻櫎
 const handleDelete = () => {
   let ids = [];
   if (selectedRows.value.length > 0) {
-    ids = selectedRows.value.map((item) => item.storageAttachmentId);
+    ids = selectedRows.value.map((item) => item.id);
   } else {
     proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
     return;
@@ -155,7 +173,7 @@
     cancelButtonText: "鍙栨秷",
     type: "warning",
   }).then(() => {
-    delStorageAttachment(ids).then((res) => {
+    fileDel(ids).then((res) => {
       proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
       getList();
     });
@@ -173,4 +191,6 @@
 });
 </script>
 
-<style scoped></style>
\ No newline at end of file
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/upkeep/Form/formDia.vue b/src/views/equipmentManagement/upkeep/Form/formDia.vue
index 6856ae1..1460686 100644
--- a/src/views/equipmentManagement/upkeep/Form/formDia.vue
+++ b/src/views/equipmentManagement/upkeep/Form/formDia.vue
@@ -1,330 +1,497 @@
 <template>
-	<FormDialog
-		v-model="dialogVisitable"
-		:title="operationType === 'add' ? '鏂板淇濆吇浠诲姟' : '缂栬緫淇濆吇浠诲姟'"
-		width="800px"
-		:operation-type="operationType"
-		@confirm="submitForm"
-		@cancel="cancel"
-		@close="cancel"
-	>
-		<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
-			<el-row>
-				<el-col :span="12">
-					<el-form-item label="璁惧鍚嶇О" prop="taskId">
-						<el-select v-model="form.taskId" @change="setDeviceModel" filterable>
-							<el-option
-								v-for="(item, index) in deviceOptions"
-								:key="index"
-								:label="item.deviceName"
-								:value="item.id"
-							></el-option>
-						</el-select>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12">
-					<el-form-item label="瑙勬牸鍨嬪彿">
-						<el-input
-							v-model="form.deviceModel"
-							placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
-							disabled
-						/>
-					</el-form-item>
-				</el-col>
-			</el-row>
-			<el-row>
-				<el-col :span="12">
-					<el-form-item label="褰曞叆浜�" prop="inspector">
-						<el-select
-							v-model="form.inspector"
-							filterable
-							default-first-option
-							:reserve-keyword="false"
-							placeholder="璇烽�夋嫨"
-							clearable
-						>
-							<el-option
-								v-for="item in userList"
-								:label="item.nickName"
-								:value="item.userId"
-								:key="item.userId"
-							/>
-						</el-select>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12">
-					<el-form-item label="鐧昏鏃堕棿" prop="registrationDate">
-						<el-date-picker
-							v-model="form.registrationDate"
-							type="date"
-							placeholder="閫夋嫨鐧昏鏃ユ湡"
-							format="YYYY-MM-DD"
-							value-format="YYYY-MM-DD"
-							style="width: 100%"
-						/>
-					</el-form-item>
-				</el-col>
-			</el-row>
-			<el-row>
-				<el-col :span="12">
-					<el-form-item label="淇濆吇椤圭洰" prop="machineryCategory">
-						<el-input
-							v-model.trim="form.machineryCategory"
-							placeholder="璇疯緭鍏ヤ繚鍏婚」鐩�"
-							maxlength="100"
-							clearable
-						/>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12">
-					<el-form-item label="淇濆吇浜�" prop="maintenancePerson">
-						<el-input
-							v-model.trim="form.maintenancePerson"
-							placeholder="璇疯緭鍏ヤ繚鍏讳汉濮撳悕"
-							maxlength="100"
-							clearable
-						/>
-					</el-form-item>
-				</el-col>
-			</el-row>
-			<el-row>
-				<el-col :span="12">
-					<el-form-item label="浠诲姟棰戠巼" prop="frequencyType">
-						<el-select v-model="form.frequencyType" placeholder="璇烽�夋嫨" clearable>
-							<el-option label="姣忔棩" value="DAILY"/>
-							<el-option label="姣忓懆" value="WEEKLY"/>
-							<el-option label="姣忔湀" value="MONTHLY"/>
-							<el-option label="瀛e害" value="QUARTERLY"/>
-						</el-select>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12" v-if="form.frequencyType === 'DAILY' && form.frequencyType">
-					<el-form-item label="鏃ユ湡" prop="frequencyDetail">
-						<el-time-picker v-model="form.frequencyDetail" placeholder="閫夋嫨鏃堕棿" format="HH:mm"
-														value-format="HH:mm" />
-					</el-form-item>
-				</el-col>
-				<el-col :span="12" v-if="form.frequencyType === 'WEEKLY' && form.frequencyType">
-					<el-form-item label="鏃ユ湡" prop="frequencyDetail">
-						<el-select v-model="form.week" placeholder="璇烽�夋嫨" clearable style="width: 50%">
-							<el-option label="鍛ㄤ竴" value="MON"/>
-							<el-option label="鍛ㄤ簩" value="TUE"/>
-							<el-option label="鍛ㄤ笁" value="WED"/>
-							<el-option label="鍛ㄥ洓" value="THU"/>
-							<el-option label="鍛ㄤ簲" value="FRI"/>
-							<el-option label="鍛ㄥ叚" value="SAT"/>
-							<el-option label="鍛ㄦ棩" value="SUN"/>
-						</el-select>
-						<el-time-picker v-model="form.time" placeholder="閫夋嫨鏃堕棿" format="HH:mm"
-														value-format="HH:mm"  style="width: 50%"/>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12" v-if="form.frequencyType === 'MONTHLY' && form.frequencyType">
-					<el-form-item label="鏃ユ湡" prop="frequencyDetail">
-						<el-date-picker
-							v-model="form.frequencyDetail"
-							type="datetime"
-							clearable
-							placeholder="閫夋嫨寮�濮嬫棩鏈�"
-							format="DD,HH:mm"
-							value-format="DD,HH:mm"
-						/>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12" v-if="form.frequencyType === 'QUARTERLY' && form.frequencyType">
-					<el-form-item label="鏃ユ湡" prop="frequencyDetail">
-						<el-date-picker
-							v-model="form.frequencyDetail"
-							type="datetime"
-							clearable
-							placeholder="閫夋嫨寮�濮嬫棩鏈�"
-							format="MM,DD,HH:mm"
-							value-format="MM,DD,HH:mm"
-						/>
-					</el-form-item>
-				</el-col>
-			</el-row>
-			<el-row>
-				<el-col :span="12">
-					<el-form-item label="澶囨敞" prop="remarks">
-						<el-input v-model="form.remarks" placeholder="璇疯緭鍏ュ娉�" type="textarea" />
-					</el-form-item>
-				</el-col>
-			</el-row>
-		</el-form>
-	</FormDialog>
+  <FormDialog
+    v-model="dialogVisitable"
+    :title="operationType === 'add' ? '鏂板淇濆吇浠诲姟' : '缂栬緫淇濆吇浠诲姟'"
+    width="800px"
+    :operation-type="operationType"
+    @confirm="submitForm"
+    @cancel="cancel"
+    @close="cancel"
+  >
+    <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="鎵�灞炲尯鍩�" prop="areaId">
+            <el-tree-select
+              v-model="form.areaId"
+              :data="areaOptions"
+              :props="areaTreeProps"
+              node-key="id"
+              value-key="id"
+              check-strictly
+              clearable
+              filterable
+              placeholder="璇烽�夋嫨鎵�灞炲尯鍩�"
+              style="width: 100%"
+              @change="handleAreaChange"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="璁惧鍚嶇О" prop="deviceLedgerIds">
+            <el-select
+              v-model="form.deviceLedgerIds"
+              filterable
+              clearable
+              multiple
+              collapse-tags
+              collapse-tags-tooltip
+              placeholder="璇烽�夋嫨璁惧"
+              style="width: 100%"
+              @change="setDeviceModels"
+            >
+              <el-option
+                v-for="item in deviceOptions"
+                :key="item.id"
+                :label="item.deviceName"
+                :value="item.id"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="瑙勬牸鍨嬪彿">
+            <el-input
+              v-model="form.deviceModel"
+              placeholder="鑷姩甯﹀嚭瑙勬牸鍨嬪彿"
+              disabled
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="褰曞叆浜�" prop="inspector">
+            <el-select
+              v-model="form.inspector"
+              filterable
+              default-first-option
+              :reserve-keyword="false"
+              placeholder="璇烽�夋嫨"
+              clearable
+            >
+              <el-option
+                v-for="item in userList"
+                :key="item.userId"
+                :label="item.nickName"
+                :value="item.userId"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鐧昏鏃堕棿" prop="registrationDate">
+            <el-date-picker
+              v-model="form.registrationDate"
+              type="date"
+              placeholder="閫夋嫨鐧昏鏃ユ湡"
+              format="YYYY-MM-DD"
+              value-format="YYYY-MM-DD"
+              style="width: 100%"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="浠诲姟棰戠巼" prop="frequencyType">
+            <el-select v-model="form.frequencyType" placeholder="璇烽�夋嫨" clearable>
+              <el-option label="姣忔棩" value="DAILY" />
+              <el-option label="姣忓懆" value="WEEKLY" />
+              <el-option label="姣忔湀" value="MONTHLY" />
+              <el-option label="瀛e害" value="QUARTERLY" />
+              <el-option label="姣忓勾" value="YEARLY" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12" v-if="form.frequencyType === 'DAILY'">
+          <el-form-item label="鏃ユ湡" prop="frequencyDetail">
+            <el-time-picker
+              v-model="form.frequencyDetail"
+              placeholder="閫夋嫨鏃堕棿"
+              format="HH:mm"
+              value-format="HH:mm"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12" v-if="form.frequencyType === 'WEEKLY'">
+          <el-form-item label="鏃ユ湡" prop="frequencyDetail">
+            <el-select v-model="form.week" placeholder="璇烽�夋嫨" clearable style="width: 50%">
+              <el-option label="鍛ㄤ竴" value="MON" />
+              <el-option label="鍛ㄤ簩" value="TUE" />
+              <el-option label="鍛ㄤ笁" value="WED" />
+              <el-option label="鍛ㄥ洓" value="THU" />
+              <el-option label="鍛ㄤ簲" value="FRI" />
+              <el-option label="鍛ㄥ叚" value="SAT" />
+              <el-option label="鍛ㄦ棩" value="SUN" />
+            </el-select>
+            <el-time-picker
+              v-model="form.time"
+              placeholder="閫夋嫨鏃堕棿"
+              format="HH:mm"
+              value-format="HH:mm"
+              style="width: 50%"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12" v-if="form.frequencyType === 'MONTHLY'">
+          <el-form-item label="鏃ユ湡" prop="frequencyDetail">
+            <el-date-picker
+              v-model="form.frequencyDetail"
+              type="datetime"
+              clearable
+              placeholder="閫夋嫨寮�濮嬫棩鏈�"
+              format="DD,HH:mm"
+              value-format="DD,HH:mm"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12" v-if="form.frequencyType === 'QUARTERLY'">
+          <el-form-item label="鏃ユ湡" prop="frequencyDetail">
+            <el-date-picker
+              v-model="form.frequencyDetail"
+              type="datetime"
+              clearable
+              placeholder="閫夋嫨寮�濮嬫棩鏈�"
+              format="MM,DD,HH:mm"
+              value-format="MM,DD,HH:mm"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12" v-if="form.frequencyType === 'YEARLY'">
+          <el-form-item label="鏃ユ湡" prop="frequencyDetail">
+            <el-date-picker
+              v-model="form.frequencyDetail"
+              type="datetime"
+              clearable
+              placeholder="閫夋嫨寮�濮嬫棩鏈�"
+              format="MM,DD,HH:mm"
+              value-format="MM,DD,HH:mm"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="鏄惁鍚敤" prop="isEnabled">
+            <el-switch
+              v-model="form.isEnabled"
+              :active-value="1"
+              :inactive-value="0"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="澶囨敞" prop="remarks">
+            <el-input v-model="form.remarks" placeholder="璇疯緭鍏ュ娉�" type="textarea" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+  </FormDialog>
 </template>
 
 <script setup>
+import { getCurrentInstance, reactive, ref, toRefs } from "vue";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
-import { reactive, ref, getCurrentInstance, toRefs } from "vue";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
-import { deviceMaintenanceTaskAdd, deviceMaintenanceTaskEdit } from "@/api/equipmentManagement/upkeep";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
+import {
+  getDeviceAreaTree,
+  getDeviceAreaTreeWithDevices,
+} from "@/api/equipmentManagement/deviceArea";
+import {
+  deviceMaintenanceTaskAdd,
+  deviceMaintenanceTaskEdit,
+} from "@/api/equipmentManagement/upkeep";
 import { getCurrentDate } from "@/utils/index.js";
 import useUserStore from "@/store/modules/user.js";
 
-const { proxy } = getCurrentInstance()
-const emit = defineEmits()
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(["closeDia"]);
 const dialogVisitable = ref(false);
-const operationType = ref('add');
+const operationType = ref("add");
+const areaOptions = ref([]);
 const deviceOptions = ref([]);
+const userList = ref([]);
+const areaTreeProps = {
+  label: "areaName",
+  children: "children",
+};
 const userStore = useUserStore();
-const data = reactive({
-	form: {
-		taskId: undefined,
-		taskName: undefined,
-		// 褰曞叆浜猴細鍗曢�変竴涓敤鎴� id
-		inspector: undefined,
-		machineryCategory: "",
-		remarks: '',
-		frequencyType: '',
-		frequencyDetail: '',
-		week: '',
-		time: '',
-		deviceModel: undefined, // 瑙勬牸鍨嬪彿
-		registrationDate: '',
-		maintenancePerson: '' // 淇濆吇浜�
-	},
-	rules: {
-		taskId: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" },],
-		inspector: [{ required: true, message: "璇烽�夋嫨褰曞叆浜�", trigger: "blur" },],
-		registrationDate: [{ required: true, message: "璇烽�夋嫨鐧昏鏃堕棿", trigger: "change" }],
-		machineryCategory: [{ required: true, message: "璇疯緭鍏ヤ繚鍏婚」鐩�", trigger: "blur" }]
-	}
-})
-const { form, rules } = toRefs(data)
-const userList = ref([])
 
-const loadDeviceName = async () => {
-	const { data } = await getDeviceLedger();
-	deviceOptions.value = data;
+const data = reactive({
+  form: {
+    areaId: undefined,
+    taskId: undefined,
+    taskIds: [],
+    taskIdsStr: undefined,
+    deviceLedgerIds: [],
+    deviceLedgerIdsStr: undefined,
+    taskName: undefined,
+    isEnabled: 1,
+    inspector: undefined,
+    remarks: "",
+    frequencyType: "",
+    frequencyDetail: "",
+    week: "",
+    time: "",
+    deviceModel: undefined,
+    registrationDate: "",
+  },
+  rules: {
+    areaId: [{ required: true, message: "璇烽�夋嫨鎵�灞炲尯鍩�", trigger: "change" }],
+    deviceLedgerIds: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" }],
+    inspector: [{ required: true, message: "璇烽�夋嫨褰曞叆浜�", trigger: "change" }],
+    registrationDate: [{ required: true, message: "璇烽�夋嫨鐧昏鏃堕棿", trigger: "change" }],
+  },
+});
+
+const { form, rules } = toRefs(data);
+
+const loadAreaTree = async () => {
+  const { data } = await getDeviceAreaTree();
+  areaOptions.value = Array.isArray(data) ? data : [];
 };
 
-// 閫夋嫨璁惧鏃讹紝鍥炲~璁惧鍚嶇О(taskName)鍜岃鏍煎瀷鍙�(deviceModel)
-const setDeviceModel = (id) => {
-	const option = deviceOptions.value.find((item) => item.id === id);
-	if (option) {
-		form.value.taskId = option.id;
-		form.value.taskName = option.deviceName;
-		form.value.deviceModel = option.deviceModel;
-	}
-}
+const normalizeIdList = (value) => {
+  if (Array.isArray(value)) {
+    return value
+      .map((item) => Number(item))
+      .filter((item) => Number.isFinite(item));
+  }
+  if (typeof value === "string") {
+    return value
+      .split(",")
+      .map((item) => Number(item.trim()))
+      .filter((item) => Number.isFinite(item));
+  }
+  if (value !== undefined && value !== null && value !== "") {
+    const numericValue = Number(value);
+    return Number.isFinite(numericValue) ? [numericValue] : [];
+  }
+  return [];
+};
 
-// 鎵撳紑寮规
-const openDialog = async (type, row) => {
-	dialogVisitable.value = true
-	operationType.value = type
-	
-	// 閲嶇疆琛ㄥ崟
-	resetForm();
-	
-	// 鍔犺浇鐢ㄦ埛鍒楄〃
-	userListNoPageByTenantId().then((res) => {
-		userList.value = res.data;
-	});
-	
-	// 鍔犺浇璁惧鍒楄〃
-	await loadDeviceName();
-	
-	if (type === 'edit' && row) {
-		form.value = { ...row }
-		// 缂栬緫鏃剁敤鎺ュ彛杩斿洖鐨� registrantId 鍥炴樉褰曞叆浜�
-		if (row.registrantId) {
-			form.value.inspector = row.registrantId
-		}
+const getNodeDevices = (node) => {
+  const candidates = [
+    node?.deviceList,
+    node?.devices,
+    node?.deviceLedgerList,
+    node?.deviceLedgers,
+    node?.ledgerList,
+    node?.ledgers,
+  ];
+  return candidates.find((item) => Array.isArray(item)) || [];
+};
 
-		// 濡傛灉鏈夎澶嘔D锛岃嚜鍔ㄨ缃澶囦俊鎭�
-		if (form.value.taskId) {
-			setDeviceModel(form.value.taskId);
-		}
-	} else if (type === 'add') {
-		// 鏂板鏃惰缃櫥璁版棩鏈熶负褰撳ぉ
-		form.value.registrationDate = getCurrentDate();
-		// 鏂板鏃惰缃綍鍏ヤ汉涓哄綋鍓嶇櫥褰曡处鎴�
-		form.value.inspector = userStore.id;
-	}
-}
+const normalizeDevice = (item) => ({
+  ...item,
+  id: item.id ?? item.deviceLedgerId,
+  deviceName: item.deviceName ?? item.name,
+  deviceModel: item.deviceModel ?? item.model,
+});
 
-// 鍏抽棴瀵硅瘽妗�
-const cancel = () => {
-	resetForm()
-	dialogVisitable.value = false
-	emit('closeDia')
-}
+const collectDevices = (node) => {
+  const currentDevices = getNodeDevices(node).map(normalizeDevice);
+  const childDevices = (node?.children || []).flatMap((child) =>
+    collectDevices(child)
+  );
+  const deviceMap = new Map();
+  [...currentDevices, ...childDevices].forEach((item) => {
+    if (item?.id !== undefined && item?.id !== null) {
+      deviceMap.set(Number(item.id), item);
+    }
+  });
+  return Array.from(deviceMap.values());
+};
 
-// 閲嶇疆琛ㄥ崟鍑芥暟
+const findAreaNode = (nodes, areaId) => {
+  for (const node of nodes || []) {
+    if (Number(node.id) === Number(areaId)) {
+      return node;
+    }
+    const target = findAreaNode(node.children, areaId);
+    if (target) {
+      return target;
+    }
+  }
+  return null;
+};
+
+const loadDevicesByArea = async (areaId) => {
+  if (!areaId) {
+    deviceOptions.value = [];
+    return;
+  }
+  const { data } = await getDeviceAreaTreeWithDevices();
+  const treeData = Array.isArray(data) ? data : [];
+  const currentNode = findAreaNode(treeData, areaId);
+  deviceOptions.value = currentNode ? collectDevices(currentNode) : [];
+};
+
+const syncDeviceFields = (deviceIds) => {
+  const selectedIds = normalizeIdList(deviceIds);
+  const selectedDevices = selectedIds
+    .map((deviceId) =>
+      deviceOptions.value.find((item) => Number(item.id) === Number(deviceId))
+    )
+    .filter(Boolean);
+
+  form.value.deviceLedgerIds = selectedIds;
+  form.value.deviceLedgerIdsStr = selectedIds.join(",");
+  form.value.taskIds = [...selectedIds];
+  form.value.taskIdsStr = selectedIds.join(",");
+  form.value.taskId = selectedIds[0];
+  form.value.taskName = selectedDevices
+    .map((item) => item.deviceName)
+    .filter(Boolean)
+    .join(",");
+  form.value.deviceModel = selectedDevices
+    .map((item) => item.deviceModel || "-")
+    .join(",");
+};
+
+const setDeviceModels = (deviceIds) => {
+  syncDeviceFields(deviceIds);
+};
+
+const handleAreaChange = async (areaId) => {
+  form.value.taskId = undefined;
+  form.value.taskIds = [];
+  form.value.taskIdsStr = undefined;
+  form.value.deviceLedgerIds = [];
+  form.value.deviceLedgerIdsStr = undefined;
+  form.value.taskName = undefined;
+  form.value.deviceModel = undefined;
+  await loadDevicesByArea(areaId);
+};
+
 const resetForm = () => {
-	if (proxy.$refs.formRef) {
-		proxy.$refs.formRef.resetFields()
-	}
-	// 閲嶇疆琛ㄥ崟鏁版嵁纭繚璁惧淇℃伅姝g‘閲嶇疆
-	form.value = {
-		taskId: undefined,
-		taskName: undefined,
-		inspector: undefined,
-		machineryCategory: "",
-		remarks: '',
-		frequencyType: '',
-		frequencyDetail: '',
-		week: '',
-		time: '',
-		deviceModel: undefined,
-		registrationDate: '',
-		maintenancePerson: ''
-	}
-}
+  if (proxy.$refs.formRef) {
+    proxy.$refs.formRef.resetFields();
+  }
+  form.value = {
+    areaId: undefined,
+    taskId: undefined,
+    taskIds: [],
+    taskIdsStr: undefined,
+    deviceLedgerIds: [],
+    deviceLedgerIdsStr: undefined,
+    taskName: undefined,
+    isEnabled: 1,
+    inspector: undefined,
+    remarks: "",
+    frequencyType: "",
+    frequencyDetail: "",
+    week: "",
+    time: "",
+    deviceModel: undefined,
+    registrationDate: "",
+  };
+};
 
-// 鎻愪氦琛ㄥ崟
+const openDialog = async (type, row) => {
+  dialogVisitable.value = true;
+  operationType.value = type;
+  resetForm();
+
+  userListNoPageByTenantId().then((res) => {
+    userList.value = res.data;
+  });
+
+  await loadAreaTree();
+
+  if (type === "edit" && row) {
+    form.value = {
+      ...form.value,
+      ...row,
+      isEnabled: Number(row.isEnabled ?? row.status ?? 1),
+      inspector: row.registrantId || row.inspector,
+    };
+    form.value.deviceLedgerIds = normalizeIdList(
+      row.deviceLedgerIds ??
+        row.deviceLedgerIdsStr ??
+        row.taskIds ??
+        row.taskIdsStr ??
+        row.taskId
+    );
+    form.value.deviceLedgerIdsStr = form.value.deviceLedgerIds.join(",");
+    form.value.taskIds = [...form.value.deviceLedgerIds];
+    form.value.taskIdsStr = form.value.deviceLedgerIds.join(",");
+    form.value.taskId = form.value.deviceLedgerIds[0];
+
+    if (form.value.areaId) {
+      await loadDevicesByArea(form.value.areaId);
+      syncDeviceFields(form.value.deviceLedgerIds);
+    }
+  } else {
+    form.value.registrationDate = getCurrentDate();
+    form.value.inspector = userStore.id;
+    deviceOptions.value = [];
+  }
+};
+
+const cancel = () => {
+  resetForm();
+  dialogVisitable.value = false;
+  emit("closeDia");
+};
+
 const submitForm = () => {
-	proxy.$refs["formRef"].validate(async valid => {
-		if (valid) {
-			try {
-				const payload = { ...form.value }
-				// 涓嶅啀鍚戝悗绔紶淇濆吇浜哄瓧娈碉紝浠呬娇鐢ㄦ帴鍙h姹傜殑 registrant / registrantId
-				// 鏍规嵁閫夋嫨鐨�"褰曞叆浜�"璁剧疆 registrant / registrantId
-				if (payload.inspector) {
-					const selectedUser = userList.value.find(
-						(u) => String(u.userId) === String(payload.inspector)
-					)
-					if (selectedUser) {
-						payload.registrantId = selectedUser.userId
-						payload.registrant = selectedUser.nickName
-					}
-				}
-				delete payload.inspector
-				delete payload.inspectorIds
-				
-				if (payload.frequencyType === 'WEEKLY') {
-					let frequencyDetail = ''
-					frequencyDetail = payload.week + ',' + payload.time
-					payload.frequencyDetail = frequencyDetail
-				}
-				
-				// 褰曞叆鏃ユ湡锛氱洿鎺ヤ娇鐢ㄨ〃鍗曢噷鐨� registrationDate 瀛楁
-				// 涓�浜涢粯璁ょ姸鎬佸瓧娈�
-				if (payload.status === undefined || payload.status === null || payload.status === '') {
-					payload.status = '0' // 榛樿鐘舵�侊紝鍙寜瀹為檯鏋氫妇璋冩暣
-				}
-				payload.active = true
-				payload.deleted = 0
-				
-				if (operationType.value === 'edit') {
-					await deviceMaintenanceTaskEdit(payload)
-				} else {
-					await deviceMaintenanceTaskAdd(payload)
-				}
-				cancel()
-				proxy.$modal.msgSuccess('鎻愪氦鎴愬姛')
-			} catch (error) {
-				proxy.$modal.msgError('鎻愪氦澶辫触锛岃閲嶈瘯')
-			}
-		}
-	})
-}
-defineExpose({ openDialog })
+  proxy.$refs.formRef.validate(async (valid) => {
+    if (!valid) {
+      return;
+    }
+    try {
+      syncDeviceFields(form.value.deviceLedgerIds);
+      const payload = { ...form.value };
+
+      if (payload.inspector) {
+        const selectedUser = userList.value.find(
+          (item) => String(item.userId) === String(payload.inspector)
+        );
+        if (selectedUser) {
+          payload.registrantId = selectedUser.userId;
+          payload.registrant = selectedUser.nickName;
+        }
+      }
+
+      delete payload.inspector;
+      delete payload.inspectorIds;
+
+      if (payload.frequencyType === "WEEKLY") {
+        payload.frequencyDetail = `${payload.week},${payload.time}`;
+      }
+
+      payload.isEnabled = Number(form.value.isEnabled ?? 1);
+
+      payload.deviceLedgerIds = [...form.value.deviceLedgerIds];
+      payload.deviceLedgerIdsStr = form.value.deviceLedgerIds.join(",");
+      payload.taskIds = [...form.value.deviceLedgerIds];
+      payload.taskIdsStr = form.value.deviceLedgerIds.join(",");
+      payload.taskId = form.value.deviceLedgerIds[0];
+      payload.taskName = form.value.taskName;
+      payload.deviceModel = form.value.deviceModel || "-";
+      payload.active = true;
+      payload.deleted = 0;
+
+      if (operationType.value === "edit") {
+        await deviceMaintenanceTaskEdit(payload);
+      } else {
+        await deviceMaintenanceTaskAdd(payload);
+      }
+
+      cancel();
+      proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+    } catch (error) {
+      proxy.$modal.msgError("鎻愪氦澶辫触锛岃閲嶈瘯");
+    }
+  });
+};
+
+defineExpose({ openDialog });
 </script>
 
-<style scoped>
-
-</style>
+<style scoped></style>

--
Gitblit v1.9.3