修正开票弹窗按钮文案
This commit is contained in:
parent
cde36df597
commit
92aed53158
222
web/src/views/transaction/invoice/InvoiceModal.vue
Normal file
222
web/src/views/transaction/invoice/InvoiceModal.vue
Normal file
@ -0,0 +1,222 @@
|
||||
<script setup>
|
||||
import { ref, watch } from 'vue'
|
||||
import { NModal, NCard, NForm, NFormItem, NInput, NButton, NUpload, NSpace, NText } from 'naive-ui'
|
||||
|
||||
const props = defineProps({
|
||||
visible: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
invoiceData: {
|
||||
type: Object,
|
||||
default: () => ({}),
|
||||
},
|
||||
mode: {
|
||||
type: String,
|
||||
default: 'invoice', // 'invoice' 或 'view'
|
||||
},
|
||||
})
|
||||
|
||||
const emit = defineEmits(['update:visible', 'confirm'])
|
||||
|
||||
const formRef = ref(null)
|
||||
const formData = ref({
|
||||
email: '',
|
||||
content: '',
|
||||
attachments: [],
|
||||
})
|
||||
|
||||
const fileList = ref([])
|
||||
|
||||
// 监听弹窗打开,初始化数据
|
||||
watch(
|
||||
() => props.visible,
|
||||
(val) => {
|
||||
if (val) {
|
||||
formData.value = {
|
||||
email: props.invoiceData?.email || '',
|
||||
content: '',
|
||||
attachments: [],
|
||||
}
|
||||
fileList.value = []
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
// 关闭弹窗
|
||||
const handleClose = () => {
|
||||
emit('update:visible', false)
|
||||
}
|
||||
|
||||
// 确认操作
|
||||
const handleConfirm = () => {
|
||||
formRef.value?.validate((errors) => {
|
||||
if (!errors) {
|
||||
emit('confirm', {
|
||||
...formData.value,
|
||||
id: props.invoiceData?.id,
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 文件上传前的处理
|
||||
const beforeUpload = (data) => {
|
||||
const { file } = data
|
||||
const isImage = file.type.startsWith('image/')
|
||||
const isPdf = file.type === 'application/pdf'
|
||||
|
||||
if (!isImage && !isPdf) {
|
||||
$message.error('只能上传图片或PDF文件')
|
||||
return false
|
||||
}
|
||||
|
||||
const isLt10M = file.size / 1024 / 1024 < 10
|
||||
if (!isLt10M) {
|
||||
$message.error('文件大小不能超过10MB')
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
// 文件上传变化
|
||||
const handleUploadChange = ({ fileList: newFileList }) => {
|
||||
fileList.value = newFileList
|
||||
formData.value.attachments = newFileList.map(file => file.id || file.name)
|
||||
}
|
||||
|
||||
// 移除文件
|
||||
const handleRemove = ({ file }) => {
|
||||
const index = fileList.value.findIndex(item => item.id === file.id)
|
||||
if (index > -1) {
|
||||
fileList.value.splice(index, 1)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
const rules = {
|
||||
email: [
|
||||
{
|
||||
required: true,
|
||||
message: '请输入发送邮箱',
|
||||
trigger: ['input', 'blur'],
|
||||
},
|
||||
{
|
||||
type: 'email',
|
||||
message: '请输入正确的邮箱格式',
|
||||
trigger: ['input', 'blur'],
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
const modalTitle = props.mode === 'invoice' ? '开票' : '查看发票'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NModal
|
||||
:show="visible"
|
||||
:mask-closable="false"
|
||||
preset="card"
|
||||
:title="modalTitle"
|
||||
class="invoice-modal"
|
||||
style="width: 600px"
|
||||
@update:show="handleClose"
|
||||
>
|
||||
<NForm
|
||||
ref="formRef"
|
||||
:model="formData"
|
||||
:rules="rules"
|
||||
label-placement="left"
|
||||
label-width="100"
|
||||
>
|
||||
<NFormItem label="发送邮箱" path="email">
|
||||
<NInput
|
||||
v-model:value="formData.email"
|
||||
placeholder="请输入邮箱地址"
|
||||
clearable
|
||||
/>
|
||||
</NFormItem>
|
||||
|
||||
<NFormItem label="文案">
|
||||
<NInput
|
||||
v-model:value="formData.content"
|
||||
type="textarea"
|
||||
placeholder="请输入文案内容"
|
||||
:rows="4"
|
||||
clearable
|
||||
/>
|
||||
</NFormItem>
|
||||
|
||||
<NFormItem label="发票附件">
|
||||
<div style="width: 100%">
|
||||
<NUpload
|
||||
v-model:file-list="fileList"
|
||||
multiple
|
||||
:max="2"
|
||||
list-type="image-card"
|
||||
:before-upload="beforeUpload"
|
||||
@change="handleUploadChange"
|
||||
@remove="handleRemove"
|
||||
>
|
||||
<div class="upload-trigger">
|
||||
<div class="upload-icon">+</div>
|
||||
</div>
|
||||
</NUpload>
|
||||
</div>
|
||||
</NFormItem>
|
||||
|
||||
<NFormItem>
|
||||
<div style="width: 100%; text-align: left; padding-left: 100px">
|
||||
<NText depth="3" style="font-size: 12px; color: #ff9800">
|
||||
ps:最多上传两张
|
||||
</NText>
|
||||
</div>
|
||||
</NFormItem>
|
||||
</NForm>
|
||||
|
||||
<template #footer>
|
||||
<div style="display: flex; justify-content: flex-end; gap: 12px">
|
||||
<NButton @click="handleClose">取消</NButton>
|
||||
<NButton type="primary" @click="handleConfirm">上传并通知</NButton>
|
||||
</div>
|
||||
</template>
|
||||
</NModal>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.invoice-modal {
|
||||
max-width: 90vw;
|
||||
}
|
||||
|
||||
.upload-trigger {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: 2px dashed #d9d9d9;
|
||||
border-radius: 4px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.upload-trigger:hover {
|
||||
border-color: #40a9ff;
|
||||
}
|
||||
|
||||
.upload-icon {
|
||||
font-size: 32px;
|
||||
color: #d9d9d9;
|
||||
}
|
||||
|
||||
:deep(.n-upload-file-list) {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
:deep(.n-upload-trigger) {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
}
|
||||
</style>
|
||||
Loading…
x
Reference in New Issue
Block a user