refactor(mes): IQC 模块重构 - Service 拆分 + 字段清理 + 业务逻辑优化
1. 拆分 MesQcTemplateService → MesQcTemplateDetailService - 检测指标项、产品关联 CRUD 迁移至 DetailService - 新增 getRequiredTemplateByItemIdAndType 方法 2. MesQcIqcSaveReqVO 字段清理 - 删除 templateId/minCheckQuantity/maxUnqualifiedQuantity/checkQuantity/inspectorUserId - 增加 qualifiedQuantity/unqualifiedQuantity @NotNull + @DecimalMin 校验 - 增加 receiveDate/inspectDate @NotNull 校验 3. MesQcIqcServiceImpl 业务逻辑调整 - createIqc/updateIqc 增加 inspectorUserId 参数,由 Controller 传入 getLoginUserId() - templateId 不再由前端传递,后端根据 itemId + IQC 类型自动查找模板 - checkQuantity 由后端计算(= qualifiedQuantity + unqualifiedQuantity) - updateIqc 禁止修改 sourceDocType/sourceDocId/sourceLineId/templateId 4. MesQcIqcDO/RespVO 删除 minCheckQuantity、maxUnqualifiedQuantity 字段 5. 更新调用方:IndicatorController、ItemController、IQC/OQC/IPQC ServiceImplpull/871/MERGE
parent
f2dd52706b
commit
7ea96e1c2e
|
|
@ -17,8 +17,6 @@ export interface QcIqcVO {
|
||||||
itemName: string // 产品物料名称(关联查询)
|
itemName: string // 产品物料名称(关联查询)
|
||||||
itemSpecification: string // 规格型号(关联查询)
|
itemSpecification: string // 规格型号(关联查询)
|
||||||
unitName: string // 单位名称(关联查询)
|
unitName: string // 单位名称(关联查询)
|
||||||
minCheckQuantity: number // 最低检测数
|
|
||||||
maxUnqualifiedQuantity: number // 最大不合格数
|
|
||||||
receivedQuantity: number // 本次接收数量
|
receivedQuantity: number // 本次接收数量
|
||||||
checkQuantity: number // 本次检测数量
|
checkQuantity: number // 本次检测数量
|
||||||
qualifiedQuantity: number // 合格品数量
|
qualifiedQuantity: number // 合格品数量
|
||||||
|
|
|
||||||
|
|
@ -26,11 +26,6 @@
|
||||||
<el-input v-model="formData.name" placeholder="请输入检验单名称" />
|
<el-input v-model="formData.name" placeholder="请输入检验单名称" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
|
||||||
<el-form-item label="质检方案" prop="templateId">
|
|
||||||
<QcTemplateSelect v-model="formData.templateId" class="!w-1/1" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-divider content-position="left">物料与供应商</el-divider>
|
<el-divider content-position="left">物料与供应商</el-divider>
|
||||||
|
|
@ -65,12 +60,12 @@
|
||||||
<el-divider content-position="left">检测情况</el-divider>
|
<el-divider content-position="left">检测情况</el-divider>
|
||||||
<el-row :gutter="16">
|
<el-row :gutter="16">
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="接收数量" prop="receivedQuantity">
|
<el-form-item label="本次接收数量" prop="receivedQuantity">
|
||||||
<el-input-number
|
<el-input-number
|
||||||
v-model="formData.receivedQuantity"
|
v-model="formData.receivedQuantity"
|
||||||
:min="0"
|
:min="0"
|
||||||
:precision="2"
|
:precision="2"
|
||||||
placeholder="请输入"
|
placeholder="请输入本次接收数量"
|
||||||
class="!w-1/1"
|
class="!w-1/1"
|
||||||
:disabled="isFromPendingTask"
|
:disabled="isFromPendingTask"
|
||||||
/>
|
/>
|
||||||
|
|
@ -121,16 +116,6 @@
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<!-- TODO 【暂时不要删除】@芋艿:应该不用填写 -->
|
|
||||||
<el-col :span="8">
|
|
||||||
<el-form-item label="检测人员" prop="inspectorUserId">
|
|
||||||
<UserSelect
|
|
||||||
v-model="formData.inspectorUserId"
|
|
||||||
placeholder="请选择检测人员"
|
|
||||||
class="!w-1/1"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row :gutter="16">
|
<el-row :gutter="16">
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
|
|
@ -223,8 +208,6 @@ import { generateRandomStr } from '@/utils'
|
||||||
import { QcIqcApi, QcIqcVO } from '@/api/mes/qc/iqc'
|
import { QcIqcApi, QcIqcVO } from '@/api/mes/qc/iqc'
|
||||||
import MdVendorSelect from '@/views/mes/md/vendor/components/MdVendorSelect.vue'
|
import MdVendorSelect from '@/views/mes/md/vendor/components/MdVendorSelect.vue'
|
||||||
import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
|
import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
|
||||||
import UserSelect from '@/views/system/user/components/UserSelect.vue'
|
|
||||||
import QcTemplateSelect from '@/views/mes/qc/template/components/QcTemplateSelect.vue'
|
|
||||||
import IqcLineList from './IqcLineList.vue'
|
import IqcLineList from './IqcLineList.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 } from '@/views/mes/utils/constants'
|
||||||
|
|
@ -249,23 +232,18 @@ const formData = ref({
|
||||||
id: undefined as number | undefined,
|
id: undefined as number | undefined,
|
||||||
code: undefined,
|
code: undefined,
|
||||||
name: undefined,
|
name: undefined,
|
||||||
templateId: undefined,
|
|
||||||
sourceDocId: undefined,
|
sourceDocId: undefined,
|
||||||
sourceDocType: undefined,
|
sourceDocType: undefined,
|
||||||
sourceLineId: undefined,
|
sourceLineId: undefined,
|
||||||
vendorId: undefined,
|
vendorId: undefined,
|
||||||
vendorBatch: undefined,
|
vendorBatch: undefined,
|
||||||
itemId: undefined,
|
itemId: undefined,
|
||||||
minCheckQuantity: undefined,
|
|
||||||
maxUnqualifiedQuantity: undefined,
|
|
||||||
receivedQuantity: undefined,
|
receivedQuantity: undefined,
|
||||||
checkQuantity: undefined,
|
|
||||||
qualifiedQuantity: undefined,
|
qualifiedQuantity: undefined,
|
||||||
unqualifiedQuantity: undefined,
|
unqualifiedQuantity: undefined,
|
||||||
checkResult: undefined,
|
checkResult: undefined,
|
||||||
receiveDate: undefined,
|
receiveDate: undefined,
|
||||||
inspectDate: undefined,
|
inspectDate: undefined,
|
||||||
inspectorUserId: undefined,
|
|
||||||
remark: undefined,
|
remark: undefined,
|
||||||
// 缺陷统计(只读)
|
// 缺陷统计(只读)
|
||||||
criticalRate: 0,
|
criticalRate: 0,
|
||||||
|
|
@ -278,10 +256,13 @@ const formData = ref({
|
||||||
const formRules = reactive({
|
const formRules = reactive({
|
||||||
code: [{ required: true, message: '检验单编号不能为空', trigger: 'blur' }],
|
code: [{ required: true, message: '检验单编号不能为空', trigger: 'blur' }],
|
||||||
name: [{ required: true, message: '检验单名称不能为空', trigger: 'blur' }],
|
name: [{ required: true, message: '检验单名称不能为空', trigger: 'blur' }],
|
||||||
templateId: [{ required: true, message: '检验模板不能为空', trigger: 'change' }],
|
|
||||||
vendorId: [{ required: true, message: '供应商不能为空', trigger: 'change' }],
|
vendorId: [{ required: true, message: '供应商不能为空', trigger: 'change' }],
|
||||||
itemId: [{ required: true, message: '产品物料不能为空', trigger: 'change' }],
|
itemId: [{ required: true, message: '产品物料不能为空', trigger: 'change' }],
|
||||||
receivedQuantity: [{ required: true, message: '接收数量不能为空', trigger: 'blur' }]
|
receivedQuantity: [{ required: true, message: '本次接收数量不能为空', trigger: 'blur' }],
|
||||||
|
qualifiedQuantity: [{ required: true, message: '合格品数量不能为空', trigger: 'blur' }],
|
||||||
|
unqualifiedQuantity: [{ required: true, message: '不合格品数量不能为空', trigger: 'blur' }],
|
||||||
|
receiveDate: [{ required: true, message: '来料日期不能为空', trigger: 'change' }],
|
||||||
|
inspectDate: [{ required: true, message: '检测日期不能为空', trigger: 'change' }]
|
||||||
})
|
})
|
||||||
const formRef = ref() // 表单 Ref
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
|
@ -291,8 +272,7 @@ const generateCode = () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 打开弹窗 */
|
/** 打开弹窗 */
|
||||||
// TODO @AI:Partial 是不是可以不用?变量是不是可以叫 data;
|
const open = async (type: string, id?: number, data?: QcIqcVO) => {
|
||||||
const open = async (type: string, id?: number, prefillData?: Partial<QcIqcVO>) => {
|
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
dialogTitle.value = t('action.' + type)
|
dialogTitle.value = t('action.' + type)
|
||||||
formType.value = type
|
formType.value = type
|
||||||
|
|
@ -306,9 +286,9 @@ const open = async (type: string, id?: number, prefillData?: Partial<QcIqcVO>) =
|
||||||
} finally {
|
} finally {
|
||||||
formLoading.value = false
|
formLoading.value = false
|
||||||
}
|
}
|
||||||
} else if (prefillData) {
|
} else if (data) {
|
||||||
// 预填模式:来自待检任务(pending inspect)
|
// 预填模式:来自待检任务(pending inspect)
|
||||||
Object.assign(formData.value, prefillData)
|
Object.assign(formData.value, data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
@ -345,24 +325,18 @@ const resetForm = () => {
|
||||||
id: undefined,
|
id: undefined,
|
||||||
code: undefined,
|
code: undefined,
|
||||||
name: undefined,
|
name: undefined,
|
||||||
templateId: undefined,
|
|
||||||
sourceDocId: undefined,
|
sourceDocId: undefined,
|
||||||
sourceDocType: undefined,
|
sourceDocType: undefined,
|
||||||
sourceDocCode: undefined,
|
|
||||||
sourceLineId: undefined,
|
sourceLineId: undefined,
|
||||||
vendorId: undefined,
|
vendorId: undefined,
|
||||||
vendorBatch: undefined,
|
vendorBatch: undefined,
|
||||||
itemId: undefined,
|
itemId: undefined,
|
||||||
minCheckQuantity: undefined,
|
|
||||||
maxUnqualifiedQuantity: undefined,
|
|
||||||
receivedQuantity: undefined,
|
receivedQuantity: undefined,
|
||||||
checkQuantity: undefined,
|
|
||||||
qualifiedQuantity: undefined,
|
qualifiedQuantity: undefined,
|
||||||
unqualifiedQuantity: undefined,
|
unqualifiedQuantity: undefined,
|
||||||
checkResult: undefined,
|
checkResult: undefined,
|
||||||
receiveDate: undefined,
|
receiveDate: undefined,
|
||||||
inspectDate: undefined,
|
inspectDate: undefined,
|
||||||
inspectorUserId: undefined,
|
|
||||||
remark: undefined,
|
remark: undefined,
|
||||||
criticalRate: 0,
|
criticalRate: 0,
|
||||||
majorRate: 0,
|
majorRate: 0,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue