任务管理

This commit is contained in:
yyy 2025-01-18 17:02:38 +08:00
parent 7ac789c919
commit 8dfb5c8ed7
6 changed files with 746 additions and 321 deletions

View File

@ -4,8 +4,8 @@ NODE_ENV=production
VITE_DEV=true
# 请求路径
# VITE_BASE_URL='http://192.168.10.134:48080'
VITE_BASE_URL='http://192.168.0.189:48080'
VITE_BASE_URL='http://192.168.0.90:48080'
# VITE_BASE_URL='http://192.168.0.189:48080'
# 文件上传类型server - 后端上传, client - 前端直连上传仅支持S3服务
VITE_UPLOAD_TYPE=server

View File

@ -4,8 +4,8 @@ NODE_ENV=development
VITE_DEV=true
# 请求路径
# VITE_BASE_URL='http://192.168.10.134:48080'
VITE_BASE_URL='http://192.168.0.189:48080'
VITE_BASE_URL='http://192.168.0.90:48080'
# VITE_BASE_URL='http://192.168.0.189:48080'
# 文件上传类型server - 后端上传, client - 前端直连上传,仅支持 S3 服务
VITE_UPLOAD_TYPE=server

View File

@ -31,6 +31,6 @@ export const updateTask = (data) => {
}
//获得机器人任务主表分页
export const getTaskPageList = async (params) => {
return await request.get({ url: `/system/robot/task/page`, params })
export const getTaskPageList = async (data) => {
return await request.post({ url: `/system/robot/task/page`, data })
}

View File

@ -1,64 +1,81 @@
<template>
<Dialog v-model="dialogVisible" title="新建任务" width="600" class="task-dialog">
<el-form :model="formData" label-width="auto" ref="formRef" :rules="formRules">
<el-form-item label="取货类型" prop="takeType" required>
<el-select v-model="formData.takeType" placeholder="请选择取货类型" required>
<el-form-item required label="任务号" prop="taskNo">
<el-input v-model="formData.taskNo" :disabled="true" />
</el-form-item>
<el-form-item label="取货类型" prop="taskDetailList[0].takeType" required>
<el-select
v-model="formData.taskDetailList[0].takeType"
placeholder="请选择取货类型"
required
>
<el-option label="库位" :value="1" />
<el-option label="线库" :value="2" />
<el-option label="区域" :value="3" />
</el-select>
</el-form-item>
<el-form-item required label="取货位置" prop="takeId">
<el-form-item required label="取货位置" prop="taskDetailList[0].takeId">
<el-select
:disabled="!formData.takeType"
v-model="formData.takeId"
:disabled="!formData.taskDetailList[0].takeType"
v-model="formData.taskDetailList[0].takeId"
filterable
remote
reserve-keyword
placeholder="请输入取货位置"
:remote-method="
(query) => {
takeRemoteMethod(query, formData)
takeRemoteMethod(query, formData.taskDetailList[0])
}
"
:loading="loading"
>
<el-option
v-for="item in formData.takeList"
v-for="item in formData.taskDetailList[0].takeList"
:key="item.id"
:label="item.locationNo"
:value="item.id"
/>
<template #loading>
<svg class="circular" viewBox="0 0 50 50">
<circle class="path" cx="25" cy="25" r="20" fill="none" />
</svg>
</template>
</el-select>
</el-form-item>
<el-form-item label="放货类型" prop="releaseType" required>
<el-select v-model="formData.releaseType" placeholder="请选择放货类型">
<el-form-item label="放货类型" prop="taskDetailList[0].releaseType" required>
<el-select v-model="formData.taskDetailList[0].releaseType" placeholder="请选择放货类型">
<el-option label="库位" :value="1" />
<el-option label="线库" :value="2" />
<el-option label="区域" :value="3" />
</el-select>
</el-form-item>
<el-form-item required label="放货位置" prop="releaseId">
<el-form-item required label="放货位置" prop="taskDetailList[0].releaseId">
<el-select
:disabled="!formData.releaseType"
v-model="formData.releaseId"
:disabled="!formData.taskDetailList[0].releaseType"
v-model="formData.taskDetailList[0].releaseId"
filterable
remote
reserve-keyword
placeholder="请输入放货位置"
:remote-method="
(query) => {
releaseRemoteMethod(query, formData)
releaseRemoteMethod(query, formData.taskDetailList[0])
}
"
:loading="loading"
>
<el-option
v-for="item in formData.releaseList"
v-for="item in formData.taskDetailList[0].releaseList"
:key="item.id"
:label="item.locationNo"
:value="item.id"
/>
<template #loading>
<svg class="circular" viewBox="0 0 50 50">
<circle class="path" cx="25" cy="25" r="20" fill="none" />
</svg>
</template>
</el-select>
</el-form-item>
<el-form-item label="物料信息" prop="skuInfo">
@ -75,7 +92,13 @@
</el-select>
</el-form-item>
<el-form-item label="优先级" prop="priority">
<el-input v-model="formData.priority" placeholder="请输入优先级" />
<el-input-number
placeholder="优先级范围为1-100"
v-model="formData.priority"
:min="1"
:max="100"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="其他信息" prop="otherMsg">
<el-input
@ -107,8 +130,21 @@ const formLoading = ref(false) // 表单的加载中1修改时的数据加
const formData = ref({
montageTask: 0, //01
montageNumber: 0, //
taskDetailList: [], //
montageNumber: 1, //
taskDetailList: [
{
taskType: 1, //12 345678
releaseType: 1, // 12线 3
takeType: 1, //12线 3
releaseId: undefined, //id
releaseList: [], //
takeId: undefined, //id
takeList: [], //
robotNo: undefined, //AGV
needLock: 0, //(0:1:)
electricity: undefined //()
}
], //
skuInfo: undefined, //
skuBatch: undefined, //
skuNumber: undefined, //
@ -125,18 +161,26 @@ const formData = ref({
endTime: 0 //
})
const formRules = reactive({
name1: [{ required: true, message: '取货类型不能为空', trigger: 'blur' }],
name2: [{ required: true, message: '取货位置不能为空', trigger: 'blur' }],
name3: [{ required: true, message: '放货类型不能为空', trigger: 'blur' }],
name4: [{ required: true, message: '放货位置不能为空', trigger: 'blur' }]
taskNo: [{ required: true, message: '任务号不能为空', trigger: 'change' }],
'taskDetailList[0].takeType': [
{ required: true, message: '取货类型不能为空', trigger: 'change' }
],
'taskDetailList[0].takeId': [{ required: true, message: '取货位置不能为空', trigger: 'change' }],
'taskDetailList[0].releaseType': [
{ required: true, message: '放货类型不能为空', trigger: 'change' }
],
'taskDetailList[0].releaseId': [
{ required: true, message: '放货位置不能为空', trigger: 'change' }
]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async () => {
dialogVisible.value = true
getCanUseRobotList()
resetForm()
getCanUseRobotList()
getTaskNo()
}
defineExpose({ open }) // open
@ -150,9 +194,10 @@ const submitForm = async () => {
//
formLoading.value = true
try {
await MapTaskAPi.createTask(formData.value)
message.success(t('common.createSuccess'))
dialogVisible.value = false
//
emit('success')
push({ name: 'taskManagementTaskList' })
} finally {
formLoading.value = false
}
@ -170,12 +215,57 @@ const getCanUseRobotList = async () => {
robotList.value = await MapTaskAPi.getCanUseRobot()
}
//
const getTaskNo = async () => {
formData.value.taskNo = await MapTaskAPi.getTaskNo()
}
//
const getLocationList = async (type, locationNo) => {
return await MapTaskAPi.getLocationByName({
type, // 12线 3
locationNo
})
}
//
const loading = ref(false)
const releaseRemoteMethod = async (query, item) => {
if (query) {
loading.value = true
item.releaseList = await getLocationList(item.releaseType, query)
loading.value = false
} else {
item.releaseList = []
}
}
//
const takeRemoteMethod = async (query, item) => {
if (query) {
item.takeList = await getLocationList(item.takeType, query)
} else {
item.takeList = []
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
montageTask: 0, //01
montageNumber: 0, //
taskDetailList: [], //
taskDetailList: [
{
taskType: 1, //12 345678
releaseType: 1, // 12线 3
takeType: 1, //12线 3
releaseId: undefined, //id
releaseList: [], //
takeId: undefined, //id
takeList: [], //
robotNo: undefined, //AGV
needLock: 0, //(0:1:)
electricity: undefined //()
}
], //
skuInfo: undefined, //
skuBatch: undefined, //
skuNumber: undefined, //
@ -211,4 +301,52 @@ const resetForm = () => {
align-items: center;
justify-content: flex-end;
}
.el-select-dropdown__loading {
display: flex;
justify-content: center;
align-items: center;
height: 100px;
font-size: 20px;
}
.circular {
display: inline;
height: 30px;
width: 30px;
animation: loading-rotate 2s linear infinite;
}
.path {
animation: loading-dash 1.5s ease-in-out infinite;
stroke-dasharray: 90, 150;
stroke-dashoffset: 0;
stroke-width: 2;
stroke: var(--el-color-primary);
stroke-linecap: round;
}
@keyframes loading-rotate {
to {
transform: rotate(360deg);
}
}
@keyframes loading-dash {
0% {
stroke-dasharray: 1, 200;
stroke-dashoffset: 0;
}
50% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -40px;
}
100% {
stroke-dasharray: 90, 150;
stroke-dashoffset: -120px;
}
}
@keyframes custom-spin-move {
to {
opacity: 1;
}
}
</style>

View File

@ -12,7 +12,7 @@
</div>
</ContentWrap>
<el-form :model="formData" label-width="145" ref="formRef">
<el-form :model="formData" label-width="94" ref="formRef">
<el-card shadow="never">
<template #header>
<div class="card-header">
@ -23,89 +23,125 @@
<div>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="任务号" prop="taskNo">
<el-form-item required label="任务号" prop="taskNo" label-width="146">
<el-input v-model="formData.taskNo" :disabled="true" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="是否拼接任务" prop="montageTask">
<el-select v-model="formData.montageTask" placeholder="请选择">
<el-option label="不拼接" :value="0" />
<el-option label="拼接" :value="1" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="formData.montageTask === 1">
<el-form-item required label="任务拼接数量" prop="montageNumber">
<el-input-number
v-model="formData.montageNumber"
:min="0"
:max="10"
@change="montageNumberChange"
/>
</el-form-item>
</el-col>
</el-row>
<div
v-if="
formData.taskDetailList[0].taskType === 1 ||
formData.taskDetailList[0].taskType === 5 ||
formData.taskDetailList[0].taskType === 6
formData.taskDetailList[0].taskType !== 2 && formData.taskDetailList[0].taskType !== 3
"
>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="搬空所选线库/区域" prop="doMoveAll">
<el-switch v-model="formData.doMoveAll" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="任务循环" prop="doCycle">
<el-switch v-model="formData.doCycle" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
<el-col :span="12" v-if="formData.doCycle === 1">
<el-form-item required label="循环次数" prop="cycleNumber">
<el-input-number v-model="formData.cycleNumber" :min="0" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="物料信息" prop="skuInfo">
<el-input v-model="formData.skuInfo" placeholder="请输入物料信息" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="优先级" prop="priority">
<el-input v-model="formData.priority" placeholder="请输入优先级" />
<el-form-item required label="是否拼接任务" prop="montageTask" label-width="146">
<el-select
v-model="formData.montageTask"
placeholder="请选择"
@change="montageTaskChange"
>
<el-option label="不拼接" :value="0" />
<el-option label="拼接" :value="1" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="formData.montageTask === 1">
<el-form-item required label="任务拼接数量" prop="montageNumber" label-width="146">
<el-input-number
class="!w-220px"
v-model="formData.montageNumber"
:min="1"
:max="10"
@change="montageNumberChange"
/>
</el-form-item>
</el-col>
</el-row>
<div
v-if="
formData.taskDetailList[0].taskType === 1 ||
formData.taskDetailList[0].taskType === 5 ||
formData.taskDetailList[0].taskType === 6
"
>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item
required
label="搬空所选线库/区域"
prop="doMoveAll"
label-width="146"
>
<el-switch v-model="formData.doMoveAll" :active-value="1" :inactive-value="0" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="任务循环" prop="doCycle" label-width="146">
<el-switch
v-model="formData.doCycle"
:active-value="1"
:inactive-value="0"
@change="doCycleChange"
/>
</el-form-item>
</el-col>
<el-col :span="12" v-if="formData.doCycle === 1">
<el-form-item required label="循环次数" prop="cycleNumber" label-width="146">
<el-input-number class="!w-220px" v-model="formData.cycleNumber" :min="0" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="物料信息" prop="skuInfo" label-width="146">
<el-input v-model="formData.skuInfo" placeholder="请输入物料信息" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="优先级" prop="priority" label-width="146">
<el-input-number
placeholder="优先级范围为1-100"
v-model="formData.priority"
:min="1"
:max="100"
class="!w-220px"
/>
</el-form-item>
</el-col>
</el-row>
</div>
</div>
</div>
</el-card>
</el-form>
<el-card shadow="never" class="mt-4">
<template #header>
<div class="card-header">
<span class="line"></span>
<span>任务详情</span>
</div>
</template>
<div class="task-list">
<div v-for="(detailItem, index) in formData.taskDetailList" :key="index" class="task-item">
<div class="index-logo">{{ index + 1 }}</div>
<el-form :model="detailItem" label-width="90">
<el-card shadow="never" class="mt-4">
<template #header>
<div class="card-header">
<span class="line"></span>
<span>任务详情</span>
</div>
</template>
<div class="task-list">
<div
v-for="(detailItem, index) in formData.taskDetailList"
:key="index"
class="task-item"
>
<div class="index-logo">{{ index + 1 }}</div>
<el-row :gutter="24">
<el-col :span="24">
<el-form-item required label="任务类型" prop="taskType">
<el-form-item
required
label="任务类型"
:prop="`taskDetailList[${index}].taskType`"
:rules="{ required: true, message: '任务类型不能为空', trigger: 'change' }"
>
<el-select
:disabled="formData.doCycle == 1 && index == 0"
v-model="detailItem.taskType"
placeholder="请选择"
@change="taskTypeChange(detailItem, index)"
@ -126,11 +162,16 @@
<div v-if="detailItem.taskType === 1">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="取货类型" prop="takeType">
<el-form-item
required
label="取货类型"
:prop="`taskDetailList[${index}].takeType`"
:rules="{ required: true, message: '取货类型不能为空', trigger: 'change' }"
>
<el-select
v-model="detailItem.takeType"
placeholder="请选择取货类型"
@change="getPickupLocation(detailItem)"
@change="takeTypeChange(detailItem)"
>
<el-option label="库位" :value="1" />
<el-option label="线库" :value="2" />
@ -139,7 +180,12 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item required label="取货位置" prop="takeId">
<el-form-item
required
label="取货位置"
:prop="`taskDetailList[${index}].takeId`"
:rules="{ required: true, message: '取货位置不能为空', trigger: 'change' }"
>
<el-select
:disabled="!detailItem.takeType"
v-model="detailItem.takeId"
@ -166,11 +212,16 @@
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="放货类型" prop="releaseType">
<el-form-item
required
label="放货类型"
:prop="`taskDetailList[${index}].releaseType`"
:rules="{ required: true, message: '放货类型不能为空', trigger: 'change' }"
>
<el-select
v-model="detailItem.releaseType"
placeholder="请选择放货类型"
@change="getDropOffLocation(detailItem)"
@change="releaseTypeChange(detailItem)"
>
<el-option label="库位" :value="1" />
<el-option label="线库" :value="2" />
@ -179,7 +230,12 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item required label="放货位置" prop="releaseId">
<el-form-item
required
label="放货位置"
:prop="`taskDetailList[${index}].releaseId`"
:rules="{ required: true, message: '放货位置不能为空', trigger: 'change' }"
>
<el-select
:disabled="!detailItem.releaseType"
v-model="detailItem.releaseId"
@ -206,7 +262,7 @@
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="指定车辆" prop="robotNo">
<el-form-item label="指定车辆">
<el-select v-model="detailItem.robotNo" placeholder="请选择车辆">
<el-option
v-for="car in robotList"
@ -223,7 +279,12 @@
<div v-if="detailItem.taskType === 2">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="车辆编号" prop="robotNo">
<el-form-item
required
label="车辆编号"
:prop="`taskDetailList[${index}].robotNo`"
:rules="{ required: true, message: '车辆不能为空', trigger: 'change' }"
>
<el-select v-model="detailItem.robotNo" placeholder="请选择车辆">
<el-option
v-for="car in robotList"
@ -235,7 +296,12 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item required label="停车后锁定" prop="needLock">
<el-form-item
required
label="停车后锁定"
:prop="`taskDetailList[${index}].needLock`"
:rules="{ required: true, message: '请选择停车后是否锁定', trigger: 'change' }"
>
<el-select v-model="detailItem.needLock" placeholder="停车后锁定">
<el-option label="是" :value="0" />
<el-option label="否" :value="1" />
@ -248,7 +314,12 @@
<div v-if="detailItem.taskType === 3">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="车辆编号" prop="robotNo">
<el-form-item
required
label="车辆编号"
:prop="`taskDetailList[${index}].robotNo`"
:rules="{ required: true, message: '车辆不能为空', trigger: 'change' }"
>
<el-select
v-model="detailItem.robotNo"
placeholder="请选择车辆"
@ -268,7 +339,12 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item required label="所选车辆电量" prop="electricity">
<el-form-item
required
label="所选车辆电量"
:prop="`taskDetailList[${index}].electricity`"
:rules="{ required: true, message: '所选车辆电量不能为空', trigger: 'change' }"
>
<el-input
v-model="detailItem.electricity"
placeholder="请输入车辆电量"
@ -282,7 +358,12 @@
<div v-if="detailItem.taskType === 4">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="车辆编号" prop="robotNo">
<el-form-item
required
label="车辆编号"
:prop="`taskDetailList[${index}].robotNo`"
:rules="{ required: true, message: '车辆不能为空', trigger: 'change' }"
>
<el-select v-model="detailItem.robotNo" placeholder="请选择车辆">
<el-option
v-for="car in robotList"
@ -294,7 +375,12 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item required label="终点库位" prop="releaseId">
<el-form-item
required
label="终点库位"
:prop="`taskDetailList[${index}].releaseId`"
:rules="{ required: true, message: '终点库位不能为空', trigger: 'change' }"
>
<el-select
:disabled="!detailItem.takeType"
v-model="detailItem.releaseId"
@ -324,11 +410,16 @@
<div v-if="detailItem.taskType === 5">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="取货类型" prop="takeType">
<el-form-item
required
label="取货类型"
:prop="`taskDetailList[${index}].takeType`"
:rules="{ required: true, message: '取货类型不能为空', trigger: 'change' }"
>
<el-select
v-model="detailItem.takeType"
placeholder="请选择取货类型"
@change="getPickupLocation(detailItem)"
@change="takeTypeChange(detailItem)"
>
<el-option label="库位" :value="1" />
<el-option label="线库" :value="2" />
@ -337,7 +428,12 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item required label="取货位置" prop="takeId">
<el-form-item
required
label="取货位置"
:prop="`taskDetailList[${index}].takeId`"
:rules="{ required: true, message: '取货位置不能为空', trigger: 'change' }"
>
<el-select
:disabled="!detailItem.takeType"
v-model="detailItem.takeId"
@ -364,7 +460,12 @@
</el-row>
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="车辆编号" prop="robotNo">
<el-form-item
required
label="车辆编号"
:prop="`taskDetailList[${index}].robotNo`"
:rules="{ required: true, message: '车辆不能为空', trigger: 'change' }"
>
<el-select v-model="detailItem.robotNo" placeholder="请选择车辆">
<el-option
v-for="car in robotList"
@ -381,11 +482,16 @@
<div v-if="detailItem.taskType === 6">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="放货类型" prop="releaseType">
<el-form-item
required
label="放货类型"
:prop="`taskDetailList[${index}].releaseType`"
:rules="{ required: true, message: '放货类型不能为空', trigger: 'change' }"
>
<el-select
v-model="detailItem.releaseType"
placeholder="请选择放货类型"
@change="getDropOffLocation(detailItem)"
@change="releaseTypeChange(detailItem)"
>
<el-option label="库位" :value="1" />
<el-option label="线库" :value="2" />
@ -394,7 +500,12 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item required label="放货位置" prop="releaseId">
<el-form-item
required
label="放货位置"
:prop="`taskDetailList[${index}].releaseId`"
:rules="{ required: true, message: '放货位置不能为空', trigger: 'change' }"
>
<el-select
:disabled="!detailItem.releaseType"
v-model="detailItem.releaseId"
@ -438,7 +549,12 @@
<div v-if="detailItem.taskType === 7">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="车辆编号" prop="robotNo">
<el-form-item
required
label="车辆编号"
:prop="`taskDetailList[${index}].robotNo`"
:rules="{ required: true, message: '车辆不能为空', trigger: 'change' }"
>
<el-select v-model="detailItem.robotNo" placeholder="请选择车辆">
<el-option
v-for="car in robotList"
@ -450,7 +566,12 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item required label="放货位置" prop="releaseId">
<el-form-item
required
label="放货位置"
:prop="`taskDetailList[${index}].releaseId`"
:rules="{ required: true, message: '放货位置不能为空', trigger: 'change' }"
>
<el-select
:disabled="!detailItem.releaseType"
v-model="detailItem.releaseId"
@ -480,7 +601,12 @@
<div v-if="detailItem.taskType === 8">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item required label="车辆编号" prop="robotNo">
<el-form-item
required
label="车辆编号"
:prop="`taskDetailList[${index}].robotNo`"
:rules="{ required: true, message: '车辆不能为空', trigger: 'change' }"
>
<el-select v-model="detailItem.robotNo" placeholder="请选择车辆">
<el-option
v-for="car in robotList"
@ -492,7 +618,12 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item required label="检测位置" prop="releaseId">
<el-form-item
required
label="检测位置"
:prop="`taskDetailList[${index}].releaseId`"
:rules="{ required: true, message: '检测位置不能为空', trigger: 'change' }"
>
<el-select
:disabled="!detailItem.releaseType"
v-model="detailItem.releaseId"
@ -518,10 +649,10 @@
</el-col>
</el-row>
</div>
</el-form>
</div>
</div>
</div>
</el-card>
</el-card>
</el-form>
</div>
</template>
@ -535,9 +666,11 @@ defineOptions({ name: 'taskManagementCreateTask' })
const { t } = useI18n() //
const message = useMessage() //
const { push } = useRouter()
const formData = reactive({
montageTask: 0, //01
montageNumber: 0, //
montageTask: 1, //01
montageNumber: 1, //
taskDetailList: [
{
taskType: 1, //12 345678
@ -559,7 +692,7 @@ const formData = reactive({
otherMsg: undefined, //
doCycle: 0, //(0:1)
doMoveAll: 0, //线/(0:1)
cycleNumber: 0, //
cycleNumber: 0, //
remainingCycleNumber: 1, //1
taskNo: undefined, //
taskStatus: 0, //(0:123)
@ -570,7 +703,7 @@ const formData = reactive({
//
const getTaskNo = async () => {
formData.taskNo = await MapTaskAPi.getTaskNo(1)
formData.taskNo = await MapTaskAPi.getTaskNo()
}
//
@ -581,6 +714,7 @@ const getLocationList = async (type, locationNo) => {
})
}
//
const loading = ref(false)
const releaseRemoteMethod = async (query, item) => {
if (query) {
item.releaseList = await getLocationList(item.releaseType, query)
@ -613,144 +747,168 @@ const robotNoChange = (e, detailItem) => {
//
const taskTypeChange = (item, index) => {
if (index === 0) return
//
item.releaseType = 1
item.takeType = 1
item.releaseId = undefined
item.releaseList = []
item.takeId = undefined
item.takeList = []
item.robotNo = undefined
item.needLock = 0
item.electricity = undefined
let lastItem = formData.taskDetailList[index - 1]
if (lastItem.taskType === 1) {
if (item.takeType === 2) {
message.warning('取放货后不可连接停车')
item.takeType = 1
return
if (index === 0) {
if (item.taskType === 2) {
formData.montageTask = 0
formData.montageNumber = 1
formData.taskDetailList = formData.taskDetailList.slice(0, 1)
message.warning('任务1为停车不可拼接任务')
}
if (item.takeType === 3) {
message.warning('取放货后不可连接充电')
item.takeType = 1
return
if (item.taskType === 3) {
formData.montageTask = 0
formData.montageNumber = 1
formData.taskDetailList = formData.taskDetailList.slice(0, 1)
message.warning('任务1为充电不可拼接任务')
}
if (item.takeType === 6) {
message.warning('取放货后不可连接仅放货')
item.takeType = 1
return
}
if (item.takeType === 7) {
message.warning('取放货后不可连接扫描码')
item.takeType = 1
return
}
if (item.takeType === 8) {
message.warning('取放货后不可连接检测托盘类型')
item.takeType = 1
return
}
} else if (lastItem.taskType === 2) {
//
} else if (lastItem.taskType === 3) {
//
} else if (lastItem.taskType === 4) {
if (item.takeType === 2) {
message.warning('移动后不可连接停车')
item.takeType = 1
return
}
if (item.takeType === 3) {
message.warning('移动后不可连接充电')
item.takeType = 1
return
}
if (item.takeType === 6) {
message.warning('移动后不可连接仅放货')
item.takeType = 1
return
}
} else if (lastItem.taskType === 5) {
if (item.takeType === 1) {
message.warning('仅取货后不可连接取放货')
item.takeType = 1
return
}
if (item.takeType === 2) {
message.warning('仅取货后不可连接停车')
item.takeType = 1
return
}
if (item.takeType === 3) {
message.warning('仅取货后不可连接充电')
item.takeType = 1
return
}
if (item.takeType === 5) {
message.warning('仅取货后不可连接仅取货')
item.takeType = 1
return
}
if (item.takeType === 7) {
message.warning('仅取货后不可连接扫描码')
item.takeType = 1
return
}
if (item.takeType === 8) {
message.warning('仅取货后不可连接检测托盘类型')
item.takeType = 1
return
}
} else if (lastItem.taskType === 6) {
if (item.takeType === 2) {
message.warning('仅放货后不可连接停车')
item.takeType = 1
return
}
if (item.takeType === 3) {
message.warning('仅放货后不可连接充电')
item.takeType = 1
return
}
if (item.takeType === 6) {
message.warning('仅放货后不可连接仅放货')
item.takeType = 1
return
}
if (item.takeType === 7) {
message.warning('仅放货后不可连接扫描码')
item.takeType = 1
return
}
} else if (lastItem.taskType === 7) {
if (item.takeType === 2) {
message.warning('扫描码后不可连接停车')
item.takeType = 1
return
}
if (item.takeType === 3) {
message.warning('扫描码后不可连接充电')
item.takeType = 1
return
}
if (item.takeType === 6) {
message.warning('扫描码后不可连接仅放货')
item.takeType = 1
return
}
if (item.takeType === 7) {
message.warning('扫描码后不可连接扫描码')
item.takeType = 1
return
}
} else if (lastItem.taskType === 8) {
if (item.takeType === 2) {
message.warning('检测托盘类型后不可连接停车')
item.takeType = 1
return
}
if (item.takeType === 3) {
message.warning('检测托盘类型后不可连接充电')
item.takeType = 1
return
}
if (item.takeType === 6) {
message.warning('检测托盘类型后不可连接仅放货')
item.takeType = 1
return
} else {
//
if (lastItem.taskType === 1) {
if (item.taskType === 2) {
message.warning('取放货后不可连接停车')
item.taskType = undefined
return
}
if (item.taskType === 3) {
message.warning('取放货后不可连接充电')
item.taskType = undefined
return
}
if (item.taskType === 6) {
message.warning('取放货后不可连接仅放货')
item.taskType = undefined
return
}
if (item.taskType === 7) {
message.warning('取放货后不可连接扫描码')
item.taskType = undefined
return
}
if (item.taskType === 8) {
message.warning('取放货后不可连接检测托盘类型')
item.taskType = undefined
return
}
} else if (lastItem.taskType === 2) {
//
} else if (lastItem.taskType === 3) {
//
} else if (lastItem.taskType === 4) {
if (item.taskType === 2) {
message.warning('移动后不可连接停车')
item.taskType = undefined
return
}
if (item.taskType === 3) {
message.warning('移动后不可连接充电')
item.taskType = undefined
return
}
if (item.taskType === 6) {
message.warning('移动后不可连接仅放货')
item.taskType = undefined
return
}
} else if (lastItem.taskType === 5) {
if (item.taskType === 1) {
message.warning('仅取货后不可连接取放货')
item.taskType = undefined
return
}
if (item.taskType === 2) {
message.warning('仅取货后不可连接停车')
item.taskType = undefined
return
}
if (item.taskType === 3) {
message.warning('仅取货后不可连接充电')
item.taskType = undefined
return
}
if (item.taskType === 5) {
message.warning('仅取货后不可连接仅取货')
item.taskType = undefined
return
}
if (item.taskType === 7) {
message.warning('仅取货后不可连接扫描码')
item.taskType = undefined
return
}
if (item.taskType === 8) {
message.warning('仅取货后不可连接检测托盘类型')
item.taskType = undefined
return
}
} else if (lastItem.taskType === 6) {
if (item.taskType === 2) {
message.warning('仅放货后不可连接停车')
item.taskType = undefined
return
}
if (item.taskType === 3) {
message.warning('仅放货后不可连接充电')
item.taskType = undefined
return
}
if (item.taskType === 6) {
message.warning('仅放货后不可连接仅放货')
item.taskType = undefined
return
}
if (item.taskType === 7) {
message.warning('仅放货后不可连接扫描码')
item.taskType = undefined
return
}
} else if (lastItem.taskType === 7) {
if (item.taskType === 2) {
message.warning('扫描码后不可连接停车')
item.taskType = undefined
return
}
if (item.taskType === 3) {
message.warning('扫描码后不可连接充电')
item.taskType = undefined
return
}
if (item.taskType === 6) {
message.warning('扫描码后不可连接仅放货')
item.taskType = undefined
return
}
if (item.taskType === 7) {
message.warning('扫描码后不可连接扫描码')
item.taskType = undefined
return
}
} else if (lastItem.taskType === 8) {
if (item.taskType === 2) {
message.warning('检测托盘类型后不可连接停车')
item.taskType = undefined
return
}
if (item.taskType === 3) {
message.warning('检测托盘类型后不可连接充电')
item.taskType = undefined
return
}
if (item.taskType === 6) {
message.warning('检测托盘类型后不可连接仅放货')
item.taskType = undefined
return
}
}
}
}
@ -759,7 +917,7 @@ const taskTypeChange = (item, index) => {
const montageNumberChange = (currentValue: number, oldValue: number) => {
if (currentValue > oldValue) {
//
let addLength = currentValue - formData.taskDetailList.length + 1
let addLength = currentValue - formData.taskDetailList.length
for (let index = 0; index < addLength; index++) {
formData.taskDetailList.push({
taskType: 1, //12 345678
@ -776,24 +934,59 @@ const montageNumberChange = (currentValue: number, oldValue: number) => {
}
} else {
//
formData.taskDetailList = formData.taskDetailList.slice(0, currentValue + 1)
formData.taskDetailList = formData.taskDetailList.slice(0, currentValue)
}
}
//
const montageTaskChange = (e) => {
if (e === 0) {
formData.montageNumber = 1
formData.taskDetailList = formData.taskDetailList.slice(0, 1)
}
}
//
const doCycleChange = (e) => {
if (e === 0) {
formData.cycleNumber = 0
} else {
formData.montageNumber = 1
formData.taskDetailList = formData.taskDetailList.slice(0, 1)
formData.taskDetailList[0].taskType = 1
}
}
//
const takeTypeChange = (item) => {
item.takeId = undefined
}
//
const releaseTypeChange = (item) => {
item.releaseId = undefined
}
//
const formRef = ref()
const formLoading = ref(false)
//
const submit = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
await MapTaskAPi.createTask(formData)
message.success(t('common.createSuccess'))
} finally {
formLoading.value = false
}
await formRef.value.validate(async (valid, fields) => {
if (valid) {
formLoading.value = true
try {
await MapTaskAPi.createTask(formData)
message.success(t('common.createSuccess'))
push({ name: 'taskManagementTaskList' })
} finally {
formLoading.value = false
}
} else {
message.warning('请补充完整表单信息!')
}
})
}
/** 初始化 **/

View File

@ -2,11 +2,11 @@
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-0.9375rem"
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="4.25rem"
label-width="68px"
>
<el-form-item label="任务号" prop="taskNo">
<el-input
@ -14,22 +14,26 @@
placeholder="请输入任务ID"
clearable
@keyup.enter="handleQuery"
class="!w-15rem"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="车辆编号" prop="robotNo">
<el-select v-model="queryParams.robotNo" class="!w-15rem">
<el-option :value="1" label="1" />
<el-option :value="2" label="2" />
<el-option :value="3" label="3" />
<el-select v-model="queryParams.robotNo" class="!w-240px" @change="handleQuery()">
<el-option
v-for="car in robotList"
:key="car.id"
:label="car.robotNo"
:value="car.robotNo"
/>
</el-select>
</el-form-item>
<el-form-item label="任务状态" prop="taskStatus">
<el-select
v-model="queryParams.taskStatus"
class="!w-15rem"
class="!w-240px"
clearable
placeholder="请选择任务状态"
@change="handleQuery()"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.ROBOT_TASK_STATUS)"
@ -42,9 +46,10 @@
<el-form-item label="任务阶段" prop="taskStage">
<el-select
v-model="queryParams.taskStage"
class="!w-15rem"
class="!w-240px"
clearable
placeholder="请选择任务阶段"
@change="handleQuery()"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.ROBOT_QUEST_PHASES)"
@ -55,15 +60,8 @@
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"
><Icon icon="ep:search" class="mr-0.3125rem" /> 搜索</el-button
>
<el-button @click="resetQuery"
><Icon icon="ep:refresh" class="mr-0.3125rem" /> 重置</el-button
>
<el-button type="primary" @click="openForm('create')" v-hasPermi="['crm:clue:create']">
<Icon icon="ep:plus" class="mr-0.3125rem" /> 新增
</el-button>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
</el-form-item>
</el-form>
</ContentWrap>
@ -72,15 +70,18 @@
<ContentWrap>
<el-table
:data="list"
border
style="width: 100%"
stripe
row-class-name="table-row-class"
:header-cell-style="{ backgroundColor: '#EBF1FF', color: '#0D162A' }"
>
<el-table-column align="center" label="序号" type="expand" width="60">
<template #default="props">
<div class="family-table">
<el-table :data="props.row.details" border :span-method="objectSpanMethod">
<el-table
:data="props.row.details"
border
:span-method="(param) => objectSpanMethod(param, props.row.details)"
>
<el-table-column align="center" label="指令" prop="taskType">
<template #default="scope">
<el-text class="mx-1" v-if="scope.row.taskType == 1">取放货</el-text>
@ -101,7 +102,7 @@
<div class="task-stage" v-if="scope.row.taskStage == 0">
<div
class="icon-dot"
style="background-color: #e6b500; border: 1px solid #e6b500"
style="background-color: #e6b500; border: 0.0625rem solid #e6b500"
></div>
<el-text class="mx-1">待执行</el-text>
</div>
@ -124,7 +125,7 @@
<div class="task-stage" v-else>
<div
class="icon-dot"
style="background-color: #4dc606; border: 1px solid #4dc606"
style="background-color: #4dc606; border: 0.0625rem solid #4dc606"
>
</div>
<el-text class="mx-1">已完成</el-text>
@ -133,8 +134,40 @@
</el-table-column>
<el-table-column align="center" label="操作" width="270">
<template #default="scope">
<el-button type="warning" @click="cancelTask(scope.row)">取消任务</el-button>
<el-button type="primary" @click="finishTask(scope.row)">人工完成</el-button>
<el-button
v-if="scope.row.taskStage !== 5"
type="warning"
@click="cancelTask(props.row, scope.row)"
>取消任务</el-button
>
<el-popover
placement="right"
:width="300"
trigger="click"
v-if="scope.row.taskStage === 0"
>
<template #reference>
<el-button type="primary" @click="modifyPriority(props.row, scope.row)"
>修改优先级</el-button
>
</template>
<div>
<span>修改优先级</span>
<el-input
v-model="priorityNum"
style="width: 180px"
placeholder="优先级范围为1-100"
@blur="priorityNumChange(props.row, scope.row)"
/>
</div>
</el-popover>
<el-button
type="primary"
@click="finishTask(props.row, scope.row)"
v-if="scope.row.taskStage !== 0 && scope.row.taskStage !== 5"
>人工完成</el-button
>
</template>
</el-table-column>
</el-table>
@ -143,7 +176,7 @@
</el-table-column>
<el-table-column label="任务号" prop="taskNo" align="center" />
<el-table-column label="优先级" prop="priority" align="center" />
<el-table-column label="物料信息" prop="skuInfo" align="center" />
<el-table-column label="物料信息" prop="skuInfo" align="center" show-overflow-tooltip />
<el-table-column
label="开始时间"
prop="startTime"
@ -156,7 +189,7 @@
<dict-tag :type="DICT_TYPE.ROBOT_TASK_STATUS" :value="scope.row.taskStatus" />
</template>
</el-table-column>
<el-table-column label="其他信息" prop="otherMsg" align="center" />
<el-table-column label="其他信息" prop="otherMsg" align="center" show-overflow-tooltip />
</el-table>
<!-- 分页 -->
<Pagination
@ -195,8 +228,6 @@ const queryParams = reactive({
taskStage: null
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
const activeName = ref('1') // tab
/** 查询列表 */
const getList = async () => {
@ -209,28 +240,84 @@ const getList = async () => {
loading.value = false
}
}
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
if (columnIndex === 6) {
if (rowIndex % 2 === 0) {
return {
rowspan: 2,
colspan: 1
}
} else {
//
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }, list) => {
if (columnIndex === 5) {
if (rowIndex > 0 && list[rowIndex].taskStage === list[rowIndex - 1].taskStage) {
return {
rowspan: 0,
colspan: 0
}
}
return {
rowspan: getRowspan('taskStage', rowIndex, list),
colspan: 1
}
}
}
//
const getRowspan = (key, rowIndex, list) => {
let rowspan = 1 //1
let curVal = list[rowIndex][key] //
for (let i = rowIndex + 1; i < list.length; i++) {
if (list[i][key] === curVal) {
rowspan++
} else {
break
}
}
return rowspan
}
//
const cancelTask = (item) => {}
const cancelTask = async (mainItem, item) => {
try {
await message.delConfirm('请确认是否取消所有任务?')
await MapTaskAPi.updateTask({
id: mainItem.id,
priority: mainItem.priority,
montageTask: mainItem.montageTask,
montageNumber: mainItem.montageNumber,
taskStatus: 3
})
message.success('已取消')
await getList()
} catch {}
}
//
const finishTask = (item) => {}
const finishTask = async (mainItem, item) => {
try {
await message.delConfirm('请确认是否取消所有任务?')
await MapTaskAPi.updateTask({
id: mainItem.id,
priority: mainItem.priority,
montageTask: mainItem.montageTask,
montageNumber: mainItem.montageNumber,
taskStatus: 5
})
message.success('已取消')
await getList()
} catch {}
}
//
const priorityNum = ref()
const modifyPriority = (mainItem, item) => {
priorityNum.value = mainItem.priority
}
const priorityNumChange = async (mainItem, item) => {
try {
await MapTaskAPi.updateTask({
id: mainItem.id,
priority: priorityNum.value,
montageTask: mainItem.montageTask,
montageNumber: mainItem.montageNumber
})
message.success('已修改')
await getList()
} catch {}
}
/** 搜索按钮操作 */
const handleQuery = () => {
@ -244,19 +331,22 @@ const resetQuery = () => {
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (id) => {}
//
const robotList = ref([])
const getCanUseRobotList = async () => {
robotList.value = await MapTaskAPi.getCanUseRobot()
}
/** 初始化 **/
onMounted(() => {
getList()
getCanUseRobotList()
})
</script>
<style lang="scss" scoped>
.family-table {
margin: 0.625rem 1.25rem 0.625rem 3.125rem;
margin: 10px 20px 10px 50px;
.task-stage {
display: flex;
@ -266,14 +356,18 @@ onMounted(() => {
.icon-dot {
display: inline-block;
width: 18px;
height: 18px;
padding: 3px;
width: 1.125rem;
height: 1.125rem;
padding: 0.1875rem;
border-radius: 50%;
background-clip: content-box;
margin-right: 4px;
margin-right: 0.25rem;
background-color: #409eff;
border: 1px solid #409eff;
border: 0.0625rem solid #409eff;
}
}
::v-deep .table-row-class {
background-color: #f9f9f9e5;
}
</style>