import { OA_H5_ORIGIN } from './config.js' import { getToken } from './auth.js' function trimSlash(s) { return String(s || '').replace(/\/$/, '') } /** 小程序基础库未必有 URLSearchParams,用手写 query 更稳 */ function buildQuery(params) { const parts = [] Object.keys(params || {}).forEach((k) => { const v = params[k] if (v == null || v === '') return parts.push(encodeURIComponent(k) + '=' + encodeURIComponent(String(v))) }) return parts.join('&') } function withQuery(path, params) { const base = trimSlash(OA_H5_ORIGIN) + path const qs = buildQuery(params) return qs ? base + '?' + qs : base } /** 水槽页 URL(须带小程序登录 token,供 OA H5 调 /api) */ export function buildFormSinkUrl() { const token = getToken() return withQuery('/oa-form-sink', token ? { token } : {}) } /** * 关闭 web-view 失败时的小程序回退路径(须以 /pages/ 开头)。 * 优先 query.returnPath;否则取页面栈上一页。 */ export function resolveOaReturnPath(query) { const fromQuery = String((query && query.returnPath) || '').trim() if (fromQuery.indexOf('/pages/') === 0) return fromQuery try { const pages = typeof getCurrentPages === 'function' ? getCurrentPages() : [] if (pages && pages.length >= 2) { const prev = pages[pages.length - 2] const route = prev && prev.route if (route) return '/' + String(route).replace(/^\//, '') } } catch (_) { /* ignore */ } return '/pages/index/index' } /** 正式发起页 URL(与水槽同一套拼法,仅多 appId/draftId/fromInstanceId) */ export function buildOaStartUrl({ appId, draftId, fromInstanceId, returnPath } = {}) { const token = getToken() const params = {} if (appId) params.appId = appId if (draftId) params.draftId = draftId if (fromInstanceId) params.fromInstanceId = fromInstanceId if (returnPath) params.returnPath = returnPath if (token) params.token = token return withQuery('/oa-start', params) } /** 审批详情页 URL(须带 token;mode 为 view | approve;autoPrint=1 加载后自动调打印) */ export function buildOaDetailUrl({ instanceId, taskId, mode, autoPrint, returnPath } = {}) { const token = getToken() const params = {} if (instanceId) params.instanceId = instanceId if (taskId) params.taskId = taskId if (mode) params.mode = mode // view | approve if (autoPrint) params.autoPrint = '1' if (returnPath) params.returnPath = returnPath if (token) params.token = token return withQuery('/oa-detail', params) } const TITLE_KEY = 'oa_start_nav_title' /** 跳转前缓存流程名(勿把中文放进 navigateTo / web-view URL,微信易白屏) */ export function stashOaStartTitle(name) { const t = String(name || '').trim() try { if (t) uni.setStorageSync(TITLE_KEY, t) else uni.removeStorageSync(TITLE_KEY) } catch (_) { /* ignore */ } } export function takeOaStartTitle() { try { const t = String(uni.getStorageSync(TITLE_KEY) || '').trim() uni.removeStorageSync(TITLE_KEY) return t } catch (_) { return '' } } const DETAIL_TITLE_KEY = 'oa_detail_nav_title' /** 跳转前缓存详情标题(勿把中文放进 navigateTo / web-view URL) */ export function stashOaDetailTitle(name) { const t = String(name || '').trim() try { if (t) uni.setStorageSync(DETAIL_TITLE_KEY, t) else uni.removeStorageSync(DETAIL_TITLE_KEY) } catch (_) { /* ignore */ } } export function takeOaDetailTitle() { try { const t = String(uni.getStorageSync(DETAIL_TITLE_KEY) || '').trim() uni.removeStorageSync(DETAIL_TITLE_KEY) return t } catch (_) { return '' } }