<!-- 设备供方评价表详情 -->
<script name="EquipmentEvaluateDetail" lang="ts" setup>
import { ElMessage, ElMessageBox, dayjs } from 'element-plus'
import type { IEquipmentEvaluate, IEquipmentEvaluateContent } from './equipment-interface'
import ApprovalDialog from '@/views/resource/common/approvalDialog.vue'
import FilterEquipment from '@/views/resource/common/filterEquipment.vue'
import type { IDictType } from '@/commonInterface/resource-interface'
import { SCHEDULE } from '@/utils/scheduleDict'
import type { IForm as IEquipmentForm, IListQuery } from '@/views/equipement/info/book/book-interface'
import type { IForm as IExceptionForm, IListQuery as IExceptionListQuery } from '@/views/equipement/resume/error/error-interface'
import { getEquipmentList } from '@/api/equipment/info/book'
import { getResumeErrorList } from '@/api/equipment/resume/error'
import { detailEquipmentEvaluate, draftDelete, failUpdateEquipmentEvaluate, refuseApproval, revokeApproval, saveEquipmentEvaluate, submitEquipmentEvaluate, updateEquipmentEvaluate } from '@/api/resource/supplierEquipment'
import ApprovalRecordTable from '@/components/ApprovalRecord/ApprovalRecordTable.vue'
import useUserStore from '@/store/modules/user'
import { getDictByCode } from '@/api/system/dict'
import { useCheckList } from '@/commonMethods/useCheckList'
// 变量
// 从路由中传过来的参数
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 radioItems = ref([
{ name: '基本信息', value: 'equipment-evaluate-basic' },
{ name: '审批详情', value: 'equipment-evaluate-approval' },
])
const current = ref('')
const currentLabel = ref('')
// 子组件
const approvalDialog = ref()
const equipmentEvaluateRef = ref()
const equipmentFilterRef = ref()
const equipmentEvaluate = ref<IEquipmentEvaluate>({
id: '',
labCode: '',
groupCode: '',
formNo: '',
formName: '设备供方评价表',
deptId: '',
createUserId: '',
createTime: '',
contentList: [],
approvalStatus: '',
approvalStatusName: '',
processId: '',
taskId: '',
})
const contentList = ref<Array<IEquipmentEvaluateContent>>([])
const contentColumns = [
{ text: '设备供方', value: 'supplierName', align: 'center', width: '180' },
{ text: '设备名称', value: 'equipmentName', align: 'center', width: '180' },
{ text: '规格型号', value: 'model', align: 'center', width: '180' },
{ text: '启用日期', value: 'enableDate', align: 'center', width: '120' },
{ text: '故障情况及维修情况', value: 'faultSituation', align: 'center' },
{ text: '设备状态', value: 'equipmentStatus', align: 'center' },
{ text: '评价', value: 'evaluate', align: 'center', width: '160', required: true },
] // 表头
const evaluateRules = ref({
labCode: [{ required: true, message: '实验室代码不能为空,请选择', trigger: ['change', 'blur'] }],
groupCode: [{ required: true, message: '组别代码不能为空,请选择', trigger: ['change', 'blur'] }],
}) // 表单验证规则
const eqptQuery = ref<IListQuery>({
approvalStatus: '0', // 审批状态 = 全部
deptId: '', // 所属部门id
directorId: '', // 负责人id
equipmentNo: '', // 统一编号
equipmentName: '', // 设备名称
formId: SCHEDULE.EQUIPMENT_SUPPLIER_APPROVAL, // 表单id
manufactureNo: '', // 出厂编号
traceCompany: '', // 溯源单位
measureValidDateEnd: '', // 检定有效期(结束)
measureValidDateStart: '', // 检定有效期(开始)
offset: 1,
limit: 1000,
})
const exceptionQuery = ref<IExceptionListQuery>({
approvalStatus: '0', // 审批状态 = 全部
equipmentName: '', // 设备名称
equipmentNo: '', // 设备编号
exceptionTimeEnd: '', // 故障时间结束
exceptionTimeStart: '', // 故障时间开始
formId: SCHEDULE.EXCEPTION_HANDLING_APPROVAL, // formId
reportNo: '', // 报告单编号
limit: 1000,
offset: 1,
})
// 是否显示相关按钮
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 labCodeDict = ref<IDictType[]>([])
const groupCodeDict = ref<IDictType[]>([])
const recordSelected = ref<IEquipmentEvaluateContent[]>([])
// 逻辑
// 详情页的各个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('equipmentEvaluateTaskId') // 返回列表时 将缓存中的数据删除
router.go(-1)
}
// 新增
const addEditableRow = () => {
equipmentFilterRef.value.showOrHideFilterDialog(true)
}
const delEquipmentRecords = () => {
if (recordSelected.value.length === 0) {
ElMessage.warning('请至少选择一行')
return
}
contentList.value = contentList.value.filter(item => recordSelected.value.includes(item) === false)
}
const eqptMultiSelect = (e: any) => {
recordSelected.value = e
}
// 自动查询设备异常处理情况
const autoAppendEqptEvaluate = async (equipment: IEquipmentForm) => {
// 查询设备的异常情况处置处理审批表
exceptionQuery.value.equipmentNo = equipment.equipmentNo
let exceptionStr = ''
let statusStr = ''
await getResumeErrorList(exceptionQuery.value).then((res) => {
if (res.code === 200) {
if (res.data.rows.length > 0) {
res.data.rows.forEach((row: IExceptionForm) => {
exceptionStr += `${row.reportNo}:异常情况描述原因及后果分析为:${row.exceptionDesc};设备处置结果为:${row.handleSituation}。\n`
})
exceptionStr = exceptionStr.substring(0, exceptionStr.length - 1)
}
else {
exceptionStr = ''
statusStr = '功能正常、性能较好、检定合格'
}
}
}).catch(() => {
exceptionStr = ''
statusStr = ''
})
contentList.value.push({
supplierName: equipment.manufacturer,
equipmentName: equipment.equipmentName,
model: equipment.model,
faultSituation: exceptionStr,
equipmentStatus: statusStr,
evaluate: '',
enableDate: equipment.createTime.substring(0, 10),
id: '',
})
}
const checkExceptionContent = () => {
contentList.value.forEach((content: IEquipmentEvaluateContent) => {
if (content.faultSituation.trim() === '') {
content.equipmentStatus = '功能正常、性能较好、检定合格'
}
else {
content.equipmentStatus = ''
}
})
}
// 保存至草稿箱
const saveDraftEvaluate = () => {
equipmentEvaluate.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') // 创建时间改为提交时间
saveEquipmentEvaluate(equipmentEvaluate.value).then((res) => {
if (res.code === 200) {
// 提示保存成功
ElMessage.success('保存成功')
// 设置返回的id和编号
equipmentEvaluate.value.formNo = res.data.formNo
equipmentEvaluate.value.id = res.data.id
id.value = res.data.id
type.value = 'update'
status.value = '1' // 保存成功后进入草稿箱 为了不显示审批详情
}
else {
// 提示失败信息
ElMessage.error(`保存失败:${res.message}`)
}
})
}
// 编辑草稿箱(不走流程审批)
const updateDraftEvaluate = () => {
updateEquipmentEvaluate(equipmentEvaluate.value).then((res) => {
if (res.code === 200) {
// 提示保存成功
ElMessage.success('保存成功')
}
else {
// 提示失败信息
ElMessage.error(`保存失败:${res.message}`)
}
})
}
// 编辑按钮点击事件处理函数
const editClickedHandler = () => {
type.value = 'update'
title.value = '设备供方评价表(编辑)'
// 隐藏编辑按钮 显示提交按钮
editButtVisable.value = false
submitButtVisable.value = true
}
// 新建时保存后的处理 获取返回的id
const saveButtonHandler = async () => {
if (!equipmentEvaluateRef) { return }
if (contentList.value.length === 0) {
ElMessage.error('评价表内容不能为空,请选择设备及设备供方')
return
}
if (useCheckList(contentList.value, contentColumns, '评价表内容') === false) {
return
}
await equipmentEvaluateRef.value.validate((valid: boolean) => {
if (valid === true) {
equipmentEvaluate.value.contentList = contentList.value
ElMessageBox.confirm(
'确认保存吗?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
},
).then(() => {
if (type.value === 'create') {
saveDraftEvaluate()
}
else if (type.value === 'update') {
updateDraftEvaluate()
}
})
}
})
}
// 提交按钮
const submitButtonHandler = async () => {
if (equipmentEvaluate.value === null || equipmentEvaluate.value.processId === undefined || equipmentEvaluate.value.processId === '') {
// 流程id为空 表示还未进入流程中 直接提交
ElMessageBox.confirm(`是否提交设备供方评价表 ${equipmentEvaluate.value.formNo}`, '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
submitEquipmentEvaluate({
formId: SCHEDULE.EQUIPMENT_SUPPLIER_APPROVAL,
id: equipmentEvaluate.value.id,
}).then((res) => {
if (res.code === 200) {
ElMessage.success(`设备供方评价表 ${equipmentEvaluate.value.formNo} 提交成功`)
type.value = 'detail'
hideAllOpterationButtons()
}
else {
ElMessage.error(`设备供方评价表 ${equipmentEvaluate.value.formNo} 提交失败:${res.message}`)
}
})
})
}
else {
// 之前已经在流程中的表单 保存提交
if (contentList.value.length === 0) {
ElMessage.error('评价表内容不能为空,请选择设备及设备供方')
return
}
if (useCheckList(contentList.value, contentColumns, '评价表内容') === false) {
return
}
await equipmentEvaluateRef.value.validate((valid: boolean) => {
if (valid === true) {
failUpdateEquipmentEvaluate(equipmentEvaluate.value).then((res) => {
if (res.code === 200) {
// 提示保存成功
ElMessage.success(`设备供方评价表 ${equipmentEvaluate.value.formNo} 提交成功`)
type.value = 'detail'
hideAllOpterationButtons()
}
else {
// 提示失败信息
ElMessage.error(`设备供方评价表 ${equipmentEvaluate.value.formNo} 提交失败:${res.message}`)
}
})
}
})
}
}
// 根据id查询详情
const detailById = async (id: string) => {
await detailEquipmentEvaluate({ id }).then((res) => {
if (res.code === 200) {
equipmentEvaluate.value = res.data
contentList.value = equipmentEvaluate.value.contentList
if (equipmentEvaluate.value.taskId === '') {
equipmentEvaluate.value.taskId = sessionStorage.getItem('equipmentEvaluateTaskId')!
}
}
})
}
// 根据用户所在部门 查询部门下的所有设备
const getEquipmentListByDept = () => {
eqptQuery.value.deptId = userInfo.deptId
getEquipmentList(eqptQuery.value).then((res) => {
if (res.code === 200) {
res.data.rows.forEach((row: IEquipmentForm) => {
autoAppendEqptEvaluate(row)
})
}
})
}
// 流程审批-拒绝
const approvalRefuseHandler = () => {
approvalDialog.value.initDialog('refuse', equipmentEvaluate.value.id, equipmentEvaluate.value.taskId || route.query.taskId, '')
}
// 流程审批-同意
const approvalAgreeHandler = () => {
approvalDialog.value.initDialog('agree', equipmentEvaluate.value.id, equipmentEvaluate.value.taskId || route.query.taskId, '')
}
// 取消流程
const revokeClickedHandler = () => {
approvalDialog.value.initDialog('revoke', equipmentEvaluate.value.id, equipmentEvaluate.value.taskId || route.query.taskId, equipmentEvaluate.value.processId || route.query.processId)
}
// 删除审批单
const deleteClickedHandler = () => {
ElMessageBox.confirm(`是否删除审批单 ${equipmentEvaluate.value.formNo}`, '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
draftDelete({ id: id.value }).then((res) => {
if (res.code === 200) {
ElMessage.success(`审批单 ${equipmentEvaluate.value.formNo} 删除成功`)
resetForm()
}
else {
ElMessage.error(`审批单 ${equipmentEvaluate.value.formNo} 删除失败: ${res.message}`)
}
})
})
}
// 流程审批(同意、拒绝、取消)结束后的操作 将按钮都隐藏(本身就不能编辑了)
const approvalSuccessHandler = (type: string) => {
if (type === 'agree' || type === 'refuse') {
flowButtsVisable.value = false
}
else if (type === 'revoke') {
cancelButtVisable.value = false
}
}
// 取消
const revokeHandler = (param: any) => {
revokeApproval(param).then((res) => {
if (res.code === 200) {
ElMessage.success('流程取消成功')
}
else {
ElMessage.error(`流程取消失败:${res.message}`)
}
// 关闭弹窗
approvalDialog.value.handleClose()
cancelButtVisable.value = false
})
}
// 拒绝
const refuseHandler = (param: any) => {
refuseApproval(param).then((res) => {
if (res.code === 200) {
ElMessage.success('拒绝审批完成')
}
else {
ElMessage.error(`拒绝审批失败:${res.message}`)
}
// 关闭弹窗
approvalDialog.value.handleClose()
flowButtsVisable.value = false
})
}
// 选定设备返回
const appendToContentList = (rows: IEquipmentForm[]) => {
rows.forEach((row) => {
const existList = contentList.value.filter(item => item.supplierName === row.manufacturer)
if (existList.length === 0) {
autoAppendEqptEvaluate(row)
}
})
}
const getLabCodeDict = async () => {
// 先从缓存中获取
if (sessionStorage.getItem('bizLabCode') === null || sessionStorage.getItem('bizLabCode') === undefined) {
// 缓存中没有则调用接口查询
await getDictByCode('bizLabCode').then((res) => {
if (res.code === 200) {
labCodeDict.value = res.data
}
})
}
else {
labCodeDict.value = JSON.parse(sessionStorage.getItem('bizLabCode')!)
}
}
const getGroupCodeDict = async () => {
// 先从缓存中获取
if (sessionStorage.getItem('bizGroupCode') === null || sessionStorage.getItem('bizLabbizGroupCodeCode') === undefined) {
// 缓存中没有则调用接口查询
await getDictByCode('bizGroupCode').then((res) => {
if (res.code === 200) {
groupCodeDict.value = res.data
}
})
}
else {
groupCodeDict.value = JSON.parse(sessionStorage.getItem('bizGroupCode')!)
}
}
const initDict = async () => {
await getLabCodeDict()
await getGroupCodeDict()
}
const initDialog = (params: any) => {
// 从路由中获取参数
type.value = params.type
id.value = params.id !== undefined ? params.id : ''
status.value = params.status !== undefined ? params.status : ''
// 默认显示第一个tab内容
current.value = radioItems.value[0].value
currentLabel.value = radioItems.value[0].name
switch (params.type) {
case 'create' :
title.value = '设备供方评价表(新增)'
saveButtVisable.value = true
submitButtVisable.value = true
equipmentEvaluate.value.createUserId = userInfo.id
equipmentEvaluate.value.createUserName = userInfo.name
equipmentEvaluate.value.deptId = userInfo.deptId
equipmentEvaluate.value.deptName = userInfo.deptName
equipmentEvaluate.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
keyFieldsDisable.value = false
// 自动查询部门下的所有设备
getEquipmentListByDept()
break
case 'update':
title.value = '设备供方评价表(编辑)'
detailById(id.value)
// 判断显示哪些流程操作按钮
showOperationButtonByStatus()
keyFieldsDisable.value = true
break
case 'detail':
title.value = '设备供方评价表(详情)'
id.value = params.id
detailById(id.value)
// 查看详情时所有的操作按钮都隐藏
showOperationButtonByStatus()
keyFieldsDisable.value = true
break
default:
title.value = ''
break
}
}
onMounted(() => {
initDict()
initDialog(route.query)
})
</script>
<template>
<app-container>
<el-form ref="equipmentEvaluateRef" :model="equipmentEvaluate" :rules="evaluateRules" label-position="right" label-width="110px" 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 type="danger" @click="approvalRefuseHandler">
拒绝
</el-button>
</template>
<el-button v-if="submitButtVisable" :disabled="id === ''" type="primary" @click="submitButtonHandler">
提交
</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" style="margin-bottom: 20px;" @change="radioChangeHandler">
<el-radio-button v-for="item in radioItems" :key="item.value" :label="item.name" :disabled="id === ''" />
</el-radio-group>
<template v-if="current === 'equipment-evaluate-basic'">
<el-row :gutter="24">
<!-- 第一行 第一列 -->
<el-col :span="6">
<el-form-item label="实验室代码" prop="labCode">
<el-select v-model="equipmentEvaluate.labCode" placeholder="请选择实验室代码" :disabled="keyFieldsDisable" style="width: 100%;">
<el-option v-for="dict in labCodeDict" :key="dict.id" :label="dict.name" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="编制部门">
<el-input v-model="equipmentEvaluate.deptName" :disabled="true" />
<el-input v-model="equipmentEvaluate.deptId" type="hidden" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="组别代码" prop="groupCode">
<el-select v-model="equipmentEvaluate.groupCode" placeholder="请选择组别代码" :disabled="keyFieldsDisable" style="width: 100%;">
<el-option v-for="dict in groupCodeDict" :key="dict.id" :label="dict.name" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="编制人">
<el-input v-model="equipmentEvaluate.createUserName" :disabled="true" />
<el-input v-model="equipmentEvaluate.createUserId" type="hidden" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="评价表编号">
<el-input v-model="equipmentEvaluate.formNo" placeholder="评价表编号,保存后自动生成" :disabled="true" />
</el-form-item>
<el-form-item label="编制时间">
<el-input v-model="equipmentEvaluate.createTime" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="评价表名称">
<el-input v-model="equipmentEvaluate.formName" :disabled="true" />
</el-form-item>
</el-col>
</el-row>
</template>
</detail-page>
<template v-if="current === 'equipment-evaluate-basic'">
<table-container title="评价表内容">
<template v-if="type !== 'detail'" #btns-right>
<el-button type="primary" @click="addEditableRow">
增加行
</el-button>
<el-button type="info" @click="delEquipmentRecords">
删除行
</el-button>
</template>
<!-- 表格区域 -->
<el-table :data="contentList" border style="width: 100%;" @selection-change="eqptMultiSelect">
<el-table-column v-if="type !== 'detail'" type="selection" align="center" width="38" />
<el-table-column align="center" label="序号" width="55" type="index" />
<el-table-column
v-for="item in contentColumns"
:key="item.value"
:prop="item.value"
:label="item.text"
:width="item.width"
align="center"
>
<template #header>
<span v-show="item.required && type !== 'detail'" style="color: red;">*</span><span>{{ item.text }}</span>
</template>
<template #default="scope">
<el-input v-if="item.value === 'evaluate' && type !== 'detail'" v-model="scope.row[item.value]" :autofocus="true" />
<el-input v-else-if="item.value === 'equipmentStatus' && type !== 'detail'" v-model="scope.row[item.value]" :autofocus="true" />
<el-input v-else-if="item.value === 'faultSituation' && type !== 'detail'" v-model="scope.row[item.value]" type="textarea" :autosize="true" :autofocus="true" @blur="checkExceptionContent" />
</template>
</el-table-column>
</el-table>
</table-container>
</template>
</el-form>
<approval-dialog
ref="approvalDialog"
@on-success="approvalSuccessHandler" @on-refuse="refuseHandler" @on-revoke="revokeHandler"
/>
<filter-equipment ref="equipmentFilterRef" @records-selected="appendToContentList" />
<template v-if="current === 'equipment-evaluate-approval' && status !== '1'">
<approval-record-table :process-id="equipmentEvaluate.processId" />
</template>
</app-container>
</template>