diff --git a/src/api/platform/common/entity/mapLogistic.ts b/src/api/platform/common/entity/mapLogistic.ts index a23da50..9237a36 100644 --- a/src/api/platform/common/entity/mapLogistic.ts +++ b/src/api/platform/common/entity/mapLogistic.ts @@ -20,6 +20,7 @@ export interface MapLogistic extends Partial { courierLat: Nullable; sendOrderId: string; sendOrderName: string; + sendOrderTaskType: string; sendOrderLng: Nullable; sendOrderLat: Nullable; fileId: string | string[]; diff --git a/src/components/AMap/src/AMapDesigner/index.vue b/src/components/AMap/src/AMapDesigner/index.vue index fcfcdf4..4a3c2e8 100644 --- a/src/components/AMap/src/AMapDesigner/index.vue +++ b/src/components/AMap/src/AMapDesigner/index.vue @@ -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 @@ + + 普通任务 + 交接任务 + - + @@ -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 @@ 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 @@ 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 @@ bordered: true, showIndexColumn: true, }); - const [registerModal, { openModal }] = useModal(); + const [registerModal, { openModal:mapTaskOpenModal }] = useModal(); const [mapPointRegisterModal, { openModal: mapPointOpenModal }] = useModal(); 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) { const courierUserMap = mapState.courierUserList.find(item => item.value == value); @@ -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,18 +680,18 @@ } } - /** 处理地图任务数据 */ - 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), - org = mapState.orgList.find(e => e.value == item.orgId); + org = mapState.orgList.find(e => e.value == item.orgId); // 下级医院必选,也不能由收样员设置交接位置,所以必须查到,没有数据说明数据被更新过了 if (!hospital) { throw notification.error({ - message: '当前机构数据或者医院数据已经更新,请重新刷新页面!', + message: '地图标记点生成错误', + description: '当前机构数据或者医院数据已经更新,请重新刷新页面!', duration: 2 }); } @@ -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)) { diff --git a/src/components/AMap/src/components/MapPointModal.vue b/src/components/AMap/src/components/MapPointModal.vue index b31d841..1dbcf4f 100644 --- a/src/components/AMap/src/components/MapPointModal.vue +++ b/src/components/AMap/src/components/MapPointModal.vue @@ -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); diff --git a/src/components/AMap/src/components/MapTaskModal.vue b/src/components/AMap/src/components/MapTaskModal.vue index e098c10..1654257 100644 --- a/src/components/AMap/src/components/MapTaskModal.vue +++ b/src/components/AMap/src/components/MapTaskModal.vue @@ -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 @@ 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 @@ 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 @@ }); // 校验表格是否通过 const validateData:Promise[] = []; - 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(); diff --git a/src/components/AMap/src/components/MapTaskPresetModal.vue b/src/components/AMap/src/components/MapTaskPresetModal.vue index 0b2f11b..1fb7a72 100644 --- a/src/components/AMap/src/components/MapTaskPresetModal.vue +++ b/src/components/AMap/src/components/MapTaskPresetModal.vue @@ -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 @@ lastElement.destinationPresetLng = option.mapLng; lastElement.destinationPresetLat = option.mapLat; } + mapTaskPresetData.forEach((item, index)=> item.sort = add(index, 1)); state.taskPresetRow.mapTaskPreset = mapTaskPresetData; // 处理提交完成之后逻辑 closeModal(); diff --git a/src/enums/amapEnum.ts b/src/enums/amapEnum.ts index f84a74b..1b3c35a 100644 --- a/src/enums/amapEnum.ts +++ b/src/enums/amapEnum.ts @@ -16,6 +16,7 @@ export const defaultMapData: ()=> MapLogistic = ()=> cloneDeep({ courierLat: null, sendOrderId: '', sendOrderName: '', + sendOrderTaskType: '', sendOrderLng: null, sendOrderLat: null, fileId: [],