Compare commits

..

7 Commits

@ -28,6 +28,9 @@ export const CriticalComponentApi = {
exportCriticalComponent: async (params: any) => { exportCriticalComponent: async (params: any) => {
return await request.download({ url: `/mes/critical-component/export-excel`, params }) return await request.download({ url: `/mes/critical-component/export-excel`, params })
},
exportDeviceComponent: async (params: any) => {
return await request.download({ url: `/mes/critical-component/export-device-component`, params })
} }
} }

@ -73,5 +73,7 @@ export const DeviceLedgerApi = {
exportDeviceLedger: async (params) => { exportDeviceLedger: async (params) => {
return await request.download({ url: `/mes/device-ledger/export-excel`, params }) return await request.download({ url: `/mes/device-ledger/export-excel`, params })
}, },
exportSpareBased: async (params) => {
return await request.download({ url: `/mes/device-ledger/export-spare-based`, params })
}
} }

@ -18,6 +18,11 @@ export const ZjSchemaApi = {
return await request.get({ url: `/mes/zj-schema/page`, params }) 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) => { getZjSchema: async (id: number) => {
return await request.get({ url: `/mes/zj-schema/get?id=` + id }) 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 } })
},
}

@ -69,7 +69,7 @@ ref="tableRef" v-loading="loading" :data="list" :stripe="true" :show-overflow-to
<!-- <el-table-column label="ID" align="center" prop="id" /> --> <!-- <el-table-column label="ID" align="center" prop="id" /> -->
<el-table-column label="点位编码" align="center" prop="attributeCode" /> <el-table-column label="点位编码" align="center" prop="attributeCode" />
<el-table-column label="点位名称" align="center" prop="attributeName" /> <el-table-column label="点位名称" align="center" prop="attributeName" />
<el-table-column label="点位类型" align="center" prop="attributeType" /> <el-table-column label="点位类型" align="center" prop="typeName" />
<el-table-column label="数据类型" align="center" prop="dataType" /> <el-table-column label="数据类型" align="center" prop="dataType" />
<el-table-column label="寄存器地址" align="center" prop="address" /> <el-table-column label="寄存器地址" align="center" prop="address" />
<el-table-column label="单位" align="center" prop="dataUnit" /> <el-table-column label="单位" align="center" prop="dataUnit" />

