|
|
|
|
import * as w6s from 'szient-js-sdk'
|
|
|
|
|
import sha1 from 'crypto-js/sha1'
|
|
|
|
|
import { siqCode } from '@/api/enterprise'
|
|
|
|
|
import { baseUrl } from '@/config/env'
|
|
|
|
|
import { $globalStore } from '@/common/globalStore'
|
|
|
|
|
|
|
|
|
|
// ========== w6s 鉴权(参照 enterpriseHome.vue 的写法) ==========
|
|
|
|
|
const generateRandomNumber = () => {
|
|
|
|
|
const min = 100000
|
|
|
|
|
const max = 999999
|
|
|
|
|
const randomNum = (Math.floor(Math.random() * (max - min + 1)) + min)
|
|
|
|
|
return randomNum.toString().padStart(6, '0')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let w6sAuthPromise = null
|
|
|
|
|
|
|
|
|
|
// 确保 w6s 鉴权完成,缓存 Promise 避免重复鉴权
|
|
|
|
|
export const ensureW6sAuth = () => {
|
|
|
|
|
if (w6sAuthPromise) return w6sAuthPromise
|
|
|
|
|
w6sAuthPromise = new Promise((resolve, reject) => {
|
|
|
|
|
siqCode(null, success => {
|
|
|
|
|
let access_key = ''
|
|
|
|
|
let access_secret = ''
|
|
|
|
|
if (success.success) {
|
|
|
|
|
access_key = success.data.accessKey
|
|
|
|
|
access_secret = success.data.accessSecret
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!access_key || !access_secret) {
|
|
|
|
|
w6sAuthPromise = null
|
|
|
|
|
reject(new Error('获取深i企认证信息错误: access_key 或 access_secret 为空'))
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const nonce = generateRandomNumber()
|
|
|
|
|
const timestamp = `${Date.now()}`
|
|
|
|
|
|
|
|
|
|
const str = [access_secret, nonce, timestamp]
|
|
|
|
|
.sort()
|
|
|
|
|
.reduce((s, item) => s + item, '')
|
|
|
|
|
|
|
|
|
|
const signature = sha1(str).toString().toLowerCase()
|
|
|
|
|
|
|
|
|
|
w6s.config({
|
|
|
|
|
access_key: access_key,
|
|
|
|
|
nonce: nonce,
|
|
|
|
|
timestamp: timestamp,
|
|
|
|
|
signature: signature,
|
|
|
|
|
}).then((res) => {
|
|
|
|
|
console.log('w6s 鉴权成功', res)
|
|
|
|
|
}).catch((err) => {
|
|
|
|
|
w6sAuthPromise = null
|
|
|
|
|
reject(err)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
w6s.ready(() => {
|
|
|
|
|
console.log('w6s ready')
|
|
|
|
|
resolve()
|
|
|
|
|
})
|
|
|
|
|
}, error => {
|
|
|
|
|
w6sAuthPromise = null
|
|
|
|
|
reject(error)
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
return w6sAuthPromise
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 拍照并加水印(时间戳 + 经纬度自动叠加到照片)
|
|
|
|
|
export const takePhotoWithWaterMark = async ({
|
|
|
|
|
content = '',
|
|
|
|
|
fontSize = 14,
|
|
|
|
|
color = '#FF5858',
|
|
|
|
|
timeEnable = true,
|
|
|
|
|
locationEnable = true,
|
|
|
|
|
} = {}) => {
|
|
|
|
|
console.log('[w6sMedia] takePhotoWithWaterMark 开始, 入参:', { content, fontSize, color, timeEnable, locationEnable })
|
|
|
|
|
await ensureW6sAuth()
|
|
|
|
|
console.log('[w6sMedia] 鉴权完成, 准备调起拍照')
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
w6s.image.takePhotoAndAddWaterMark({
|
|
|
|
|
content,
|
|
|
|
|
fontSize,
|
|
|
|
|
color,
|
|
|
|
|
markDisable: false,
|
|
|
|
|
timeEnable,
|
|
|
|
|
locationEnable,
|
|
|
|
|
success: (res) => {
|
|
|
|
|
console.log('[w6sMedia] takePhotoAndAddWaterMark success 原始返回:', res)
|
|
|
|
|
console.log('[w6sMedia] 返回字段 imageURL:', res?.imageURL, 'key:', res?.key, 'imageInfo:', res?.imageInfo)
|
|
|
|
|
resolve(res)
|
|
|
|
|
},
|
|
|
|
|
fail: (err) => {
|
|
|
|
|
console.error('[w6sMedia] takePhotoAndAddWaterMark fail:', err)
|
|
|
|
|
reject(err)
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 录制视频
|
|
|
|
|
export const startVideoRecorder = async ({
|
|
|
|
|
duration = 60,
|
|
|
|
|
quality = 1, // 0 高清 / 1 一般 / 2 流畅
|
|
|
|
|
front = false,
|
|
|
|
|
syncSystemAlbum = false,
|
|
|
|
|
} = {}) => {
|
|
|
|
|
console.log('[w6sMedia] startVideoRecorder 开始, 入参:', { duration, quality, front, syncSystemAlbum })
|
|
|
|
|
await ensureW6sAuth()
|
|
|
|
|
console.log('[w6sMedia] 录制前鉴权完成, 准备调起录制')
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
w6s.video.startVideoRecoder({
|
|
|
|
|
duration,
|
|
|
|
|
quality,
|
|
|
|
|
front,
|
|
|
|
|
sync_system_album: syncSystemAlbum,
|
|
|
|
|
success: (res) => {
|
|
|
|
|
console.log('[w6sMedia] startVideoRecoder success 原始返回:', res)
|
|
|
|
|
resolve(res)
|
|
|
|
|
},
|
|
|
|
|
fail: (err) => {
|
|
|
|
|
console.error('[w6sMedia] startVideoRecoder fail:', err)
|
|
|
|
|
reject(err)
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取定位(经纬度)
|
|
|
|
|
export const getLocation = async () => {
|
|
|
|
|
await ensureW6sAuth()
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
w6s.location.getLocation({ success: resolve, fail: reject })
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 上传本地文件到后端 /app-enf/common/file/upload
|
|
|
|
|
// 使用 w6s.file.upload(Cordova FileTransfer),直接传本地路径,无需 base64 转换
|
|
|
|
|
export const uploadLocalFileToBackend = async ({
|
|
|
|
|
fileURL,
|
|
|
|
|
fileName = 'upload',
|
|
|
|
|
mimeType = 'image/jpeg',
|
|
|
|
|
}) => {
|
|
|
|
|
console.log('[w6sMedia] uploadLocalFileToBackend 开始, 入参:', { fileURL, fileName, mimeType })
|
|
|
|
|
await ensureW6sAuth()
|
|
|
|
|
console.log('[w6sMedia] 上传前鉴权完成')
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
const token = $globalStore.useCommon?.token || ''
|
|
|
|
|
// w6s.file.upload 需要完整 URL
|
|
|
|
|
const api = `${baseUrl}/app-enf/common/file/upload`
|
|
|
|
|
const server = /^https?:/.test(api) ? api : `${window.location.origin}${api}`
|
|
|
|
|
console.log('[w6sMedia] 上传目标 server:', server, 'token 存在:', !!token)
|
|
|
|
|
|
|
|
|
|
const opts = new window.FileUploadOptions()
|
|
|
|
|
opts.fileKey = 'file'
|
|
|
|
|
opts.fileName = fileName
|
|
|
|
|
opts.mimeType = mimeType
|
|
|
|
|
opts.headers = {
|
|
|
|
|
Authorization: token ? `Bearer ${token}` : '',
|
|
|
|
|
clientid: '9e6eb24cd4e169a98b0d2cd8034d877b',
|
|
|
|
|
}
|
|
|
|
|
console.log('[w6sMedia] FileUploadOptions 构造完成:', { fileKey: opts.fileKey, fileName: opts.fileName, mimeType: opts.mimeType, headers: opts.headers })
|
|
|
|
|
|
|
|
|
|
let fileIns
|
|
|
|
|
try {
|
|
|
|
|
fileIns = new w6s.file.upload(opts)
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.error('[w6sMedia] new w6s.file.upload 抛错:', e)
|
|
|
|
|
reject(e)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
fileIns.upload({
|
|
|
|
|
fileURL,
|
|
|
|
|
server,
|
|
|
|
|
trustAllHosts: false,
|
|
|
|
|
success: (res) => {
|
|
|
|
|
console.log('[w6sMedia] file.upload success 原始返回:', res)
|
|
|
|
|
// Cordova FileTransfer 返回 res.response 为字符串
|
|
|
|
|
try {
|
|
|
|
|
const parsed = typeof res.response === 'string' ? JSON.parse(res.response) : res.response
|
|
|
|
|
console.log('[w6sMedia] 解析后的上传响应:', parsed)
|
|
|
|
|
resolve(parsed)
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.warn('[w6sMedia] 响应 JSON 解析失败, 返回原始 response:', res.response)
|
|
|
|
|
resolve(res.response)
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
fail: (err) => {
|
|
|
|
|
console.error('[w6sMedia] file.upload fail:', err)
|
|
|
|
|
reject(err)
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
}
|