import { apiFetch } from "./api.js"; import { dom } from "./dom.js"; import { loadPoints, openPointBinding } from "./points.js"; import { state } from "./state.js"; function equipmentOf(item) { return item && item.equipment ? item.equipment : item; } export function renderEquipmentOptions(selected = "") { const options = ['']; state.equipments.forEach((item) => { const equipment = equipmentOf(item); const isSelected = equipment.id === selected ? "selected" : ""; options.push( ``, ); }); dom.bindingEquipmentId.innerHTML = options.join(""); } export function resetEquipmentForm() { state.selectedEquipmentId = null; dom.equipmentForm.reset(); dom.equipmentId.value = ""; dom.equipmentPointList.innerHTML = '请选择设备'; } export function renderEquipments() { dom.equipmentList.innerHTML = ""; if (!state.equipments.length) { dom.equipmentList.innerHTML = '
暂无设备
'; dom.equipmentPointList.innerHTML = '暂无设备点位'; return; } state.equipments.forEach((item) => { const equipment = equipmentOf(item); const box = document.createElement("div"); box.className = `list-item ${state.selectedEquipmentId === equipment.id ? "selected" : ""}`; box.innerHTML = `
${equipment.code} ${item.point_count ?? 0} pts
${equipment.name}
${equipment.kind || "未设置类型"}
`; box.addEventListener("click", () => { state.selectedEquipmentId = equipment.id; dom.equipmentId.value = equipment.id || ""; dom.equipmentCode.value = equipment.code || ""; dom.equipmentName.value = equipment.name || ""; dom.equipmentKind.value = equipment.kind || ""; dom.equipmentDescription.value = equipment.description || ""; renderEquipments(); loadEquipmentPoints(equipment.id).catch((error) => { dom.statusText.textContent = error.message; }); }); const actions = document.createElement("div"); actions.className = "row"; const deleteBtn = document.createElement("button"); deleteBtn.className = "danger"; deleteBtn.textContent = "删除"; deleteBtn.addEventListener("click", (event) => { event.stopPropagation(); deleteEquipment(equipment.id).catch((error) => { dom.statusText.textContent = error.message; }); }); actions.appendChild(deleteBtn); box.appendChild(actions); dom.equipmentList.appendChild(box); }); } export async function loadEquipments() { const keyword = dom.equipmentKeyword.value.trim(); const query = keyword ? `?page=1&page_size=-1&keyword=${encodeURIComponent(keyword)}` : "?page=1&page_size=-1"; const data = await apiFetch(`/api/equipment${query}`); state.equipments = data.data || []; state.equipmentMap = new Map( state.equipments.map((item) => { const equipment = equipmentOf(item); return [equipment.id, equipment]; }), ); renderEquipmentOptions(); renderEquipments(); if (state.selectedEquipmentId && state.equipmentMap.has(state.selectedEquipmentId)) { await loadEquipmentPoints(state.selectedEquipmentId); } } export async function loadEquipmentPoints(equipmentId) { const points = await apiFetch(`/api/equipment/${equipmentId}/points`); dom.equipmentPointList.innerHTML = ""; if (!points.length) { dom.equipmentPointList.innerHTML = '该设备下暂无点位'; return; } points.forEach((point) => { const tr = document.createElement("tr"); tr.innerHTML = `
${point.name}
${point.node_id}
${point.signal_role || "--"} `; const actionCell = tr.lastElementChild; const editBtn = document.createElement("button"); editBtn.className = "secondary"; editBtn.textContent = "编辑绑定"; editBtn.addEventListener("click", () => openPointBinding(point)); const clearBtn = document.createElement("button"); clearBtn.className = "secondary"; clearBtn.textContent = "解绑"; clearBtn.addEventListener("click", () => { clearPointBinding(point.id).catch((error) => { dom.statusText.textContent = error.message; }); }); actionCell.append(editBtn, clearBtn); dom.equipmentPointList.appendChild(tr); }); } export async function saveEquipment(event) { event.preventDefault(); const payload = { code: dom.equipmentCode.value.trim(), name: dom.equipmentName.value.trim(), kind: dom.equipmentKind.value.trim() || null, description: dom.equipmentDescription.value.trim() || null, }; const id = dom.equipmentId.value; await apiFetch(id ? `/api/equipment/${id}` : "/api/equipment", { method: id ? "PUT" : "POST", body: JSON.stringify(payload), }); await loadEquipments(); await loadPoints(); } export async function deleteEquipment(equipmentId) { if (!window.confirm("确认删除该设备?")) { return; } await apiFetch(`/api/equipment/${equipmentId}`, { method: "DELETE" }); resetEquipmentForm(); await loadEquipments(); await loadPoints(); } export function openEquipmentDrawer() { dom.equipmentDrawer.classList.remove("hidden"); loadEquipments().catch((error) => { dom.statusText.textContent = error.message; }); } export function closeEquipmentDrawer() { dom.equipmentDrawer.classList.add("hidden"); } export async function clearPointBinding(pointId = dom.bindingPointId.value) { await apiFetch(`/api/point/${pointId}`, { method: "PUT", body: JSON.stringify({ equipment_id: null, signal_role: null }), }); dom.pointBindingModal.classList.add("hidden"); await loadEquipments(); await loadPoints(); }