From 64dedb1dc8ff85241596fceb32dcd286098d0e09 Mon Sep 17 00:00:00 2001 From: "wangmingyong@163.com" Date: Fri, 28 Aug 2026 15:33:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E7=89=87=E6=B0=B4=E5=8D=B0=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/util/w6sMedia.js | 55 ++++++++++++++++--- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/zdxt-web-client/zdxt-efcode-enterprise-app/src/util/w6sMedia.js b/zdxt-web-client/zdxt-efcode-enterprise-app/src/util/w6sMedia.js index cbe174d1..1b7cb6ba 100644 --- a/zdxt-web-client/zdxt-efcode-enterprise-app/src/util/w6sMedia.js +++ b/zdxt-web-client/zdxt-efcode-enterprise-app/src/util/w6sMedia.js @@ -72,24 +72,63 @@ export const ensureW6sAuth = () => { return w6sAuthPromise } -// 拍照并加水印(@w6s/sdk 2.x:timeEnable/locationEnable 时 SDK 自动在 content 后拼接当前时间与定位地址) -// 返回扁平结构 PhotoInfoAndMediaId: { imageURL, key, imageInfo, mediaId } +// 定位缓存(避免每次拍照都重新搜星,SDK 内部 locationEnable=true 时会阻塞等 GPS) +let _cachedLocation = null +let _locationCacheTime = 0 +const LOCATION_CACHE_TTL = 2 * 60 * 1000 // 2 分钟内复用同一位置 + +const getCachedLocation = async () => { + if (_cachedLocation && Date.now() - _locationCacheTime < LOCATION_CACHE_TTL) { + console.log('[w6sMedia] 使用缓存定位:', _cachedLocation) + return _cachedLocation + } + await ensureW6sAuth() + _cachedLocation = await new Promise((resolve, reject) => { + w6s.location.getLocation({ success: resolve, fail: reject }) + }) + _locationCacheTime = Date.now() + console.log('[w6sMedia] 定位获取成功并已缓存:', _cachedLocation) + return _cachedLocation +} + +// 格式化时间 yyyy-MM-dd HH:mm(与 SDK 内部 getTimeStr 格式一致) +const getTimeStr = () => { + const d = new Date() + const pad = (n) => String(n).padStart(2, '0') + return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}` +} + +// 拍照并加水印 +// 自己拼接时间+定位到 content,设 timeEnable/locationEnable 为 false 跳过 SDK 内部阻塞式 getLocation 调用 export const takePhotoWithWaterMark = async () => { await ensureW6sAuth() - console.log('[w6sMedia] 鉴权完成, 准备调起拍照') + console.log('[w6sMedia] 鉴权完成, 准备获取定位') + + // 预获取定位(带缓存),第二次拍照起直接用缓存不搜星 + let locationStr = '' + try { + const loc = await getCachedLocation() + locationStr = (loc.city || '') + (loc.district || '') + (loc.street || '') + console.log('[w6sMedia] 定位地址:', locationStr) + } catch (e) { + console.warn('[w6sMedia] 获取定位失败, 水印不含地址:', e) + } + + const content = `${getTimeStr()} ${locationStr}`.trim() + console.log('[w6sMedia] 水印 content:', content, '准备调起拍照') + return new Promise((resolve, reject) => { w6s.image.takePhotoAndAddWaterMark({ - content: '', + content, fontSize: 14, color: '#FF5858', markDisable: false, - timeEnable: true, - locationEnable: true, + timeEnable: false, // 时间已自己拼入 content + locationEnable: false, // 定位已自己拼入 content,跳过 SDK 内部 getLocation 阻塞 success: (res) => { console.log('[w6sMedia] takePhotoAndAddWaterMark success 原始返回:', res) - // 实际返回结构为 { result: { imageURL, key, imageInfo, mediaId } }(SDK jsonParser 包了一层 result) const result = res?.result || res || {} - console.log('[w6sMedia] 返回字段 imageURL:', result?.imageURL, 'key:', result?.key, 'imageInfo:', result?.imageInfo) + console.log('[w6sMedia] 返回字段 imageURL:', result?.imageURL, 'key:', result?.key) resolve(result) }, fail: (err) => {