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