Files
shanxia2.0/miniprogram/utils/bxUpload.js
T
2026-07-17 21:59:47 +08:00

90 lines
2.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 报销附件:拍照/相册 → /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
}