| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- /**
- * 图片上传和下载工具类
- */
- export default {
- /**
- * 获取文件列表
- * @param {String} type - 类型
- * @param {String} orderFileType - 订单文件类型 (1:聊天记录, 2:实物图, 3:细节图)
- * @param {String} receiptId - 收单ID
- * @param {String} itemBrand - 物品品牌
- * @param {String} clueId - 线索ID
- */
- async getFileList(type, orderFileType, receiptId, itemBrand, clueId) {
- try {
- const params = {
- clueId,
- sourceId: receiptId,
- type,
- orderFileType,
- isDuplicate: '1',
- pageNum: 1,
- pageSize: 1000
- }
- const response = await uni.$u.api.selectClueFileByDto(params)
- const rows = response.rows || []
-
- // 如果品牌包含逗号,说明是多个品牌,需要过滤
- // if (itemBrand && itemBrand.indexOf(',') !== -1) {
- return rows.filter(item => item.sourceId === receiptId)
- // }
- // return rows
- } catch (error) {
- console.error('获取文件列表失败:', error)
- uni.$u.toast('获取文件列表失败')
- return []
- }
- },
- /**
- * 选择图片
- * @param {Number} count - 最多选择数量
- * @returns {Promise<Array>} 图片路径数组
- */
- chooseImage(count = 9) {
- return new Promise((resolve, reject) => {
- uni.chooseImage({
- count,
- sizeType: ['compressed'],
- sourceType: ['album', 'camera'],
- success: (res) => {
- resolve(res.tempFilePaths)
- },
- fail: (err) => {
- console.error('选择图片失败:', err)
- reject(err)
- }
- })
- })
- },
- /**
- * 上传文件
- * @param {String} filePath - 文件路径
- * @returns {Promise<Object>} 上传结果
- */
- async uploadFile(filePath) {
- try {
- uni.showLoading({
- title: '上传中...',
- mask: true
- })
- const { data } = await uni.$u.api.uploadFile(filePath)
- return {
- fileSize: data.fileSize,
- fileSuffix: data.fileSuffix,
- fileName: data.name,
- fileUrl: data.url
- }
- } catch (error) {
- console.error('文件上传失败:', error)
- uni.$u.toast('上传失败,请重试')
- throw error
- } finally {
- uni.hideLoading()
- }
- },
- /**
- * 批量上传文件
- * @param {Array<String>} filePaths - 文件路径数组
- * @returns {Promise<Array>} 上传结果数组
- */
- async uploadFiles(filePaths) {
- try {
- const uploadPromises = filePaths.map(filePath => this.uploadFile(filePath))
- return await Promise.all(uploadPromises)
- } catch (error) {
- console.error('批量上传失败:', error)
- throw error
- }
- },
- /**
- * 绑定订单文件
- * @param {String} clueId - 线索ID
- * @param {String} receiptId - 收单ID
- * @param {String} orderFileType - 订单文件类型
- * @param {Array} fileList - 文件列表
- */
- async bindOrderFile(clueId, receiptId, orderFileType, fileList) {
- try {
- const list = fileList.map(file => ({
- fileSize: file.fileSize,
- fileSuffix: file.fileSuffix,
- fileName: file.fileName,
- fileUrl: file.fileUrl,
- orderFileType
- }))
-
- await uni.$u.api.saveClueFile({
- clueId,
- list,
- sourceId: receiptId,
- type: '2',
- orderFileType
- })
- uni.$u.toast('上传成功')
- } catch (error) {
- console.error('绑定订单文件失败:', error)
- uni.$u.toast('上传失败')
- throw error
- }
- },
- /**
- * 删除文件
- * @param {String|Array} fileIds - 文件ID或ID数组
- */
- async deleteFile(fileIds) {
- try {
- const ids = Array.isArray(fileIds) ? fileIds : [fileIds]
- await uni.$u.api.deleteClueFile(ids)
- uni.showToast({
- title: '删除成功',
- icon: 'success',
- duration: 2000
- })
- } catch (error) {
- console.error('删除文件失败:', error)
- uni.showToast({
- title: '删除失败',
- icon: 'error',
- duration: 2000
- })
- throw error
- }
- },
- /**
- * 保存图片到本地相册
- * @param {String} url - 图片URL
- * @returns {Promise}
- */
- saveImageToLocal(url) {
- return new Promise((resolve, reject) => {
- this._doSaveImage(url, resolve, reject)
- })
- },
- /**
- * 执行保存图片操作
- * @private
- */
- _doSaveImage(url, resolve, reject) {
- uni.downloadFile({
- url,
- success: (res) => {
- if (res.statusCode === 200 && res.tempFilePath) {
- uni.saveImageToPhotosAlbum({
- filePath: res.tempFilePath,
- success: () => {
- resolve()
- },
- fail: (err) => {
- console.error('保存到相册失败:', err)
- // 错误代码 12 通常表示权限问题
- const isPermissionError = err.code === 12 ||
- err.errCode === 12 ||
- err.errMsg.includes('auth denied') ||
- err.errMsg.includes('permission') ||
- err.errMsg.includes('UNKOWN ERROR')
-
- if (isPermissionError) {
- uni.showModal({
- title: '权限不足',
- content: '需要访问相册权限来保存图片,是否前往设置开启权限?',
- confirmText: '去设置',
- cancelText: '取消',
- success: (modalRes) => {
- if (modalRes.confirm) {
- uni.openSetting({
- success: (settingRes) => {
- // 检查是否开启了相册权限
- const hasPermission = settingRes.authSetting &&
- settingRes.authSetting['scope.writePhotosAlbum']
- if (hasPermission) {
- uni.showToast({
- title: '权限已开启,请重试保存',
- icon: 'none',
- duration: 2000
- })
- } else {
- uni.showToast({
- title: '请在设置中开启相册权限',
- icon: 'none',
- duration: 2000
- })
- }
- },
- fail: () => {
- uni.showToast({
- title: '无法打开设置',
- icon: 'none'
- })
- }
- })
- }
- }
- })
- } else {
- uni.showToast({
- title: '保存失败,请稍后重试',
- icon: 'none'
- })
- }
- reject(err)
- }
- })
- } else {
- const errorMsg = `下载失败,状态码: ${res.statusCode}`
- console.error(errorMsg)
- uni.showToast({
- title: '下载图片失败',
- icon: 'none'
- })
- reject(new Error(errorMsg))
- }
- },
- fail: (err) => {
- console.error('下载图片失败:', err)
- uni.showToast({
- title: '下载图片失败,请检查网络',
- icon: 'none'
- })
- reject(err)
- }
- })
- },
- /**
- * 批量保存图片到本地
- * @param {Array<String>} urls - 图片URL数组
- */
- async saveImagesToLocal(urls) {
- try {
- uni.showLoading({
- title: '正在保存图片...',
- mask: true
- })
- const savedImages = []
- const failedImages = []
- for (let i = 0; i < urls.length; i++) {
- const url = urls[i]
- try {
- await this.saveImageToLocal(url)
- savedImages.push(url)
- } catch (error) {
- console.error(`保存图片失败: ${url}`, error)
- failedImages.push(url)
- }
- uni.showLoading({
- title: `正在保存图片... (${i + 1}/${urls.length})`,
- mask: true
- })
- }
- uni.hideLoading()
- let message = `成功保存 ${savedImages.length} 张图片`
- if (failedImages.length > 0) {
- message += `,${failedImages.length} 张保存失败`
- }
- uni.showToast({
- title: message,
- icon: 'none',
- duration: 3000
- })
- } catch (error) {
- uni.hideLoading()
- console.error('保存图片过程中发生错误:', error)
- uni.showToast({
- title: '保存图片失败',
- icon: 'error'
- })
- }
- },
- /**
- * 复制图片链接
- * @param {Array<String>} urls - 图片URL数组
- */
- copyImageUrls(urls) {
- uni.setClipboardData({
- data: JSON.stringify(urls),
- success: () => {
- uni.showToast({
- title: '图片链接已复制',
- icon: 'none'
- })
- }
- })
- }
- }
|