feat:质量管理-检验方案对接

main
黄伟杰 2 weeks ago
parent e4b82b4b26
commit 0061fb2a3c

@ -1,47 +1,52 @@
import request from '@/config/axios' import request from '@/config/axios'
// 质量管理-检验项目 VO // 质量管理-检验项目 VO
export interface ZjItemVO { export interface ZjItemVO {
id: number // ID id: number // ID
zjType: number // 检验类型 zjType: number // 检验类型
name: string // 名称 name: string // 名称
remark: string // 备注 zjTypeName?: string
tool: string // 作业方式 remark: string // 备注
standardVal: number // 标准值 tool: string // 作业方式
unit: string // 单位 standardVal: number // 标准值
upperVal: number // 上限值 unit: string // 单位
lowerVal: number // 下限值 upperVal: number // 上限值
} lowerVal: number // 下限值
}
// 质量管理-检验项目 API
export const ZjItemApi = { // 质量管理-检验项目 API
// 查询质量管理-检验项目分页 export const ZjItemApi = {
getZjItemPage: async (params: any) => { // 查询质量管理-检验项目分页
return await request.get({ url: `/mes/zj-item/page`, params }) getZjItemPage: async (params: any) => {
}, return await request.get({ url: `/mes/zj-item/page`, params })
},
// 查询质量管理-检验项目详情
getZjItem: async (id: number) => { getZjItemList: async () => {
return await request.get({ url: `/mes/zj-item/get?id=` + id }) return await request.get({ url: `/mes/zj-item/list` })
}, },
// 新增质量管理-检验项目 // 查询质量管理-检验项目详情
createZjItem: async (data: ZjItemVO) => { getZjItem: async (id: number) => {
return await request.post({ url: `/mes/zj-item/create`, data }) return await request.get({ url: `/mes/zj-item/get?id=` + id })
}, },
// 修改质量管理-检验项目 // 新增质量管理-检验项目
updateZjItem: async (data: ZjItemVO) => { createZjItem: async (data: ZjItemVO) => {
return await request.put({ url: `/mes/zj-item/update`, data }) return await request.post({ url: `/mes/zj-item/create`, data })
}, },
// 删除质量管理-检验项目 // 修改质量管理-检验项目
deleteZjItem: async (id: number) => { updateZjItem: async (data: ZjItemVO) => {
return await request.delete({ url: `/mes/zj-item/delete?id=` + id }) return await request.put({ url: `/mes/zj-item/update`, data })
}, },
// 导出质量管理-检验项目 Excel // 删除质量管理-检验项目
exportZjItem: async (params) => { deleteZjItem: async (id: number) => {
return await request.download({ url: `/mes/zj-item/export-excel`, params }) return await request.delete({ url: `/mes/zj-item/delete?id=` + id })
}, },
}
// 导出质量管理-检验项目 Excel
exportZjItem: async (params) => {
return await request.download({ url: `/mes/zj-item/export-excel`, params })
},
}

@ -1,44 +1,49 @@
import request from '@/config/axios' import request from '@/config/axios'
// 检验方案 VO // 检验方案 VO
export interface ZjSchemaVO { export interface ZjSchemaVO {
type: string // 类型 id: number
name: string // 名称 type: string
remark: string // 备注 name: string
sampleMethod: string // 抽检方式 remark: string
val: number // 值 sampleMethod: string
item: string // 关联项目 val: string
} item: string
}
// 检验方案 API
export const ZjSchemaApi = { // 检验方案 API
// 查询检验方案分页 export const ZjSchemaApi = {
getZjSchemaPage: async (params: any) => { // 查询检验方案分页
return await request.get({ url: `/mes/zj-schema/page`, params }) getZjSchemaPage: async (params: any) => {
}, return await request.get({ url: `/mes/zj-schema/page`, params })
},
// 查询检验方案详情
getZjSchema: async (id: number) => { // 查询检验方案详情
return await request.get({ url: `/mes/zj-schema/get?id=` + id }) getZjSchema: async (id: number) => {
}, return await request.get({ url: `/mes/zj-schema/get?id=` + id })
},
// 新增检验方案
createZjSchema: async (data: ZjSchemaVO) => { // 新增检验方案
return await request.post({ url: `/mes/zj-schema/create`, data }) createZjSchema: async (data: ZjSchemaVO) => {
}, return await request.post({ url: `/mes/zj-schema/create`, data })
},
// 修改检验方案
updateZjSchema: async (data: ZjSchemaVO) => { // 修改检验方案
return await request.put({ url: `/mes/zj-schema/update`, data }) updateZjSchema: async (data: ZjSchemaVO) => {
}, return await request.put({ url: `/mes/zj-schema/update`, data })
},
// 删除检验方案
deleteZjSchema: async (id: number) => { // 删除检验方案
return await request.delete({ url: `/mes/zj-schema/delete?id=` + id }) deleteZjSchema: async (id: number) => {
}, return await request.delete({ url: `/mes/zj-schema/delete?id=` + id })
},
// 导出检验方案 Excel
exportZjSchema: async (params) => { // 导出检验方案 Excel
return await request.download({ url: `/mes/zj-schema/export-excel`, params }) exportZjSchema: async (params) => {
}, return await request.download({ url: `/mes/zj-schema/export-excel`, params })
} },
getItemList: async (id: number) => {
return await request.get({ url: `/mes/zj-schema/getItemList?id=` + id })
},
}

