Browse Source

🚨 加强地图设计器校验逻辑

master
wangxiang 3 years ago
parent
commit
689860ca68
  1. 1
      src/api/platform/common/entity/mapLogistic.ts
  2. 80
      src/components/AMap/src/AMapDesigner/index.vue
  3. 2
      src/components/AMap/src/components/MapPointModal.vue
  4. 16
      src/components/AMap/src/components/MapTaskModal.vue
  5. 3
      src/components/AMap/src/components/MapTaskPresetModal.vue
  6. 1
      src/enums/amapEnum.ts

1
src/api/platform/common/entity/mapLogistic.ts

@ -20,6 +20,7 @@ export interface MapLogistic extends Partial<CommonEntity> {
courierLat: Nullable<number>; courierLat: Nullable<number>;
sendOrderId: string; sendOrderId: string;
sendOrderName: string; sendOrderName: string;
sendOrderTaskType: string;
sendOrderLng: Nullable<number>; sendOrderLng: Nullable<number>;
sendOrderLat: Nullable<number>; sendOrderLat: Nullable<number>;
fileId: string | string[]; fileId: string | string[];

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

@ -5,7 +5,7 @@
:default-zoom="mapState.defaultZoom" :default-zoom="mapState.defaultZoom"
:toolbar="toolbar" :toolbar="toolbar"
@save="handleMapSave" @save="handleMapSave"
@addTask="handleOpenTask" @addTask="handleOpenMapTask"
@point="handleOpenMapPoint" @point="handleOpenMapPoint"
@zoomIn="handleMapZoomIn" @zoomIn="handleMapZoomIn"
@zoomOut="handleMapZoomOut" @zoomOut="handleMapZoomOut"
@ -36,10 +36,18 @@
</AFormItem> </AFormItem>
<AFormItem label="发单" name="sendOrderId"> <AFormItem label="发单" name="sendOrderId">
<ASelect v-model:value="mapState.mapData.sendOrderId" <ASelect v-model:value="mapState.mapData.sendOrderId"
style="width: 70%"
:disabled="isEdit" :disabled="isEdit"
:options="mapState.hospitalList" :options="mapState.hospitalList"
@select="handleCourierUserSearch" @select="handleCourierUserSearch"
/> />
<ASelect v-model:value="mapState.mapData.sendOrderTaskType"
style="width: 30%"
:disabled="isEdit"
>
<ASelectOption key="0">普通任务</ASelectOption>
<ASelectOption key="1">交接任务</ASelectOption>
</ASelect>
</AFormItem> </AFormItem>
<AFormItem label="起点" name="courierUserId"> <AFormItem label="起点" name="courierUserId">
<ASelect v-model:value="mapState.mapData.courierUserId" <ASelect v-model:value="mapState.mapData.courierUserId"
@ -66,7 +74,7 @@
<BasicTable @register="registerTable"/> <BasicTable @register="registerTable"/>
</div> </div>
</div> </div>
<MapTaskModal @register="registerModal" @success="handleMapTask"/> <MapTaskModal @register="registerModal" @success="handleMapPointGenerate"/>
<MapPointModal @register="mapPointRegisterModal" @success="handleMapPoint"/> <MapPointModal @register="mapPointRegisterModal" @success="handleMapPoint"/>
</div> </div>
</template> </template>
@ -110,6 +118,7 @@
import Toolbar from '../components/Toolbar.vue'; import Toolbar from '../components/Toolbar.vue';
import { saveOrUpdateMapLogistic } from '/@/api/platform/common/controller/mapLogistic'; import { saveOrUpdateMapLogistic } from '/@/api/platform/common/controller/mapLogistic';
import { MapLogistic } from '/@/api/platform/common/entity/mapLogistic'; import { MapLogistic } from '/@/api/platform/common/entity/mapLogistic';
import {buildUUID} from "/@/utils/uuid";
/** 类型规范统一声明定义区域 */ /** 类型规范统一声明定义区域 */
interface MapState { interface MapState {
@ -201,6 +210,9 @@
name: [ name: [
{ required: true, whitespace: true, message: '地图名称不能为空', validateTrigger: 'blur' } { required: true, whitespace: true, message: '地图名称不能为空', validateTrigger: 'blur' }
], ],
sendOrderId: [
{ required: true, whitespace: true, message: '发单点不能为空', validateTrigger: 'blur' }
],
courierUserId: [ courierUserId: [
{ required: true, whitespace: true, message: '起点不能为空', validateTrigger: 'blur' } { required: true, whitespace: true, message: '起点不能为空', validateTrigger: 'blur' }
] ]
@ -210,6 +222,7 @@
const AForm = Form; const AForm = Form;
const AFormItem = Form.Item; const AFormItem = Form.Item;
const ASelect = Select; const ASelect = Select;
const ASelectOption = Select.Option;
const formElRef = ref(); const formElRef = ref();
const [registerTable, { setTableData }] = useTable({ const [registerTable, { setTableData }] = useTable({
title: '任务列表', title: '任务列表',
@ -224,7 +237,7 @@
bordered: true, bordered: true,
showIndexColumn: true, showIndexColumn: true,
}); });
const [registerModal, { openModal }] = useModal(); const [registerModal, { openModal:mapTaskOpenModal }] = useModal();
const [mapPointRegisterModal, { openModal: mapPointOpenModal }] = useModal(); const [mapPointRegisterModal, { openModal: mapPointOpenModal }] = useModal();
onBeforeMount(() => { onBeforeMount(() => {
@ -542,6 +555,37 @@
} }
/** 处理创建首个发单任务 */
function handleCreateSendOrderTask() {
if (!mapState.mapData.sendOrderId && !mapState.mapData.sendOrderTaskType) throw notification.error({
message: '处理创建首个发单任务失败,请联系开发人员!',
description: '检查到发单或发单任务类型为空!',
duration: 2
});
if (isEmpty(mapState.mapData.mapTask)) {
mapState.mapData.mapTask.push({
name: '系统创建:发单任务',
hospitalId: mapState.mapData.sendOrderId,
taskType: mapState.mapData.sendOrderTaskType,
orgName: ~~mapState.mapData.sendOrderTaskType ? '' : '等待收样员设置!',
sort: 1,
fileId: [],
key: buildUUID()
});
} else {
let mapTask = mapState.mapData.mapTask
.filter(item => item.taskType == mapState.mapData.sendOrderTaskType)
.find(item => item.sort == 1);
mapTask && Object.assign(mapTask, {
hospitalId: mapState.mapData.sendOrderId,
taskType: mapState.mapData.sendOrderTaskType,
orgName: ~~mapState.mapData.sendOrderTaskType ? '' : '等待收样员设置!',
});
}
handleMapPointGenerate();
}
/** 处理起点收样员数据 */ /** 处理起点收样员数据 */
function handleCourierUserData(value) { function handleCourierUserData(value) {
const courierUserMap = mapState.courierUserList.find(item => item.value == value); const courierUserMap = mapState.courierUserList.find(item => item.value == value);
@ -556,15 +600,28 @@
} }
/** 处理打开任务配置 */ /** 处理打开任务配置 */
async function handleOpenTask() { async function handleOpenMapTask() {
await formElRef.value.validate(); await formElRef.value.validate();
openModal(true, { mapData: mapState.mapData }); if(mapState.mapData.mapTask
.filter(item => item.taskType == mapState.mapData.sendOrderTaskType)
.find(item => item.sort == 1)?.hospitalId == mapState.mapData.sendOrderId) {
notification.error({
message: '致命错误',
description: `检测到任务列表中首个${~~mapState.mapData.sendOrderTaskType ? '普通' : '交接'}任务对应发单数据错误,请联系开发人员!`,
duration: 2
});
} else mapTaskOpenModal(true, { mapData: mapState.mapData });
} }
/** 处理打开地图标记点配置 */ /** 处理打开地图标记点配置 */
async function handleOpenMapPoint() { async function handleOpenMapPoint() {
await formElRef.value.validate(); await formElRef.value.validate();
mapPointOpenModal(true, { mapData: mapState.mapData }); if(isEmpty(mapState.mapData.mapLogisticPoint)){
notification.error({
message: '检测到标记点数据为空,请先配置任务!',
duration: 2
});
} else mapPointOpenModal(true, { mapData: mapState.mapData });
} }
/** 处理地图放大 */ /** 处理地图放大 */
@ -623,10 +680,9 @@
} }
} }
/** 处理地图任务数据 */ /** 处理地图标记点生成 */
async function handleMapTask() { async function handleMapPointGenerate() {
setTableData(mapState.mapData.mapTask); setTableData(mapState.mapData.mapTask);
//
const pointData:Recordable[] = []; const pointData:Recordable[] = [];
mapState.mapData.mapTask.forEach(item => { mapState.mapData.mapTask.forEach(item => {
const hospital = mapState.hospitalList.find(e => e.value == item.hospitalId), const hospital = mapState.hospitalList.find(e => e.value == item.hospitalId),
@ -634,7 +690,8 @@
// ,,, // ,,,
if (!hospital) { if (!hospital) {
throw notification.error({ throw notification.error({
message: '当前机构数据或者医院数据已经更新,请重新刷新页面!', message: '地图标记点生成错误',
description: '当前机构数据或者医院数据已经更新,请重新刷新页面!',
duration: 2 duration: 2
}); });
} }
@ -678,11 +735,12 @@
}), 'id')); }), 'id'));
}); });
}); });
pointData.forEach((item, index)=> { item.sort = add(index, 1); }); pointData.forEach((item, index)=> item.sort = add(index, 1));
mapState.mapData.mapLogisticPoint = pointData; mapState.mapData.mapLogisticPoint = pointData;
drawMapNavigate(pointData); drawMapNavigate(pointData);
} }
/** 处理地图标记点数据 */ /** 处理地图标记点数据 */
function handleMapPoint(mapLogisticPoint: Recordable[] = []) { function handleMapPoint(mapLogisticPoint: Recordable[] = []) {
if (!isEmpty(mapLogisticPoint)) { if (!isEmpty(mapLogisticPoint)) {

2
src/components/AMap/src/components/MapPointModal.vue

@ -81,7 +81,7 @@
// //
setModalProps({ confirmLoading: true }); setModalProps({ confirmLoading: true });
// //
state.mapData.mapLogisticPoint?.forEach((item, index)=> { item.sort = add(index, 1); }); state.mapData.mapLogisticPoint?.forEach((item, index)=> item.sort = add(index, 1));
// //
closeModal(); closeModal();
emit('success', state.mapData.mapLogisticPoint); emit('success', state.mapData.mapLogisticPoint);

16
src/components/AMap/src/components/MapTaskModal.vue

@ -20,7 +20,7 @@
label: '删除', label: '删除',
icon: 'ant-design:delete-outlined', icon: 'ant-design:delete-outlined',
color: 'error', color: 'error',
disabled: !!state.taskOrdinaryCurrentEditRowRef, disabled: !!state.taskOrdinaryCurrentEditRowRef || record.hospitalId == state.mapData.sendOrderId,
onClick: handleTaskOrdinaryDelete.bind(null, record) onClick: handleTaskOrdinaryDelete.bind(null, record)
} }
])" ])"
@ -47,7 +47,7 @@
label: '删除', label: '删除',
icon: 'ant-design:delete-outlined', icon: 'ant-design:delete-outlined',
color: 'error', color: 'error',
disabled: !!state.taskPresetCurrentEditRowRef, disabled: !!state.taskPresetCurrentEditRowRef || record.hospitalId == state.mapData.sendOrderId,
onClick: handleTaskPresetDelete.bind(null, record) onClick: handleTaskPresetDelete.bind(null, record)
} }
])" ])"
@ -65,7 +65,7 @@
import TaskPresetModal from './MapTaskPresetModal.vue'; import TaskPresetModal from './MapTaskPresetModal.vue';
import { buildUUID } from '/@/utils/uuid'; import { buildUUID } from '/@/utils/uuid';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
import { cloneDeep } from 'lodash-es'; import {add, cloneDeep} from 'lodash-es';
import { defaultMapData } from '/@/enums/amapEnum'; import { defaultMapData } from '/@/enums/amapEnum';
import { MapLogistic } from '/@/api/platform/common/entity/mapLogistic'; import { MapLogistic } from '/@/api/platform/common/entity/mapLogistic';
@ -315,17 +315,15 @@
}); });
// //
const validateData:Promise<boolean>[] = []; const validateData:Promise<boolean>[] = [];
taskOrdinaryData.forEach(item => { taskOrdinaryData.forEach(item => validateData.push(item.onValid?.() || Promise.resolve(true)));
validateData.push(item.onValid?.() || Promise.resolve(true)); taskPresetData.forEach(item => validateData.push(item.onValid?.() || Promise.resolve(true)));
});
taskPresetData.forEach(item => {
validateData.push(item.onValid?.() || Promise.resolve(true));
});
const validateResult = await Promise.all(validateData); const validateResult = await Promise.all(validateData);
if (!validateResult.every(item => item)) throw notification.error({ if (!validateResult.every(item => item)) throw notification.error({
message: '表格行校验未通过,请检查!', message: '表格行校验未通过,请检查!',
duration: 2 duration: 2
}); });
taskOrdinaryData.forEach((item, index)=> item.sort = add(index, 1));
taskPresetData.forEach((item, index)=> item.sort = add(index, 1));
state.mapData.mapTask = [...taskOrdinaryData, ...taskPresetData]; state.mapData.mapTask = [...taskOrdinaryData, ...taskPresetData];
// //
closeModal(); closeModal();

