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

---
 src/views/equipmentManagement/repair/Modal/RepairModal.vue |  506 ++++++++++++++++++++++++++++++++------------------------
 1 files changed, 290 insertions(+), 216 deletions(-)

diff --git a/src/views/equipmentManagement/repair/Modal/RepairModal.vue b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
index 4a10071..022ae6f 100644
--- a/src/views/equipmentManagement/repair/Modal/RepairModal.vue
+++ b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
@@ -1,126 +1,101 @@
 <template>
-  <FormDialog v-model="visible"
-              :title="computedTitle"
-              :operation-type="operationType"
-              width="800px"
-              @confirm="sendForm"
-              @cancel="handleCancel"
-              @close="handleClose">
-    <el-form :model="form"
-             label-width="100px">
+  <FormDialog
+    v-model="visible"
+    :title="id ? '缂栬緫璁惧鎶ヤ慨' : '鏂板璁惧鎶ヤ慨'"
+    width="800px"
+    @confirm="sendForm"
+    @cancel="handleCancel"
+    @close="handleClose"
+  >
+    <el-form :model="form" label-width="100px">
       <el-row>
         <el-col :span="12">
+          <el-form-item label="鎵�灞炲尯鍩�">
+            <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="璁惧鍚嶇О">
-            <el-select v-model="form.deviceLedgerId"
-                       @change="setDeviceModel"
-                       filterable
-                       :disabled="operationType === 'view'">
-              <el-option v-for="(item, index) in deviceOptions"
-                         :key="index"
-                         :label="item.deviceName"
-                         :value="item.id"></el-option>
+            <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-input
+              v-model="form.deviceModel"
+              placeholder="鑷姩甯﹀嚭瑙勬牸鍨嬪彿"
+              disabled
+            />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="鎶ヤ慨鏃ユ湡">
-            <el-date-picker v-model="form.repairTime"
-                            placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
-                            format="YYYY-MM-DD"
-                            value-format="YYYY-MM-DD"
-                            type="date"
-                            clearable
-                            style="width: 100%"
-                            :disabled="operationType === 'view'" />
+            <el-date-picker
+              v-model="form.repairTime"
+              placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
+              format="YYYY-MM-DD"
+              value-format="YYYY-MM-DD"
+              type="date"
+              clearable
+              style="width: 100%"
+            />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="鎶ヤ慨浜�">
-            <el-input v-model="form.repairName"
-                      placeholder="璇疯緭鍏ユ姤淇汉"
-                      :disabled="operationType === 'view'" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="鎶ヤ慨鎶ヤ慨椤圭洰">
-            <el-input v-model="form.machineryCategory"
-                      placeholder="璇疯緭鍏ユ姤淇姤淇」鐩�"
-                      :disabled="operationType === 'view'" />
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <el-row>
-        <el-col :span="12">
-          <el-form-item label="缁翠慨浜�">
-            <el-input v-model="form.maintenanceName"
-                      placeholder="璇疯緭鍏ョ淮淇汉濮撳悕"
-                      :disabled="operationType === 'view'" />
+            <el-input v-model="form.repairName" placeholder="璇疯緭鍏ユ姤淇汉" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row v-if="id">
         <el-col :span="12">
           <el-form-item label="鎶ヤ慨鐘舵��">
-            <el-select v-model="form.status"
-                       disabled>
-              <el-option label="寰呯淮淇�"
-                         :value="0"></el-option>
-              <el-option label="宸查獙鏀�"
-                         :value="1"></el-option>
-              <el-option label="澶辫触"
-                         :value="2"></el-option>
+            <el-select v-model="form.status">
+              <el-option label="寰呯淮淇�" :value="0" />
+              <el-option label="瀹岀粨" :value="1" />
+              <el-option label="澶辫触" :value="2" />
             </el-select>
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <!-- 楠屾敹淇℃伅灞曠ず -->
-      <el-row v-if="id && (form.status === 1 || form.status === 3)">
-        <el-col :span="12">
-          <el-form-item label="楠屾敹浜�">
-            <el-input v-model="form.acceptanceName"
-                      disabled />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="楠屾敹鏃堕棿">
-            <el-input v-model="form.acceptanceTime"
-                      disabled />
-          </el-form-item>
-        </el-col>
-        <el-col :span="24">
-          <el-form-item label="楠屾敹澶囨敞">
-            <el-input v-model="form.acceptanceRemark"
-                      type="textarea"
-                      :rows="2"
-                      disabled />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row>
         <el-col :span="24">
           <el-form-item label="鏁呴殰鐜拌薄">
-            <el-input v-model="form.remark"
-                      :rows="2"
-                      type="textarea"
-                      placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
-                      :disabled="operationType === 'view'" />
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <el-row v-if="operationType !== 'view'"
-              :gutter="30">
-        <el-col :span="24">
-          <el-form-item label="闄勪欢"
-                        prop="attachmentIds">
-            <FileUpload v-model:file-list="form.storageBlobDTOs"
-                        :disabled="operationType === 'view'" />
+            <el-input
+              v-model="form.remark"
+              :rows="2"
+              type="textarea"
+              placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
+            />
           </el-form-item>
         </el-col>
       </el-row>
