Browse Source

调整地图设计器数据结构

master
wangxiang 3 years ago
parent
commit
1a86db4611
  1. 187
      src/components/AMap/src/AMapDesigner/index.vue
  2. 32
      src/enums/amapEnum.ts

187
src/components/AMap/src/AMapDesigner/index.vue

@ -1,7 +1,8 @@
`<template> <template>
<div class="amap-designer"> <div class="amap-designer">
<div class="headToolbar"> <div v-show="mapProps.sidebarControl" class="headToolbar">
<ATooltip title="保存并发布" <ATooltip v-if="toolbar.includes('save')"
title="保存并发布"
placement="bottom" placement="bottom"
:arrowPointAtCenter="true" :arrowPointAtCenter="true"
> >
@ -9,7 +10,8 @@
<Icon icon="fa6-regular:floppy-disk" size="13"/>保存 <Icon icon="fa6-regular:floppy-disk" size="13"/>保存
</a-button> </a-button>
</ATooltip> </ATooltip>
<ATooltip title="新增任务" <ATooltip v-if="toolbar.includes('addTask')"
title="新增任务"
placement="bottom" placement="bottom"
:arrowPointAtCenter="true" :arrowPointAtCenter="true"
> >
@ -17,7 +19,8 @@
<Icon icon="fa6-regular:window-restore" size="13"/>任务 <Icon icon="fa6-regular:window-restore" size="13"/>任务
</a-button> </a-button>
</ATooltip> </ATooltip>
<ATooltip title="调整标记点" <ATooltip v-if="toolbar.includes('point')"
title="调整标记点"
placement="bottom" placement="bottom"
:arrowPointAtCenter="true" :arrowPointAtCenter="true"
> >
@ -25,7 +28,8 @@
<Icon icon="fa6-solid:location-dot" size="13"/>标记点 <Icon icon="fa6-solid:location-dot" size="13"/>标记点
</a-button> </a-button>
</ATooltip> </ATooltip>
<ATooltip title="放大" <ATooltip v-if="toolbar.includes('zoomIn')"
title="放大"
placement="bottom" placement="bottom"
:arrowPointAtCenter="true" :arrowPointAtCenter="true"
> >
@ -36,7 +40,8 @@
<a-button> <a-button>
{{ Math.ceil(mapState.defaultZoom * 10 * 1.1) + "%" }} {{ Math.ceil(mapState.defaultZoom * 10 * 1.1) + "%" }}
</a-button> </a-button>
<ATooltip title="缩小" <ATooltip v-if="toolbar.includes('zoomOut')"
title="缩小"
placement="bottom" placement="bottom"
:arrowPointAtCenter="true" :arrowPointAtCenter="true"
> >
@ -44,7 +49,8 @@
<Icon icon="fa6-solid:magnifying-glass-minus" size="13"/> <Icon icon="fa6-solid:magnifying-glass-minus" size="13"/>
</a-button> </a-button>
</ATooltip> </ATooltip>
<ATooltip title="重置" <ATooltip v-if="toolbar.includes('reset')"
title="重置"
placement="bottom" placement="bottom"
:arrowPointAtCenter="true" :arrowPointAtCenter="true"
> >
@ -111,7 +117,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import AMapLoader from '@amap/amap-jsapi-loader'; import AMapLoader from '@amap/amap-jsapi-loader';
import {reactive, watchEffect, getCurrentInstance, onBeforeMount, onUnmounted, ref, PropType} from 'vue'; import { reactive, watchEffect, getCurrentInstance, onBeforeMount, onUnmounted, ref, PropType, watch, toRefs, nextTick } from 'vue';
import { operatePanelColumns, MapData, MapPointType } from '../amap.data'; import { operatePanelColumns, MapData, MapPointType } from '../amap.data';
import hospital from '/@/assets/images/hospital.svg'; import hospital from '/@/assets/images/hospital.svg';
import medicalKit from '/@/assets/images/medical-kit.svg'; import medicalKit from '/@/assets/images/medical-kit.svg';
@ -129,13 +135,13 @@
import AButton from '/@/components/Button/src/BasicButton.vue'; import AButton from '/@/components/Button/src/BasicButton.vue';
import { Icon } from '/@/components/Icon'; import { Icon } from '/@/components/Icon';
import { useUserStore } from '/@/store/modules/user'; import { useUserStore } from '/@/store/modules/user';
import { split, divide, subtract, merge, isEmpty } from 'lodash-es'; import { split, divide, subtract, merge, isEmpty, cloneDeep } from 'lodash-es';
import componentSetting from '/@/settings/componentSetting'; import componentSetting from '/@/settings/componentSetting';
import { BasicUpload } from '/@/components/Upload'; import { BasicUpload } from '/@/components/Upload';
import { commonUpload } from '/@/api/platform/core/controller/upload'; import { commonUpload } from '/@/api/platform/core/controller/upload';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
import { listMapTaskPreset } from '/@/api/platform/common/controller/mapTaskPreset'; import { listMapTaskPreset } from '/@/api/platform/common/controller/mapTaskPreset';
import { getMapLogistic } from '/@/api/platform/common/controller/mapLogistic'; import { defaultMapData } from '/@/enums/amapEnum';
/** 类型规范统一声明定义区域 */ /** 类型规范统一声明定义区域 */
interface MapState { interface MapState {
@ -155,15 +161,18 @@
} }
const mapProps = defineProps({ const mapProps = defineProps({
mapId: propTypes.string.def(''), options: {
mapPoint: { type: [Object, String] as PropType<MapData | string>,
type: Array as PropType<{ default: () => ({})
lng: number | string;
lat: number | string;
}[]>,
default: () => [],
}, },
sidebarControl: propTypes.bool.def(true) sidebarControl: propTypes.bool.def(true),
siderWidth: propTypes.number.def(371),
toolbar: {
type: Array as PropType<string[]>,
default: () => ['save', 'addTask', 'point', 'zoomIn', 'zoomOut', 'reset']
},
toolbarHeight: propTypes.number.def(48),
toolbarControl: propTypes.bool.def(true),
}); });
let map; let map;
@ -186,7 +195,8 @@
toggleOperatePanelClass: { toggleOperatePanelClass: {
span: 'none', span: 'none',
p: 'block', p: 'block',
siderWidth: 371 siderWidth: 0,
toolbarHeight: 0
}, },
/** 面板(显示/隐藏)状态 */ /** 面板(显示/隐藏)状态 */
toggleStatus: true, toggleStatus: true,
@ -210,28 +220,7 @@
} }
}, },
/** 地图物流数据 */ /** 地图物流数据 */
mapData: { mapData: defaultMapData(),
name: '',
courierUserId: '',
courierUserName: '',
courierLng: undefined,
courierLat: undefined,
sendOrderId: '',
sendOrderName: '',
sendOrderLng: undefined,
sendOrderLat: undefined,
fileId: [],
estimateTime: '',
requireTime: '',
/** 地图任务数据 */
mapTask: [{
name: '宇宙任务',
taskType: '0',
mapTaskPreset: []
}],
/** 地图预览点数据 */
mapLogisticPoint: [],
},
/** 表单校验 */ /** 表单校验 */
rulesRef: { rulesRef: {
name: [ name: [
@ -369,9 +358,8 @@
const { lnglat } = ctx; const { lnglat } = ctx;
map.setZoomAndCenter(18, lnglat); map.setZoomAndCenter(18, lnglat);
}); });
const orgPoints = mapState.orgList.map((e: any) => ({ const orgPoints = mapState.orgList.map((org: any) => ({
lnglat: [e.mapLng, e.mapLat], lnglat: [org.mapLng, org.mapLat], ...org
...e
})); }));
orgMarkerCluster?.setData(orgPoints); orgMarkerCluster?.setData(orgPoints);
@ -420,9 +408,8 @@
const { lnglat } = ctx; const { lnglat } = ctx;
map.setZoomAndCenter(18, lnglat); map.setZoomAndCenter(18, lnglat);
}); });
const hospitalPoints = mapState.hospitalList.map((e: any) => ({ const hospitalPoints = mapState.hospitalList.map((hospital: any) => ({
lnglat: [e.mapLng, e.mapLat], lnglat: [hospital.mapLng, hospital.mapLat], ...hospital
...e
})); }));
hospitalMarkerCluster?.setData(hospitalPoints); hospitalMarkerCluster?.setData(hospitalPoints);
@ -465,9 +452,8 @@
const { lnglat } = ctx; const { lnglat } = ctx;
map.setZoomAndCenter(18, lnglat); map.setZoomAndCenter(18, lnglat);
}); });
const courierUserPoints = mapState.courierUserList.map((e: any) => ({ const courierUserPoints = mapState.courierUserList.map((courierUser: any) => ({
lnglat: [e.mapLng, e.mapLat], lnglat: [courierUser.mapLng, courierUser.mapLat], ...courierUser
...e
})); }));
courierUserMarkerCluster?.setData(courierUserPoints); courierUserMarkerCluster?.setData(courierUserPoints);
@ -492,27 +478,8 @@
}); });
// ,线 // ,线
handleMapReset(); if (!isEmpty(mapState.mapData.mapLogisticPoint)) {
if (mapProps.mapId) { const lngLatData = mapState.mapData.mapLogisticPoint.map(item => new AMap.LngLat(item.lng, item.lat));
getMapLogistic(mapProps.mapId).then(mapLogistic => {
if (!isEmpty(mapLogistic)) {
mapState.mapData = merge(mapState.mapData, mapLogistic);
const lngLatData = mapState.mapData.mapLogisticPoint.map(item => new AMap.LngLat(item.lng, item.lat));
const destination = lngLatData.pop();
destination && driving.search(new AMap.LngLat(mapState.mapData.courierLng, mapState.mapData.courierLat), destination, {
waypoints: lngLatData
}, function(status, result) {
if (status === 'complete') {
console.log('绘制地图路线完成');
} else {
console.error('获取地图数据失败:' + result);
}
});
}
});
} else {
// 线,ID
const lngLatData = mapProps.mapPoint.map(item => new AMap.LngLat(item.lng, item.lat));
const destination = lngLatData.pop(); const destination = lngLatData.pop();
destination && driving.search(new AMap.LngLat(mapState.mapData.courierLng, mapState.mapData.courierLat), destination, { destination && driving.search(new AMap.LngLat(mapState.mapData.courierLng, mapState.mapData.courierLat), destination, {
waypoints: lngLatData waypoints: lngLatData
@ -541,6 +508,7 @@
} }
}); });
/** 地图创建完成(动画关闭) */ /** 地图创建完成(动画关闭) */
function complete () { function complete () {
if (map) { if (map) {
@ -552,7 +520,16 @@
/** 监听内部响应式数据 */ /** 监听内部响应式数据 */
watchEffect(() => { watchEffect(() => {
mapState.toggleOperatePanelClass.siderWidth = mapProps.siderWidth;
mapState.toggleOperatePanelClass.toolbarHeight = mapProps.toolbarHeight;
if (!mapProps.sidebarControl) mapState.toggleOperatePanelClass.siderWidth = 0; if (!mapProps.sidebarControl) mapState.toggleOperatePanelClass.siderWidth = 0;
if (!mapProps.toolbarControl) mapState.toggleOperatePanelClass.toolbarHeight = 0;
});
watch(toRefs(mapProps).options, (newValue)=>{
setMapDataJson(newValue);
}, {
immediate: true,
deep: true
}); });
/** 处理切换操作面板 */ /** 处理切换操作面板 */
@ -561,7 +538,7 @@
if (mapState.toggleStatus) { if (mapState.toggleStatus) {
mapState.toggleOperatePanelClass.span='none'; mapState.toggleOperatePanelClass.span='none';
mapState.toggleOperatePanelClass.p = 'block'; mapState.toggleOperatePanelClass.p = 'block';
mapState.toggleOperatePanelClass.siderWidth = 371; mapState.toggleOperatePanelClass.siderWidth = mapProps.siderWidth;
} else { } else {
mapState.toggleOperatePanelClass.span='block'; mapState.toggleOperatePanelClass.span='block';
mapState.toggleOperatePanelClass.p = 'none'; mapState.toggleOperatePanelClass.p = 'none';
@ -632,6 +609,26 @@
map.zoomOut(); map.zoomOut();
} }
/** 设置地图数据json */
function setMapDataJson(data) {
let options = data;
if (typeof options === 'string') {
try {
options = eval('(' + options + ')');
} catch (e) {
console.error('非法配置');
options = {};
}
}
handleMapReset();
mapState.mapData = cloneDeep(merge(defaultMapData(), options));
}
/** 获取部件表单数据 */
function getMapDataJson () {
return cloneDeep(mapState.mapData);
}
/** 处理地图任务数据 */ /** 处理地图任务数据 */
async function handleMapTask() { async function handleMapTask() {
setTableData(mapState.mapData.mapTask); setTableData(mapState.mapData.mapTask);
@ -710,24 +707,27 @@
/** 处理地图重置 */ /** 处理地图重置 */
function handleMapReset() { function handleMapReset() {
// nextTick(()=> {
map.clearMap(); //
// map.resize();
formElRef.value.resetFields(); map.clearMap();
formElRef.value.clearValidate(); //
// formElRef.value.resetFields();
mapState.mapData.courierUserName = ''; formElRef.value.clearValidate();
mapState.mapData.courierLng = undefined; //
mapState.mapData.courierLat = undefined; mapState.mapData.courierUserName = '';
mapState.mapData.sendOrderName = ''; mapState.mapData.courierLng = undefined;
mapState.mapData.sendOrderLng = undefined; mapState.mapData.courierLat = undefined;
mapState.mapData.sendOrderLat = undefined; mapState.mapData.sendOrderName = '';
mapState.mapData.mapTask = []; mapState.mapData.sendOrderLng = undefined;
mapState.mapData.mapLogisticPoint = []; mapState.mapData.sendOrderLat = undefined;
setTableData([]); mapState.mapData.mapTask = [];
// mapState.mapData.mapLogisticPoint = [];
map.setZoomAndCenter(mapState.mapConfig.options.zoom, mapState.mapConfig.options.center); setTableData([]);
mapState.defaultZoom = mapState.mapConfig.options.zoom; //
map.setZoomAndCenter(mapState.mapConfig.options.zoom, mapState.mapConfig.options.center);
mapState.defaultZoom = mapState.mapConfig.options.zoom;
});
} }
</script> </script>
@ -735,13 +735,13 @@
// //
.amap-designer { .amap-designer {
@headerHeight: 48px; @toolbarHeight: v-bind('mapState.toggleOperatePanelClass.toolbarHeight + "px"');;
@siderWidth: v-bind('mapState.toggleOperatePanelClass.siderWidth + "px"'); @siderWidth: v-bind('mapState.toggleOperatePanelClass.siderWidth + "px"');
@borderColor: #e0e0e0; @borderColor: #e0e0e0;
#mapview { #mapview {
position: absolute; position: absolute;
top: @headerHeight; top: @toolbarHeight;
left: 0; left: 0;
right: @siderWidth; right: @siderWidth;
bottom: 0; bottom: 0;
@ -814,7 +814,6 @@
padding: 0 20px; padding: 0 20px;
background-color: white; background-color: white;
border: 1px solid @borderColor; border: 1px solid @borderColor;
height: @headerHeight;
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;

32
src/enums/amapEnum.ts

@ -0,0 +1,32 @@
/**
* @program: kicc-ui
* @description:
* @author: entfrm开发团队-
* @create: 2022/4/9
*/
import { MapData } from '/@/components/AMap/src/amap.data';
import { cloneDeep } from 'lodash-es';
export const defaultMapData: ()=> MapData = ()=> cloneDeep({
name: '',
courierUserId: '',
courierUserName: '',
courierLng: undefined,
courierLat: undefined,
sendOrderId: '',
sendOrderName: '',
sendOrderLng: undefined,
sendOrderLat: undefined,
fileId: [],
estimateTime: '',
requireTime: '',
/** 地图任务数据 */
mapTask: [{
name: '宇宙任务',
taskType: '0',
mapTaskPreset: []
}],
/** 地图预览点数据 */
mapLogisticPoint: [],
});
Loading…
Cancel
Save