feat(mes): 添加过程检验单编码,更新工作站校验方法返回类型

pull/871/MERGE
YunaiV 2026-03-24 22:38:28 +08:00
parent cbf173b75b
commit d79d6084c3
3 changed files with 82 additions and 60 deletions

View File

@ -13,8 +13,13 @@
<el-row :gutter="16"> <el-row :gutter="16">
<el-col :span="8"> <el-col :span="8">
<el-form-item label="检验单编号" prop="code"> <el-form-item label="检验单编号" prop="code">
<!-- TODO @芋艿自动编码未迁移暂用手动输入 --> <el-input v-model="formData.code" placeholder="请输入检验单编号">
<el-input v-model="formData.code" placeholder="请输入检验单编号" /> <template #append>
<el-button @click="generateCode" :disabled="formType === 'update'">
生成
</el-button>
</template>
</el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
@ -109,6 +114,7 @@
:precision="2" :precision="2"
placeholder="请输入工废数量" placeholder="请输入工废数量"
class="!w-1/1" class="!w-1/1"
@change="handleScrapChanged"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -120,6 +126,7 @@
:precision="2" :precision="2"
placeholder="请输入料废数量" placeholder="请输入料废数量"
class="!w-1/1" class="!w-1/1"
@change="handleScrapChanged"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -131,6 +138,7 @@
:precision="2" :precision="2"
placeholder="请输入其他废品数量" placeholder="请输入其他废品数量"
class="!w-1/1" class="!w-1/1"
@change="handleScrapChanged"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -149,8 +157,8 @@
<el-form-item label="检测日期" prop="inspectDate"> <el-form-item label="检测日期" prop="inspectDate">
<el-date-picker <el-date-picker
v-model="formData.inspectDate" v-model="formData.inspectDate"
type="datetime" type="date"
value-format="YYYY-MM-DD HH:mm:ss" value-format="x"
placeholder="请选择检测日期" placeholder="请选择检测日期"
class="!w-1/1" class="!w-1/1"
/> />
@ -175,7 +183,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="16"> <el-row :gutter="16">
<el-col :span="16"> <el-col :span="24">
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input type="textarea" v-model="formData.remark" placeholder="请输入备注" /> <el-input type="textarea" v-model="formData.remark" placeholder="请输入备注" />
</el-form-item> </el-form-item>
@ -183,47 +191,45 @@
</el-row> </el-row>
<!-- 缺陷统计只读 --> <!-- 缺陷统计只读 -->
<template v-if="formType === 'update' && formData.id"> <el-divider>缺陷情况</el-divider>
<el-divider>缺陷情况</el-divider> <el-row :gutter="16">
<el-row :gutter="16"> <el-col :span="8">
<el-col :span="8"> <el-form-item label="致命缺陷数">
<el-form-item label="致命缺陷数"> <el-input :model-value="formData.criticalQuantity" disabled />
<el-input :model-value="formData.criticalQuantity" disabled /> </el-form-item>
</el-form-item> </el-col>
</el-col> <el-col :span="8">
<el-col :span="8"> <el-form-item label="严重缺陷数">
<el-form-item label="严重缺陷数"> <el-input :model-value="formData.majorQuantity" disabled />
<el-input :model-value="formData.majorQuantity" disabled /> </el-form-item>
</el-form-item> </el-col>
</el-col> <el-col :span="8">
<el-col :span="8"> <el-form-item label="轻微缺陷数">
<el-form-item label="轻微缺陷数"> <el-input :model-value="formData.minorQuantity" disabled />
<el-input :model-value="formData.minorQuantity" disabled /> </el-form-item>
</el-form-item> </el-col>
</el-col> </el-row>
</el-row> <el-row :gutter="16">
<el-row :gutter="16"> <el-col :span="8">
<el-col :span="8"> <el-form-item label="致命缺陷率">
<el-form-item label="致命缺陷率"> <el-input :model-value="formData.criticalRate + '%'" disabled />
<el-input :model-value="formData.criticalRate + '%'" disabled /> </el-form-item>
</el-form-item> </el-col>
</el-col> <el-col :span="8">
<el-col :span="8"> <el-form-item label="严重缺陷率">
<el-form-item label="严重缺陷率"> <el-input :model-value="formData.majorRate + '%'" disabled />
<el-input :model-value="formData.majorRate + '%'" disabled /> </el-form-item>
</el-form-item> </el-col>
</el-col> <el-col :span="8">
<el-col :span="8"> <el-form-item label="轻微缺陷率">
<el-form-item label="轻微缺陷率"> <el-input :model-value="formData.minorRate + '%'" disabled />
<el-input :model-value="formData.minorRate + '%'" disabled /> </el-form-item>
</el-form-item> </el-col>
</el-col> </el-row>
</el-row>
</template>
</el-form> </el-form>
<!-- 子表标签页编辑/详情模式下显示 --> <!-- 子表标签页编辑/详情模式下显示 -->
<template v-if="(formType === 'update' || formType === 'detail') && formData.id"> <template v-if="formType === 'update' && formData.id">
<el-divider /> <el-divider />
<el-tabs v-model="activeTab"> <el-tabs v-model="activeTab">
<el-tab-pane label="检验项" name="line"> <el-tab-pane label="检验项" name="line">
@ -246,6 +252,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { AutoCodeRecordApi } from '@/api/mes/md/autocode/record'
import { QcIpqcApi, QcIpqcVO } from '@/api/mes/qc/ipqc' import { QcIpqcApi, QcIpqcVO } from '@/api/mes/qc/ipqc'
import ProWorkOrderSelect from '@/views/mes/pro/workorder/components/ProWorkOrderSelect.vue' import ProWorkOrderSelect from '@/views/mes/pro/workorder/components/ProWorkOrderSelect.vue'
import MdWorkstationSelect from '@/views/mes/md/workstation/components/MdWorkstationSelect.vue' import MdWorkstationSelect from '@/views/mes/md/workstation/components/MdWorkstationSelect.vue'
@ -253,17 +260,17 @@ import ProTaskSelect from '@/views/mes/pro/task/components/ProTaskSelect.vue'
import UserSelect from '@/views/system/user/components/UserSelect.vue' import UserSelect from '@/views/system/user/components/UserSelect.vue'
import IpqcLineList from './IpqcLineList.vue' import IpqcLineList from './IpqcLineList.vue'
import QcIndicatorResultList from '@/views/mes/qc/indicatorresult/components/QcIndicatorResultList.vue' import QcIndicatorResultList from '@/views/mes/qc/indicatorresult/components/QcIndicatorResultList.vue'
import { MesQcTypeEnum } from '@/views/mes/utils/constants' import { MesQcTypeEnum, MesAutoCodeRuleCode } from '@/views/mes/utils/constants'
defineOptions({ name: 'IpqcForm' }) defineOptions({ name: 'IpqcForm' })
const { t } = useI18n() const { t } = useI18n() //
const message = useMessage() const message = useMessage() //
const dialogVisible = ref(false) const dialogVisible = ref(false) //
const formLoading = ref(false) const formLoading = ref(false) // 12
const formType = ref('') const formType = ref('') // create - update - detail -
const activeTab = ref('line') const activeTab = ref('line') //
const dialogTitle = computed(() => { const dialogTitle = computed(() => {
const titles = { const titles = {
create: '新增过程检验单', create: '新增过程检验单',
@ -271,8 +278,8 @@ const dialogTitle = computed(() => {
detail: '查看过程检验单' detail: '查看过程检验单'
} }
return titles[formType.value] || t('action.' + formType.value) return titles[formType.value] || t('action.' + formType.value)
}) }) // formType
const isDetail = computed(() => formType.value === 'detail') const isDetail = computed(() => formType.value === 'detail') //
const formData = ref({ const formData = ref({
id: undefined as number | undefined, id: undefined as number | undefined,
@ -321,7 +328,20 @@ const formRules = reactive({
inspectorUserId: [{ required: true, message: '检测人员不能为空', trigger: 'change' }], inspectorUserId: [{ required: true, message: '检测人员不能为空', trigger: 'change' }],
inspectDate: [{ required: true, message: '检测日期不能为空', trigger: 'change' }] inspectDate: [{ required: true, message: '检测日期不能为空', trigger: 'change' }]
}) })
const formRef = ref() const formRef = ref() // Ref
/** 生成检验单编号 */
const generateCode = async () => {
formData.value.code = await AutoCodeRecordApi.generateAutoCode(MesAutoCodeRuleCode.QC_IPQC_CODE)
}
/** 废品明细变更:自动计算不合格品数量 = 工废 + 料废 + 其他 */
const handleScrapChanged = () => {
formData.value.unqualifiedQuantity =
(formData.value.laborScrapQuantity || 0) +
(formData.value.materialScrapQuantity || 0) +
(formData.value.otherScrapQuantity || 0)
}
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (type: string, id?: number) => { const open = async (type: string, id?: number) => {
@ -339,14 +359,16 @@ const open = async (type: string, id?: number) => {
} }
} }
} }
defineExpose({ open }) defineExpose({ open }) // open
/** 提交表单 */ /** 提交表单 */
const emit = defineEmits(['success']) const emit = defineEmits(['success']) // success
const submitForm = async () => { const submitForm = async () => {
//
if (!formRef) return if (!formRef) return
const valid = await formRef.value.validate() const valid = await formRef.value.validate()
if (!valid) return if (!valid) return
//
formLoading.value = true formLoading.value = true
try { try {
const data = formData.value as unknown as QcIpqcVO const data = formData.value as unknown as QcIpqcVO
@ -358,6 +380,7 @@ const submitForm = async () => {
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
} }
dialogVisible.value = false dialogVisible.value = false
//
emit('success') emit('success')
} finally { } finally {
formLoading.value = false formLoading.value = false

View File

@ -323,15 +323,13 @@ const submitForm = async () => {
try { try {
const data = formData.value as unknown as QcIqcVO const data = formData.value as unknown as QcIqcVO
if (formType.value === 'create') { if (formType.value === 'create') {
const res = await QcIqcApi.createIqc(data) await QcIqcApi.createIqc(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))
// id
formData.value.id = res
formType.value = 'update'
} else { } else {
await QcIqcApi.updateIqc(data) await QcIqcApi.updateIqc(data)
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
} }
dialogVisible.value = false
// //
emit('success') emit('success')
} finally { } finally {

View File

@ -389,7 +389,8 @@ export const MesAutoCodeRuleCode = {
PACKAGE_CODE: 'WM_PACKAGE_CODE', // 装箱单编码 PACKAGE_CODE: 'WM_PACKAGE_CODE', // 装箱单编码
BATCH_CODE: 'WM_BATCH_CODE', // 批次编码 BATCH_CODE: 'WM_BATCH_CODE', // 批次编码
TASK_CODE: 'PRO_TASK_CODE', // 生产任务编码 TASK_CODE: 'PRO_TASK_CODE', // 生产任务编码
QC_IQC_CODE: 'QC_IQC_CODE' // 来料检验单编码 QC_IQC_CODE: 'QC_IQC_CODE', // 来料检验单编码
QC_IPQC_CODE: 'QC_IPQC_CODE' // 过程检验单编码
} as const } as const
/** 获取物料/产品标识的标签 */ /** 获取物料/产品标识的标签 */