review(mes): 各种 qc 单的校验逻辑。

pull/871/MERGE
YunaiV 2026-02-24 17:10:58 +08:00
parent 81bee7693f
commit a013f965aa
11 changed files with 71 additions and 106 deletions

View File

@ -23,11 +23,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="检验类型" prop="type">
<el-select
v-model="formData.type"
placeholder="请选择检验类型"
class="!w-1/1"
>
<el-select v-model="formData.type" placeholder="请选择检验类型" class="!w-1/1">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.MES_IPQC_TYPE)"
:key="dict.value"
@ -61,11 +57,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="生产任务" prop="taskId">
<ProTaskSelect
v-model="formData.taskId"
placeholder="请选择生产任务"
class="!w-1/1"
/>
<ProTaskSelect v-model="formData.taskId" placeholder="请选择生产任务" class="!w-1/1" />
</el-form-item>
</el-col>
</el-row>
@ -163,10 +155,10 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检测结" prop="checkResult">
<el-form-item label="检测结" prop="checkResult">
<el-select
v-model="formData.checkResult"
placeholder="请选择检测结"
placeholder="请选择检测结"
clearable
class="!w-1/1"
>
@ -256,7 +248,7 @@
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { QcIpqcApi, QcIpqcVO } from '@/api/mes/qc/ipqc'
import ProWorkOrderSelect from '@/views/mes/pro/workorder/components/ProWorkOrderSelect.vue'
import MdWorkstationSelect from '@/views/mes/md/workstation/components/MdWorkstationSelect.vue'
@ -311,6 +303,7 @@ const formData = ref({
majorQuantity: 0,
minorQuantity: 0
})
// TODO @AI
const formRules = reactive({
code: [{ required: true, message: '检验单编号不能为空', trigger: 'blur' }],
name: [{ required: true, message: '检验单名称不能为空', trigger: 'blur' }],
@ -331,8 +324,7 @@ const open = async (type: string, id?: number) => {
if (id) {
formLoading.value = true
try {
const data = await QcIpqcApi.getIpqc(id)
formData.value = data
formData.value = await QcIpqcApi.getIpqc(id)
} finally {
formLoading.value = false
}

View File

@ -3,9 +3,8 @@
<div>
<!-- 列表 -->
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="检测指标编码" align="center" prop="indicatorCode" width="140" />
<el-table-column label="检测指标名称" align="center" prop="indicatorName" min-width="150" />
<el-table-column label="检测指标类型" align="center" prop="indicatorType" width="120">
<el-table-column label="检测项名称" align="center" prop="indicatorName" min-width="150" />
<el-table-column label="检测项类型" align="center" prop="indicatorType" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_INDICATOR_TYPE" :value="scope.row.indicatorType" />
</template>

View File

@ -41,6 +41,7 @@
class="!w-240px"
/>
</el-form-item>
<!-- TODO @AIworkstationId 前后端检索都去掉这个字段 -->
<el-form-item label="工位" prop="workstationId">
<MdWorkstationSelect
v-model="queryParams.workstationId"
@ -57,10 +58,10 @@
class="!w-240px"
/>
</el-form-item>
<el-form-item label="检测结" prop="checkResult">
<el-form-item label="检测结" prop="checkResult">
<el-select
v-model="queryParams.checkResult"
placeholder="请选择检测结"
placeholder="请选择检测结"
clearable
class="!w-240px"
>
@ -72,6 +73,7 @@
/>
</el-select>
</el-form-item>
<!-- TODO @AIinspectDate 前后端检索都去掉这个字段 -->
<el-form-item label="检测日期" prop="inspectDate">
<el-date-picker
v-model="queryParams.inspectDate"
@ -110,6 +112,7 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<!-- TODO @AI需要有超链接 -->
<el-table-column label="检验单编号" align="center" prop="code" width="160" />
<el-table-column label="检验单名称" align="center" prop="name" min-width="180" />
<el-table-column label="检验类型" align="center" prop="type" width="120">
@ -117,13 +120,13 @@
<dict-tag :type="DICT_TYPE.MES_IPQC_TYPE" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="工单编号" align="center" prop="workOrderCode" width="140" />
<el-table-column label="生产工单编号" align="center" prop="workOrderCode" width="140" />
<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="itemSpecification" width="130" />
<el-table-column label="单位" align="center" prop="unitName" width="80" />
<el-table-column label="检测数量" align="center" prop="checkQuantity" width="100" />
<el-table-column label="检测结" align="center" prop="checkResult" width="100">
<el-table-column label="检测结" align="center" prop="checkResult" width="110">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_QC_CHECK_RESULT" :value="scope.row.checkResult" />
</template>
@ -148,7 +151,7 @@
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:qc-ipqc:update']"
v-if="scope.row.status === MesQcIpqcStatusEnum.PREPARE"
v-if="scope.row.status === MesOrderStatusEnum.DRAFT"
>
编辑
</el-button>
@ -157,25 +160,16 @@
type="success"
@click="handleComplete(scope.row.id)"
v-hasPermi="['mes:qc-ipqc:update']"
v-if="scope.row.status === MesQcIpqcStatusEnum.PREPARE"
v-if="scope.row.status === MesOrderStatusEnum.DRAFT"
>
完成
</el-button>
<!-- TODO @芋艿查看报表后续要搞下 -->
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-if="scope.row.status !== MesQcIpqcStatusEnum.PREPARE"
>
查看报表
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:qc-ipqc:delete']"
v-if="scope.row.status === MesQcIpqcStatusEnum.PREPARE"
v-if="scope.row.status === MesOrderStatusEnum.DRAFT"
>
删除
</el-button>
@ -204,7 +198,7 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import ProWorkOrderSelect from '@/views/mes/pro/workorder/components/ProWorkOrderSelect.vue'
import MdWorkstationSelect from '@/views/mes/md/workstation/components/MdWorkstationSelect.vue'
import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
import { MesQcIpqcStatusEnum } from '@/views/mes/utils/constants'
import { MesOrderStatusEnum } from '@/views/mes/utils/constants'
defineOptions({ name: 'MesQcIpqc' })

View File

@ -118,10 +118,10 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检测结" prop="checkResult">
<el-form-item label="检测结" prop="checkResult">
<el-select
v-model="formData.checkResult"
placeholder="请选择检测结"
placeholder="请选择检测结"
clearable
class="!w-1/1"
>

View File

@ -43,10 +43,10 @@
class="!w-240px"
/>
</el-form-item>
<el-form-item label="检测结" prop="checkResult">
<el-form-item label="检测结" prop="checkResult">
<el-select
v-model="queryParams.checkResult"
placeholder="请选择检测结"
placeholder="请选择检测结"
clearable
class="!w-240px"
>
@ -130,7 +130,7 @@
<el-table-column label="接收数量" align="center" prop="receivedQuantity" width="100" />
<el-table-column label="检测数量" align="center" prop="checkQuantity" width="100" />
<el-table-column label="不合格数" align="center" prop="unqualifiedQuantity" width="100" />
<el-table-column label="检测结" align="center" prop="checkResult" width="100">
<el-table-column label="检测结" align="center" prop="checkResult" width="110">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_QC_CHECK_RESULT" :value="scope.row.checkResult" />
</template>
@ -175,15 +175,6 @@
>
完成
</el-button>
<!-- TODO 不要删除 @芋艿查看报表后续要搞下 -->
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-if="scope.row.status !== MesOrderStatusEnum.DRAFT"
>
查看报表
</el-button>
<el-button
link
type="danger"

View File

@ -26,6 +26,7 @@
<el-input v-model="formData.name" placeholder="请输入检验单名称" />
</el-form-item>
</el-col>
<!-- TODO @AI不用前端选择后端自己计算出来 -->
<el-col :span="8">
<el-form-item label="质检方案" prop="templateId">
<QcTemplateSelect v-model="formData.templateId" class="!w-1/1" />
@ -78,6 +79,7 @@
</el-row>
<el-row :gutter="16">
<el-col :span="8">
<!-- TODO @AI不需要 qualifiedQuantity 参数 -->
<el-form-item label="合格品数量" prop="qualifiedQuantity">
<el-input-number
v-model="formData.qualifiedQuantity"
@ -133,10 +135,10 @@
</el-row>
<el-row :gutter="16">
<el-col :span="8">
<el-form-item label="检测结" prop="checkResult">
<el-form-item label="检测结" prop="checkResult">
<el-select
v-model="formData.checkResult"
placeholder="请选择检测结"
placeholder="请选择检测结"
clearable
class="!w-1/1"
>
@ -157,7 +159,7 @@
</el-row>
<!-- 缺陷统计只读 -->
<template v-if="formType === 'update' && formData.id">
<template>
<el-divider content-position="left">缺陷情况</el-divider>
<el-row :gutter="16">
<el-col :span="8">
@ -270,6 +272,8 @@ const formData = ref({
majorQuantity: 0,
minorQuantity: 0
})
// TODO @AI
// TODO @AI
const formRules = reactive({
code: [{ required: true, message: '检验单编号不能为空', trigger: 'blur' }],
name: [{ required: true, message: '检验单名称不能为空', trigger: 'blur' }],

View File

@ -3,9 +3,8 @@
<div>
<!-- 列表 -->
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="检测指标编码" align="center" prop="indicatorCode" width="140" />
<el-table-column label="检测指标名称" align="center" prop="indicatorName" min-width="150" />
<el-table-column label="检测指标类型" align="center" prop="indicatorType" width="120">
<el-table-column label="检测项名称" align="center" prop="indicatorName" min-width="150" />
<el-table-column label="检测项类型" align="center" prop="indicatorType" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_INDICATOR_TYPE" :value="scope.row.indicatorType" />
</template>

View File

@ -43,10 +43,10 @@
class="!w-240px"
/>
</el-form-item>
<el-form-item label="检测结" prop="checkResult">
<el-form-item label="检测结" prop="checkResult">
<el-select
v-model="queryParams.checkResult"
placeholder="请选择检测结"
placeholder="请选择检测结"
clearable
class="!w-240px"
>
@ -58,6 +58,7 @@
/>
</el-select>
</el-form-item>
<!-- TODO @AI前后端去掉 outDateinspectDate 的校验逻辑 -->
<el-form-item label="发货日期" prop="outDate">
<el-date-picker
v-model="queryParams.outDate"
@ -115,22 +116,24 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="出货检验单编号" align="center" prop="code" width="160" />
<el-table-column label="出货检验单名称" align="center" prop="name" min-width="180" />
<el-table-column label="客户称" align="center" prop="clientNickname" width="120" />
<el-table-column label="检验单编号" align="center" prop="code" width="160" />
<el-table-column label="检验单名称" align="center" prop="name" min-width="180" />
<el-table-column label="客户称" align="center" prop="clientNickname" width="120" />
<el-table-column label="批次号" align="center" prop="batchCode" width="130" />
<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="itemName" min-width="150" />
<el-table-column label="单位" align="center" prop="itemName" min-width="150" />
<el-table-column label="发货数量" align="center" prop="outQuantity" width="100" />
<el-table-column label="检测数量" align="center" prop="checkQuantity" width="100" />
<el-table-column label="不合格数" align="center" prop="unqualifiedQuantity" width="100" />
<el-table-column label="检测结" align="center" prop="checkResult" width="100">
<el-table-column label="检测结" align="center" prop="checkResult" width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_QC_CHECK_RESULT" :value="scope.row.checkResult" />
</template>
</el-table-column>
<el-table-column
label="货日期"
label="货日期"
align="center"
prop="outDate"
:formatter="dateFormatter2"
@ -156,7 +159,7 @@
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:qc-oqc:update']"
v-if="scope.row.status === MesQcOqcStatusEnum.PREPARE"
v-if="scope.row.status === MesOrderStatusEnum.DRAFT"
>
编辑
</el-button>
@ -165,24 +168,16 @@
type="success"
@click="handleComplete(scope.row.id)"
v-hasPermi="['mes:qc-oqc:update']"
v-if="scope.row.status === MesQcOqcStatusEnum.PREPARE"
v-if="scope.row.status === MesOrderStatusEnum.DRAFT"
>
完成
</el-button>
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-if="scope.row.status !== MesQcOqcStatusEnum.PREPARE"
>
查看报表
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:qc-oqc:delete']"
v-if="scope.row.status === MesQcOqcStatusEnum.PREPARE"
v-if="scope.row.status === MesOrderStatusEnum.DRAFT"
>
删除
</el-button>
@ -211,7 +206,7 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import MdClientSelect from '@/views/mes/md/client/components/MdClientSelect.vue'
import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
import UserSelect from '@/views/system/user/components/UserSelect.vue'
import { MesQcOqcStatusEnum } from '@/views/mes/utils/constants'
import { MesOrderStatusEnum } from '@/views/mes/utils/constants'
defineOptions({ name: 'MesQcOqc' })

View File

@ -26,6 +26,7 @@
<el-input v-model="formData.name" placeholder="请输入检验单名称" />
</el-form-item>
</el-col>
<!-- TODO @AI不用前端选择后端自己计算出来 -->
<el-col :span="8">
<el-form-item label="质检方案" prop="templateId">
<QcTemplateSelect v-model="formData.templateId" class="!w-1/1" />
@ -36,6 +37,7 @@
<el-divider content-position="left">物料信息</el-divider>
<el-row :gutter="16">
<el-col :span="8">
<!-- TODO @AI应该有 3 个类型字典要加下生产退料检验委外退料检验销售退货检验 -->
<el-form-item label="检验类型" prop="rqcType">
<el-select
v-model="formData.rqcType"
@ -52,8 +54,8 @@
</el-select>
</el-form-item>
</el-col>
<!-- TODO @芋艿来源单据类型 -->
<!-- TODO @芋艿来源单据编号 -->
<!-- TODO @芋艿暂时不处理来源单据类型 -->
<!-- TODO @芋艿暂时不处理来源单据编号 -->
<el-col :span="8">
<el-form-item label="产品物料" prop="itemId">
<MdItemSelect v-model="formData.itemId" placeholder="请选择产品物料" class="!w-1/1" />
@ -114,7 +116,6 @@
/>
</el-form-item>
</el-col>
<!-- TODO @芋艿不要删除校验人员和审核人的区别 -->
<el-col :span="8">
<el-form-item label="检测人员" prop="inspectorUserId">
<UserSelect
@ -125,10 +126,10 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检测结" prop="checkResult">
<el-form-item label="检测结" prop="checkResult">
<el-select
v-model="formData.checkResult"
placeholder="请选择检测结"
placeholder="请选择检测结"
clearable
class="!w-1/1"
>
@ -213,6 +214,7 @@ const formData = ref({
inspectorUserId: undefined,
remark: undefined
})
// TODO @AI
const formRules = reactive({
code: [{ required: true, message: '检验单编号不能为空', trigger: 'blur' }],
name: [{ required: true, message: '检验单名称不能为空', trigger: 'blur' }],

View File

@ -3,9 +3,8 @@
<div>
<!-- 列表 -->
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="检测指标编码" align="center" prop="indicatorCode" width="140" />
<el-table-column label="检测指标名称" align="center" prop="indicatorName" min-width="150" />
<el-table-column label="检测指标类型" align="center" prop="indicatorType" width="120">
<el-table-column label="检测项名称" align="center" prop="indicatorName" min-width="150" />
<el-table-column label="检测项类型" align="center" prop="indicatorType" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_INDICATOR_TYPE" :value="scope.row.indicatorType" />
</template>

View File

@ -18,6 +18,7 @@
class="!w-240px"
/>
</el-form-item>
<!-- TODO @AI来源类型应该是个字典并且要按照 rqc 做下过滤 -->
<el-form-item label="来源单据类型" prop="sourceDocType">
<el-input
v-model="queryParams.sourceDocType"
@ -44,6 +45,8 @@
class="!w-240px"
/>
</el-form-item>
<!-- TODO @AI批次号 batchCode -->
<!-- TODO @AI不需要 rqcType 的检索去掉去掉前后端都去掉 -->
<el-form-item label="检验类型" prop="rqcType">
<el-select
v-model="queryParams.rqcType"
@ -59,10 +62,10 @@
/>
</el-select>
</el-form-item>
<el-form-item label="检测结" prop="checkResult">
<el-form-item label="检测结" prop="checkResult">
<el-select
v-model="queryParams.checkResult"
placeholder="请选择检测结"
placeholder="请选择检测结"
clearable
class="!w-240px"
>
@ -74,6 +77,7 @@
/>
</el-select>
</el-form-item>
<!-- TODO @AI去掉 inspectDate前后端都去掉 -->
<el-form-item label="检测日期" prop="inspectDate">
<el-date-picker
v-model="queryParams.inspectDate"
@ -120,8 +124,8 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="退货检验单编号" align="center" prop="code" width="160" />
<el-table-column label="退货检验单名称" align="center" prop="name" min-width="180" />
<el-table-column label="检验单编号" align="center" prop="code" width="160" />
<el-table-column label="检验单名称" align="center" prop="name" min-width="180" />
<el-table-column label="来源单据类型" align="center" prop="sourceDocType" width="120" />
<el-table-column label="来源单据编号" align="center" prop="sourceDocCode" width="140" />
<el-table-column label="产品物料编码" align="center" prop="itemCode" width="130" />
@ -129,12 +133,7 @@
<el-table-column label="规格型号" align="center" prop="itemSpecification" width="130" />
<el-table-column label="单位" align="center" prop="unitName" width="80" />
<el-table-column label="批次号" align="center" prop="batchCode" width="130" />
<el-table-column label="检验类型" align="center" prop="rqcType" width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_RQC_TYPE" :value="scope.row.rqcType" />
</template>
</el-table-column>
<el-table-column label="检测结论" align="center" prop="checkResult" width="100">
<el-table-column label="检测结果" align="center" prop="checkResult" width="110">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_QC_CHECK_RESULT" :value="scope.row.checkResult" />
</template>
@ -147,7 +146,7 @@
width="180px"
/>
<el-table-column label="检测人员" align="center" prop="inspectorNickname" width="100" />
<el-table-column label="单据状态" align="center" prop="status" width="80">
<el-table-column label="单据状态" align="center" prop="status" width="90">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ORDER_STATUS" :value="scope.row.status" />
</template>
@ -159,7 +158,7 @@
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:qc-rqc:update']"
v-if="scope.row.status === MesQcRqcStatusEnum.PREPARE"
v-if="scope.row.status === MesOrderStatusEnum.DRAFT"
>
编辑
</el-button>
@ -168,25 +167,16 @@
type="success"
@click="handleComplete(scope.row.id)"
v-hasPermi="['mes:qc-rqc:update']"
v-if="scope.row.status === MesQcRqcStatusEnum.PREPARE"
v-if="scope.row.status === MesOrderStatusEnum.DRAFT"
>
完成
</el-button>
<!-- TODO @芋艿这里怎么处理更好 -->
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-if="scope.row.status !== MesQcRqcStatusEnum.PREPARE"
>
查看报表
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:qc-rqc:delete']"
v-if="scope.row.status === MesQcRqcStatusEnum.PREPARE"
v-if="scope.row.status === MesOrderStatusEnum.DRAFT"
>
删除
</el-button>
@ -214,7 +204,7 @@ import RqcForm from './RqcForm.vue'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
import UserSelect from '@/views/system/user/components/UserSelect.vue'
import { MesQcRqcStatusEnum } from '@/views/mes/utils/constants'
import { MesOrderStatusEnum } from '@/views/mes/utils/constants'
defineOptions({ name: 'MesQcRqc' })