| src/api/equipmentManagement/repair.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/equipmentManagement/repair/maintain.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/equipmentManagement/upkeep/maintain.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/equipmentManagement/repair.js
@@ -70,3 +70,10 @@ data, }); }; export const getSparePartsList = (params) => { return request({ url: "/spareParts/listPage", method: "get", params, }); }; src/pages/equipmentManagement/repair/maintain.vue
@@ -82,7 +82,6 @@ @click.stop="showSparePart = true"></u-icon> </template> </u-form-item> <u-form-item v-if="selectedSpareParts.length" label="领用数量" border-bottom> @@ -119,7 +118,6 @@ format="YYYY-MM-DD HH:mm:ss" @confirm="onDateConfirm" @cancel="showDatePicker = false" /> <!-- 设备备件选择器 --> <up-popup :show="showSparePart" mode="bottom" @@ -155,7 +153,7 @@ import { onShow } from "@dcloudio/uni-app"; import PageHeader from "@/components/PageHeader.vue"; import { addMaintain } from "@/api/equipmentManagement/repair"; import { getSparePartsList } from "@/api/equipmentManagement/spareParts"; import { getSparePartsList } from "@/api/equipmentManagement/repair"; import useUserStore from "@/store/modules/user"; import dayjs from "dayjs"; @@ -232,7 +230,7 @@ }; selectedSpareParts.value = []; tempSelectedSpareParts.value = []; Object.keys(sparePartQtyMap).forEach((k) => delete sparePartQtyMap[k]); Object.keys(sparePartQtyMap).forEach(k => delete sparePartQtyMap[k]); }; const resetFormAndValidate = () => { @@ -265,7 +263,10 @@ } form.value.status = Number(form.value.status); // 领用数量校验 if (Array.isArray(form.value.sparePartsIds) && form.value.sparePartsIds.length > 0) { if ( Array.isArray(form.value.sparePartsIds) && form.value.sparePartsIds.length > 0 ) { for (const partId of form.value.sparePartsIds) { const qty = Number(sparePartQtyMap?.[partId]); if (!Number.isFinite(qty) || qty <= 0) { @@ -273,11 +274,19 @@ loading.value = false; return; } const part = sparePartOptions.value.find((p) => String(p.id) === String(partId)); const part = sparePartOptions.value.find( p => String(p.id) === String(partId) ); const stock = part?.quantity; if (stock !== null && stock !== undefined && Number.isFinite(Number(stock))) { if ( stock !== null && stock !== undefined && Number.isFinite(Number(stock)) ) { if (qty > Number(stock)) { showToast(`备件「${part?.name || ""}」领用数量不能超过库存(${stock})`); showToast( `备件「${part?.name || ""}」领用数量不能超过库存(${stock})` ); loading.value = false; return; } @@ -285,12 +294,21 @@ } } const spareIds = Array.isArray(form.value.sparePartsIds) ? form.value.sparePartsIds : []; const spareIds = Array.isArray(form.value.sparePartsIds) ? form.value.sparePartsIds : []; const submitData = { ...form.value, sparePartsIds: spareIds.length ? spareIds.join(",") : "", sparePartsQty: spareIds.length ? spareIds.map((pid) => sparePartQtyMap?.[pid] ?? 1).join(",") : "", sparePartsUseList: spareIds.length ? spareIds.map((pid) => ({ id: pid, quantity: sparePartQtyMap?.[pid] ?? 1 })) : [], sparePartsQty: spareIds.length ? spareIds.map(pid => sparePartQtyMap?.[pid] ?? 1).join(",") : "", sparePartsUseList: spareIds.length ? spareIds.map(pid => ({ id: pid, quantity: sparePartQtyMap?.[pid] ?? 1, })) : [], }; const { code } = await addMaintain({ id: id, ...submitData }); @@ -344,12 +362,14 @@ } }; const isSparePartSelected = (id) => { return tempSelectedSpareParts.value.some((p) => String(p.id) === String(id)); const isSparePartSelected = id => { return tempSelectedSpareParts.value.some(p => String(p.id) === String(id)); }; const toggleSparePartSelection = (item) => { const idx = tempSelectedSpareParts.value.findIndex((p) => String(p.id) === String(item.id)); const toggleSparePartSelection = item => { const idx = tempSelectedSpareParts.value.findIndex( p => String(p.id) === String(item.id) ); if (idx >= 0) { tempSelectedSpareParts.value.splice(idx, 1); delete sparePartQtyMap[item.id]; @@ -367,20 +387,23 @@ const confirmSparePartSelection = () => { selectedSpareParts.value = [...tempSelectedSpareParts.value]; form.value.sparePartsIds = selectedSpareParts.value.map((i) => i.id); form.value.sparePartsIds = selectedSpareParts.value.map(i => i.id); // 保底给未填的数量赋值 selectedSpareParts.value.forEach((p) => { if (!Number.isFinite(Number(sparePartQtyMap[p.id])) || Number(sparePartQtyMap[p.id]) <= 0) { selectedSpareParts.value.forEach(p => { if ( !Number.isFinite(Number(sparePartQtyMap[p.id])) || Number(sparePartQtyMap[p.id]) <= 0 ) { sparePartQtyMap[p.id] = 1; } }); showSparePart.value = false; }; const removeSparePart = (index) => { const removeSparePart = index => { const removed = selectedSpareParts.value.splice(index, 1)[0]; tempSelectedSpareParts.value = [...selectedSpareParts.value]; form.value.sparePartsIds = selectedSpareParts.value.map((i) => i.id); form.value.sparePartsIds = selectedSpareParts.value.map(i => i.id); if (removed?.id !== null && removed?.id !== undefined) { delete sparePartQtyMap[removed.id]; } @@ -408,17 +431,23 @@ initForm(); }); watch(showSparePart, (val) => { watch(showSparePart, val => { if (val) { tempSelectedSpareParts.value = [...selectedSpareParts.value]; tempSelectedSpareParts.value.forEach((p) => { if (!Number.isFinite(Number(sparePartQtyMap[p.id])) || Number(sparePartQtyMap[p.id]) <= 0) { tempSelectedSpareParts.value.forEach(p => { if ( !Number.isFinite(Number(sparePartQtyMap[p.id])) || Number(sparePartQtyMap[p.id]) <= 0 ) { sparePartQtyMap[p.id] = 1; } }); // 兜底:如果还没加载备件列表,打开弹窗时再拉一次 if (!Array.isArray(sparePartOptions.value) || sparePartOptions.value.length === 0) { if ( !Array.isArray(sparePartOptions.value) || sparePartOptions.value.length === 0 ) { fetchSparePartOptions().catch(() => {}); } } src/pages/equipmentManagement/upkeep/maintain.vue
@@ -79,7 +79,6 @@ @click="showSparePartPicker" /> </template> </u-form-item> <u-form-item v-if="selectedSpareParts.length" label="领用数量" border-bottom> @@ -236,10 +235,8 @@ import { ref, onMounted, reactive } from "vue"; import { onShow } from "@dcloudio/uni-app"; import PageHeader from "@/components/PageHeader.vue"; import { addMaintenance, } from "@/api/equipmentManagement/upkeep"; import { getSparePartsList } from "@/api/equipmentManagement/spareParts"; import { addMaintenance } from "@/api/equipmentManagement/upkeep"; import { getSparePartsList } from "@/api/equipmentManagement/repair"; import useUserStore from "@/store/modules/user"; import dayjs from "dayjs"; import { formatDateToYMD } from "@/utils/ruoyi"; @@ -337,7 +334,7 @@ maintenancestatusText.value = ""; selectedSpareParts.value = []; tempSelectedSpareParts.value = []; Object.keys(sparePartQtyMap).forEach((k) => delete sparePartQtyMap[k]); Object.keys(sparePartQtyMap).forEach(k => delete sparePartQtyMap[k]); sparePartsQtyRaw.value = ""; }; @@ -406,7 +403,9 @@ return; } // 领用数量校验 const spareIds = Array.isArray(form.value.sparePartsIds) ? form.value.sparePartsIds : []; const spareIds = Array.isArray(form.value.sparePartsIds) ? form.value.sparePartsIds : []; if (spareIds.length > 0) { for (const partId of spareIds) { const qty = Number(sparePartQtyMap?.[partId]); @@ -415,11 +414,19 @@ loading.value = false; return; } const part = sparePartOptions.value.find((p) => String(p.id || p.value) === String(partId)); const part = sparePartOptions.value.find( p => String(p.id || p.value) === String(partId) ); const stock = part?.quantity; if (stock !== null && stock !== undefined && Number.isFinite(Number(stock))) { if ( stock !== null && stock !== undefined && Number.isFinite(Number(stock)) ) { if (qty > Number(stock)) { showToast(`备件「${part?.name || ""}」领用数量不能超过库存(${stock})`); showToast( `备件「${part?.name || ""}」领用数量不能超过库存(${stock})` ); loading.value = false; return; } @@ -431,8 +438,15 @@ ...form.value, imagesFile: form.value.status == "1" ? uploadFiles.value : [], sparePartsIds: spareIds.length ? spareIds.join(",") : "", sparePartsQty: spareIds.length ? spareIds.map((pid) => sparePartQtyMap?.[pid] ?? 1).join(",") : "", sparePartsUseList: spareIds.length ? spareIds.map((pid) => ({ id: pid, quantity: sparePartQtyMap?.[pid] ?? 1 })) : [], sparePartsQty: spareIds.length ? spareIds.map(pid => sparePartQtyMap?.[pid] ?? 1).join(",") : "", sparePartsUseList: spareIds.length ? spareIds.map(pid => ({ id: pid, quantity: sparePartQtyMap?.[pid] ?? 1, })) : [], }; const { code } = await addMaintenance({ id: id, ...submitData }); @@ -512,10 +526,13 @@ // 显示设备备件选择器 const showSparePartPicker = () => { tempSelectedSpareParts.value = [...selectedSpareParts.value]; tempSelectedSpareParts.value.forEach((p) => { tempSelectedSpareParts.value.forEach(p => { const pid = p?.id ?? p?.value; if (pid !== null && pid !== undefined) { if (!Number.isFinite(Number(sparePartQtyMap[pid])) || Number(sparePartQtyMap[pid]) <= 0) { if ( !Number.isFinite(Number(sparePartQtyMap[pid])) || Number(sparePartQtyMap[pid]) <= 0 ) { sparePartQtyMap[pid] = 1; } } @@ -541,7 +558,10 @@ delete sparePartQtyMap[itemId]; } else { tempSelectedSpareParts.value.push(item); if (!Number.isFinite(Number(sparePartQtyMap[itemId])) || Number(sparePartQtyMap[itemId]) <= 0) { if ( !Number.isFinite(Number(sparePartQtyMap[itemId])) || Number(sparePartQtyMap[itemId]) <= 0 ) { sparePartQtyMap[itemId] = 1; } } @@ -550,11 +570,16 @@ // 确认备件选择 const confirmSparePartSelection = () => { selectedSpareParts.value = [...tempSelectedSpareParts.value]; form.value.sparePartsIds = selectedSpareParts.value.map(item => item.id || item.value); selectedSpareParts.value.forEach((p) => { form.value.sparePartsIds = selectedSpareParts.value.map( item => item.id || item.value ); selectedSpareParts.value.forEach(p => { const pid = p?.id ?? p?.value; if (pid !== null && pid !== undefined) { if (!Number.isFinite(Number(sparePartQtyMap[pid])) || Number(sparePartQtyMap[pid]) <= 0) { if ( !Number.isFinite(Number(sparePartQtyMap[pid])) || Number(sparePartQtyMap[pid]) <= 0 ) { sparePartQtyMap[pid] = 1; } } @@ -565,7 +590,9 @@ // 移除已选备件 const removeSparePart = index => { const removed = selectedSpareParts.value.splice(index, 1)[0]; form.value.sparePartsIds = selectedSpareParts.value.map(item => item.id || item.value); form.value.sparePartsIds = selectedSpareParts.value.map( item => item.id || item.value ); const rid = removed?.id ?? removed?.value; if (rid !== null && rid !== undefined) delete sparePartQtyMap[rid]; }; @@ -671,7 +698,9 @@ const idArray = typeof sparePartsIds.value === "string" ? sparePartsIds.value.split(",") : (Array.isArray(sparePartsIds.value) ? sparePartsIds.value : []); : Array.isArray(sparePartsIds.value) ? sparePartsIds.value : []; if (idArray.length > 0) { selectedSpareParts.value = sparePartOptions.value @@ -688,28 +717,41 @@ quantity: option.quantity, })); // 设置备件IDs(保持数组,提交时再 join) form.value.sparePartsIds = idArray.map((v) => { form.value.sparePartsIds = idArray.map(v => { const n = Number(String(v).trim()); return Number.isFinite(n) ? n : String(v).trim(); }); // 回显领用数量(若有 sparePartsQty) if (typeof sparePartsQtyRaw.value === "string" && sparePartsQtyRaw.value.trim()) { const qtyArr = sparePartsQtyRaw.value.split(",").map((s) => Number(String(s).trim())); if ( typeof sparePartsQtyRaw.value === "string" && sparePartsQtyRaw.value.trim() ) { const qtyArr = sparePartsQtyRaw.value .split(",") .map(s => Number(String(s).trim())); selectedSpareParts.value.forEach((p, idx) => { const pid = p?.id ?? p?.value; const q = qtyArr[idx]; if (pid !== null && pid !== undefined && Number.isFinite(q) && q > 0) { if ( pid !== null && pid !== undefined && Number.isFinite(q) && q > 0 ) { sparePartQtyMap[pid] = q; } }); } // 默认数量兜底 selectedSpareParts.value.forEach((p) => { selectedSpareParts.value.forEach(p => { const pid = p?.id ?? p?.value; if (pid !== null && pid !== undefined) { if (!Number.isFinite(Number(sparePartQtyMap[pid])) || Number(sparePartQtyMap[pid]) <= 0) { if ( !Number.isFinite(Number(sparePartQtyMap[pid])) || Number(sparePartQtyMap[pid]) <= 0 ) { sparePartQtyMap[pid] = 1; } }