From b97ffffa75f2acfff21b842d69fa7526fbb9fed5 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 13 四月 2026 13:07:02 +0800
Subject: [PATCH] 新疆马铃薯 1.设备保养计划添加每年频率
---
src/views/equipmentManagement/upkeep/Form/PlanModal.vue | 245 +++++++++++++++++++++++++++++++++++++++---------
1 files changed, 196 insertions(+), 49 deletions(-)
diff --git a/src/views/equipmentManagement/upkeep/Form/PlanModal.vue b/src/views/equipmentManagement/upkeep/Form/PlanModal.vue
index 19095b9..e44d6af 100644
--- a/src/views/equipmentManagement/upkeep/Form/PlanModal.vue
+++ b/src/views/equipmentManagement/upkeep/Form/PlanModal.vue
@@ -8,27 +8,45 @@
@close="handleClose"
>
<el-form :model="form" label-width="100px">
+ <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-form-item label="璁惧鍚嶇О">
<el-select
- v-model="form.deviceLedgerId"
- @change="setDeviceModel"
- placeholder="璇烽�夋嫨璁惧"
+ v-model="form.deviceLedgerIds"
filterable
- default-first-option
- :reserve-keyword="false"
+ clearable
+ multiple
+ collapse-tags
+ collapse-tags-tooltip
+ 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-form-item label="瑙勬牸鍨嬪彿">
<el-input
v-model="form.deviceModel"
- placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
+ placeholder="鑷姩甯﹀嚭瑙勬牸鍨嬪彿"
disabled
/>
</el-form-item>
@@ -51,19 +69,19 @@
</el-form-item>
<el-form-item v-if="id" label="淇濅慨鐘舵��">
<el-select v-model="form.status">
- <el-option label="寰呬繚淇�" :value="0"></el-option>
- <el-option label="瀹岀粨" :value="1"></el-option>
- <el-option label="澶辫触" :value="2"></el-option>
+ <el-option label="寰呬繚淇�" :value="0" />
+ <el-option label="瀹岀粨" :value="1" />
+ <el-option label="澶辫触" :value="2" />
</el-select>
</el-form-item>
<el-form-item label="璁″垝淇濆吇鏃ユ湡">
<el-date-picker
- style="width: 100%"
v-model="form.maintenancePlanTime"
+ style="width: 100%"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD HH:mm:ss"
type="date"
- placeholder="璇烽�夋嫨璁″垝淇濆吇鏃ユ湡鏃ユ湡"
+ placeholder="璇烽�夋嫨璁″垝淇濆吇鏃ユ湡"
clearable
/>
</el-form-item>
@@ -72,18 +90,21 @@
</template>
<script setup>
+import { nextTick, onMounted, 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 { userListNoPage } from "@/api/system/user.js";
import {
addUpkeep,
editUpkeep,
getUpkeepById,
} from "@/api/equipmentManagement/upkeep";
-import { ElMessage } from "element-plus";
-import useFormData from "@/hooks/useFormData";
-import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
-import { onMounted } from "vue";
-import dayjs from "dayjs";
-import { userListNoPage } from "@/api/system/user.js";
+import {
+ getDeviceAreaTree,
+ getDeviceAreaTreeWithDevices,
+} from "@/api/equipmentManagement/deviceArea";
defineOptions({
name: "璁惧淇濆吇鏂板璁″垝",
@@ -94,47 +115,159 @@
const id = ref();
const visible = ref(false);
const loading = ref(false);
-
+const areaOptions = ref([]);
const deviceOptions = ref([]);
-const loadDeviceName = async () => {
- const { data } = await getDeviceLedger();
- deviceOptions.value = data;
+const userList = ref([]);
+const areaTreeProps = {
+ label: "areaName",
+ children: "children",
};
const { form, resetForm } = useFormData({
- deviceLedgerId: undefined, // 璁惧Id
- deviceName: undefined, // 璁惧鍚嶇О
- deviceModel: undefined, // 瑙勬牸鍨嬪彿
- maintenancePlanTime: undefined, // 璁″垝淇濆吇鏃ユ湡
- createUser: undefined, // 褰曞叆浜�
- status: 0, //淇濅慨鐘舵��
+ areaId: undefined,
+ deviceLedgerId: undefined,
+ deviceLedgerIds: [],
+ deviceLedgerIdsStr: undefined,
+ deviceName: undefined,
+ deviceModel: undefined,
+ maintenancePlanTime: undefined,
+ createUser: undefined,
+ status: 0,
});
-const setDeviceModel = (deviceId) => {
- const option = deviceOptions.value.find((item) => item.id === deviceId);
- form.deviceModel = option.deviceModel;
+const loadAreaTree = async () => {
+ const { data } = await getDeviceAreaTree();
+ areaOptions.value = Array.isArray(data) ? data : [];
};
-/**
- * @desc 璁剧疆琛ㄥ崟鍐呭
- * @param 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.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 handleAreaChange = async (areaId) => {
+ form.deviceLedgerId = undefined;
+ form.deviceLedgerIds = [];
+ form.deviceLedgerIdsStr = undefined;
+ form.deviceName = undefined;
+ form.deviceModel = undefined;
+ await loadDevicesByArea(areaId);
+};
+
const setForm = (data) => {
- form.deviceLedgerId = data.deviceLedgerId;
+ 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.createUser = Number(data.createUser);
form.status = data.status;
- form.maintenancePlanTime = dayjs(data.maintenancePlanTime).format(
- "YYYY-MM-DD HH:mm:ss"
- );
+ form.maintenancePlanTime = data.maintenancePlanTime
+ ? dayjs(data.maintenancePlanTime).format("YYYY-MM-DD HH:mm:ss")
+ : undefined;
};
-// 鐢ㄦ埛鍒楄〃
-const userList = ref([]);
-
onMounted(() => {
- loadDeviceName();
+ loadAreaTree();
userListNoPage().then((res) => {
userList.value = res.data;
});
@@ -145,16 +278,27 @@
id.value = editId;
visible.value = true;
await nextTick();
+ await loadAreaTree();
setForm(data);
+ await loadDevicesByArea(form.areaId);
+ syncDeviceFields(form.deviceLedgerIds);
};
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 editUpkeep({ id: unref(id), ...form })
- : await addUpkeep(form);
- if (code == 200) {
+ ? await editUpkeep({ id: unref(id), ...payload })
+ : await addUpkeep(payload);
+ if (code === 200) {
ElMessage.success(`${id.value ? "缂栬緫" : "鏂板"}璁″垝鎴愬姛`);
visible.value = false;
emits("ok");
@@ -174,9 +318,12 @@
visible.value = false;
};
-const openModal = () => {
+const openModal = async () => {
id.value = undefined;
visible.value = true;
+ await nextTick();
+ await loadAreaTree();
+ deviceOptions.value = [];
};
defineExpose({
--
Gitblit v1.9.3