| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { |
| | | getApprovalTemplateDetail, |
| | | listApprovalTemplate, |
| | | TEMPLATE_TYPE_CUSTOM, |
| | | } from "@/api/officeProcessAutomation/approvalTemplate.js"; |
| | | import { |
| | | approveApprovalInstance, |
| | | deleteApprovalInstance, |
| | | listApprovalInstancePage, |
| | | saveApprovalInstance, |
| | | updateApprovalInstance, |
| | | } from "@/api/officeProcessAutomation/approvalInstance.js"; |
| | | import { getQuotationList } from "@/api/salesManagement/salesQuotation.js"; |
| | | import { getPurchaseByCode } from "@/api/procurementManagement/procurementLedger.js"; |
| | | import { getDeliveryDetailByShippingNo } from "@/api/salesManagement/deliveryLedger.js"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { Search } from "@element-plus/icons-vue"; |
| | | import { ElMessage, ElMessageBox } from "element-plus"; |
| | | import { computed, getCurrentInstance, reactive, ref } from "vue"; |
| | | import { |
| | | inferReimburseModuleKeyFromInstance, |
| | | loadReimburseDetailForInstance, |
| | | navigateToReimburseManageForEdit, |
| | | resolveFinReimbursementIdFromInstance, |
| | | } from "../../ReimburseManage/shared/reimburseApproveBridge.js"; |
| | | import { |
| | | fetchBusinessTypeOptions, |
| | | formatDisplayTime, |
| | | mapEnabledFromApi, |
| | | unwrapTemplateList, |
| | | } from "../approve-template/approveTemplateConstants.js"; |
| | | import { |
| | | buildFormPayloadRules, |
| | | buildTemplateBindingFromDetail, |
| | | validateTemplateBinding, |
| | | } from "../approve-shared/approvalTemplateBindingUtils.js"; |
| | | import { |
| | | APPROVAL_STATUS_SEARCH_OPTIONS, |
| | | APPROVAL_TYPE_OPTIONS, |
| | | approvalStatusLabel, |
| | | approvalStatusTagType, |
| | | approvalTypeLabel, |
| | | buildApprovalInstanceListParams, |
| | | buildApproveInstanceDto, |
| | | buildEditFormFromInstanceRow, |
| | | buildInstanceDto, |
| | | createEmptySubmitForm, |
| | | mapInstanceFromApi, |
| | | mapSubmitTemplateCard, |
| | | matchBusinessTypeValue, |
| | | unwrapInstancePage, |
| | | } from "./approveListConstants.js"; |
| | | |
| | | export function useApproveList() { |
| | | const { proxy } = getCurrentInstance() || {}; |
| | | const userStore = useUserStore(); |
| | | |
| | | const tableData = ref([]); |
| | | const searchBusinessTypeOptions = ref([]); |
| | | const submitBusinessTypeOptions = ref([]); |
| | | const allSubmitTemplates = ref([]); |
| | | const selectedBusinessType = ref(""); |
| | | const submitTemplatesLoading = ref(false); |
| | | |
| | | const submitTemplateCards = computed(() => { |
| | | if (selectedBusinessType.value == null || selectedBusinessType.value === "") return []; |
| | | return allSubmitTemplates.value.filter((card) => |
| | | matchBusinessTypeValue(card.businessType, selectedBusinessType.value) |
| | | ); |
| | | }); |
| | | |
| | | const searchForm = reactive({ |
| | | businessType: "", |
| | | status: "", |
| | | createTimeRange: [], |
| | | }); |
| | | |
| | | const tableLoading = ref(false); |
| | | const page = reactive({ current: 1, size: 10, total: 0 }); |
| | | |
| | | const detailDialog = reactive({ visible: false }); |
| | | const detailRow = ref({}); |
| | | const detailData = ref({}); |
| | | |
| | | const approveDialog = reactive({ visible: false, row: null }); |
| | | const approveOpinion = ref(""); |
| | | const approveSubmitting = ref(false); |
| | | |
| | | /** å·®æ
/è´¹ç¨æ¥éä¸ç¨è¯¦æ
ã审æ¹å¼¹çª */ |
| | | const reimburseDialog = reactive({ |
| | | visible: false, |
| | | mode: "detail", |
| | | moduleKey: "", |
| | | loading: false, |
| | | reimburseRow: {}, |
| | | instanceRow: null, |
| | | }); |
| | | |
| | | const submitDialog = reactive({ visible: false, step: 1, mode: "add" }); |
| | | const submitEditRow = ref(null); |
| | | const submitForm = reactive(createEmptySubmitForm("")); |
| | | const submitFormRef = ref(); |
| | | const submitSaving = ref(false); |
| | | |
| | | const isSubmitEdit = computed(() => submitDialog.mode === "edit"); |
| | | const submitDialogTitle = computed(() => { |
| | | if (submitDialog.mode === "edit") { |
| | | return `ä¿®æ¹${activeTemplate.value?.label || submitForm.templateName || "审æ¹"}`; |
| | | } |
| | | if (submitDialog.step === 1) return "éæ©æ¨¡æ¿ç±»å"; |
| | | if (submitDialog.step === 2) return `éæ©å®¡æ¹æ¨¡æ¿${businessTypeLabel(selectedBusinessType.value) ? `ï¼${businessTypeLabel(selectedBusinessType.value)}ï¼` : ""}`; |
| | | return `æäº¤${activeTemplate.value?.label || "审æ¹"}`; |
| | | }); |
| | | |
| | | const selectedBusinessTypeLabel = computed(() => businessTypeLabel(selectedBusinessType.value)); |
| | | |
| | | function businessTypeLabel(type) { |
| | | if (type == null || type === "") return ""; |
| | | const hit = submitBusinessTypeOptions.value.find((x) => matchBusinessTypeValue(x.value, type)); |
| | | return hit?.label || ""; |
| | | } |
| | | |
| | | function countTemplatesByBusinessType(type) { |
| | | return allSubmitTemplates.value.filter((card) => matchBusinessTypeValue(card.businessType, type)).length; |
| | | } |
| | | |
| | | const activeTemplate = computed(() => submitForm.templateSnapshot || null); |
| | | |
| | | /** å¡«æ¥é¡¹å®ä¹ï¼æ°å¢/ä¿®æ¹ä¸ formConfig ä¸è´ï¼ */ |
| | | const submitFormFields = computed(() => { |
| | | const tplFields = activeTemplate.value?.fields; |
| | | if (tplFields?.length) return tplFields; |
| | | return submitForm.formFieldDefs || []; |
| | | }); |
| | | |
| | | const submitFormRules = computed(() => ({ |
| | | templateKey: [{ required: true, message: "è¯·éæ©å®¡æ¹ç±»å", trigger: "change" }], |
| | | ...buildFormPayloadRules(submitFormFields.value), |
| | | })); |
| | | |
| | | const tableColumn = ref([ |
| | | // { label: "ç³è¯·äººç¼å·", prop: "applicantNo", width: 110 }, |
| | | { label: "å起人", prop: "applicantName", minWidth: 100 }, |
| | | { label: "模æ¿ç±»å", prop: "businessName", minWidth: 120 }, |
| | | { |
| | | label: "审æ¹ç±»å", |
| | | prop: "approvalType", |
| | | minWidth: 140, |
| | | dataType: "slot", |
| | | slot: "approveType", |
| | | }, |
| | | { |
| | | label: "å¾
æå®¡æ¹", |
| | | prop: "unread", |
| | | width: 90, |
| | | align: "center", |
| | | dataType: "tag", |
| | | formatData: (v) => (v ? "æ¯" : "å¦"), |
| | | formatType: (v) => (v ? "success" : "danger"), |
| | | }, |
| | | { |
| | | label: "审æ¹ç¶æ", |
| | | prop: "approvalStatus", |
| | | width: 100, |
| | | dataType: "tag", |
| | | formatData: (v) => approvalStatusLabel(v), |
| | | formatType: (v) => approvalStatusTagType(v), |
| | | }, |
| | | { |
| | | label: "å建æ¶é´", |
| | | prop: "createTime", |
| | | width: 170, |
| | | formatData: (v) => formatDisplayTime(v), |
| | | }, |
| | | { |
| | | dataType: "action", |
| | | label: "æä½", |
| | | align: "center", |
| | | fixed: "right", |
| | | width: 240, |
| | | operation: [ |
| | | { name: "详æ
", type: "text", clickFun: (row) => openDetail(row) }, |
| | | { |
| | | name: "ä¿®æ¹", |
| | | type: "text", |
| | | disabled: (row) => row.approvalStatus !== "pending", |
| | | clickFun: (row) => openEditDialog(row), |
| | | }, |
| | | { |
| | | name: "审æ¹", |
| | | type: "text", |
| | | disabled: (row) => row.approvalStatus !== "pending" || !row.isApprove, |
| | | clickFun: (row) => openApprove(row), |
| | | }, |
| | | { |
| | | name: "å é¤", |
| | | type: "danger", |
| | | clickFun: (row) => removeInstance(row), |
| | | }, |
| | | ], |
| | | }, |
| | | ]); |
| | | |
| | | async function fetchApprovalList() { |
| | | tableLoading.value = true; |
| | | try { |
| | | const res = await listApprovalInstancePage( |
| | | buildApprovalInstanceListParams({ page, searchForm }) |
| | | ); |
| | | const { records, total } = unwrapInstancePage(res); |
| | | tableData.value = records.map(mapInstanceFromApi); |
| | | page.total = total; |
| | | } catch { |
| | | tableData.value = []; |
| | | page.total = 0; |
| | | ElMessage.error("审æ¹å表å 载失败"); |
| | | } finally { |
| | | tableLoading.value = false; |
| | | } |
| | | } |
| | | |
| | | async function loadSubmitTemplates() { |
| | | submitTemplatesLoading.value = true; |
| | | try { |
| | | const [typeOptions, customRes] = await Promise.all([ |
| | | fetchBusinessTypeOptions(), |
| | | listApprovalTemplate(TEMPLATE_TYPE_CUSTOM), |
| | | ]); |
| | | submitBusinessTypeOptions.value = typeOptions.filter((x) => ![5, 6, 7].includes(x.value)); |
| | | allSubmitTemplates.value = unwrapTemplateList(customRes) |
| | | .filter((row) => mapEnabledFromApi(row.enabled)) |
| | | .map(mapSubmitTemplateCard); |
| | | } catch { |
| | | submitBusinessTypeOptions.value = []; |
| | | allSubmitTemplates.value = []; |
| | | ElMessage.error("å è½½å®¡æ¹æ¨¡æ¿å¤±è´¥"); |
| | | } finally { |
| | | submitTemplatesLoading.value = false; |
| | | } |
| | | } |
| | | |
| | | function handleQuery() { |
| | | page.current = 1; |
| | | fetchApprovalList(); |
| | | } |
| | | |
| | | function resetSearch() { |
| | | searchForm.businessType = ""; |
| | | searchForm.status = ""; |
| | | searchForm.createTimeRange = []; |
| | | handleQuery(); |
| | | } |
| | | |
| | | async function loadSearchBusinessTypeOptions() { |
| | | try { |
| | | searchBusinessTypeOptions.value = await fetchBusinessTypeOptions(); |
| | | } catch { |
| | | searchBusinessTypeOptions.value = []; |
| | | } |
| | | } |
| | | |
| | | function pagination({ page: p, limit }) { |
| | | page.current = p; |
| | | page.size = limit; |
| | | fetchApprovalList(); |
| | | } |
| | | |
| | | async function openReimburseDetail(row, mode) { |
| | | const moduleKey = inferReimburseModuleKeyFromInstance(row); |
| | | if (!moduleKey) return false; |
| | | reimburseDialog.mode = mode; |
| | | reimburseDialog.moduleKey = moduleKey; |
| | | reimburseDialog.instanceRow = row; |
| | | reimburseDialog.visible = true; |
| | | reimburseDialog.loading = true; |
| | | reimburseDialog.reimburseRow = {}; |
| | | try { |
| | | const { reimburseRow, moduleKey: resolvedMk } = |
| | | await loadReimburseDetailForInstance(row, moduleKey); |
| | | reimburseDialog.moduleKey = resolvedMk || moduleKey; |
| | | reimburseDialog.reimburseRow = reimburseRow; |
| | | return true; |
| | | } catch { |
| | | ElMessage.error("å è½½æ¥é详æ
失败"); |
| | | reimburseDialog.visible = false; |
| | | return false; |
| | | } finally { |
| | | reimburseDialog.loading = false; |
| | | } |
| | | } |
| | | |
| | | async function openDetail(row) { |
| | | if (isReimburseApprovalInstance(row)) { |
| | | await openReimburseDetail(row, "detail"); |
| | | return; |
| | | } |
| | | |
| | | detailRow.value = { ...row }; |
| | | // æ¥ä»·å®¡æ¹ï¼ç¨å®¡æ¹äºç±å段æ¿è½½ç"æ¥ä»·åå·"廿¥æ¥ä»·å表 |
| | | if (row.businessType === 6) { |
| | | const quotationNo = row?.quotationNo; |
| | | if (quotationNo) { |
| | | const res = await getQuotationList({ quotationNo }); |
| | | const records = res?.data?.records || []; |
| | | detailData.value = records[0] || {}; |
| | | } |
| | | } |
| | | |
| | | // éè´å®¡æ¹ï¼ç¨å®¡æ¹äºç±å段æ¿è½½ç"éè´ååå·"廿¥éè´è¯¦æ
|
| | | else if (row.businessType === 5) { |
| | | const purchaseContractNumber = row?.purchaseContractNumber; |
| | | if (purchaseContractNumber) { |
| | | const res = await getPurchaseByCode({ purchaseContractNumber }); |
| | | detailData.value = res || {}; |
| | | } |
| | | } |
| | | |
| | | // å货审æ¹ï¼ç¨å®¡æ¹äºç±å段æ¿è½½ç"åè´§åå·"廿¥å货详æ
|
| | | else if (row.businessType === 7) { |
| | | const shippingNo = row?.shippingNo; |
| | | if (shippingNo) { |
| | | const res = await getDeliveryDetailByShippingNo({ shippingNo }); |
| | | detailData.value = res?.data || res || {}; |
| | | } |
| | | } |
| | | |
| | | // å
¶ä»å®¡æ¹ç±»å |
| | | else { |
| | | detailData.value = {}; |
| | | } |
| | | |
| | | detailDialog.visible = true; |
| | | } |
| | | |
| | | async function openApprove(row) { |
| | | |
| | | if (inferReimburseModuleKeyFromInstance(row)) { |
| | | approveOpinion.value = ""; |
| | | await openReimburseDetail(row, "approve"); |
| | | return; |
| | | } |
| | | approveDialog.row = { ...row }; |
| | | approveOpinion.value = ""; |
| | | // æ¥ä»·å®¡æ¹ï¼ç¨å®¡æ¹äºç±å段æ¿è½½ç"æ¥ä»·åå·"廿¥æ¥ä»·å表 |
| | | if (row.businessType === 6) { |
| | | const quotationNo = row?.quotationNo; |
| | | if (quotationNo) { |
| | | const res = await getQuotationList({ quotationNo }); |
| | | const records = res?.data?.records || []; |
| | | detailData.value = records[0] || {}; |
| | | } |
| | | } |
| | | |
| | | // éè´å®¡æ¹ï¼ç¨å®¡æ¹äºç±å段æ¿è½½ç"éè´ååå·"廿¥éè´è¯¦æ
|
| | | else if (row.businessType === 5) { |
| | | const purchaseContractNumber = row?.purchaseContractNumber; |
| | | if (purchaseContractNumber) { |
| | | const res = await getPurchaseByCode({ purchaseContractNumber }); |
| | | detailData.value = res || {}; |
| | | } |
| | | } |
| | | |
| | | // å货审æ¹ï¼ç¨å®¡æ¹äºç±å段æ¿è½½ç"åè´§åå·"廿¥å货详æ
|
| | | else if (row.businessType === 7) { |
| | | const shippingNo = row?.shippingNo; |
| | | if (shippingNo) { |
| | | const res = await getDeliveryDetailByShippingNo({ shippingNo }); |
| | | detailData.value = res?.data || res || {}; |
| | | } |
| | | } |
| | | |
| | | // å
¶ä»å®¡æ¹ç±»å |
| | | else { |
| | | detailData.value = {}; |
| | | } |
| | | approveDialog.visible = true; |
| | | } |
| | | |
| | | function isReimburseApprovalInstance(row) { |
| | | return Boolean(inferReimburseModuleKeyFromInstance(row)); |
| | | } |
| | | |
| | | function resetSubmitDialogState() { |
| | | submitDialog.mode = "add"; |
| | | submitDialog.step = 1; |
| | | selectedBusinessType.value = ""; |
| | | submitEditRow.value = null; |
| | | Object.assign(submitForm, createEmptySubmitForm("")); |
| | | } |
| | | |
| | | function openSubmitDialog() { |
| | | resetSubmitDialogState(); |
| | | submitDialog.visible = true; |
| | | loadSubmitTemplates(); |
| | | } |
| | | |
| | | async function openEditDialog(row) { |
| | | if (row?.approvalStatus !== "pending") { |
| | | ElMessage.warning("ä»
å®¡æ ¸ä¸ç审æ¹å¯ä¿®æ¹"); |
| | | return; |
| | | } |
| | | const moduleKey = inferReimburseModuleKeyFromInstance(row); |
| | | if (moduleKey) { |
| | | const rid = resolveFinReimbursementIdFromInstance(row); |
| | | if (rid == null) { |
| | | ElMessage.warning("æ æ³ä¿®æ¹ï¼ç¼ºå°æ¥éå ID"); |
| | | return; |
| | | } |
| | | try { |
| | | await navigateToReimburseManageForEdit(proxy?.$router, moduleKey, rid); |
| | | } catch { |
| | | ElMessage.warning("æªæ¾å°å·®æ
/è´¹ç¨æ¥éèåè·¯ç±ï¼è¯·ä»å·¦ä¾§èåè¿å
¥ååç¼è¾"); |
| | | } |
| | | return; |
| | | } |
| | | if (!row?.id) { |
| | | ElMessage.warning("æ æ³ä¿®æ¹ï¼ç¼ºå°å®¡æ¹å®ä¾ ID"); |
| | | return; |
| | | } |
| | | submitDialog.mode = "edit"; |
| | | submitDialog.step = 3; |
| | | submitEditRow.value = { ...row }; |
| | | Object.assign(submitForm, buildEditFormFromInstanceRow(row)); |
| | | submitDialog.visible = true; |
| | | } |
| | | |
| | | async function onTemplatePick(card) { |
| | | if (!card?.id) return; |
| | | submitTemplatesLoading.value = true; |
| | | try { |
| | | const res = await getApprovalTemplateDetail(card.id); |
| | | const applied = buildTemplateBindingFromDetail(res); |
| | | Object.assign(submitForm, { |
| | | templateKey: String(card.id), |
| | | ...applied, |
| | | businessType: |
| | | applied.businessType ?? card.businessType ?? selectedBusinessType.value, |
| | | }); |
| | | submitDialog.step = 3; |
| | | } catch { |
| | | ElMessage.error("å 载模æ¿è¯¦æ
失败"); |
| | | } finally { |
| | | submitTemplatesLoading.value = false; |
| | | } |
| | | } |
| | | |
| | | function onBusinessTypePick(type) { |
| | | if (!countTemplatesByBusinessType(type)) { |
| | | ElMessage.warning("该类å䏿æ å¯ç¨å®¡æ¹æ¨¡æ¿"); |
| | | return; |
| | | } |
| | | selectedBusinessType.value = type; |
| | | submitDialog.step = 2; |
| | | } |
| | | |
| | | function backToBusinessTypePick() { |
| | | selectedBusinessType.value = ""; |
| | | submitDialog.step = 1; |
| | | } |
| | | |
| | | function backToTemplatePick() { |
| | | submitDialog.step = 2; |
| | | } |
| | | |
| | | async function submitInstanceForm() { |
| | | if (submitDialog.mode === "edit") return submitEditApproval(); |
| | | return submitNewApproval(); |
| | | } |
| | | |
| | | async function submitNewApproval() { |
| | | if (!submitFormRef.value) return false; |
| | | try { |
| | | await submitFormRef.value.validate(); |
| | | } catch { |
| | | return false; |
| | | } |
| | | if (!activeTemplate.value) return false; |
| | | const bindingCheck = validateTemplateBinding({ flowNodes: submitForm.flowNodes }); |
| | | if (!bindingCheck.ok) { |
| | | ElMessage.warning(bindingCheck.message); |
| | | return false; |
| | | } |
| | | if (!submitForm.templateId) { |
| | | ElMessage.warning("ç¼ºå°æ¨¡æ¿ IDï¼æ æ³æäº¤"); |
| | | return false; |
| | | } |
| | | if (submitSaving.value) return false; |
| | | submitSaving.value = true; |
| | | try { |
| | | await saveApprovalInstance( |
| | | buildInstanceDto({ |
| | | submitForm, |
| | | activeTemplate: activeTemplate.value, |
| | | userStore, |
| | | flowNodes: bindingCheck.nodes, |
| | | }) |
| | | ); |
| | | submitDialog.visible = false; |
| | | page.current = 1; |
| | | await fetchApprovalList(); |
| | | return true; |
| | | } catch { |
| | | return false; |
| | | } finally { |
| | | submitSaving.value = false; |
| | | } |
| | | } |
| | | |
| | | async function submitEditApproval() { |
| | | if (!submitFormRef.value) return false; |
| | | try { |
| | | await submitFormRef.value.validate(); |
| | | } catch { |
| | | return false; |
| | | } |
| | | if (!activeTemplate.value) return false; |
| | | const bindingCheck = validateTemplateBinding({ flowNodes: submitForm.flowNodes }); |
| | | if (!bindingCheck.ok) { |
| | | ElMessage.warning(bindingCheck.message); |
| | | return false; |
| | | } |
| | | if (!submitForm.instanceId) { |
| | | ElMessage.warning("缺å°å®¡æ¹å®ä¾ IDï¼æ æ³ä¿å"); |
| | | return false; |
| | | } |
| | | if (submitSaving.value) return false; |
| | | submitSaving.value = true; |
| | | try { |
| | | await updateApprovalInstance( |
| | | buildInstanceDto({ |
| | | submitForm, |
| | | activeTemplate: activeTemplate.value, |
| | | flowNodes: bindingCheck.nodes, |
| | | existingRow: submitEditRow.value, |
| | | }) |
| | | ); |
| | | submitDialog.visible = false; |
| | | await fetchApprovalList(); |
| | | if (detailDialog.visible && detailRow.value?.id === submitForm.instanceId) { |
| | | const hit = tableData.value.find((r) => r.id === submitForm.instanceId); |
| | | if (hit) detailRow.value = { ...hit }; |
| | | else detailDialog.visible = false; |
| | | } |
| | | return true; |
| | | } catch { |
| | | return false; |
| | | } finally { |
| | | submitSaving.value = false; |
| | | } |
| | | } |
| | | |
| | | async function removeInstance(row) { |
| | | if (row?.id == null || row.id === "") { |
| | | ElMessage.warning("æ æ³å é¤ï¼ç¼ºå°å®¡æ¹å®ä¾ ID"); |
| | | return; |
| | | } |
| | | const title = row.title || row.templateName || row.instanceNo || "该审æ¹"; |
| | | try { |
| | | await ElMessageBox.confirm( |
| | | `ç¡®å®è¦å é¤å®¡æ¹ã${title}ãåï¼å é¤åä¸å¯æ¢å¤ã`, |
| | | "å é¤ç¡®è®¤", |
| | | { |
| | | type: "warning", |
| | | confirmButtonText: "ç¡®å®å é¤", |
| | | cancelButtonText: "åæ¶", |
| | | distinguishCancelAndClose: true, |
| | | autofocus: false, |
| | | } |
| | | ); |
| | | } catch { |
| | | return; |
| | | } |
| | | try { |
| | | await deleteApprovalInstance([row.id]); |
| | | ElMessage.success("å 餿å"); |
| | | if (detailDialog.visible && detailRow.value?.id === row.id) { |
| | | detailDialog.visible = false; |
| | | } |
| | | if (approveDialog.visible && approveDialog.row?.id === row.id) { |
| | | approveDialog.visible = false; |
| | | } |
| | | await fetchApprovalList(); |
| | | } catch { |
| | | /* éè¯¯ç±æ¦æªå¨æç¤º */ |
| | | } |
| | | } |
| | | |
| | | async function submitReimburseApprove(result) { |
| | | const row = reimburseDialog.instanceRow; |
| | | if (!row?.id) return { ok: false }; |
| | | if (result === "rejected" && !(approveOpinion.value || "").trim()) { |
| | | return { needOpinion: true }; |
| | | } |
| | | if (approveSubmitting.value) return { ok: false }; |
| | | approveSubmitting.value = true; |
| | | try { |
| | | await approveApprovalInstance( |
| | | buildApproveInstanceDto(row, result, approveOpinion.value) |
| | | ); |
| | | reimburseDialog.visible = false; |
| | | await fetchApprovalList(); |
| | | return { ok: true, result }; |
| | | } catch { |
| | | ElMessage.error("å®¡æ¹æä½å¤±è´¥"); |
| | | return { ok: false }; |
| | | } finally { |
| | | approveSubmitting.value = false; |
| | | } |
| | | } |
| | | |
| | | async function submitApprove(result) { |
| | | const row = approveDialog.row; |
| | | if (!row?.id) return { ok: false }; |
| | | if (result === "rejected" && !(approveOpinion.value || "").trim()) { |
| | | return { needOpinion: true }; |
| | | } |
| | | if (approveSubmitting.value) return { ok: false }; |
| | | approveSubmitting.value = true; |
| | | try { |
| | | await approveApprovalInstance( |
| | | buildApproveInstanceDto(row, result, approveOpinion.value) |
| | | ); |
| | | approveDialog.visible = false; |
| | | await fetchApprovalList(); |
| | | if (detailDialog.visible && detailRow.value?.id === row.id) { |
| | | const hit = tableData.value.find((r) => r.id === row.id); |
| | | if (hit) detailRow.value = { ...hit }; |
| | | else detailDialog.visible = false; |
| | | } |
| | | return { ok: true, result }; |
| | | } catch { |
| | | ElMessage.error("å®¡æ¹æä½å¤±è´¥"); |
| | | return { ok: false }; |
| | | } finally { |
| | | approveSubmitting.value = false; |
| | | } |
| | | } |
| | | |
| | | function approvalActionLabel(result) { |
| | | if (result === "approved") return "éè¿"; |
| | | if (result === "rejected") return "驳å"; |
| | | return "å¾
å¤ç"; |
| | | } |
| | | |
| | | return { |
| | | Search, |
| | | APPROVAL_TYPE_OPTIONS, |
| | | APPROVAL_STATUS_SEARCH_OPTIONS, |
| | | searchBusinessTypeOptions, |
| | | loadSearchBusinessTypeOptions, |
| | | approvalTypeLabel, |
| | | approvalStatusLabel, |
| | | approvalStatusTagType, |
| | | approvalActionLabel, |
| | | searchForm, |
| | | tableLoading, |
| | | page, |
| | | tableData, |
| | | tableColumn, |
| | | detailDialog, |
| | | detailRow, |
| | | detailData, |
| | | reimburseDialog, |
| | | approveDialog, |
| | | approveOpinion, |
| | | approveSubmitting, |
| | | submitReimburseApprove, |
| | | isReimburseApprovalInstance, |
| | | submitDialog, |
| | | isSubmitEdit, |
| | | submitDialogTitle, |
| | | submitForm, |
| | | submitFormRef, |
| | | submitSaving, |
| | | activeTemplate, |
| | | submitFormFields, |
| | | submitFormRules, |
| | | submitBusinessTypeOptions, |
| | | submitTemplateCards, |
| | | selectedBusinessType, |
| | | selectedBusinessTypeLabel, |
| | | businessTypeLabel, |
| | | countTemplatesByBusinessType, |
| | | submitTemplatesLoading, |
| | | handleQuery, |
| | | resetSearch, |
| | | pagination, |
| | | resetSubmitDialogState, |
| | | openSubmitDialog, |
| | | openEditDialog, |
| | | onBusinessTypePick, |
| | | onTemplatePick, |
| | | backToBusinessTypePick, |
| | | backToTemplatePick, |
| | | submitInstanceForm, |
| | | submitNewApproval, |
| | | submitApprove, |
| | | openDetail, |
| | | openApprove, |
| | | fetchApprovalList, |
| | | }; |
| | | } |