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

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

@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
:default-zoom="mapState.defaultZoom"
:toolbar="toolbar"
@save="handleMapSave"
@addTask="handleOpenTask"
@addTask="handleOpenMapTask"
@point="handleOpenMapPoint"
@zoomIn="handleMapZoomIn"
@zoomOut="handleMapZoomOut"
@ -36,10 +36,18 @@ @@ -36,10 +36,18 @@
</AFormItem>
<AFormItem label="发单" name="sendOrderId">
<ASelect v-model:value="mapState.mapData.sendOrderId"
style="width: 70%"
:disabled="isEdit"
:options="mapState.hospitalList"
@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 label="起点" name="courierUserId">
<ASelect v-model:value="mapState.mapData.courierUserId"
@ -66,7 +74,7 @@ @@ -66,7 +74,7 @@
<BasicTable @register="registerTable"/>
</div>
</div>
<MapTaskModal @register="registerModal" @success="handleMapTask"/>
<MapTaskModal @register="registerModal" @success="handleMapPointGenerate"/>
<MapPointModal @register="mapPointRegisterModal" @success="handleMapPoint"/>
</div>
</template>
@ -110,6 +118,7 @@ @@ -110,6 +118,7 @@
import Toolbar from '../components/Toolbar.vue';
import { saveOrUpdateMapLogistic } from '/@/api/platform/common/controller/mapLogistic';
import { MapLogistic } from '/@/api/platform/common/entity/mapLogistic';
import {buildUUID} from "/@/utils/uuid";
/** 类型规范统一声明定义区域 */
interface MapState {
@ -201,6 +210,9 @@ @@ -201,6 +210,9 @@
name: [
{ required: true, whitespace: true, message: '地图名称不能为空', validateTrigger: 'blur' }
],
sendOrderId: [
{ required: true, whitespace: true, message: '发单点不能为空', validateTrigger: 'blur' }
],
courierUserId: [
{ required: true, whitespace: true, message: '起点不能为空', validateTrigger: 'blur' }
]
@ -210,6 +222,7 @@ @@ -210,6 +222,7 @@
const AForm = Form;
const AFormItem = Form.Item;
const ASelect = Select;
const ASelectOption = Select.Option;
const formElRef = ref();
const [registerTable, { setTableData }] = useTable({
title: '任务列表',
@ -224,7 +237,7 @@ @@ -224,7 +237,7 @@
bordered: true,
showIndexColumn: true,
});
const [registerModal, { openModal }] = useModal();
const [registerModal, { openModal:mapTaskOpenModal }] = useModal();
const [mapPointRegisterModal, { openModal: mapPointOpenModal }] = useModal();
onBeforeMount(() => {
@ -542,6 +555,37 @@ @@ -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) {
const courierUserMap = mapState.courierUserList.find(item => item.value == value);
@ -556,15 +600,28 @@ @@ -556,15 +600,28 @@
}
/** 处理打开任务配置 */
async function handleOpenTask() {
async function handleOpenMapTask() {
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() {
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 @@ @@ -623,10 +680,9 @@
}
}
/** 处理地图任务数据 */
async function handleMapTask() {
/** 处理地图标记点生成 */
async function handleMapPointGenerate() {
setTableData(mapState.mapData.mapTask);
//
const pointData:Recordable[] = [];
mapState.mapData.mapTask.forEach(item => {
const hospital = mapState.hospitalList.find(e => e.value == item.hospitalId),
@ -634,7 +690,8 @@ @@ -634,7 +690,8 @@
// ,,,
if (!hospital) {
throw notification.error({
message: '当前机构数据或者医院数据已经更新,请重新刷新页面!',
message: '地图标记点生成错误',
description: '当前机构数据或者医院数据已经更新,请重新刷新页面!',
duration: 2
});
}
@ -678,11 +735,12 @@ @@ -678,11 +735,12 @@
}), 'id'));
});
});
pointData.forEach((item, index)=> { item.sort = add(index, 1); });
pointData.forEach((item, index)=> item.sort = add(index, 1));
mapState.mapData.mapLogisticPoint = pointData;
drawMapNavigate(pointData);
}
/** 处理地图标记点数据 */
function handleMapPoint(mapLogisticPoint: Recordable[] = []) {
if (!isEmpty(mapLogisticPoint)) {

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

@ -81,7 +81,7 @@ @@ -81,7 +81,7 @@
//
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();
emit('success', state.mapData.mapLogisticPoint);

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

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

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

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

1
src/enums/amapEnum.ts

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

Loading…
Cancel
Save