<!-- 委托方意见登记表详情 --> <script name="SuggestFormDetail" lang="ts" setup> import { ElLoading, ElMessage, ElMessageBox, dayjs } from 'element-plus' import type { ICustomerSuggestInfo } from './customer-suggest' import type { IDictType } from '@/commonInterface/resource-interface' import type { addInfo } from '@/views/system/user/user-interface' import FilterSysUser from '@/views/resource/common/filterSysUser.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 { SCHEDULE } from '@/utils/scheduleDict' import { acceptForm, deleteFormRevoked, failUpdate, getFormDetail, refuseApproval, rejectAcceptedForm, rejectApproval, revokeApproval, saveForm, submitForm, updateDraft } from '@/api/resource/suggestForm' // 从路由中传过来的参数 const type = ref<string>('') const id = ref<string>('') const status = ref<string>('') const decisionItem = ref('') // 关键字段是否可以编辑 const keyFieldsDisable = ref<boolean>(true) const flowFormId = SCHEDULE.CUSTOMER_OPINION_REGISTER_APPROVAL // 资源管理 - 委托方意见登记表 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 refSysUserFilter = ref() const suggestFormRules = ref({ reasonAndConclusion: [{ 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 acceptButtVisable = ref<boolean>(false) // 是否显示 受理 按钮 const rejectButtVisable = ref<boolean>(false) // 是否显示 退回 按钮 const suggestInfo = ref<ICustomerSuggestInfo>({ id: '', formNo: '', formName: '委托方意见登记表', customerId: '', customerName: '', customerDeptId: '', customerDeptName: '', customerDeptPid: '', labCode: '', labCodeName: '', handleStatus: '', appealUserId: '', appealUserName: '', acceptanceUserId: '', acceptanceUserName: '', acceptanceTime: '', processId: '', taskId: '', createTime: '', createUserId: '', createUserName: '', suggestContent: '', reasonAndConclusion: '', remark: '', }) // 字典值 const meterDeptDict = 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 acceptButtVisable.value = false rejectButtVisable.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 case '11': // 待处理:受理 退回 保存 提交按钮可见 if (suggestInfo.value.handleStatus === '0') { // 未处置状态下 可以受理 只可选择受理人不可编辑字段 acceptButtVisable.value = true keyFieldsDisable.value = true } else { // 处置中状态下可以退回管理组 保存及提交 saveButtVisable.value = true submitButtVisable.value = true rejectButtVisable.value = true keyFieldsDisable.value = false } break default: // 默认不显示所有的操作按钮 hideAllOpterationButtons() break } } // 关闭 const resetForm = () => { sessionStorage.removeItem('suggestFormInfo') // 返回列表时 将缓存中的数据删除 sessionStorage.removeItem('bizMeterStationDeptId') router.go(-1) } // 保存至草稿箱 const saveSuggestInfo = () => { saveForm({ id: suggestInfo.value.id, reasonAndConclusion: suggestInfo.value.reasonAndConclusion, effectRemark: suggestInfo.value.effectRemark, }).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success('保存成功') submitButtVisable.value = true // 保存成功后显示提交按钮 } else { // 提示失败信息 ElMessage.error(`保存失败:${res.message}`) } }) } // 编辑草稿箱(不走流程审批) const updateSuggestInfo = () => { updateDraft(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 keyFieldsDisable.value = false } // 新建时保存后的处理 获取返回的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 acceptFormHandler = () => { refSysUserFilter.value.showOrHideFilterDialog(true, meterDeptDict.value[0].value) } // 选择实施人 const effectUserSelectedHanler = (user: addInfo) => { refSysUserFilter.value.showOrHideFilterDialog(false) ElMessageBox.confirm(`是否由 ${user.name} 受理委托方意见登记表`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { // 调用接口 acceptForm({ effectUserId: user.id, effectUserName: user.name, id: suggestInfo.value.id }).then((res) => { if (res.code === 200) { ElMessage.success(`委托方意见登记表 ${suggestInfo.value.formNo} 受理成功`) // 更新表单 suggestInfo.value.acceptanceTime = dayjs().format('YYYY-MM-DD HH:mm:ss') suggestInfo.value.acceptanceUserName = userInfo.name acceptButtVisable.value = false resetForm() } else { ElMessage.error(`委托方意见登记表 ${suggestInfo.value.formNo} 受理失败`) } }) }) } // 退回管理组 const rejectFormHandler = async () => { ElMessageBox.confirm('是否退回到管理组', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { rejectAcceptedForm({ id: suggestInfo.value.id }).then((res) => { if (res.code === 200) { ElMessage.success(`委托方意见登记表 ${suggestInfo.value.formNo} 回退到管理组成功`) } else { ElMessage.error(`委托方意见登记表 ${suggestInfo.value.formNo} 回退到管理组失败`) } }) resetForm() }) } // 提交按钮 const submitButtonHandler = async () => { await suggestFormRef.value.validate((valid: boolean) => { if (valid === true) { if (suggestInfo.value === null || suggestInfo.value.processId === undefined || suggestInfo.value.processId === '') { // 流程id为空 表示还未进入流程中 直接提交 ElMessageBox.confirm(`是否提交意见登记表 ${suggestInfo.value.formNo}`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { saveForm({ id: suggestInfo.value.id, reasonAndConclusion: suggestInfo.value.reasonAndConclusion, effectRemark: suggestInfo.value.effectRemark, }).then((res) => { if (res.code === 200) { submitForm({ formId: flowFormId, id: suggestInfo.value.id, }).then((res) => { if (res.code === 200) { ElMessage.success(`意见登记表 ${suggestInfo.value.formNo} 提交成功`) type.value = 'detail' keyFieldsDisable.value = true hideAllOpterationButtons() } else { ElMessage.error(`意见登记表 ${suggestInfo.value.formNo} 提交失败:${res.message}`) } }) } }) }) } else { // 之前已经在流程中的表单 保存提交 failUpdate(suggestInfo.value).then((res) => { if (res.code === 200) { // 提示保存成功 ElMessage.success(`意见登记表 ${suggestInfo.value.formNo} 提交成功`) type.value = 'detail' keyFieldsDisable.value = true hideAllOpterationButtons() } else { // 提示失败信息 ElMessage.error(`意见登记表 ${suggestInfo.value.formNo} 提交失败:${res.message}`) } }) } } }) } // 流程审批-同意 const approvalAgreeHandler = () => { apprDial.value.initDialog('agree', suggestInfo.value.id, suggestInfo.value.taskId || route.query.taskId, '') } // 流程审批-驳回 const approvalRejectHandler = () => { apprDial.value.initDialog('reject', suggestInfo.value.id, suggestInfo.value.taskId || route.query.taskId, '') } // 流程审批-拒绝 const approvalRefuseHandler = () => { apprDial.value.initDialog('refuse', suggestInfo.value.id, suggestInfo.value.taskId || route.query.taskId, '') } // 取消流程 const revokeClickedHandler = () => { ElMessageBox.confirm( '确认取消该审批吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }, ) .then(() => { const loading = ElLoading.service({ lock: true, text: '加载中...', background: 'rgba(255, 255, 255, 0.6)', }) const params = { processInstanceId: suggestInfo.value.processId!, comments: '', id: id.value, } revokeApproval(params).then((res) => { ElMessage({ type: 'success', message: '已取消', }) cancelButtVisable.value = false loading.close() }) }) } // 删除(只有已取消的可以在详情中删除) const deleteClickedHandler = () => { ElMessageBox.confirm( `确认删除意见登记表 ${suggestInfo.value.formNo} 吗?`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }, ).then(() => { deleteFormRevoked({ id: suggestInfo.value.id, taskId: suggestInfo.value.taskId || route.query.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 reject = (comments: string, taskId: string, id: string) => { const param = { id, taskId, // 任务id comments, // 拒绝原因 } rejectApproval(param).then((res) => { if (res.code === 200) { ElMessage.success('已驳回') } else { ElMessage.error(`驳回失败:${res.message}`) } // 关闭弹窗 apprDial.value.handleClose() flowButtsVisable.value = false }) } // 拒绝 const formRefuseHandler = (param: any) => { refuseApproval(param).then((res) => { if (res.code === 200) { ElMessage.success('拒绝审批完成') } else { ElMessage.error(`拒绝审批失败:${res.message}`) } // 关闭弹窗 apprDial.value.handleClose() flowButtsVisable.value = false }) } const getMeterDeptId = () => { if (sessionStorage.getItem('bizMeterStationDeptId') !== null && sessionStorage.getItem('bizMeterStationDeptId') !== '') { meterDeptDict.value = JSON.parse(sessionStorage.getItem('bizMeterStationDeptId')!) } else { getDictByCode('bizMeterStationDeptId').then((res) => { if (res.code === 200) { meterDeptDict.value = res.data sessionStorage.setItem('bizMeterStationDeptId', JSON.stringify(res.data)) } }) } } const initDict = () => { getMeterDeptId() } // 获取详情 const fetchFormDetail = () => { const loading = ElLoading.service({}) getFormDetail({ id: id.value }).then((res) => { suggestInfo.value = res.data loading.close() }) } const initDialog = (params: any) => { // 从路由中获取参数 type.value = params.type id.value = params.id !== undefined ? params.id : '' status.value = 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 = false // 首先隐藏提交按钮 rejectButtVisable.value = true keyFieldsDisable.value = false break case 'update': title.value = '委托方意见登记表(编辑)' id.value = params.id fetchFormDetail() // 判断显示哪些流程操作按钮 showOperationButtonByStatus() break case 'detail': title.value = '委托方意见登记表' id.value = params.id fetchFormDetail() // 查看详情时所有的操作按钮都隐藏 showOperationButtonByStatus() keyFieldsDisable.value = true break default: title.value = '' keyFieldsDisable.value = true break } } watch(() => status.value, (val) => { if (val === '11') { // 待处理把审批详情删除 if (radioItems.value[radioItems.value.length - 1].value === 'suggest-approval') { radioItems.value.pop() } console.log(radioItems.value) } else { // 其他把审批详情加上 if (radioItems.value[radioItems.value.length - 1].value !== 'suggest-approval') { radioItems.value.push({ name: '审批详情', value: 'suggest-approval' }) } } }) 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 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="acceptButtVisable" type="primary" @click="acceptFormHandler"> 受理 </el-button> <el-button v-if="submitButtVisable" type="primary" @click="submitButtonHandler"> 提交 </el-button> <el-button v-if="saveButtVisable" type="primary" @click="saveButtonHandler"> 保存 </el-button> <el-button v-if="rejectButtVisable" type="danger" @click="rejectFormHandler"> 退回 </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 v-if="current === 'suggest-basic'" title=" "> <el-row :gutter="24"> <!-- 第一行 第一列 --> <el-col :span="6"> <el-form-item label="文件编号"> <el-input v-model="suggestInfo.formNo" :disabled="true" /> </el-form-item> <el-form-item label="创建人"> <el-input v-model="suggestInfo.createUserName" :disabled="true" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="意见反馈单位"> <el-input v-model="suggestInfo.customerName" :disabled="true" /> </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="意见反馈部门"> <el-input v-model="suggestInfo.customerDeptName" :disabled="true" /> </el-form-item> <el-form-item label="受理人"> <el-input v-model="suggestInfo.acceptanceUserName" :disabled="true" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="意见对象"> <el-input v-model="suggestInfo.labCodeName" :disabled="true" /> </el-form-item> <el-form-item label="受理时间"> <el-input v-model="suggestInfo.acceptanceTime" :disabled="true" /> </el-form-item> </el-col> </el-row> </detail-block> <template v-if="current === 'suggest-basic'"> <detail-block title=""> <el-row :gutter="24"> <el-col :span="24"> <el-form-item label="意见内容"> <el-input v-model="suggestInfo.suggestContent" type="textarea" :rows="5" :disabled="true" /> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="24"> <el-form-item label="原因及结论" prop="reasonAndConclusion"> <el-input v-model="suggestInfo.reasonAndConclusion" type="textarea" :rows="5" :clearable="true" :disabled="keyFieldsDisable" /> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="24"> <el-form-item label="备注"> <el-input v-model="suggestInfo.effectRemark" type="textarea" rows="3" :clearable="true" :disabled="keyFieldsDisable" /> </el-form-item> </el-col> </el-row> </detail-block> </template> </el-form> <approval-dialog ref="apprDial" @on-success="approvalSuccessHandler" @on-refuse="formRefuseHandler" @reject="reject" /> <filter-sys-user ref="refSysUserFilter" :need-pid="true" @record-selected="effectUserSelectedHanler" /> <!-- 草稿箱/待处理状态下不显示审批详情 --> <template v-if="current === 'suggest-approval' && status !== '1' && status !== '11'"> <approval-record-table :process-id="suggestInfo.processId" /> </template> </app-container> </template>