136 lines
3.7 KiB
JavaScript
136 lines
3.7 KiB
JavaScript
import { defineStore } from "pinia";
|
|
import { ref, computed, watch } from "vue";
|
|
import { useRoute } from "vue-router";
|
|
import { getBuildings } from "@/apis/building";
|
|
import { getDashboard2D3D } from "@/apis/dashboard";
|
|
import { getAssetFloorList, getDepartmentList } from "@/apis/asset";
|
|
|
|
const useBuildingStore = defineStore("buildingInfo", () => {
|
|
// 狀態定義
|
|
const buildings = ref([]);
|
|
const selectedBuilding = ref(null);
|
|
const floorList = ref([]);
|
|
const deptList = ref([]);
|
|
const mainSubSys = ref([]);
|
|
// 控制顯示2D/3D切換與內容
|
|
const showForgeArea = ref(true);
|
|
const previewImageExt = ref("");
|
|
|
|
// 計算屬性
|
|
const mainSys = computed(() =>
|
|
mainSubSys.value.map(({ main_system_tag, full_name }) => ({
|
|
main_system_tag,
|
|
full_name,
|
|
}))
|
|
);
|
|
|
|
const subSys = computed(() => {
|
|
let subPages = [];
|
|
mainSubSys.value.forEach(({ main_system_tag, history_Sub_systems }) => {
|
|
subPages = [
|
|
...subPages,
|
|
...history_Sub_systems.map((Sub) => ({
|
|
...Sub,
|
|
main_system_tag,
|
|
key: Sub.sub_system_tag,
|
|
})),
|
|
];
|
|
});
|
|
return subPages;
|
|
});
|
|
|
|
const route = useRoute();
|
|
const selectedSystem = computed(() => {
|
|
if (route.params.sub_system_id && subSys.value.length > 0) {
|
|
return subSys.value.find((s) => s.key === route.params.sub_system_id);
|
|
}
|
|
return null;
|
|
});
|
|
|
|
// 獲取所有建築物
|
|
const fetchBuildings = async () => {
|
|
// const res = await getBuildings();
|
|
buildings.value = JSON.parse(localStorage.getItem("CviBuildingList")) || [];
|
|
const storedBuilding = JSON.parse(localStorage.getItem("CviBuilding"));
|
|
if (buildings.value.length > 0) {
|
|
selectedBuilding.value = storedBuilding || buildings.value[0]; // 預設選第一個建築
|
|
} else {
|
|
selectedBuilding.value = null; // 如果沒有建築物,清空選擇
|
|
}
|
|
};
|
|
|
|
// 獲取樓層資料
|
|
const fetchFloorList = async (building_guid) => {
|
|
const res = await getAssetFloorList(building_guid);
|
|
floorList.value =
|
|
res.data[0]?.floors.map((d) => ({
|
|
...d,
|
|
title: d.full_name,
|
|
key: d.floor_guid,
|
|
})) || [];
|
|
};
|
|
|
|
// 獲取部門資料
|
|
const fetchDepartmentList = async () => {
|
|
const res = await getDepartmentList();
|
|
deptList.value =
|
|
res.data.map((d) => ({
|
|
...d,
|
|
title: d.name,
|
|
key: d.id,
|
|
})) || [];
|
|
};
|
|
|
|
// 獲取2D、3D顯示與否
|
|
const fetchDashboard2D3D = async (BuildingId) => {
|
|
const res = await getDashboard2D3D(BuildingId);
|
|
showForgeArea.value = res.data.is3DEnabled;
|
|
previewImageExt.value = res.data.previewImageExt || "";
|
|
};
|
|
|
|
// 清除localStorage建築物
|
|
const deleteBuilding = () => {
|
|
localStorage.removeItem("CviBuildingList");
|
|
localStorage.removeItem("CviBuilding");
|
|
buildings.value = [];
|
|
selectedBuilding.value = null;
|
|
};
|
|
|
|
// 當 selectedBuilding 改變時,更新 floorList 和 deptList
|
|
watch(selectedBuilding, async (newBuilding) => {
|
|
if (newBuilding) {
|
|
localStorage.setItem("CviBuilding", JSON.stringify(newBuilding));
|
|
await Promise.all([
|
|
fetchFloorList(newBuilding.building_guid),
|
|
fetchDepartmentList(),
|
|
fetchDashboard2D3D(newBuilding.building_guid),
|
|
]);
|
|
}
|
|
});
|
|
|
|
// 初始化資料
|
|
const initialize = async () => {
|
|
await fetchBuildings();
|
|
};
|
|
|
|
return {
|
|
buildings,
|
|
selectedBuilding,
|
|
floorList,
|
|
deptList,
|
|
mainSubSys,
|
|
mainSys,
|
|
subSys,
|
|
selectedSystem,
|
|
showForgeArea,
|
|
previewImageExt,
|
|
deleteBuilding,
|
|
fetchBuildings,
|
|
fetchFloorList,
|
|
fetchDepartmentList,
|
|
fetchDashboard2D3D,
|
|
initialize,
|
|
};
|
|
});
|
|
export default useBuildingStore;
|