This commit is contained in:
zlwu committed 2026-07-17 21:59:47 +08:00
1 parent 8be55c08e9
commit a903fcf6d4
75 files changed
+9547 -124

No files matched your search

+89
View File
@@ -0,0 +1,89 @@
/**
* 报销附件:拍照/相册 → /attachments/upload(multipart,已在加密排除路径)
* 返回附件对象列表(含 id),提交后需 bindAttachments
*/
import { API_BASE, TOKEN_KEY } from '@/config/api'
function parseBody(raw) {
try {
return JSON.parse(typeof raw === 'string' ? raw : String(raw || ''))
} catch {
return {}
}
}
function getToken() {
const raw = uni.getStorageSync(TOKEN_KEY)
return typeof raw === 'string' ? raw.trim() : raw ? String(raw).trim() : ''
}
/**
* @param {{ bizType?: string, bizId?: string|number, maxCount?: number, currentCount?: number }} opts
* @returns {Promise<Array<{ id: string, fileName?: string, localPath?: string }>>}
*/
export async function chooseAndUploadBxAttachments(opts = {}) {
const bizType = opts.bizType || 'reimburse_apply'
const bizId = opts.bizId != null ? String(opts.bizId) : '0'
const maxCount = opts.maxCount != null ? opts.maxCount : 6
const currentCount = opts.currentCount || 0
const remain = maxCount - currentCount
if (remain <= 0) {
uni.showToast({ title: `最多上传${maxCount}张`, icon: 'none' })
return []
}
const choose = await new Promise((resolve) => {
uni.chooseImage({
count: remain,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: (res) => resolve(res),
fail: () => resolve(null)
})
})
if (!choose?.tempFilePaths?.length) return []
const token = getToken()
const uploadUrl = `${API_BASE}/attachments/upload?biz_type=${encodeURIComponent(bizType)}&biz_id=${encodeURIComponent(bizId)}`
const uploaded = []
uni.showLoading({ title: '上传中...' })
try {
for (const filePath of choose.tempFilePaths) {
const uploadRes = await new Promise((ok, fail) => {
uni.uploadFile({
url: uploadUrl,
filePath,
name: 'file',
header: {
Authorization: token ? `Bearer ${token}` : ''
},
success: ok,
fail
})
})
if (uploadRes.statusCode === 401) {
uni.showToast({ title: '登录已失效', icon: 'none' })
break
}
const body = parseBody(uploadRes.data)
// bx: code===0
if (body.code !== 0 || !body.data?.id) {
uni.showToast({ title: body.msg || body.message || '上传失败', icon: 'none' })
break
}
uploaded.push({
id: String(body.data.id),
fileName: body.data.fileName || body.data.file_name || '',
localPath: filePath
})
}
} catch (e) {
uni.showToast({
title: e instanceof Error ? e.message : '上传失败',
icon: 'none'
})
} finally {
uni.hideLoading()
}
return uploaded
}