feat(mes): 新增待检任务列表页 + IqcForm 支持预填

- 新增 pendinginspect/index.vue 待检任务列表页
- 新增 api/mes/qc/pendinginspect/index.ts API 定义
- 搜索栏:来源单据编号、产品物料(MdItemSelect)、检验类型
- 表格列:来源单据编号、检验类型/名称、物料编码/名称、规格型号、待检数量、单位
- IQC 行显示"创建检验单"按钮,打开 IqcForm 并预填来源数据
- IqcForm.vue: open() 增加 prefillData 参数,isFromPendingTask 控制来源字段只读
- 新增菜单 SQL(mes_qc_pending_inspect.sql)
- 新增待检任务测试数据(mes_wm_arrival_notice.sql id=100~102)
pull/871/MERGE
YunaiV 2026-02-23 15:55:57 +08:00
parent 3b52a8a2ad
commit f2dd52706b
3 changed files with 208 additions and 3 deletions

View File

@ -0,0 +1,28 @@
import request from '@/config/axios'
// MES 待检任务 VO
export interface QcPendingInspectVO {
sourceDocId: number
sourceDocType: number
sourceDocCode: string
sourceLineId: number
qcType: number
qcTypeName: string
itemId: number
itemCode: string
itemName: string
specification: string
unitName: string
quantityToCheck: number
vendorId: number
vendorName: string
recordTime: string
}
// MES 待检任务 API
export const QcPendingInspectApi = {
// 查询待检任务分页
getPendingInspectPage: async (params: any) => {
return await request.get({ url: '/mes/qc/pending-inspect/page', params })
}
}

View File

@ -37,12 +37,22 @@
<el-row :gutter="16">
<el-col :span="8">
<el-form-item label="产品物料" prop="itemId">
<MdItemSelect v-model="formData.itemId" placeholder="请选择产品物料" class="!w-1/1" />
<MdItemSelect
v-model="formData.itemId"
placeholder="请选择产品物料"
class="!w-1/1"
:disabled="isFromPendingTask"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="供应商" prop="vendorId">
<MdVendorSelect v-model="formData.vendorId" placeholder="请选择供应商" class="!w-1/1" />
<MdVendorSelect
v-model="formData.vendorId"
placeholder="请选择供应商"
class="!w-1/1"
:disabled="isFromPendingTask"
/>
</el-form-item>
</el-col>
<el-col :span="8">
@ -62,6 +72,7 @@
:precision="2"
placeholder="请输入"
class="!w-1/1"
:disabled="isFromPendingTask"
/>
</el-form-item>
</el-col>
@ -95,6 +106,7 @@
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择来料日期"
class="!w-1/1"
:disabled="isFromPendingTask"
/>
</el-form-item>
</el-col>
@ -228,6 +240,11 @@ const formLoading = ref(false) // 表单的加载中1修改时的数据加
const formType = ref('') // create - update -
const activeTab = ref('line') //
/** 是否来自待检任务(有预填的来源单据信息) */
const isFromPendingTask = computed(
() => formType.value === 'create' && formData.value.sourceDocId != null
)
const formData = ref({
id: undefined as number | undefined,
code: undefined,
@ -274,7 +291,8 @@ const generateCode = () => {
}
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
// TODO @AIPartial data
const open = async (type: string, id?: number, prefillData?: Partial<QcIqcVO>) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
@ -288,6 +306,9 @@ const open = async (type: string, id?: number) => {
} finally {
formLoading.value = false
}
} else if (prefillData) {
// pending inspect
Object.assign(formData.value, prefillData)
}
}
defineExpose({ open }) // open

View File

@ -0,0 +1,156 @@
<!-- MES 待检任务列表 -->
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="100px"
>
<el-form-item label="来源单据编号" prop="sourceDocCode">
<el-input
v-model="queryParams.sourceDocCode"
placeholder="请输入来源单据编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="产品物料" prop="itemId">
<MdItemSelect
v-model="queryParams.itemId"
placeholder="请选择产品物料"
clearable
class="!w-240px"
/>
</el-form-item>
<el-form-item label="检验类型" prop="qcType">
<el-select
v-model="queryParams.qcType"
placeholder="请选择检验类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.MES_QC_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<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>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="来源单据编号" align="center" prop="sourceDocCode" width="160" />
<el-table-column label="检验类型" align="center" prop="qcType" width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_QC_TYPE" :value="scope.row.qcType" />
</template>
</el-table-column>
<el-table-column label="检验类型名称" align="center" prop="qcTypeName" width="120" />
<el-table-column label="物料编码" align="center" prop="itemCode" width="130" />
<el-table-column label="物料名称" align="center" prop="itemName" min-width="150" />
<el-table-column label="规格型号" align="center" prop="specification" width="130" />
<el-table-column label="待检数量" align="center" prop="quantityToCheck" width="100" />
<el-table-column label="单位" align="center" prop="unitName" width="80" />
<el-table-column label="操作" align="center" fixed="right" width="130">
<template #default="scope">
<el-button
link
type="primary"
@click="handleCreateIqc(scope.row)"
v-if="scope.row.qcType === MesQcTypeEnum.IQC"
v-hasPermi="['mes:qc-iqc:create']"
>
创建检验单
</el-button>
</template>
</el-table-column>
</el-table>
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- IQC 表单弹窗 -->
<IqcForm ref="iqcFormRef" @success="getList" />
</template>
<script setup lang="ts">
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { QcPendingInspectApi, QcPendingInspectVO } from '@/api/mes/qc/pendinginspect'
import { MesQcTypeEnum } from '@/views/mes/utils/constants'
import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
import IqcForm from '@/views/mes/qc/iqc/IqcForm.vue'
defineOptions({ name: 'MesQcPendingInspect' })
const loading = ref(true) //
const total = ref(0) //
const list = ref<QcPendingInspectVO[]>([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
sourceDocCode: undefined,
qcType: undefined,
itemId: undefined
})
const queryFormRef = ref() //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await QcPendingInspectApi.getPendingInspectPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 创建 IQC 检验单 */
const iqcFormRef = ref()
const handleCreateIqc = (row: QcPendingInspectVO) => {
iqcFormRef.value.open('create', undefined, {
sourceDocId: row.sourceDocId,
sourceDocType: row.sourceDocType,
sourceLineId: row.sourceLineId,
vendorId: row.vendorId,
itemId: row.itemId,
receivedQuantity: row.quantityToCheck,
receiveDate: row.recordTime,
name: row.sourceDocCode + ' 来料检验单'
})
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>