feat(mes): 添加任务状态列表支持,优化任务查询功能

pull/871/MERGE
YunaiV 2026-04-07 23:47:14 +08:00
parent 0d13f32654
commit 500d20155b
10 changed files with 59 additions and 9 deletions

View File

@ -11,6 +11,14 @@
<template> <template>
<Dialog title="点检方案选择" v-model="dialogVisible" width="70%"> <Dialog title="点检方案选择" v-model="dialogVisible" width="70%">
<ContentWrap> <ContentWrap>
<el-alert
v-if="type != null"
:title="`仅展示【${getDictLabel(DICT_TYPE.MES_DV_SUBJECT_TYPE, type)}】类型的计划`"
type="info"
:closable="false"
show-icon
class="!mb-10px"
/>
<el-form :inline="true" :model="queryParams" label-width="85px"> <el-form :inline="true" :model="queryParams" label-width="85px">
<el-form-item label="计划编号"> <el-form-item label="计划编号">
<el-input <el-input
@ -125,7 +133,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { DICT_TYPE } from '@/utils/dict' import { DICT_TYPE, getDictLabel } from '@/utils/dict'
import { dateFormatter2 } from '@/utils/formatTime' import { dateFormatter2 } from '@/utils/formatTime'
import { DvCheckPlanApi, DvCheckPlanVO } from '@/api/mes/dv/checkplan' import { DvCheckPlanApi, DvCheckPlanVO } from '@/api/mes/dv/checkplan'

View File

@ -16,7 +16,7 @@
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="点检计划" prop="planId"> <el-form-item label="点检计划" prop="planId">
<DvCheckPlanSelect v-model="formData.planId" /> <DvCheckPlanSelect v-model="formData.planId" :type="MesDvSubjectTypeEnum.CHECK" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
@ -73,7 +73,7 @@ import DvMachinerySelect from '@/views/mes/dv/machinery/components/DvMachinerySe
import DvCheckPlanSelect from '@/views/mes/dv/checkplan/components/DvCheckPlanSelect.vue' import DvCheckPlanSelect from '@/views/mes/dv/checkplan/components/DvCheckPlanSelect.vue'
import UserSelectV2 from '@/views/system/user/components/UserSelectV2.vue' import UserSelectV2 from '@/views/system/user/components/UserSelectV2.vue'
import CheckRecordLineList from './CheckRecordLineList.vue' import CheckRecordLineList from './CheckRecordLineList.vue'
import { MesDvCheckRecordStatusEnum } from '@/views/mes/utils/constants' import { MesDvCheckRecordStatusEnum, MesDvSubjectTypeEnum } from '@/views/mes/utils/constants'
defineOptions({ name: 'CheckRecordForm' }) defineOptions({ name: 'CheckRecordForm' })
const emit = defineEmits(['success']) const emit = defineEmits(['success'])

View File

@ -16,7 +16,7 @@
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="保养计划" prop="planId"> <el-form-item label="保养计划" prop="planId">
<DvCheckPlanSelect v-model="formData.planId" /> <DvCheckPlanSelect v-model="formData.planId" :type="MesDvSubjectTypeEnum.MAINTENANCE" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
@ -73,7 +73,7 @@ import DvCheckPlanSelect from '@/views/mes/dv/checkplan/components/DvCheckPlanSe
import UserSelectV2 from '@/views/system/user/components/UserSelectV2.vue' import UserSelectV2 from '@/views/system/user/components/UserSelectV2.vue'
import MaintenRecordLineList from './MaintenRecordLineList.vue' import MaintenRecordLineList from './MaintenRecordLineList.vue'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
import { MesDvMaintenRecordStatusEnum } from '@/views/mes/utils/constants' import { MesDvMaintenRecordStatusEnum, MesDvSubjectTypeEnum } from '@/views/mes/utils/constants'
defineOptions({ name: 'MaintenRecordForm' }) defineOptions({ name: 'MaintenRecordForm' })
const emit = defineEmits(['success']) const emit = defineEmits(['success'])

View File

@ -60,6 +60,7 @@
<ProTaskSelect <ProTaskSelect
v-model="formData.taskId" v-model="formData.taskId"
:workOrderId="formData.workOrderId" :workOrderId="formData.workOrderId"
:statuses="[MesProTaskStatusEnum.NORMAL, MesProTaskStatusEnum.START, MesProTaskStatusEnum.PAUSE]"
:disabled="isHeaderReadonly || !formData.workOrderId" :disabled="isHeaderReadonly || !formData.workOrderId"
placeholder="请选择任务" placeholder="请选择任务"
@change="handleTaskChange" @change="handleTaskChange"
@ -298,6 +299,7 @@ import { useUserStore } from '@/store/modules/user'
import { import {
MesAutoCodeRuleCode, MesAutoCodeRuleCode,
MesProFeedbackStatusEnum, MesProFeedbackStatusEnum,
MesProTaskStatusEnum,
MesProWorkOrderStatusEnum MesProWorkOrderStatusEnum
} from '@/views/mes/utils/constants' } from '@/views/mes/utils/constants'

View File

@ -5,6 +5,7 @@
Props: Props:
modelValue 绑定的任务 IDv-model modelValue 绑定的任务 IDv-model
workOrderId 可选打开弹窗时默认按此工单过滤 workOrderId 可选打开弹窗时默认按此工单过滤
statuses 可选任务状态列表IN 查询仅展示这些状态的任务
disabled 是否禁用 disabled 是否禁用
clearable 是否允许清空鼠标悬停时显示清除图标 clearable 是否允许清空鼠标悬停时显示清除图标
placeholder 占位文字 placeholder 占位文字
@ -43,7 +44,7 @@
</el-tooltip> </el-tooltip>
</div> </div>
<!-- 弹窗必须放在 div 外部否则弹窗内的点击事件会冒泡到 div 触发 handleClick --> <!-- 弹窗必须放在 div 外部否则弹窗内的点击事件会冒泡到 div 触发 handleClick -->
<ProTaskSelectDialog ref="dialogRef" :multiple="false" @selected="handleSelected" /> <ProTaskSelectDialog ref="dialogRef" :multiple="false" :statuses="statuses" @selected="handleSelected" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -61,6 +62,7 @@ const props = withDefaults(
defineProps<{ defineProps<{
modelValue?: number // ID modelValue?: number // ID
workOrderId?: number // workOrderId?: number //
statuses?: number[] // IN
disabled?: boolean // disabled?: boolean //
clearable?: boolean // clearable?: boolean //
placeholder?: string // placeholder?: string //

View File

@ -9,10 +9,20 @@
selected(rows: ProTaskVO[]) 确认选择后触发单选时数组长度为 1 selected(rows: ProTaskVO[]) 确认选择后触发单选时数组长度为 1
Expose: Expose:
open(selectedIds?: number[], workOrderId?: number) 打开弹窗可传入已选 ID 和工单 ID 用于预选过滤 open(selectedIds?: number[], workOrderId?: number) 打开弹窗可传入已选 ID 和工单 ID 用于预选过滤
支持通过 statuses prop 传入状态列表后端 IN 查询只展示指定状态的任务
--> -->
<template> <template>
<Dialog title="生产任务选择" v-model="dialogVisible" width="80%"> <Dialog title="生产任务选择" v-model="dialogVisible" width="80%">
<ContentWrap> <ContentWrap>
<el-alert
v-if="statuses?.length"
:title="`仅展示状态为【${statuses!.map((s) => getDictLabel(DICT_TYPE.MES_PRO_TASK_STATUS, s)).join('、')}】的任务`"
type="info"
:closable="false"
show-icon
class="!mb-10px"
/>
<el-form :inline="true" :model="queryParams" label-width="100px"> <el-form :inline="true" :model="queryParams" label-width="100px">
<el-form-item label="所属工序"> <el-form-item label="所属工序">
<ProProcessSelect <ProProcessSelect
@ -139,7 +149,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { formatDate } from '@/utils/formatTime' import { formatDate } from '@/utils/formatTime'
import { DICT_TYPE } from '@/utils/dict' import { DICT_TYPE, getDictLabel } from '@/utils/dict'
import { ProTaskApi, ProTaskVO } from '@/api/mes/pro/task' import { ProTaskApi, ProTaskVO } from '@/api/mes/pro/task'
import ProProcessSelect from '@/views/mes/pro/process/components/ProProcessSelect.vue' import ProProcessSelect from '@/views/mes/pro/process/components/ProProcessSelect.vue'
import ProWorkOrderSelect from '@/views/mes/pro/workorder/components/ProWorkOrderSelect.vue' import ProWorkOrderSelect from '@/views/mes/pro/workorder/components/ProWorkOrderSelect.vue'
@ -150,6 +160,7 @@ defineOptions({ name: 'ProTaskSelectDialog' })
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{
multiple?: boolean // true checkboxfalse radio multiple?: boolean // true checkboxfalse radio
statuses?: number[] // IN
}>(), }>(),
{ {
multiple: true multiple: true
@ -213,7 +224,8 @@ const queryParams = reactive({
name: undefined as string | undefined, // name: undefined as string | undefined, //
processId: undefined as number | undefined, // processId: undefined as number | undefined, //
workOrderId: undefined as number | undefined, // workOrderId: undefined as number | undefined, //
workstationId: undefined as number | undefined // workstationId: undefined as number | undefined, //
statuses: undefined as number[] | undefined // IN
}) })
/** 查询任务列表 */ /** 查询任务列表 */
@ -267,6 +279,7 @@ const resetQuery = () => {
queryParams.processId = undefined queryParams.processId = undefined
queryParams.workOrderId = undefined queryParams.workOrderId = undefined
queryParams.workstationId = undefined queryParams.workstationId = undefined
queryParams.statuses = props.statuses // props
handleQuery() handleQuery()
} }
@ -299,6 +312,7 @@ const open = async (selectedIds?: number[], workOrderId?: number) => {
queryParams.processId = undefined queryParams.processId = undefined
queryParams.workOrderId = workOrderId ?? undefined // workOrderId queryParams.workOrderId = workOrderId ?? undefined // workOrderId
queryParams.workstationId = undefined queryParams.workstationId = undefined
queryParams.statuses = props.statuses // props
queryParams.pageNo = 1 queryParams.pageNo = 1
// //
selectedRows.value = [] selectedRows.value = []

View File

@ -88,6 +88,7 @@
<ProTaskSelect <ProTaskSelect
v-model="formData.taskId" v-model="formData.taskId"
:workOrderId="formData.workOrderId" :workOrderId="formData.workOrderId"
:statuses="[MesProTaskStatusEnum.NORMAL, MesProTaskStatusEnum.START, MesProTaskStatusEnum.PAUSE]"
placeholder="请选择生产任务" placeholder="请选择生产任务"
class="!w-1/1" class="!w-1/1"
:disabled="isFromPendingTask || (!isFromPendingTask && !formData.workOrderId)" :disabled="isFromPendingTask || (!isFromPendingTask && !formData.workOrderId)"
@ -301,6 +302,7 @@ import {
MesQcTypeEnum, MesQcTypeEnum,
MesQcStatusEnum, MesQcStatusEnum,
MesAutoCodeRuleCode, MesAutoCodeRuleCode,
MesProTaskStatusEnum,
MesProWorkOrderStatusEnum MesProWorkOrderStatusEnum
} from '@/views/mes/utils/constants' } from '@/views/mes/utils/constants'

View File

@ -96,6 +96,12 @@ export const MesProTaskStatusEnum = {
CANCELED: 4 // 已取消 CANCELED: 4 // 已取消
} }
/** MES 点检保养项目类型枚举(对应字典 mes_dv_subject_type */
export const MesDvSubjectTypeEnum = {
CHECK: 1, // 点检
MAINTENANCE: 2 // 保养
}
/** MES 点检保养方案状态枚举 */ /** MES 点检保养方案状态枚举 */
export const MesDvCheckPlanStatusEnum = { export const MesDvCheckPlanStatusEnum = {
PREPARE: 0, // 草稿 PREPARE: 0, // 草稿

View File

@ -11,6 +11,14 @@
<template> <template>
<Dialog title="装箱单选择" v-model="dialogVisible" width="80%"> <Dialog title="装箱单选择" v-model="dialogVisible" width="80%">
<ContentWrap> <ContentWrap>
<el-alert
v-if="childableOnly"
title="仅展示可作为子箱的装箱单(无父箱 + 已完成)"
type="info"
:closable="false"
show-icon
class="!mb-10px"
/>
<el-form :inline="true" :model="queryParams" label-width="100px"> <el-form :inline="true" :model="queryParams" label-width="100px">
<el-form-item label="装箱单编号"> <el-form-item label="装箱单编号">
<el-input <el-input

View File

@ -12,6 +12,14 @@
<template> <template>
<Dialog title="发货通知单选择" v-model="dialogVisible" width="70%"> <Dialog title="发货通知单选择" v-model="dialogVisible" width="70%">
<ContentWrap> <ContentWrap>
<el-alert
v-if="status != null"
:title="`仅展示状态为【${getDictLabel(DICT_TYPE.MES_WM_SALES_NOTICE_STATUS, status)}】的发货通知单`"
type="info"
:closable="false"
show-icon
class="!mb-10px"
/>
<el-form :inline="true" :model="queryParams" label-width="100px"> <el-form :inline="true" :model="queryParams" label-width="100px">
<el-form-item label="通知单编号"> <el-form-item label="通知单编号">
<el-input <el-input
@ -134,7 +142,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { DICT_TYPE, getIntDictOptions, getDictLabel } from '@/utils/dict'
import { formatDate } from '@/utils/formatTime' import { formatDate } from '@/utils/formatTime'
import { WmSalesNoticeApi, WmSalesNoticeVO } from '@/api/mes/wm/salesnotice' import { WmSalesNoticeApi, WmSalesNoticeVO } from '@/api/mes/wm/salesnotice'
import MdClientSelect from '@/views/mes/md/client/components/MdClientSelect.vue' import MdClientSelect from '@/views/mes/md/client/components/MdClientSelect.vue'