feat(mes): 重构缺陷记录相关类的包结构,更新缺陷等级字段类型为整数,优化缺陷记录内联编辑组件
parent
31cc9bd31e
commit
298ad41d5b
|
|
@ -6,7 +6,7 @@ export interface QcDefectVO {
|
|||
code: string // 缺陷编码
|
||||
name: string // 缺陷描述
|
||||
type: string // 检测项类型
|
||||
level: string // 缺陷等级
|
||||
level: number // 缺陷等级
|
||||
remark: string // 备注
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
class="!w-1/1"
|
||||
>
|
||||
<el-option
|
||||
v-for="dict in getStrDictOptions(DICT_TYPE.MES_DEFECT_LEVEL)"
|
||||
v-for="dict in getIntDictOptions(DICT_TYPE.MES_DEFECT_LEVEL)"
|
||||
:key="dict.value"
|
||||
:label="dict.label"
|
||||
:value="dict.value"
|
||||
|
|
@ -61,7 +61,7 @@
|
|||
</Dialog>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||
import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||
import { QcDefectApi, QcDefectVO } from '@/api/mes/qc/defect'
|
||||
import { generateRandomStr } from '@/utils'
|
||||
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@
|
|||
class="!w-240px"
|
||||
>
|
||||
<el-option
|
||||
v-for="dict in getStrDictOptions(DICT_TYPE.MES_DEFECT_LEVEL)"
|
||||
v-for="dict in getIntDictOptions(DICT_TYPE.MES_DEFECT_LEVEL)"
|
||||
:key="dict.value"
|
||||
:label="dict.label"
|
||||
:value="dict.value"
|
||||
|
|
@ -143,7 +143,7 @@ import { dateFormatter } from '@/utils/formatTime'
|
|||
import download from '@/utils/download'
|
||||
import { QcDefectApi, QcDefectVO } from '@/api/mes/qc/defect'
|
||||
import DefectForm from './DefectForm.vue'
|
||||
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
|
||||
import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
|
||||
|
||||
defineOptions({ name: 'MesQcDefect' })
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,231 @@
|
|||
<!-- 缺陷记录内联编辑列表(通用组件,供 IQC/IPQC/OQC/RQC 各模块复用) -->
|
||||
<template>
|
||||
<Dialog title="缺陷记录" v-model="dialogVisible" width="900px">
|
||||
<!-- 新增按钮 -->
|
||||
<el-row class="mb-10px">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['mes:qc-defect:create']"
|
||||
>
|
||||
<Icon icon="ep:plus" class="mr-5px" /> 新增缺陷
|
||||
</el-button>
|
||||
</el-row>
|
||||
|
||||
<!-- 内联编辑表格 -->
|
||||
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||
<el-table-column label="缺陷描述" align="center" min-width="200">
|
||||
<template #default="scope">
|
||||
<el-input
|
||||
v-if="scope.row.editing"
|
||||
v-model="scope.row.name"
|
||||
placeholder="请输入缺陷描述"
|
||||
/>
|
||||
<span v-else>{{ scope.row.name }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="缺陷等级" align="center" width="140">
|
||||
<template #default="scope">
|
||||
<el-select
|
||||
v-if="scope.row.editing"
|
||||
v-model="scope.row.level"
|
||||
placeholder="请选择"
|
||||
>
|
||||
<el-option
|
||||
v-for="dict in getIntDictOptions(DICT_TYPE.MES_DEFECT_LEVEL)"
|
||||
:key="dict.value"
|
||||
:label="dict.label"
|
||||
:value="dict.value"
|
||||
/>
|
||||
</el-select>
|
||||
<dict-tag v-else :type="DICT_TYPE.MES_DEFECT_LEVEL" :value="scope.row.level" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="缺陷数量" align="center" width="120">
|
||||
<template #default="scope">
|
||||
<el-input-number
|
||||
v-if="scope.row.editing"
|
||||
v-model="scope.row.quantity"
|
||||
:min="1"
|
||||
controls-position="right"
|
||||
class="!w-1/1"
|
||||
/>
|
||||
<span v-else>{{ scope.row.quantity }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="备注" align="center" min-width="150">
|
||||
<template #default="scope">
|
||||
<el-input
|
||||
v-if="scope.row.editing"
|
||||
v-model="scope.row.remark"
|
||||
placeholder="请输入备注"
|
||||
/>
|
||||
<span v-else>{{ scope.row.remark || '-' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" width="130" fixed="right">
|
||||
<template #default="scope">
|
||||
<template v-if="scope.row.editing">
|
||||
<el-button link type="success" @click="handleSave(scope.row)">保存</el-button>
|
||||
<el-button link type="info" @click="handleCancel(scope.row, scope.$index)">
|
||||
取消
|
||||
</el-button>
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-button
|
||||
link
|
||||
type="primary"
|
||||
@click="handleEdit(scope.row)"
|
||||
v-hasPermi="['mes:qc-defect:update']"
|
||||
>
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
link
|
||||
type="danger"
|
||||
@click="handleDelete(scope.row.id)"
|
||||
v-hasPermi="['mes:qc-defect:update']"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 分页 -->
|
||||
<Pagination
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNo"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
</Dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||
import { QcDefectRecordApi, QcDefectRecordVO } from '@/api/mes/qc/defect/record'
|
||||
|
||||
/** 缺陷记录内联编辑弹窗(通用组件,供 IQC/IPQC/OQC/RQC 各模块复用) */
|
||||
defineOptions({ name: 'DefectRecordInlineList' })
|
||||
|
||||
const emit = defineEmits(['refresh']) // 通知父组件刷新行统计
|
||||
|
||||
const message = useMessage()
|
||||
const { t } = useI18n()
|
||||
|
||||
const dialogVisible = ref(false)
|
||||
const loading = ref(false)
|
||||
const list = ref<any[]>([])
|
||||
const total = ref(0)
|
||||
|
||||
// 当前操作的参数(通过 open 方法传入)
|
||||
const qcType = ref<number>(0) // 检验类型:MesQcTypeEnum
|
||||
const qcId = ref<number>(0) // 检验单 ID
|
||||
const lineId = ref<number>(0) // 检验行 ID
|
||||
|
||||
const queryParams = reactive({
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
qcType: undefined as number | undefined,
|
||||
qcId: undefined as number | undefined,
|
||||
lineId: undefined as number | undefined
|
||||
})
|
||||
|
||||
/** 打开弹窗 */
|
||||
const open = async (type: number, id: number, line: number) => {
|
||||
qcType.value = type
|
||||
qcId.value = id
|
||||
lineId.value = line
|
||||
queryParams.pageNo = 1
|
||||
dialogVisible.value = true
|
||||
await getList()
|
||||
}
|
||||
defineExpose({ open })
|
||||
|
||||
/** 查询列表 */
|
||||
const getList = async () => {
|
||||
if (!qcId.value || !lineId.value) {
|
||||
return
|
||||
}
|
||||
queryParams.qcType = qcType.value
|
||||
queryParams.qcId = qcId.value
|
||||
queryParams.lineId = lineId.value
|
||||
loading.value = true
|
||||
try {
|
||||
const data = await QcDefectRecordApi.getDefectRecordPage(queryParams)
|
||||
list.value = data.list.map((item: QcDefectRecordVO) => ({ ...item, editing: false }))
|
||||
total.value = data.total
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/** 新增行 */
|
||||
const handleAdd = () => {
|
||||
list.value.unshift({
|
||||
id: undefined,
|
||||
qcType: qcType.value,
|
||||
qcId: qcId.value,
|
||||
lineId: lineId.value,
|
||||
name: '',
|
||||
level: undefined,
|
||||
quantity: 1,
|
||||
remark: '',
|
||||
editing: true,
|
||||
isNew: true
|
||||
})
|
||||
}
|
||||
|
||||
/** 编辑行 */
|
||||
const handleEdit = (row: any) => {
|
||||
row._backup = { ...row }
|
||||
row.editing = true
|
||||
}
|
||||
|
||||
/** 保存行 */
|
||||
const handleSave = async (row: any) => {
|
||||
// 校验必填
|
||||
if (!row.name) {
|
||||
message.warning('缺陷描述不能为空')
|
||||
return
|
||||
}
|
||||
if (!row.level) {
|
||||
message.warning('缺陷等级不能为空')
|
||||
return
|
||||
}
|
||||
try {
|
||||
if (row.isNew) {
|
||||
await QcDefectRecordApi.createDefectRecord(row)
|
||||
message.success(t('common.createSuccess'))
|
||||
} else {
|
||||
await QcDefectRecordApi.updateDefectRecord(row)
|
||||
message.success(t('common.updateSuccess'))
|
||||
}
|
||||
await getList()
|
||||
emit('refresh')
|
||||
} catch {}
|
||||
}
|
||||
|
||||
/** 取消编辑 */
|
||||
const handleCancel = (row: any, index: number) => {
|
||||
if (row.isNew) {
|
||||
list.value.splice(index, 1)
|
||||
} else {
|
||||
Object.assign(row, row._backup)
|
||||
row.editing = false
|
||||
}
|
||||
}
|
||||
|
||||
/** 删除行 */
|
||||
const handleDelete = async (id: number) => {
|
||||
try {
|
||||
await message.delConfirm()
|
||||
await QcDefectRecordApi.deleteDefectRecord(id)
|
||||
message.success(t('common.delSuccess'))
|
||||
await getList()
|
||||
emit('refresh')
|
||||
} catch {}
|
||||
}
|
||||
</script>
|
||||
|
|
@ -1,268 +0,0 @@
|
|||
<!-- MES 来料检验缺陷记录 子列表(CRUD) -->
|
||||
<template>
|
||||
<div>
|
||||
<!-- 操作栏 -->
|
||||
<!-- TODO @芋艿:说下 mes:qc-record 这个权限标识的情况 -->
|
||||
<el-row class="mb-10px">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
size="small"
|
||||
@click="openForm('create')"
|
||||
v-hasPermi="['mes:qc-record:create']"
|
||||
>
|
||||
<Icon icon="ep:plus" class="mr-5px" /> 新增缺陷记录
|
||||
</el-button>
|
||||
</el-row>
|
||||
|
||||
<!-- 列表 -->
|
||||
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||
<el-table-column label="缺陷描述" align="center" prop="name" min-width="200" />
|
||||
<el-table-column label="缺陷等级" align="center" prop="level" width="120">
|
||||
<template #default="scope">
|
||||
<dict-tag :type="DICT_TYPE.MES_DEFECT_LEVEL" :value="scope.row.level" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="缺陷数量" align="center" prop="quantity" width="100" />
|
||||
<el-table-column label="备注" align="center" prop="remark" min-width="150" />
|
||||
<el-table-column
|
||||
label="创建时间"
|
||||
align="center"
|
||||
prop="createTime"
|
||||
:formatter="dateFormatter"
|
||||
width="180px"
|
||||
/>
|
||||
<el-table-column label="操作" align="center" width="130" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
link
|
||||
type="primary"
|
||||
@click="openForm('update', scope.row.id)"
|
||||
v-hasPermi="['mes:qc-record:update']"
|
||||
>
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
link
|
||||
type="danger"
|
||||
@click="handleDelete(scope.row.id)"
|
||||
v-hasPermi="['mes:qc-record:update']"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 表单弹窗:添加/修改 -->
|
||||
<Dialog :title="dialogTitle" v-model="dialogVisible" width="600px">
|
||||
<el-form
|
||||
ref="formRef"
|
||||
:model="formData"
|
||||
:rules="formRules"
|
||||
label-width="100px"
|
||||
v-loading="formLoading"
|
||||
>
|
||||
<el-form-item label="检验行" prop="lineId">
|
||||
<el-select v-model="formData.lineId" placeholder="请选择检验行" filterable class="!w-1/1">
|
||||
<el-option
|
||||
v-for="line in lineList"
|
||||
:key="line.id"
|
||||
:label="
|
||||
line.indicatorName + (line.indicatorCode ? ' (' + line.indicatorCode + ')' : '')
|
||||
"
|
||||
:value="line.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="缺陷描述" prop="name">
|
||||
<el-input v-model="formData.name" placeholder="请输入缺陷描述" />
|
||||
</el-form-item>
|
||||
<el-form-item label="缺陷等级" prop="level">
|
||||
<el-select v-model="formData.level" placeholder="请选择缺陷等级" class="!w-1/1">
|
||||
<el-option
|
||||
v-for="dict in getIntDictOptions(DICT_TYPE.MES_DEFECT_LEVEL)"
|
||||
:key="dict.value"
|
||||
:label="dict.label"
|
||||
:value="dict.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="缺陷数量" prop="quantity">
|
||||
<el-input-number
|
||||
v-model="formData.quantity"
|
||||
:min="1"
|
||||
placeholder="请输入"
|
||||
class="!w-1/1"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input type="textarea" v-model="formData.remark" placeholder="请输入备注" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
</template>
|
||||
</Dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { dateFormatter } from '@/utils/formatTime'
|
||||
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||
import { QcDefectRecordApi, QcDefectRecordVO } from '@/api/mes/qc/defect/record'
|
||||
import { QcIqcLineApi, QcIqcLineVO } from '@/api/mes/qc/iqc/line'
|
||||
|
||||
defineOptions({ name: 'IqcDefectList' })
|
||||
|
||||
const props = defineProps<{
|
||||
iqcId: number
|
||||
lineId?: number // 可选:从行表操作列打开时按行筛选
|
||||
}>()
|
||||
|
||||
const message = useMessage()
|
||||
const { t } = useI18n()
|
||||
|
||||
const loading = ref(false)
|
||||
const list = ref<QcDefectRecordVO[]>([])
|
||||
const lineList = ref<QcIqcLineVO[]>([]) // 检验行列表(用于缺陷记录选择)
|
||||
|
||||
/** 查询列表 */
|
||||
const getList = async () => {
|
||||
if (!props.iqcId) return
|
||||
loading.value = true
|
||||
try {
|
||||
const data = await QcDefectRecordApi.getDefectRecordPage({
|
||||
pageNo: 1,
|
||||
pageSize: 100,
|
||||
qcType: 1,
|
||||
qcId: props.iqcId,
|
||||
lineId: props.lineId
|
||||
})
|
||||
list.value = data.list
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/** 加载检验行列表 */
|
||||
const loadLineList = async () => {
|
||||
if (!props.iqcId) return
|
||||
const data = await QcIqcLineApi.getIqcLinePage({
|
||||
pageNo: 1,
|
||||
pageSize: 100,
|
||||
iqcId: props.iqcId
|
||||
})
|
||||
lineList.value = data.list
|
||||
}
|
||||
|
||||
// ==================== 添加/修改 ====================
|
||||
const dialogVisible = ref(false)
|
||||
const dialogTitle = ref('')
|
||||
const formLoading = ref(false)
|
||||
const formType = ref('')
|
||||
const formRef = ref()
|
||||
const formData = ref({
|
||||
id: undefined,
|
||||
qcType: 1 as number,
|
||||
qcId: undefined as number | undefined,
|
||||
lineId: undefined as number | undefined,
|
||||
name: undefined,
|
||||
level: undefined,
|
||||
quantity: 1,
|
||||
remark: undefined
|
||||
})
|
||||
const formRules = reactive({
|
||||
lineId: [{ required: true, message: '检验行不能为空', trigger: 'change' }],
|
||||
name: [{ required: true, message: '缺陷描述不能为空', trigger: 'blur' }],
|
||||
level: [{ required: true, message: '缺陷等级不能为空', trigger: 'change' }]
|
||||
})
|
||||
|
||||
/** 添加/修改操作 */
|
||||
const openForm = async (type: string, id?: number) => {
|
||||
dialogVisible.value = true
|
||||
dialogTitle.value = t('action.' + type)
|
||||
formType.value = type
|
||||
resetForm()
|
||||
formData.value.qcId = props.iqcId
|
||||
// 如果有 lineId prop,预设 lineId
|
||||
if (props.lineId) {
|
||||
formData.value.lineId = props.lineId
|
||||
}
|
||||
// 加载检验行列表
|
||||
await loadLineList()
|
||||
// 修改时,查询详情(缺陷记录只有分页接口,从列表中获取)
|
||||
if (id) {
|
||||
formLoading.value = true
|
||||
try {
|
||||
const defect = list.value.find((d) => d.id === id)
|
||||
if (defect) {
|
||||
formData.value = { ...defect } as any
|
||||
}
|
||||
} finally {
|
||||
formLoading.value = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 提交表单 */
|
||||
const submitForm = async () => {
|
||||
if (!formRef) return
|
||||
const valid = await formRef.value.validate()
|
||||
if (!valid) return
|
||||
formLoading.value = true
|
||||
try {
|
||||
const data = formData.value as unknown as QcDefectRecordVO
|
||||
if (formType.value === 'create') {
|
||||
await QcDefectRecordApi.createDefectRecord(data)
|
||||
message.success(t('common.createSuccess'))
|
||||
} else {
|
||||
await QcDefectRecordApi.updateDefectRecord(data)
|
||||
message.success(t('common.updateSuccess'))
|
||||
}
|
||||
dialogVisible.value = false
|
||||
await getList()
|
||||
} finally {
|
||||
formLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
/** 重置表单 */
|
||||
const resetForm = () => {
|
||||
formData.value = {
|
||||
id: undefined,
|
||||
qcType: 1,
|
||||
qcId: undefined,
|
||||
lineId: undefined,
|
||||
name: undefined,
|
||||
level: undefined,
|
||||
quantity: 1,
|
||||
remark: undefined
|
||||
}
|
||||
formRef.value?.resetFields()
|
||||
}
|
||||
|
||||
/** 删除按钮操作 */
|
||||
const handleDelete = async (id: number) => {
|
||||
try {
|
||||
await message.delConfirm()
|
||||
await QcDefectRecordApi.deleteDefectRecord(id)
|
||||
message.success(t('common.delSuccess'))
|
||||
await getList()
|
||||
} catch {}
|
||||
}
|
||||
|
||||
/** 监听 iqcId 变化,重新加载列表 */
|
||||
watch(
|
||||
() => props.iqcId,
|
||||
() => getList(),
|
||||
{ immediate: true }
|
||||
)
|
||||
|
||||
/** 监听 lineId 变化,重新加载列表 */
|
||||
watch(
|
||||
() => props.lineId,
|
||||
() => getList()
|
||||
)
|
||||
</script>
|
||||
|
|
@ -12,7 +12,7 @@
|
|||
<el-row :gutter="16">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="检验单编号" prop="code">
|
||||
<!-- TODO @AI:参考别的模块,搞一下; -->
|
||||
<!-- TODO @AI:参考别的模块,搞一下;有个生成按钮; -->
|
||||
<el-input v-model="formData.code" placeholder="请输入检验单编号" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
|
@ -21,12 +21,12 @@
|
|||
<el-input v-model="formData.name" placeholder="请输入检验单名称" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- TODO @AI:貌似不用填写这个字段哈 -->
|
||||
<el-col :span="8">
|
||||
<el-form-item label="检验模板" prop="templateId">
|
||||
<el-form-item label="质检方案" prop="templateId">
|
||||
<!-- TODO @AI:质检方案;有个 select 组件; -->
|
||||
<el-select
|
||||
v-model="formData.templateId"
|
||||
placeholder="请选择检验模板"
|
||||
placeholder="质检方案"
|
||||
filterable
|
||||
class="!w-1/1"
|
||||
>
|
||||
|
|
@ -200,22 +200,12 @@
|
|||
<el-tab-pane label="检验项" name="line">
|
||||
<IqcLineList :iqc-id="formData.id" />
|
||||
</el-tab-pane>
|
||||
<!-- TODO @AI:应该是 IqcDefectList;可以重构到 /Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/mes/qc/defect/record/components/ 提供给每个模块使用,传递 qc-id、qc-type; -->
|
||||
<el-tab-pane label="缺陷记录" name="defect">
|
||||
<IqcDefectList :iqc-id="formData.id" />
|
||||
</el-tab-pane>
|
||||
<!-- TODO @AI:检测结果;缺少一个 List -->
|
||||
<!-- TODO @芋艿:检测结果;缺少一个 tab-pane -->
|
||||
</el-tabs>
|
||||
</template>
|
||||
|
||||
<template #footer>
|
||||
<el-button
|
||||
@click="submitForm"
|
||||
type="primary"
|
||||
:disabled="formLoading"
|
||||
>
|
||||
保 存
|
||||
</el-button>
|
||||
<el-button @click="submitForm" type="primary" :disabled="formLoading"> 保 存 </el-button>
|
||||
<el-button @click="dialogVisible = false">关 闭</el-button>
|
||||
</template>
|
||||
</Dialog>
|
||||
|
|
@ -229,8 +219,8 @@ import MdVendorSelect from '@/views/mes/md/vendor/components/MdVendorSelect.vue'
|
|||
import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
|
||||
import UserSelect from '@/views/system/user/components/UserSelect.vue'
|
||||
import IqcLineList from './IqcLineList.vue'
|
||||
import IqcDefectList from './IqcDefectList.vue'
|
||||
|
||||
// TODO @AI:参考 /Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/system/user/UserForm.vue 写变量、方法注释;
|
||||
defineOptions({ name: 'IqcForm' })
|
||||
|
||||
const { t } = useI18n()
|
||||
|
|
@ -243,6 +233,7 @@ const formType = ref('')
|
|||
const activeTab = ref('line')
|
||||
|
||||
// 模板列表
|
||||
// TODO @AI:/Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/mes/qc/template 封装一个 components 下的 select 组件;
|
||||
const templateList = ref<any[]>([])
|
||||
|
||||
const formData = ref({
|
||||
|
|
@ -268,7 +259,6 @@ const formData = ref({
|
|||
inspectDate: undefined,
|
||||
inspectorUserId: undefined,
|
||||
remark: undefined,
|
||||
status: 0,
|
||||
// 缺陷统计(只读)
|
||||
criticalRate: 0,
|
||||
majorRate: 0,
|
||||
|
|
@ -356,7 +346,6 @@ const resetForm = () => {
|
|||
inspectDate: undefined,
|
||||
inspectorUserId: undefined,
|
||||
remark: undefined,
|
||||
status: 0, // TODO @AI:默认值,不用填写;
|
||||
criticalRate: 0,
|
||||
majorRate: 0,
|
||||
minorRate: 0,
|
||||
|
|
|
|||
|
|
@ -21,51 +21,59 @@
|
|||
<el-table-column label="轻微缺陷数" align="center" prop="minorQuantity" width="100" />
|
||||
<el-table-column label="操作" align="center" width="100" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button link type="primary" @click="openDefectDialog(scope.row)"> 缺陷记录 </el-button>
|
||||
<el-button link type="primary" @click="openDefectDialog(scope.row)"> 缺陷列表 </el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 分页 -->
|
||||
<Pagination
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNo"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 缺陷记录弹窗 -->
|
||||
<Dialog title="缺陷记录" v-model="defectDialogVisible" width="900px">
|
||||
<IqcDefectList :iqc-id="props.iqcId" :line-id="currentLineId!" />
|
||||
</Dialog>
|
||||
<!-- 缺陷记录弹窗(内联编辑) -->
|
||||
<DefectRecordInlineList ref="defectListRef" @refresh="getList" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { DICT_TYPE } from '@/utils/dict'
|
||||
import { QcIqcLineApi, QcIqcLineVO } from '@/api/mes/qc/iqc/line'
|
||||
import IqcDefectList from './IqcDefectList.vue'
|
||||
import DefectRecordInlineList from '@/views/mes/qc/defect/record/components/DefectRecordInlineList.vue'
|
||||
import { MesQcTypeEnum } from '@/views/mes/utils/constants'
|
||||
|
||||
defineOptions({ name: 'IqcLineList' })
|
||||
|
||||
const props = defineProps<{ iqcId: number }>()
|
||||
|
||||
const loading = ref(false)
|
||||
const list = ref<QcIqcLineVO[]>([])
|
||||
|
||||
// 缺陷记录弹窗
|
||||
const defectDialogVisible = ref(false)
|
||||
const currentLineId = ref<number>()
|
||||
const loading = ref(false) // 列表的加载中
|
||||
const list = ref<QcIqcLineVO[]>([]) // 列表的数据
|
||||
const total = ref(0) // 列表的总页数
|
||||
const queryParams = reactive({
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
iqcId: undefined as number | undefined
|
||||
})
|
||||
const defectListRef = ref() // 缺陷记录弹窗 Ref
|
||||
|
||||
/** 打开缺陷记录弹窗 */
|
||||
const openDefectDialog = (row: QcIqcLineVO) => {
|
||||
currentLineId.value = row.id
|
||||
defectDialogVisible.value = true
|
||||
defectListRef.value.open(MesQcTypeEnum.IQC, props.iqcId, row.id)
|
||||
}
|
||||
|
||||
/** 查询列表 */
|
||||
const getList = async () => {
|
||||
if (!props.iqcId) return
|
||||
if (!props.iqcId) {
|
||||
return
|
||||
}
|
||||
queryParams.iqcId = props.iqcId
|
||||
loading.value = true
|
||||
try {
|
||||
const data = await QcIqcLineApi.getIqcLinePage({
|
||||
pageNo: 1,
|
||||
pageSize: 100,
|
||||
iqcId: props.iqcId
|
||||
})
|
||||
const data = await QcIqcLineApi.getIqcLinePage(queryParams)
|
||||
list.value = data.list
|
||||
total.value = data.total
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
|
|
@ -74,7 +82,10 @@ const getList = async () => {
|
|||
/** 监听 iqcId 变化,重新加载列表 */
|
||||
watch(
|
||||
() => props.iqcId,
|
||||
() => getList(),
|
||||
() => {
|
||||
queryParams.pageNo = 1
|
||||
getList()
|
||||
},
|
||||
{ immediate: true }
|
||||
)
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -204,6 +204,7 @@
|
|||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
// TODO @AI:参考 /Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/system/user/index.vue 写方法、变量注释;
|
||||
import { dateFormatter2 } from '@/utils/formatTime'
|
||||
import download from '@/utils/download'
|
||||
import { QcIqcApi, QcIqcVO } from '@/api/mes/qc/iqc'
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@
|
|||
|
||||
<script setup lang="ts">
|
||||
import { DICT_TYPE } from '@/utils/dict'
|
||||
import { QcTemplateIndicatorApi, QcTemplateIndicatorVO } from '@/api/mes/qc/template/indicator'
|
||||
import { QcTemplateIndicatorApi, QcTemplateIndicatorVO } from '@/api/mes/qc/template/indicator/index'
|
||||
import QcIndicatorSelect from '@/views/mes/qc/indicator/components/QcIndicatorSelect.vue'
|
||||
import MdUnitMeasureSelect from '@/views/mes/md/unitmeasure/components/MdUnitMeasureSelect.vue'
|
||||
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@
|
|||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { QcTemplateItemApi, QcTemplateItemVO } from '@/api/mes/qc/template/item'
|
||||
import { QcTemplateItemApi, QcTemplateItemVO } from '@/api/mes/qc/template/item/index'
|
||||
import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
|
||||
|
||||
defineOptions({ name: 'TemplateItemList' })
|
||||
|
|
|
|||
|
|
@ -0,0 +1,81 @@
|
|||
<!-- MES 质检方案选择器:纯下拉,前端过滤(支持 name、code) -->
|
||||
<template>
|
||||
<el-select
|
||||
v-model="selectValue"
|
||||
:placeholder="placeholder"
|
||||
:disabled="disabled"
|
||||
:clearable="clearable"
|
||||
filterable
|
||||
:filter-method="handleFilter"
|
||||
class="!w-1/1"
|
||||
@change="handleChange"
|
||||
>
|
||||
<el-option v-for="item in filteredList" :key="item.id" :label="item.name" :value="item.id">
|
||||
<div class="flex items-center gap-8px">
|
||||
<span>{{ item.name }}</span>
|
||||
<el-tag v-if="item.code" size="small" type="info" class="ml-4px">
|
||||
{{ item.code }}
|
||||
</el-tag>
|
||||
</div>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { QcTemplateApi, QcTemplateVO } from '@/api/mes/qc/template'
|
||||
|
||||
defineOptions({ name: 'QcTemplateSelect' })
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
modelValue?: number
|
||||
disabled?: boolean
|
||||
clearable?: boolean
|
||||
placeholder?: string
|
||||
}>(),
|
||||
{
|
||||
disabled: false,
|
||||
clearable: true,
|
||||
placeholder: '请选择质检方案'
|
||||
}
|
||||
)
|
||||
|
||||
const emit = defineEmits<{
|
||||
'update:modelValue': [value: number | undefined]
|
||||
change: [item: QcTemplateVO | undefined]
|
||||
}>()
|
||||
|
||||
const allList = ref<QcTemplateVO[]>([]) // 全量列表
|
||||
const filteredList = ref<QcTemplateVO[]>([]) // 过滤后的列表
|
||||
|
||||
const selectValue = computed({
|
||||
get: () => props.modelValue,
|
||||
set: (val) => emit('update:modelValue', val)
|
||||
})
|
||||
|
||||
/** 前端过滤(name + code) */
|
||||
const handleFilter = (query: string) => {
|
||||
if (!query) {
|
||||
filteredList.value = allList.value
|
||||
return
|
||||
}
|
||||
const keyword = query.toLowerCase()
|
||||
filteredList.value = allList.value.filter(
|
||||
(item) =>
|
||||
item.name?.toLowerCase().includes(keyword) ||
|
||||
item.code?.toLowerCase().includes(keyword)
|
||||
)
|
||||
}
|
||||
|
||||
/** 选中变化 */
|
||||
const handleChange = (val: number | undefined) => {
|
||||
const item = allList.value.find((o) => o.id === val)
|
||||
emit('change', item)
|
||||
}
|
||||
|
||||
/** 加载质检方案列表 */
|
||||
onMounted(async () => {
|
||||
allList.value = await QcTemplateApi.getTemplateSimpleList()
|
||||
filteredList.value = allList.value
|
||||
})
|
||||
</script>
|
||||
|
|
@ -130,6 +130,14 @@ export const MesDvCheckResultEnum = {
|
|||
ABNORMAL: 2 // 异常
|
||||
}
|
||||
|
||||
/** MES 质检类型枚举 */
|
||||
export const MesQcTypeEnum = {
|
||||
IQC: 1, // 来料检验
|
||||
IPQC: 2, // 过程检验
|
||||
OQC: 3, // 出货检验
|
||||
RQC: 4 // 退货检验
|
||||
}
|
||||
|
||||
/** MES 来料检验单(IQC)状态枚举 */
|
||||
export const MesQcIqcStatusEnum = {
|
||||
PREPARE: 0, // 草稿
|
||||
|
|
|
|||
Loading…
Reference in New Issue