3
src/components/AMap/src/components/MapTaskPresetModal.vue

@ -50,7 +50,7 @@
import { listUser } from '/@/api/platform/system/controller/user'; import { listUser } from '/@/api/platform/system/controller/user';
import { buildUUID } from '/@/utils/uuid'; import { buildUUID } from '/@/utils/uuid';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
import { cloneDeep } from 'lodash-es'; import {add, cloneDeep} from 'lodash-es';
import { listOrg } from '/@/api/platform/common/controller/org'; import { listOrg } from '/@/api/platform/common/controller/org';
/** 类型规范统一声明定义区域 */ /** 类型规范统一声明定义区域 */
@ -270,6 +270,7 @@
lastElement.destinationPresetLng = option.mapLng; lastElement.destinationPresetLng = option.mapLng;
lastElement.destinationPresetLat = option.mapLat; lastElement.destinationPresetLat = option.mapLat;
} }
mapTaskPresetData.forEach((item, index)=> item.sort = add(index, 1));
state.taskPresetRow.mapTaskPreset = mapTaskPresetData; state.taskPresetRow.mapTaskPreset = mapTaskPresetData;
// //
closeModal(); closeModal();

1
src/enums/amapEnum.ts

@ -16,6 +16,7 @@ export const defaultMapData: ()=> MapLogistic = ()=> cloneDeep({
courierLat: null, courierLat: null,
sendOrderId: '', sendOrderId: '',
sendOrderName: '', sendOrderName: '',
sendOrderTaskType: '',
sendOrderLng: null, sendOrderLng: null,
sendOrderLat: null, sendOrderLat: null,
fileId: [], fileId: [],

Loading…
Cancel
Save