@ -1,75 +1,110 @@
@@ -1,75 +1,110 @@
< template >
< BasicModal v -bind = " $ attrs "
: width = "92 0"
: width = "99 0"
@ register = "registerModal"
@ ok = "handleSubmit"
>
< BasicTable @register ="registerTable" >
<!-- 普通任务表格 -- >
< BasicTable @register ="taskOrdinaryRegisterTable" >
< template # toolbar >
< a -button type = "primary"
@ click = "handleTaskAdd() "
@ click = "handleTaskOrdinary Add"
> 新增 < / a - b u t t o n >
< / template >
< template # action = "{ record, column }" >
< TableAction : actions = "createActions(record, column)" / >
< TableAction : actions = " createTaskOrdinaryActions ( record , column ) .concat ( [
{
label : '删除' ,
icon : 'ant-design:delete-outlined' ,
color : 'error' ,
onClick : handleTaskOrdinaryDelete . bind ( null , record )
}
] ) "
/ >
< / template >
< / BasicTable >
< BasicTable @register ="schemeRegisterTable" >
<!-- 交接任务表格 -- >
< BasicTable @register ="taskPresetRegisterTable" >
< template # toolbar >
< a -button type = "primary"
@ click = "handleMutualTaskAdd()"
@ click = "handleTaskPreset Add"
> 新增 < / a - b u t t o n >
< / template >
< template # action = "{ record, column }" >
< TableAction : actions = " [
< TableAction : actions = " createTaskPresetActions ( record , column ) .concat ( [
{
label : '转办' ,
icon : 'fa6-regular:pen-to-square' ,
onClick : handleMutualTask . bind ( null , record )
} ] "
onClick : handleOpenTaskPreset . bind ( null , record )
} ,
{
label : '删除' ,
icon : 'ant-design:delete-outlined' ,
color : 'error' ,
onClick : handleTaskPresetDelete . bind ( null , record )
}
] ) "
/ >
< TableAction : actions = "createMutualActions(record, column)" / >
< / template >
< / BasicTable >
< TaskPresetModal @register ="taskPresetRegisterModal" @ success = "" / >
< TaskPresetModal @register ="taskPresetRegisterModal" @success ="handleTaskPreset "/ >
< / BasicModal >
< / template >
< script lang = "ts" setup >
import { reactive } from 'vue' ;
import { BasicModal , ModalProps , useModal , useModalInner } from '/@/components/Modal' ;
import { BasicTable , useTable , EditRecordRow , BasicColumn , ActionItem , TableAction } from '/@/components/Table' ;
import { taskColumns , taskPresetColumns , largeHospitalMapList , smallHospitalMapList , } from '../amap.data' ;
import { buildUUID } from '/@/utils/uuid' ;
import { taskColumns , taskPresetColumns , MapData } from '../amap.data' ;
import TaskPresetModal from './MapTaskPresetModal.vue' ;
import { buildUUID } from '/@/utils/uuid' ;
import { useMessage } from '/@/hooks/web/useMessage' ;
/** 类型规范统一声明定义区域 */
interface WindowState {
currentEditKeyRef : string ;
formData : Recordable ;
taskOrdinaryCurrentEditKeyRef : string ;
taskPresetCurrentEditKeyRef : string ;
mapData : MapData | undefined ;
}
/** 通用变量统一声明区域 */
let driving ;
const state = reactive < WindowState > ( {
currentEditKeyRef : '' ,
formData : { }
} ) ;
const mutualState = reactive < WindowState > ( {
currentEditKeyRef : '' ,
formData : { }
taskOrdinaryCurrentEditKeyRef : '' ,
taskPresetCurrentEditKeyRef : '' ,
mapData : {
name : '' ,
courierUserId : '' ,
courierUserName : '' ,
courierLng : undefined ,
courierLat : undefined ,
sendOrderId : '' ,
sendOrderName : '' ,
sendOrderLng : undefined ,
sendOrderLat : undefined ,
fileId : [ ] ,
estimateTime : '' ,
requireTime : '' ,
/** 地图任务数据 */
mapTask : [ ] ,
/** 地图预览点数据 */
mapLogisticPoint : [ ] ,
}
} ) ;
const emit = defineEmits ( [ 'success' , 'register' ] ) ;
const [ registerModal , { setModalProps , closeModal } ] = useModalInner ( async data => {
driving = data . driving ;
state . formData = data . formData ;
state . mapData . formData = data . formData ;
const props : Partial < ModalProps > = { confirmLoading : false } ;
props . title = '任务配置' ;
/ / 尾 部 : 设 置 处 理 后 的 最 终 配 置 数 据
setModalProps ( props ) ;
} ) ;
const { createMessage } = useMessage ( ) ;
const [ taskPresetRegisterModal , { openModal } ] = useModal ( ) ;
const [ registerTable , { reload , getDataSource } ] = useTable ( {
const [ taskOrdinaryRegisterTable , {
reload : taskOrdinaryReload ,
getDataSource : getTaskOrdinaryDataSource ,
setTableData : setTaskOrdinaryTableData
} ] = useTable ( {
rowKey : 'id' ,
title : '普通任务' ,
columns : taskColumns ,
pagination : {
@ -89,7 +124,12 @@
@@ -89,7 +124,12 @@
slots : { customRender : 'action' } ,
}
} ) ;
const [ schemeRegisterTable , { reload : schemeReload , getDataSource : getTaskPresetDataSource , setProps } ] = useTable ( {
const [ taskPresetRegisterTable , {
reload : taskPresetReload ,
getDataSource : getTaskPresetDataSource ,
setTableData : setTaskPresetTableData
} ] = useTable ( {
rowKey : 'id' ,
title : '交接任务' ,
columns : taskPresetColumns ,
pagination : {
@ -103,165 +143,162 @@
@@ -103,165 +143,162 @@
showIndexColumn : false ,
canResize : false ,
actionColumn : {
width : 16 0,
width : 24 0,
title : '操作' ,
dataIndex : 'action' ,
slots : { customRender : 'action' } ,
}
} ) ;
/** 处理任务新增 */
function handleTaskAdd ( ) {
getDataSource ( ) . push ( {
/** 处理普通任务新增 */
function handleTaskOrdinaryAdd ( ) {
getTaskOrdinaryDataSource ( ) . push ( {
name : '' ,
hospitalId : '' ,
orgId : '' ,
fileId : [ ]
fileId : [ ] ,
key : buildUUID ( )
} ) ;
}
/** 处理任务新增 */
function handleMutualTaskAdd ( ) {
/** 处理普通任务删除 */
function handleTaskOrdinaryDelete ( record ) {
const index = getTaskOrdinaryDataSource ( ) . findIndex ( item => item . key == record . key ) ;
if ( index != - 1 ) {
getTaskOrdinaryDataSource ( ) . splice ( record . index , 1 ) ;
} else createMessage . error ( ` 找不到key: ${ record . key } 的数据,请刷新页面重试! ` ) ;
}
/** 处理交接任务新增 */
function handleTaskPresetAdd ( ) {
getTaskPresetDataSource ( ) . push ( {
name : '' ,
hospitalId : '' ,
orgId : '等待收样员设置!' ,
fileId : [ ]
fileId : [ ] ,
key : buildUUID ( )
} ) ;
}
function createMutualActions ( record : EditRecordRow , column : BasicColumn ) : ActionItem [ ] {
/** 处理交接任务删除 */
function handleTaskPresetDelete ( record ) {
const index = getTaskPresetDataSource ( ) . findIndex ( item => item . key == record . key ) ;
if ( index != - 1 ) {
getTaskPresetDataSource ( ) . splice ( record . index , 1 ) ;
} else createMessage . error ( ` 找不到key: ${ record . key } 的数据,请刷新页面重试! ` ) ;
}
/** 创建普通任务操作列 */
function createTaskOrdinaryActions ( record : EditRecordRow , column : BasicColumn ) : ActionItem [ ] {
if ( ! record . editable ) {
return [
{
label : '编辑' ,
disabled : mutualState . currentEditKeyRef ? mutualState . currentEditKeyRef !== record . key : false ,
onClick : handleMutualEdit . bind ( null , record ) ,
disabled : state . taskOrdinaryCurrentEditKeyRef ? state . taskOrdinaryC urrentEditKeyRef !== record . key : false ,
onClick : handleTaskOrdinary Edit . bind ( null , record ) ,
}
] ;
}
return [
{
label : '保存' ,
onClick : handleMutual Save . bind ( null , record , column )
onClick : handleTaskOrdinary Save . bind ( null , record , column )
} ,
{
label : '取消' ,
popConfirm : {
title : '是否取消编辑' ,
confirm : handleMutual Cancel . bind ( null , record , column )
confirm : handleTaskOrdinary Cancel . bind ( null , record , column )
}
}
] ;
}
/** 创建操作列 */
function createActions ( record : EditRecordRow , column : BasicColumn ) : ActionItem [ ] {
/** 处理普通任务表格编辑 */
function handleTaskOrdinaryEdit ( record : EditRecordRow ) {
state . taskOrdinaryCurrentEditKeyRef = record . key ;
record . onEdit ? . ( true ) ;
}
/** 处理普通任务表格编辑取消 */
function handleTaskOrdinaryCancel ( record : EditRecordRow ) {
state . taskOrdinaryCurrentEditKeyRef = '' ;
record . onEdit ? . ( false , false ) ;
}
/** 处理普通任务表格编辑保存 */
async function handleTaskOrdinarySave ( record : EditRecordRow ) {
const valid = await record . onValid ? . ( ) ;
if ( valid ) {
const pass = await record . onEdit ? . ( false , true ) ;
pass && ( state . taskOrdinaryCurrentEditKeyRef = '' ) ;
}
}
/** 创建交接任务操作列 */
function createTaskPresetActions ( record : EditRecordRow , column : BasicColumn ) : ActionItem [ ] {
if ( ! record . editable ) {
return [
{
label : '编辑' ,
disabled : state . currentEditKeyRef ? state . currentEditKeyRef !== record . key : false ,
onClick : handleEdit . bind ( null , record ) ,
disabled : state . taskPresetC urrentEditKeyRef ? state . taskPresetC urrentEditKeyRef !== record . key : false ,
onClick : handleTaskPreset Edit . bind ( null , record ) ,
}
] ;
}
return [
{
label : '保存' ,
onClick : handleSave . bind ( null , record , column )
onClick : handleTaskPreset Save . bind ( null , record , column )
} ,
{
label : '取消' ,
popConfirm : {
title : '是否取消编辑' ,
confirm : handleCancel . bind ( null , record , column )
confirm : handleTaskPreset Cancel . bind ( null , record , column )
}
}
] ;
}
function handleEdit ( record : EditRecordRow ) {
state . currentEditKeyRef = record . key ;
/** 处理交接任务表格编辑 */
function handleTaskPresetEdit ( record : EditRecordRow ) {
state . taskPresetCurrentEditKeyRef = record . key ;
record . onEdit ? . ( true ) ;
}
function handleCancel ( record : EditRecordRow ) {
state . currentEditKeyRef = '' ;
/** 处理交接任务表格编辑取消 */
function handleTaskPresetCancel ( record : EditRecordRow ) {
state . taskPresetCurrentEditKeyRef = '' ;
record . onEdit ? . ( false , false ) ;
}
async function handleSave ( record : EditRecordRow ) {
/** 处理交接任务表格编辑保存 */
async function handleTaskPresetSave ( record : EditRecordRow ) {
const valid = await record . onValid ? . ( ) ;
if ( valid ) {
const pass = await record . onEdit ? . ( false , true ) ;
pass && ( state . currentEditKeyRef = '' ) ;
computeScheme ( ) ;
pass && ( state . taskPresetCurrentEditKeyRef = '' ) ;
}
}
function handleMutualEdit ( record : EditRecordRow ) {
mutualState . currentEditKeyRef = record . key ;
record . onEdit ? . ( true ) ;
}
function handleMutualCancel ( record : EditRecordRow ) {
mutualState . currentEditKeyRef = '' ;
record . onEdit ? . ( false , false ) ;
}
async function handleMutualSave ( record : EditRecordRow ) {
const valid = await record . onValid ? . ( ) ;
if ( valid ) {
const pass = await record . onEdit ? . ( false , true ) ;
pass && ( mutualState . currentEditKeyRef = '' ) ;
}
/** 处理打开交接任务 */
function handleOpenTaskPreset ( ) {
openModal ( true , { } ) ;
}
/** 智能计算方案 */
function computeScheme ( ) {
const scheme = [ ] ;
const origin = state . formData . takeSpecimenId ;
/ / 抽 离 计 算 属 性
const taskDataSource = getDataSource ( ) ;
const smallHospitalPositions : any [ ] = [ ] ;
const largeHospitalPositions : any [ ] = [ ] ;
taskDataSource . forEach ( item => {
/ / 任 务 上 下 级 医 院 唯 一 匹 配 I D
const key = buildUUID ( ) ;
const smallHospital = smallHospitalMapList . find ( index => index . id == item . hospitalId ) ;
if ( smallHospital ) smallHospitalPositions . push ( [ key , new AMap . LngLat ( smallHospital . lng , smallHospital . lat ) ] ) ;
const largeHospital = largeHospitalMapList . find ( index => index . id == item . orgId ) ;
if ( largeHospital ) largeHospitalPositions . push ( [ key , new AMap . LngLat ( largeHospital . lng , largeHospital . lat ) ] ) ;
} ) ;
/ / 途 径 点
const waypoints : any [ ] = [ ] ;
/ / 目 的 地
let destination ;
/** 1.计算预测大致的智能规划方案可行性数量 */
/** 处理地图任务预设点数据 */
function handleTaskPreset ( ) {
/ / 下 级 医 院 规 划 方 案 二 维 数 组
const smallHospitalScheme = Array . from ( { length : smallHospitalPositions . length } , ( ) => Array ( smallHospitalPositions . length ) . fill ( 0 ) ) ;
for ( let i = 0 ; i < smallHospitalPositions . length ; ++ i ) {
/ / 提 取 一 维 数 组 , 方 案 索 引
const oneDimensionArray = smallHospitalScheme [ i ] ;
/ / 推 动 数 组 位 置 坐 标 , 实 现 让 每 个 方 案 的 坐 标 位 置 都 不 一 致
let indexs = Object . keys ( smallHospitalPositions ) ;
const reverseIndexs = indexs . slice ( 0 , i ) ;
indexs . splice ( 0 , i ) ;
indexs . push ( ... reverseIndexs ) ;
/ / 处 理 二 维 数 组 坐 标 位 置 存 储
for ( let j = 0 ; j < indexs . length ; ++ j ) {
const index = indexs [ j ] ;
const smallHospitalPosition = smallHospitalPositions [ index ] ;
oneDimensionArray [ j ] = smallHospitalPosition ;
}
}
/ / 计 算 组 合 规 范 方 案
const composeScheme = mapSchemePermuteUnique ( [ ] ) ;
/** 处理弹出框提交 */
async function handleSubmit ( ) {
console . log ( getTaskOrdinaryDataSource ( ) ) ;
}
/** todo:地图动态组合排序算法暂时保留,等待下一版谈论是否做智能地图最优方案 */
/** 地图方案组合排列算法,可确保二叉树当存在数组内容相同排列不重复 */
function mapSchemePermuteUnique ( composeQueue : number [ ] ) {
const ans : number [ ] [ ] = [ ] ;
@ -296,40 +333,4 @@
@@ -296,40 +333,4 @@
return ans ;
}
/** 处理打开交接任务 */
function handleMutualTask ( ) {
openModal ( true , { driving } ) ;
}
/** 处理路线预览 */
function handlePathPreview ( ) {
}
/** 处理弹出框提交 */
async function handleSubmit ( ) {
console . log ( getDataSource ( ) ) ;
/ * t r y {
/ / 提 取 验 证 数 据
const formData = await formElRef . value . validate ( ) ;
console . log ( formData ) ;
/ / 处 理 提 交 之 前 逻 辑
setModalProps ( { confirmLoading : true } ) ;
/ / 采 用 t a g 标 签 区 分 操 作
switch ( state . tag ) {
case 'add' :
/ / a w a i t a d d C o n f i g ( f o r m D a t a ) ;
break ;
case 'edit' :
/ / a w a i t e d i t C o n f i g ( f o r m D a t a ) ;
break ;
}
/ / 处 理 提 交 完 成 之 后 逻 辑
closeModal ( ) ;
emit ( 'success' ) ;
} finally {
setModalProps ( { confirmLoading : false } ) ;
} * /
}
< / script >