@ -1,31 +1,50 @@
<template> <template>
<Dialog :title="dialogTitle" v-model="dialogVisible"> <Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form <el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="类型" prop="type">
<el-select v-model="formData.type" placeholder="请选择类型">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="名称" prop="name"> <el-form-item label="名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入名称" /> <el-input v-model="formData.name" placeholder="请输入名称" />
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="类型" prop="type">
<el-input v-model="formData.remark" placeholder="请输入备注" /> <el-radio-group v-model="formData.type">
<el-radio v-for="dict in getDictOptions('mes_zj_schema_type')" :key="dict.value" :label="dict.value">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="抽检方式" prop="sampleMethod"> <el-form-item v-if="isSampleType" label="抽检方式" prop="sampleMethod">
<el-input v-model="formData.sampleMethod" placeholder="请输入抽检方式" /> <el-radio-group v-model="formData.sampleMethod">
<el-radio v-for="dict in getDictOptions('mes_zj_schema_sample_method')" :key="dict.value" :label="dict.value">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="值" prop="val"> <el-form-item v-if="isSampleType" label="值" prop="val">
<el-input v-model="formData.val" placeholder="请输入值" /> <template v-if="isRateMethod">
<el-input-number v-model="rateVal" :min="0" class="!w-160px" />
<span class="ml-8px">%</span>
</template>
<template v-else-if="isGapMethod">
<span>每间隔</span>
<el-input-number v-model="gapInterval" :min="1" class="!w-120px mx-8px" :controls="false" />
<span>抽取</span>
<el-input-number v-model="gapCount" :min="1" class="!w-120px ml-8px" :controls="false" />
</template>
<template v-else>
<el-input v-model="formData.val" placeholder="请输入值" />
</template>
</el-form-item> </el-form-item>
<el-form-item label="关联项目" prop="item"> <el-form-item label="关联项目" prop="item">
<el-input v-model="formData.item" placeholder="请输入关联项目" /> <el-row :gutter="8" class="w-full">
<el-col :span="22">
<el-input :model-value="displayItemNames" placeholder="请选择检验项目" readonly />
</el-col>
<el-col :span="2" class="text-right">
<el-button type="primary" @click="openItemDialog"></el-button>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
@ -33,9 +52,79 @@
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="dialogVisible = false"> </el-button>
</template> </template>
</Dialog> </Dialog>
<el-dialog v-model="itemDialogVisible" title="选择检验项目" width="920px" draggable>
<div v-loading="itemLoading">
<div class="formula-config-picklist">
<div class="formula-config-panel">
<div class="formula-config-panel__header">
<div>来源</div>
<div class="formula-config-panel__meta">{{ filteredSourceItems.length }}</div>
</div>
<div class="formula-config-panel__filter">
<el-input v-model="sourceKeyword" placeholder="筛选" clearable />
</div>
<el-table
class="formula-config-panel__table"
:data="filteredSourceItems"
height="440"
row-key="key"
@selection-change="handleSourceSelectionChange"
>
<el-table-column type="selection" width="44" />
<el-table-column label="名称" prop="name" />
<el-table-column label="检验类型">
<template #default="scope">
{{ scope.row.zjTypeName }}
</template>
</el-table-column>
</el-table>
</div>
<div class="formula-config-actions">
<el-button type="primary" :disabled="!sourceCheckedKeys.length" @click="addToTarget">
&gt;&gt;
</el-button>
<el-button :disabled="!targetCheckedKeys.length" @click="removeFromTarget">
&lt;&lt;
</el-button>
</div>
<div class="formula-config-panel">
<div class="formula-config-panel__header">
<div>目标</div>
<div class="formula-config-panel__meta">{{ filteredTargetItems.length }}</div>
</div>
<div class="formula-config-panel__filter">
<el-input v-model="targetKeyword" placeholder="筛选" clearable />
</div>
<el-table
class="formula-config-panel__table"
:data="filteredTargetItems"
height="440"
row-key="key"
@selection-change="handleTargetSelectionChange"
>
<el-table-column type="selection" width="44" />
<el-table-column label="名称" prop="name" />
<el-table-column label="检验类型">
<template #default="scope">
{{ scope.row.zjTypeName }}
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
<template #footer>
<el-button @click="itemDialogVisible = false"> </el-button>
<el-button type="primary" @click="confirmSelectItems"> </el-button>
</template>
</el-dialog>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { getDictOptions } from '@/utils/dict'
import { ZjSchemaApi, ZjSchemaVO } from '@/api/mes/zjschema' import { ZjSchemaApi, ZjSchemaVO } from '@/api/mes/zjschema'
import { ZjItemApi, ZjItemVO } from '@/api/mes/zjitem'
/** 检验方案 表单 */ /** 检验方案 表单 */
defineOptions({ name: 'ZjSchemaForm' }) defineOptions({ name: 'ZjSchemaForm' })
@ -48,18 +137,183 @@ const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref({
type: undefined, type: 'All' as string | undefined,
name: undefined, name: undefined as string | undefined,
remark: undefined, remark: undefined as string | undefined,
sampleMethod: undefined, sampleMethod: undefined as string | undefined,
val: undefined, val: undefined as string | undefined,
item: undefined, item: undefined as string | undefined,
}) })
const rateVal = ref<number | undefined>(undefined)
const gapInterval = ref<number | undefined>(undefined)
const gapCount = ref<number | undefined>(undefined)
const itemDialogVisible = ref(false)
const itemLoading = ref(false)
const itemList = ref<ZjItemVO[]>([])
const selectedItemIds = ref<number[]>([])
const sourceKeyword = ref('')
const targetKeyword = ref('')
const sourceCheckedKeys = ref<number[]>([])
const targetCheckedKeys = ref<number[]>([])
const formRules = reactive({ const formRules = reactive({
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }], name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
type: [{ required: true, message: '类型不能为空', trigger: 'change' }],
sampleMethod: [{ required: true, message: '抽检方式不能为空', trigger: 'change' }],
val: [{ validator: (_: any, __: any, callback: any) => validateVal(callback), trigger: 'blur' }],
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
const isSampleType = computed(() => {
const type = formData.value.type
return type === 'Sample'
})
const isRateMethod = computed(() => formData.value.sampleMethod === 'Rate')
const isGapMethod = computed(() => formData.value.sampleMethod === 'Gap')
const displayItemNames = computed(() => {
if (!selectedItemIds.value.length) return ''
if (!itemList.value.length) {
return formData.value.item ? String(formData.value.item) : ''
}
const map = new Map(itemList.value.map((item) => [item.id, item.name]))
const names = selectedItemIds.value
.map((id) => map.get(id))
.filter((name) => name)
return names.join(',')
})
const allItems = computed(() =>
itemList.value.map((item) => {
const typeName = item.zjTypeName || ''
const name = item.name || ''
const label = typeName ? `${typeName}-${name}` : name
return {
...item,
key: item.id,
label,
}
})
)
const sourceItems = computed(() =>
allItems.value.filter((item) => !selectedItemIds.value.includes(item.id))
)
const targetItems = computed(() =>
allItems.value.filter((item) => selectedItemIds.value.includes(item.id))
)
const filteredSourceItems = computed(() => {
const keyword = sourceKeyword.value.trim()
if (!keyword) return sourceItems.value
return sourceItems.value.filter((item) => item.label?.includes(keyword))
})
const filteredTargetItems = computed(() => {
const keyword = targetKeyword.value.trim()
if (!keyword) return targetItems.value
return targetItems.value.filter((item) => item.label?.includes(keyword))
})
const validateVal = (callback: any) => {
if (!isSampleType.value) {
callback()
return
}
if (isRateMethod.value) {
if (rateVal.value === undefined || rateVal.value === null) {
callback(new Error('值不能为空'))
return
}
} else if (isGapMethod.value) {
if (!gapInterval.value || !gapCount.value) {
callback(new Error('值不能为空'))
return
}
} else if (!formData.value.val) {
callback(new Error('值不能为空'))
return
}
callback()
}
watch(
() => formData.value.type,
(val) => {
if (val === 'Sample') {
if (!formData.value.sampleMethod) {
const opts = getDictOptions('mes_zj_schema_sample_method')
if (opts && opts.length > 0) {
formData.value.sampleMethod = String(opts[0].value)
}
}
return
}
formData.value.sampleMethod = undefined
formData.value.val = undefined
rateVal.value = undefined
gapInterval.value = undefined
gapCount.value = undefined
formRef.value?.clearValidate?.(['sampleMethod', 'val'])
}
)
const openItemDialog = async () => {
itemDialogVisible.value = true
if (!itemList.value.length) {
itemLoading.value = true
try {
itemList.value = await ZjItemApi.getZjItemList()
} finally {
itemLoading.value = false
}
}
initSelectedItemIds()
sourceCheckedKeys.value = []
targetCheckedKeys.value = []
}
const initSelectedItemIds = () => {
if (!formData.value.item) {
selectedItemIds.value = []
return
}
const ids = String(formData.value.item)
.split(',')
.map((v) => Number(v.trim()))
.filter((v) => !Number.isNaN(v))
selectedItemIds.value = ids
}
const confirmSelectItems = () => {
formData.value.item = selectedItemIds.value.join(',')
itemDialogVisible.value = false
}
const handleSourceSelectionChange = (rows: any[]) => {
sourceCheckedKeys.value = rows.map((row: any) => row.id)
}
const handleTargetSelectionChange = (rows: any[]) => {
targetCheckedKeys.value = rows.map((row: any) => row.id)
}
const addToTarget = () => {
if (!sourceCheckedKeys.value.length) return
const set = new Set(selectedItemIds.value)
sourceCheckedKeys.value.forEach((id) => set.add(id))
selectedItemIds.value = Array.from(set)
sourceCheckedKeys.value = []
}
const removeFromTarget = () => {
if (!targetCheckedKeys.value.length) return
const removeSet = new Set(targetCheckedKeys.value)
selectedItemIds.value = selectedItemIds.value.filter((id) => !removeSet.has(id))
targetCheckedKeys.value = []
}
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (type: string, id?: number) => { const open = async (type: string, id?: number) => {
dialogVisible.value = true dialogVisible.value = true
@ -70,7 +324,21 @@ const open = async (type: string, id?: number) => {
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { try {
formData.value = await ZjSchemaApi.getZjSchema(id) const data = await ZjSchemaApi.getZjSchema(id)
formData.value = data
initSelectedItemIds()
if (formData.value.type === 'Sample') {
if (formData.value.sampleMethod === 'Rate') {
const n = Number(formData.value.val)
rateVal.value = Number.isNaN(n) ? undefined : n
} else if (formData.value.sampleMethod === 'Gap' && typeof formData.value.val === 'string') {
const parts = formData.value.val.split(',').map((v: string) => v.trim())
const interval = Number(parts[0])
const count = Number(parts[1])
gapInterval.value = Number.isNaN(interval) ? undefined : interval
gapCount.value = Number.isNaN(count) ? undefined : count
}
}
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
@ -83,6 +351,21 @@ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成
const submitForm = async () => { const submitForm = async () => {
// //
await formRef.value.validate() await formRef.value.validate()
if (isSampleType.value) {
if (isRateMethod.value) {
formData.value.val =
rateVal.value === undefined || rateVal.value === null ? undefined : String(rateVal.value)
} else if (isGapMethod.value) {
if (gapInterval.value && gapCount.value) {
formData.value.val = `${gapInterval.value},${gapCount.value}`
} else {
formData.value.val = undefined
}
}
} else {
formData.value.sampleMethod = ''
formData.value.val = ''
}
// //
formLoading.value = true formLoading.value = true
try { try {
@ -105,13 +388,67 @@ const submitForm = async () => {
/** 重置表单 */ /** 重置表单 */
const resetForm = () => { const resetForm = () => {
formData.value = { formData.value = {
type: undefined, type: 'All',
name: undefined, name: undefined,
remark: undefined, remark: undefined,
sampleMethod: undefined, sampleMethod: undefined,
val: undefined, val: undefined,
item: undefined, item: undefined,
} }
rateVal.value = undefined
gapInterval.value = undefined
gapCount.value = undefined
selectedItemIds.value = []
sourceKeyword.value = ''
targetKeyword.value = ''
sourceCheckedKeys.value = []
targetCheckedKeys.value = []
formRef.value?.resetFields() formRef.value?.resetFields()
} }
</script> </script>
<style scoped>
.formula-config-picklist {
display: flex;
width: 100%;
}
.formula-config-panel {
width: calc((100% - 96px) / 2);
border: 1px solid var(--el-border-color);
border-radius: 4px;
overflow: hidden;
background: var(--el-bg-color);
}
.formula-config-panel__header {
display: flex;
justify-content: space-between;
padding: 10px 12px;
border-bottom: 1px solid var(--el-border-color);
font-weight: 600;
}
.formula-config-panel__meta {
color: var(--el-text-color-secondary);
font-weight: 400;
}
.formula-config-panel__filter {
padding: 10px 12px;
border-bottom: 1px solid var(--el-border-color);
}
.formula-config-panel__table {
width: 100%;
}
.formula-config-actions {
width: 96px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
gap: 12px;
}
</style>

@ -1,97 +1,58 @@
<template> <template>
<ContentWrap> <ContentWrap>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<el-form <el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="类型" prop="type">
<el-select
v-model="queryParams.type"
placeholder="请选择类型"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="名称" prop="name"> <el-form-item label="名称" prop="name">
<el-input <el-input
v-model="queryParams.name" v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter="handleQuery"
placeholder="请输入名称" class="!w-240px" />
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="类型" prop="type">
<el-input <el-select v-model="queryParams.type" placeholder="请选择类型" clearable class="!w-240px">
v-model="queryParams.remark" <el-option
placeholder="请输入备注" v-for="dict in getDictOptions('mes_zj_schema_type')" :key="dict.value" :label="dict.label"
clearable :value="dict.value" />
@keyup.enter="handleQuery" </el-select>
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item label="抽检方式" prop="sampleMethod"> <el-form-item label="抽检方式" prop="sampleMethod">
<el-input <el-select v-model="queryParams.sampleMethod" placeholder="请选择抽检方式" clearable class="!w-240px">
v-model="queryParams.sampleMethod" <el-option
placeholder="请输入抽检方式" v-for="dict in getDictOptions('mes_zj_schema_sample_method')" :key="dict.value" :label="dict.label"
clearable :value="dict.value" />
@keyup.enter="handleQuery" </el-select>
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item label="值" prop="val"> <el-form-item label="值" prop="val">
<el-input v-model="queryParams.val" placeholder="请输入值" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input <el-input
v-model="queryParams.val" v-model="queryParams.remark" placeholder="请输入备注" clearable @keyup.enter="handleQuery"
placeholder="请输入值" class="!w-240px" />
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item label="关联项目" prop="item"> <el-form-item label="关联项目" prop="item">
<el-input <el-input
v-model="queryParams.item" v-model="queryParams.item" placeholder="请输入关联项目" clearable @keyup.enter="handleQuery"
placeholder="请输入关联项目" class="!w-240px" />
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item> </el-form-item>
<el-form-item label="创建时间" prop="createTime"> <el-form-item label="创建时间" prop="createTime">
<el-date-picker <el-date-picker
v-model="queryParams.createTime" v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="开始日期" end-placeholder="结束日期"
type="daterange" :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-220px" />
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button> <el-button @click="handleQuery">
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> <Icon icon="ep:search" class="mr-5px" /> 搜索
<el-button </el-button>
type="primary" <el-button @click="resetQuery">
plain <Icon icon="ep:refresh" class="mr-5px" /> 重置
@click="openForm('create')" </el-button>
v-hasPermi="['mes:zj-schema:create']" <el-button type="primary" plain @click="openForm('create')" v-hasPermi="['mes:zj-schema:create']">
>
<Icon icon="ep:plus" class="mr-5px" /> 新增 <Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> </el-button>
<el-button <el-button
type="success" type="success" plain @click="handleExport" :loading="exportLoading"
plain v-hasPermi="['mes:zj-schema:export']">
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:zj-schema:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出 <Icon icon="ep:download" class="mr-5px" /> 导出
</el-button> </el-button>
</el-form-item> </el-form-item>
@ -100,36 +61,52 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table
<el-table-column label="类型" align="center" prop="type" /> v-loading="loading"
:data="list"
:show-overflow-tooltip="true"
@expand-change="handleExpandChange"
>
<el-table-column type="expand">
<template #default="scope">
<el-table
v-loading="scope.row._itemLoading"
:data="scope.row._items || []"
size="small"
:show-overflow-tooltip="true"
>
<el-table-column label="名称" prop="name" align="center" />
<el-table-column label="作业方式" prop="tool" align="center" />
<el-table-column label="标准值" prop="standardVal" align="center" />
<el-table-column label="单位" prop="unit" align="center" />
<el-table-column label="上限值" prop="upperVal" align="center" />
<el-table-column label="下限值" prop="lowerVal" align="center" />
<el-table-column label="备注" prop="remark" align="center" />
</el-table>
</template>
</el-table-column>
<el-table-column label="名称" align="center" prop="name" /> <el-table-column label="名称" align="center" prop="name" />
<el-table-column label="备注" align="center" prop="remark" /> <el-table-column label="类型" align="center" prop="type">
<el-table-column label="抽检方式" align="center" prop="sampleMethod" /> <template #default="scope">
<dict-tag type="mes_zj_schema_type" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="抽检方式" align="center" prop="sampleMethod">
<template #default="scope">
<dict-tag type="mes_zj_schema_sample_method" :value="scope.row.sampleMethod" />
</template>
</el-table-column>
<el-table-column label="值" align="center" prop="val" /> <el-table-column label="值" align="center" prop="val" />
<el-table-column label="关联项目" align="center" prop="item" /> <el-table-column label="备注" align="center" prop="remark" />
<el-table-column <el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="180px" />
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px"> <el-table-column label="操作" align="center" min-width="120px">
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link type="primary" @click="openForm('update', scope.row.id)"
type="primary" v-hasPermi="['mes:zj-schema:update']">
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:zj-schema:update']"
>
编辑 编辑
</el-button> </el-button>
<el-button <el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['mes:zj-schema:delete']">
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:zj-schema:delete']"
>
删除 删除
</el-button> </el-button>
</template> </template>
@ -137,11 +114,8 @@
</el-table> </el-table>
<!-- 分页 --> <!-- 分页 -->
<Pagination <Pagination
:total="total" :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
v-model:page="queryParams.pageNo" @pagination="getList" />
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap> </ContentWrap>
<!-- 表单弹窗添加/修改 --> <!-- 表单弹窗添加/修改 -->
@ -149,6 +123,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { DictTag } from '@/components/DictTag'
import { getDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download' import download from '@/utils/download'
import { ZjSchemaApi, ZjSchemaVO } from '@/api/mes/zjschema' import { ZjSchemaApi, ZjSchemaVO } from '@/api/mes/zjschema'
@ -217,7 +193,7 @@ const handleDelete = async (id: number) => {
message.success(t('common.delSuccess')) message.success(t('common.delSuccess'))
// //
await getList() await getList()
} catch {} } catch { }
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
@ -235,8 +211,20 @@ const handleExport = async () => {
} }
} }
const handleExpandChange = async (row: any) => {
if (!row || !row.id) return
if (row._items && Array.isArray(row._items)) return
row._itemLoading = true
try {
const data = await ZjSchemaApi.getItemList(row.id)
row._items = data || []
} finally {
row._itemLoading = false
}
}
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(() => {
getList() getList()
}) })
</script> </script>

Loading…
Cancel
Save