@@ -129,140 +104,239 @@
 </template>
 
 <script setup>
-  import FormDialog from "@/components/Dialog/FormDialog.vue";
-  import FileUpload from "@/components/AttachmentUpload/file/index.vue";
-  import {
-    addRepair,
-    editRepair,
-    getRepairById,
-  } from "@/api/equipmentManagement/repair";
-  import { ElMessage } from "element-plus";
-  import dayjs from "dayjs";
-  import useFormData from "@/hooks/useFormData";
-  import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
-  import useUserStore from "@/store/modules/user";
+import { nextTick, ref, unref } from "vue";
+import dayjs from "dayjs";
+import { ElMessage } from "element-plus";
+import FormDialog from "@/components/Dialog/FormDialog.vue";
+import useFormData from "@/hooks/useFormData";
+import useUserStore from "@/store/modules/user";
+import {
+  addRepair,
+  editRepair,
+  getRepairById,
+} from "@/api/equipmentManagement/repair";
+import {
+  getDeviceAreaTree,
+  getDeviceAreaTreeWithDevices,
+} from "@/api/equipmentManagement/deviceArea";
 
-  defineOptions({
-    name: "璁惧鎶ヤ慨寮圭獥",
-  });
+defineOptions({
+  name: "璁惧鎶ヤ慨寮圭獥",
+});
 
-  const emits = defineEmits(["ok"]);
+const emits = defineEmits(["ok"]);
 
-  const id = ref();
-  const visible = ref(false);
-  const loading = ref(false);
-  const operationType = ref(""); // add, edit, view
+const id = ref();
+const visible = ref(false);
+const loading = ref(false);
+const userStore = useUserStore();
+const areaOptions = ref([]);
+const deviceOptions = ref([]);
+const areaTreeProps = {
+  label: "areaName",
+  children: "children",
+};
 
-  const computedTitle = computed(() => {
-    if (operationType.value === "add") return "鏂板璁惧鎶ヤ慨";
-    if (operationType.value === "edit") return "缂栬緫璁惧鎶ヤ慨";
-    if (operationType.value === "view") return "璁惧鎶ヤ慨璇︽儏";
-    return "";
-  });
+const { form, resetForm } = useFormData({
+  areaId: undefined,
+  deviceLedgerId: undefined,
+  deviceLedgerIds: [],
+  deviceLedgerIdsStr: undefined,
+  deviceName: undefined,
+  deviceModel: undefined,
+  repairTime: dayjs().format("YYYY-MM-DD"),
+  repairName: userStore.nickName,
+  remark: undefined,
+  status: 0,
+});
 
-  const userStore = useUserStore();
-  const deviceOptions = ref([]);
-  const fileList = ref([]);
+const loadAreaTree = async () => {
+  const { data } = await getDeviceAreaTree();
+  areaOptions.value = Array.isArray(data) ? data : [];
+};
 
-  const loadDeviceName = async () => {
-    const { data } = await getDeviceLedger();
-    deviceOptions.value = 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 { form, resetForm } = useFormData({
-    deviceLedgerId: undefined, // 璁惧Id
-    deviceName: undefined, // 璁惧鍚嶇О
-    deviceModel: undefined, // 瑙勬牸鍨嬪彿
-    repairTime: dayjs().format("YYYY-MM-DD"), // 鎶ヤ慨鏃ユ湡锛岄粯璁ゅ綋澶�
-    repairName: userStore.nickName, // 鎶ヤ慨浜�
-    remark: undefined, // 鏁呴殰鐜拌薄
-    status: 0, // 鎶ヤ慨鐘舵��
-    machineryCategory: undefined,
-    storageBlobDTOs: [],
-    maintenanceName: undefined, // 缁翠慨浜�
-  });
+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 setDeviceModel = deviceId => {
-    const option = deviceOptions.value.find(item => item.id === deviceId);
-    form.deviceModel = option.deviceModel;
-  };
+const normalizeDevice = (item) => ({
+  ...item,
+  id: item.id ?? item.deviceLedgerId,
+  deviceName: item.deviceName ?? item.name,
+  deviceModel: item.deviceModel ?? item.model,
+});
 
-  const setForm = data => {
-    form.deviceLedgerId = data.deviceLedgerId;
-    form.deviceName = data.deviceName;
-    form.deviceModel = data.deviceModel;
-    form.repairTime = data.repairTime;
-    form.repairName = data.repairName;
-    form.remark = data.remark;
-    form.status = data.status;
-    form.machineryCategory = data.machineryCategory;
-    form.storageBlobDTOs = data.storageBlobVOs || [];
-    form.maintenanceName = data.maintenanceName;
-    form.acceptanceName = data.acceptanceName;
-    form.acceptanceTime = data.acceptanceTime;
-    form.acceptanceRemark = data.acceptanceRemark;
-  };
-
-  const sendForm = async () => {
-    loading.value = true;
-    try {
-      const { code } = id.value
-        ? await editRepair({ id: unref(id), ...form })
-        : await addRepair(form);
-      if (code == 200) {
-        ElMessage.success(`${id.value ? "缂栬緫" : "鏂板"}鎶ヤ慨鎴愬姛`);
-        visible.value = false;
-        emits("ok");
-      }
-    } finally {
-      loading.value = false;
+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);
     }
-  };
-
-  const handleCancel = () => {
-    resetForm();
-    visible.value = false;
-  };
-
-  const handleClose = () => {
-    resetForm();
-    visible.value = false;
-  };
-
-  const openAdd = async () => {
-    id.value = undefined;
-    operationType.value = "add";
-    visible.value = true;
-    fileList.value = [];
-    await nextTick();
-    await loadDeviceName();
-  };
-
-  const openEdit = async editId => {
-    const { data } = await getRepairById(editId);
-    id.value = editId;
-    operationType.value = "edit";
-    visible.value = true;
-    await nextTick();
-    await loadDeviceName();
-    setForm(data);
-  };
-
-  const openView = async viewId => {
-    const { data } = await getRepairById(viewId);
-    id.value = viewId;
-    operationType.value = "view";
-    visible.value = true;
-    await nextTick();
-    await loadDeviceName();
-    setForm(data);
-  };
-
-  defineExpose({
-    openAdd,
-    openEdit,
-    openView,
   });
+  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.deviceLedgerIds = selectedIds;
+  form.deviceLedgerId = selectedIds[0];
+  form.deviceLedgerIdsStr = selectedIds.join(",");
+  form.deviceName = selectedDevices
+    .map((item) => item.deviceName)
+    .filter(Boolean)
+    .join(",");
+  form.deviceModel = selectedDevices
+    .map((item) => item.deviceModel || "-")
+    .join(",");
+};
+
+const setDeviceModels = (deviceIds) => {
+  syncDeviceFields(deviceIds);
+};
+
+const setForm = (data) => {
+  form.areaId = data.areaId;
+  form.deviceLedgerIds = normalizeIdList(
+    data.deviceLedgerIds ?? data.deviceLedgerIdsStr ?? data.deviceLedgerId
+  );
+  form.deviceLedgerId = form.deviceLedgerIds[0];
+  form.deviceLedgerIdsStr =
+    data.deviceLedgerIdsStr ?? form.deviceLedgerIds.join(",");
+  form.deviceName = data.deviceName;
+  form.deviceModel = data.deviceModel;
+  form.repairTime = data.repairTime;
+  form.repairName = data.repairName;
+  form.remark = data.remark;
+  form.status = data.status;
+};
+
+const handleAreaChange = async (areaId) => {
+  form.deviceLedgerId = undefined;
+  form.deviceLedgerIds = [];
+  form.deviceLedgerIdsStr = undefined;
+  form.deviceName = undefined;
+  form.deviceModel = undefined;
+  await loadDevicesByArea(areaId);
+};
+
+const sendForm = async () => {
+  loading.value = true;
+  try {
+    syncDeviceFields(form.deviceLedgerIds);
+    const payload = {
+      ...form,
+      deviceLedgerId: form.deviceLedgerIds[0],
+      deviceLedgerIds: [...form.deviceLedgerIds],
+      deviceLedgerIdsStr: form.deviceLedgerIds.join(","),
+      deviceModel: form.deviceModel || "-",
+    };
+    const { code } = id.value
+      ? await editRepair({ id: unref(id), ...payload })
+      : await addRepair(payload);
+    if (code === 200) {
+      ElMessage.success(`${id.value ? "缂栬緫" : "鏂板"}鎶ヤ慨鎴愬姛`);
+      visible.value = false;
+      emits("ok");
+    }
+  } finally {
+    loading.value = false;
+  }
+};
+
+const handleCancel = () => {
+  resetForm();
+  visible.value = false;
+};
+
+const handleClose = () => {
+  resetForm();
+  visible.value = false;
+};
+
+const openAdd = async () => {
+  id.value = undefined;
+  visible.value = true;
+  await nextTick();
+  await loadAreaTree();
+  deviceOptions.value = [];
+};
+
+const openEdit = async (editId) => {
+  const { data } = await getRepairById(editId);
+  id.value = editId;
+  visible.value = true;
+  await nextTick();
+  await loadAreaTree();
+  setForm(data);
+  await loadDevicesByArea(form.areaId);
+  syncDeviceFields(form.deviceLedgerIds);
+};
+
+defineExpose({
+  openAdd,
+  openEdit,
+});
 </script>
 
 <style lang="scss" scoped></style>

--
Gitblit v1.9.3