<!-- 周维护、月保养详情公共组件 --> <script lang="ts" setup name="EquipementResumeWeekMonthDetail"> import { ref } from 'vue' import dayjs from 'dayjs' import { ElLoading, ElMessage } from 'element-plus' import type { IForm } from '../week-interface' import useUserStore from '@/store/modules/user' import SelectEquipmentDialog from '@/views/business/fieldTest/approve/dialog/selectEquipmentDialog.vue' import { getDictByCode } from '@/api/system/dict' import type { deptType, dictType } from '@/global' import { useArrayDataUnique } from '@/commonMethods/useArrayDataUnique' import { addResumeWeekMonthList, getEquipmentWeekOrMonthDetail, getInfo, updateResumeWeekMonthList } from '@/api/equipment/resume/week-month' import { useCheckList } from '@/commonMethods/useCheckList' import { useDoubleClickTableRow, useSetAllRowReadable } from '@/commonMethods/useSetAllRowReadable' const props = defineProps({ title: { type: String, default: '周维护', }, pageType: { type: String, default: 'detail', }, maintainType: { // 保养类型(1 周维护/2 月保养) type: String, default: '1', }, infoId: String, // id }) const user = useUserStore() // 用户信息 const textMap: { [key: string]: string } = { edit: '编辑', add: '新建', detail: '详情', }// 字典 const $router = useRouter() // 关闭页面使用 const $route = useRoute() // 路由参数 const pageType = ref('add') // 页面类型: add, edit, detail const currentTab = ref('') // 1待维护、2全部维护记录 const ruleFormRef = ref() // 表单ref const form = ref<IForm>({ id: '', // id,更新/删除使用参数 logNo: '', // 记录编号 logName: '', // 记录编号 labCode: '', // 实验室代码(字典code) labCodeName: '', // 实验室代码(字典value) groupCode: '', // 组别代码(字典code) groupCodeName: '', // 组别代码(字典value) createTime: '', // 记录时间 createUserId: '', // 记录人id createUserName: '', // 记录人 remark: '', // 备注 equipmentId: '', // 设备台账id equipmentName: '', // 设备名称(设备名称+规格型号+出厂编号) checkResult: '', // 检查结果(字典code) checkResultName: '', // 检查结果(字典value) maintainType: Number(props.maintainType), // 保养类型(1 周维护/2 月保养) appearanceCheck: 1, // 外观检查(1正常0不正常) appearanceCheckRemark: '', // 外观检查备注 calibrationFactor: 1, // 校准因子(1正常0不正常) calibrationFactorRemark: '', // 校准因子备注 folderCheck: 1, // 备附件和资料检查(1正常0不正常) folderCheckRemark: '', // 备附件和资料检查备注 functionCheck: 1, // 设备功能、性能检查(1正常0不正常) functionCheckRemark: '', // 设备功能、性能检查备注 ignored: 0, // 本次是否已忽略(1/0) oilCheck: 1, // 设备油液检查(1正常0不正常) oilCheckRemark: '', // 设备油液检查备注 powerCheck: 1, // 设备加电检查(1正常0不正常) powerCheckRemark: '', // 设备加电检查备注 softwareCheck: 1, // 软件检查、杀毒(1正常0不正常) softwareCheckRemark: '', // 软件检查、杀毒备注 }) // 校验规则 const formRules = ref({ groupCode: [{ required: true, message: '部门不能为空', trigger: ['blur', 'change'] }], labCode: [{ required: true, message: '实验室不能为空', trigger: ['blur', 'change'] }], }) const loading = ref(false) // ------------------------------------------字典---------------------------------------------- const useDeptList = ref<deptType[]>([]) // 所属部门列表 const useDeptDict = ref([]) as any // 所属部门字典 const labNameList = ref<deptType[]>([]) // 实验室列表 const labNameDict = ref([]) as any // 实验室字典 /** * 获取字典 */ async function getDict() { // 实验室 const responseLab = await getDictByCode('bizGroupCodeEquipment') labNameList.value = responseLab.data labNameList.value.forEach((item) => { labNameDict.value[item.value] = item.name }) // 部门 const responseDept = await getDictByCode('bizGroupCode') useDeptList.value = responseDept.data responseDept.data.forEach((item: any) => { useDeptDict.value[item.value] = item.name }) } // -------------------------------------------表格---------------------------------------------- const columns = ref([ // 表头 { text: '维护项目', value: 'item', align: 'center', required: true }, { text: '检查结果', value: 'result', align: 'center', required: true, width: '180' }, { text: '备注', value: 'remark', align: 'center', required: false }, ]) const list = ref([]) as any // 表格数据 const checkoutList = ref([]) as any // 多选表格数据 // 选中 const handleSelectionChange = (e: any) => { checkoutList.value = e } // 校验维护项目有没有重复 const checkItemUnique = () => { const result = useArrayDataUnique(list.value, 'item') if (!result) { ElMessage.warning('表格中存在重复维护项目,请检查!') return false } return true } // 增加行 const addRow = () => { if (!checkItemUnique()) { return false } if (!useCheckList(list.value, columns.value, '维护保养信息')) { return false } if (!useCheckList(list.value, columns.value, '维护保养信息', 'remark', 'result', '0')) { return false } list.value.push({ item: '', result: '1', remark: '', customer: true, }) } // 删除行 const deleteRow = () => { if (!checkoutList.value.length) { ElMessage({ message: '请选中要删除的行', type: 'warning', }) return false } list.value = list.value.filter((item: any) => { return !checkoutList.value.includes(item) }) } // --------------------------------------选择设备------------------------------------------------- const selectEquipmentDialogRef = ref() // 批量添加 const selectEquipment = () => { selectEquipmentDialogRef.value.initDialog(form.value.labCode, form.value.groupCode) } // 确定选择设备 const confirmSelectEquipment = (list: any = []) => { if (Array.isArray(list) && list.length) { form.value.equipmentName = list[0].equipmentName + list[0].model + list[0].manufactureNo } if (list[0].id) { getEquipmentWeekOrMonthDetail({ id: list[0].id }).then((res) => { // }) } } // -------------------------------------------按钮---------------------------------------------- // 关闭新增页面的回调 const close = () => { $router.back() } // 导出pdf const exportPdf = () => { ElMessage.info('敬请期待') } // 保存 const save = () => { if (!checkItemUnique()) { return } if (!list.value.length) { ElMessage.warning('维护保养信息不能为空') return false } if (!useCheckList(list.value, columns.value, '维护保养信息')) { return false } if (!useCheckList(list.value, columns.value, '维护保养信息', 'remark', 'result', '0')) { return false } ElMessage.info('敬请期待') // ruleFormRef.value!.validate((valid: boolean) => { // if (valid) { // const loading = ElLoading.service({ // lock: true, // background: 'rgba(255, 255, 255, 0.8)', // }) // let checkResult // 检查结果 // const index = list.value.findIndex(item => item.result === '0') // if (index !== -1) { // checkResult = '2' // } // else { // checkResult = '1' // } // const params = { // ...form.value, // id: props.infoId, // checkResult, // 检查结果,1全部正常、2不正常 // maintainType: props.maintainType, // 类型 1周维护、2月保养 // dustAbnormalReason: list.value[0].result === '0' ? list.value[0].reason : '', // 除尘除潮不正常原因 // appearanceAbnormalReason: list.value[1].result === '0' ? list.value[1].reason : '', // 外观检查不正常原因 // workAbnormalReason: list.value[2].result === '0' ? list.value[2].reason : '', // 工作正常性检查不正常原因 // performanceAbnormalReason: list.value[3].result === '0' ? list.value[3].reason : '', // 性能测试不正常原因 // attachmentAbnormalReason: list.value[4].result === '0' ? list.value[4].reason : '', // 备附件和资料检查不正常原因 // } // // 新建 // if (pageType.value === 'add') { // 新建 // addResumeWeekMonthList(params).then((res) => { // ElMessage.success('保存成功') // form.value.logNo = res.data.logNo // 记录表单号 // pageType.value = 'detail' // loading.close() // }).catch(() => { // loading.close() // }) // } // // 保存 // else if (pageType.value === 'edit') { // 编辑 // updateResumeWeekMonthList(params).then((res) => { // ElMessage.success('保存成功') // pageType.value = 'detail' // loading.close() // }).catch(() => { // loading.close() // }) // } // } // else { // console.log('表单校验不通过') // } // }) } // -------------------------------------------获取详情信息-------------------------------------------------- // 获取详情信息 const fetchInfo = () => { const loading = ElLoading.service({ lock: true, background: 'rgba(255, 255, 255, 0.8)', }) getInfo({ id: props.infoId! }).then((res) => { form.value = res.data loading.close() }) } watch(() => props.pageType, (newVal) => { pageType.value = newVal }, { immediate: true }) // 监听表格计算检查结果 watch(() => list.value, (newValue) => { if (Array.isArray(newValue) && newValue.length) { if (newValue.every(item => `${item.result}` === '1')) { form.value.checkResult = '正常' } else { form.value.checkResult = '不正常' } } }, { deep: true, immediate: true }) onMounted(async () => { await getDict() currentTab.value = $route.query.currentTab as string form.value.createUserId = user.id// 创建人 form.value.createUserName = user.name // 创建人名字 form.value.createTime = dayjs().format('YYYY-MM-DD HH-mm:ss')// 记录时间 form.value.logName = props.title // 文件名称 form.value.labCode = user.bizLabCode // 实验室 form.value.labCodeName = user.labCodeName // 实验室名称 form.value.groupCode = user.groupNo // 部门名称 form.value.groupCodeName = user.groupName // 部门名称 if (pageType.value !== 'add') { // fetchInfo() } else { // 新建 // 在这里,如果是从待维护跳转过来,则渲染从列表页带来的默认配置 list.value = [ { id: '1', item: '外观检查', result: '1', remark: '', // 备注 }, { id: '2', item: '设备功能、性能检查', result: '1', remark: '', // 备注 }, { id: '3', item: '设备加电检查', result: '1', remark: '', // 备注 }, { id: '4', item: '设备油液检查', result: '1', remark: '', // 备注 }, { id: '5', item: '备附件和资料检查', result: '1', remark: '', // 备注 }, { id: '6', item: '软件检查、杀毒', result: '1', remark: '', // 备注 }, { id: '7', item: '校准因子', result: '1', remark: '', // 备注 }, ] // 维护保养信息 } }) </script> <template> <div class="week-month-tenplate-detail"> <app-container v-loading="loading"> <detail-page :title="`${props.title}-${textMap[pageType]}`"> <template #btns> <el-button v-if="pageType === 'detail'" type="primary" @click="exportPdf"> 导出 </el-button> <el-button v-if="pageType !== 'detail'" type="primary" @click="save"> 保存 </el-button> <el-button type="info" @click="close"> 关闭 </el-button> </template> <el-form ref="ruleFormRef" :model="form" label-width="120" label-position="right" :rules="formRules" > <el-row :gutter="24"> <el-col :span="6"> <el-form-item label="记录编号:" prop="logNo"> <el-input v-model="form.logNo" class="full-width-input" disabled placeholder="系统自动生成" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="记录名称:" prop="logName"> <el-input v-model="form.logName" class="full-width-input" disabled placeholder="请输入记录名称" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="实验室" prop="labCode"> <el-select v-model.trim="form.labCode" placeholder="请选择实验室" filterable :disabled="pageType === 'detail'" class="full-width-input" @change="changeLabName" > <el-option v-for="item in labNameList" :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.trim="form.groupCode" placeholder="请选择部门" filterable :disabled="pageType === 'detail'" class="full-width-input" @change="changeGroupCode" > <el-option v-for="item in useDeptList" :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="createUserName"> <el-input v-model="form.createUserName" class="full-width-input" :placeholder="pageType === 'detail' ? '' : '记录人'" disabled /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="记录时间:" prop="createTime"> <el-date-picker v-model="form.createTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" class="full-width-input" disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="备注:" prop="remark"> <el-input v-model="form.remark" class="full-width-input" autosize :placeholder="pageType === 'detail' ? '' : '请输入备注'" type="textarea" :disabled="pageType === 'detail'" :maxlength="50" show-word-limit /> </el-form-item> </el-col> <el-col v-if="pageType === 'detail'" :span="12"> <el-form-item label="设备名称:" prop="equipmentName"> <el-input v-model="form.remark" class="full-width-input" autosize type="textarea" :disabled="pageType === 'detail'" /> </el-form-item> </el-col> <el-col v-if="pageType !== 'detail' && $route.query.fromTab !== 'toBeMaintained'" :span="12"> <el-form-item label="设备名称" prop="equipmentName"> <el-input v-model="form.equipmentName" :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="checkResult"> <el-input v-model="form.checkResult" class="full-width-input" :placeholder="pageType === 'detail' ? '' : '检查结果'" disabled /> </el-form-item> </el-col> </el-row> </el-form> </detail-page> <detail-block title="维护保养信息"> <template v-if="pageType !== 'detail'" #btns> <el-button type="primary" @click="addRow"> 增加行 </el-button> <el-button type="info" @click="deleteRow"> 删除行 </el-button> </template> <el-table ref="techRef" :data="list" border style="width: 100%;" @selection-change="handleSelectionChange" > <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 columns" :key="item.value" :prop="item.value" :label="item.text" :width="item.width" align="center" > <template #header> <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span> </template> <template #default="scope"> <el-radio-group v-if="pageType !== 'detail' && item.value === 'result'" v-model="scope.row[item.value]" :disabled="pageType === 'detail'"> <el-radio label="1"> 正常 </el-radio> <el-radio label="0"> 不正常 </el-radio> </el-radio-group> <span v-if="pageType === 'detail' && item.value === 'result'">{{ scope.row.result === '1' ? '正常' : scope.row.result === '0' ? '不正常' : '未知' }}</span> <span v-if="scope.row.result === '1' && item.value === 'remark'">/</span> <el-input v-if="pageType !== 'detail' && ((scope.row.result === '0' && item.value === 'remark') || (item.value === 'item' && scope.row.customer === true))" v-model.trim="scope.row[item.value]" autosize type="textarea" :autofocus="true" :placeholder="`${item.text}`" class="input" /> </template> </el-table-column> </el-table> </detail-block> </app-container> <!-- 选择设备台账 --> <select-equipment-dialog ref="selectEquipmentDialogRef" :is-multi="false" @confirm="confirmSelectEquipment" /> </div> </template> <style lang="scss" scoped> .step { line-height: 28px; font-size: 20px; color: #3d7eff; font-weight: bold; margin-bottom: 5px; width: fit-content; } </style> <style lang="scss"> .week-month-tenplate-detail { .el-radio__label { display: block !important; } } </style>