<!-- 设备检修列表 --> <script lang="ts" setup name="listMaintenanceApproval"> import type { PropType, Ref } from 'vue' import { getCurrentInstance, ref } from 'vue' import { ElLoading, ElMessage, ElMessageBox } from 'element-plus' import type { IOptions, IlistApproval, IlistApprovalTypes } from '../checkList_interface' import type { IButton } from '@/views/measure/source/list_interface' import type { TableColumn } from '@/components/NormalTable/table_interface' import { getDeptTree } from '@/api/measure/plan' import { deleteEquipmentApply, getEquipmentApplyList, submitEquipmentApply } from '@/api/device/checkList' import ApprovalDialog from '@/components/Approval/ApprovalDialog.vue' import { SCHEDULE } from '@/utils/scheduleDict' import { printJSON } from '@/utils/printUtils' import { cancelApproval } from '@/api/approval' import { getDictByCode } from '@/api/system/dict' import { keepSearchParams, renewSearchParams } from '@/utils/keepQuery' const props = defineProps({ status: { type: String, default: '', }, buttons: { type: Array as PropType<IButton[]>, default: () => [], }, }) // 获取权限 const { proxy } = getCurrentInstance() as any // 审批类型字典 const approvalStatusReserveMap = ref({}) as any// 审批状态字典{草稿箱: 1} // 操作列宽度-计算属性 const operationWidth = computed(() => { return props.buttons.length * 40 + 20 }) // 获取字典值 async function getDict() { // 审批状态 const res = await getDictByCode('approvalStatus') // 审批状态字典 {草稿箱: 1} res.data.forEach((item: any) => { approvalStatusReserveMap.value[item.name] = `${item.value}` }) } // 查询条件 const listQuery = ref<IlistApprovalTypes>({ approvalStatus: props.status, // 审批状态 formId: SCHEDULE.DEVICE_FIX_APPROVAL, // 表单id applyName: '', // 审批名称 applyNo: '', // 审批编号 applyType: '8', // 审批类型 applyPerson: '', checkApplyName: '', applyUnit: '', endTime: '', startTime: '', processResult: '', businessKeys: [], // 业务主键列表(工作流查询用,不用前端传) createUser: '', // 创建人 ids: [], // 主键集合 overhaulPerson: '', // 检修保养人 offset: 1, // 当前页 limit: 20, // 一页多少条 }) // 页面跳转之前保存参数 onBeforeRouteLeave((to: any) => { keepSearchParams(to.path, 'deviceMaintenance-checkList', listQuery.value) }) // 重新赋值 listQuery.value = renewSearchParams('deviceMaintenance-checkList') || { approvalStatus: props.status, // 审批状态 formId: SCHEDULE.DEVICE_FIX_APPROVAL, // 表单id applyName: '', // 审批名称 applyNo: '', // 审批编号 applyType: '8', // 审批类型 applyPerson: '', checkApplyName: '', applyUnit: '', endTime: '', startTime: '', processResult: '', businessKeys: [], // 业务主键列表(工作流查询用,不用前端传) createUser: '', // 创建人 ids: [], // 主键集合 overhaulPerson: '', // 检修保养人 offset: 1, // 当前页 limit: 20, // 一页多少条 } // 表格数据 const list = ref<IlistApproval[]>([]) // 总数 const total = ref(0) // 表头 const columns = ref<TableColumn[]>([ { text: '检修申请编号', value: 'applyNo', align: 'center', width: '160', }, { text: '检修申请名称', value: 'applyName', align: 'center', }, { text: '申请单位', value: 'applyUnitName', align: 'center', }, { text: '申请人', value: 'applyPersonName', align: 'center', }, { text: '检修时间', value: 'time', align: 'center', width: '180', }, { text: '审批状态', value: 'approvalStatusName', align: 'center', width: '110', }, // { // text: '备注', // value: 'remark', // align: 'center', // }, ]) // 初始化路由 const $router = useRouter() // 选中的内容 const checkoutList = ref<string[]>([]) // 装载时间数组 const checkTime = ref('') const loadingTable = ref(false) // 时间变更 watch(checkTime, (val) => { if (val) { listQuery.value.startTime = `${val[0]}` listQuery.value.endTime = `${val[1]}` } else { listQuery.value.startTime = '' listQuery.value.endTime = '' } }) // 获取数据 const fetchData = (isNowPage: boolean) => { // listQuery.value.startTime = checkTime.value[0] || '' // listQuery.value.endTime = checkTime.value[1] || '' loadingTable.value = true // if (!isNowPage) { // // 是否显示当前页,否则跳转第一页 // listQuery.value.offset = 1 // } getEquipmentApplyList(listQuery.value).then((response) => { list.value = response.data.rows total.value = parseInt(response.data.total) loadingTable.value = false }).catch((_) => { loadingTable.value = false }) } // fetchData(true) // 多选发生改变时 const handleSelectionChange = (e: any) => { checkoutList.value = e.map((item: { id: string }) => item.id) } // 点击删除 const handleDelete = (row: IlistApproval) => { ElMessageBox.confirm( '确认删除所选记录吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }, ).then(() => { deleteEquipmentApply({ id: row.id, taskId: row.taskId }).then((res) => { if (res.code === 200) { ElMessage({ type: 'success', message: '删除成功', }) fetchData(true) } }) }) } // 取消 const handleCancel = (row: IlistApproval) => { const params = { processInstanceId: row.processId!, comments: '取消审批', } ElMessageBox.confirm( '确认取消该审批吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }, ).then(() => { cancelApproval(params).then(() => { ElMessage.success('取消成功') fetchData(true) }) }) } const approvalDialog = ref() // 点击搜索 const searchList = () => { fetchData(false) } // 点击重置 const clearList = () => { listQuery.value = { approvalStatus: props.status, // 审批状态 formId: SCHEDULE.DEVICE_FIX_APPROVAL, // 表单id applyName: '', // 审批名称 applyNo: '', // 审批编号 applyType: '8', // 审批类型 applyPerson: '', applyUnit: '', endTime: '', startTime: '', processResult: '', businessKeys: [], // 业务主键列表(工作流查询用,不用前端传) createUser: '', // 创建人 ids: [], // 主键集合 overhaulPerson: '', // 检修保养人 offset: 1, // 当前页 limit: 20, // 一页多少条 } checkTime.value = '' fetchData(true) } // 点击跳转 const add = () => { $router.push('/maintenance/maintenanceList/add') } // 主管部门下拉框 const options = ref<IOptions[]>([]) // 导出 const exportExcelBtn = () => { // TODO: 审批列表导出 const loading = ElLoading.service({ lock: true, text: 'Loading', background: 'rgba(255, 255, 255, 0.8)', }) loading.close() } // 页数发生变化后的操作,可能是页码变化,可能是每页容量变化,此函数必写 const changePage = (val: { size?: number; page?: number }) => { if (val && val.size) { listQuery.value.limit = val.size } if (val && val.page) { listQuery.value.offset = val.page } fetchData(true) } // 驳回后编辑 const editAgain = (row: IlistApproval) => { $router.push(`/maintenance/maintenanceList/edit/${row.id}/${row.approvalStatusName}/${row.processId}?from=reject`) } // 跳转到详情 const goDetail = (row: IlistApproval, type: string) => { $router.push({ path: `/maintenance/maintenanceList/${type}/${row.id}/${row.approvalStatusName}/${row.processId}`, query: { decisionItem: `${row.decisionItem}`, // 同意、驳回、拒绝 taskId: row.taskId, }, }) } // 获取到组织信息 const getDept = () => { const params = { roleId: '', deptType: '', tips: '', } getDeptTree(params).then((response) => { options.value = response.data }) } getDept() // 提交 const approvalSubmit = (row: IlistApproval) => { ElMessageBox.confirm('确认提交吗?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }).then(() => { submitEquipmentApply({ id: row.id, formId: SCHEDULE.DEVICE_FIX_APPROVAL, processId: row.processId }).then((res) => { if (res.code === 200) { ElMessage({ type: 'success', message: '提交成功', }) fetchData(true) } }) }) } // 审批结束回调 const approvalSuccess = () => { fetchData(true) } // 点击数据后的操作按钮 const clickBtn = (row: IlistApproval, buttonType: string) => { switch (buttonType) { case '查看': goDetail(row, 'detail') break case '提交': approvalSubmit(row) break case '编辑': if (row.approvalStatusName === '未通过-驳回') { editAgain(row) } else { goDetail(row, 'edit') } break case '同意': approvalDialog.value.initDialog('agree', row.taskId, row.decisionItem) break case '驳回': approvalDialog.value.initDialog('reject', row.taskId, row.decisionItem) break case '拒绝': approvalDialog.value.initDialog('refuse', row.taskId) break case '取消': handleCancel(row) break case '删除': handleDelete(row) break } } // 监听status变化,更新approvalStatus watch ( () => props.status, (newVal: string) => { listQuery.value.approvalStatus = newVal window.sessionStorage.setItem('maintenceListApprovalStatus', newVal) fetchData(false) }, ) // 打印列表 function printList() { // 打印列 const properties = columns.value.map((item: TableColumn) => { return { field: item.value, displayName: item.text, } }) if (checkoutList.value.length <= 0 && list.value.length > 0) { printJSON(list.value, properties, '设备检修列表') } else if (checkoutList.value.length > 0) { const printList = list.value.filter((item: IlistApproval) => checkoutList.value.includes(item.id)) printJSON(printList, properties, '设备检修列表') } else { ElMessage.warning('无可打印内容') } } onMounted(async () => { await getDict() if (window.sessionStorage.getItem('maintenceListApprovalStatus')) { listQuery.value.approvalStatus = window.sessionStorage.getItem('maintenceListApprovalStatus')! } else { listQuery.value.approvalStatus = approvalStatusReserveMap.value['全部'] } fetchData(true) }) </script> <template> <app-container> <search-area :need-clear="true" @search="searchList" @clear="clearList" > <search-item> <el-input v-model.trim="listQuery.applyNo" placeholder="检修申请编号" clearable /> </search-item> <search-item> <el-input v-model.trim="listQuery.applyName" placeholder="检修申请名称" clearable /> </search-item> <search-item> <el-date-picker v-model="checkTime" type="datetimerange" range-separator="到" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="检修开始时间" end-placeholder="检修结束时间" /> </search-item> </search-area> <table-container> <template #btns-right> <icon-button v-if="proxy.hasPerm('/device/maintenance/list/add')" icon="icon-add" title="新建" type="primary" @click="add" /> <!-- <icon-button v-if="proxy.hasPerm('/device/maintenance/lis/export')" icon="icon-export" title="导出" type="primary" @click="exportAll" /> --> <icon-button v-if="proxy.hasPerm('/device/maintenance/list/print')" icon="icon-print" title="打印" type="primary" @click="printList" /> </template> <normal-table :data="list" :total="total" :columns="columns" :query="listQuery" :list-loading="loadingTable" is-showmulti-select @change="changePage" @multi-select="handleSelectionChange" > <template #preColumns> <el-table-column label="序号" width="55" align="center"> <template #default="scope"> {{ (listQuery.offset - 1) * listQuery.limit + scope.$index + 1 }} </template> </el-table-column> </template> <template #columns> <el-table-column label="操作" align="center" :width="operationWidth" fixed="right"> <template #default="{ row }"> <el-button size="small" type="primary" link @click="clickBtn(row, '查看')" > 查看 </el-button> <el-button v-if=" row.approvalStatusName === '待审批'" size="small" link type="primary" :disabled="row.approvalStatusName !== '待审批' && row.approvalStatusName !== '审批中'" @click="clickBtn(row, '同意')" > 同意 </el-button> <el-button v-if=" row.approvalStatusName === '待审批' && row.decisionItem !== 3" size="small" link type="primary" :disabled="row.approvalStatusName !== '待审批' && row.approvalStatusName !== '审批中'" @click="clickBtn(row, '驳回')" > 驳回 </el-button> <el-button v-if=" row.approvalStatusName === '待审批' && row.decisionItem !== 2" size="small" link type="danger" :disabled="row.approvalStatusName !== '待审批' && row.approvalStatusName !== '审批中'" @click="clickBtn(row, '拒绝')" > 拒绝 </el-button> <el-button v-if="(row.approvalStatusName === '未通过-驳回') || row.approvalStatusName === '草稿箱' || row.approvalStatusName === '已取消'" size="small" link type="primary" @click="clickBtn(row, '编辑')" > 编辑 </el-button> <el-button v-if="row.approvalStatusName === '草稿箱' || row.approvalStatusName === '已取消'" size="small" link type="primary" @click="clickBtn(row, '提交')" > 提交 </el-button> <!-- 是发起者且审批中可以取消 --> <el-button v-if="row.approvalStatusName === '审批中'" size="small" link type="info" :disabled="row.approvalStatusName !== '审批中'" @click="clickBtn(row, '取消')" > 取消 </el-button> <el-button v-if="row.approvalStatusName !== '未通过' && row.approvalStatusName !== '已通过' && row.approvalStatusName !== '未通过-驳回' && row.approvalStatusName !== '审批中' && row.approvalStatusName !== '待审批'" size="small" link type="danger" :disabled="row.approvalStatusName === '未通过' || row.approvalStatusName === '已通过'" @click="clickBtn(row, '删除')" > 删除 </el-button> </template> </el-table-column> </template> </normal-table> </table-container> </app-container> <approval-dialog ref="approvalDialog" @on-success="approvalSuccess" /> </template>