feat(mes): 重构缺陷记录相关类的包结构,更新缺陷等级字段类型为整数,优化缺陷记录内联编辑组件
parent
31cc9bd31e
commit
298ad41d5b
|
|
@ -6,7 +6,7 @@ export interface QcDefectVO {
|
||||||
code: string // 缺陷编码
|
code: string // 缺陷编码
|
||||||
name: string // 缺陷描述
|
name: string // 缺陷描述
|
||||||
type: string // 检测项类型
|
type: string // 检测项类型
|
||||||
level: string // 缺陷等级
|
level: number // 缺陷等级
|
||||||
remark: string // 备注
|
remark: string // 备注
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@
|
||||||
class="!w-1/1"
|
class="!w-1/1"
|
||||||
>
|
>
|
||||||
<el-option
|
<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"
|
:key="dict.value"
|
||||||
:label="dict.label"
|
:label="dict.label"
|
||||||
:value="dict.value"
|
:value="dict.value"
|
||||||
|
|
@ -61,7 +61,7 @@
|
||||||
</Dialog>
|
</Dialog>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<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 { QcDefectApi, QcDefectVO } from '@/api/mes/qc/defect'
|
||||||
import { generateRandomStr } from '@/utils'
|
import { generateRandomStr } from '@/utils'
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@
|
||||||
class="!w-240px"
|
class="!w-240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<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"
|
:key="dict.value"
|
||||||
:label="dict.label"
|
:label="dict.label"
|
||||||
:value="dict.value"
|
:value="dict.value"
|
||||||
|
|
@ -143,7 +143,7 @@ import { dateFormatter } from '@/utils/formatTime'
|
||||||
import download from '@/utils/download'
|
import download from '@/utils/download'
|
||||||
import { QcDefectApi, QcDefectVO } from '@/api/mes/qc/defect'
|
import { QcDefectApi, QcDefectVO } from '@/api/mes/qc/defect'
|
||||||
import DefectForm from './DefectForm.vue'
|
import DefectForm from './DefectForm.vue'
|
||||||
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
|
import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
|
||||||
|
|
||||||
defineOptions({ name: 'MesQcDefect' })
|
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-row :gutter="16">
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="检验单编号" prop="code">
|
<el-form-item label="检验单编号" prop="code">
|
||||||
<!-- TODO @AI:参考别的模块,搞一下; -->
|
<!-- TODO @AI:参考别的模块,搞一下;有个生成按钮; -->
|
||||||
<el-input v-model="formData.code" placeholder="请输入检验单编号" />
|
<el-input v-model="formData.code" placeholder="请输入检验单编号" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
|
@ -21,12 +21,12 @@
|
||||||
<el-input v-model="formData.name" placeholder="请输入检验单名称" />
|
<el-input v-model="formData.name" placeholder="请输入检验单名称" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<!-- TODO @AI:貌似不用填写这个字段哈 -->
|
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="检验模板" prop="templateId">
|
<el-form-item label="质检方案" prop="templateId">
|
||||||
|
<!-- TODO @AI:质检方案;有个 select 组件; -->
|
||||||
<el-select
|
<el-select
|
||||||
v-model="formData.templateId"
|
v-model="formData.templateId"
|
||||||
placeholder="请选择检验模板"
|
placeholder="质检方案"
|
||||||
filterable
|
filterable
|
||||||
class="!w-1/1"
|
class="!w-1/1"
|
||||||
>
|
>
|
||||||
|
|
@ -200,22 +200,12 @@
|
||||||
<el-tab-pane label="检验项" name="line">
|
<el-tab-pane label="检验项" name="line">
|
||||||
<IqcLineList :iqc-id="formData.id" />
|
<IqcLineList :iqc-id="formData.id" />
|
||||||
</el-tab-pane>
|
</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; -->
|
<!-- TODO @芋艿:检测结果;缺少一个 tab-pane -->
|
||||||
<el-tab-pane label="缺陷记录" name="defect">
|
|
||||||
<IqcDefectList :iqc-id="formData.id" />
|
|
||||||
</el-tab-pane>
|
|
||||||
<!-- TODO @AI:检测结果;缺少一个 List -->
|
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<el-button
|
<el-button @click="submitForm" type="primary" :disabled="formLoading"> 保 存 </el-button>
|
||||||
@click="submitForm"
|
|
||||||
type="primary"
|
|
||||||
:disabled="formLoading"
|
|
||||||
>
|
|
||||||
保 存
|
|
||||||
</el-button>
|
|
||||||
<el-button @click="dialogVisible = false">关 闭</el-button>
|
<el-button @click="dialogVisible = false">关 闭</el-button>
|
||||||
</template>
|
</template>
|
||||||
</Dialog>
|
</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 MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
|
||||||
import UserSelect from '@/views/system/user/components/UserSelect.vue'
|
import UserSelect from '@/views/system/user/components/UserSelect.vue'
|
||||||
import IqcLineList from './IqcLineList.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' })
|
defineOptions({ name: 'IqcForm' })
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
|
@ -243,6 +233,7 @@ const formType = ref('')
|
||||||
const activeTab = ref('line')
|
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 templateList = ref<any[]>([])
|
||||||
|
|
||||||
const formData = ref({
|
const formData = ref({
|
||||||
|
|
@ -268,7 +259,6 @@ const formData = ref({
|
||||||
inspectDate: undefined,
|
inspectDate: undefined,
|
||||||
inspectorUserId: undefined,
|
inspectorUserId: undefined,
|
||||||
remark: undefined,
|
remark: undefined,
|
||||||
status: 0,
|
|
||||||
// 缺陷统计(只读)
|
// 缺陷统计(只读)
|
||||||
criticalRate: 0,
|
criticalRate: 0,
|
||||||
majorRate: 0,
|
majorRate: 0,
|
||||||
|
|
@ -356,7 +346,6 @@ const resetForm = () => {
|
||||||
inspectDate: undefined,
|
inspectDate: undefined,
|
||||||
inspectorUserId: undefined,
|
inspectorUserId: undefined,
|
||||||
remark: undefined,
|
remark: undefined,
|
||||||
status: 0, // TODO @AI:默认值,不用填写;
|
|
||||||
criticalRate: 0,
|
criticalRate: 0,
|
||||||
majorRate: 0,
|
majorRate: 0,
|
||||||
minorRate: 0,
|
minorRate: 0,
|
||||||
|
|
|
||||||
|
|
@ -21,51 +21,59 @@
|
||||||
<el-table-column label="轻微缺陷数" align="center" prop="minorQuantity" width="100" />
|
<el-table-column label="轻微缺陷数" align="center" prop="minorQuantity" width="100" />
|
||||||
<el-table-column label="操作" align="center" width="100" fixed="right">
|
<el-table-column label="操作" align="center" width="100" fixed="right">
|
||||||
<template #default="scope">
|
<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>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
|
||||||
<!-- 缺陷记录弹窗 -->
|
<!-- 缺陷记录弹窗(内联编辑) -->
|
||||||
<Dialog title="缺陷记录" v-model="defectDialogVisible" width="900px">
|
<DefectRecordInlineList ref="defectListRef" @refresh="getList" />
|
||||||
<IqcDefectList :iqc-id="props.iqcId" :line-id="currentLineId!" />
|
|
||||||
</Dialog>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { DICT_TYPE } from '@/utils/dict'
|
import { DICT_TYPE } from '@/utils/dict'
|
||||||
import { QcIqcLineApi, QcIqcLineVO } from '@/api/mes/qc/iqc/line'
|
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' })
|
defineOptions({ name: 'IqcLineList' })
|
||||||
|
|
||||||
const props = defineProps<{ iqcId: number }>()
|
const props = defineProps<{ iqcId: number }>()
|
||||||
|
|
||||||
const loading = ref(false)
|
const loading = ref(false) // 列表的加载中
|
||||||
const list = ref<QcIqcLineVO[]>([])
|
const list = ref<QcIqcLineVO[]>([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
// 缺陷记录弹窗
|
const queryParams = reactive({
|
||||||
const defectDialogVisible = ref(false)
|
pageNo: 1,
|
||||||
const currentLineId = ref<number>()
|
pageSize: 10,
|
||||||
|
iqcId: undefined as number | undefined
|
||||||
|
})
|
||||||
|
const defectListRef = ref() // 缺陷记录弹窗 Ref
|
||||||
|
|
||||||
/** 打开缺陷记录弹窗 */
|
/** 打开缺陷记录弹窗 */
|
||||||
const openDefectDialog = (row: QcIqcLineVO) => {
|
const openDefectDialog = (row: QcIqcLineVO) => {
|
||||||
currentLineId.value = row.id
|
defectListRef.value.open(MesQcTypeEnum.IQC, props.iqcId, row.id)
|
||||||
defectDialogVisible.value = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 查询列表 */
|
/** 查询列表 */
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
if (!props.iqcId) return
|
if (!props.iqcId) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
queryParams.iqcId = props.iqcId
|
||||||
loading.value = true
|
loading.value = true
|
||||||
try {
|
try {
|
||||||
const data = await QcIqcLineApi.getIqcLinePage({
|
const data = await QcIqcLineApi.getIqcLinePage(queryParams)
|
||||||
pageNo: 1,
|
|
||||||
pageSize: 100,
|
|
||||||
iqcId: props.iqcId
|
|
||||||
})
|
|
||||||
list.value = data.list
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false
|
loading.value = false
|
||||||
}
|
}
|
||||||
|
|
@ -74,7 +82,10 @@ const getList = async () => {
|
||||||
/** 监听 iqcId 变化,重新加载列表 */
|
/** 监听 iqcId 变化,重新加载列表 */
|
||||||
watch(
|
watch(
|
||||||
() => props.iqcId,
|
() => props.iqcId,
|
||||||
() => getList(),
|
() => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
},
|
||||||
{ immediate: true }
|
{ immediate: true }
|
||||||
)
|
)
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -204,6 +204,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<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 { dateFormatter2 } from '@/utils/formatTime'
|
||||||
import download from '@/utils/download'
|
import download from '@/utils/download'
|
||||||
import { QcIqcApi, QcIqcVO } from '@/api/mes/qc/iqc'
|
import { QcIqcApi, QcIqcVO } from '@/api/mes/qc/iqc'
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,7 @@
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { DICT_TYPE } from '@/utils/dict'
|
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 QcIndicatorSelect from '@/views/mes/qc/indicator/components/QcIndicatorSelect.vue'
|
||||||
import MdUnitMeasureSelect from '@/views/mes/md/unitmeasure/components/MdUnitMeasureSelect.vue'
|
import MdUnitMeasureSelect from '@/views/mes/md/unitmeasure/components/MdUnitMeasureSelect.vue'
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<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'
|
import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
|
||||||
|
|
||||||
defineOptions({ name: 'TemplateItemList' })
|
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 // 异常
|
ABNORMAL: 2 // 异常
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** MES 质检类型枚举 */
|
||||||
|
export const MesQcTypeEnum = {
|
||||||
|
IQC: 1, // 来料检验
|
||||||
|
IPQC: 2, // 过程检验
|
||||||
|
OQC: 3, // 出货检验
|
||||||
|
RQC: 4 // 退货检验
|
||||||
|
}
|
||||||
|
|
||||||
/** MES 来料检验单(IQC)状态枚举 */
|
/** MES 来料检验单(IQC)状态枚举 */
|
||||||
export const MesQcIqcStatusEnum = {
|
export const MesQcIqcStatusEnum = {
|
||||||
PREPARE: 0, // 草稿
|
PREPARE: 0, // 草稿
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue