291 lines
7.0 KiB
Vue
291 lines
7.0 KiB
Vue
<script setup>
|
|
import { getAssetIOTList } from "@/apis/asset";
|
|
import { ref, computed, inject, watch, onMounted } from "vue";
|
|
import ButtonGroup from "@/components/customUI/ButtonGroup.vue";
|
|
import useActiveBtn from "@/hooks/useActiveBtn";
|
|
import useBuildingStore from "@/stores/useBuildingStore";
|
|
import { getAssetSubPoint } from "@/apis/asset";
|
|
import { useI18n } from "vue-i18n";
|
|
const { t } = useI18n();
|
|
const { formState } = inject("asset_table_modal_form");
|
|
const tableColumns = computed(() => [
|
|
{
|
|
title: t("assetManagement.index"),
|
|
key: "index",
|
|
},
|
|
{
|
|
title: "tag",
|
|
key: "device_name",
|
|
},
|
|
{
|
|
title: t("assetManagement.point"),
|
|
key: "point_name",
|
|
},
|
|
{
|
|
title: t("assetManagement.operation"),
|
|
key: "operation",
|
|
width: 100,
|
|
},
|
|
]);
|
|
// 選小類
|
|
const store = useBuildingStore();
|
|
const {
|
|
items: sysTagItems,
|
|
changeActiveBtn: changeSysActiveBtn,
|
|
setItems: setSysItems,
|
|
selectedBtn: selectedSysItems,
|
|
} = useActiveBtn();
|
|
const modalColumns = computed(() => [
|
|
{
|
|
title: t("assetManagement.choose"),
|
|
key: "check",
|
|
width: 100,
|
|
},
|
|
{
|
|
title: "tag",
|
|
key: "device_name",
|
|
filter: true
|
|
},
|
|
{
|
|
title: t("assetManagement.point"),
|
|
key: "point_name",
|
|
},
|
|
]);
|
|
|
|
// 設定點位
|
|
const {
|
|
items: points,
|
|
changeActiveBtn: changeActivePoint,
|
|
setItems: setPoints,
|
|
selectedBtn: selectedPoints,
|
|
} = useActiveBtn();
|
|
|
|
const getPoint = async (sub_system_tag) => {
|
|
const res = await getAssetSubPoint(sub_system_tag);
|
|
setPoints(
|
|
res.data.map((d, index) => ({
|
|
...d,
|
|
title: d.points,
|
|
key: d.points,
|
|
active: false,
|
|
}))
|
|
);
|
|
};
|
|
|
|
// TODO: 抓取IOT
|
|
const iotData = ref([]);
|
|
const iotCheckedList = ref([]); // 初始選中的項目
|
|
const currentCheckedList = ref([]); // 當前勾選的項目
|
|
|
|
const getIOTData = async (sub_system_tag = null, points = null) => {
|
|
const res = await getAssetIOTList(sub_system_tag, points);
|
|
let data = res.data.map((d) => ({
|
|
...d,
|
|
title: d.full_name,
|
|
key: d.device_number + d.points,
|
|
checked: formState.value.sub_device?.some(
|
|
({ device_number, points }) =>
|
|
device_number + points === `${d.device_number}${d.points}`
|
|
),
|
|
}));
|
|
iotData.value = data;
|
|
if (!sub_system_tag && !points) {
|
|
iotCheckedList.value = data.filter(({ checked }) => checked);
|
|
currentCheckedList.value = [...iotCheckedList.value];
|
|
}
|
|
};
|
|
|
|
const onChange = (value, checked) => {
|
|
const d = iotData.value.find(
|
|
({ device_number, points }) => `${device_number}${points}` === value
|
|
);
|
|
let newList = [];
|
|
if (checked) {
|
|
newList = [...currentCheckedList.value, d];
|
|
} else {
|
|
newList = currentCheckedList.value.filter(
|
|
(item) => item.device_number + item.points !== value
|
|
);
|
|
}
|
|
currentCheckedList.value = newList;
|
|
return newList;
|
|
};
|
|
|
|
const openModal = () => {
|
|
asset_add_IoT_item.showModal();
|
|
};
|
|
|
|
const onOk = () => {
|
|
iotCheckedList.value = currentCheckedList.value;
|
|
formState.value.sub_device = currentCheckedList.value.map(
|
|
({ device_number, points }) => ({
|
|
device_number,
|
|
points,
|
|
})
|
|
);
|
|
onCancel();
|
|
};
|
|
|
|
const onCancel = () => {
|
|
asset_add_IoT_item.close();
|
|
};
|
|
|
|
watch(
|
|
[selectedSysItems, selectedPoints],
|
|
([newSys, newPoint]) => {
|
|
if (newSys || newPoint) {
|
|
getIOTData(newSys?.key, newPoint?.key);
|
|
}
|
|
},
|
|
{
|
|
deep: true,
|
|
}
|
|
);
|
|
watch(selectedSysItems, (newVal) => {
|
|
if (newVal) {
|
|
getPoint(newVal.key);
|
|
}
|
|
});
|
|
watch(
|
|
formState,
|
|
() => {
|
|
getIOTData();
|
|
setSysItems(
|
|
store.subSys.map(({ full_name, sub_system_tag }, index) => ({
|
|
title: full_name,
|
|
key: sub_system_tag,
|
|
active: 0,
|
|
}))
|
|
);
|
|
},
|
|
{
|
|
deep: true,
|
|
}
|
|
);
|
|
|
|
const deleteItem = (value) => {
|
|
const itemToDelete = iotCheckedList.value.find(
|
|
({ device_number, points }) => `${device_number}${points}` === value
|
|
);
|
|
|
|
if (itemToDelete) {
|
|
iotCheckedList.value = iotCheckedList.value.filter(
|
|
(item) => item.device_number + item.points !== value
|
|
);
|
|
currentCheckedList.value = iotCheckedList.value;
|
|
|
|
formState.value.sub_device = iotCheckedList.value.map(
|
|
({ device_number, points }) => ({
|
|
device_number,
|
|
points,
|
|
})
|
|
);
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<template>
|
|
<!-- IoT -->
|
|
<div class="flex flex-col mt-8 col-span-2">
|
|
<div class="flex justify-between items-center">
|
|
<span class="label-text-alt text-lg">
|
|
{{ $t("assetManagement.equipment_point") }}
|
|
</span>
|
|
<button
|
|
type="button"
|
|
class="btn btn-sm btn-add"
|
|
@click.stop.prevent="openModal"
|
|
>
|
|
<font-awesome-icon :icon="['fas', 'plus']" />
|
|
{{ $t("assetManagement.add_sensor") }}
|
|
</button>
|
|
</div>
|
|
<Table
|
|
:columns="tableColumns"
|
|
:dataSource="iotCheckedList"
|
|
:withStyle="false"
|
|
>
|
|
<template #bodyCell="{ record, column, index }">
|
|
<template v-if="column.key === 'index'">{{ index + 1 }}</template
|
|
><template v-if="column.key === 'operation'">
|
|
<span
|
|
class="text-base text-error cursor-pointer"
|
|
@click.stop.prevent="
|
|
() => deleteItem(record.device_number + record.points)
|
|
"
|
|
>
|
|
<FontAwesomeIcon
|
|
:icon="['fas', 'trash-alt']"
|
|
class="text-xl"
|
|
/> </span></template
|
|
></template>
|
|
</Table>
|
|
</div>
|
|
<Modal
|
|
id="asset_add_IoT_item"
|
|
:title="t('assetManagement.associated_device')"
|
|
:onCancel="onCancel"
|
|
width="900"
|
|
>
|
|
<template #modalContent>
|
|
<ButtonGroup
|
|
:items="sysTagItems"
|
|
:withLine="true"
|
|
:onclick="
|
|
(e, item) => {
|
|
changeSysActiveBtn(item);
|
|
}
|
|
"
|
|
class="my-3"
|
|
/>
|
|
<ButtonGroup
|
|
v-if="selectedSysItems"
|
|
:items="points"
|
|
:withLine="true"
|
|
:onclick="
|
|
(e, item) => {
|
|
changeActivePoint(item);
|
|
}
|
|
"
|
|
class="my-3"
|
|
/>
|
|
<Table :columns="modalColumns" :dataSource="iotData" :withStyle="false">
|
|
<template #bodyCell="{ record, column, index }">
|
|
<template v-if="column.key === 'check'">
|
|
<Checkbox
|
|
name="device_number"
|
|
:value="record.device_number + record.points"
|
|
:onChange="onChange"
|
|
:checked="
|
|
currentCheckedList?.some(
|
|
({ device_number, points }) =>
|
|
`${device_number}${points}` ===
|
|
`${record.device_number}${record.points}`
|
|
)
|
|
"
|
|
></Checkbox>
|
|
</template>
|
|
</template>
|
|
</Table>
|
|
</template>
|
|
<template #modalAction>
|
|
<button
|
|
type="reset"
|
|
class="btn btn-outline-success mr-2"
|
|
@click.prevent="onCancel"
|
|
>
|
|
{{ $t("button.cancel") }}
|
|
</button>
|
|
<button
|
|
type="submit"
|
|
class="btn btn-outline-success"
|
|
@click.prevent="onOk"
|
|
>
|
|
{{ $t("button.submit") }}
|
|
</button>
|
|
</template></Modal
|
|
>
|
|
</template>
|
|
|
|
<style lang="scss" scoped></style>
|