<!-- UPS内阻测试记录详情 --> <script name="EnvironmentUpsResistanceDetail" lang="ts" setup> import { ElLoading, ElMessage, ElMessageBox, dayjs } from 'element-plus' import { MessageBox } from '@element-plus/icons-vue' import type { IUpsResistanceRecord } from './ups-interface' import ApprovalDialog from '@/views/resource/common/approvalDialog.vue' // import FilterSingleEquipment from '@/views/resource/common/filterSingleEquipment.vue' import type { IForm as IEquipmentForm } from '@/views/equipement/info/book/book-interface' import { SCHEDULE } from '@/utils/scheduleDict' import type { TableColumn } from '@/components/NormalTable/table_interface' import { detailUpsResistance, draftDeleteUpsResistance, failUpdateUpsResistance, refuseApprovalUpsResistance, rejectApprovalUPS, revokeApprovalUpsResistance, saveUpsResistance, submitUpsResistance, updateUpsResistance } from '@/api/resource/environmentTest' import ApprovalRecordTable from '@/components/ApprovalRecord/ApprovalRecordTable.vue' import type { IDictType } from '@/commonInterface/resource-interface' import useUserStore from '@/store/modules/user' import upsLocation from '/public/config/ups.json' import SelectEquipmentDialog from '@/views/business/fieldTest/approve/dialog/selectEquipmentDialog.vue' import { getDictByCode } from '@/api/system/dict' import type { dictType } from '@/global' const user = useUserStore() // 从路由中传过来的参数 const type = ref<string>('') const id = ref<string>('') const status = ref<string>('') // 关键字段是否可以编辑 const keyFieldsDisable = ref<boolean>(true) const userInfo = useUserStore() const route = useRoute() const router = useRouter() const title = ref('') const decisionItem = ref('') const radioItems = ref([ { name: '基本信息', value: 'ups-basic' }, { name: '审批详情', value: 'ups-approval' }, ]) const current = ref('') const currentLabel = ref('') // 子组件 const approvalDialog = ref() const testRecordRef = ref() const refEqipmentFilter = ref() const recordForm = ref<IUpsResistanceRecord>({ id: '', recordNo: '', recordName: 'UPS蓄电池内阻测试记录', createUserId: '', batteryBrand: '', batteryCapacity: '', testDate: '', testLocation: '', testUseEquipmentId: '', testUseEquipment: '', conclusion: '', upsRecordDetailList: [], createTime: '', approvalStatus: '', approvalStatusName: '', processId: '', taskId: '', }) const upsColumns = ref<TableColumn[]>([ { text: '电池序号', value: 'batteryNo', align: 'center', width: '90' }, { text: '浮充时单体电压(V)', value: 'voltage', align: 'center' }, { text: '浮充时内阻(mΩ)', value: 'resistance', align: 'center' }, { text: '外观及连接情况', value: 'appearance', align: 'center', width: '220' }, { text: '备注', value: 'remark', align: 'center' }, ]) const checkRules = ref({ testDate: [{ required: true, message: '测试时间不能为空', trigger: 'blur' }], testLocation: [{ required: true, message: '测试地点不能为空', trigger: ['blur', 'change'] }], testUseEquipmentId: [{ required: true, message: '测试仪表不能为空', trigger: ['blur', 'change'] }], batteryBrand: [{ required: true, message: '蓄电池品牌型号不能为空', trigger: 'blur' }], batteryCapacity: [{ required: true, message: '蓄电池容量不能为空', trigger: 'blur' }], conclusion: [{ required: true, message: '测试结论不能为空', trigger: ['blur', 'change'] }], }) // 表单验证规则 // 是否显示相关按钮 const saveButtVisable = ref<boolean>(false) // 是否显示 保存 按钮 const submitButtVisable = ref<boolean>(false) // 是否显示 提交 按钮 const flowButtsVisable = ref<boolean>(false) // 是否显示 同意和拒绝 按钮 const cancelButtVisable = ref<boolean>(false) // 是否显示 取消 按钮 const deleteButtVisable = ref<boolean>(false) // 是否显示 删除 按钮 const editButtVisable = ref<boolean>(false) // 是否显示 编辑 按钮 const conclusionDict = ref<Array<IDictType>>([]) // 逻辑 // 详情页的各个tab切换操作 const radioChangeHandler = (newVal: string | number | boolean) => { const radioTarget = radioItems.value.filter(item => item.name === newVal) if (radioTarget.length > 0) { currentLabel.value = radioTarget[0].name current.value = radioTarget[0].value } else { currentLabel.value = radioItems.value[0].name current.value = radioItems.value[0].value } } // 将所有流程操作的按钮隐藏 const hideAllOpterationButtons = () => { saveButtVisable.value = false submitButtVisable.value = false flowButtsVisable.value = false cancelButtVisable.value = false deleteButtVisable.value = false editButtVisable.value = false } // 根据审批状态显示对应的流程操作按钮 const showOperationButtonByStatus = () => { switch (status.value) { case '0': // 全部:保存按钮可见 if (type.value === 'update') { saveButtVisable.value = true } else { saveButtVisable.value = false } break case '1': // 草稿箱:保存、提交按钮可见 saveButtVisable.value = true submitButtVisable.value = true break case '2': // 待审批:同意、拒绝按钮可见 flowButtsVisable.value = true break case '3': // 审批中:取消按钮可见 cancelButtVisable.value = true break case '5': // 未通过:编辑 按钮可见 editButtVisable.value = true break case '6': // 已取消:编辑 删除按钮可见 editButtVisable.value = true deleteButtVisable.value = true break default: // 默认不显示所有的操作按钮 hideAllOpterationButtons() break } } // 关闭 const resetForm = () => { sessionStorage.removeItem('upsResistanceRecordTaskId') // 返回列表时 将缓存中的数据删除 router.go(-1) } // 简单校验电池测试结果值 const validateUpsBattery = () => { let valid = true recordForm.value.upsRecordDetailList.forEach((batt, index) => { if (batt.voltage !== '' && isNaN(parseFloat(batt.voltage)) === true) { ElMessage.warning(`电池${index + 1}的浮充单体电压值需要为数字`) valid = false } if (batt.resistance !== '' && isNaN(parseFloat(batt.resistance)) === true) { ElMessage.warning(`电池${index + 1}的电池内阻需要为数字`) valid = false } }) return valid } // 保存至草稿箱 const saveDraft = () => { recordForm.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') // 创建时间改为提交时间 const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) saveUpsResistance(recordForm.value).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success('保存成功') // 设置返回的id和编号 recordForm.value.recordNo = res.data.recordNo recordForm.value.id = res.data.id id.value = res.data.id type.value = 'update' status.value = '1' // 保存成功后进入草稿箱 为了不显示审批详情 } else { // 提示失败信息 ElMessage.error(`保存失败:${res.message}`) } loading.close() }) } // 编辑草稿箱(不走流程审批) const updateDraft = () => { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) updateUpsResistance(recordForm.value).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success('保存成功') } else { // 提示失败信息 ElMessage.error(`保存失败:${res.message}`) } loading.close() }) } // 编辑按钮点击事件处理函数 const editClickedHandler = () => { type.value = 'update' title.value = 'UPS蓄电池内阻测试记录(编辑)' // 隐藏编辑按钮 显示提交按钮 editButtVisable.value = false submitButtVisable.value = true } // 新建时保存后的处理 获取返回的id const saveButtonHandler = async () => { if (!testRecordRef) { return } if (validateUpsBattery() === false) { return } await testRecordRef.value.validate((valid: boolean) => { if (valid === true) { ElMessageBox.confirm( '确认保存吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }, ).then(() => { if (type.value === 'create') { saveDraft() } else if (type.value === 'update') { updateDraft() } }) } }) } // 提交按钮 const submitButtonHandler = async () => { if (recordForm.value === null || recordForm.value.processId === undefined || recordForm.value.processId === '') { // 流程id为空 表示还未进入流程中 直接提交 ElMessageBox.confirm(`是否提交UPS蓄电池内阻测试记录 ${recordForm.value.recordNo}`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) submitUpsResistance({ formId: SCHEDULE.UPS_RESISTANCE_RECORD_APPROVAL, id: recordForm.value.id, }).then((res) => { if (res.code === 200) { ElMessage.success(`UPS蓄电池内阻测试记录 ${recordForm.value.recordNo} 提交成功`) type.value = 'detail' hideAllOpterationButtons() } else { ElMessage.error(`UPS蓄电池内阻测试记录 ${recordForm.value.recordNo} 提交失败:${res.message}`) } loading.close() }) }) } else { // 之前已经在流程中的表单 保存提交 await testRecordRef.value.validate((valid: boolean) => { if (valid === true) { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) failUpdateUpsResistance(recordForm.value).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success('保存成功') type.value = 'detail' keyFieldsDisable.value = true hideAllOpterationButtons() } else { // 提示失败信息 ElMessage.error(`保存失败:${res.message}`) } loading.close() }) } }) } } // 根据id查询详情 const detailById = async (id: string) => { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) await detailUpsResistance({ id }).then((res) => { if (res.code === 200) { recordForm.value = res.data recordForm.value.upsRecordDetailList = res.data.upsRecordDetailList.map((item: any) => { return { ...item, appearance: `${item.appearance}`, } }) if (recordForm.value.taskId === '') { recordForm.value.taskId = sessionStorage.getItem('upsResistanceRecordTaskId')! } } loading.close() }) } // --------------------------------选择设备------------------------------------------- const selectEquipmentDialogRef = ref() // 选择设备组件ref // 添加 const selectEquipment = () => { selectEquipmentDialogRef.value.initDialog() } // 确定选择设备 const confirmSelectEquipment = (list: any) => { if (list && list.length) { recordForm.value.testUseEquipment = list[0].equipmentName + list[0].model + list[0].manufactureNo // 测试所用设备 recordForm.value.testUseEquipmentId = list[0].id // 测试所用设备id } } // --------------------------------审批------------------------------------------- // 流程审批-拒绝 const approvalRefuseHandler = () => { approvalDialog.value.initDialog('refuse', recordForm.value.id, recordForm.value.taskId, '') } // 流程审批-驳回 const approvalRejectHandler = () => { approvalDialog.value.initDialog('reject', recordForm.value.id, recordForm.value.taskId, '') } // 流程审批-同意 const approvalAgreeHandler = () => { approvalDialog.value.initDialog('agree', recordForm.value.id, recordForm.value.taskId, '') } // 取消流程 const revokeClickedHandler = () => { const params = { processInstanceId: route.query.processId!, comments: '', id: id.value, } ElMessageBox.confirm( '确认取消该审批吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }, ) .then(() => { revokeApprovalUpsResistance(params).then((res) => { ElMessage({ type: 'success', message: '已取消', }) cancelButtVisable.value = false }) }) } // 删除审批单 const deleteClickedHandler = () => { ElMessageBox.confirm(`是否删除审批单 ${recordForm.value.recordNo}`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { draftDeleteUpsResistance({ id: id.value }).then((res) => { if (res.code === 200) { ElMessage.success(`审批单 ${recordForm.value.recordNo} 删除成功`) resetForm() } else { ElMessage.error(`审批单 ${recordForm.value.recordNo} 删除失败: ${res.message}`) } }) }) } // 流程审批(同意、拒绝、取消)结束后的操作 将按钮都隐藏(本身就不能编辑了) const approvalSuccessHandler = (type: string) => { if (type === 'agree' || type === 'refuse') { flowButtsVisable.value = false } else if (type === 'revoke') { cancelButtVisable.value = false } } // 拒绝 const refuseHandler = (param: any) => { refuseApprovalUpsResistance(param).then((res) => { if (res.code === 200) { ElMessage.success('拒绝审批完成') } else { ElMessage.error(`拒绝审批失败:${res.message}`) } // 关闭弹窗 approvalDialog.value.handleClose() flowButtsVisable.value = false }) } // 驳回 const reject = (comments: string, taskId: string, id: string) => { const param = { id, taskId, // 任务id comments, // 拒绝原因 } rejectApprovalUPS(param).then((res) => { if (res.code === 200) { ElMessage.success('已驳回') } else { ElMessage.error(`驳回失败:${res.message}`) } // 关闭弹窗 approvalDialog.value.handleClose() flowButtsVisable.value = false }) } // --------------------------------------字典----------------------------------------------- const useDeptList = ref<dictType[]>([]) // 部门 const labDeptList = ref<dictType[]>([]) // 实验室 // 查询字典 const getDictFun = () => { // 实验室 getDictByCode('bizLabCode').then((response) => { labDeptList.value = response.data }) // 部门 getDictByCode('bizGroupCode').then((response) => { useDeptList.value = response.data }) // 结论 getDictByCode('bizUpsConclusion').then((res) => { if (res.code === 200) { conclusionDict.value = res.data } }) } const initDict = async () => { getDictFun() } const initDialog = (params: any) => { // 从路由中获取参数 type.value = params.type id.value = params.id !== undefined ? params.id : '' status.value = params.status decisionItem.value = params.decisionItem as string // 默认显示第一个tab内容 current.value = radioItems.value[0].value currentLabel.value = radioItems.value[0].name switch (params.type) { case 'create' : title.value = 'UPS蓄电池内阻测试记录(新增)' saveButtVisable.value = true submitButtVisable.value = true recordForm.value.createUserId = userInfo.id recordForm.value.createUserName = userInfo.name recordForm.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') recordForm.value.testDate = dayjs(new Date()).format('YYYY-MM-DD') recordForm.value.testLocation = user.bizLabCode === 'X' ? '西昌UPS间' : user.bizLabCode === 'H' ? '海口UPS间' : '' // 实验室 // 初始化32块电池 for (let i = 0; i < 32; i++) { recordForm.value.upsRecordDetailList.push({ batteryNo: `${i + 1}`, resistance: '', voltage: '', appearance: '1', // 外观检查默认合格 remark: '', }) } keyFieldsDisable.value = false break case 'update': title.value = 'UPS蓄电池内阻测试记录(编辑)' detailById(id.value) // 判断显示哪些流程操作按钮 showOperationButtonByStatus() keyFieldsDisable.value = true break case 'detail': title.value = 'UPS蓄电池内阻测试记录(详情)' id.value = params.id detailById(id.value) // 查看详情时所有的操作按钮都隐藏 showOperationButtonByStatus() keyFieldsDisable.value = true break default: title.value = '' break } } watch(() => status.value, (val) => { if (val === '1' || type.value === 'create') { // 草稿箱把审批详情删了 if (radioItems.value[radioItems.value.length - 1].value === 'ups-approval') { radioItems.value.pop() } console.log(radioItems.value) } else { // 非全部和草稿箱把审批详情加上 if (radioItems.value[radioItems.value.length - 1].value !== 'ups-approval') { radioItems.value.push({ name: '审批详情', value: 'ups-approval' }) } } }) watch(() => recordForm.value.testLocation, (val) => { const target = upsLocation.filter((item: { value: string }) => item.value === val) if (target.length > 0) { recordForm.value.batteryBrand = target[0].batteryBrand recordForm.value.batteryCapacity = target[0].batteryCapacity } }) onMounted(() => { initDict() initDialog(route.query) }) </script> <template> <app-container class="resource-environment-ups"> <el-form ref="testRecordRef" :model="recordForm" :rules="checkRules" label-position="right" label-width="125px" border stripe> <detail-page :title="`${title}`"> <template #btns> <el-button v-if="editButtVisable" type="primary" @click="editClickedHandler()"> 编辑 </el-button> <template v-if="flowButtsVisable"> <el-button type="primary" @click="approvalAgreeHandler"> 同意 </el-button> <el-button v-if="(`${decisionItem}` === '1' || `${decisionItem}` === '2')" type="warning" @click="approvalRejectHandler"> 驳回 </el-button> <el-button v-if="(`${decisionItem}` === '1' || `${decisionItem}` === '3')" type="danger" @click="approvalRefuseHandler"> 拒绝 </el-button> </template> <el-button v-if="submitButtVisable" :disabled="id === ''" type="primary" @click="submitButtonHandler"> {{ status === '5' || status === '6' ? '保存' : '提交' }} </el-button> <el-button v-if="saveButtVisable" type="primary" @click="saveButtonHandler"> 保存 </el-button> <el-button v-if="deleteButtVisable" type="danger" @click="deleteClickedHandler"> 删除 </el-button> <el-button v-if="cancelButtVisable" type="info" @click="revokeClickedHandler"> 取消 </el-button> <el-button type="info" @click="resetForm()"> 关闭 </el-button> </template> <el-radio-group v-model="currentLabel" @change="radioChangeHandler"> <el-radio-button v-for="item in radioItems" :key="item.value" :label="item.name" :disabled="id === ''" /> </el-radio-group> </detail-page> <detail-block> <template v-if="current === 'ups-basic'"> <el-row :gutter="24"> <el-col :span="6"> <el-form-item label="记录编号"> <el-input v-model="recordForm.recordNo" placeholder="系统自动生成" :disabled="true" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="测试时间" prop="testDate"> <el-date-picker v-model="recordForm.testDate" :disabled="type === 'detail'" style="width: 100%;" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="测试地点" prop="testLocation"> <!-- <el-select v-model="recordForm.testLocation" placeholder="请选择测试地点" :disabled="type === 'detail'" style="width: 100%;" clearable> <el-option v-for="loc in upsLocation" :key="loc.value" :value="loc.value" :label="loc.name" /> </el-select> --> <el-autocomplete v-model="recordForm.testLocation" :fetch-suggestions="upsLocation" placeholder="测试地点" style="width: 100%;" :disabled="type === 'detail'" clearable /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="测试人员"> <el-input v-model="recordForm.createUserName" :disabled="true" /> <el-input v-model="recordForm.createUserId" type="hidden" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="测试仪表" prop="testUseEquipmentId"> <el-input v-model="recordForm.testUseEquipmentId" type="hidden" /> <el-input v-model="recordForm.testUseEquipment" placeholder="请选择测试仪表" :disabled="true"> <template v-if="type !== 'detail'" #append> <el-button @click="selectEquipment"> 选择 </el-button> </template> </el-input> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="蓄电池品牌型号"> <el-input v-model="recordForm.batteryBrand" :placeholder="type === 'detail' ? ' ' : '请输入蓄电池品牌型号'" :disabled="type === 'detail'" style="width: 100%;" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="蓄电池容量"> <el-input v-model="recordForm.batteryCapacity" :placeholder="type === 'detail' ? ' ' : '请输入蓄电池容量'" :disabled="type === 'detail'" style="width: 100%;" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="测试结论" prop="conclusion"> <el-select v-model="recordForm.conclusion" :disabled="type === 'detail'" style="width: 100%;"> <el-option v-for="dict in conclusionDict" :key="dict.id" :value="dict.value" :label="dict.name" /> </el-select> </el-form-item> </el-col> </el-row> </template> </detail-block> <detail-block v-if="current === 'ups-basic'"> <el-table :data="recordForm.upsRecordDetailList" :columns="upsColumns" border stripe> <el-table-column v-for="col in upsColumns" :key="col.value" :label="col.text" :align="col.align" :width="col.width"> <template #default="scope"> <span v-if="col.value === 'batteryNo'">{{ scope.row[col.value] }}</span> <el-radio-group v-else-if="col.value === 'appearance'" v-model="scope.row[col.value]" :disabled="type === 'detail'"> <el-radio v-for="dict in conclusionDict" :key="dict.id" :label="dict.value"> {{ dict.name }} </el-radio> </el-radio-group> <el-input v-else v-model="scope.row[col.value]" type="textarea" autosize clearable :disabled="type === 'detail'" /> </template> </el-table-column> </el-table> </detail-block> </el-form> <approval-dialog ref="approvalDialog" @on-success="approvalSuccessHandler" @on-refuse="refuseHandler" @reject="reject" /> <filter-single-equipment ref="refEqipmentFilter" @record-selected="equipementSelectedHandler" /> <template v-if="current === 'ups-approval' && status !== '1'"> <approval-record-table :process-id="recordForm.processId" /> </template> <!-- 选择设备台账 --> <select-equipment-dialog ref="selectEquipmentDialogRef" equipment-name="蓄电池内阻测试仪" :is-multi="false" @confirm="confirmSelectEquipment" /> </app-container> </template> <style lang="scss"> .resource-environment-ups { .el-radio__label { display: block !important; } } </style>