|
|
@@ -67,7 +67,7 @@
|
|
|
|
|
|
<script setup>
|
|
|
import { computed, onMounted, onUnmounted, ref, watch } from 'vue'
|
|
|
-import { useRoute } from 'vue-router'
|
|
|
+import { useRoute, useRouter } from 'vue-router'
|
|
|
import { showToast } from 'vant'
|
|
|
import {
|
|
|
fetchOaTemplateDetail,
|
|
|
@@ -77,6 +77,7 @@ import {
|
|
|
fetchOaInstanceDraftDetail,
|
|
|
fetchSubmitOaInstanceDraft,
|
|
|
fetchStartOaInstance,
|
|
|
+ fetchOaInstanceDetail,
|
|
|
fetchUserList,
|
|
|
fetchCurrentUser,
|
|
|
fetchCnHolidayRange
|
|
|
@@ -109,6 +110,7 @@ import OaFlowPreview from '../oa/components/OaFlowPreview.vue'
|
|
|
import OaPulseLoading from '../oa/components/OaPulseLoading.vue'
|
|
|
|
|
|
const route = useRoute()
|
|
|
+const router = useRouter()
|
|
|
const detailLoading = ref(true)
|
|
|
const previewLoading = ref(false)
|
|
|
const savingDraft = ref(false)
|
|
|
@@ -612,6 +614,38 @@ async function loadByAppId(appId, { seedData = null, applyDefaults = true } = {}
|
|
|
await loadFlowPreview()
|
|
|
}
|
|
|
|
|
|
+function takeRestartPrefillsFromSession() {
|
|
|
+ try {
|
|
|
+ const raw = sessionStorage.getItem('oa_restart_prefills')
|
|
|
+ if (!raw) return null
|
|
|
+ sessionStorage.removeItem('oa_restart_prefills')
|
|
|
+ const parsed = JSON.parse(raw)
|
|
|
+ if (!parsed || typeof parsed !== 'object') return null
|
|
|
+ return parsed
|
|
|
+ } catch (_) {
|
|
|
+ try {
|
|
|
+ sessionStorage.removeItem('oa_restart_prefills')
|
|
|
+ } catch (__) {
|
|
|
+ /* ignore */
|
|
|
+ }
|
|
|
+ return null
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function parseInstanceFormData(d) {
|
|
|
+ if (d?.formData && typeof d.formData === 'object') return { ...d.formData }
|
|
|
+ if (d?.formDataJson && typeof d.formDataJson === 'object') return { ...d.formDataJson }
|
|
|
+ return {}
|
|
|
+}
|
|
|
+
|
|
|
+/** 加载成功后去掉 fromInstanceId,避免刷新/提交误当成编辑旧单 */
|
|
|
+function clearFromInstanceIdQuery() {
|
|
|
+ const q = { ...route.query }
|
|
|
+ if (q.fromInstanceId == null || q.fromInstanceId === '') return
|
|
|
+ delete q.fromInstanceId
|
|
|
+ router.replace({ path: '/oa-start', query: q }).catch(() => {})
|
|
|
+}
|
|
|
+
|
|
|
async function bootstrap() {
|
|
|
detailLoading.value = true
|
|
|
skipPreviewWatch = true
|
|
|
@@ -619,6 +653,9 @@ async function bootstrap() {
|
|
|
await loadCurrentUser()
|
|
|
const appId = String(route.query.appId || '').trim()
|
|
|
const draftId = String(route.query.draftId || '').trim()
|
|
|
+ const fromInstanceId = String(route.query.fromInstanceId || '').trim()
|
|
|
+ const sessionPrefills = takeRestartPrefillsFromSession()
|
|
|
+
|
|
|
if (draftId) {
|
|
|
const d = await fetchOaInstanceDraftDetail(draftId)
|
|
|
editingDraftId.value = draftId
|
|
|
@@ -632,10 +669,40 @@ async function bootstrap() {
|
|
|
d.formData && typeof d.formData === 'object' ? { ...d.formData } : {}
|
|
|
// 草稿:保留已填值,仅补空的 owner 等默认
|
|
|
await loadByAppId(aid, { seedData: seed, applyDefaults: true })
|
|
|
- } else if (appId) {
|
|
|
- initiatorSelectByNode.value = {}
|
|
|
+ } else if (appId || fromInstanceId || sessionPrefills) {
|
|
|
+ // 复制重开 / 普通发起:绝不带 editingDraftId,提交走新建实例
|
|
|
editingDraftId.value = ''
|
|
|
- await loadByAppId(appId, { seedData: {}, applyDefaults: true })
|
|
|
+ let seed = {}
|
|
|
+ let aid = appId
|
|
|
+ let initiatorSel = {}
|
|
|
+
|
|
|
+ if (sessionPrefills) {
|
|
|
+ if (sessionPrefills.formData && typeof sessionPrefills.formData === 'object') {
|
|
|
+ seed = { ...sessionPrefills.formData }
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ sessionPrefills.initiatorSelectByNode &&
|
|
|
+ typeof sessionPrefills.initiatorSelectByNode === 'object'
|
|
|
+ ) {
|
|
|
+ initiatorSel = { ...sessionPrefills.initiatorSelectByNode }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (fromInstanceId) {
|
|
|
+ try {
|
|
|
+ const old = await fetchOaInstanceDetail(fromInstanceId)
|
|
|
+ if (!aid) aid = String(old?.appId || '').trim()
|
|
|
+ const copied = parseInstanceFormData(old)
|
|
|
+ if (Object.keys(copied).length) seed = copied
|
|
|
+ } catch (_) {
|
|
|
+ /* 预填失败仍可手工填 */
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!aid) throw new Error('缺少 appId')
|
|
|
+ initiatorSelectByNode.value = initiatorSel
|
|
|
+ await loadByAppId(aid, { seedData: seed, applyDefaults: true })
|
|
|
+ clearFromInstanceIdQuery()
|
|
|
} else {
|
|
|
showToast('缺少 appId')
|
|
|
}
|