Commit 60967843 by zhangxingmin

Merge remote-tracking branch 'origin/dev' into prod

parents 8d346c7b a80f9154
......@@ -498,7 +498,7 @@ const splitTableColumns = ref([
editType: 'input',
prop: 'originalAmount',
label: '原币种金额',
inputType: 'decimal',
inputType: 'decimalNumber',
required: true,
width: 150
},
......@@ -632,7 +632,7 @@ const rateExchangeConfig = [
type: 'input',
prop: 'originalAmount',
label: '原币种金额',
inputType: 'decimal',
inputType: 'decimalNumber',
rules: [{ required: true, message: '只能输入正整数和小数', trigger: 'blur' }]
},
// 汇率3(原币种->港币)
......@@ -1219,7 +1219,7 @@ const addCheckRecordConfig = [
type: 'input',
prop: 'originalAmount',
label: '原币种金额',
inputType: 'decimal',
inputType: 'decimalNumber',
rules: [{ required: true, message: '只能输入正整数和小数', trigger: 'blur' }]
},
// 汇率3(原币种->港币)
......
......@@ -46,14 +46,19 @@
<!-- <el-table-column prop="fortuneAccountBizId" label="业务ID" min-width="120" sortable /> -->
<el-table-column prop="broker" label="转介人" min-width="120" sortable />
<el-table-column prop="team" label="所属团队" min-width="120" sortable />
<el-table-column prop="hkdAmount" label="出账金额" width="120" sortable>
<el-table-column prop="hkdAmount" label="港币金额" width="120" sortable>
<template #default="scope">
{{ formatCurrency(scope.row.hkdAmount, '', 4) }}
</template>
</el-table-column>
<el-table-column prop="currency" label="出账币种" width="120" sortable>
<el-table-column prop="payoutCurrency" label="发放币种" width="120" sortable>
<template #default="scope">
<dict-tag :options="currencyTypeOptions" :value="scope.row.currency" />
<dict-tag :options="currencyTypeOptions" :value="scope.row.payoutCurrency" />
</template>
</el-table-column>
<el-table-column prop="payoutAmount" label="发放金额" width="120" sortable>
<template #default="scope">
{{ formatCurrency(scope.row.payoutAmount, '', 4) }}
</template>
</el-table-column>
<el-table-column prop="status" label="出账状态" width="150" sortable>
......@@ -115,7 +120,7 @@
<el-col :xs="24" :sm="12" :md="6" class="text-center mb-4">
<el-statistic
title="原币种总金额"
:value="currentRow.hkdAmount"
:value="currentRow.payoutAmount"
:formatter="value => formatCurrency(value, '', 4)"
/>
</el-col>
......@@ -202,8 +207,6 @@
</el-table-column>
<el-table-column label="原币种金额" prop="fromAmount" width="150">
<template #default="scope">
<!--等生产没问题再删除 @input="val => (scope.row.fromAmount = amountInput.filterInput(val, 4))"
@blur="billInputBlur('fromAmount', scope.row)" -->
<el-input
v-model="scope.row.fromAmount"
placeholder="请输入"
......@@ -255,7 +258,6 @@
v-model="scope.row.toAmount"
placeholder="请输入"
clearable
:disabled="true"
@input="val => (scope.row.toAmount = amountInput.filterInput(val, 4))"
:formatter="value => inputThousands(value)"
:parser="value => value.replace(/\$\s?|(,*)/g, '')"
......@@ -674,7 +676,7 @@ const getSplitTableList = async (searchParams = {}) => {
billTableList.value = [
{
brokerName: currentRow.value.broker,
fromAmount: Number(currentRow.value.hkdAmount).toFixed(4),
fromAmount: Number(currentRow.value.payoutAmount).toFixed(4),
internalNumber: userSale.data ? userSale.data.internalNumber : '',
id: generateId(),
exchangeRate: '0.00',
......
......@@ -105,7 +105,7 @@ const tableColumns = ref([
{ prop: 'toCurrency', label: '目标币种', sortable: true, width: '150' },
{ prop: 'fortuneAccountMonth', label: '出账月(实)', sortable: true, width: '150' },
{ prop: 'billOrg', label: '出账机构', sortable: true, width: '150' },
{ prop: 'hkdAmount', label: '本期总出账金额(原币种)', sortable: true, width: '150' }
{ prop: 'amount', label: '本期总出账金额(原币种)', sortable: true, width: '150' }
// { prop: 'fortuneAccountBizId', label: '出账记录业务id', sortable: true, width: '150'},
])
// 添加表格引用
......
......@@ -151,54 +151,6 @@
<!-- 文件预览弹窗 -->
<FilePreview ref="filePreviewRef" />
<!-- <el-dialog
v-model="previewDialogVisible"
:title="previewFileName"
width="90%"
:close-on-click-modal="false"
destroy-on-close
@close="closePreview"
>
<div class="preview-container">
<div v-if="previewFileType === 'image'" class="preview-image-wrapper">
<img :src="previewUrl" class="preview-image" alt="预览图片" />
</div>
<div v-else-if="previewFileType === 'pdf'" class="pdf-viewer">
<div class="pdf-toolbar">
<el-button-group>
<el-button size="small" @click="zoomOut">
<el-icon><ZoomOut /></el-icon> 缩小
</el-button>
<el-button size="small" @click="zoomIn">
<el-icon><ZoomIn /></el-icon> 放大
</el-button>
</el-button-group>
<span class="page-info">共 {{ pdfTotalPages }} 页</span>
</div>
<div
class="pdf-scroll-wrapper"
v-loading="pdfLoading"
element-loading-text="正在渲染页面..."
>
<div ref="pdfScrollContainer" class="pdf-scroll-container"></div>
</div>
</div>
<div v-else-if="previewFileType === 'unsupported'" class="preview-unsupported">
<el-icon :size="48" color="#909399"><Document /></el-icon>
<p>暂不支持预览此类型文件</p>
<el-button type="primary" @click="previewDialogVisible = false"> 关闭 </el-button>
</div>
</div>
</el-dialog> -->
<el-dialog v-model="imageViewerVisible" title="图片预览" width="60%">
<div style="text-align: center">
<el-image :src="imageUrl" fit="contain" />
</div>
</el-dialog>
</div>
</template>
......@@ -247,160 +199,7 @@ const limit = ref(10)
const fileSize = ref(10)
const headers = ref({ Authorization: 'Bearer ' + getToken() })
const uploadImgUrl = ref(import.meta.env.VITE_APP_BASE_API + '/oss/api/oss/upload') // 上传的服务器地址
// PDF 预览相关
const pdfCanvasRef = ref(null) // canvas 元素引用
// 修改 pdfDoc 的定义
const pdfDoc = shallowRef(null) // pdf 文档实例
const pdfScale = ref(1.2) // 缩放比例
// 新增标志:是否取消PDF加载
let pdfLoadingCanceled = false
// ==================== 文件预览弹窗 ====================
const previewDialogVisible = ref(false)
const previewUrl = ref('')
const previewFileName = ref('')
const previewFileType = ref('') // 'image', 'pdf', 'unsupported'
const pdfScrollContainer = ref(null) // 滚动容器的 ref
const pdfTotalPages = ref(0) // 总页数(仅供显示)
const isRendering = ref(false) // 防止重复渲染
const loadPdf = async url => {
pdfLoadingCanceled = false
pdfLoading.value = true
try {
if (pdfDoc.value) {
await pdfDoc.value.destroy().catch(() => {})
pdfDoc.value = null
}
// 清空滚动容器
if (pdfScrollContainer.value) {
pdfScrollContainer.value.innerHTML = ''
}
const loadingTask = PDFJS.getDocument(url)
pdfDoc.value = await loadingTask.promise
if (pdfLoadingCanceled) {
if (pdfDoc.value) pdfDoc.value.destroy()
pdfLoading.value = false
return
}
pdfTotalPages.value = pdfDoc.value.numPages
await renderAllPages(pdfScale.value) // 渲染所有页面
pdfLoading.value = false
} catch (err) {
if (!pdfLoadingCanceled) {
console.error('PDF 加载失败', err)
ElMessage.error('PDF 文件加载失败,请检查文件链接')
previewDialogVisible.value = false
}
pdfLoading.value = false
}
}
// 修改 renderPdfPage,增加有效性检查
const renderPdfPage = async pageNum => {
if (!pdfDoc.value || pdfLoadingCanceled) return
try {
const page = await pdfDoc.value.getPage(pageNum)
const viewport = page.getViewport({ scale: pdfScale.value })
const canvas = pdfCanvasRef.value
if (!canvas) return
const context = canvas.getContext('2d')
canvas.height = viewport.height
canvas.width = viewport.width
const renderContext = {
canvasContext: context,
viewport: viewport
}
await page.render(renderContext).promise
} catch (err) {
if (!pdfLoadingCanceled) {
console.error('渲染PDF页失败', err)
}
}
}
const renderAllPages = async scale => {
if (!pdfDoc.value || pdfLoadingCanceled || isRendering.value) return
isRendering.value = true
pdfLoading.value = true // 显示加载状态
const container = pdfScrollContainer.value
if (!container) {
isRendering.value = false
return
}
// 清空之前的 canvas
container.innerHTML = ''
try {
const promises = []
for (let pageNum = 1; pageNum <= pdfTotalPages.value; pageNum++) {
if (pdfLoadingCanceled) break
const page = await pdfDoc.value.getPage(pageNum)
const viewport = page.getViewport({ scale })
// 创建 canvas 元素
const canvas = document.createElement('canvas')
canvas.className = 'pdf-page-canvas'
const context = canvas.getContext('2d')
canvas.height = viewport.height
canvas.width = viewport.width
// 添加一些底部间距,便于区分页面
canvas.style.marginBottom = '16px'
canvas.style.boxShadow = '0 2px 8px rgba(0,0,0,0.1)'
container.appendChild(canvas)
// 渲染该页
const renderTask = page.render({
canvasContext: context,
viewport: viewport
})
promises.push(renderTask.promise)
}
await Promise.all(promises)
} catch (err) {
if (!pdfLoadingCanceled) {
console.error('渲染多页 PDF 失败', err)
ElMessage.error('渲染 PDF 页面失败')
}
} finally {
isRendering.value = false
pdfLoading.value = false
}
}
// 修改 previewFile 中的 PDF 分支
// function previewFile(file) {
// console.log('====================================')
// console.log('file', file)
// console.log('====================================')
// const url = file.url || file.fileUrl
// if (!url) {
// ElMessage.warning('文件地址不存在')
// return
// }
// const ext = (file.originalName || '').split('.').pop().toLowerCase()
// previewUrl.value = url
// previewFileName.value = file.originalName || '文件'
// if (['jpg', 'jpeg', 'png', 'webp', 'gif', 'bmp', 'svg'].includes(ext)) {
// previewFileType.value = 'image'
// previewDialogVisible.value = true
// } else if (ext === 'pdf') {
// previewFileType.value = 'pdf'
// previewDialogVisible.value = true
// // 先清理旧的资源
// closePreview()
// nextTick(() => {
// loadPdf(previewUrl.value)
// })
// } else {
// previewFileType.value = 'unsupported'
// previewDialogVisible.value = true
// }
// }
// 在需要预览文件的地方调用(例如原来的 previewFile 函数)
function previewFile(file) {
// 确保传入对象包含 url 和 name 属性
......@@ -409,32 +208,6 @@ function previewFile(file) {
name: file.originalName || file.name
})
}
const closePreview = () => {
pdfLoadingCanceled = true // 取消任何进行中的渲染
pdfLoading.value = false
isRendering.value = false
if (pdfDoc.value) {
pdfDoc.value.destroy().catch(() => {})
pdfDoc.value = null
}
pdfTotalPages.value = 0
pdfScale.value = 1.2
if (pdfScrollContainer.value) {
pdfScrollContainer.value.innerHTML = ''
}
}
const zoomIn = () => {
pdfScale.value = Math.min(pdfScale.value + 0.2, 3.0)
renderAllPages(pdfScale.value)
}
const zoomOut = () => {
pdfScale.value = Math.max(pdfScale.value - 0.2, 0.5)
renderAllPages(pdfScale.value)
}
// 图片查看相关状态
const imageViewerVisible = ref(false)
const imageUrl = ref('')
const downLoading = ref(false)
const data = reactive({
form: {},
......@@ -678,11 +451,6 @@ const handleUpdate = row => {
uploadedFiles.value = JSON.parse(JSON.stringify(row.fileBizIdList))
}
}
const handleView = row => {
imageUrl.value = row.fileUrl
imageViewerVisible.value = true
}
// 下载材料包
const downloadFile = () => {
let apiMaterialDtoList = []
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment