|
|
@@ -12,7 +12,11 @@ import {
|
|
|
takeOaStartTitle
|
|
|
} from '../../../utils/oa-h5.js'
|
|
|
import { navigateBackFromOaHost } from '../../../utils/oa-navigate-back.js'
|
|
|
-import { forceRelogin, getToken } from '../../../utils/auth.js'
|
|
|
+import {
|
|
|
+ forceRelogin,
|
|
|
+ getToken,
|
|
|
+ silentWechatLogin
|
|
|
+} from '../../../utils/auth.js'
|
|
|
import { fetchOaTemplateDetail } from '../../../utils/oa-api.js'
|
|
|
|
|
|
const CLOSE_ACTIONS = new Set([
|
|
|
@@ -26,90 +30,38 @@ const CLOSE_ACTIONS = new Set([
|
|
|
'oa-detail-restart'
|
|
|
])
|
|
|
|
|
|
+function buildQueryString(query) {
|
|
|
+ const q = query || {}
|
|
|
+ const parts = []
|
|
|
+ Object.keys(q).forEach((key) => {
|
|
|
+ const val = q[key]
|
|
|
+ if (val === undefined || val === null || val === '') return
|
|
|
+ parts.push(
|
|
|
+ encodeURIComponent(key) + '=' + encodeURIComponent(String(val))
|
|
|
+ )
|
|
|
+ })
|
|
|
+ return parts.join('&')
|
|
|
+}
|
|
|
+
|
|
|
export default {
|
|
|
data() {
|
|
|
- return { src: '', _closing: false }
|
|
|
+ return { src: '', _closing: false, _query: {} }
|
|
|
},
|
|
|
- onLoad(query) {
|
|
|
+ async onLoad(query) {
|
|
|
+ this._query = query || {}
|
|
|
if (!getToken()) {
|
|
|
- forceRelogin('请先登录')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- const instanceId = String((query && query.instanceId) || '')
|
|
|
- const taskId = String((query && query.taskId) || '')
|
|
|
- const mode = String((query && query.mode) || '') || 'view'
|
|
|
- const autoPrint = String((query && query.autoPrint) || '') === '1'
|
|
|
- const appId = String((query && query.appId) || '')
|
|
|
- const draftId = String((query && query.draftId) || '')
|
|
|
- const fromInstanceId = String((query && query.fromInstanceId) || '')
|
|
|
-
|
|
|
- // 传给 OA H5:真机 navigateBack 静默失败时 wx.reLaunch/redirectTo 用
|
|
|
- const returnPath = resolveOaReturnPath(query)
|
|
|
-
|
|
|
- let src = ''
|
|
|
-
|
|
|
- if (instanceId) {
|
|
|
- const cachedName = takeOaDetailTitle()
|
|
|
- if (cachedName) {
|
|
|
- uni.setNavigationBarTitle({ title: cachedName })
|
|
|
- }
|
|
|
- src = buildOaDetailUrl({ instanceId, taskId, mode, autoPrint, returnPath })
|
|
|
- } else if (draftId || appId || fromInstanceId) {
|
|
|
- const cachedName = takeOaStartTitle()
|
|
|
- if (cachedName) {
|
|
|
- uni.setNavigationBarTitle({ title: cachedName })
|
|
|
- } else if (appId) {
|
|
|
- this.resolveTitle(appId)
|
|
|
+ try {
|
|
|
+ await silentWechatLogin()
|
|
|
+ } catch (e) {
|
|
|
+ const qs = buildQueryString(this._query)
|
|
|
+ forceRelogin(
|
|
|
+ '请先登录',
|
|
|
+ '/pages/oa/webview/index' + (qs ? '?' + qs : '')
|
|
|
+ )
|
|
|
+ return
|
|
|
}
|
|
|
- src = buildOaStartUrl({ appId, draftId, fromInstanceId, returnPath })
|
|
|
- } else {
|
|
|
- uni.showToast({ title: '参数错误', icon: 'none' })
|
|
|
- setTimeout(() => {
|
|
|
- uni.navigateBack({
|
|
|
- fail: () => {}
|
|
|
- })
|
|
|
- }, 400)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- if (!/\btoken=/.test(src)) {
|
|
|
- forceRelogin('请先登录')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- console.log('[oa webview] onLoad', {
|
|
|
- returnPath,
|
|
|
- mode,
|
|
|
- instanceId,
|
|
|
- taskId,
|
|
|
- appId,
|
|
|
- draftId,
|
|
|
- fromInstanceId,
|
|
|
- src
|
|
|
- })
|
|
|
- try {
|
|
|
- const pages = getCurrentPages() || []
|
|
|
- console.log(
|
|
|
- '[oa webview] stack',
|
|
|
- pages.map((p) => (p && p.route) || '')
|
|
|
- )
|
|
|
- } catch (e) {
|
|
|
- console.log('[oa webview] stack err', e)
|
|
|
}
|
|
|
- this.src = src
|
|
|
-
|
|
|
- // H5:OA 页在 iframe 内,靠 postMessage 通知本页 uni.navigateBack
|
|
|
- // (微信小程序由 OA 内 wx.miniProgram.navigateBack,勿在此再退一层)
|
|
|
- // #ifdef H5
|
|
|
- this._onParentMessage = (e) => {
|
|
|
- const d = e && e.data
|
|
|
- if (!d || d.source !== 'zkxw-oa-h5') return
|
|
|
- console.log('[oa webview] iframe message', d)
|
|
|
- this.navigateBackFromOa(d)
|
|
|
- }
|
|
|
- window.addEventListener('message', this._onParentMessage)
|
|
|
- // #endif
|
|
|
+ this.openFromQuery(this._query)
|
|
|
},
|
|
|
onShow() {
|
|
|
console.log('[oa webview] onShow closing=', this._closing)
|
|
|
@@ -124,6 +76,94 @@ export default {
|
|
|
// #endif
|
|
|
},
|
|
|
methods: {
|
|
|
+ openFromQuery(query) {
|
|
|
+ const instanceId = String((query && query.instanceId) || '')
|
|
|
+ const taskId = String((query && query.taskId) || '')
|
|
|
+ const mode = String((query && query.mode) || '') || 'view'
|
|
|
+ const autoPrint = String((query && query.autoPrint) || '') === '1'
|
|
|
+ const appId = String((query && query.appId) || '')
|
|
|
+ const draftId = String((query && query.draftId) || '')
|
|
|
+ const fromInstanceId = String((query && query.fromInstanceId) || '')
|
|
|
+
|
|
|
+ // 传给 OA H5:真机 navigateBack 静默失败时 wx.reLaunch/redirectTo 用
|
|
|
+ const returnPath = resolveOaReturnPath(query)
|
|
|
+
|
|
|
+ let src = ''
|
|
|
+
|
|
|
+ if (instanceId) {
|
|
|
+ const cachedName = takeOaDetailTitle()
|
|
|
+ if (cachedName) {
|
|
|
+ uni.setNavigationBarTitle({ title: cachedName })
|
|
|
+ }
|
|
|
+ src = buildOaDetailUrl({
|
|
|
+ instanceId,
|
|
|
+ taskId,
|
|
|
+ mode,
|
|
|
+ autoPrint,
|
|
|
+ returnPath
|
|
|
+ })
|
|
|
+ } else if (draftId || appId || fromInstanceId) {
|
|
|
+ const cachedName = takeOaStartTitle()
|
|
|
+ if (cachedName) {
|
|
|
+ uni.setNavigationBarTitle({ title: cachedName })
|
|
|
+ } else if (appId) {
|
|
|
+ this.resolveTitle(appId)
|
|
|
+ }
|
|
|
+ src = buildOaStartUrl({ appId, draftId, fromInstanceId, returnPath })
|
|
|
+ } else {
|
|
|
+ uni.showToast({ title: '参数错误', icon: 'none' })
|
|
|
+ setTimeout(() => {
|
|
|
+ uni.navigateBack({
|
|
|
+ fail: () => {}
|
|
|
+ })
|
|
|
+ }, 400)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!/\btoken=/.test(src)) {
|
|
|
+ const qs = buildQueryString(query)
|
|
|
+ forceRelogin(
|
|
|
+ '请先登录',
|
|
|
+ '/pages/oa/webview/index' + (qs ? '?' + qs : '')
|
|
|
+ )
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log('[oa webview] onLoad', {
|
|
|
+ returnPath,
|
|
|
+ mode,
|
|
|
+ instanceId,
|
|
|
+ taskId,
|
|
|
+ appId,
|
|
|
+ draftId,
|
|
|
+ fromInstanceId,
|
|
|
+ src
|
|
|
+ })
|
|
|
+ try {
|
|
|
+ const pages = getCurrentPages() || []
|
|
|
+ console.log(
|
|
|
+ '[oa webview] stack',
|
|
|
+ pages.map((p) => (p && p.route) || '')
|
|
|
+ )
|
|
|
+ } catch (e) {
|
|
|
+ console.log('[oa webview] stack err', e)
|
|
|
+ }
|
|
|
+ this.src = src
|
|
|
+
|
|
|
+ // H5:OA 页在 iframe 内,靠 postMessage 通知本页 uni.navigateBack
|
|
|
+ // (微信小程序由 OA 内 wx.miniProgram.navigateBack,勿在此再退一层)
|
|
|
+ // #ifdef H5
|
|
|
+ if (!this._onParentMessage) {
|
|
|
+ this._onParentMessage = (e) => {
|
|
|
+ const d = e && e.data
|
|
|
+ if (!d || d.source !== 'zkxw-oa-h5') return
|
|
|
+ console.log('[oa webview] iframe message', d)
|
|
|
+ this.navigateBackFromOa(d)
|
|
|
+ }
|
|
|
+ window.addEventListener('message', this._onParentMessage)
|
|
|
+ }
|
|
|
+ // #endif
|
|
|
+ },
|
|
|
async resolveTitle(appId) {
|
|
|
try {
|
|
|
const detail = await fetchOaTemplateDetail(appId)
|