import useEnterpriseReportStore from "@/store/enterpriseReport"; import { defineComponent, onMounted, ref, watch } from "vue"; import style from "@/assets/style/Report/map.module.less"; import { Radio, Button, Switch, Select, Menu, message, Modal, Input, Checkbox, Dropdown } from "ant-design-vue"; const { Option } = Select; import { DownOutlined, CloseOutlined, FilterOutlined, AlignCenterOutlined } from "@ant-design/icons-vue"; import { useStore } from "@/hook/useStore"; import { addUserDefineArea, queryAllUserDefineArea, removeUserDefineArea, updateUserDefineArea, } from "@/http/api_graphql"; import { shallowRef } from "vue"; import { useHpaasDrawer } from "./useHpaasDrawer"; import { useHpaasSelector } from "./../report/map/picker/useHpaasSelector"; import { useHpaasSplitter, useHpaasEditor } from "./../report/map/picker/useHpaasEditor"; import { feature, multiPolygon, getCoords } from "@turf/turf"; const AreaPicker = defineComponent({ setup() { const { enterpriseData, activeTooltipUid, mapShowData, filters, map } = useStore(useEnterpriseReportStore); const { isDrawing, currentDrawingType, changeDrawType, cancelDraw, getDrawResult } = useHpaasDrawer(map); const { isSelecting, selectMode, selectPolygon, selectRoad, selectRoadSegment, clearSelect } = useHpaasSelector(map); const { isSplitting, beginSplitByLine, splitResult } = useHpaasSplitter(map); const { isEditing, beginEditPolygon, beginEditSinglePolygon, cancelEdit, getPolygonEditResult } = useHpaasEditor(map); const saveModalVisible = ref(false); const areas = new Map(); const saveAreaName = ref(""); const saveAreaColor = ref(""); const saveArea = () => { saveModalVisible.value = true; }; const handlesaveOk = async () => { if (!saveAreaColor.value || !saveAreaName.value) { message.error("请填写完整"); return; } saveModalVisible.value = false; if (saveAreaName.value) { const feature = getDrawResult(); if (feature) { await addUserDefineArea(saveAreaName.value, saveAreaColor.value, feature.geometry); loadAreaFromServer(); cancelDraw(); message.success("保存成功"); } else { message.error("获取图形失败"); } } }; const checkboxOptions = shallowRef([]); const loadAreaFromServer = async () => { const result: { color: string; geometry: any; id: number; name: string; user_id: string; }[] = await queryAllUserDefineArea(); const list: any[] = []; const nowCheckedIds = checkboxOptions.value .filter((v) => { return v.checked; }) .map((v) => { return v.value; }); result.forEach((r) => { const _feature = feature(r.geometry, { color: r.color, name: r.name, id: r.id, }); areas.set(r.id, _feature); list.push({ label: r.name, value: r.id, checked: nowCheckedIds.indexOf(r.id) !== -1 ? true : false, }); }); checkboxOptions.value = list; loadFilterArea(); }; const areaChecked = ref(true); const checkboxChange = async (e: any) => { const checked = e.target.checked; areaChecked.value = checked; loadFilterArea(); }; const loadFilterArea = async () => { const features = []; if (areaChecked.value) { for (let i = 0; i < checkboxOptions.value.length; i++) { const feature = areas.get(checkboxOptions.value[i].value); feature && features.push(feature); } } map.value?.polygonDrawLayer?.setData(features); }; const delArea = async (id: number) => { await removeUserDefineArea(id); loadAreaFromServer(); }; /**打断保存 */ watch( () => splitResult.value, async () => { const loading = message.loading("结果保存中"); const features = splitResult.value; if (!features) return; for (let key = 0; key < features.length; key++) { const feature = features[key]; const id = feature.properties?.id; const name = feature.properties?.name; const color = feature.properties?.color; const coords = getCoords(feature); if (coords.length > 1) { for (let i = 0; i < coords.length; i++) { const coord = coords[i]; const newFeature = multiPolygon([coord]); await addUserDefineArea(name + "-" + (i + 1), color, newFeature.geometry); } await delArea(id); } loadAreaFromServer(); loading(); } } ); onMounted(() => { loadAreaFromServer(); }); const saveEditResult = async () => { const features = getPolygonEditResult(); const loading = message.loading("结果保存中"); if (!features) return; const promises = features.map((feat) => { const id = +feat.properties?.id; return updateUserDefineArea(id, feat.geometry); }); isEditing.value = false; await Promise.all(promises); loadAreaFromServer(); loading(); // cancelSelect(); cancelEdit(); }; /* ---UI--- */ const DrawerDropdownButton = () => ( { return ( { changeDrawType("rect"); }} > 矩形 { changeDrawType("circle"); }} > 圆形 { changeDrawType("polygon"); }} > 多边形:点击 { changeDrawType("quickpolygon"); }} > 多边形:快速 { changeDrawType("polygonbyroad"); }} > 多边形:沿路 ); }} > 创建 ); const EditDropdownButton = () => ( { return ( 普通调整: 面 拓扑调整: 面 拆分面 沿路拆分面 合并面 ); }} > 编辑 ); const SelectDropdownButton = () => ( { // toggleSelect(); }} overlay={() => { return ( { selectPolygon("single"); }} > 单选:面 { selectPolygon("multi"); }} > 多选: 面 { selectRoad(); }} > 单选: 路 { selectRoadSegment(); }} > 单选:路段 {}} disabled> 圈选(多选) ); }} > 选择 ); const SaveAreaModal = () => ( { saveModalVisible.value = false; }} > { saveAreaName.value = e.target.value; }} placeholder={"请为此区域命名"} style="width:250px;margin-right:20px;" /> ); const CheckboxArea = () => (
{ checkboxChange(e); }} checked={areaChecked.value} > 自定义区域
{checkboxOptions.value.map((option) => { return (
delArea(option.value)} />
); })}
); const SaveDrawButtonGroup = () => (
); const SaveEditButtonGroup = () => (
); return () => (
{ if (checked) { map.value?.setDisplayMode("dark"); } else { map.value?.setDisplayMode("grey"); } }} /> 暗色模式
); }, }); export default AreaPicker;