<!-- 委托方意见登记表详情 -->
<script name="SuggestFormDetail" lang="ts" setup>
import { ElMessage, ElMessageBox, dayjs } from 'element-plus'
import type { ICustomerInfo } from '../info/customer-info'
import type { ICustomerSuggestInfo } from './customer-suggest'
import type { IDictType } from '@/commonInterface/resource-interface'
import type { DeptInfo } from '@/views/system/dept/dept-interface'
import FilterCustomer from '@/views/resource/common/filterCustomer.vue'
import FilterCustomerDept from '@/views/resource/common/filterCustomerDept.vue'
import ApprovalDialog from '@/views/resource/common/approvalDialog.vue'
import ApprovalRecordTable from '@/components/ApprovalRecord/ApprovalRecordTable.vue'
import useUserStore from '@/store/modules/user'
import { getDictByCode } from '@/api/system/dict'
import { deleteSuggestFormRevoked, failUpdateSuggest, refuseApproval, revokeApproval, saveSuggestForm, submitSuggestForm, updateDraftSuggest } from '@/api/resource/suggestForm'
// 从路由中传过来的参数
const type = ref<string>('')
const id = ref<string>('')
const status = ref<string>('')
// 关键字段是否可以编辑
const keyFieldsDisable = ref<boolean>(true)
const flowFormId = 'zyglwtfyjdjb' // 资源管理 - 委托方意见登记表
const userInfo = useUserStore()
const route = useRoute()
const router = useRouter()
const title = ref('')
const radioItems = ref([
{ name: '基本信息', value: 'suggest-basic' },
{ name: '审批详情', value: 'suggest-approval' },
])
const current = ref('')
const currentLabel = ref('')
// 弹窗子组件
const apprDial = ref()
const suggestFormRef = ref()
const refCustomerFilter = ref()
const refCustomerDeptFilter = ref()
const suggestFormRules = ref({
labCode: [{ required: true, message: '实验室代码不能为空,请选择', trigger: ['change', 'blur'] }],
appealUserName: [{ required: true, message: '申诉人不能为空', trigger: 'blur' }],
customerId: [{ required: true, message: '意见反馈单位不能为空,请选择', trigger: ['change', 'blur'] }],
customerDeptId: [{ required: true, message: '意见反馈部门不能为空,请选择', trigger: ['change', 'blur'] }],
suggestContent: [{ required: true, message: '意见内容不能为空', trigger: 'blur' }],
}) // 表单验证规则
// 是否显示相关按钮
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 suggestInfo = ref<ICustomerSuggestInfo>({
id: '',
formNo: '',
formName: '委托方意见登记表',
customerId: '',
customerName: '',
customerDeptId: '',
customerDeptName: '',
customerDeptPid: '',
labCode: '',
labCodeName: '',
appealUserId: '',
appealUserName: '',
processId: '',
taskId: '',
createTime: '',
createUserId: '',
createUserName: '',
suggestContent: '',
remark: '',
})
// 字典值
const labCodeDict = ref<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 '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('suggestFormInfo') // 返回列表时 将缓存中的数据删除
router.go(-1)
}
// 保存至草稿箱
const saveSuggestInfo = () => {
suggestInfo.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss') // 创建时间改为提交时间
saveSuggestForm(suggestInfo.value).then((res) => {
if (res.code === 200) {
// 提示保存成功
ElMessage.success('保存成功')
// 设置返回的委托方id和委托方编号
suggestInfo.value.formNo = res.data.formNo
suggestInfo.value.id = res.data.id
id.value = res.data.id
type.value = 'update'
status.value = '1' // 保存成功后进入草稿箱 为了不显示审批详情
}
else {
// 提示失败信息
ElMessage.error(`保存失败:${res.message}`)
}
})
}
// 编辑草稿箱(不走流程审批)
const updateSuggestInfo = () => {
updateDraftSuggest(suggestInfo.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 (!suggestFormRef) { return }
await suggestFormRef.value.validate((valid: boolean, fields: any) => {
if (valid === true) {
ElMessageBox.confirm(
'确认保存吗?',
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
},
).then(() => {
if (type.value === 'create') {
saveSuggestInfo()
}
else if (type.value === 'update') {
updateSuggestInfo()
}
})
}
})
}
// 提交按钮
const submitButtonHandler = async () => {
if (suggestInfo.value === null || suggestInfo.value.processId === undefined || suggestInfo.value.processId === '') {
// 流程id为空 表示还未进入流程中 直接提交
ElMessageBox.confirm(`是否提交意见登记表 ${suggestInfo.value.formNo}`, '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
submitSuggestForm({
formId: flowFormId,
id: suggestInfo.value.id,
}).then((res) => {
if (res.code === 200) {
ElMessage.success(`意见登记表 ${suggestInfo.value.formNo} 提交成功`)
type.value = 'detail'
hideAllOpterationButtons()
}
else {
ElMessage.error(`意见登记表 ${suggestInfo.value.formNo} 提交失败:${res.message}`)
}
})
})
}
else {
// 之前已经在流程中的表单 保存提交
await suggestFormRef.value.validate((valid: boolean) => {
if (valid === true) {
failUpdateSuggest(suggestInfo.value).then((res) => {
if (res.code === 200) {
// 提示保存成功
ElMessage.success(`意见登记表 ${suggestInfo.value.formNo} 提交成功`)
type.value = 'detail'
hideAllOpterationButtons()
}
else {
// 提示失败信息
ElMessage.error(`意见登记表 ${suggestInfo.value.formNo} 提交失败:${res.message}`)
}
})
}
})
}
}
// 流程审批-同意
const approvalAgreeHandler = () => {
apprDial.value.initDialog('agree', suggestInfo.value.id, suggestInfo.value.taskId, '')
}
// 流程审批-拒绝
const approvalRefuseHandler = () => {
apprDial.value.initDialog('refuse', suggestInfo.value.id, suggestInfo.value.taskId, '')
}
// 取消(撤回审批单)
const revokeClickedHandler = () => {
apprDial.value.initDialog('revoke', suggestInfo.value.id, suggestInfo.value.taskId, suggestInfo.value.processId)
}
// 删除(只有已取消的可以在详情中删除)
const deleteClickedHandler = () => {
ElMessageBox.confirm(
`确认删除意见登记表 ${suggestInfo.value.formNo} 吗?`,
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
},
).then(() => {
deleteSuggestFormRevoked({ id: suggestInfo.value.id, taskId: suggestInfo.value.taskId }).then((res) => {
if (res.code === 200) {
ElMessage.success(`意见登记表 ${suggestInfo.value.formNo} 删除成功`)
resetForm()
}
else {
ElMessage.error(`意见登记表 ${suggestInfo.value.formNo} 删除失败:${res.message}`)
}
})
})
}
// 流程操作之后刷新
const approvalSuccessHandler = (type: string) => {
if (type === 'agree' || type === 'refuse') {
flowButtsVisable.value = false
}
else if (type === 'revoke') {
cancelButtVisable.value = false
}
}
// 取消
const noteRevokeHandler = (param: any) => {
revokeApproval(param).then((res) => {
if (res.code === 200) {
ElMessage.success('流程取消成功')
}
else {
ElMessage.error(`流程取消失败:${res.message}`)
}
// 关闭弹窗
apprDial.value.handleClose()
cancelButtVisable.value = false
})
}
// 拒绝
const noteRefuseHandler = (param: any) => {
refuseApproval(param).then((res) => {
if (res.code === 200) {
ElMessage.success('拒绝审批完成')
}
else {
ElMessage.error(`拒绝审批失败:${res.message}`)
}
// 关闭弹窗
apprDial.value.handleClose()
flowButtsVisable.value = false
})
}
// 显示筛选委托方名录的弹窗
const showFilterCustomer = () => {
refCustomerFilter.value.showOrHideFilterDialog(true)
}
// 选择委托方名录
const customerSelectedHandler = (row: ICustomerInfo) => {
refCustomerFilter.value.showOrHideFilterDialog(false)
suggestInfo.value.customerId = row.id
suggestInfo.value.customerName = row.customerName
suggestInfo.value.customerDeptPid = row.deptId
// 清除下一级
suggestInfo.value.customerDeptId = ''
suggestInfo.value.customerDeptName = ''
}
// 显示筛选委托方部门树形结构的弹窗
const showFilterCustomerDept = () => {
if (suggestInfo.value.customerDeptPid === '' || suggestInfo.value.customerId === '') {
ElMessage.warning('请先选择意见反馈单位')
}
else {
refCustomerDeptFilter.value.showOrHideFilterDialog(true, suggestInfo.value.customerDeptPid)
}
}
// 选择委托方部门
const customerDeptSelectedHandler = (row: DeptInfo) => {
refCustomerDeptFilter.value.showOrHideFilterDialog(false)
suggestInfo.value.customerDeptId = row.id
suggestInfo.value.customerDeptName = row.simpleName
}
const getLabCodeDict = async () => {
// 先从缓存中获取
if (sessionStorage.getItem('bizLabCodeExceptAll') === null || sessionStorage.getItem('bizLabCodeExceptAll') === undefined) {
// 缓存中没有则调用接口查询
await getDictByCode('bizLabCode').then((res) => {
if (res.code === 200) {
labCodeDict.value = res.data.filter((item: { name: string }) => item.name !== '全站')
sessionStorage.setItem('bizLabCodeExceptAll', JSON.stringify(labCodeDict.value)) // 放到缓存中
}
})
}
else {
labCodeDict.value = JSON.parse(sessionStorage.getItem('bizLabCodeExceptAll')!)
}
}
const initDict = () => {
getLabCodeDict()
}
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
sessionStorage.removeItem('suggestFormInfo')
suggestInfo.value.createUserId = userInfo.id
suggestInfo.value.createUserName = userInfo.name
suggestInfo.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
keyFieldsDisable.value = false
break
case 'update':
title.value = '委托方意见登记表(编辑)'
suggestInfo.value = JSON.parse(sessionStorage.getItem('suggestFormInfo')!)
// 判断显示哪些流程操作按钮
showOperationButtonByStatus()
keyFieldsDisable.value = true
break
case 'detail':
title.value = '委托方意见登记表'
id.value = params.id
suggestInfo.value = JSON.parse(sessionStorage.getItem('suggestFormInfo')!)
// 查看详情时所有的操作按钮都隐藏
showOperationButtonByStatus()
keyFieldsDisable.value = true
break
default:
title.value = ''
keyFieldsDisable.value = true
break
}
}
// 监听 显示中文
watch(() => suggestInfo.value.labCode, (newVal) => {
labCodeDict.value = JSON.parse(sessionStorage.getItem('bizLabCodeExceptAll')!)
if (labCodeDict.value.length > 0) {
const targetList = labCodeDict.value.filter(item => item.value === newVal)
if (targetList.length > 0) {
suggestInfo.value.labCodeName = targetList[0].name
}
else {
suggestInfo.value.labCodeName = ''
}
}
})
onMounted(() => {
initDict()
initDialog(route.query)
})
</script>
<template>
<app-container>
<el-form ref="suggestFormRef" :model="suggestInfo" :rules="suggestFormRules" 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 === 'suggest-basic'">
<el-row :gutter="24">
<!-- 第一行 第一列 -->
<el-col :span="6">
<el-form-item label="实验室代码" prop="labCode">
<el-select v-model="suggestInfo.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-input v-model="suggestInfo.labCodeName" type="hidden" />
</el-form-item>
<el-form-item label="申诉人" prop="appealUserName">
<el-input v-model="suggestInfo.appealUserName" placeholder="请输入申诉人姓名" :disabled="type === 'detail'" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="登记表编号">
<el-input v-model="suggestInfo.formNo" placeholder="登记表编号,保存后自动生成" :disabled="true" />
</el-form-item>
<el-form-item label="创建人">
<el-input v-model="suggestInfo.createUserName" :disabled="true" />
<el-input v-model="suggestInfo.createUserId" type="hidden" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="意见反馈单位" prop="customerId">
<el-input v-model="suggestInfo.customerName" :disabled="true">
<template #append>
<el-button size="small" :disabled="type === 'detail'" @click="showFilterCustomer">
选择
</el-button>
</template>
</el-input>
<el-input v-model="suggestInfo.customerId" type="hidden" />
</el-form-item>
<el-form-item label="创建时间">
<el-input v-model="suggestInfo.createTime" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="意见反馈部门" prop="customerDeptId">
<el-input v-model="suggestInfo.customerDeptName" :disabled="true">
<template #append>
<el-button size="small" :disabled="type === 'detail'" @click="showFilterCustomerDept">
选择
</el-button>
</template>
</el-input>
<el-input v-model="suggestInfo.customerDeptId" type="hidden" />
</el-form-item>
</el-col>
</el-row>
</template>
</detail-page>
<template v-if="current === 'suggest-basic'">
<detail-block title="">
<el-row :gutter="24">
<el-col :span="24">
<el-form-item label="意见内容" prop="suggestContent">
<el-input v-model="suggestInfo.suggestContent" placeholder="请填写意见内容" type="textarea" rows="5" :clearable="true" :disabled="type === 'detail'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="suggestInfo.remark" placeholder="请填写备注信息" type="textarea" rows="3" :clearable="true" :disabled="type === 'detail'" />
</el-form-item>
</el-col>
</el-row>
</detail-block>
</template>
</el-form>
<approval-dialog
ref="apprDial"
@on-success="approvalSuccessHandler"
@on-refuse="noteRefuseHandler"
@on-revoke="noteRevokeHandler"
/>
<filter-customer ref="refCustomerFilter" @record-selected="customerSelectedHandler" />
<filter-customer-dept ref="refCustomerDeptFilter" @record-selected="customerDeptSelectedHandler" />
<template v-if="current === 'suggest-approval' && status !== '1'">
<approval-record-table :process-id="suggestInfo.processId" />
</template>
</app-container>
</template>