@ -127,18 +127,18 @@ link type="danger" @click="handleDelete(scope.row.id)"
<el-descriptions-item label="设备状态"> <el-descriptions-item label="设备状态">
<dict-tag type="mes_tz_status" :value="detailData?.deviceStatus" /> <dict-tag type="mes_tz_status" :value="detailData?.deviceStatus" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="设备品牌">{{ detailData?.deviceBrand ?? '' }}</el-descriptions-item> <!-- <el-descriptions-item label="设备品牌">{{ detailData?.deviceBrand ?? '' }}</el-descriptions-item> -->
<el-descriptions-item label="设备型号">{{ detailData?.deviceModel ?? '' }}</el-descriptions-item> <el-descriptions-item label="设备型号">{{ detailData?.deviceModel ?? '' }}</el-descriptions-item>
<el-descriptions-item label="设备规格">{{ detailData?.deviceSpec ?? '' }}</el-descriptions-item> <el-descriptions-item label="设备规格">{{ detailData?.deviceSpec ?? '' }}</el-descriptions-item>
<el-descriptions-item label="设备类型"> <el-descriptions-item label="设备类型">
<el-tag effect="light">{{ getDeviceTypeName(detailData?.deviceTypeName ?? detailData?.deviceType) <el-tag effect="light">{{ getDeviceTypeName(detailData?.deviceTypeName ?? detailData?.deviceType)
}}</el-tag> }}</el-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="供应商">{{ detailData?.supplier ?? '' }}</el-descriptions-item> <!-- <el-descriptions-item label="供应商">{{ detailData?.supplier ?? '' }}</el-descriptions-item> -->
<el-descriptions-item label="所属车间">{{ detailData?.workshop ?? '' }}</el-descriptions-item> <el-descriptions-item label="所属车间">{{ detailData?.workshop ?? '' }}</el-descriptions-item>
<el-descriptions-item label="所属系统组织">{{ detailData?.systemOrg ?? '' }}</el-descriptions-item> <!-- <el-descriptions-item label="所属系统组织">{{ detailData?.systemOrg ?? '' }}</el-descriptions-item> -->
<el-descriptions-item label="设备位置">{{ detailData?.deviceLocation ?? '' }}</el-descriptions-item> <el-descriptions-item label="设备位置">{{ detailData?.deviceLocation ?? '' }}</el-descriptions-item>
<el-descriptions-item label="设备负责人">{{ detailData?.deviceManager ?? '' }}</el-descriptions-item> <el-descriptions-item label="设备负责人">{{ detailData?.deviceManagerName ?? '' }}</el-descriptions-item>
<el-descriptions-item label="设备生产日期">{{ formatDetailDate(detailData?.productionDate) }}</el-descriptions-item> <el-descriptions-item label="设备生产日期">{{ formatDetailDate(detailData?.productionDate) }}</el-descriptions-item>
<el-descriptions-item label="设备入厂日期">{{ formatDetailDate(detailData?.factoryEntryDate) <el-descriptions-item label="设备入厂日期">{{ formatDetailDate(detailData?.factoryEntryDate)
}}</el-descriptions-item> }}</el-descriptions-item>
@ -334,35 +334,66 @@ link type="danger" @click="handleDelete(scope.row.id)"
</el-collapse> </el-collapse>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="关键件" name="criticalComponent"> <el-tab-pane label="关键件" name="criticalComponent">
<el-table v-loading="loading" :data="detailData?.componentList" :stripe="true" :show-overflow-tooltip="true"> <div class="device-ledger-tab-toolbar">
<el-table-column label="编码" align="center" prop="code" min-width="140" /> <el-button
<el-table-column label="名称" align="center" prop="name" min-width="140" /> type="success"
<el-table-column label="描述" align="center" prop="description" min-width="180" /> plain
<el-table-column label="备注" align="center" prop="remark" min-width="180" /> :loading="criticalExportLoading"
<el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="180" /> @click="handleExportCriticalComponent"
</el-table> v-hasPermi="['mes:device-ledger:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</div>
<el-table
v-loading="loading"
:data="detailData?.componentList"
:stripe="true"
:show-overflow-tooltip="true"
>
<el-table-column label="编码" align="center" prop="code" min-width="140" />
<el-table-column label="名称" align="center" prop="name" min-width="140" />
<el-table-column label="描述" align="center" prop="description" min-width="180" />
<el-table-column label="备注" align="center" prop="remark" min-width="180" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180"
/>
</el-table>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="备件" name="component"> <el-tab-pane label="备件" name="component">
<el-table v-loading="loading" :data="detailData?.beijianList" :stripe="true" :show-overflow-tooltip="true"> <div class="device-ledger-tab-toolbar">
<el-table-column label="备件编码" align="center" prop="barCode" /> <el-button
<el-table-column label="备件名称" align="left" prop="name" width="220px"/> type="success"
<!-- <el-table-column v-if="checkPermi(['erp:component:standard'])" label="规格" align="center" prop="standard" /> --> plain
<el-table-column label="分类" align="center" prop="categoryName" /> :loading="spareExportLoading"
<el-table-column label="单位" align="center" prop="unitName" /> @click="handleExportSpareBased"
<!-- <el-table-column label="预警库存" align="center" prop="safetyNumber" /> --> v-hasPermi="['mes:device-ledger:export']"
<!-- <el-table-column label="状态" align="center" prop="status"> >
<template #default="scope"> <Icon icon="ep:download" class="mr-5px" /> 导出
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> </el-button>
</template> </div>
</el-table-column> --> <el-table
<el-table-column v-loading="loading"
label="创建时间" :data="detailData?.beijianList"
align="center" :stripe="true"
prop="createTime" :show-overflow-tooltip="true"
:formatter="dateFormatter" >
width="180px" <el-table-column label="备件编码" align="center" prop="barCode" />
/> <el-table-column label="备件名称" align="left" prop="name" width="220px" />
</el-table> <el-table-column label="分类" align="center" prop="categoryName" />
<el-table-column label="单位" align="center" prop="unitName" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
</el-table>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="模具" name="mold"> <el-tab-pane label="模具" name="mold">
<el-table v-loading="loading" :data="detailData?.moldList" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="detailData?.moldList" :stripe="true" :show-overflow-tooltip="true">
@ -387,6 +418,7 @@ import { dateFormatter, dateFormatter2, formatDate } from '@/utils/formatTime'
import download from '@/utils/download' import download from '@/utils/download'
import { DeviceLedgerApi, DeviceLedgerVO } from '@/api/mes/deviceledger' import { DeviceLedgerApi, DeviceLedgerVO } from '@/api/mes/deviceledger'
import { DeviceTypeApi, DeviceTypeTreeVO } from '@/api/mes/devicetype' import { DeviceTypeApi, DeviceTypeTreeVO } from '@/api/mes/devicetype'
import { CriticalComponentApi } from '@/api/mes/criticalComponent'
import DeviceLedgerForm from './DeviceLedgerForm.vue' import DeviceLedgerForm from './DeviceLedgerForm.vue'
import { getIntDictOptions } from '@/utils/dict' import { getIntDictOptions } from '@/utils/dict'
import { isHexColor } from '@/utils/color' import { isHexColor } from '@/utils/color'
@ -411,6 +443,8 @@ const queryParams = reactive({
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //
const criticalExportLoading = ref(false)
const spareExportLoading = ref(false)
const tableRef = ref() const tableRef = ref()
const selectedIds = ref<number[]>([]) const selectedIds = ref<number[]>([])
@ -775,6 +809,38 @@ const handleExport = async () => {
} }
} }
const handleExportCriticalComponent = async () => {
if (!selectedDetailId.value) {
message.error('请先选择设备')
return
}
try {
await message.exportConfirm()
criticalExportLoading.value = true
const data = await CriticalComponentApi.exportDeviceComponent({ id: selectedDetailId.value })
download.excel(data, '关键件.xls')
} catch {
} finally {
criticalExportLoading.value = false
}
}
const handleExportSpareBased = async () => {
if (!selectedDetailId.value) {
message.error('请先选择设备')
return
}
try {
await message.exportConfirm()
spareExportLoading.value = true
const data = await DeviceLedgerApi.exportSpareBased({ id: selectedDetailId.value })
download.excel(data, '备件.xls')
} catch {
} finally {
spareExportLoading.value = false
}
}
/** 初始化 **/ /** 初始化 **/
onMounted(async () => { onMounted(async () => {
await dictStore.setDictMap() await dictStore.setDictMap()
@ -831,6 +897,11 @@ onMounted(async () => {
color: var(--el-text-color-secondary); color: var(--el-text-color-secondary);
} }
.device-ledger-tab-toolbar {
margin-bottom: 8px;
text-align: right;
}
.device-ledger-history-items { .device-ledger-history-items {
display: flex; display: flex;
flex-direction: column; flex-direction: column;

@ -38,21 +38,20 @@ v-for="opt in componentOptions" :key="String(opt.value)" :label="opt.label"
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="设备名称" prop="machineryName" :required="false"> <el-form-item label="设备名称" prop="machineryName" :required="false">
<el-input v-model="formData.machineryName" placeholder="自动带出" disabled /> <el-input v-model="formData.machineryName" placeholder="自动带出" disabled />
</el-form-item> </el-form-item>
<el-form-item label="设备编码" prop="machineryCode" :required="false">
<el-input v-model="formData.machineryCode" placeholder="自动带出" disabled />
</el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-form-item label="设备编码" prop="machineryCode" :required="false">
<el-input v-model="formData.machineryCode" placeholder="自动带出" disabled />
</el-form-item></el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="规格型号" prop="machinerySpec" :required="false"> <el-form-item label="规格型号" prop="machinerySpec" :required="false">
<el-input v-model="formData.machinerySpec" placeholder="自动带出" disabled /> <el-input v-model="formData.machinerySpec" placeholder="自动带出" disabled />
</el-form-item> </el-form-item>
<el-form-item label="品牌" prop="machineryBrand" :required="false">
<el-input v-model="formData.machineryBrand" placeholder="自动带出" disabled />
</el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
@ -80,17 +79,23 @@ v-model="formData.confirmBy" filterable clearable placeholder="请选择验收
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="报修日期" prop="requireDate"> <el-form-item label="报修日期" prop="requireDate">
<el-date-picker v-model="formData.requireDate" type="date" value-format="x" placeholder="选择报修日期" class="!w-full" :disabled="repairFieldsDisabled" /> <el-date-picker
v-model="formData.requireDate" type="date" value-format="x" placeholder="选择报修日期"
class="!w-full" :disabled="repairFieldsDisabled" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="完成日期" prop="finishDate"> <el-form-item label="完成日期" prop="finishDate">
<el-date-picker v-model="formData.finishDate" type="date" value-format="x" placeholder="选择完成日期" class="!w-full" :disabled="repairFieldsDisabled" /> <el-date-picker
v-model="formData.finishDate" type="date" value-format="x" placeholder="选择完成日期"
class="!w-full" :disabled="repairFieldsDisabled" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="验收日期" prop="confirmDate"> <el-form-item label="验收日期" prop="confirmDate">
<el-date-picker v-model="formData.confirmDate" type="date" value-format="x" placeholder="选择验收日期" class="!w-full" :disabled="repairFieldsDisabled" /> <el-date-picker
v-model="formData.confirmDate" type="date" value-format="x" placeholder="选择验收日期"
class="!w-full" :disabled="repairFieldsDisabled" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -102,7 +107,7 @@ v-model="formData.confirmBy" filterable clearable placeholder="请选择验收
<!-- 子表的表单 --> <!-- 子表的表单 -->
<el-tabs v-model="subTabsName"> <el-tabs v-model="subTabsName">
<el-tab-pane label="设备维修项目行" name="dvRepairLine"> <el-tab-pane label="设备维修项目行" name="dvRepairLine">
<DvRepairLineForm ref="dvRepairLineFormRef" :repair-id="formData.id" :is-repair-mode="formType === 'repair'" /> <DvRepairLineForm ref="dvRepairLineFormRef" :repair-id="formData.id" :line-mode="lineMode" />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
<template #footer> <template #footer>
@ -128,7 +133,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const isRepairMode = computed(() => formType.value === 'update' || formType.value === 'repair') const isRepairMode = computed(() => formType.value === 'update' || formType.value === 'repair')
const showRepairFields = computed(() => formType.value === 'update' || formType.value === 'repair') const showRepairFields = computed(() => formType.value === 'update' || formType.value === 'repair')
const repairFieldsDisabled = computed(() => formType.value !== 'repair') const repairFieldsDisabled = computed(() => formType.value !== 'repair')
const isHydrating = ref(false) const isHydrating = ref(false)
@ -155,6 +160,17 @@ const formData = ref({
remark: undefined, remark: undefined,
}) })
const lineMode = computed(() => {
if (formType.value === 'repair') return 'repair' as const
if (formType.value === 'update') {
const v = formData.value.status === '' || formData.value.status === null || formData.value.status === undefined
? undefined
: String(formData.value.status)
if (v === '1') return 'readonlyWithResult' as const
}
return 'edit' as const
})
const showComponentSelect = computed(() => formData.value.machineryTypeId === 2) const showComponentSelect = computed(() => formData.value.machineryTypeId === 2)
const deviceLoading = ref(false) const deviceLoading = ref(false)
@ -285,6 +301,54 @@ const formRules = reactive({
machineryCode: [{ required: true, message: '设备编码不能为空', trigger: 'blur' }], machineryCode: [{ required: true, message: '设备编码不能为空', trigger: 'blur' }],
machineryName: [{ required: true, message: '设备名称不能为空', trigger: 'blur' }], machineryName: [{ required: true, message: '设备名称不能为空', trigger: 'blur' }],
machineryTypeId: [{ required: true, message: '设备类型不能为空', trigger: 'blur' }], machineryTypeId: [{ required: true, message: '设备类型不能为空', trigger: 'blur' }],
requireDate: [
{
validator: (_: any, value: any, callback: any) => {
if (formType.value === 'repair' && !value) {
callback(new Error('报修日期不能为空'))
return
}
callback()
},
trigger: 'change',
},
],
finishDate: [
{
validator: (_: any, value: any, callback: any) => {
if (formType.value === 'repair' && !value) {
callback(new Error('完成日期不能为空'))
return
}
callback()
},
trigger: 'change',
},
],
confirmDate: [
{
validator: (_: any, value: any, callback: any) => {
if (formType.value === 'repair' && !value) {
callback(new Error('验收日期不能为空'))
return
}
callback()
},
trigger: 'change',
},
],
repairResult: [
{
validator: (_: any, value: any, callback: any) => {
if (formType.value === 'repair' && !value) {
callback(new Error('维修结果不能为空'))
return
}
callback()
},
trigger: 'blur',
},
],
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
@ -347,13 +411,13 @@ const open = async (type: string, id?: number) => {
if (currentOpenId !== openRequestId) return if (currentOpenId !== openRequestId) return
;(formData.value as any).requireDate = (formData.value as any).requireDate ?? undefined ; (formData.value as any).requireDate = (formData.value as any).requireDate ?? undefined
;(formData.value as any).finishDate = (formData.value as any).finishDate ?? undefined ; (formData.value as any).finishDate = (formData.value as any).finishDate ?? undefined
;(formData.value as any).confirmDate = (formData.value as any).confirmDate ?? undefined ; (formData.value as any).confirmDate = (formData.value as any).confirmDate ?? undefined
;(formData.value as any).repairResult = (formData.value as any).repairResult ?? '' ; (formData.value as any).repairResult = (formData.value as any).repairResult ?? ''
;(formData.value as any).acceptedBy = normalizeUserId((formData.value as any).acceptedBy) ; (formData.value as any).acceptedBy = normalizeUserId((formData.value as any).acceptedBy)
;(formData.value as any).confirmBy = normalizeUserId((formData.value as any).confirmBy) ; (formData.value as any).confirmBy = normalizeUserId((formData.value as any).confirmBy)
const typeId = typeof formData.value.machineryTypeId === 'number' ? formData.value.machineryTypeId : Number(formData.value.machineryTypeId) const typeId = typeof formData.value.machineryTypeId === 'number' ? formData.value.machineryTypeId : Number(formData.value.machineryTypeId)
formData.value.machineryTypeId = Number.isNaN(typeId) ? formData.value.machineryTypeId : typeId formData.value.machineryTypeId = Number.isNaN(typeId) ? formData.value.machineryTypeId : typeId
@ -406,16 +470,16 @@ const submitForm = async () => {
formLoading.value = true formLoading.value = true
try { try {
const data = { ...(formData.value as any) } as DvRepairVO & { deviceId?: number; componentId?: number } const data = { ...(formData.value as any) } as DvRepairVO & { deviceId?: number; componentId?: number }
;(data as any).acceptedBy = normalizeUserId((data as any).acceptedBy) ; (data as any).acceptedBy = normalizeUserId((data as any).acceptedBy)
;(data as any).confirmBy = normalizeUserId((data as any).confirmBy) ; (data as any).confirmBy = normalizeUserId((data as any).confirmBy)
if (formType.value === 'repair') { if (formType.value === 'repair') {
;(data as any).status = 1 ; (data as any).status = 1
} }
if (typeof formData.value.deviceId === 'number') { if (typeof formData.value.deviceId === 'number') {
data.machineryId = formData.value.deviceId as any data.machineryId = formData.value.deviceId as any
} }
;(data as any).deviceId = formData.value.deviceId ; (data as any).deviceId = formData.value.deviceId
;(data as any).componentId = formData.value.machineryTypeId === 2 ? formData.value.componentId : undefined ; (data as any).componentId = formData.value.machineryTypeId === 2 ? formData.value.componentId : undefined
const lineList = dvRepairLineFormRef.value.getData() || [] const lineList = dvRepairLineFormRef.value.getData() || []
if (formType.value === 'repair') { if (formType.value === 'repair') {
const requireDate = data.requireDate const requireDate = data.requireDate
@ -433,7 +497,7 @@ const submitForm = async () => {
}) })
message.success(t('common.updateSuccess')) message.success(t('common.updateSuccess'))
} else { } else {
;(data as any).dvRepairLines = lineList ; (data as any).dvRepairLines = lineList
if (formType.value === 'create') { if (formType.value === 'create') {
await DvRepairApi.createDvRepair(data) await DvRepairApi.createDvRepair(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))

@ -19,14 +19,22 @@
<el-table-column label="维修编码" min-width="150"> <el-table-column label="维修编码" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.subjectCode`" :rules="formRules.subjectCode" class="mb-0px!"> <el-form-item :prop="`${$index}.subjectCode`" :rules="formRules.subjectCode" class="mb-0px!">
<el-input v-model="row.subjectCode" placeholder="请输入维修编码" /> <el-input
v-model="row.subjectCode"
placeholder="请输入维修编码"
:disabled="props.lineMode !== 'edit'"
/>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="维修名称" min-width="150"> <el-table-column label="维修名称" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.subjectName`" :rules="formRules.subjectName" class="mb-0px!"> <el-form-item :prop="`${$index}.subjectName`" :rules="formRules.subjectName" class="mb-0px!">
<el-input v-model="row.subjectName" placeholder="请输入维修名称" /> <el-input
v-model="row.subjectName"
placeholder="请输入维修名称"
:disabled="props.lineMode !== 'edit'"
/>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
@ -40,23 +48,42 @@
<el-table-column label="维修内容" min-width="300"> <el-table-column label="维修内容" min-width="300">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.subjectContent`" :rules="formRules.subjectContent" class="mb-0px!"> <el-form-item :prop="`${$index}.subjectContent`" :rules="formRules.subjectContent" class="mb-0px!">
<el-input type="textarea" v-model="row.subjectContent" placeholder="请输入维修内容" /> <el-input
type="textarea"
v-model="row.subjectContent"
placeholder="请输入维修内容"
:disabled="props.lineMode !== 'edit'"
/>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="props.isRepairMode" label="备注" min-width="180"> <el-table-column
v-if="props.lineMode === 'repair' || props.lineMode === 'readonlyWithResult'"
label="备注"
min-width="180"
>
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" class="mb-0px!"> <el-form-item :prop="`${$index}.remark`" :rules="formRules.remark" class="mb-0px!">
<el-input v-model="row.remark" placeholder="请输入备注" /> <el-input
v-model="row.remark"
placeholder="请输入备注"
:disabled="props.lineMode !== 'repair'"
/>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="props.isRepairMode" label="结果" min-width="160"> <el-table-column
<template #default="{ row }"> v-if="props.lineMode === 'repair' || props.lineMode === 'readonlyWithResult'"
<el-radio-group v-model="row.result"> label="结果"
<el-radio label="1">通过</el-radio> min-width="160"
<el-radio label="2">不通过</el-radio> >
</el-radio-group> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.result`" :rules="formRules.result" class="mb-0px!">
<el-radio-group v-model="row.result" :disabled="props.lineMode !== 'repair'">
<el-radio :value="1">通过</el-radio>
<el-radio :value="2">不通过</el-radio>
</el-radio-group>
</el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="标准" min-width="150"> <!-- <el-table-column label="标准" min-width="150">
@ -110,7 +137,7 @@ import { DvRepairApi } from '@/api/mes/dvrepair'
const props = defineProps<{ const props = defineProps<{
repairId: undefined repairId: undefined
isRepairMode?: boolean lineMode?: 'edit' | 'repair' | 'readonlyWithResult'
}>() }>()
const formLoading = ref(false) // const formLoading = ref(false) //
const formData = ref([]) const formData = ref([])
@ -119,6 +146,30 @@ const formRules = reactive({
subjectId: [{ required: true, message: '项目ID不能为空', trigger: 'blur' }], subjectId: [{ required: true, message: '项目ID不能为空', trigger: 'blur' }],
subjectCode: [{ required: true, message: '项目编码不能为空', trigger: 'blur' }], subjectCode: [{ required: true, message: '项目编码不能为空', trigger: 'blur' }],
subjectContent: [{ required: true, message: '项目内容不能为空', trigger: 'blur' }], subjectContent: [{ required: true, message: '项目内容不能为空', trigger: 'blur' }],
remark: [
{
validator: (_: any, value: any, callback: any) => {
if (props.lineMode === 'repair' && !value) {
callback(new Error('备注不能为空'))
return
}
callback()
},
trigger: 'blur',
},
],
result: [
{
validator: (_: any, value: any, callback: any) => {
if (props.lineMode === 'repair' && (value === undefined || value === null || value === '')) {
callback(new Error('结果不能为空'))
return
}
callback()
},
trigger: 'change',
},
],
}) })
const formRef = ref() // Ref const formRef = ref() // Ref

@ -80,7 +80,7 @@ ref="tableRef" v-loading="loading" :data="list" :stripe="true" :show-overflow-to
<el-table-column label="维修单" align="center" prop="repairName" /> <el-table-column label="维修单" align="center" prop="repairName" />
<el-table-column label="设备" align="center" prop="machineryName" /> <el-table-column label="设备" align="center" prop="machineryName" />
<el-table-column label="设备编码" align="center" prop="machineryCode" /> <el-table-column label="设备编码" align="center" prop="machineryCode" />
<el-table-column label="品牌" align="center" prop="machineryBrand" /> <!-- <el-table-column label="品牌" align="center" prop="machineryBrand" /> -->
<el-table-column label="规格型号" align="center" prop="machinerySpec" /> <el-table-column label="规格型号" align="center" prop="machinerySpec" />
<el-table-column label="设备类型" align="center" prop="machineryTypeId" width="100px"> <el-table-column label="设备类型" align="center" prop="machineryTypeId" width="100px">
<template #default="scope"> <template #default="scope">

@ -49,7 +49,14 @@ v-show="total > 0" v-model:current-page="queryParams.pageNo" v-model:page-size="
<template #footer> <template #footer>
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="handleSave" :loading="submitLoading"> </el-button> <el-button
type="primary"
@click="handleSave"
:loading="submitLoading"
:disabled="submitLoading || !isAllPendingSelected()"
>
</el-button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
@ -124,6 +131,16 @@ const handleCurrentChange = () => {
} }
const handleSave = async () => { const handleSave = async () => {
const hasUnselected = list.value.some((row) => {
if (!row?.id) return false
if (String(row.inspectionResult) !== '0') return false
const decision = decisionMap[String(row.id)]
return !decision
})
if (hasUnselected) {
message.error('请先为所有待检测记录选择通过或不通过')
return
}
const payload: TicketResultVO[] = [] const payload: TicketResultVO[] = []
for (const row of list.value) { for (const row of list.value) {
if (!row?.id) continue if (!row?.id) continue
@ -150,6 +167,16 @@ const handleSave = async () => {
} }
} }
const isAllPendingSelected = () => {
for (const row of list.value) {
if (!row?.id) continue
if (String(row.inspectionResult) !== '0') continue
const decision = decisionMap[String(row.id)]
if (!decision) return false
}
return true
}
const getRowKey = (row: TicketResultVO) => { const getRowKey = (row: TicketResultVO) => {
return String(row.id ?? '') return String(row.id ?? '')
} }

@ -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> <ContentWrap>
<el-table <el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" @expand-change="handleExpandChange">
v-loading="loading"
:data="list"
:show-overflow-tooltip="true"
@expand-change="handleExpandChange"
>
<el-table-column type="expand"> <el-table-column type="expand">
<template #default="scope"> <template #default="scope">
<el-table <el-table
v-loading="scope.row._itemLoading" v-loading="scope.row._itemLoading" :data="scope.row._items || []" size="small"
:data="scope.row._items || []" :show-overflow-tooltip="true">
size="small"
:show-overflow-tooltip="true"
>
<el-table-column label="名称" prop="name" align="center" /> <el-table-column label="名称" prop="name" align="center" />
<el-table-column label="作业方式" prop="tool" align="center" /> <el-table-column label="作业方式" prop="tool" align="center" />
<el-table-column label="标准值" prop="standardVal" align="center" /> <el-table-column label="标准值" prop="standardVal" align="center" />

Loading…
Cancel
Save