feat:新增质量管理-检验任务页面

main
黄伟杰 2 weeks ago
parent 582bfcc676
commit 207b318dc2

@ -18,6 +18,11 @@ export const ZjSchemaApi = {
return await request.get({ url: `/mes/zj-schema/page`, params })
},
// 查询检验方案列表
getZjSchemaList: async (params?: any) => {
return await request.get({ url: `/mes/zj-schema/list`, params })
},
// 查询检验方案详情
getZjSchema: async (id: number) => {
return await request.get({ url: `/mes/zj-schema/get?id=` + id })

@ -0,0 +1,66 @@
import request from '@/config/axios'
export interface ZjTaskVO {
id: number
code: string
name: string
type: string
schemaId: number
schemaName: string
remark: string
ticket: string
orgType: string
managerId: string
managerName: string
executorId: string
executorName: string
status: string
result: string
createTime: string
roleIds?: number[]
}
export interface ZjTaskResultVO {
id: number
name: string
tool: string
standardVal: number
unit: string
upperVal: number
lowerVal: number
remark: string
images?: string
zjResult?: number
}
export const ZjTaskApi = {
getZjTaskPage: async (params: any) => {
return await request.get({ url: `/mes/zj-task/page`, params })
},
createZjTask: async (data: ZjTaskVO) => {
return await request.post({ url: `/mes/zj-task/create`, data })
},
updateZjTask: async (data: ZjTaskVO) => {
return await request.put({ url: `/mes/zj-task/update`, data })
},
deleteZjTask: async (id: number) => {
return await request.delete({ url: `/mes/zj-task/delete?id=` + id })
},
exportZjTask: async (params: any) => {
return await request.download({ url: `/mes/zj-task/export-excel`, params })
},
getZjTaskResultPage: async (params: any) => {
return await request.get({ url: `/mes/zj-task-results/page`, params })
},
batchUpdateZjTaskResults: async (
results: { id: number; taskId: number; images?: string; zjResult: number }[],
) => {
return await request.post({ url: `/mes/zj-task-results/batch-update`, data: { results } })
},
}

@ -22,15 +22,18 @@
<el-row>
<el-col :span="8">
<el-form-item label="设备" prop="deviceId">
<el-select v-model="formData.deviceId" filterable clearable :loading="deviceLoading"
<el-select
v-model="formData.deviceId" filterable clearable :loading="deviceLoading"
:disabled="isRepairMode" placeholder="请选择设备" class="!w-full">
<el-option v-for="opt in deviceOptions" :key="String(opt.value)" :label="opt.label" :value="opt.value" />
</el-select>
</el-form-item>
<el-form-item v-if="showComponentSelect" label="关键件" prop="componentId">
<el-select v-model="formData.componentId" clearable :loading="componentLoading" :disabled="isRepairMode"
<el-select
v-model="formData.componentId" clearable :loading="componentLoading" :disabled="isRepairMode"
placeholder="请选择关键件" class="!w-full">
<el-option v-for="opt in componentOptions" :key="String(opt.value)" :label="opt.label"
<el-option
v-for="opt in componentOptions" :key="String(opt.value)" :label="opt.label"
:value="opt.value" />
</el-select>
</el-form-item>
@ -54,7 +57,8 @@
<el-row>
<el-col :span="8">
<el-form-item label="维修人员" prop="acceptedBy">
<el-select v-model="formData.acceptedBy" filterable clearable placeholder="请选择维修人员" class="!w-full"
<el-select
v-model="formData.acceptedBy" filterable clearable placeholder="请选择维修人员" class="!w-full"
:disabled="isRepairMode">
<el-option v-for="item in users" :key="String(item.id)" :label="item.nickname" :value="String(item.id)" />
</el-select>
@ -62,7 +66,8 @@
</el-col>
<el-col :span="8">
<el-form-item label="验收人员" prop="confirmBy">
<el-select v-model="formData.confirmBy" filterable clearable placeholder="请选择验收人员" class="!w-full"
<el-select
v-model="formData.confirmBy" filterable clearable placeholder="请选择验收人员" class="!w-full"
:disabled="isRepairMode">
<el-option v-for="item in users" :key="String(item.id)" :label="item.nickname" :value="String(item.id)" />
</el-select>
@ -74,19 +79,22 @@
<el-row>
<el-col :span="8">
<el-form-item label="报修日期" prop="requireDate">
<el-date-picker v-model="formData.requireDate" type="date" value-format="x" placeholder="选择报修日期"
<el-date-picker
v-model="formData.requireDate" type="date" value-format="x" placeholder="选择报修日期"
class="!w-full" :disabled="repairFieldsDisabled" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="完成日期" prop="finishDate">
<el-date-picker v-model="formData.finishDate" type="date" value-format="x" placeholder="选择完成日期"
<el-date-picker
v-model="formData.finishDate" type="date" value-format="x" placeholder="选择完成日期"
class="!w-full" :disabled="repairFieldsDisabled" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="验收日期" prop="confirmDate">
<el-date-picker v-model="formData.confirmDate" type="date" value-format="x" placeholder="选择验收日期"
<el-date-picker
v-model="formData.confirmDate" type="date" value-format="x" placeholder="选择验收日期"
class="!w-full" :disabled="repairFieldsDisabled" />
</el-form-item>
</el-col>

@ -0,0 +1,262 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
<el-form-item label="单号" prop="code">
<el-input v-model="formData.code" placeholder="请输入单号" />
</el-form-item>
<el-form-item label="质检分类" prop="type">
<el-select v-model="formData.type" clearable filterable placeholder="请选择质检分类">
<el-option
v-for="dict in getStrDictOptions('mes_zj_task_type')" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="检验方案" prop="schemaId">
<el-row :gutter="8" class="w-full">
<el-col :span="22">
<el-input v-model="formData.schemaName" placeholder="请选择检验方案" readonly />
</el-col>
<el-col :span="2" class="text-right">
<el-button type="primary" @click="openSchemaDialog"></el-button>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="工单" prop="ticket">
<el-input v-model="formData.ticket" placeholder="请输入工单" />
</el-form-item>
<el-form-item label="工序" prop="orgType">
<el-select v-model="formData.orgType" clearable placeholder="请选择工序">
<el-option v-for="item in orgTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="负责人" prop="managerId">
<el-select
v-model="formData.managerId"
clearable
filterable
placeholder="请选择负责人"
@change="handleManagerChange"
>
<el-option
v-for="item in userList"
:key="item.id"
:label="item.nickname"
:value="item.id"
/>
</el-select>
</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>
<el-dialog v-model="schemaDialogVisible" title="选择检验方案" width="1200px" draggable>
<el-table :data="schemaList" v-loading="schemaLoading" height="400px" @row-click="handleSchemaRowClick">
<el-table-column width="60">
<template #default="scope">
<el-radio :label="scope.row.id" v-model="selectedSchemaId">
<span></span>
</el-radio>
</template>
</el-table-column>
<el-table-column type="index" label="序号" width="80" />
<el-table-column label="名称" prop="name" />
<el-table-column label="类型" prop="type">
<template #default="scope">
<dict-tag type="mes_zj_schema_type" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="抽检方式" 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="值" prop="val">
<template #default="scope">
{{ formatSchemaVal(scope.row.val) }}
</template>
</el-table-column>
<el-table-column label="备注" prop="remark" />
</el-table>
<template #footer>
<el-button @click="schemaDialogVisible = false"> </el-button>
<el-button type="primary" @click="confirmSelectSchema"> </el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ZjTaskApi, ZjTaskVO } from '@/api/mes/zjtask'
import { ZjSchemaApi, ZjSchemaVO } from '@/api/mes/zjschema'
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import * as UserApi from '@/api/system/user'
defineOptions({ name: 'ZjTaskForm' })
const { t } = useI18n()
const message = useMessage()
const dialogVisible = ref(false)
const dialogTitle = ref('')
const formLoading = ref(false)
const formType = ref('')
const formData = ref<{ [key: string]: any }>({
id: undefined,
code: undefined,
name: undefined,
type: undefined,
schemaId: undefined,
schemaName: undefined,
ticket: undefined,
orgType: undefined,
remark: undefined,
managerId: undefined,
managerName: undefined,
})
const formRules = reactive({
code: [{ required: true, message: '单号不能为空', trigger: 'blur' }],
type: [{ required: true, message: '质检分类不能为空', trigger: 'change' }],
schemaId: [{ required: true, message: '检验方案不能为空', trigger: 'change' }],
ticket: [{ required: true, message: '工单不能为空', trigger: 'blur' }],
orgType: [{ required: true, message: '工序不能为空', trigger: 'change' }],
})
const formRef = ref()
const schemaDialogVisible = ref(false)
const schemaLoading = ref(false)
const schemaList = ref<ZjSchemaVO[]>([])
const selectedSchemaId = ref<number | undefined>(undefined)
const orgTypeOptions = getStrDictOptions(DICT_TYPE.MES_ORG_TYPE)
const userList = ref<UserApi.UserVO[]>([])
const formatSchemaVal = (val: string | number | null | undefined) => {
if (val === null || val === undefined || val === '') return ''
const text = String(val).trim()
if (!text) return ''
if (text.includes(',')) {
const parts = text
.split(',')
.map((v) => v.trim())
.filter((v) => v)
const first = parts[0] ?? ''
const second = parts[1] ?? ''
return `每间隔${first}抽取${second}`
}
return `${text}%`
}
const loadSchemaList = async () => {
if (schemaList.value.length) return
schemaLoading.value = true
try {
const data = await ZjSchemaApi.getZjSchemaList()
schemaList.value = data || []
} finally {
schemaLoading.value = false
}
}
const openSchemaDialog = async () => {
schemaDialogVisible.value = true
await loadSchemaList()
}
const loadUserList = async () => {
if (userList.value.length) return
const data = await UserApi.getSimpleUserList()
userList.value = data || []
}
const handleSchemaRowClick = (row: ZjSchemaVO) => {
selectedSchemaId.value = row.id
}
const confirmSelectSchema = () => {
if (!selectedSchemaId.value) return
const matched = schemaList.value.find((item) => item.id === selectedSchemaId.value)
if (!matched) return
formData.value.schemaId = matched.id
formData.value.schemaName = matched.name
schemaDialogVisible.value = false
}
const resetForm = () => {
formData.value = {
id: undefined,
code: undefined,
name: undefined,
type: undefined,
schemaId: undefined,
schemaName: undefined,
ticket: undefined,
orgType: undefined,
remark: undefined,
managerId: undefined,
managerName: undefined,
}
selectedSchemaId.value = undefined
formRef.value?.resetFields()
}
const open = async (type: string, record?: ZjTaskVO) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
await loadUserList()
if (type === 'update' && record) {
formData.value = {
id: record.id,
code: record.code,
name: record.name,
type: record.type,
schemaId: record.schemaId,
schemaName: record.schemaName,
ticket: record.ticket,
orgType: record.orgType,
remark: record.remark,
managerId: record.managerId,
managerName: record.managerName,
}
selectedSchemaId.value = record.schemaId
}
}
const handleManagerChange = (value: number | undefined) => {
if (!value) {
formData.value.managerName = undefined
return
}
const matched = userList.value.find((item) => item.id === value)
formData.value.managerName = matched ? matched.nickname : undefined
}
defineExpose({ open })
const emit = defineEmits(['success'])
const submitForm = async () => {
await formRef.value.validate()
formLoading.value = true
try {
const data = formData.value as unknown as ZjTaskVO
if (formType.value === 'create') {
await ZjTaskApi.createZjTask(data)
message.success(t('common.createSuccess'))
} else {
await ZjTaskApi.updateZjTask(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
emit('success')
} finally {
formLoading.value = false
}
}
</script>

@ -0,0 +1,227 @@
<template>
<Dialog v-model="dialogVisible" :title="dialogTitle" width="1500px">
<el-table
v-loading="loading"
:data="list"
:stripe="true"
:show-overflow-tooltip="true"
:row-key="getRowKey"
>
<el-table-column type="index" label="序号" align="center" width="60" />
<el-table-column label="名称" align="center" prop="name" min-width="160" />
<el-table-column label="作业方式" align="center" prop="tool" min-width="120" />
<el-table-column label="标准值" align="center" prop="standardVal" min-width="100" />
<el-table-column label="单位" align="center" prop="unit" min-width="80" />
<el-table-column label="上限值" align="center" prop="upperVal" min-width="100" />
<el-table-column label="下限值" align="center" prop="lowerVal" min-width="100" />
<el-table-column label="图片" align="center" prop="images" width="160">
<template #default="scope">
<UploadImg
v-if="String(scope.row.zjResult) === '0'"
v-model="imageMap[String(scope.row.id)]"
:drag="false"
:show-btn-text="false"
width="64px"
height="64px"
/>
<el-image
v-else-if="scope.row.images"
:src="parseFirstImage(scope.row.images)"
:preview-src-list="parseImages(scope.row.images)"
preview-teleported
fit="cover"
style="width: 64px; height: 64px"
/>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" min-width="160" />
<el-table-column label="检验结果" align="center" prop="zjResult" width="120">
<template #default="scope">
<el-tag v-if="String(scope.row.zjResult) === '0'" type="info"></el-tag>
<el-tag v-else-if="String(scope.row.zjResult) === '1'" type="success">通过</el-tag>
<el-tag v-else-if="String(scope.row.zjResult) === '2'" type="danger">不通过</el-tag>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="200" fixed="right">
<template #default="scope">
<el-radio-group
v-if="String(scope.row.zjResult) === '0'"
v-model="decisionMap[String(scope.row.id)]"
>
<el-radio :label="1">通过</el-radio>
<el-radio :label="2">不通过</el-radio>
</el-radio-group>
<span v-else>-</span>
</template>
</el-table-column>
</el-table>
<el-pagination
v-show="total > 0"
v-model:current-page="queryParams.pageNo"
v-model:page-size="queryParams.pageSize"
:background="true"
:page-sizes="[10, 20, 30, 50, 100]"
:pager-count="7"
:total="total"
class="mt-15px mb-15px flex justify-end"
layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
<template #footer>
<el-button @click="dialogVisible = false"> </el-button>
<el-button
type="primary"
@click="handleSave"
:loading="submitLoading"
:disabled="submitLoading || !isAllSelected()"
>
</el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import type { ZjTaskResultVO } from '@/api/mes/zjtask'
import { ZjTaskApi } from '@/api/mes/zjtask'
defineOptions({ name: 'ZjTaskResultDialog' })
const dialogVisible = ref(false)
const dialogTitle = ref('检验结果')
const loading = ref(false)
const submitLoading = ref(false)
const emit = defineEmits(['success'])
const message = useMessage()
const list = ref<ZjTaskResultVO[]>([])
const total = ref(0)
const taskId = ref<number | undefined>(undefined)
const decisionMap = reactive<Record<string, number | undefined>>({})
const imageMap = reactive<Record<string, string>>({})
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
})
const open = async (id: number) => {
dialogVisible.value = true
dialogTitle.value = '检验结果'
taskId.value = id
for (const key of Object.keys(decisionMap)) delete decisionMap[key]
for (const key of Object.keys(imageMap)) delete imageMap[key]
queryParams.pageNo = 1
await getList()
}
defineExpose({ open })
const getList = async () => {
if (!taskId.value) return
loading.value = true
try {
const data = await ZjTaskApi.getZjTaskResultPage({
pageNo: queryParams.pageNo,
pageSize: queryParams.pageSize,
taskId: taskId.value,
})
list.value = data.list
total.value = data.total
for (const row of list.value) {
const id = row?.id
if (!id) continue
if (row.images && !imageMap[String(id)]) {
imageMap[String(id)] = parseFirstImage(row.images)
}
if (row.zjResult !== undefined && row.zjResult !== null && !decisionMap[String(id)]) {
decisionMap[String(id)] = Number(row.zjResult)
}
}
} finally {
loading.value = false
}
}
const handleSizeChange = () => {
queryParams.pageNo = 1
getList()
}
const handleCurrentChange = () => {
getList()
}
const getRowKey = (row: ZjTaskResultVO) => {
return String(row.id ?? '')
}
const handleSave = async () => {
if (!taskId.value) {
message.error('任务标识不存在,无法保存')
return
}
const currentTaskId = taskId.value
const hasUnselected = list.value.some((row) => {
if (!row?.id) return false
const decision = decisionMap[String(row.id)]
return decision !== 1 && decision !== 2
})
if (hasUnselected) {
message.error('请先为所有记录选择通过或不通过')
return
}
const payload: { id: number; taskId: number; images?: string; zjResult: number }[] = []
for (const row of list.value) {
if (!row?.id) continue
const decision = decisionMap[String(row.id)]
if (decision !== 1 && decision !== 2) continue
const img = imageMap[String(row.id)] || row.images
payload.push({ id: row.id, taskId: currentTaskId, images: img, zjResult: decision })
}
if (!payload.length) {
message.error('暂无需要保存的记录')
return
}
submitLoading.value = true
try {
await ZjTaskApi.batchUpdateZjTaskResults(payload)
message.success('更新成功')
emit('success')
dialogVisible.value = false
} catch {
message.error('更新失败')
} finally {
submitLoading.value = false
}
}
const parseImages = (value: any): string[] => {
if (!value) return []
if (Array.isArray(value)) return value.map(String).filter(Boolean)
return String(value)
.split(',')
.map((v) => v.trim())
.filter(Boolean)
}
const parseFirstImage = (value: any): string => {
return parseImages(value)[0] || ''
}
const isAllSelected = () => {
if (!list.value.length) return false
for (const row of list.value) {
if (!row?.id) continue
const decision = decisionMap[String(row.id)]
if (decision !== 1 && decision !== 2) return false
}
return true
}
</script>

