| | |
| | | const approveDialog = reactive({ visible: false, row: null }); |
| | | const approveOpinion = ref(""); |
| | | const approveSubmitting = ref(false); |
| | | const selectedRows = ref([]); |
| | | const batchApproveDialog = reactive({ visible: false }); |
| | | const batchApproveOpinion = ref(""); |
| | | const batchApproveSubmitting = ref(false); |
| | | |
| | | /** 差旅/费用报销专用详情、审批弹窗 */ |
| | | const reimburseDialog = reactive({ |
| | |
| | | { |
| | | name: "审批", |
| | | type: "text", |
| | | disabled: (row) => row.approvalStatus !== "pending" || !row.isApprove, |
| | | disabled: (row) => !canApprove(row), |
| | | clickFun: (row) => openApprove(row), |
| | | }, |
| | | // { |
| | |
| | | page.current = p; |
| | | page.size = limit; |
| | | fetchApprovalList(); |
| | | } |
| | | |
| | | function handleSelectionChange(selection) { |
| | | selectedRows.value = selection || []; |
| | | } |
| | | |
| | | function canApprove(row) { |
| | | return row?.approvalStatus === "pending" && Boolean(row?.isApprove); |
| | | } |
| | | |
| | | function openBatchApproveDialog() { |
| | | if (!selectedRows.value.length) { |
| | | ElMessage.warning("请选择数据"); |
| | | return; |
| | | } |
| | | const approveRows = selectedRows.value.filter(canApprove); |
| | | if (!approveRows.length) { |
| | | ElMessage.warning("所选数据不可审批"); |
| | | return; |
| | | } |
| | | batchApproveOpinion.value = ""; |
| | | batchApproveDialog.visible = true; |
| | | } |
| | | |
| | | async function openReimburseDetail(row, mode) { |
| | |
| | | } |
| | | } |
| | | |
| | | async function submitBatchApprove(result) { |
| | | const approveRows = selectedRows.value.filter(canApprove); |
| | | if (!approveRows.length) { |
| | | ElMessage.warning("所选数据不可审批"); |
| | | return { ok: false }; |
| | | } |
| | | if (result === "rejected" && !(batchApproveOpinion.value || "").trim()) { |
| | | return { needOpinion: true }; |
| | | } |
| | | if (batchApproveSubmitting.value) return { ok: false }; |
| | | |
| | | batchApproveSubmitting.value = true; |
| | | try { |
| | | const results = await Promise.allSettled( |
| | | approveRows.map((row) => |
| | | approveApprovalInstance( |
| | | buildApproveInstanceDto(row, result, batchApproveOpinion.value) |
| | | ) |
| | | ) |
| | | ); |
| | | const successCount = results.filter((item) => item.status === "fulfilled").length; |
| | | const failCount = approveRows.length - successCount; |
| | | |
| | | batchApproveDialog.visible = false; |
| | | await fetchApprovalList(); |
| | | return { ok: successCount > 0, result, successCount, failCount }; |
| | | } catch { |
| | | ElMessage.error("批量审批失败"); |
| | | return { ok: false }; |
| | | } finally { |
| | | batchApproveSubmitting.value = false; |
| | | } |
| | | } |
| | | |
| | | function approvalActionLabel(result) { |
| | | if (result === "approved") return "通过"; |
| | | if (result === "rejected") return "驳回"; |
| | |
| | | approveDialog, |
| | | approveOpinion, |
| | | approveSubmitting, |
| | | selectedRows, |
| | | batchApproveDialog, |
| | | batchApproveOpinion, |
| | | batchApproveSubmitting, |
| | | submitReimburseApprove, |
| | | isReimburseApprovalInstance, |
| | | submitDialog, |
| | |
| | | handleQuery, |
| | | resetSearch, |
| | | pagination, |
| | | handleSelectionChange, |
| | | openBatchApproveDialog, |
| | | resetSubmitDialogState, |
| | | openSubmitDialog, |
| | | openEditDialog, |
| | |
| | | submitInstanceForm, |
| | | submitNewApproval, |
| | | submitApprove, |
| | | submitBatchApprove, |
| | | openDetail, |
| | | openApprove, |
| | | fetchApprovalList, |
| | | }; |
| | | } |
| | | } |