feat: 退款企微审批详情与业务处理状态
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 7m2s

This commit is contained in:
luo
2026-07-24 16:30:58 +08:00
parent 9a84cd0d31
commit 4c6d871c35
10 changed files with 552 additions and 620 deletions

View File

@@ -46,6 +46,16 @@
placeholder="请输入退款原因"
/>
</ElFormItem>
<ElFormItem label="备注">
<ElInput
v-model="formData.remark"
type="textarea"
:rows="2"
maxlength="500"
show-word-limit
placeholder="请输入备注"
/>
</ElFormItem>
<ElFormItem label="退款凭证" prop="refund_voucher_key">
<VoucherUpload
ref="uploadRef"
@@ -53,6 +63,7 @@
voucher-name="退款凭证"
@uploading-change="voucherUploading = $event"
@change="formRef?.validateField('refund_voucher_key')"
@files-change="formData.attachments = $event"
/>
</ElFormItem>
</ElForm>
@@ -77,7 +88,7 @@
import { ElMessage } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import { RefundService, OrderService } from '@/api/modules'
import type { CreateRefundRequest, Order } from '@/types/api'
import type { CreateRefundRequest, Order, RefundAttachment } from '@/types/api'
import { formatMoney, yuanToFen } from '@/utils/business/format'
import { getErrorMessage } from '@/utils/business'
import VoucherUpload from '@/components/business/VoucherUpload.vue'
@@ -111,13 +122,17 @@
requested_refund_amount?: number
actual_received_amount: number
refund_reason: string
remark: string
refund_voucher_key: string[]
attachments: RefundAttachment[]
}>({
order_id: null,
requested_refund_amount: undefined,
actual_received_amount: 0,
refund_reason: '',
refund_voucher_key: []
remark: '',
refund_voucher_key: [],
attachments: []
})
const validateRefundAmount = (rule: any, value: number, callback: any) => {
@@ -201,7 +216,9 @@
formData.requested_refund_amount = undefined
formData.actual_received_amount = 0
formData.refund_reason = ''
formData.remark = ''
formData.refund_voucher_key = []
formData.attachments = []
orderSearchOptions.value = []
uploadRef.value?.clearFiles(false)
}
@@ -221,8 +238,9 @@
order_id: formData.order_id!,
requested_refund_amount: yuanToFen(formData.requested_refund_amount) ?? 0,
actual_received_amount: formData.actual_received_amount,
refund_voucher_key: formData.refund_voucher_key,
refund_reason: formData.refund_reason || undefined
attachments: formData.attachments,
refund_reason: formData.refund_reason || undefined,
remark: formData.remark || undefined
}
await RefundService.createRefund(data)
ElMessage.success('退款申请创建成功')

View File

@@ -57,6 +57,7 @@
import { Close, Document, UploadFilled } from '@element-plus/icons-vue'
import type { UploadFile, UploadInstance, UploadRawFile } from 'element-plus'
import { StorageService } from '@/api/modules'
import type { RefundAttachment } from '@/types/api/refund'
interface Props {
modelValue?: string[] | string
@@ -77,12 +78,14 @@
'update:modelValue': [value: string[]]
'uploading-change': [value: boolean]
change: [value: string[]]
'files-change': [value: RefundAttachment[]]
}>()
const rootRef = ref<HTMLElement>()
const uploadRef = ref<UploadInstance>()
const uploadingCount = ref(0)
const voucherFileKeyMap = new Map<number, string>()
const voucherFileMetadataMap = new Map<number, RefundAttachment>()
const removedUploadUids = new Set<number>()
const fileObjectUrlMap = new Map<number, string>()
const selectedUploadUids = new Set<number>()
@@ -100,6 +103,10 @@
emit('change', keys)
}
const emitFileMetadata = () => {
emit('files-change', Array.from(voucherFileMetadataMap.values()))
}
const setUploadingCount = (count: number) => {
uploadingCount.value = Math.max(0, count)
emit('uploading-change', uploadingCount.value > 0)
@@ -109,12 +116,14 @@
activeUploadBatch += 1
setUploadingCount(0)
voucherFileKeyMap.clear()
voucherFileMetadataMap.clear()
removedUploadUids.clear()
selectedUploadUids.clear()
revokeAllFileObjectUrls()
uploadRef.value?.clearFiles()
if (emitValue) {
emitVoucherKeys()
emitFileMetadata()
}
}
@@ -228,7 +237,13 @@
}
voucherFileKeyMap.set(uploadFile.uid, file_key)
voucherFileMetadataMap.set(uploadFile.uid, {
file_key,
file_name: file.name,
file_size: file.size
})
emitVoucherKeys()
emitFileMetadata()
ElMessage.success('上传成功')
} catch (error: any) {
if (uploadBatch !== activeUploadBatch) return
@@ -236,7 +251,9 @@
console.error(`上传${props.voucherName}失败:`, error)
ElMessage.error(error?.message || '上传失败,请重试')
voucherFileKeyMap.delete(uploadFile.uid)
voucherFileMetadataMap.delete(uploadFile.uid)
emitVoucherKeys()
emitFileMetadata()
removeUploadFile(uploadFile)
} finally {
if (uploadBatch === activeUploadBatch) {
@@ -250,7 +267,9 @@
selectedUploadUids.delete(uploadFile.uid)
revokeFileObjectUrl(uploadFile.uid)
voucherFileKeyMap.delete(uploadFile.uid)
voucherFileMetadataMap.delete(uploadFile.uid)
emitVoucherKeys()
emitFileMetadata()
}
const focusUploadArea = () => {