Browse Source

调整布局

master
wangxiang 3 years ago
parent
commit
f3242dd6ff
  1. 2
      src/api/platform/core/entity/user.ts
  2. 177
      src/components/AMap/src/AMapDesigner/index.vue
  3. 12
      src/components/AMap/src/components/TaskModal.vue
  4. 5
      src/settings/componentSetting.ts
  5. 12
      src/views/system/user/user.data.ts

2
src/api/platform/core/entity/user.ts

@ -63,6 +63,8 @@ export interface User extends CommonEntity {
loginTime: string; loginTime: string;
// 地图标记点位置图片旋转值 // 地图标记点位置图片旋转值
mapOrientation: number; mapOrientation: number;
// 地图设计器默认中心点位置
mapCenter: string;
// 用户状态 // 用户状态
status: string; status: string;
// 备注信息 // 备注信息

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

@ -1,4 +1,4 @@
<template> `<template>
<div class="amap-designer"> <div class="amap-designer">
<div class="headToolbar"> <div class="headToolbar">
<ATooltip title="保存并发布" <ATooltip title="保存并发布"
@ -15,6 +15,13 @@
<Icon icon="fa6-regular:window-restore" size="13"/>任务 <Icon icon="fa6-regular:window-restore" size="13"/>任务
</a-button> </a-button>
</ATooltip> </ATooltip>
<ATooltip title="调整标记点"
placement="bottom"
:arrowPointAtCenter="true">
<a-button type="primary" @click="handleOpenMapPoint">
<Icon icon="fa6-regular:window-restore" size="13"/>标记点
</a-button>
</ATooltip>
<ATooltip title="放大" <ATooltip title="放大"
placement="bottom" placement="bottom"
:arrowPointAtCenter="true"> :arrowPointAtCenter="true">
@ -35,7 +42,7 @@
<ATooltip title="重置" <ATooltip title="重置"
placement="bottom" placement="bottom"
:arrowPointAtCenter="true"> :arrowPointAtCenter="true">
<a-button @click=""> <a-button @click="handleMapReset">
<Icon icon="fa-solid:database" size="13"/> <Icon icon="fa-solid:database" size="13"/>
</a-button> </a-button>
</ATooltip> </ATooltip>
@ -49,14 +56,15 @@
<p title="隐藏"></p> <p title="隐藏"></p>
</div> </div>
<div class="operatePanel-form"> <div class="operatePanel-form">
<AForm :labelCol="{ style: { width: '80px' } }" <AForm ref="formElRef"
:labelCol="{ style: { width: '80px' } }"
:wrapperCol="{ style: { width: '100%', 'margin-right': '10px' } }" :wrapperCol="{ style: { width: '100%', 'margin-right': '10px' } }"
:model="mapState.modelRef" :model="mapState.modelRef"
> >
<AFormItem label="发单"> <AFormItem label="发单">
<ASelect v-model:value="mapState.modelRef.sendOrderId" <ASelect v-model:value="mapState.modelRef.sendOrderId"
:options="mapState.hospitalList" :options="mapState.hospitalList"
@select="handleTakeSpecimenSearch" @select="handleCourierUserSearch"
/> />
</AFormItem> </AFormItem>
<AFormItem label="起点"> <AFormItem label="起点">
@ -68,13 +76,14 @@
<BasicTable @register="registerTable"/> <BasicTable @register="registerTable"/>
</div> </div>
</div> </div>
<TaskModal @register="registerModal" @success="handleRefreshTable"/> <TaskModal @register="registerModal" @success=""/>
<MapPointModal @register="mapPointRegisterModal" @success=""/>
</div> </div>
</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 } from 'vue'; import {reactive, watchEffect, getCurrentInstance, onBeforeMount, onUnmounted, ref} from 'vue';
import { smallHospitalMapList, specimenMapList, columns } from '../amap.data'; import { columns } 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';
import hospitalTwinkle from '/@/assets/images/hospital-twinkle.gif'; import hospitalTwinkle from '/@/assets/images/hospital-twinkle.gif';
@ -83,19 +92,43 @@
import { BasicTable, useTable } from '/@/components/Table'; import { BasicTable, useTable } from '/@/components/Table';
import { useModal } from '/@/components/Modal'; import { useModal } from '/@/components/Modal';
import TaskModal from '../components/TaskModal.vue'; import TaskModal from '../components/TaskModal.vue';
import MapPointModal from '../components/MapPointModal.vue';
import { propTypes } from '/@/utils/propTypes'; import { propTypes } from '/@/utils/propTypes';
import { listHospital } from '/@/api/platform/common/controller/hospital'; import { listHospital } from '/@/api/platform/common/controller/hospital';
import { listUser } from '/@/api/platform/system/controller/user'; import { listUser } from '/@/api/platform/system/controller/user';
import { listOrg } from '/@/api/platform/common/controller/org'; import { listOrg } from '/@/api/platform/common/controller/org';
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 { split } from 'lodash-es';
import componentSetting from '/@/settings/componentSetting';
/** 类型规范统一声明定义区域 */
type MapCommonType = {
value: string;
label: string;
mapLng: number;
mapLat: number;
mapOrientation: number;
mapNotify?: boolean;
};
interface MapState {
loading: boolean;
defaultZoom: number;
toggleOperatePanelClass: Recordable;
toggleStatus: boolean;
modelRef: Recordable;
courierUserList: MapCommonType[];
hospitalList: MapCommonType[];
orgList: MapCommonType[];
mapTask: Recordable[];
mapLogisticPoint: Recordable[];
mapConfig: Recordable;
}
const mapProps = defineProps({ const mapProps = defineProps({
options: propTypes.object.def({ mapId: propTypes.string.def(''),
sidebarControl: propTypes.bool.def(true)
}),
sidebarControl: propTypes.bool.def(true),
}); });
let map; let map;
@ -104,8 +137,10 @@
let courierUserMarkerCluster; let courierUserMarkerCluster;
let scanCourierUserCircleRange; let scanCourierUserCircleRange;
let driving; let driving;
const userStore = useUserStore();
const instance = getCurrentInstance(); const instance = getCurrentInstance();
const mapState = reactive<any>({ const { mapDesigner } = componentSetting;
const mapState = reactive<MapState>({
loading: false, loading: false,
defaultZoom: 1, defaultZoom: 1,
toggleOperatePanelClass: { toggleOperatePanelClass: {
@ -125,24 +160,38 @@
/** 上级医检集合 */ /** 上级医检集合 */
orgList: [], orgList: [],
/** 地图任务数据 */ /** 地图任务数据 */
mapTask: [], mapTask: [{
id: '001',
taskName: '测试任务1'
},{
id: '002',
taskName: '测试任务2'
}],
/** 地图预览点数据 */ /** 地图预览点数据 */
mapLogisticPoint: [] mapLogisticPoint: [],
/** 地图配置数据 */
mapConfig: {
amapKey: 'f278d021a80dcf81f071aee5bff08804',
options: {
pitch:60,
viewMode:'3D',
resizeEnable: true,
center: split((userStore.getUserInfo.mapCenter || mapDesigner.mapCenter), ',', 2),
zoom: 17,
keyboardEnable: true
}
}
}); });
const AForm = Form; const AForm = Form;
const AFormItem = Form.Item; const AFormItem = Form.Item;
const ASelect = Select; const ASelect = Select;
const ATooltip = Tooltip; const ATooltip = Tooltip;
const formElRef = ref();
const [registerTable, { reload }] = useTable({ const [registerTable, { reload }] = useTable({
title: '任务列表', title: '任务列表',
rowKey: 'id', rowKey: 'id',
dataSource: [{ dataSource: mapState.mapTask,
id: '001',
taskName: '测试任务1'
},{
id: '002',
taskName: '测试任务2'
}],
columns, columns,
resizeHeightOffset: 80, resizeHeightOffset: 80,
showTableSetting: true, showTableSetting: true,
@ -151,23 +200,13 @@
fullScreen: true fullScreen: true
}, },
bordered: true, bordered: true,
showIndexColumn: true showIndexColumn: true,
}); });
const [registerModal, { openModal }] = useModal(); const [registerModal, { openModal }] = useModal();
const [mapPointRegisterModal, { openModal: mapPointOpenModal }] = useModal();
onBeforeMount(() => { onBeforeMount(() => {
if (!instance) return; if (!instance) return;
const mapConfig = {
amapKey: 'f278d021a80dcf81f071aee5bff08804',
options: {
pitch:60,
viewMode:'3D',
resizeEnable: true,
center: [112.919043, 28.288623],
zoom: 17,
keyboardEnable: true
}
};
mapState.loading = true; mapState.loading = true;
// //
listHospital({ size: 40 }).then(res => { listHospital({ size: 40 }).then(res => {
@ -201,12 +240,12 @@
}); });
// //
AMapLoader.load({ AMapLoader.load({
key: mapConfig.amapKey, key: mapState.mapConfig.amapKey,
version: '2.0', version: '2.0',
plugins: ['AMap.MarkerCluster', 'AMap.Driving'] plugins: ['AMap.MarkerCluster', 'AMap.Driving']
}).then(AMap => { }).then(AMap => {
// //
map = new AMap.Map(instance.refs.mapview, mapConfig.options); map = new AMap.Map(instance.refs.mapview, mapState.mapConfig.options);
map.plugin(['AMap.ToolBar', 'AMap.MapType', 'AMap.ControlBar', 'AMap.Scale'], () => { map.plugin(['AMap.ToolBar', 'AMap.MapType', 'AMap.ControlBar', 'AMap.Scale'], () => {
// //
map.addControl(new AMap.ToolBar()); map.addControl(new AMap.ToolBar());
@ -380,6 +419,9 @@
zIndex: 50 zIndex: 50
}); });
// todo:
// 线 // 线
driving = new AMap.Driving({ driving = new AMap.Driving({
map: map, map: map,
@ -396,6 +438,7 @@
} }
}); });
// //
complete(); complete();
}).catch(error => { }).catch(error => {
@ -440,42 +483,57 @@
} }
} }
/** 处理收取标本收养员搜索 */ /** 处理收员搜索 */
function handleTakeSpecimenSearch (value) { function handleCourierUserSearch(value) {
// //
const smallHospitalMap = smallHospitalMapList.find(item => item.id == value); const hospitalMap = mapState.hospitalList.find(item => item.value == value);
if (smallHospitalMap) { if (hospitalMap) {
map.remove(scanTakeSpecimenCircleRange || {}); map.remove(scanCourierUserCircleRange || {});
scanTakeSpecimenCircleRange.setCenter([smallHospitalMap.lng, smallHospitalMap.lat]); scanCourierUserCircleRange.setCenter([hospitalMap.mapLng, hospitalMap.mapLat]);
map.add(scanTakeSpecimenCircleRange); map.add(scanCourierUserCircleRange);
map.setFitView([ scanTakeSpecimenCircleRange ]); map.setFitView([ scanCourierUserCircleRange ]);
const smallHospitalMarker = new AMap.Marker({ const hospitalMarker = new AMap.Marker({
position: [smallHospitalMap.lng, smallHospitalMap.lat], position: [hospitalMap.mapLng, hospitalMap.mapLat],
}); });
const smallHospitalPosition = smallHospitalMarker.getPosition(); const hospitalPosition = hospitalMarker.getPosition();
// // ,便
const optimalSpecimen = specimenMapList.sort((firstEl, secondEl) => { mapState.courierUserList = mapState.courierUserList.sort((firstEl, secondEl) => {
const marker1 = new AMap.Marker({ const originMarker = new AMap.Marker({
position: [firstEl.lng, firstEl.lat], position: [firstEl.mapLng, firstEl.mapLat],
}),marker2 = new AMap.Marker({ }),destinationMarker = new AMap.Marker({
position: [secondEl.lng, secondEl.lat], position: [secondEl.mapLng, secondEl.mapLat],
}); });
const position1 = marker1.getPosition(), const originPosition = originMarker.getPosition(),
position2 = marker2.getPosition(); destinationPosition = destinationMarker.getPosition();
return Math.round(smallHospitalPosition.distance(position1)) - Math.round(smallHospitalPosition.distance(position2)); return Math.round(hospitalPosition.distance(originPosition)) - Math.round(hospitalPosition.distance(destinationPosition));
}); });
mapState.takeSpecimenList = optimalSpecimen.map(item => ({ value: item.id, label: item.title }));
} else { } else {
throw '查找不到发单点数据,请检查发单点!'; console.warn('查找不到发单点数据,请检查发单点!');
} }
} }
/** 处理打开任务配置 */
function handleOpenTask() { function handleOpenTask() {
openModal(true, { driving, formData: mapState.modelRef }); openModal(true, { driving, formData: mapState.modelRef });
} }
function handleRefreshTable() { /** 处理打开地图标记点配置 */
function handleOpenMapPoint() {
mapPointOpenModal(true, { driving });
}
/** 处理地图重置 */
function handleMapReset() {
//
map.remove(scanCourierUserCircleRange || {});
//
formElRef.value.resetFields();
formElRef.value.clearValidate();
//
mapState.mapTask = [];
mapState.mapLogisticPoint = [];
//
map.setZoomAndCenter(17, mapState.mapConfig.center);
} }
</script> </script>
@ -593,3 +651,4 @@
} }
</style> </style>
`

12
src/components/AMap/src/components/TaskModal.vue

@ -6,9 +6,6 @@
> >
<BasicTable @register="registerTable"> <BasicTable @register="registerTable">
<template #toolbar> <template #toolbar>
<a-button type="primary"
@click="handleMapDataSettings()"
>标记点</a-button>
<a-button type="primary" <a-button type="primary"
@click="handleTaskAdd()" @click="handleTaskAdd()"
>新增</a-button> >新增</a-button>
@ -34,8 +31,6 @@
<TableAction :actions="createMutualActions(record, column)"/> <TableAction :actions="createMutualActions(record, column)"/>
</template> </template>
</BasicTable> </BasicTable>
<MutualTaskModal @register="mutualRegisterModal" @success="handleRefreshTable"/>
<MapDataSettingsModal @register="mapDataRegisterModal"/>
</BasicModal> </BasicModal>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -45,7 +40,6 @@
import { formTaskColumns, formMutualTaskColumns, largeHospitalMapList, smallHospitalMapList, } from '../amap.data'; import { formTaskColumns, formMutualTaskColumns, largeHospitalMapList, smallHospitalMapList, } from '../amap.data';
import { buildUUID } from '/@/utils/uuid'; import { buildUUID } from '/@/utils/uuid';
import MutualTaskModal from './HandoverPresetModal.vue'; import MutualTaskModal from './HandoverPresetModal.vue';
import MapDataSettingsModal from './MapPointModal.vue';
/** 类型规范统一声明定义区域 */ /** 类型规范统一声明定义区域 */
interface WindowState { interface WindowState {
@ -74,7 +68,6 @@
setModalProps(props); setModalProps(props);
}); });
const [mutualRegisterModal, { openModal }] = useModal(); const [mutualRegisterModal, { openModal }] = useModal();
const [mapDataRegisterModal, { openModal: mapDataOpenModal }] = useModal();
const [registerTable, { reload, getDataSource }] = useTable({ const [registerTable, { reload, getDataSource }] = useTable({
title: '普通任务', title: '普通任务',
columns: formTaskColumns, columns: formTaskColumns,
@ -305,11 +298,6 @@
openModal(true, { driving }); openModal(true, { driving });
} }
/** 处理打开地图数据设置 */
function handleMapDataSettings() {
mapDataOpenModal(true, { driving });
}
/** 处理路线预览 */ /** 处理路线预览 */
function handlePathPreview() { function handlePathPreview() {

5
src/settings/componentSetting.ts

@ -45,4 +45,9 @@ export default {
// 打开后menu、modal、drawer都会将弹出的滚动条改为native // 打开后menu、modal、drawer都会将弹出的滚动条改为native
native: false, native: false,
}, },
// 地图设计器设置
mapDesigner: {
// 默认中心点
mapCenter: '112.919043, 28.288623'
}
}; };

12
src/views/system/user/user.data.ts

@ -267,6 +267,16 @@ export const userFormSchema: FormSchema[] = [
span: 12 span: 12
} }
}, },
{
field: 'mapCenter',
label: '地图中心点',
component: 'Input',
required: true,
colProps: {
span: 12
},
ifShow: ({values}) => values.userType == '2'
},
{ {
field: 'mapOrientation', field: 'mapOrientation',
label: '图片旋转值', label: '图片旋转值',
@ -279,7 +289,7 @@ export const userFormSchema: FormSchema[] = [
colProps: { colProps: {
span: 12 span: 12
}, },
ifShow: ({ values }) => values.userType === '1', ifShow: ({ values }) => values.userType == '1',
required: true, required: true,
}, },
{ {

Loading…
Cancel
Save