<!-- 溯源计划管理 基本信息 -->
<script name="ResultConfirmApproveBasic" lang="ts" setup>
import type { Ref } from 'vue'
import { ElLoading, ElMessage, ElMessageBox } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import dayjs from 'dayjs'
import type { IForm, IQuantityTarget } from '../resultConfirm-interface'
import type { dictType } from '@/global'
import { getDictByCode } from '@/api/system/dict'
import { SCHEDULE } from '@/utils/scheduleDict'
import ApprovalDialog from '@/components/Approval/ApprovalDialog.vue'
import useUserStore from '@/store/modules/user'
import { useCheckList } from '@/commonMethods/useCheckList'
import { UploadFile } from '@/api/file'
import SelectEquipmentDialog from '@/views/business/fieldTest/approve/dialog/selectEquipmentDialog.vue'
import { useDoubleClickTableRow, useSetAllRowReadable } from '@/commonMethods/useSetAllRowReadable'
import { addResultConfirmList, failUpdateResultConfirmList, getInfo, submit, updateResultConfirmList } from '@/api/equipment/source/resultConfirm'
const props = defineProps({
pageType: { // 页面类型 add新建 edit编辑 detail详情
type: String,
requre: true,
default: 'detail',
},
id: {
type: String,
requre: true,
},
approvalStatusName: { // 审批状态名称
type: String,
requre: true,
},
processId: {
type: String,
},
})
const emits = defineEmits(['addSuccess', 'submitSuccess'])
const user = useUserStore() // 用户信息
const form = ref<IForm>({
id: '', // 列表id
labCode: '', // 实验室代码
groupCode: '', // 组别代码
confirmNo: '', // 登记表编号
confirmName: '', // 登记表名称
createUserId: '', // 创建人id
createUserName: '', // 创建人
createTime: '', // 创建时间
planGroup: '', // 计划表组别
planYear: '', // 计划表年份
limitScope: '', // 限用范围
equipmentId: '', // 设备id
equipmentNo: '', // 统一编号
equipmentName: '', // 设备名称
model: '', // 型号规格
standardNo: '', // 所属测量标准号
standardName: '', // 所属测量标准名称
measureCategory: '', // 证书类型
measureCategoryName: '', // 证书类型名称
labelConsistent: undefined, // 是否与粘贴标识一致
certificateNo: '', // 证书编号
traceCompany: '', // 溯源机构名称
supplierConsistent: undefined, // 是否与合格供方名录一致
diagramConsistent: undefined, // 是否与溯源等级关系图一致
customerMatch: undefined, // 委托方名称是否与实际相符
customerAddressMatch: undefined, // 委托方地址是否与实际相符
equipmentCorrect: undefined, // 被检件名称是否正确
equipmentModelCorrect: undefined, // 被检件型号是否正确
equipmentNoCorrect: undefined, // 被检件编号是否正确
equipmentManufacturerCorrect: undefined, // 被检件生产厂家是否正确
onValid: undefined, // 测量设备开展检定工作时是否在有效期内
denyInfo: '', // 否则列出
fileCorrect: undefined, // 依据文件是否正确
fileNoOne: '', // 依据文件编号1
fileNoNameOne: '', // 依据文件名称1
fileNoTwo: '', // 依据文件编号2
fileNoNameTwo: '', // 依据文件名称2
fileNoThree: '', // 依据文件编号3
fileNoNameThree: '', // 依据文件名称3
fileNoFour: '', // 依据文件编号4
fileNoNameFour: '', // 依据文件名称4
conclusion: '', // 结论
traceDate: '', // 测试、校准或检定日期
dateCorrect: undefined, // 日期是否与粘贴标识一致
validDate: '', // 有效期
validDateCorrect: undefined, // 有效期是否正确
signComplete: undefined, // 签名信息是否齐全
sealComplete: undefined, // 是否盖有有效印章
meterIdentify: '', // 结果确认结论(计量标识字典code)
meterIdentifyName: '', // 结果确认结论(计量标识字典value)
certificateFile: '', // 检定证书
remark: '', // 备注
quantityTargetItem: '', // 量传指标检定项目
notQuantityTargetItem: '', // 非量传指标检定项目
})
const ruleFormRef = ref() // 表单ref
const certFormRef = ref() // 证书要素确认ref
const resultRulesRef = ref() // 结果确认ref
const equipmentRef = ref() // 设备ref
const loading = ref(false) // loading
const infoId = ref('') // id
const rules = ref<FormRules>({ // 校验规则
limitScope: [{ required: true, message: '限用范围不能为空', trigger: ['blur', 'change'] }],
equipmentNo: [{ required: true, message: '统一编号不能为空', trigger: ['blur', 'change'] }],
denyInfo: [{ required: true, message: '否则列出不能为空', trigger: ['blur', 'change'] }],
labCode: [{ required: true, message: '实验室代码不能为空', trigger: ['blur', 'change'] }],
groupCode: [{ required: true, message: '组别代码不能为空', trigger: ['blur', 'change'] }],
planYear: [{ required: true, message: '年不能为空', trigger: ['blur', 'change'] }],
planGroup: [{ required: true, message: '组不能为空', trigger: ['blur', 'change'] }],
measureCategory: [{ required: true, message: '证书类型不能为空', trigger: ['blur', 'change'] }],
labelConsistent: [{ required: true, message: '是否与粘贴标识一致不能为空', trigger: ['blur', 'change'] }],
certificateNo: [{ required: true, message: '证书编号不能为空', trigger: ['blur', 'change'] }],
traceCompany: [{ required: true, message: '溯源机构名称不能为空', trigger: ['blur', 'change'] }],
supplierConsistent: [{ required: true, message: '是否与合格供方名录一致不能为空', trigger: ['blur', 'change'] }],
diagramConsistent: [{ required: true, message: '是否与溯源等级关系图一致不能为空', trigger: ['blur', 'change'] }],
customerMatch: [{ required: true, message: '委托方名称是否与实际相符不能为空', trigger: ['blur', 'change'] }],
customerAddressMatch: [{ required: true, message: '委托方地址是否与实际相符不能为空', trigger: ['blur', 'change'] }],
equipmentCorrect: [{ required: true, message: '被检件名称是否正确不能为空', trigger: ['blur', 'change'] }],
equipmentModelCorrect: [{ required: true, message: '被检件型号是否正确不能为空', trigger: ['blur', 'change'] }],
equipmentNoCorrect: [{ required: true, message: '被检件编号是否正确不能为空', trigger: ['blur', 'change'] }],
equipmentManufacturerCorrect: [{ required: true, message: '被检件生产厂家是否正确不能为空', trigger: ['blur', 'change'] }],
onValid: [{ required: true, message: '测量设备开展检定工作时是否在有效期内不能为空', trigger: ['blur', 'change'] }],
fileCorrect: [{ required: true, message: '依据文件是否正确不能为空', trigger: ['blur', 'change'] }],
fileNoOne: [{ required: true, message: '依据文件编号1不能为空', trigger: ['blur', 'change'] }],
fileNoNameOne: [{ required: true, message: '依据文件名称1不能为空', trigger: ['blur', 'change'] }],
fileNoTwo: [{ required: true, message: '依据文件编号2不能为空', trigger: ['blur', 'change'] }],
fileNoNameTwo: [{ required: true, message: '依据文件名称2不能为空', trigger: ['blur', 'change'] }],
fileNoThree: [{ required: true, message: '依据文件编号3不能为空', trigger: ['blur', 'change'] }],
fileNoNameThree: [{ required: true, message: '依据文件名称3不能为空', trigger: ['blur', 'change'] }],
fileNoFour: [{ required: true, message: '依据文件编号4不能为空', trigger: ['blur', 'change'] }],
fileNoNameFour: [{ required: true, message: '依据文件名称4不能为空', trigger: ['blur', 'change'] }],
conclusion: [{ required: true, message: '结论不能为空', trigger: ['blur', 'change'] }],
traceDate: [{ required: true, message: '测试、校准或检定日期不能为空', trigger: ['blur', 'change'] }],
dateCorrect: [{ required: true, message: '日期是否与粘贴标识一致不能为空', trigger: ['blur', 'change'] }],
validDate: [{ required: true, message: '有效期不能为空', trigger: ['blur', 'change'] }],
validDateCorrect: [{ required: true, message: '有效期是否正确不能为空', trigger: ['blur', 'change'] }],
signComplete: [{ required: true, message: '签名信息是否齐全不能为空', trigger: ['blur', 'change'] }],
sealComplete: [{ required: true, message: '是否盖有有效印章不能为空', trigger: ['blur', 'change'] }],
meterIdentify: [{ required: true, message: '结果确认结论不能为空', trigger: ['blur', 'change'] }],
certificateFile: [{ required: true, message: '检定证书不能为空', trigger: ['blur', 'change'] }],
})
// -----------------------------------------字典--------------------------------------------------------------
const labCodeList = ref<dictType[]>([]) // 实验室代码
const groupCodeList = ref<dictType[]>([]) // 组别代码
const meterIdentifyDict = ref<dictType[]>([]) // 计量标识
const measureCategoryList = ref<dictType[]>([]) // 证书类型(即检校类别)
// 查询字典
const getDict = async () => {
// 计量标识
getDictByCode('bizMeterIdentify').then((response) => {
meterIdentifyDict.value = response.data
})
// 实验室代码
getDictByCode('bizLabCode').then((response) => {
labCodeList.value = response.data
})
// 组别代码
getDictByCode('bizGroupCode').then((response) => {
groupCodeList.value = response.data
})
// 证书类型(即检校类别)
getDictByCode('measureCategory').then((response) => {
measureCategoryList.value = response.data
})
}
// --------------------------------------选择设备编号-------------------------------------------------
const selectEquipmentDialogRef = ref() // 选择设备编号组件ref
// 批量添加
const selectEquipment = () => {
selectEquipmentDialogRef.value.initDialog()
}
// 确定选择设备
const confirmSelectEquipment = (val: any) => {
console.log(val[0])
if (val.length) {
form.value.equipmentId = val[0].id // 设备id
form.value.equipmentNo = val[0].equipmentNo // 统一编号
form.value.equipmentName = val[0].equipmentName // 设备名称
form.value.model = val[0].model // 型号规格
form.value.standardNo = val[0].standardNo // 所属测量标准号
form.value.standardName = val[0].standardName // 所属测量标准名称
}
}
// ----------------------------------------------依据文件-------------------------------------------
const showFileTree = ref(false) // 是否显示第三个依据文件
const showFileFour = ref(false) // 是否显示第四个依据文件
// 点击增加依据文件
const addFile = () => {
if (!showFileTree.value) {
showFileTree.value = true
}
else {
showFileFour.value = true
}
}
// ------------------------------------------量传指标------------------------------------------------
const quantityTargetColumns = ref([ // 表头
{ text: '测量范围', value: 'measureRange', align: 'center', required: true },
{ text: '使用要求', value: 'useRequire', align: 'center', required: true },
{ text: '测试、校准或检定数据是否满足使用要求', value: 'meetRequire', align: 'center', required: true },
{ text: '如不满足,请写明范围', value: 'reason', align: 'center' },
])
const quantityTargetList = ref<IQuantityTarget[]>([]) // 量传指标列表
const checkoutQuantityTargetList = ref<IQuantityTarget[]>([]) // 量传指标选中
const notQuantityTargetList = ref<IQuantityTarget[]>([]) // 非量传指标列表
const checkoutNotQuantityTargetList = ref<IQuantityTarget[]>([]) // 非量传指标选中
// 量传指标选中
const handleTechSelectionQuantityTargetChange = (e: any) => {
checkoutQuantityTargetList.value = e
}
// 非量传指标选中
const handleTechSelectionNotQuantityTargetChange = (e: any) => {
checkoutNotQuantityTargetList.value = e
}
// 点击增加行
const addRow = (type: string) => {
if (type === 'quantityTarget') { // 量传指标
const checkResult = useCheckList(quantityTargetList.value, quantityTargetColumns.value, '量传指标', 'reason', 'meetRequire', 0) // 检查表格
if (checkResult) {
useSetAllRowReadable(quantityTargetList.value)
quantityTargetList.value.push({
id: '',
measureRange: '', // 测量范围
useRequire: '', // 使用要求
meetRequire: '', // 测试、校准或检定数据是否满足使用要求
reason: '', // 如不满足,请写明范围
editable: props.pageType === 'edit',
})
}
}
else {
const checkResult = useCheckList(notQuantityTargetList.value, quantityTargetColumns.value, '非量传指标', 'reason', 'meetRequire', 0) // 检查表格
if (checkResult) {
useSetAllRowReadable(notQuantityTargetList.value)
notQuantityTargetList.value.push({
id: '',
measureRange: '', // 测量范围
useRequire: '', // 使用要求
meetRequire: '', // 测试、校准或检定数据是否满足使用要求
reason: '', // 如不满足,请写明范围
editable: props.pageType === 'edit',
})
}
}
}
// 删除行
const deleteRow = (type: string) => {
if (type === 'quantityTarget') { // 量传指标
if (!checkoutQuantityTargetList.value.length) {
ElMessage({
message: '请选中要删除的行',
type: 'warning',
})
return false
}
quantityTargetList.value = quantityTargetList.value.filter((item: any) => {
return !checkoutQuantityTargetList.value.includes(item)
})
}
else { // 非量传指标
if (!checkoutNotQuantityTargetList.value.length) {
ElMessage({
message: '请选中要删除的行',
type: 'warning',
})
return false
}
notQuantityTargetList.value = notQuantityTargetList.value.filter((item: any) => {
return !checkoutNotQuantityTargetList.value.includes(item)
})
}
}
// 双击行--量传指标
const rowDblclickQuantityTarget = (row: any) => {
if (props.pageType !== 'detail') {
useDoubleClickTableRow(row, checkoutQuantityTargetList.value)
}
}
// 双击行--非量传指标
const rowDblclickNotQuantityTarget = (row: any) => {
if (props.pageType !== 'detail') {
useDoubleClickTableRow(row, checkoutNotQuantityTargetList.value)
}
}
// -------------------------------------------文件上传--------------------------------------
const fileRef = ref() // 文件上传input
const onFileChange = (event: any) => {
if (event.target.files?.length !== 0) {
// 创建formdata对象
const fd = new FormData()
fd.append('multipartFile', event.target.files[0])
const loading = ElLoading.service({
lock: true,
background: 'rgba(255, 255, 255, 0.8)',
})
UploadFile(fd).then((res) => {
if (res.code === 200) {
form.value.certificateFile = res.data[0]
// 重置当前验证
ElMessage.success('文件上传成功')
loading.close()
}
else {
ElMessage.error(res.message)
loading.close()
}
})
}
}
const upload = () => {
fileRef.value.click()
}
// -----------------------------------------------保存----------------------------------------------
/**
* 点击保存
* @param formEl 基本信息表单ref
*/
const saveForm = () => {
if (!useCheckList(quantityTargetList.value, quantityTargetColumns.value, '量传指标', 'reason', 'meetRequire', 0)) {
return false
}
if (!quantityTargetList.value.length) {
ElMessage.warning('量传指标不能为空')
return false
}
if (!useCheckList(notQuantityTargetList.value, quantityTargetColumns.value, '非量传指标', 'reason', 'meetRequire', 0)) {
return false
}
if (!notQuantityTargetList.value.length) {
ElMessage.warning('非量传指标不能为空')
return false
}
if (!form.value.quantityTargetItem) {
ElMessage.warning('量传指标检定项目不能为空')
return false
}
if (!form.value.notQuantityTargetItem) {
ElMessage.warning('非量传指标检定项目不能为空')
return false
}
if (!ruleFormRef || !certFormRef || !resultRulesRef) { return }
Promise.all([ruleFormRef.value.validate(), certFormRef.value.validate(), resultRulesRef.value.validate(), equipmentRef.value.validate()]).then(() => {
ElMessageBox.confirm(
'确认保存吗?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
},
).then(() => {
const loading = ElLoading.service({
lock: true,
text: '加载中...',
background: 'rgba(255, 255, 255, 0.8)',
})
const quantityTargetListParam = quantityTargetList.value.map((item) => {
return {
...item,
quantityTarget: '1',
item: form.value.quantityTargetItem,
}
})
const notQuantityTargetListParam = notQuantityTargetList.value.map((item) => {
return {
...item,
quantityTarget: '2',
item: form.value.notQuantityTargetItem,
}
})
const list = quantityTargetListParam.concat(notQuantityTargetListParam)
const params = {
...form.value,
id: infoId.value,
confirmName: `${form.value.planYear}年${form.value.planGroup}组测量设备测试、校准或检定结果确认登记表`,
quantityList: list,
processId: props.processId,
}
if (props.pageType === 'add') { // 新建
addResultConfirmList(params).then((res) => {
loading.close()
form.value.confirmNo = res.data.confirmNo // 计划表编号
infoId.value = res.data.id // id
emits('addSuccess', infoId.value)
ElMessage.success('已保存')
}).catch(() => {
loading.close()
})
}
else if (props.pageType === 'edit') { // 编辑
console.log(props.approvalStatusName)
if (props.approvalStatusName === '草稿箱' || props.approvalStatusName === '全部') {
updateResultConfirmList(params).then((res) => {
loading.close()
emits('addSuccess', infoId.value)
ElMessage.success('已保存')
}).catch(() => {
loading.close()
})
}
else { // '未通过' || '已取消'
failUpdateResultConfirmList(params).then((res) => {
loading.close()
emits('submitSuccess')
fetchInfo()
ElMessage.success('已保存')
}).catch(() => {
loading.close()
})
}
}
})
})
}
// ----------------------------------------------提交--------------------------------------------
// 提交
/**
*
* @param processId 流程实例id
* @param id
*/
const submitForm = (processId: string, id: string) => {
const loading = ElLoading.service({
lock: true,
text: '加载中...',
background: 'rgba(255, 255, 255, 0.6)',
})
submit({ id, formId: SCHEDULE.TRACE_RESULT_VERIFICATION_APPROVAL }).then((res) => {
ElMessage.success('已提交')
emits('submitSuccess')
loading.close()
})
}
// -----------------------------------------获取详情------------------------------------------
// 获取详情
function fetchInfo() {
loading.value = true
getInfo({ id: infoId.value }).then((res) => {
loading.value = false
form.value = res.data
form.value.planYear = `${res.data.planYear}`
quantityTargetList.value = res.data.quantityList.filter((item: { quantityTarget: string }) => item.quantityTarget === '1') // 量传指标
notQuantityTargetList.value = res.data.quantityList.filter((item: { quantityTarget: string }) => item.quantityTarget === '2') // 非量传指标
if (props.pageType === 'detail') {
quantityTargetList.value = quantityTargetList.value.map((item) => {
return {
...item,
editable: false,
}
})
notQuantityTargetList.value = notQuantityTargetList.value.map((item) => {
return {
...item,
editable: false,
}
})
}
else {
quantityTargetList.value = quantityTargetList.value.map((item) => {
return {
...item,
editable: true,
}
})
notQuantityTargetList.value = notQuantityTargetList.value.map((item) => {
return {
...item,
editable: true,
}
})
console.log(quantityTargetList.value)
}
form.value.quantityTargetItem = quantityTargetList.value[0].item // 量传指标检定项目
form.value.notQuantityTargetItem = notQuantityTargetList.value[0].item // 非量传指标检定项目
})
}
// ---------------------------------------------钩子----------------------------------------------
watch(() => props.id, (newValue) => {
infoId.value = newValue!
if (infoId.value) {
fetchInfo() // 获取详情信息
}
}, { immediate: true })
onMounted(() => {
getDict()
form.value.createUserId = user.id// 创建人id
form.value.createUserName = user.name // 创建人名字
form.value.createTime = dayjs().format('YYYY-MM-DD HH:mm:ss')// 创建时间
if (props.pageType !== 'add' && infoId.value) {
fetchInfo() // 获取详情信息
}
})
defineExpose({ saveForm, submitForm, fetchInfo })
</script>
<template>
<div class="result-confirm">
<detail-block v-loading="loading" title="">
<el-form
ref="ruleFormRef"
:model="form"
:label-width="120"
label-position="right"
:rules="rules"
>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="登记表编号:" prop="confirmNo">
<el-input v-model="form.confirmNo" disabled placeholder="系统自动生成" />
</el-form-item>
</el-col>
<el-col :span="12" style="display: flex;line-height: 32px;">
<el-form-item label="登记表名称:" />
<el-form-item label-width="0" prop="planYear" style="width: 90px;">
<el-date-picker
v-model="form.planYear"
type="year"
placeholder="选择年"
format="YYYY"
value-format="YYYY"
:disabled="pageType === 'detail'"
/>
</el-form-item>
<span style="margin: 0 8px;font-size: 14px;color: #606266;">年</span>
<el-form-item label-width="0" prop="planGroup" style="width: 90px;">
<!-- <el-select v-model="form.planGroup" placeholder="选择组">
<el-option
v-for="item in planGroupList"
:key="item.value"
:value="item.value"
:label="item.name"
/>
</el-select> -->
<el-input v-model="form.planGroup" :disabled="pageType === 'detail'" placeholder="输入组" />
</el-form-item>
<span style="margin: 0 8px;font-size: 14px;color: #606266;">组测量设备测试、校准或检定结果确认登记表</span>
</el-col>
<el-col :span="6">
<el-form-item label="实验室代码" prop="labCode">
<el-select
v-model="form.labCode"
:placeholder="pageType === 'detail' ? ' ' : '请选择实验室代码'"
:disabled="pageType === 'detail'"
class="full-width-input"
>
<el-option
v-for="item in labCodeList"
:key="item.id"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="组别代码" prop="groupCode">
<el-select
v-model="form.groupCode"
:placeholder="pageType === 'detail' ? ' ' : '请选择组别代码'"
:disabled="pageType === 'detail'"
class="full-width-input"
>
<el-option
v-for="item in groupCodeList"
:key="item.id"
:label="item.name"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="创建人:">
<el-input
v-model="form.createUserName" disabled
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="创建时间:" prop="createTime">
<el-date-picker
v-model="form.createTime"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="限用范围:" prop="limitScope">
<el-input v-model="form.limitScope" :disabled="pageType === 'detail'" :placeholder="pageType === 'detail' ? '' : '请输入限用范围'" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</detail-block>
<detail-block v-loading="loading" title="测量设备基本信息">
<el-form
ref="equipmentRef"
:model="form"
:label-width="120"
label-position="right"
:rules="rules"
>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="统一编号:" prop="equipmentNo">
<el-input
v-model="form.equipmentNo"
:placeholder="pageType === 'detail' ? '' : '请选择统一编号'"
:class="{ 'detail-input': pageType === 'detail' }"
disabled
>
<template v-if="pageType !== 'detail'" #append>
<el-button size="small" @click="selectEquipment">
选择
</el-button>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="设备名称:" prop="equipmentName">
<el-input v-model="form.equipmentName" disabled placeholder="设备名称" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="型号规格" prop="model">
<el-input
v-model.trim="form.model"
placeholder="型号规格"
disabled
class="full-width-input"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="所属测量标准名称:" prop="standardName" label-width="140px">
<el-input
v-model.trim="form.standardName"
placeholder="所属测量标准名称"
class="detail-input"
disabled
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</detail-block>
<detail-block v-loading="loading" title="证书相关要素确认">
<el-form
ref="certFormRef"
:model="form"
:label-width="200"
label-position="right"
:rules="rules"
>
<el-row :gutter="24">
<el-col :span="8">
<el-form-item label="证书类型:" prop="measureCategory">
<el-radio-group v-model="form.measureCategory" :disabled="pageType === 'detail'">
<el-radio :label="1">
测试
</el-radio>
<el-radio label="2">
校准
</el-radio>
<el-radio label="3">
检定
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否与粘贴标识一致:" prop="labelConsistent">
<el-radio-group v-model="form.labelConsistent" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="证书编号:" prop="certificateNo">
<el-input
v-model="form.certificateNo"
:placeholder="pageType === 'detail' ? '' : '请输入证书编号'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="溯源机构名称:" prop="traceCompany">
<el-input
v-model="form.traceCompany"
:placeholder="pageType === 'detail' ? '' : '请输入溯源机构名称'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否与合格供方名录一致:" prop="supplierConsistent">
<el-radio-group v-model="form.supplierConsistent" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否与溯源等级关系图一致:" prop="diagramConsistent">
<el-radio-group v-model="form.diagramConsistent" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="委托方名称是否与实际相符:" prop="customerMatch">
<el-radio-group v-model="form.customerMatch" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="委托方地址是否与实际相符:" prop="customerAddressMatch">
<el-radio-group v-model="form.customerAddressMatch" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="被检件名称是否正确:" prop="equipmentCorrect">
<el-radio-group v-model="form.equipmentCorrect" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="被检件型号是否正确:" prop="equipmentModelCorrect">
<el-radio-group v-model="form.equipmentModelCorrect" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="被检件编号是否正确:" prop="equipmentNoCorrect">
<el-radio-group v-model="form.equipmentNoCorrect" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="被检件生产厂家是否正确:" prop="equipmentManufacturerCorrect">
<el-radio-group v-model="form.equipmentManufacturerCorrect" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="测量设备开展检定工作时是否在有效期内:" prop="onValid">
<el-radio-group v-model="form.onValid" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col v-if="form.onValid === 0" :span="16">
<el-form-item label="否则列出:" prop="denyInfo">
<el-input
v-model="form.denyInfo"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="8">
<el-form-item label="依据文件" style="font-weight: 600;" />
</el-col>
<el-col :span="8">
<el-form-item label="依据文件是否正确:" prop="fileCorrect">
<el-radio-group v-model="form.fileCorrect" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="编号1:" prop="fileNoOne">
<el-input
v-model="form.fileNoOne"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入编号'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="名称1:" prop="fileNoNameOne">
<el-input
v-model="form.fileNoNameOne"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入名称'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="编号2:" prop="fileNoTwo">
<el-input
v-model="form.fileNoTwo"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入编号'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="名称2:" prop="fileNoNameTwo">
<div style="display: flex;flex-wrap: nowrap;">
<el-input
v-model="form.fileNoNameTwo"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入名称'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
style="flex: 1;"
/>
<icon-button v-if="!showFileTree && pageType !== 'detail'" style="margin-left: 10px;" size="20" icon="icon-add" title="新建" type="primary" @click="addFile" />
</div>
</el-form-item>
</el-col>
<el-col v-if="showFileTree" :span="8">
<el-form-item label="编号3:" prop="fileNoThree">
<el-input
v-model="form.fileNoThree"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入编号'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
/>
</el-form-item>
</el-col>
<el-col v-if="showFileTree" :span="8">
<el-form-item label="名称3:" prop="fileNoNameThree">
<div style="display: flex;flex-wrap: nowrap;">
<el-input
v-model="form.fileNoNameThree"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入名称'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
/>
<icon-button v-if="!showFileFour && pageType !== 'detail'" style="margin-left: 10px;" size="20" icon="icon-add" title="新建" type="primary" @click="addFile" />
</div>
</el-form-item>
</el-col>
<el-col v-if="showFileFour" :span="8">
<el-form-item label="编号4:" prop="fileNoFour">
<el-input
v-model="form.fileNoFour"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入编号'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
/>
</el-form-item>
</el-col>
<el-col v-if="showFileFour" :span="8">
<el-form-item label="名称4:" prop="fileNoNameFour">
<el-input
v-model="form.fileNoNameFour"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入名称'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
/>
</el-form-item>
</el-col>
<el-col :span="16">
<el-form-item label="结论:" prop="conclusion">
<el-input
v-model="form.conclusion"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入结论'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="8">
<el-form-item label="测试、校准或检定日期:" prop="traceDate">
<el-date-picker
v-model="form.traceDate"
type="date"
:placeholder="pageType === 'detail' ? ' ' : '测试、校准或检定日期'"
class="full-width-input"
:class="{ 'detail-input': pageType === 'detail' }"
:disabled="pageType === 'detail'"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="日期是否与粘贴标识一致:" prop="dateCorrect">
<el-radio-group v-model="form.dateCorrect" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="有效期:" prop="validDate">
<el-date-picker
v-model="form.validDate"
type="datetime"
:placeholder="pageType === 'detail' ? ' ' : '有效期'"
class="full-width-input"
:class="{ 'detail-input': pageType === 'detail' }"
:disabled="pageType === 'detail'"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="有效期是否正确:" prop="validDateCorrect">
<el-radio-group v-model="form.validDateCorrect" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="签名信息是否齐全:" prop="signComplete">
<el-radio-group v-model="form.signComplete" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否盖有有效印章:" prop="sealComplete">
<el-radio-group v-model="form.sealComplete" :disabled="pageType === 'detail'">
<el-radio :label="1">
是
</el-radio>
<el-radio :label="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form>
</detail-block>
<detail-block v-loading="loading" title="相关数据信息确认">
<detail-block title="量传指标">
<div>
<div class="tech-file">
<span class="file-text">检定项目: <span v-if="pageType === 'detail'"> {{ form.quantityTargetItem }} </span></span>
<el-input
v-if="pageType !== 'detail'"
v-model.trim="form.quantityTargetItem"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入检定项目'"
:disabled="pageType === 'detail'"
style="width: 50%;"
/>
</div>
</div>
<template v-if="pageType !== 'detail'" #btns>
<el-button type="primary" @click="addRow('quantityTarget')">
增加行
</el-button>
<el-button type="info" @click="deleteRow('quantityTarget')">
删除行
</el-button>
</template>
<el-table
ref="techRef"
:data="quantityTargetList"
border
style="width: 100%;"
@selection-change="handleTechSelectionQuantityTargetChange"
@row-dblclick="rowDblclickQuantityTarget"
>
<el-table-column v-if="pageType !== 'detail'" type="selection" width="38" />
<el-table-column align="center" label="序号" width="80" type="index" />
<el-table-column
v-for="item in quantityTargetColumns"
:key="item.value"
:prop="item.value"
:label="item.text"
align="center"
>
<template #header>
<span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span>
</template>
<template #default="scope">
<span v-if="pageType === 'detail' && item.value !== 'meetRequire'">{{ scope.row[item.value] }}</span>
<span v-if="pageType === 'detail' && item.value === 'meetRequire'">{{ scope.row[item.value] === 0 ? '不满足' : scope.row[item.value] === 1 ? '满足' : '未知' }}</span>
<el-input v-if="pageType !== 'detail' && item.value !== 'meetRequire'" v-model="scope.row[item.value]" :autofocus="true" :placeholder="`${item.text}`" class="input" />
<el-radio-group v-if="pageType !== 'detail' && item.value === 'meetRequire'" v-model="scope.row[item.value]" :disabled="pageType === 'detail'">
<el-radio :label="1">
满足
</el-radio>
<el-radio :label="0">
不满足
</el-radio>
</el-radio-group>
</template>
</el-table-column>
</el-table>
</detail-block>
<detail-block title="非量传指标">
<div class="tech-file">
<span class="file-text">检定项目: <span v-if="pageType === 'detail'">{{ form.notQuantityTargetItem }}</span></span>
<el-input
v-if="pageType !== 'detail'"
v-model.trim="form.notQuantityTargetItem"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入检定项目'"
:disabled="pageType === 'detail'"
style="width: 50%;"
/>
</div>
<template v-if="pageType !== 'detail'" #btns>
<el-button type="primary" @click="addRow('notQuantityTarget')">
增加行
</el-button>
<el-button type="info" @click="deleteRow('notQuantityTarget')">
删除行
</el-button>
</template>
<el-table
ref="techRef"
:data="notQuantityTargetList"
border
style="width: 100%;"
@selection-change="handleTechSelectionNotQuantityTargetChange"
@row-dblclick="rowDblclickNotQuantityTarget"
>
<el-table-column v-if="pageType !== 'detail'" type="selection" width="38" />
<el-table-column align="center" label="序号" width="80" type="index" />
<el-table-column
v-for="item in quantityTargetColumns"
:key="item.value"
:prop="item.value"
:label="item.text"
align="center"
>
<template #header>
<span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span>
</template>
<template #default="scope">
<span v-if="pageType === 'detail' && item.value !== 'meetRequire'">{{ scope.row[item.value] }}</span>
<span v-if="pageType === 'detail' && item.value === 'meetRequire'">{{ scope.row[item.value] === 0 ? '不满足' : scope.row[item.value] === 1 ? '满足' : '未知' }}</span>
<el-input v-if="pageType !== 'detail' && item.value !== 'meetRequire'" v-model="scope.row[item.value]" :autofocus="true" :placeholder="`${item.text}`" class="input" />
<el-radio-group v-if="pageType !== 'detail' && item.value === 'meetRequire'" v-model="scope.row[item.value]" :disabled="pageType === 'detail'">
<el-radio :label="1">
满足
</el-radio>
<el-radio :label="0">
不满足
</el-radio>
</el-radio-group>
</template>
</el-table-column>
</el-table>
</detail-block>
</detail-block>
<detail-block v-loading="loading" title="">
<el-form
ref="resultRulesRef"
:model="form"
:label-width="120"
label-position="right"
:rules="rules"
>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="结果确认结论:" prop="meterIdentify">
<el-select
v-model="form.meterIdentify"
:placeholder="pageType === 'detail' ? ' ' : '请选择结果确认结论'"
:disabled="pageType === 'detail'"
class="full-width-input"
>
<el-option v-for="item of meterIdentifyDict" :key="item.value" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="14">
<el-form-item label="备注:">
<el-input
v-model="form.remark"
type="textarea"
autosize
:placeholder="pageType === 'detail' ? '' : '请输入备注'"
:disabled="pageType === 'detail'"
:class="{ 'detail-input': pageType === 'detail' }"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" class="marg">
<el-col :span="24">
<el-form-item label="检定证书:" prop="certificateFile">
<show-photo v-if="form.certificateFile" :minio-file-name="form.certificateFile" />
<span v-else-if="pageType === 'detail'">无</span>
<input v-show="pageType === ''" ref="fileRef" type="file" @change="onFileChange">
<el-button v-if="pageType !== 'detail'" id="file" type="primary" :disabled="pageType === 'detail'" :style="{ 'margin-left': form.certificateFile === '' ? '0px' : '20px' }" @click="upload">
{{ form.certificateFile === '' ? '上传' : '更换附件' }}
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</detail-block>
<!-- 选择设备台账 -->
<select-equipment-dialog ref="selectEquipmentDialogRef" @confirm="confirmSelectEquipment" />
</div>
</template>
<style lang="scss" scoped>
.tech-file {
display: flex;
align-items: center;
margin-left: 20px;
margin-bottom: 10px;
.file-text {
white-space: nowrap;
margin-right: 10px;
font-size: 14px;
color: #60627f;
}
}
</style>
<style lang="scss">
.result-confirm {
.el-radio__label {
display: block !important;
}
}
</style>