@ -0,0 +1,228 @@
<template>
<ContentWrap>
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="80px">
<el-form-item label="单号" prop="code">
<el-input
v-model="queryParams.code" placeholder="请输入单号" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="质检分类" prop="type">
<el-select v-model="queryParams.type" clearable filterable placeholder="请选择质检分类" class="!w-240px">
<el-option
v-for="dict in getStrDictOptions('mes_zj_task_type')" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="工单" prop="ticket">
<el-input
v-model="queryParams.ticket" placeholder="请输入工单" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="工序" prop="orgType">
<el-select v-model="queryParams.orgType" clearable placeholder="请选择工序" class="!w-240px">
<el-option v-for="item in orgTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" clearable placeholder="请选择状态" class="!w-240px">
<el-option
v-for="opt in getStrDictOptions('job_status')" :key="String(opt.value)" :label="opt.label"
:value="opt.value" />
</el-select>
</el-form-item>
<el-form-item label="结果" prop="result">
<el-input
v-model="queryParams.result" placeholder="请输入结果" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
start-placeholder="开始日期" end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-260px" />
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['mes:zj-task:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['mes:zj-task:export']">
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" type="index" width="80" />
<el-table-column label="单号" align="center" prop="code" />
<el-table-column label="质检分类" align="center">
<template #default="scope">
<DictTag type="mes_zj_task_type" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<DictTag :type="'job_status'" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="工单" align="center" prop="ticket" />
<el-table-column label="工序" align="center" prop="orgType">
<template #default="scope">
<DictTag :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.orgType" />
</template>
</el-table-column>
<el-table-column label="检验方案" align="center" prop="schemaName" />
<el-table-column label="负责人" align="center" prop="managerName" />
<el-table-column label="执行人" align="center" prop="executorName" />
<el-table-column label="执行时间" align="center" prop="executeTime" :formatter="dateFormatter" width="180px" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="结果" align="center" prop="result">
<template #default="scope">
<el-tag v-if="scope.row.result === '1' || scope.row.result === 1" type="success"></el-tag>
<el-tag v-else-if="scope.row.result === '2' || scope.row.result === 2" type="danger">不通过</el-tag>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" min-width="160px">
<template #default="scope">
<el-button
link
type="warning"
@click.stop="handleRowClick(scope.row)"
>
检验
</el-button>
<el-button
link
type="primary"
@click.stop="openForm('update', scope.row)"
v-hasPermi="['mes:zj-task:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click.stop="handleDelete(scope.row.id)"
v-hasPermi="['mes:zj-task:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<Pagination
:total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
<ZjTaskForm ref="formRef" @success="getList" />
<ZjTaskResultDialog ref="resultDialogRef" @success="getList" />
</template>
<script setup lang="ts">
import { DictTag } from '@/components/DictTag'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import { ZjTaskApi, ZjTaskVO } from '@/api/mes/zjtask'
import ZjTaskForm from './ZjTaskForm.vue'
import ZjTaskResultDialog from './components/ZjTaskResultDialog.vue'
defineOptions({ name: 'ZjTask' })
const message = useMessage()
const { t } = useI18n()
const loading = ref(true)
const list = ref<ZjTaskVO[]>([])
const total = ref(0)
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
code: undefined as string | undefined,
name: undefined as string | undefined,
type: undefined as string | undefined,
schemaName: undefined as string | undefined,
ticket: undefined as string | undefined,
orgType: undefined as string | undefined,
managerName: undefined as string | undefined,
executorName: undefined as string | undefined,
status: undefined as string | undefined,
result: undefined as string | undefined,
createTime: [] as string[] | [],
})
const queryFormRef = ref()
const exportLoading = ref(false)
const orgTypeOptions = getStrDictOptions(DICT_TYPE.MES_ORG_TYPE)
const getList = async () => {
loading.value = true
try {
const data = await ZjTaskApi.getZjTaskPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
const formRef = ref()
const resultDialogRef = ref()
const openForm = (type: string, row?: ZjTaskVO) => {
formRef.value.open(type, row)
}
const handleRowClick = (row: ZjTaskVO) => {
if (!row?.id) return
resultDialogRef.value?.open(row.id)
}
const handleDelete = async (id: number) => {
try {
await message.delConfirm()
await ZjTaskApi.deleteZjTask(id)
message.success(t('common.delSuccess'))
await getList()
} catch { }
}
const handleExport = async () => {
try {
await message.exportConfirm()
exportLoading.value = true
const data = await ZjTaskApi.exportZjTask(queryParams)
download.excel(data, '检验任务.xls')
} catch {
} finally {
exportLoading.value = false
}
}
onMounted(async () => {
await getList()
})
</script>

@ -61,20 +61,12 @@ type="success" plain @click="handleExport" :loading="exportLoading"
<!-- 列表 -->
<ContentWrap>
<el-table
v-loading="loading"
:data="list"
:show-overflow-tooltip="true"
@expand-change="handleExpandChange"
>
<el-table 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"
>
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" />

Loading…
Cancel
Save