@@ -86,10 +90,10 @@ const snapshotMap = ref(new Map())
const accountOptions = ref([])
const normalized = computed(() => normalizeReceiveAccountModelValue(props.modelValue))
-const summary = computed(() => {
+/** 触发条短文案;完整信息见下方 oa-recv__line(可换行) */
+const pickerSummary = computed(() => {
const n = normalized.value.length
if (!n) return ''
- if (n === 1) return formatReceiveAccountLine(normalized.value[0])
return `已选 ${n} 个账户`
})
const filtered = computed(() => {
@@ -177,13 +181,33 @@ onMounted(() => {
diff --git a/mobile-oa-h5/src/oa/components/OaRelatedApproval.vue b/mobile-oa-h5/src/oa/components/OaRelatedApproval.vue
index a741dad1..e19f7545 100644
--- a/mobile-oa-h5/src/oa/components/OaRelatedApproval.vue
+++ b/mobile-oa-h5/src/oa/components/OaRelatedApproval.vue
@@ -383,6 +383,8 @@ watch(visible, (v) => {
font-size: 14px;
font-weight: 600;
color: var(--text-primary, #0f291e);
+ word-break: break-all;
+ overflow-wrap: anywhere;
}
.oa-rel__actions {
display: flex;
@@ -420,6 +422,7 @@ watch(visible, (v) => {
display: flex;
gap: 8px;
margin-top: 4px;
+ min-width: 0;
color: var(--text-muted, #5f7a6d);
font-size: 12px;
}
@@ -427,6 +430,11 @@ watch(visible, (v) => {
flex: 0 0 auto;
color: #94a3b8;
}
+.oa-rel__field > span:not(.oa-rel__label) {
+ min-width: 0;
+ word-break: break-all;
+ overflow-wrap: anywhere;
+}
/* 方案 C · 分割线行;内容对齐 Web 选单卡片字段 */
.oa-rel__pick-row {
diff --git a/mobile-oa-h5/src/oa/print/exportOaApprovalPdf.js b/mobile-oa-h5/src/oa/print/exportOaApprovalPdf.js
index 6bf7700e..81dd970a 100644
--- a/mobile-oa-h5/src/oa/print/exportOaApprovalPdf.js
+++ b/mobile-oa-h5/src/oa/print/exportOaApprovalPdf.js
@@ -17,6 +17,11 @@ import { toRmbUpper } from '../../utils/rmb-upper.js'
import { resolveStamp } from '../oa-status-stamp.js'
import { buildOaPrintFilename } from './oa-print-filename.js'
import { buildFlowItems } from './oa-print-flow.js'
+import {
+ isWeChatMiniWebView,
+ navigateToHostPdfPreview,
+ printNavLog
+} from './oa-pdf-preview-nav.js'
export { resolveStamp }
@@ -667,54 +672,6 @@ export async function generateOaApprovalPdfBlob(detail, opts = {}) {
}
}
-function isWeChatMiniWebView() {
- try {
- if (typeof window !== 'undefined' && window.__wxjs_environment === 'miniprogram') {
- return true
- }
- } catch {
- /* ignore */
- }
- try {
- if (typeof wx !== 'undefined' && wx.miniProgram) return true
- } catch {
- /* ignore */
- }
- try {
- const ua = String(navigator?.userAgent || '')
- if (/miniProgram/i.test(ua)) return true
- } catch {
- /* ignore */
- }
- return false
-}
-
-function navigateToHostPdfPreview({ fileUrl, fileName }) {
- const q =
- 'fileUrl=' +
- encodeURIComponent(fileUrl) +
- '&name=' +
- encodeURIComponent(fileName || 'approval.pdf')
- const path = '/pages/oa/pdf-preview/index?' + q
- try {
- if (typeof wx !== 'undefined' && wx.miniProgram?.navigateTo) {
- wx.miniProgram.navigateTo({ url: path })
- return true
- }
- } catch {
- /* ignore */
- }
- try {
- if (typeof uni !== 'undefined' && uni.webView?.navigateTo) {
- uni.webView.navigateTo({ url: path })
- return true
- }
- } catch {
- /* ignore */
- }
- return false
-}
-
/**
* @returns {Promise<{ ok: boolean, message?: string, mode?: 'preview' | 'download' }>}
*/
@@ -723,38 +680,59 @@ export async function exportOaApprovalPdf(detail, opts = {}) {
return { ok: false, message: '暂无审批详情,无法导出 PDF' }
}
+ const inMini = isWeChatMiniWebView()
+ printNavLog('export start', {
+ inMini,
+ instanceId: detail && (detail.id || detail.instanceId),
+ title: detail && (detail.title || detail.appName)
+ })
+
let blob
let filename
try {
;({ blob, filename } = await generateOaApprovalPdfBlob(detail, opts))
+ printNavLog('pdf blob ready', {
+ filename,
+ blobSize: blob && typeof blob.size === 'number' ? blob.size : -1
+ })
} catch (e) {
+ printNavLog('pdf generate fail', String(e && e.message ? e.message : e))
return {
ok: false,
message: (e && e.message) || '生成 PDF 失败'
}
}
- if (isWeChatMiniWebView()) {
+ if (inMini) {
try {
const file = new File([blob], filename, { type: 'application/pdf' })
+ printNavLog('upload start', { filename, fileSize: file.size })
const res = await uploadAttachment(file)
const fileUrl = String(res?.fileUrl || res?.data?.fileUrl || '').trim()
+ printNavLog('upload done', {
+ hasFileUrl: !!fileUrl,
+ fileUrlPreview: fileUrl.slice(0, 160),
+ resKeys: res && typeof res === 'object' ? Object.keys(res) : []
+ })
if (!fileUrl) {
return { ok: false, message: '上传 PDF 失败:无文件地址' }
}
- const navigated = navigateToHostPdfPreview({
+ const nav = await navigateToHostPdfPreview({
fileUrl,
fileName: filename
})
- if (!navigated) {
+ printNavLog('navigate result', nav)
+ if (!nav || !nav.ok) {
return {
ok: false,
- message: '无法跳转预览页,请升级微信后重试'
+ message:
+ (nav && nav.message) || '无法跳转预览页,请升级微信后重试'
}
}
return { ok: true, mode: 'preview' }
} catch (e) {
+ printNavLog('upload/navigate fail', String(e && e.message ? e.message : e))
return {
ok: false,
message: (e && e.message) || '上传或打开 PDF 失败'
@@ -763,6 +741,7 @@ export async function exportOaApprovalPdf(detail, opts = {}) {
}
try {
+ printNavLog('browser download path', { filename })
const href = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = href
@@ -773,6 +752,7 @@ export async function exportOaApprovalPdf(detail, opts = {}) {
setTimeout(() => URL.revokeObjectURL(href), 2000)
return { ok: true, mode: 'download' }
} catch (e) {
+ printNavLog('browser download fail', String(e && e.message ? e.message : e))
return {
ok: false,
message: (e && e.message) || '下载 PDF 失败'
diff --git a/mobile-oa-h5/src/oa/print/oa-pdf-preview-nav.js b/mobile-oa-h5/src/oa/print/oa-pdf-preview-nav.js
new file mode 100644
index 00000000..1d920864
--- /dev/null
+++ b/mobile-oa-h5/src/oa/print/oa-pdf-preview-nav.js
@@ -0,0 +1,206 @@
+/**
+ * 微信 web-view → 小程序 PDF 预览页跳转
+ * 注意:Vite ESM 须读 window.wx / window.uni,裸标识符常不可见(对齐 close-to-host)。
+ */
+
+const LOG_TAG = '[oa-print-nav]'
+
+export function printNavLog(...args) {
+ try {
+ console.log(LOG_TAG, ...args)
+ } catch (_) {
+ /* ignore */
+ }
+}
+
+function resolveGlobalApi(win, name) {
+ try {
+ if (win && win[name] != null) return win[name]
+ } catch (_) {
+ /* ignore */
+ }
+ try {
+ if (name === 'wx' && typeof wx !== 'undefined') return wx
+ } catch (_) {
+ /* ignore */
+ }
+ try {
+ if (name === 'uni' && typeof uni !== 'undefined') return uni
+ } catch (_) {
+ /* ignore */
+ }
+ return undefined
+}
+
+export function getOaPrintHostApis(win = typeof window !== 'undefined' ? window : undefined) {
+ return {
+ win,
+ wxApi: resolveGlobalApi(win, 'wx'),
+ uniApi: resolveGlobalApi(win, 'uni')
+ }
+}
+
+export function isWeChatMiniWebView(win = typeof window !== 'undefined' ? window : undefined) {
+ const { wxApi } = getOaPrintHostApis(win)
+ try {
+ if (win && win.__wxjs_environment === 'miniprogram') return true
+ } catch (_) {
+ /* ignore */
+ }
+ try {
+ const ua =
+ (win && win.navigator && win.navigator.userAgent) ||
+ (typeof navigator !== 'undefined' ? navigator.userAgent : '') ||
+ ''
+ if (/miniProgram/i.test(String(ua))) return true
+ } catch (_) {
+ /* ignore */
+ }
+ try {
+ if (wxApi && wxApi.miniProgram) return true
+ } catch (_) {
+ /* ignore */
+ }
+ return false
+}
+
+/** 预览页默认文件名;真实中文名由 download-url 按附件记录回填 */
+export function asciiPdfFileName(fileName) {
+ void fileName
+ return 'approval.pdf'
+}
+
+/**
+ * 短 query:仅 fileUrl + f(兼容大小写吞参);不传中文 name,避免撑爆 navigateTo
+ * @returns {{ path: string, queryLen: number, fileUrlLen: number, name: string }}
+ */
+export function buildHostPdfPreviewPath({ fileUrl, fileName } = {}) {
+ const key = String(fileUrl || '').trim()
+ const name = asciiPdfFileName(fileName)
+ const q =
+ 'fileUrl=' +
+ encodeURIComponent(key) +
+ '&f=' +
+ encodeURIComponent(key)
+ const path = '/pages/oa/pdf-preview/index?' + q
+ return {
+ path,
+ queryLen: q.length,
+ fileUrlLen: key.length,
+ name
+ }
+}
+
+/**
+ * @returns {Promise<{ ok: boolean, via?: string, path?: string, message?: string }>}
+ */
+export function navigateToHostPdfPreview({ fileUrl, fileName } = {}, deps = {}) {
+ const { path, queryLen, fileUrlLen, name } = buildHostPdfPreviewPath({
+ fileUrl,
+ fileName
+ })
+ const win =
+ deps.window !== undefined
+ ? deps.window
+ : typeof window !== 'undefined'
+ ? window
+ : undefined
+ const log = deps.log || printNavLog
+ const { wxApi, uniApi } = getOaPrintHostApis(win)
+
+ log('navigate start', {
+ fileUrlLen,
+ queryLen,
+ pathLen: path.length,
+ name,
+ fileUrlPreview: String(fileUrl || '').slice(0, 120),
+ hasWindowWx: !!(win && win.wx),
+ hasWxMiniNavigate: !!(wxApi && wxApi.miniProgram && wxApi.miniProgram.navigateTo),
+ hasUniWebViewNavigate: !!(uniApi && uniApi.webView && uniApi.webView.navigateTo),
+ __wxjs_environment: win && win.__wxjs_environment
+ })
+
+ if (!String(fileUrl || '').trim()) {
+ log('navigate abort: empty fileUrl')
+ return Promise.resolve({ ok: false, message: '缺少 fileUrl' })
+ }
+
+ // 微信建议 navigateTo url < 1024;超出仍尝试但打警告
+ if (path.length > 900) {
+ log('warn path long', { pathLen: path.length })
+ }
+
+ /** jweixin 的 miniProgram.navigateTo 常无 success/fail,超时视为已调用成功 */
+ const invokeNavigate = (label, navigateFn) =>
+ new Promise((resolve) => {
+ if (typeof navigateFn !== 'function') {
+ resolve(null)
+ return
+ }
+ let settled = false
+ const done = (result) => {
+ if (settled) return
+ settled = true
+ resolve(result)
+ }
+ try {
+ navigateFn({
+ url: path,
+ success: (res) => {
+ log(label + ' success', res)
+ done({ ok: true, via: label, path })
+ },
+ fail: (err) => {
+ log(label + ' fail', err)
+ done({
+ ok: false,
+ via: label,
+ path,
+ message: (err && (err.errMsg || err.message)) || 'navigateTo fail'
+ })
+ }
+ })
+ // 多数 web-view 环境无回调:短延时后按已发起处理
+ setTimeout(() => {
+ if (!settled) {
+ log(label + ' no-callback → assume ok', { pathLen: path.length })
+ done({ ok: true, via: label, path, assumed: true })
+ }
+ }, 80)
+ } catch (e) {
+ log(label + ' throw', String(e && e.message ? e.message : e))
+ done({
+ ok: false,
+ via: label,
+ path,
+ message: String(e && e.message ? e.message : e)
+ })
+ }
+ })
+
+ return invokeNavigate(
+ 'wx.miniProgram.navigateTo',
+ wxApi && wxApi.miniProgram && wxApi.miniProgram.navigateTo
+ ? wxApi.miniProgram.navigateTo.bind(wxApi.miniProgram)
+ : null
+ ).then((wxRes) => {
+ if (wxRes && wxRes.ok) return wxRes
+ if (wxRes && wxRes.ok === false) {
+ log('wx failed, try uni', wxRes.message)
+ }
+ return invokeNavigate(
+ 'uni.webView.navigateTo',
+ uniApi && uniApi.webView && uniApi.webView.navigateTo
+ ? uniApi.webView.navigateTo.bind(uniApi.webView)
+ : null
+ ).then((uniRes) => {
+ if (uniRes) return uniRes
+ if (wxRes) return wxRes
+ log('navigate unavailable')
+ return {
+ ok: false,
+ message: '无法跳转预览页:未找到 wx/uni navigateTo'
+ }
+ })
+ })
+}
diff --git a/mobile-oa-h5/src/oa/print/oa-pdf-preview-nav.test.js b/mobile-oa-h5/src/oa/print/oa-pdf-preview-nav.test.js
new file mode 100644
index 00000000..004421be
--- /dev/null
+++ b/mobile-oa-h5/src/oa/print/oa-pdf-preview-nav.test.js
@@ -0,0 +1,33 @@
+/**
+ * node --test 兼容的轻量断言(与 oa-print-filename.test.js 风格一致)
+ */
+import assert from 'node:assert/strict'
+import {
+ asciiPdfFileName,
+ buildHostPdfPreviewPath,
+ isWeChatMiniWebView
+} from './oa-pdf-preview-nav.js'
+
+assert.equal(asciiPdfFileName('张三提交的请假.pdf'), 'approval.pdf')
+assert.equal(asciiPdfFileName('report.PDF'), 'approval.pdf')
+assert.equal(asciiPdfFileName('plain'), 'approval.pdf')
+
+const built = buildHostPdfPreviewPath({
+ fileUrl: 'oa-approval/202608/abc.pdf',
+ fileName: '张三提交的请假审批.pdf'
+})
+assert.ok(built.path.startsWith('/pages/oa/pdf-preview/index?'))
+assert.ok(built.path.includes('fileUrl='))
+assert.ok(built.path.includes('&f='))
+assert.ok(!built.path.includes('name='))
+assert.ok(!built.path.includes('%E5%BC%A0'))
+assert.ok(built.queryLen < 400)
+assert.ok(built.path.length < 500)
+
+assert.equal(
+ isWeChatMiniWebView({ __wxjs_environment: 'miniprogram' }),
+ true
+)
+assert.equal(isWeChatMiniWebView({}), false)
+
+console.log('oa-pdf-preview-nav: ok')
diff --git a/mobile-oa-h5/src/styles/oa-form.css b/mobile-oa-h5/src/styles/oa-form.css
index 5f346ee1..11c5bbb6 100644
--- a/mobile-oa-h5/src/styles/oa-form.css
+++ b/mobile-oa-h5/src/styles/oa-form.css
@@ -116,6 +116,27 @@
line-height: 22px;
}
+/*
+ * 人员/部门/岗位等选择触发条:可编辑态摘要过长时省略,避免撑出右侧。
+ * 详情只读走 .oa-pick__readonly(可换行),不经过 input。
+ */
+.form-create-m .oa-pick > .van-cell .van-field__control,
+.form-create-m .oa-recv > .van-cell .van-field__control {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.form-create-m .oa-pick__readonly {
+ padding: 2px 0 0;
+ color: var(--text-primary, #0f291e);
+ font-size: 13px;
+ line-height: 1.55;
+ word-break: break-all;
+ overflow-wrap: anywhere;
+ text-align: left;
+}
+
/* 归属人 / 归属部门锁定:箭头弱化,值色已由上方 disabled 规则统一为正文色 */
.form-create-m .oa-owner-field.is-locked .van-cell__right-icon {
color: #cbd5e1;
diff --git a/mobile-oa-h5/src/views/OaDetail.vue b/mobile-oa-h5/src/views/OaDetail.vue
index c59b80c7..36cf0c16 100644
--- a/mobile-oa-h5/src/views/OaDetail.vue
+++ b/mobile-oa-h5/src/views/OaDetail.vue
@@ -347,12 +347,28 @@ const commentPlaceholder = computed(() => {
return '审批意见(可选)'
})
+function resolveFallbackMiniPath() {
+ const p = String(route.query.returnPath || '').trim()
+ if (p.indexOf('/pages/') === 0) return p
+ return '/pages/oa/pending/index'
+}
+
/** 通知宿主关闭(对齐 OaStart closeToMini) */
function closeToMini(payload) {
- closeToHost(payload || { action: 'oa-detail-close' }, {
- showToast: (msg) => showToast(msg),
- fallbackMessage: '已关闭(非小程序环境)'
+ const data = payload || { action: 'oa-detail-close' }
+ const fallbackMiniPath = resolveFallbackMiniPath()
+ console.log('[oa-detail] closeToMini', {
+ action: data.action,
+ message: data.message,
+ fallbackMiniPath,
+ returnPath: route.query.returnPath || ''
})
+ const mode = closeToHost(data, {
+ showToast: (msg) => showToast(msg),
+ fallbackMessage: '已关闭(非小程序环境)',
+ fallbackMiniPath
+ })
+ console.log('[oa-detail] closeToHost →', mode)
}
function onClose() {
@@ -367,11 +383,17 @@ async function onPrint() {
currentUserName.value ||
String(detail.value?.initiatorUserName || '').trim() ||
'-'
+ console.log('[oa-detail] print start', {
+ instanceId: instanceId.value,
+ printerName
+ })
const result = await exportOaApprovalPdf(detail.value, { printerName })
+ console.log('[oa-detail] print result', result)
if (!result?.ok) {
showToast(result?.message || '导出 PDF 失败')
}
} catch (e) {
+ console.log('[oa-detail] print throw', e)
showToast(e?.message || '导出 PDF 失败')
} finally {
printing.value = false
@@ -417,6 +439,8 @@ function goCopyRestart() {
const q = { appId, fromInstanceId: id }
const token = String(route.query.token || '').trim()
if (token) q.token = token
+ const returnPath = String(route.query.returnPath || '').trim()
+ if (returnPath) q.returnPath = returnPath
try {
router.replace({ path: '/oa-start', query: q })
return
diff --git a/mobile-oa-h5/src/views/OaStart.vue b/mobile-oa-h5/src/views/OaStart.vue
index 84528187..1593a51f 100644
--- a/mobile-oa-h5/src/views/OaStart.vue
+++ b/mobile-oa-h5/src/views/OaStart.vue
@@ -186,12 +186,28 @@ const tripDaysManualFields = computed(() => {
return fields
})
+function resolveFallbackMiniPath() {
+ const p = String(route.query.returnPath || '').trim()
+ if (p.indexOf('/pages/') === 0) return p
+ return '/pages/oa/start/index'
+}
+
/** 通知宿主(小程序 web-view / uni-app H5 iframe)关闭并返回发起列表 */
function closeToMini(payload) {
- closeToHost(payload || { action: 'oa-start-close' }, {
- showToast: (msg) => showToast(msg),
- fallbackMessage: '已完成(非小程序环境)'
+ const data = payload || { action: 'oa-start-close' }
+ const fallbackMiniPath = resolveFallbackMiniPath()
+ console.log('[oa-start] closeToMini', {
+ action: data.action,
+ message: data.message,
+ fallbackMiniPath,
+ returnPath: route.query.returnPath || ''
})
+ const mode = closeToHost(data, {
+ showToast: (msg) => showToast(msg),
+ fallbackMessage: '已完成(非小程序环境)',
+ fallbackMiniPath
+ })
+ console.log('[oa-start] closeToHost →', mode)
}
async function loadCurrentUser() {
diff --git a/mobile-ui/zkxw-mobile-oa-manage-capsule-safe-demo.html b/mobile-ui/zkxw-mobile-oa-manage-capsule-safe-demo.html
new file mode 100644
index 00000000..312d405f
--- /dev/null
+++ b/mobile-ui/zkxw-mobile-oa-manage-capsule-safe-demo.html
@@ -0,0 +1,664 @@
+
+
+
+
+
+
OA 列表 ·「管理」避开微信胶囊 Demo
+
+
+
+
+
+
OA 列表 ·「管理」避开微信小程序胶囊
+
+ 影响页面:自定义导航的 草稿箱 / 待办中心 / 抄送我的
+ (已办中心、我发起的目前用系统导航且无「管理」)。
+ 右上角模拟微信「··· / 关闭」胶囊;红框=被遮挡,绿框=可点区域安全。
+
+
+ 建议:优先选 A · 顶栏保留「管理」+ 按胶囊宽度留白
+ (改动最小,交互习惯不变)。若希望管理与列表语义更近,可选
+ B · 列表头「共 N 条 | 管理」。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 微信胶囊(不可覆盖)
+ 「管理」与胶囊冲突
+ 「管理」可安全点击
+
+
+
+
+
+ 实现提示:方案 A 用 uni.getMenuButtonBoundingClientRect()
+ (或微信 wx.getMenuButtonBoundingClientRect)取胶囊
+ width / left / right,给 .nav__inner 增加
+ padding-right,把「管理」推到胶囊左侧并留约 8px 间隙。
+ 非微信环境可回退为固定约 96px 右内边距。
+
+
+
+
+
+
diff --git a/mobile-ui/zkxw-mobile-oa-manage-search-icon-demo.html b/mobile-ui/zkxw-mobile-oa-manage-search-icon-demo.html
new file mode 100644
index 00000000..41c8c135
--- /dev/null
+++ b/mobile-ui/zkxw-mobile-oa-manage-search-icon-demo.html
@@ -0,0 +1,460 @@
+
+
+
+
+
+
OA 列表 · 搜索后方管理 Icon 选型
+
+
+
+
+
+
搜索框后方 · 管理 Icon 选型
+
+ 布局已定:顶栏不放「管理」;搜索框右侧放 36×36 icon。
+ 下面每种 icon 都画出普通态 / 管理态(完成)对照,点选卡片即可选定。
+
+
+ 已选定:搜索行 [搜索框] [三点菜单 icon];
+ 普通态 = 三点;管理态 = 勾选。已落地到草稿箱 / 待办 / 抄送三页。
+
+
+
+
+
+
+
绿框为当前可点区域示意;右上角仍保留微信胶囊,确认不会挡到 icon。
+
+
+
+
+
+
+
+
+
diff --git a/web-admin/graphify-out/manifest.json b/web-admin/graphify-out/manifest.json
index 6381fa81..90b89596 100644
--- a/web-admin/graphify-out/manifest.json
+++ b/web-admin/graphify-out/manifest.json
@@ -17,8 +17,8 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/common/index.ts": 1781272556.3597305,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/directive/directive.d.ts": 1781272556.3601494,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/api/api.d.ts": 1781272556.3606477,
- "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1786601057.3350704,
- "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1786601019.5323057,
+ "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1786601627.2922847,
+ "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1786601590.8955057,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/store/index.ts": 1781272556.364766,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/router/index.ts": 1782394569.8806834,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/composables/useAttachmentActions.ts": 1783921717.4015942,