openxiangda 1.0.151 → 1.0.152
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/openxiangda-skills/SKILL.md +1 -0
- package/openxiangda-skills/references/component-guide.md +4 -0
- package/openxiangda-skills/references/pages/page-sdk.md +3 -2
- package/package.json +6 -2
- package/packages/sdk/dist/{ProcessPreview-BOCARAvP.d.mts → ProcessPreview-B_HqjU7v.d.mts} +4 -2
- package/packages/sdk/dist/{ProcessPreview-BOCARAvP.d.ts → ProcessPreview-B_HqjU7v.d.ts} +4 -2
- package/packages/sdk/dist/components/index.cjs +3488 -2270
- package/packages/sdk/dist/components/index.cjs.map +1 -1
- package/packages/sdk/dist/components/index.d.mts +145 -38
- package/packages/sdk/dist/components/index.d.ts +145 -38
- package/packages/sdk/dist/components/index.mjs +3240 -2017
- package/packages/sdk/dist/components/index.mjs.map +1 -1
- package/packages/sdk/dist/{dataManagementApi-CLMqf79O.d.mts → dataManagementApi-CEDsA3tT.d.ts} +2 -2
- package/packages/sdk/dist/{dataManagementApi-DhpRKmlp.d.ts → dataManagementApi-quq3Zhgo.d.mts} +2 -2
- package/packages/sdk/dist/runtime/index.cjs +3172 -2301
- package/packages/sdk/dist/runtime/index.cjs.map +1 -1
- package/packages/sdk/dist/runtime/index.d.mts +5 -4
- package/packages/sdk/dist/runtime/index.d.ts +5 -4
- package/packages/sdk/dist/runtime/index.mjs +3068 -2192
- package/packages/sdk/dist/runtime/index.mjs.map +1 -1
- package/packages/sdk/dist/runtime/react.cjs +2 -2
- package/packages/sdk/dist/runtime/react.cjs.map +1 -1
- package/packages/sdk/dist/runtime/react.d.mts +9 -4
- package/packages/sdk/dist/runtime/react.d.ts +9 -4
- package/packages/sdk/dist/runtime/react.mjs +2 -2
- package/packages/sdk/dist/runtime/react.mjs.map +1 -1
- package/templates/openxiangda-react-spa/AGENTS.md +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/react/createReactPage.tsx","../../src/runtime/react/provider.tsx","../../src/runtime/react/store.ts","../../src/runtime/core/client.ts","../../src/styles/antd-theme.ts","../../src/runtime/react/hooks/useCurrentUser.ts","../../src/runtime/react/hooks/usePageContext.ts","../../src/runtime/react/hooks/useDataSource.ts","../../src/runtime/react/hooks/usePageSdk.ts","../../src/runtime/react/hooks/useFormViewPermissions.ts","../../src/runtime/react/hooks/useMessage.ts","../../src/runtime/react/hooks/useModal.ts","../../src/runtime/react/hooks/useNavigation.ts","../../src/runtime/react/hooks/usePageProps.ts","../../src/runtime/react/hooks/usePageRoute.ts","../../src/runtime/react/workflow.tsx","../../src/components/modules/StickyActionBar.tsx","../../src/components/utils/confirmAction.ts","../../src/components/modules/ApprovalTimeline.tsx","../../src/components/core/constants.ts","../../src/components/modules/ProcessPreview.tsx","../../src/components/modules/InitiatorApproverSelector.tsx","../../src/components/core/processApi.ts","../../src/components/fields/shared/UserPicker.tsx","../../src/components/fields/shared/fieldFormat.ts","../../src/components/fields/shared/useLazyDepartmentTree.ts","../../src/runtime/react/openxiangdaProvider.tsx","../../src/runtime/core/fetch.ts","../../src/runtime/host/browserHost.ts","../../src/runtime/react/auth.tsx","../../src/runtime/core/auth.ts","../../src/runtime/react/publicAccess.tsx","../../src/runtime/core/publicAccess.ts"],"sourcesContent":["import { StyleProvider } from \"@ant-design/cssinjs\";\nimport { App as AntdApp, ConfigProvider, message } from \"antd\";\nimport zhCN from \"antd/locale/zh_CN.js\";\nimport dayjs from \"dayjs\";\nimport \"dayjs/locale/zh-cn.js\";\nimport React from \"react\";\nimport { createRoot } from \"react-dom/client\";\n\nimport { PageProvider } from \"./provider\";\nimport { antdTheme, legacyAntdTheme } from \"../../styles/antd-theme\";\n\nimport type { PageContext } from \"../core/types\";\n\ndayjs.locale(\"zh-cn\");\n\ntype RootLike = {\n render: (node: React.ReactNode) => void;\n unmount: () => void;\n};\n\nconst NAMESPACE_ROOT_CLASS = \"sy-app-workspace\";\nconst RUNTIME_PORTAL_ATTR = \"data-sy-runtime-portal\";\nconst PORTAL_CONTAINER_STACK_GLOBAL = \"__OPENXIANGDA_PORTAL_CONTAINER_STACK__\";\nconst PORTAL_CONTAINER_RESOLVER_GLOBAL = \"__OPENXIANGDA_GET_PORTAL_CONTAINER__\";\nconst MESSAGE_PROXY_GLOBAL = \"__OPENXIANGDA_ANTD_MESSAGE_PROXY__\";\nconst MESSAGE_METHODS = [\n \"open\",\n \"success\",\n \"info\",\n \"warning\",\n \"error\",\n \"loading\",\n \"destroy\",\n] as const;\n\ntype RuntimePortalHandle = {\n container: HTMLElement | null;\n release: () => void;\n};\n\ntype RuntimeCssIsolation = \"none\" | \"namespace\" | \"shadow\";\n\ntype MessageMethod = (typeof MESSAGE_METHODS)[number];\n\ntype AntdMessageProxyState = {\n apiStack: Array<Record<string, unknown>>;\n installed: boolean;\n originalMethods: Partial<Record<MessageMethod, (...args: unknown[]) => unknown>>;\n};\n\nconst createRuntimeRoot = (el: HTMLElement): RootLike => {\n return createRoot(el);\n};\n\nconst normalizeCssIsolation = (value: unknown): RuntimeCssIsolation => {\n if (value === \"namespace\" || value === \"shadow\") return value;\n return \"none\";\n};\n\nconst usesLegacyCssIsolation = (cssIsolation: RuntimeCssIsolation) =>\n cssIsolation === \"namespace\" || cssIsolation === \"shadow\";\n\nconst getRuntimeCssIsolation = (context: PageContext): RuntimeCssIsolation =>\n normalizeCssIsolation(context.page?.capabilities?.cssIsolation);\n\nconst getAntdRuntimeOptions = (cssIsolation: RuntimeCssIsolation) => {\n const legacy = usesLegacyCssIsolation(cssIsolation);\n return {\n prefixCls: legacy ? \"sy-ant\" : \"ant\",\n iconPrefixCls: legacy ? \"sy-anticon\" : \"anticon\",\n messagePrefixCls: legacy ? \"sy-ant-message\" : \"ant-message\",\n theme: legacy ? legacyAntdTheme : antdTheme,\n };\n};\n\nconst isShadowRoot = (rootNode: Node | null | undefined): rootNode is ShadowRoot =>\n typeof ShadowRoot !== \"undefined\" && rootNode instanceof ShadowRoot;\n\nconst getStyleContainer = (el: HTMLElement): HTMLElement | ShadowRoot => {\n const rootNode = el.getRootNode?.();\n if (isShadowRoot(rootNode)) {\n return rootNode;\n }\n return document.head;\n};\n\nconst getRuntimeRoot = (el: HTMLElement, triggerNode?: HTMLElement) => {\n const rootNode = el.getRootNode?.();\n if (isShadowRoot(rootNode)) return el;\n const triggerRoot = triggerNode?.closest?.<HTMLElement>(\n `.${NAMESPACE_ROOT_CLASS}`,\n );\n return (\n triggerRoot ||\n el.closest<HTMLElement>(`.${NAMESPACE_ROOT_CLASS}`) ||\n el.querySelector<HTMLElement>(`.${NAMESPACE_ROOT_CLASS}`) ||\n el\n );\n};\n\nconst getRuntimeOverlayContainer = (\n el: HTMLElement,\n portalContainer: HTMLElement | null,\n): {\n getPopupContainer: (triggerNode?: HTMLElement) => HTMLElement | ShadowRoot;\n getTargetContainer: () => HTMLElement | ShadowRoot;\n} => {\n const getOverlayRoot = (triggerNode?: HTMLElement) => {\n if (portalContainer?.isConnected) return portalContainer;\n return getRuntimeRoot(el, triggerNode);\n };\n\n return {\n getPopupContainer: (triggerNode?: HTMLElement) => {\n return getOverlayRoot(triggerNode);\n },\n getTargetContainer: () => getRuntimeRoot(el),\n };\n};\n\nconst createAntdConfig = (\n overlayContainer: ReturnType<typeof getRuntimeOverlayContainer>,\n cssIsolation: RuntimeCssIsolation,\n) => {\n const antdOptions = getAntdRuntimeOptions(cssIsolation);\n return {\n locale: zhCN,\n prefixCls: antdOptions.prefixCls,\n iconPrefixCls: antdOptions.iconPrefixCls,\n theme: antdOptions.theme,\n ...(usesLegacyCssIsolation(cssIsolation)\n ? {\n getPopupContainer: overlayContainer.getPopupContainer,\n getTargetContainer: overlayContainer.getTargetContainer,\n }\n : {}),\n };\n};\n\nconst createPortalContainer = (el: HTMLElement) => {\n const rootNode = el.getRootNode?.();\n const parent = isShadowRoot(rootNode)\n ? rootNode\n : el.ownerDocument?.body || document.body;\n const portalContainer = el.ownerDocument.createElement(\"div\");\n portalContainer.setAttribute(RUNTIME_PORTAL_ATTR, \"\");\n portalContainer.classList.add(NAMESPACE_ROOT_CLASS);\n parent.appendChild(portalContainer);\n return portalContainer;\n};\n\nconst getAntdMessageProxyState = (): AntdMessageProxyState => {\n const globalScope = globalThis as typeof globalThis & {\n [MESSAGE_PROXY_GLOBAL]?: AntdMessageProxyState;\n };\n if (!globalScope[MESSAGE_PROXY_GLOBAL]) {\n globalScope[MESSAGE_PROXY_GLOBAL] = {\n apiStack: [],\n installed: false,\n originalMethods: {},\n };\n }\n return globalScope[MESSAGE_PROXY_GLOBAL];\n};\n\nconst installAntdMessageProxy = () => {\n const state = getAntdMessageProxyState();\n if (state.installed) return state;\n MESSAGE_METHODS.forEach((method) => {\n const originalMethod = (message as unknown as Record<string, unknown>)[method];\n if (typeof originalMethod !== \"function\") return;\n state.originalMethods[method] = originalMethod.bind(message) as (\n ...args: unknown[]\n ) => unknown;\n (message as unknown as Record<string, unknown>)[method] = (\n ...args: unknown[]\n ) => {\n const api = state.apiStack.at(-1);\n const apiMethod = api?.[method];\n if (typeof apiMethod === \"function\") {\n return apiMethod(...args);\n }\n return state.originalMethods[method]?.(...args);\n };\n });\n state.installed = true;\n return state;\n};\n\nconst registerAntdMessageApi = (api: Record<string, unknown>) => {\n const state = installAntdMessageProxy();\n state.apiStack.push(api);\n return () => {\n const position = state.apiStack.lastIndexOf(api);\n if (position >= 0) {\n state.apiStack.splice(position, 1);\n }\n };\n};\n\nconst installRuntimePortalContainer = (\n el: HTMLElement,\n cssIsolation: RuntimeCssIsolation,\n): RuntimePortalHandle => {\n const globalScope = globalThis as typeof globalThis & {\n [PORTAL_CONTAINER_STACK_GLOBAL]?: HTMLElement[];\n [PORTAL_CONTAINER_RESOLVER_GLOBAL]?: () => HTMLElement;\n };\n const portalContainer = usesLegacyCssIsolation(cssIsolation)\n ? createPortalContainer(el)\n : null;\n const stack = Array.isArray(globalScope[PORTAL_CONTAINER_STACK_GLOBAL])\n ? globalScope[PORTAL_CONTAINER_STACK_GLOBAL]\n : [];\n const stackTarget = portalContainer ?? el.ownerDocument?.body ?? document.body;\n stack.push(stackTarget);\n globalScope[PORTAL_CONTAINER_STACK_GLOBAL] = stack;\n globalScope[PORTAL_CONTAINER_RESOLVER_GLOBAL] = () => {\n for (let index = stack.length - 1; index >= 0; index -= 1) {\n const candidate = stack[index];\n if (candidate?.isConnected) {\n return candidate;\n }\n }\n return (\n document.querySelector<HTMLElement>(`[${RUNTIME_PORTAL_ATTR}]`) ||\n document.querySelector<HTMLElement>(`.${NAMESPACE_ROOT_CLASS}`) ||\n document.body\n );\n };\n\n return {\n container: portalContainer,\n release: () => {\n const position = stack.lastIndexOf(stackTarget);\n if (position >= 0) {\n stack.splice(position, 1);\n }\n portalContainer?.remove();\n },\n };\n};\n\nconst installAntdStaticHolder = (\n el: HTMLElement,\n portalContainer: HTMLElement | null,\n cssIsolation: RuntimeCssIsolation,\n) => {\n installAntdMessageProxy();\n const antdOptions = getAntdRuntimeOptions(cssIsolation);\n const getMessageContainer = () => {\n if (portalContainer?.isConnected) return portalContainer;\n return usesLegacyCssIsolation(cssIsolation) ? getRuntimeRoot(el) : document.body;\n };\n\n ConfigProvider.config({\n prefixCls: antdOptions.prefixCls,\n iconPrefixCls: antdOptions.iconPrefixCls,\n theme: antdOptions.theme,\n holderRender: (children) => {\n if (!el.isConnected) {\n return (\n <ConfigProvider\n locale={zhCN}\n prefixCls={antdOptions.prefixCls}\n iconPrefixCls={antdOptions.iconPrefixCls}\n theme={antdOptions.theme}\n >\n {children}\n </ConfigProvider>\n );\n }\n const overlayContainer = getRuntimeOverlayContainer(el, portalContainer);\n return (\n <StyleProvider hashPriority=\"high\" container={getStyleContainer(el)}>\n <ConfigProvider {...createAntdConfig(overlayContainer, cssIsolation)}>\n {children}\n </ConfigProvider>\n </StyleProvider>\n );\n },\n });\n message.config({\n prefixCls: antdOptions.messagePrefixCls,\n getContainer: getMessageContainer,\n });\n};\n\nconst RuntimeMessageBridge = ({ children }: { children: React.ReactNode }) => {\n const appContext = AntdApp.useApp();\n React.useLayoutEffect(() => {\n return registerAntdMessageApi(\n appContext.message as unknown as Record<string, unknown>,\n );\n }, [appContext.message]);\n return <>{children}</>;\n};\n\nexport const createReactPage = (\n AppComponent: React.ComponentType,\n): {\n mount: (el: HTMLElement, context: PageContext) => void;\n update: (el: HTMLElement, context: PageContext) => void;\n unmount: () => void;\n} => {\n let root: RootLike | null = null;\n let currentContainer: HTMLElement | null = null;\n let releasePortalContainer: (() => void) | null = null;\n let portalContainer: HTMLElement | null = null;\n let currentCssIsolation: RuntimeCssIsolation | null = null;\n\n const render = (el: HTMLElement, context: PageContext) => {\n const cssIsolation = getRuntimeCssIsolation(context);\n if (usesLegacyCssIsolation(cssIsolation)) {\n el.classList.add(NAMESPACE_ROOT_CLASS);\n } else {\n el.classList.remove(NAMESPACE_ROOT_CLASS);\n }\n if (\n !root ||\n currentContainer !== el ||\n currentCssIsolation !== cssIsolation ||\n (usesLegacyCssIsolation(cssIsolation) && !portalContainer?.isConnected)\n ) {\n root?.unmount();\n releasePortalContainer?.();\n root = createRuntimeRoot(el);\n currentContainer = el;\n currentCssIsolation = cssIsolation;\n const portalHandle = installRuntimePortalContainer(el, cssIsolation);\n portalContainer = portalHandle.container;\n releasePortalContainer = portalHandle.release;\n }\n const overlayContainer = getRuntimeOverlayContainer(el, portalContainer);\n installAntdStaticHolder(el, portalContainer, cssIsolation);\n const antdConfig = createAntdConfig(overlayContainer, cssIsolation);\n\n root.render(\n <StyleProvider hashPriority=\"high\" container={getStyleContainer(el)}>\n <ConfigProvider {...antdConfig}>\n <AntdApp>\n <RuntimeMessageBridge>\n <PageProvider context={context}>\n <AppComponent />\n </PageProvider>\n </RuntimeMessageBridge>\n </AntdApp>\n </ConfigProvider>\n </StyleProvider>,\n );\n };\n\n return {\n mount: (el, context) => {\n render(el, context);\n },\n update: (el, context) => {\n render(el, context);\n },\n unmount: () => {\n root?.unmount();\n releasePortalContainer?.();\n root = null;\n currentContainer = null;\n releasePortalContainer = null;\n portalContainer = null;\n currentCssIsolation = null;\n },\n };\n};\n","import React, { useMemo } from \"react\"\n\nimport { ReactPageContext } from \"./store\"\nimport { createPageSdk } from \"../core/client\"\n\nimport type { PageSdkStore } from \"./store\"\nimport type { PageContext } from \"../core/types\"\n\nexport interface PageProviderProps {\n context: PageContext\n children: React.ReactNode\n}\n\nexport const PageProvider: React.FC<PageProviderProps> = ({\n context,\n children,\n}) => {\n const value = useMemo<PageSdkStore>(\n () => ({\n context,\n sdk: createPageSdk(context),\n }),\n [context],\n )\n\n return (\n <ReactPageContext.Provider value={value}>\n {children}\n </ReactPageContext.Provider>\n )\n}\n","import { createContext, useContext } from \"react\"\n\nimport type { PageContext, PageSdk } from \"../core/types\"\n\nexport interface PageSdkStore {\n context: PageContext\n sdk: PageSdk\n}\n\nexport const ReactPageContext = createContext<PageSdkStore | null>(null)\n\nexport const usePageSdkStore = () => {\n const store = useContext(ReactPageContext)\n if (!store) {\n throw new Error(\"usePageSdkStore 必须在 PageProvider 内使用\")\n }\n return store\n}\n","import type {\n ApiPermissionListParams,\n AuthLogoutRedirectOptions,\n ApproveTaskParams,\n AssignPermissionsParams,\n AssignRolesParams,\n BatchAddUsersToRoleParams,\n BatchSendNotificationByTypeParams,\n ConnectorCallParams,\n ConnectorInvokeParams,\n ConnectorInvokeResult,\n CreateApiPermissionParams,\n CreateOrganizationAccountParams,\n CreateOrganizationDepartmentParams,\n CreateFormPermissionGroupDto,\n CreatePagePermissionGroupDto,\n CreateRoleParams,\n CreateUiPermissionParams,\n CurrentUserDepartmentParents,\n DataManagementConfigParams,\n DataViewQueryParams,\n DataViewQueryResult,\n DataViewStatsParams,\n FileAccessTicketResult,\n FormAdvancedSearchParams,\n FormChangeRecordParams,\n FormCreateParams,\n FormCreateResult,\n FormExportParams,\n FormGetDetailParams,\n FormImportParams,\n FormRemoveParams,\n FormSearchParams,\n FormUpdateParams,\n FunctionInvokeParams,\n FunctionInvokeResult,\n GetParentDepartmentsOptions,\n GetProcessInstanceParams,\n GetUserRolesParams,\n ImportExportRecordDownloadParams,\n ImportExportRecordQuery,\n LoginLogGetParams,\n LoginLogListParams,\n LoginLogRecord,\n LoginLogStats,\n LoginLogStatsParams,\n PageApiResponse,\n PageBinaryResponse,\n PageContext,\n PageDataSourceDescriptor,\n PageDepartmentRecord,\n PageHttpMethod,\n PageListResult,\n PageOffsetListResult,\n PagePermissionGroup,\n PageRequestOptions,\n PageSdk,\n PageSdkError,\n PageUserRecord,\n PageTransportDownloadPayload,\n PageTransportRequestPayload,\n PreviewDingTalkNotificationParams,\n PreviewNotificationTemplateParams,\n ProcessInstanceLookupParams,\n ResetOrganizationAccountPasswordParams,\n ResolveProcessCapabilitiesParams,\n FormPermissionGroup,\n ListNotificationInboxParams,\n ListWorkCenterItemsParams,\n MarkAllNotificationReadResult,\n NotificationInboxListResult,\n NotificationInboxMessage,\n NotificationUnreadCountResult,\n OrganizationAccountListParams,\n RoleListParams,\n RoleUsersParams,\n SaveDataManagementConfigParams,\n SearchExpression,\n SearchGroup,\n SearchRule,\n SearchSortItem,\n SubFormRule,\n SwitchAppRoleParams,\n SwitchPlatformRoleParams,\n TerminateProcessInstanceParams,\n TriggerCallbackTaskParams,\n ChangeOrganizationAccountPasswordParams,\n UiPermissionListParams,\n UpdateApiPermissionParams,\n UpdateFormPermissionGroupDto,\n UpdateOrganizationAccountParams,\n UpdateOrganizationDepartmentParams,\n UpdatePagePermissionGroupDto,\n UpdateRoleParams,\n UpdateUiPermissionParams,\n UpdateUserParams,\n QueryFormPermissionGroupDto,\n QueryPagePermissionGroupDto,\n UserListParams,\n UserMenuPermissionsResponse,\n ValidateUserParams,\n CreateUserParams,\n SendNotificationByTypeParams,\n SendNotificationResult,\n ViewFieldPermissionValue,\n ViewPermissionSummary,\n WorkCenterItem,\n WorkCenterListResult,\n WorkCenterStats,\n WorkCenterStatsParams,\n WorkflowApproveParams,\n WorkflowDefinitionByFormParams,\n WorkflowInitiatorSelectCandidatesParams,\n WorkflowInitiatorSelectRequirementsParams,\n WorkflowPreviewParams,\n WorkflowResubmitInitiatorSelectRequirementsParams,\n WorkflowResubmitParams,\n WorkflowReturnParams,\n WorkflowSaveTaskParams,\n WorkflowStartFromExistingInstanceParams,\n WorkflowTaskParams,\n WorkflowTransferParams,\n WorkflowWithdrawParams,\n} from \"./types\"\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst isSearchRuleLike = (value: unknown): value is SearchRule | SubFormRule =>\n isRecord(value) &&\n typeof value.key === \"string\" &&\n (value.componentName === undefined || typeof value.componentName === \"string\")\n\nconst isBlobLike = (value: unknown): value is Blob =>\n typeof Blob !== \"undefined\" && value instanceof Blob\n\nconst nowMs = () =>\n typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now()\n\nconst normalizeMethod = (value: PageHttpMethod | string): PageHttpMethod => {\n const method = String(value || \"get\").toLowerCase()\n if (\n method === \"get\" ||\n method === \"post\" ||\n method === \"put\" ||\n method === \"delete\" ||\n method === \"patch\"\n ) {\n return method\n }\n return \"get\"\n}\n\nconst resolveAppType = (\n context: PageContext,\n explicitAppType?: string,\n): string => {\n const appType = String(explicitAppType || context.app.appType || \"\").trim()\n if (!appType) {\n throw new Error(\"appType 不能为空\")\n }\n return appType\n}\n\nconst buildAppPath = (\n context: PageContext,\n explicitAppType: string | undefined,\n suffix: string,\n) => `/${resolveAppType(context, explicitAppType)}${suffix}`\n\nconst buildOpenXiangdaAppPath = (\n context: PageContext,\n explicitAppType: string | undefined,\n suffix: string,\n) =>\n `/openxiangda-api/v1/apps/${encodePathSegment(\n resolveAppType(context, explicitAppType),\n )}${suffix}`\n\nconst encodePathSegment = (value: string) => encodeURIComponent(String(value))\n\nconst withPostDeleteAction = (path: string) =>\n path.includes(\"/delete\") ? path : `${path.replace(/\\/$/, \"\")}/delete`\n\nconst getHeaderValue = (\n headers: Record<string, unknown> | undefined,\n name: string,\n): string | undefined => {\n if (!headers) {\n return undefined\n }\n const target = name.toLowerCase()\n const entry = Object.entries(headers).find(\n ([key]) => key.toLowerCase() === target,\n )\n return entry ? String(entry[1]) : undefined\n}\n\nconst parseContentDispositionFileName = (\n contentDisposition?: string,\n): string | undefined => {\n if (!contentDisposition) {\n return undefined\n }\n\n const utf8Match = contentDisposition.match(/filename\\*=UTF-8''([^;]+)/i)\n if (utf8Match?.[1]) {\n try {\n return decodeURIComponent(utf8Match[1])\n } catch {\n return utf8Match[1]\n }\n }\n\n const quotedMatch = contentDisposition.match(/filename=\"([^\"]+)\"/i)\n if (quotedMatch?.[1]) {\n return quotedMatch[1]\n }\n\n const plainMatch = contentDisposition.match(/filename=([^;]+)/i)\n if (plainMatch?.[1]) {\n return plainMatch[1].trim()\n }\n\n return undefined\n}\n\nconst parseConnectorCallName = (name: string) => {\n const value = String(name || \"\").trim()\n const separatorIndex = value.indexOf(\".\")\n if (separatorIndex <= 0 || separatorIndex === value.length - 1) {\n throw new Error(\"连接器调用名必须是 connector.api 格式\")\n }\n\n return {\n connector: value.slice(0, separatorIndex),\n api: value.slice(separatorIndex + 1),\n }\n}\n\nconst serializeQuery = (query?: Record<string, unknown>) => {\n if (!query) {\n return undefined\n }\n\n const params = new URLSearchParams()\n\n const appendValue = (key: string, value: unknown) => {\n if (value === undefined || value === null || value === \"\") {\n return\n }\n if (Array.isArray(value)) {\n value.forEach((item) => appendValue(key, item))\n return\n }\n if (value instanceof Date) {\n params.append(key, value.toISOString())\n return\n }\n params.append(key, String(value))\n }\n\n Object.entries(query).forEach(([key, value]) => {\n appendValue(key, value)\n })\n\n const serialized = params.toString()\n return serialized || undefined\n}\n\nconst serializeCommaList = (value: unknown) =>\n Array.isArray(value)\n ? value\n .map((item) => String(item ?? \"\").trim())\n .filter(Boolean)\n .join(\",\")\n : value\n\nconst toLegacyRules = (value: Record<string, unknown>) =>\n Object.entries(value).flatMap(([key, itemValue]) => {\n if (itemValue === undefined) {\n return []\n }\n return [\n {\n key,\n operator: Array.isArray(itemValue) ? \"IN\" : \"EQ\",\n value: itemValue,\n },\n ]\n })\n\nconst toSearchGroup = (value: unknown): SearchGroup | undefined => {\n if (value === undefined || value === null || value === \"\") {\n return undefined\n }\n\n if (typeof value === \"string\") {\n try {\n return toSearchGroup(JSON.parse(value))\n } catch {\n return undefined\n }\n }\n\n if (Array.isArray(value)) {\n const rules: Array<SearchRule | SubFormRule> = []\n const conditions: SearchGroup[] = []\n\n value.forEach((item) => {\n const group = toSearchGroup(item)\n if (group) {\n if (group.rules?.length) {\n rules.push(...group.rules)\n }\n if (group.conditions?.length) {\n conditions.push(...group.conditions)\n }\n return\n }\n\n if (isSearchRuleLike(item)) {\n rules.push(item)\n return\n }\n\n if (isRecord(item)) {\n rules.push(...(toLegacyRules(item) as SearchRule[]))\n }\n })\n\n if (rules.length === 0 && conditions.length === 0) {\n return undefined\n }\n\n return {\n logic: \"AND\",\n ...(rules.length > 0 ? { rules } : {}),\n ...(conditions.length > 0 ? { conditions } : {}),\n }\n }\n\n if (isRecord(value)) {\n if (isSearchRuleLike(value)) {\n return {\n logic: \"AND\",\n rules: [value],\n }\n }\n\n if (\"rules\" in value || \"conditions\" in value || \"logic\" in value) {\n const nextGroup: SearchGroup = {\n logic:\n value.logic === \"OR\" || value.logic === \"AND\" ? value.logic : \"AND\",\n }\n\n if (Array.isArray(value.rules)) {\n nextGroup.rules = value.rules.filter(isSearchRuleLike)\n }\n\n if (Array.isArray(value.conditions)) {\n nextGroup.conditions = value.conditions\n .map((item) => toSearchGroup(item))\n .filter((item): item is SearchGroup => Boolean(item))\n }\n\n if (!nextGroup.rules?.length && !nextGroup.conditions?.length) {\n return undefined\n }\n\n return nextGroup\n }\n\n const rules = toLegacyRules(value)\n if (rules.length === 0) {\n return undefined\n }\n return {\n logic: \"AND\",\n rules,\n }\n }\n\n return undefined\n}\n\nconst mergeSearchExpressions = (base: unknown, extra: unknown) => {\n const baseGroup = toSearchGroup(base)\n const extraGroup = toSearchGroup(extra)\n\n if (!baseGroup) {\n return extraGroup\n }\n\n if (!extraGroup) {\n return baseGroup\n }\n\n return {\n logic: \"AND\",\n conditions: [baseGroup, extraGroup],\n } satisfies SearchGroup\n}\n\nconst serializeSearchExpression = (value?: SearchExpression | string) => {\n if (value === undefined || value === null || value === \"\") {\n return undefined\n }\n if (typeof value === \"string\") {\n return value\n }\n const group = toSearchGroup(value)\n return group ? JSON.stringify(group) : undefined\n}\n\nconst normalizeAdvancedOrder = (value?: SearchSortItem | SearchSortItem[]) => {\n if (!value) {\n return undefined\n }\n const nextValue = Array.isArray(value) ? value : [value]\n return JSON.stringify(nextValue)\n}\n\nconst normalizeDynamicOrder = (value?: string | SearchSortItem) => {\n if (!value) {\n return undefined\n }\n if (typeof value === \"string\") {\n return value\n }\n return `${value.id}:${value.isAsc === \"n\" ? \"-\" : \"+\"}`\n}\n\nconst hasOwn = (value: object, key: string) =>\n Object.prototype.hasOwnProperty.call(value, key)\n\nconst normalizeEnvelopeCode = (value: unknown): number | string => {\n if (value === undefined || value === null || value === \"\") {\n return 200\n }\n const normalized = Number(value)\n return Number.isFinite(normalized) ? normalized : String(value)\n}\n\nconst isSuccessCode = (value: unknown) => {\n if (value === undefined || value === null || value === \"\") {\n return true\n }\n const normalized = Number(value)\n return Number.isFinite(normalized)\n ? normalized === 0 || (normalized >= 200 && normalized < 300)\n : false\n}\n\nconst getEnvelopeCode = (rawResponse: unknown) => {\n if (isRecord(rawResponse) && hasOwn(rawResponse, \"code\")) {\n return rawResponse.code\n }\n const nestedData = (rawResponse as { data?: unknown })?.data\n if (isRecord(nestedData) && hasOwn(nestedData, \"code\")) {\n return nestedData.code\n }\n return undefined\n}\n\nconst normalizeJsonResponse = <TResult = unknown, TRaw = TResult>(\n rawResponse: unknown,\n): PageApiResponse<TResult, TRaw> => {\n const code = normalizeEnvelopeCode(getEnvelopeCode(rawResponse))\n\n const topLevelResult =\n isRecord(rawResponse) && \"result\" in rawResponse\n ? (rawResponse.result as TResult)\n : undefined\n const nestedResult =\n isRecord((rawResponse as { data?: unknown })?.data) &&\n \"result\" in ((rawResponse as { data?: Record<string, unknown> }).data || {})\n ? ((rawResponse as { data?: Record<string, unknown> }).data\n ?.result as TResult)\n : undefined\n const topLevelData =\n isRecord(rawResponse) && \"data\" in rawResponse\n ? (rawResponse.data as TRaw)\n : undefined\n\n const result =\n topLevelResult !== undefined\n ? topLevelResult\n : nestedResult !== undefined\n ? nestedResult\n : topLevelData !== undefined\n ? (topLevelData as unknown as TResult)\n : isRecord(rawResponse)\n ? (rawResponse as TResult)\n : null\n\n const nestedSuccess =\n typeof (rawResponse as { data?: { success?: boolean } })?.data?.success ===\n \"boolean\"\n ? (rawResponse as { data?: { success?: boolean } }).data?.success\n : undefined\n\n const success =\n (rawResponse as { success?: boolean })?.success === false ||\n nestedSuccess === false\n ? false\n : isSuccessCode(code)\n\n return {\n code,\n success,\n message:\n typeof (rawResponse as { message?: string })?.message === \"string\"\n ? (rawResponse as { message?: string }).message\n : typeof (rawResponse as { data?: { message?: string } })?.data\n ?.message === \"string\"\n ? (rawResponse as { data?: { message?: string } }).data?.message\n : undefined,\n result,\n data:\n topLevelData !== undefined\n ? topLevelData\n : topLevelResult !== undefined\n ? (topLevelResult as unknown as TRaw)\n : undefined,\n raw: rawResponse,\n }\n}\n\nconst createMissingFormInstanceIdError = (response: PageApiResponse<unknown>) => {\n const error = new Error(\n \"保存接口未返回 formInstId/formInstanceId。保存接口只承诺返回实例标识和已生成的流水号;如需完整行数据、公式回填或其他服务端字段,请在保存成功后显式调用 sdk.form.getDetail。\",\n ) as PageSdkError\n error.response = response\n error.raw = response.raw\n return error\n}\n\nconst isRequestTracingEnabled = (\n context: PageContext,\n options: PageRequestOptions,\n) => {\n if (options.trace) return true\n const env = context.env || {}\n const value =\n env.OPENXIANGDA_REQUEST_TRACE ??\n env.openxiangdaRequestTrace ??\n env.requestTrace\n return value === true || value === \"true\" || value === \"1\"\n}\n\nconst buildRequestDedupeKey = (payload: PageTransportRequestPayload) =>\n JSON.stringify({\n path: payload.path,\n method: payload.method,\n query: payload.query || \"\",\n headers: payload.headers || {},\n })\n\nconst normalizeBinaryResponse = (rawResponse: unknown): PageBinaryResponse => {\n if (isRecord(rawResponse) && isBlobLike(rawResponse.blob)) {\n return rawResponse as unknown as PageBinaryResponse\n }\n\n if (isBlobLike(rawResponse)) {\n return {\n blob: rawResponse,\n raw: rawResponse,\n }\n }\n\n const responseData = (rawResponse as { data?: unknown })?.data\n const responseHeaders = isRecord(\n (rawResponse as { headers?: unknown })?.headers,\n )\n ? ((rawResponse as { headers?: Record<string, unknown> }).headers as Record<\n string,\n unknown\n >)\n : undefined\n\n if (!isBlobLike(responseData)) {\n throw new Error(\"transport.download 未返回 Blob 数据\")\n }\n\n const contentDisposition = getHeaderValue(\n responseHeaders,\n \"content-disposition\",\n )\n\n return {\n blob: responseData,\n fileName: parseContentDispositionFileName(contentDisposition),\n contentType:\n getHeaderValue(responseHeaders, \"content-type\") || responseData.type,\n headers: responseHeaders\n ? Object.fromEntries(\n Object.entries(responseHeaders).map(([key, value]) => [\n key,\n value === undefined ? undefined : String(value),\n ]),\n )\n : undefined,\n raw: rawResponse,\n }\n}\n\nconst toSdkError = (\n input: unknown,\n payload: PageTransportRequestPayload | PageTransportDownloadPayload,\n): PageSdkError => {\n if (input instanceof Error && (input as PageSdkError).response) {\n return input as PageSdkError\n }\n\n const normalizedResponse = isRecord(input)\n ? normalizeJsonResponse(input)\n : undefined\n\n const nextError =\n input instanceof Error\n ? input\n : new Error(\n normalizedResponse?.message ||\n `请求失败: ${String(payload.method).toUpperCase()} ${payload.path}`,\n )\n\n const sdkError = nextError as PageSdkError\n sdkError.method = String(payload.method).toUpperCase()\n sdkError.path = payload.path\n sdkError.response = normalizedResponse\n sdkError.raw = input\n return sdkError\n}\n\nconst ensureSuccess = <TResult = unknown, TRaw = TResult>(\n response: PageApiResponse<TResult, TRaw>,\n payload: PageTransportRequestPayload,\n) => {\n if (!response.success) {\n throw toSdkError(response, payload)\n }\n return response\n}\n\nconst resolveFormInstanceId = (params: {\n formInstId?: string\n formInstanceId?: string\n instanceId?: string\n}) => {\n const formInstanceId = String(\n params.formInstId || params.formInstanceId || params.instanceId || \"\",\n ).trim()\n if (!formInstanceId) {\n throw new Error(\"formInstanceId 不能为空\")\n }\n return formInstanceId\n}\n\nconst pickCreatedFormInstanceId = (value: unknown): string | undefined => {\n if (!value) return undefined\n if (typeof value === \"string\") {\n const text = value.trim()\n return text || undefined\n }\n if (!isRecord(value)) return undefined\n\n const direct =\n value.formInstId ||\n value.formInstanceId ||\n value.instanceId ||\n value.id\n if (direct !== value && direct !== undefined && direct !== null) {\n const picked = pickCreatedFormInstanceId(direct)\n if (picked) return picked\n }\n for (const candidate of [value.result, value.data, value.raw]) {\n const picked = pickCreatedFormInstanceId(candidate)\n if (picked) return picked\n }\n return undefined\n}\n\nconst pickCreatedProcessInstanceId = (value: unknown): string | undefined => {\n if (!value || typeof value === \"string\") return undefined\n if (!isRecord(value)) return undefined\n const direct = value.processInstanceId || value.processInstId\n if (typeof direct === \"string\" && direct.trim()) return direct.trim()\n for (const candidate of [value.result, value.data, value.raw]) {\n const picked = pickCreatedProcessInstanceId(candidate)\n if (picked) return picked\n }\n return undefined\n}\n\nconst pickSerialNumbers = (value: unknown): Record<string, string> | undefined => {\n if (!value || typeof value === \"string\" || !isRecord(value)) return undefined\n const direct = value.serialNumbers\n if (isRecord(direct)) {\n const entries = Object.entries(direct)\n .map(([key, item]) => [key, String(item ?? \"\").trim()] as const)\n .filter(([, item]) => Boolean(item))\n if (entries.length > 0) return Object.fromEntries(entries)\n }\n for (const candidate of [value.result, value.data, value.raw]) {\n const picked = pickSerialNumbers(candidate)\n if (picked) return picked\n }\n return undefined\n}\n\nconst pickSerialNumber = (value: unknown): string | undefined => {\n if (!value || typeof value === \"string\") return undefined\n if (!isRecord(value)) return undefined\n const direct = value.serialNumber || value.serialNo || value.sequenceNo\n if (typeof direct === \"string\" && direct.trim()) return direct.trim()\n const serialNumbers = pickSerialNumbers(value)\n if (serialNumbers) {\n const first = Object.values(serialNumbers)[0]\n if (first) return first\n }\n for (const candidate of [value.result, value.data, value.raw]) {\n const picked = pickSerialNumber(candidate)\n if (picked) return picked\n }\n return undefined\n}\n\nconst normalizeFormCreateResponse = <\n TResult = FormCreateResult,\n TRaw = unknown,\n>(\n response: PageApiResponse<TResult, TRaw>,\n formInstanceId: string,\n): PageApiResponse<TResult, TRaw> => {\n const processInstanceId = pickCreatedProcessInstanceId(response)\n const serialNumbers = pickSerialNumbers(response)\n const serialNumber = pickSerialNumber(response)\n const sourceResult: Record<string, unknown> = isRecord(response.result)\n ? response.result\n : {}\n const normalizedResult = {\n ...sourceResult,\n formInstId: formInstanceId,\n formInstanceId,\n result:\n typeof response.result === \"string\" && response.result.trim()\n ? response.result.trim()\n : (sourceResult.result as unknown) || formInstanceId,\n ...(processInstanceId ? { processInstanceId } : {}),\n ...(serialNumber ? { serialNumber } : {}),\n ...(serialNumbers ? { serialNumbers } : {}),\n } as TResult\n\n const normalizedData = isRecord(response.data)\n ? ({\n ...response.data,\n formInstId:\n (response.data as Record<string, unknown>).formInstId || formInstanceId,\n formInstanceId:\n (response.data as Record<string, unknown>).formInstanceId ||\n formInstanceId,\n ...(processInstanceId ? { processInstanceId } : {}),\n ...(serialNumber ? { serialNumber } : {}),\n ...(serialNumbers ? { serialNumbers } : {}),\n } as TRaw)\n : response.data\n\n return {\n ...(response as PageApiResponse<TResult, TRaw> & {\n formInstId?: string\n formInstanceId?: string\n processInstanceId?: string\n serialNumber?: string\n serialNumbers?: Record<string, string>\n }),\n formInstId: formInstanceId,\n formInstanceId,\n ...(processInstanceId ? { processInstanceId } : {}),\n ...(serialNumber ? { serialNumber } : {}),\n ...(serialNumbers ? { serialNumbers } : {}),\n result: normalizedResult,\n data: normalizedData,\n }\n}\n\nconst isStableCreateLookupValue = (value: unknown) => {\n if (value === undefined || value === null || value === \"\") return false\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n )\n}\n\nconst buildCreateLookupFilters = (\n data: Record<string, unknown>,\n lookupFields?: string[],\n): SearchGroup | undefined => {\n const sourceFields = lookupFields?.length\n ? lookupFields\n : Object.keys(data).filter((key) => isStableCreateLookupValue(data[key]))\n const rules = sourceFields\n .filter((key) => isStableCreateLookupValue(data[key]))\n .slice(0, 6)\n .map(\n (key): SearchRule => ({\n key,\n operator: \"EQ\",\n value: data[key],\n }),\n )\n return rules.length > 0 ? { logic: \"AND\", rules } : undefined\n}\n\nconst firstListItem = (value: unknown): Record<string, unknown> | undefined => {\n if (!value) return undefined\n if (Array.isArray(value)) {\n return isRecord(value[0]) ? value[0] : undefined\n }\n if (!isRecord(value)) return undefined\n const candidates = [\n value.data,\n value.list,\n value.items,\n value.records,\n value.result,\n ]\n for (const candidate of candidates) {\n const item = firstListItem(candidate)\n if (item) return item\n }\n return undefined\n}\n\nconst attachFormInstanceId = <TResult = unknown, TRaw = TResult>(\n response: PageApiResponse<TResult, TRaw>,\n formInstanceId: string,\n): PageApiResponse<TResult, TRaw> => {\n const withIds = (value: unknown) =>\n isRecord(value)\n ? ({\n ...value,\n formInstId: value.formInstId || formInstanceId,\n formInstanceId: value.formInstanceId || formInstanceId,\n } as unknown)\n : value\n\n return {\n ...(response as PageApiResponse<TResult, TRaw> & {\n formInstId?: string\n formInstanceId?: string\n }),\n formInstId: formInstanceId,\n formInstanceId,\n result:\n response.result === null || response.result === undefined\n ? (formInstanceId as unknown as TResult)\n : (withIds(response.result) as TResult),\n data:\n response.data === undefined\n ? response.data\n : (withIds(response.data) as TRaw),\n }\n}\n\nconst withDefaultAppType = <\n T extends {\n appType?: string\n scope?: string\n },\n>(\n context: PageContext,\n params: T | undefined,\n) => {\n if (!params) {\n return params\n }\n\n if (params.appType) {\n return params\n }\n\n if (params.scope === \"app\") {\n return {\n ...params,\n appType: context.app.appType,\n }\n }\n\n return params\n}\n\nconst AUTH_LOGIN_URL_ENV_KEYS = [\n \"loginUrl\",\n \"authLoginUrl\",\n \"bathAuthUrl\",\n \"REACT_APP_VITE_BATH_AUTH_URL\",\n \"VITE_BATH_AUTH_URL\",\n \"BATH_AUTH_URL\",\n]\n\nconst DEFAULT_PLATFORM_LOGIN_URL = \"/platform/login\"\n\nconst normalizeOptionalString = (value: unknown) => {\n const text = typeof value === \"string\" ? value.trim() : \"\"\n return text || undefined\n}\n\nconst getCurrentHref = () => {\n if (typeof window === \"undefined\") {\n return \"\"\n }\n return window.location?.href || \"\"\n}\n\nconst resolveAuthLoginUrl = (\n context: PageContext,\n options: AuthLogoutRedirectOptions,\n) => {\n const explicitLoginUrl = normalizeOptionalString(options.loginUrl)\n if (explicitLoginUrl) {\n return explicitLoginUrl\n }\n\n for (const key of AUTH_LOGIN_URL_ENV_KEYS) {\n const loginUrl = normalizeOptionalString(context.env?.[key])\n if (loginUrl) {\n return loginUrl\n }\n }\n\n return undefined\n}\n\nconst buildAuthRedirectUrl = (\n loginUrl: string,\n callbackUrl: string | undefined,\n callbackParamName: string | undefined,\n) => {\n const paramName = normalizeOptionalString(callbackParamName) || \"callback\"\n const normalizedCallbackUrl = normalizeOptionalString(callbackUrl)\n\n if (!normalizedCallbackUrl) {\n return loginUrl\n }\n\n const baseHref = getCurrentHref() || \"http://localhost/\"\n const isAbsoluteUrl = /^[a-z][a-z\\d+.-]*:/i.test(loginUrl)\n const isProtocolRelativeUrl = loginUrl.startsWith(\"//\")\n const isRootRelativeUrl = loginUrl.startsWith(\"/\")\n\n try {\n const url = new URL(loginUrl, baseHref)\n url.searchParams.set(paramName, normalizedCallbackUrl)\n\n if (isAbsoluteUrl || isProtocolRelativeUrl) {\n return url.toString()\n }\n\n const path = `${url.pathname}${url.search}${url.hash}`\n return isRootRelativeUrl ? path : path.replace(/^\\//, \"\")\n } catch {\n const hashIndex = loginUrl.indexOf(\"#\")\n const pathAndQuery =\n hashIndex >= 0 ? loginUrl.slice(0, hashIndex) : loginUrl\n const hash = hashIndex >= 0 ? loginUrl.slice(hashIndex) : \"\"\n const separator = pathAndQuery.includes(\"?\") ? \"&\" : \"?\"\n\n return `${pathAndQuery}${separator}${encodeURIComponent(\n paramName,\n )}=${encodeURIComponent(normalizedCallbackUrl)}${hash}`\n }\n}\n\nconst performRedirect = (\n url: string,\n options: AuthLogoutRedirectOptions,\n) => {\n if (options.redirect) {\n options.redirect(url)\n return\n }\n\n if (typeof window === \"undefined\" || !window.location) {\n return\n }\n\n if (options.replace && typeof window.location.replace === \"function\") {\n window.location.replace(url)\n return\n }\n\n window.location.href = url\n}\n\nconst reloadCurrentPage = () => {\n if (\n typeof window === \"undefined\" ||\n !window.location ||\n typeof window.location.reload !== \"function\"\n ) {\n return\n }\n\n window.location.reload()\n}\n\nconst redirectAfterLogout = (\n context: PageContext,\n options: AuthLogoutRedirectOptions,\n) => {\n const loginUrl = resolveAuthLoginUrl(context, options)\n const callbackUrl = normalizeOptionalString(options.callbackUrl) || getCurrentHref()\n\n if (loginUrl) {\n performRedirect(\n buildAuthRedirectUrl(loginUrl, callbackUrl, options.callbackParamName),\n options,\n )\n return\n }\n\n if (options.fallback === \"none\") {\n return\n }\n\n if (options.fallback === \"reload\") {\n reloadCurrentPage()\n return\n }\n\n const redirectLoginUrl = DEFAULT_PLATFORM_LOGIN_URL\n performRedirect(\n buildAuthRedirectUrl(redirectLoginUrl, callbackUrl, options.callbackParamName),\n options,\n )\n}\n\nexport const createPageSdk = (context: PageContext): PageSdk => {\n const inFlightGetRequests = new Map<\n string,\n Promise<PageApiResponse<unknown, unknown>>\n >()\n const recentRequestStats = new Map<string, { count: number; lastAt: number }>()\n\n const request = async <TResult = unknown, TRaw = TResult>(\n options: PageRequestOptions,\n ) => {\n const payload: PageTransportRequestPayload = {\n path: options.path,\n method: normalizeMethod(options.method),\n query: serializeQuery(options.query),\n body: options.body,\n headers: options.headers,\n }\n const traceEnabled = isRequestTracingEnabled(context, options)\n const traceLabel = options.traceLabel || `${payload.method.toUpperCase()} ${payload.path}`\n const dedupeKey =\n options.dedupe !== false && payload.method === \"get\"\n ? buildRequestDedupeKey(payload)\n : undefined\n\n if (traceEnabled && dedupeKey) {\n const currentAt = nowMs()\n const previous = recentRequestStats.get(dedupeKey)\n const nextCount =\n previous && currentAt - previous.lastAt < 500 ? previous.count + 1 : 1\n recentRequestStats.set(dedupeKey, { count: nextCount, lastAt: currentAt })\n if (nextCount > 1) {\n console.warn(\n `[OpenXiangda SDK] repeated request within 500ms (${nextCount}): ${traceLabel}`,\n )\n }\n }\n\n if (dedupeKey && inFlightGetRequests.has(dedupeKey)) {\n if (traceEnabled) {\n console.debug(`[OpenXiangda SDK] deduped in-flight request: ${traceLabel}`)\n }\n return inFlightGetRequests.get(dedupeKey) as Promise<\n PageApiResponse<TResult, TRaw>\n >\n }\n\n const task = (async () => {\n const startedAt = nowMs()\n const rawResponse = await context.bridge.invoke<unknown>(\n \"transport.request\",\n payload,\n )\n const normalized = ensureSuccess(\n normalizeJsonResponse<TResult, TRaw>(rawResponse),\n payload,\n )\n if (traceEnabled) {\n console.debug(\n `[OpenXiangda SDK] ${traceLabel} ${Math.round(nowMs() - startedAt)}ms`,\n )\n }\n return normalized\n })()\n\n if (dedupeKey) {\n inFlightGetRequests.set(dedupeKey, task as Promise<PageApiResponse<unknown, unknown>>)\n }\n\n try {\n return await task\n } catch (error) {\n throw toSdkError(error, payload)\n } finally {\n if (dedupeKey && inFlightGetRequests.get(dedupeKey) === task) {\n inFlightGetRequests.delete(dedupeKey)\n }\n }\n }\n\n const download = async (options: PageRequestOptions) => {\n const payload: PageTransportDownloadPayload = {\n path: options.path,\n method: normalizeMethod(options.method),\n query: serializeQuery(options.query),\n body: options.body,\n headers: options.headers,\n }\n\n try {\n const rawResponse = await context.bridge.invoke<unknown>(\n \"transport.download\",\n payload,\n )\n return normalizeBinaryResponse(rawResponse)\n } catch (error) {\n throw toSdkError(error, payload)\n }\n }\n\n const createFileAccessTicket: PageSdk[\"createFileAccessTicket\"] = (\n bucketName,\n objectName,\n fileName,\n action = \"preview\",\n options = {},\n ) =>\n request<FileAccessTicketResult>({\n path: \"/file/access-ticket\",\n method: \"post\",\n body: {\n bucketName,\n objectName,\n fileName,\n action,\n appType: resolveAppType(context, options.appType),\n },\n })\n\n const logout = <T = boolean>() =>\n request<T>({\n path: \"/api/auth/logout\",\n method: \"post\",\n })\n\n const auth = {\n logout,\n logoutAndRedirect: async <T = boolean>(\n options: AuthLogoutRedirectOptions = {},\n ) => {\n try {\n const response = await logout<T>()\n redirectAfterLogout(context, options)\n return response\n } catch (error) {\n if (options.continueOnLogoutError === false) {\n throw error\n }\n redirectAfterLogout(context, options)\n return null\n }\n },\n }\n\n const connector = {\n invoke: <TResult = unknown, TBody = unknown>(\n params: ConnectorInvokeParams<TBody>,\n ) =>\n request<ConnectorInvokeResult<TResult>>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/connectors/actions/invoke\",\n ),\n method: \"post\",\n body: {\n connector: params.connector,\n api: params.api,\n pathParams: params.pathParams,\n query: params.query,\n body: params.body,\n headers: params.headers,\n requestBodyType: params.requestBodyType,\n responseType: params.responseType,\n },\n }),\n call: <TResult = unknown, TBody = unknown>(\n name: string,\n params: ConnectorCallParams<TBody> = {},\n ) => {\n const target = parseConnectorCallName(name)\n return connector.invoke<TResult, TBody>({\n ...params,\n connector: target.connector,\n api: target.api,\n })\n },\n download: <TBody = unknown>(\n params: ConnectorInvokeParams<TBody>,\n ): Promise<PageBinaryResponse> =>\n download({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/connectors/actions/download\",\n ),\n method: \"post\",\n body: {\n connector: params.connector,\n api: params.api,\n pathParams: params.pathParams,\n query: params.query,\n body: params.body,\n headers: params.headers,\n requestBodyType: params.requestBodyType,\n responseType: \"binary\",\n },\n }),\n }\n\n const form = {\n getDetail: <T = unknown>(params: FormGetDetailParams) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/getFormDataById.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n formInstId: resolveFormInstanceId(params),\n },\n }),\n create: async <T = FormCreateResult, TRaw = unknown>(\n params: FormCreateParams,\n ) => {\n const response = await request<T, TRaw>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/saveFormData.json\",\n ),\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n formDataJson: JSON.stringify(params.data || {}),\n saveAsDraft: params.saveAsDraft,\n draft: params.draft,\n startProcess: params.startProcess,\n autoStartProcess: params.autoStartProcess,\n processStartMode: params.processStartMode,\n },\n })\n const directId = pickCreatedFormInstanceId(response)\n if (directId) {\n return normalizeFormCreateResponse(response, directId)\n }\n if (!params.lookupAfterCreate) {\n throw createMissingFormInstanceIdError(response)\n }\n const filters = buildCreateLookupFilters(params.data || {}, params.lookupFields)\n if (!filters) {\n if (params.lookupAfterCreate === \"legacy\") return response\n throw createMissingFormInstanceIdError(response)\n }\n const lookupResponse = await request<PageListResult<Record<string, unknown>>>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/advancedSearch.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n filters: serializeSearchExpression(filters),\n currentPage: 1,\n pageSize: 1,\n order: normalizeAdvancedOrder([{ id: \"createTime\", isAsc: \"n\" }]),\n },\n })\n const lookupId = pickCreatedFormInstanceId(firstListItem(lookupResponse))\n if (lookupId) return normalizeFormCreateResponse(response, lookupId)\n if (params.lookupAfterCreate === \"legacy\") return response\n throw createMissingFormInstanceIdError(response)\n },\n update: <T = unknown, TRaw = unknown>(params: FormUpdateParams) =>\n request<T, TRaw>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/updateFormData.json\",\n ),\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n formInstId: resolveFormInstanceId(params),\n updateFormDataJson:\n params.updateFormDataJson || JSON.stringify(params.data || {}),\n },\n }),\n remove: <T = unknown, TRaw = unknown>(params: FormRemoveParams) =>\n request<T, TRaw>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/deleteFormData.json\",\n ),\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n formInstId: resolveFormInstanceId(params),\n },\n }),\n getChangeRecords: <T = unknown>(params: FormChangeRecordParams) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/getFormDataChangeRecords.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n formInstId: resolveFormInstanceId(params),\n page: params.page,\n pageSize: params.pageSize,\n },\n }),\n search: <T = unknown>(params: FormSearchParams) =>\n request<PageListResult<T>>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/searchFormDatas.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n searchFieldJson: serializeSearchExpression(params.search),\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n originatorId: params.originatorId,\n createFrom: params.createFrom,\n createTo: params.createTo,\n modifiedFrom: params.modifiedFrom,\n modifiedTo: params.modifiedTo,\n dynamicOrder: normalizeDynamicOrder(params.dynamicOrder),\n instanceStatus: params.instanceStatus,\n },\n }),\n searchIds: <T = string>(params: FormSearchParams) =>\n request<PageListResult<T>>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/searchFormDataIds.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n searchFieldJson: serializeSearchExpression(params.search),\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n originatorId: params.originatorId,\n createFrom: params.createFrom,\n createTo: params.createTo,\n modifiedFrom: params.modifiedFrom,\n modifiedTo: params.modifiedTo,\n dynamicOrder: normalizeDynamicOrder(params.dynamicOrder),\n instanceStatus: params.instanceStatus,\n },\n }),\n advancedSearch: <T = unknown>(params: FormAdvancedSearchParams) =>\n request<PageListResult<T>>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/advancedSearch.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n filters: serializeSearchExpression(params.filters),\n conditionType: params.conditionType,\n searchKeyWord: params.searchKeyWord,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n order: normalizeAdvancedOrder(params.order),\n instanceStatus: params.instanceStatus,\n },\n }),\n advancedExport: (params: FormExportParams) =>\n download({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/advancedExport.xlsx\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n filters: serializeSearchExpression(params.filters),\n conditionType: params.conditionType,\n searchKeyWord: params.searchKeyWord,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n order: normalizeAdvancedOrder(params.order),\n instanceStatus: params.instanceStatus,\n exportAll: params.exportAll,\n embedImages: params.embedImages,\n exportFields: params.exportFields?.join(\",\"),\n },\n }),\n downloadImportTemplate: (params: DataManagementConfigParams) =>\n download({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/advancedExportTemplate.xlsx\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n },\n }),\n importPreview: <T = unknown>(params: FormImportParams) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/importPreview.xlsx\",\n ),\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n fileBase64: params.fileBase64,\n fileName: params.fileName,\n },\n }),\n importExcel: <T = unknown>(params: FormImportParams) =>\n request<T>({\n path: buildAppPath(context, params.appType, \"/v1/form/import.xlsx\"),\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n fileBase64: params.fileBase64,\n fileName: params.fileName,\n },\n }),\n getImportRecords: <T = unknown>(params: ImportExportRecordQuery) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/importRecords.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n },\n }),\n getExportRecords: <T = unknown>(params: ImportExportRecordQuery) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/exportRecords.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n },\n }),\n downloadImportSource: (params: ImportExportRecordDownloadParams) =>\n download({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/importRecord/downloadSource.xlsx\",\n ),\n method: \"get\",\n query: {\n recordId: params.recordId,\n },\n }),\n downloadImportFailed: (params: ImportExportRecordDownloadParams) =>\n download({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/importRecord/downloadFailed.xlsx\",\n ),\n method: \"get\",\n query: {\n recordId: params.recordId,\n },\n }),\n downloadExportRecord: (params: ImportExportRecordDownloadParams) =>\n download({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/exportRecord/download.xlsx\",\n ),\n method: \"get\",\n query: {\n recordId: params.recordId,\n },\n }),\n getDataManagementConfig: <T = unknown>(\n params: DataManagementConfigParams,\n ) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/dataManagement/config/get.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n },\n }),\n saveDataManagementConfig: <T = unknown>(\n params: SaveDataManagementConfigParams,\n ) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/dataManagement/config/save.json\",\n ),\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n config: params.config,\n },\n }),\n }\n\n const user = {\n create: <T = unknown>(params: CreateUserParams) =>\n request<T>({\n path: \"/user/create\",\n method: \"post\",\n body: params,\n }),\n update: <T = unknown>(params: UpdateUserParams) =>\n request<T>({\n path: \"/user/update\",\n method: \"post\",\n body: params,\n }),\n remove: <T = boolean>(id: string) =>\n request<T>({\n path: withPostDeleteAction(`/user/${encodePathSegment(id)}`),\n method: \"post\",\n }),\n get: <T = unknown>(id = \"current\") =>\n request<T>({\n path: `/user/${encodePathSegment(id)}`,\n method: \"get\",\n }),\n getCurrent: <T = unknown>() =>\n request<T>({\n path: \"/user/current\",\n method: \"get\",\n }),\n getByUsername: <T = unknown>(username: string) =>\n request<T>({\n path: `/user/username/${encodePathSegment(username)}`,\n method: \"get\",\n }),\n list: <T = unknown>(params?: UserListParams) =>\n request<T>({\n path: \"/user/list\",\n method: \"get\",\n query: {\n ids: serializeCommaList(params?.ids),\n departmentIds: serializeCommaList(params?.departmentIds),\n keyword: params?.keyword,\n name: params?.name,\n username: params?.username,\n phone: params?.phone,\n email: params?.email,\n jobNumber: params?.jobNumber,\n page: params?.page,\n pageSize: params?.pageSize,\n },\n }),\n search: <T = unknown>(keyword?: string) =>\n request<T>({\n path: \"/user/search\",\n method: \"get\",\n query: {\n keyword,\n },\n }),\n listAll: <T = unknown>() =>\n request<T>({\n path: \"/user/all\",\n method: \"get\",\n }),\n listByDepartment: <T = unknown>(departmentId: string) =>\n request<T>({\n path: `/user/department/${encodePathSegment(departmentId)}`,\n method: \"get\",\n }),\n validate: <T = unknown>(params: ValidateUserParams) =>\n request<T>({\n path: \"/user/validate\",\n method: \"post\",\n body: params,\n }),\n }\n\n const getParentDepartments = <T = PageDepartmentRecord[]>(\n departmentId: string,\n options: GetParentDepartmentsOptions = {},\n ) =>\n request<T>({\n path: `/department/${encodePathSegment(departmentId)}/parentDepartments`,\n method: \"get\",\n query: {\n includeSelf: options.includeSelf ?? true,\n },\n })\n\n const department = {\n getParentDepartments,\n getCurrentUserParentDepartments: async (\n options: GetParentDepartmentsOptions = {},\n ): Promise<CurrentUserDepartmentParents[]> => {\n const departments = (context.user.departments || []).filter(\n (item) => typeof item.id === \"string\" && item.id.trim(),\n )\n\n return Promise.all(\n departments.map(async (item) => {\n const response = await getParentDepartments(item.id || \"\", {\n includeSelf: options.includeSelf,\n })\n return {\n department: item,\n parents: response.result || [],\n }\n }),\n )\n },\n }\n\n const organization = {\n capabilities: <T = unknown>(params: { appType?: string } = {}) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/organization/capabilities\",\n ),\n method: \"get\",\n }),\n departments: {\n list: <T = PageDepartmentRecord[]>(params: { appType?: string } = {}) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/organization/departments\",\n ),\n method: \"get\",\n }),\n get: <T = PageDepartmentRecord>(\n departmentId: string,\n params: { appType?: string } = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/organization/departments/${encodePathSegment(departmentId)}`,\n ),\n method: \"get\",\n }),\n create: <T = PageDepartmentRecord>(\n params: CreateOrganizationDepartmentParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/organization/departments\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n update: <T = PageDepartmentRecord>(\n departmentId: string,\n params: UpdateOrganizationDepartmentParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/organization/departments/${encodePathSegment(departmentId)}`,\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n },\n accounts: {\n list: <T = unknown>(params: OrganizationAccountListParams = {}) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/organization/accounts\",\n ),\n method: \"get\",\n query: {\n ids: serializeCommaList(params.ids),\n departmentIds: serializeCommaList(params.departmentIds),\n keyword: params.keyword,\n name: params.name,\n username: params.username,\n phone: params.phone,\n email: params.email,\n jobNumber: params.jobNumber,\n page: params.page,\n pageSize: params.pageSize,\n },\n }),\n get: <T = PageUserRecord>(\n userId: string,\n params: { appType?: string } = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/organization/accounts/${encodePathSegment(userId)}`,\n ),\n method: \"get\",\n }),\n create: <T = PageUserRecord>(params: CreateOrganizationAccountParams) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/organization/accounts\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n update: <T = PageUserRecord>(\n userId: string,\n params: UpdateOrganizationAccountParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/organization/accounts/${encodePathSegment(userId)}`,\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n resetPassword: <T = PageUserRecord>(\n userId: string,\n params: ResetOrganizationAccountPasswordParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/organization/accounts/${encodePathSegment(userId)}/password/reset`,\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n changeMyPassword: <T = PageUserRecord>(\n params: ChangeOrganizationAccountPasswordParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/organization/accounts/me/password/change\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n },\n }\n\n const role = {\n create: <T = unknown>(params: CreateRoleParams) =>\n request<T>({\n path: \"/role/\",\n method: \"post\",\n body: params,\n }),\n update: <T = unknown>(id: string, params: UpdateRoleParams) =>\n request<T>({\n path: `/role/${encodePathSegment(id)}/update`,\n method: \"post\",\n body: params,\n }),\n remove: <T = boolean>(id: string) =>\n request<T>({\n path: withPostDeleteAction(`/role/${encodePathSegment(id)}`),\n method: \"post\",\n }),\n get: <T = unknown>(id: string) =>\n request<T>({\n path: `/role/${encodePathSegment(id)}`,\n method: \"get\",\n }),\n list: <T = unknown>(params?: RoleListParams) =>\n request<T>({\n path: \"/role/\",\n method: \"get\",\n query: withDefaultAppType(context, params) as\n | Record<string, unknown>\n | undefined,\n }),\n listUsers: <T = unknown>(roleId: string, params?: RoleUsersParams) =>\n request<T>({\n path: `/role/${encodePathSegment(roleId)}/users`,\n method: \"get\",\n query: params as Record<string, unknown> | undefined,\n }),\n assignRoles: <T = unknown>(params: AssignRolesParams) =>\n request<T>({\n path: \"/role/assign\",\n method: \"post\",\n body: params,\n }),\n addUserRole: <T = boolean>(params: { userId: string; roleId: string }) =>\n request<T>({\n path: \"/role/add\",\n method: \"post\",\n body: params,\n }),\n removeUserRole: <T = boolean>(params: { userId: string; roleId: string }) =>\n request<T>({\n path: \"/role/remove\",\n method: \"post\",\n body: params,\n }),\n batchAddUsers: <T = unknown>(params: BatchAddUsersToRoleParams) =>\n request<T>({\n path: \"/role/batch-add-users\",\n method: \"post\",\n body: params,\n }),\n getMyRoles: <T = unknown>(params?: GetUserRolesParams) =>\n request<T>({\n path: \"/role/my/roles\",\n method: \"get\",\n query: withDefaultAppType(context, params) as\n | Record<string, unknown>\n | undefined,\n }),\n getCurrentRole: <T = unknown>(params?: GetUserRolesParams) =>\n request<T>({\n path: \"/role/my/current\",\n method: \"get\",\n query: withDefaultAppType(context, params) as\n | Record<string, unknown>\n | undefined,\n }),\n switchPlatformRole: <T = boolean>(params: SwitchPlatformRoleParams) =>\n request<T>({\n path: \"/role/switch/platform\",\n method: \"post\",\n body: params,\n }),\n switchAppRole: <T = boolean>(params: SwitchAppRoleParams) =>\n request<T>({\n path: \"/role/switch/app\",\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n }\n\n const permission = {\n formGroup: {\n create: <T = FormPermissionGroup>(params: CreateFormPermissionGroupDto) =>\n request<T>({\n path: \"/permission/form-group/\",\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n update: <T = FormPermissionGroup>(\n id: string,\n params: UpdateFormPermissionGroupDto,\n ) =>\n request<T>({\n path: `/permission/form-group/${encodePathSegment(id)}`,\n method: \"post\",\n body: {\n ...params,\n ...(params.appType\n ? { appType: resolveAppType(context, params.appType) }\n : {}),\n },\n }),\n remove: <T = boolean>(id: string) =>\n request<T>({\n path: withPostDeleteAction(\n `/permission/form-group/${encodePathSegment(id)}`,\n ),\n method: \"post\",\n }),\n get: <T = FormPermissionGroup | null>(id: string) =>\n request<T>({\n path: `/permission/form-group/${encodePathSegment(id)}`,\n method: \"get\",\n }),\n list: <T = PageOffsetListResult<FormPermissionGroup>>(\n params?: QueryFormPermissionGroupDto,\n ) =>\n request<T>({\n path: \"/permission/form-group/\",\n method: \"get\",\n query: {\n ...params,\n appType: resolveAppType(context, params?.appType),\n },\n }),\n getViewFieldPermissions: <\n T = Record<string, ViewFieldPermissionValue>,\n >(params: {\n appType?: string\n formUuid: string\n }) =>\n request<T>({\n path: \"/permission/form-group/field-permissions\",\n method: \"get\",\n query: {\n appType: resolveAppType(context, params.appType),\n formUuid: params.formUuid,\n },\n }),\n getViewPermissionSummary: <T = ViewPermissionSummary>(params: {\n appType?: string\n formUuid: string\n }) =>\n request<T>({\n path: \"/permission/form-group/view-permissions\",\n method: \"get\",\n query: {\n appType: resolveAppType(context, params.appType),\n formUuid: params.formUuid,\n },\n }),\n },\n pageGroup: {\n create: <T = PagePermissionGroup>(params: CreatePagePermissionGroupDto) =>\n request<T>({\n path: \"/permission/page-group/\",\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n update: <T = PagePermissionGroup>(\n id: string,\n params: UpdatePagePermissionGroupDto,\n ) =>\n request<T>({\n path: `/permission/page-group/${encodePathSegment(id)}`,\n method: \"post\",\n body: {\n ...params,\n ...(params.appType\n ? { appType: resolveAppType(context, params.appType) }\n : {}),\n },\n }),\n remove: <T = boolean>(id: string) =>\n request<T>({\n path: withPostDeleteAction(\n `/permission/page-group/${encodePathSegment(id)}`,\n ),\n method: \"post\",\n }),\n get: <T = PagePermissionGroup | null>(id: string) =>\n request<T>({\n path: `/permission/page-group/${encodePathSegment(id)}`,\n method: \"get\",\n }),\n list: <T = PageOffsetListResult<PagePermissionGroup>>(\n params?: QueryPagePermissionGroupDto,\n ) =>\n request<T>({\n path: \"/permission/page-group/\",\n method: \"get\",\n query: {\n ...params,\n appType: resolveAppType(context, params?.appType),\n },\n }),\n getUserMenuPermissions: <T = UserMenuPermissionsResponse>(\n appType?: string,\n ) =>\n request<T>({\n path: \"/permission/page-group/user-menu-permissions\",\n method: \"get\",\n query: {\n appType: resolveAppType(context, appType),\n },\n }),\n },\n api: {\n create: <T = unknown>(params: CreateApiPermissionParams) =>\n request<T>({\n path: \"/permission/api\",\n method: \"post\",\n body: params,\n }),\n update: <T = unknown>(id: string, params: UpdateApiPermissionParams) =>\n request<T>({\n path: `/permission/api/${encodePathSegment(id)}/update`,\n method: \"post\",\n body: params,\n }),\n remove: <T = boolean>(id: string) =>\n request<T>({\n path: withPostDeleteAction(`/permission/api/${encodePathSegment(id)}`),\n method: \"post\",\n }),\n list: <T = unknown>(params?: ApiPermissionListParams) =>\n request<T>({\n path: \"/permission/api\",\n method: \"get\",\n query: withDefaultAppType(context, params) as\n | Record<string, unknown>\n | undefined,\n }),\n assign: <T = boolean>(params: AssignPermissionsParams) =>\n request<T>({\n path: \"/permission/api/assign\",\n method: \"post\",\n body: params,\n }),\n getByRole: <T = unknown>(roleId: string) =>\n request<T>({\n path: `/permission/api/role/${encodePathSegment(roleId)}`,\n method: \"get\",\n }),\n getRolesByPermission: <T = unknown>(permissionId: string) =>\n request<T>({\n path: `/permission/api/${encodePathSegment(permissionId)}/roles`,\n method: \"get\",\n }),\n },\n ui: {\n create: <T = unknown>(params: CreateUiPermissionParams) =>\n request<T>({\n path: \"/permission/api/ui\",\n method: \"post\",\n body: params,\n }),\n update: <T = unknown>(id: string, params: UpdateUiPermissionParams) =>\n request<T>({\n path: `/permission/api/ui/${encodePathSegment(id)}/update`,\n method: \"post\",\n body: params,\n }),\n remove: <T = boolean>(id: string) =>\n request<T>({\n path: withPostDeleteAction(\n `/permission/api/ui/${encodePathSegment(id)}`,\n ),\n method: \"post\",\n }),\n list: <T = unknown>(params?: UiPermissionListParams) =>\n request<T>({\n path: \"/permission/api/ui\",\n method: \"get\",\n query: withDefaultAppType(context, params) as\n | Record<string, unknown>\n | undefined,\n }),\n assign: <T = boolean>(params: AssignPermissionsParams) =>\n request<T>({\n path: \"/permission/api/ui/assign\",\n method: \"post\",\n body: params,\n }),\n getMyPlatform: <T = unknown>() =>\n request<T>({\n path: \"/permission/api/ui/me/platform\",\n method: \"get\",\n }),\n getMyApp: <T = unknown>(appType?: string) =>\n request<T>({\n path: \"/permission/api/ui/me/app\",\n method: \"get\",\n query: {\n appType: resolveAppType(context, appType),\n },\n }),\n },\n }\n\n const process = {\n getInstance: <T = unknown>(params: GetProcessInstanceParams) =>\n request<T>({\n path: buildAppPath(context, params.appType, \"/v1/process/instance\"),\n method: \"get\",\n query: {\n instanceId: params.instanceId,\n },\n }),\n terminateInstance: <T = unknown>(params: TerminateProcessInstanceParams) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/process/terminateInstance.json\",\n ),\n method: \"post\",\n body: {\n processInstanceId: params.processInstanceId,\n reason: params.reason,\n },\n }),\n approveTask: <T = unknown>(params: ApproveTaskParams) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/process/approveTask.json\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n triggerCallbackTask: <T = unknown>(params: TriggerCallbackTaskParams) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/process/triggerCallback.json\",\n ),\n method: \"post\",\n body: {\n taskId: params.taskId,\n payload: params.payload,\n },\n }),\n getBasic: <T = unknown>(params: ProcessInstanceLookupParams) =>\n request<T>({\n path: `/workflow/instance/${encodePathSegment(\n resolveFormInstanceId(params),\n )}/basic`,\n method: \"get\",\n }),\n getProgress: <T = unknown>(params: ProcessInstanceLookupParams) =>\n request<T>({\n path: `/workflow/instance/${encodePathSegment(\n resolveFormInstanceId(params),\n )}/all-tasks`,\n method: \"get\",\n }),\n getPermission: <T = unknown>(params: ProcessInstanceLookupParams) =>\n request<T>({\n path: `/workflow/instance/${encodePathSegment(\n resolveFormInstanceId(params),\n )}/permission`,\n method: \"get\",\n }),\n resolveCapabilities: <T = unknown>(\n params: ResolveProcessCapabilitiesParams,\n ) =>\n request<T>({\n path: \"/workflow/capabilities/resolve\",\n method: \"post\",\n body: {\n ...params,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n },\n }),\n startFromExistingInstance: <T = unknown>(\n params: WorkflowStartFromExistingInstanceParams,\n ) =>\n request<T>({\n path: \"/workflow/start-from-form-instance\",\n method: \"post\",\n body: {\n ...params,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n formInstId: params.formInstId || params.formInstanceId,\n initiatorSelectedApprovers:\n params.initiatorSelectedApprovers || params.selectedApprovers,\n },\n }),\n approve: <T = unknown>(params: WorkflowApproveParams) =>\n request<T>({\n path: \"/workflow/approve\",\n method: \"post\",\n body: {\n ...params,\n action: params.action || \"approved\",\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n },\n }),\n reject: <T = unknown>(params: WorkflowApproveParams) =>\n request<T>({\n path: \"/workflow/approve\",\n method: \"post\",\n body: {\n ...params,\n action: \"rejected\",\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n },\n }),\n transferTask: <T = unknown>(params: WorkflowTransferParams) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(params.taskId)}/transfer`,\n method: \"post\",\n body: {\n newAssignee: params.newAssignee,\n reason: params.reason,\n },\n }),\n adminTransferTask: <T = unknown>(params: WorkflowTransferParams) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(params.taskId)}/admin-transfer`,\n method: \"post\",\n body: {\n newAssignee: params.newAssignee,\n reason: params.reason,\n },\n }),\n returnTask: <T = unknown>(params: WorkflowReturnParams) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(params.taskId)}/return`,\n method: \"post\",\n body: {\n targetNodeId: params.targetNodeId,\n reason: params.reason,\n },\n }),\n withdraw: <T = unknown>(params: WorkflowWithdrawParams) =>\n request<T>({\n path: `/workflow/instance/${encodePathSegment(\n params.instanceId,\n )}/withdraw`,\n method: \"post\",\n body: {\n reason: params.reason,\n },\n }),\n retryException: <T = unknown>(params: { instanceId: string }) =>\n request<T>({\n path: `/workflow/instance/${encodePathSegment(\n params.instanceId,\n )}/retry-exception`,\n method: \"post\",\n }),\n saveTask: <T = unknown>(params: WorkflowSaveTaskParams) =>\n request<T>({\n path: \"/workflow/task/save\",\n method: \"post\",\n body: {\n ...params,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n },\n }),\n resubmitTask: <T = unknown>(params: WorkflowResubmitParams) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(params.taskId)}/resubmit`,\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n updateFormDataJson: params.updateFormDataJson,\n comments: params.comments,\n selectedApprovers: params.selectedApprovers,\n initiatorSelectedApprovers:\n params.initiatorSelectedApprovers || params.selectedApprovers,\n },\n }),\n getReturnableNodes: <T = unknown>(params: WorkflowTaskParams) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(\n params.taskId,\n )}/returnable-nodes`,\n method: \"get\",\n }),\n preview: <T = unknown>(params: WorkflowPreviewParams) =>\n request<T>({\n path: \"/workflow/preview\",\n method: \"post\",\n body: {\n ...params,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n selectedApprovers: params.selectedApprovers,\n initiatorSelectedApprovers:\n params.initiatorSelectedApprovers || params.selectedApprovers,\n },\n }),\n getDefinitionByForm: <T = unknown>(params: WorkflowDefinitionByFormParams) =>\n request<T>({\n path: \"/workflow/definition/form\",\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n id: params.id,\n },\n }),\n getInitiatorSelectRequirements: <T = unknown>(\n params: WorkflowInitiatorSelectRequirementsParams,\n ) =>\n request<T>({\n path: \"/workflow/initiator-approver/requirements\",\n method: \"post\",\n body: {\n ...params,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n },\n }),\n getResubmitInitiatorSelectRequirements: <T = unknown>(\n params: WorkflowResubmitInitiatorSelectRequirementsParams,\n ) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(\n params.taskId,\n )}/resubmit/initiator-approver/requirements`,\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n data: params.data,\n submissionDepartmentId: params.submissionDepartmentId,\n },\n }),\n getInitiatorSelectCandidates: <T = unknown>(\n params: WorkflowInitiatorSelectCandidatesParams,\n ) =>\n request<T>({\n path: \"/workflow/initiator-select/candidates\",\n method: \"get\",\n query: {\n ...params,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n },\n }),\n triggerCallback: <T = unknown>(params: TriggerCallbackTaskParams) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(params.taskId)}/callback`,\n method: \"post\",\n body:\n params.payload === undefined\n ? {}\n : params.payload && typeof params.payload === \"object\"\n ? params.payload\n : { payload: params.payload },\n }),\n }\n\n const dataView = {\n query: <T = unknown>(code: string, params: DataViewQueryParams = {}) => {\n const dataViewCode = String(code || \"\").trim()\n if (!dataViewCode) {\n throw new Error(\"数据视图 code 不能为空\")\n }\n return request<DataViewQueryResult<T>>({\n path: buildAppPath(\n context,\n params.appType,\n `/v1/data-views/${encodePathSegment(dataViewCode)}/query.json`,\n ),\n method: \"post\",\n body: {\n fields: params.fields,\n filters: serializeSearchExpression(params.filters),\n conditionType: params.conditionType,\n searchKeyWord: params.searchKeyWord,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n order: Array.isArray(params.order)\n ? params.order\n : params.order\n ? [params.order]\n : undefined,\n },\n })\n },\n stats: <T = unknown>(code: string, params: DataViewStatsParams = {}) => {\n const dataViewCode = String(code || \"\").trim()\n if (!dataViewCode) {\n throw new Error(\"数据视图 code 不能为空\")\n }\n return request<DataViewQueryResult<T>>({\n path: buildAppPath(\n context,\n params.appType,\n `/v1/data-views/${encodePathSegment(dataViewCode)}/stats.json`,\n ),\n method: \"post\",\n body: {\n fields: params.fields,\n filters: serializeSearchExpression(params.filters),\n having: serializeSearchExpression(params.having),\n conditionType: params.conditionType,\n searchKeyWord: params.searchKeyWord,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n order: Array.isArray(params.order)\n ? params.order\n : params.order\n ? [params.order]\n : undefined,\n },\n })\n },\n }\n\n const appFunction = {\n invoke: <TResult = unknown, TInput = unknown>(\n code: string,\n params: FunctionInvokeParams<TInput> = {},\n ) => {\n const functionCode = String(code || \"\").trim()\n if (!functionCode) {\n throw new Error(\"应用函数 code 不能为空\")\n }\n return request<FunctionInvokeResult<TResult>>({\n path: buildAppPath(\n context,\n params.appType,\n `/v1/functions/${encodePathSegment(functionCode)}/invoke.json`,\n ),\n method: \"post\",\n body: {\n input: params.input,\n },\n })\n },\n }\n\n const notification = {\n sendByType: <T = SendNotificationResult>(\n params: SendNotificationByTypeParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/send-by-type\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n batchSendByType: <T = SendNotificationResult>(\n params: BatchSendNotificationByTypeParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/batch-send-by-type\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n findConfig: <T = unknown>(\n notificationType: string,\n params: { appType?: string; formUuid?: string } = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/notifications/type-configs/${encodePathSegment(notificationType)}`,\n ),\n method: \"get\",\n query: params.formUuid ? { formUuid: params.formUuid } : undefined,\n }),\n previewTemplate: <T = unknown>(params: PreviewNotificationTemplateParams) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/templates/preview\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n previewDingTalk: <T = unknown>(params: PreviewDingTalkNotificationParams) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/dingtalk/preview\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n sendDingTalk: <T = SendNotificationResult>(\n params: SendNotificationByTypeParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/dingtalk/send\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n capabilities: <T = unknown>(params: { appType?: string } = {}) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/dingtalk/capabilities\",\n ),\n method: \"get\",\n }),\n listInbox: <T = NotificationInboxListResult>(\n params: ListNotificationInboxParams = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/inbox\",\n ),\n method: \"get\",\n query: {\n page: params.page,\n limit: params.limit,\n readStatus: params.readStatus,\n keyword: params.keyword,\n templateCode: params.templateCode,\n },\n }),\n getUnreadCount: <T = NotificationUnreadCountResult>(\n params: { appType?: string } = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/inbox/unread-count\",\n ),\n method: \"get\",\n }),\n markRead: <T = NotificationInboxMessage>(\n messageId: string,\n params: { appType?: string } = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/notifications/inbox/${encodePathSegment(messageId)}/read`,\n ),\n method: \"post\",\n }),\n markAllRead: <T = MarkAllNotificationReadResult>(\n params: { appType?: string } = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/inbox/read-all\",\n ),\n method: \"post\",\n }),\n }\n\n const workCenter = {\n listItems: <T = WorkCenterItem>(params: ListWorkCenterItemsParams) =>\n request<WorkCenterListResult<T>>({\n path: \"/work-center/items\",\n method: \"get\",\n query: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n getStats: <T = WorkCenterStats>(params: WorkCenterStatsParams = {}) =>\n request<T>({\n path: \"/work-center/stats\",\n method: \"get\",\n query: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n }\n\n const loginLog = {\n list: <T = PageOffsetListResult<LoginLogRecord>>(\n params: LoginLogListParams = {},\n ) =>\n request<T>({\n path: \"/login-log\",\n method: \"get\",\n query: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n get: <T = LoginLogRecord | null>(\n id: string,\n params: LoginLogGetParams = {},\n ) => {\n const logId = String(id || \"\").trim()\n if (!logId) {\n throw new Error(\"登录日志 id 不能为空\")\n }\n return request<T>({\n path: `/login-log/${encodePathSegment(logId)}`,\n method: \"get\",\n query: {\n appType: resolveAppType(context, params.appType),\n includeSensitive: params.includeSensitive,\n },\n })\n },\n stats: <T = LoginLogStats>(params: LoginLogStatsParams = {}) =>\n request<T>({\n path: \"/login-log/stats\",\n method: \"get\",\n query: {\n appType: resolveAppType(context, params.appType),\n startAt: params.startAt,\n endAt: params.endAt,\n },\n }),\n }\n\n const sdk: PageSdk = {\n context,\n request,\n download,\n createFileAccessTicket,\n transport: {\n request,\n download,\n },\n auth,\n connector,\n form,\n user,\n department,\n organization,\n role,\n permission,\n process,\n notification,\n workCenter,\n loginLog,\n dataView,\n function: appFunction,\n dataSource: {\n run: async <TResult = unknown, TRaw = TResult>(\n name: string,\n params: Record<string, unknown> = {},\n ): Promise<PageApiResponse<TResult, TRaw>> => {\n const descriptor = (context.page.dataSources || []).find(\n (item) => item.key === name,\n ) as PageDataSourceDescriptor | undefined\n\n if (!descriptor) {\n throw new Error(`未找到数据源: ${String(name || \"\")}`)\n }\n\n const runtimeParams = params\n const resolvedFormUuid = String(\n runtimeParams.formUuid || descriptor.formUuid || \"\",\n ).trim()\n\n switch (descriptor.type) {\n case \"dataView.query\":\n case \"dataView.stats\": {\n const dataViewCode = String(\n runtimeParams.code ||\n runtimeParams.dataViewCode ||\n descriptor.code ||\n descriptor.dataViewCode ||\n descriptor.viewCode ||\n descriptor.key ||\n \"\",\n ).trim()\n const queryParams = {\n ...(descriptor.params && typeof descriptor.params === \"object\"\n ? (descriptor.params as Record<string, unknown>)\n : {}),\n ...runtimeParams,\n fields: runtimeParams.fields || descriptor.fields,\n filters: mergeSearchExpressions(\n descriptor.defaultFilter,\n runtimeParams.filters as SearchExpression | string | undefined,\n ),\n having: mergeSearchExpressions(\n descriptor.defaultHaving || descriptor.having,\n runtimeParams.having as SearchExpression | string | undefined,\n ),\n } as unknown as DataViewStatsParams\n delete (queryParams as Record<string, unknown>).code\n delete (queryParams as Record<string, unknown>).dataViewCode\n delete (queryParams as Record<string, unknown>).viewCode\n if (descriptor.type === \"dataView.stats\") {\n return dataView.stats<TResult>(\n dataViewCode,\n queryParams,\n ) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n }\n delete (queryParams as Record<string, unknown>).having\n return dataView.query<TResult>(\n dataViewCode,\n queryParams,\n ) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n }\n case \"form.list\":\n return form.advancedSearch<TResult>({\n ...(runtimeParams as unknown as Omit<\n FormAdvancedSearchParams,\n \"formUuid\"\n >),\n formUuid: resolvedFormUuid,\n filters: mergeSearchExpressions(\n descriptor.defaultFilter,\n runtimeParams.filters as SearchExpression | string | undefined,\n ),\n }) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n case \"form.detail\":\n return form.getDetail<TResult>({\n ...(runtimeParams as unknown as Omit<\n FormGetDetailParams,\n \"formUuid\"\n >),\n formUuid: resolvedFormUuid,\n }) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n case \"form.create\":\n return form.create<TResult>({\n ...(runtimeParams as unknown as Omit<\n FormCreateParams,\n \"formUuid\"\n >),\n formUuid: resolvedFormUuid,\n }) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n case \"form.update\":\n return form.update<TResult>({\n ...(runtimeParams as unknown as Omit<\n FormUpdateParams,\n \"formUuid\"\n >),\n formUuid: resolvedFormUuid,\n }) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n case \"form.delete\":\n return form.remove<TResult>({\n ...(runtimeParams as unknown as Omit<\n FormRemoveParams,\n \"formUuid\"\n >),\n formUuid: resolvedFormUuid,\n }) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n default:\n throw new Error(`暂不支持的数据源类型: ${String(descriptor.type)}`)\n }\n },\n },\n navigation: context.navigation,\n ui: context.ui,\n }\n\n return sdk\n}\n","import type { ThemeConfig } from 'antd';\n\nconst baseTheme = {\n hashed: false,\n token: {\n colorPrimary: '#1677ff',\n colorInfo: '#1677ff',\n colorSuccess: '#52c41a',\n colorWarning: '#faad14',\n colorError: '#ff4d4f',\n colorText: 'rgba(0,0,0,0.88)',\n colorTextSecondary: 'rgba(0,0,0,0.65)',\n colorTextTertiary: 'rgba(0,0,0,0.45)',\n colorTextDisabled: 'rgba(0,0,0,0.25)',\n colorBgContainer: '#ffffff',\n colorBgLayout: '#f5f5f5',\n colorBgElevated: '#ffffff',\n colorBorder: '#d9d9d9',\n colorBorderSecondary: '#f0f0f0',\n borderRadius: 6,\n borderRadiusSM: 4,\n borderRadiusLG: 8,\n fontSize: 14,\n controlHeight: 32,\n },\n components: {\n Form: { itemMarginBottom: 16 },\n Card: { paddingLG: 24 },\n },\n} satisfies ThemeConfig;\n\nexport const antdTheme: ThemeConfig = {\n ...baseTheme,\n cssVar: { prefix: 'ant' },\n};\n\nexport const legacyAntdTheme: ThemeConfig = {\n ...baseTheme,\n cssVar: { prefix: 'sy-ant' },\n};\n\nexport default antdTheme;\n","import { useMemo } from \"react\"\n\nimport { usePageContext } from \"./usePageContext\"\n\nimport type { PageUserInfo, PageUserType } from \"../../core/types\"\n\nexport interface CurrentUserState {\n user: PageUserInfo & { userType: PageUserType; isGuest: boolean }\n isGuest: boolean\n isInternalUser: boolean\n displayName: string\n primaryDepartment: NonNullable<PageUserInfo[\"departments\"]>[number] | null\n affiliatedDepartment: PageUserInfo[\"affiliatedDepartment\"] | null\n}\n\nexport const useCurrentUser = (): CurrentUserState => {\n const { user } = usePageContext()\n\n return useMemo(() => {\n const userType: PageUserType =\n user.userType === \"guest\" || user.isGuest ? \"guest\" : \"normal\"\n const isGuest = userType === \"guest\"\n\n return {\n user: {\n ...user,\n isGuest,\n userType,\n },\n isGuest,\n isInternalUser: !isGuest,\n displayName: user.name || user.username || user.id,\n primaryDepartment: user.departments?.[0] || null,\n affiliatedDepartment: user.affiliatedDepartment || null,\n }\n }, [user])\n}\n","import { usePageSdkStore } from \"../store\"\n\nimport type { PageContext } from \"../../core/types\"\n\nexport const usePageContext = (): PageContext => {\n return usePageSdkStore().context\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { usePageSdk } from \"./usePageSdk\"\n\nimport type { PageApiResponse } from \"../../core/types\"\nimport type { Dispatch, SetStateAction } from \"react\"\n\nconst createParamsSignature = (value: unknown): string => {\n try {\n return JSON.stringify(value || {})\n } catch {\n return \"\"\n }\n}\n\nexport interface UseDataSourceOptions<\n TResult = unknown,\n TData = TResult,\n TParams extends Record<string, unknown> = Record<string, unknown>,\n> {\n params?: TParams\n immediate?: boolean\n transform?: (result: TResult, response: PageApiResponse<TResult>) => TData\n}\n\nexport interface UseDataSourceResult<\n TResult = unknown,\n TData = TResult,\n TParams extends Record<string, unknown> = Record<string, unknown>,\n> {\n response: PageApiResponse<TResult> | null\n result: TResult | null\n data: TData | null\n loading: boolean\n error: Error | null\n refresh: (params?: TParams) => Promise<PageApiResponse<TResult> | null>\n run: (params?: TParams) => Promise<PageApiResponse<TResult> | null>\n setResponse: Dispatch<SetStateAction<PageApiResponse<TResult> | null>>\n setResult: Dispatch<SetStateAction<TResult | null>>\n setData: Dispatch<SetStateAction<TData | null>>\n}\n\nexport const useDataSource = <\n TResult = unknown,\n TData = TResult,\n TParams extends Record<string, unknown> = Record<string, unknown>,\n>(\n name: string,\n options: UseDataSourceOptions<TResult, TData, TParams> = {},\n): UseDataSourceResult<TResult, TData, TParams> => {\n const sdk = usePageSdk()\n const { params, immediate = true, transform } = options\n const paramsRef = useRef(params)\n const transformRef = useRef(transform)\n const paramsSignature = createParamsSignature(params)\n const [response, setResponse] = useState<PageApiResponse<TResult> | null>(\n null,\n )\n const [result, setResult] = useState<TResult | null>(null)\n const [data, setData] = useState<TData | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n paramsRef.current = params\n transformRef.current = transform\n\n const run = useCallback(\n async (overrideParams?: TParams) => {\n setLoading(true)\n setError(null)\n try {\n const response = await sdk.dataSource.run<TResult>(\n name,\n overrideParams || paramsRef.current || {},\n )\n setResponse(response)\n setResult(response.result as TResult | null)\n const activeTransform = transformRef.current\n const nextData = activeTransform\n ? activeTransform(response.result as TResult, response)\n : ((response.result ?? null) as unknown as TData | null)\n setData(nextData)\n return response\n } catch (runtimeError) {\n const nextError =\n runtimeError instanceof Error\n ? runtimeError\n : new Error(String(runtimeError))\n setError(nextError)\n setResponse(null)\n setResult(null)\n return null\n } finally {\n setLoading(false)\n }\n },\n [name, sdk.dataSource],\n )\n\n useEffect(() => {\n if (!immediate) {\n return\n }\n void run()\n }, [immediate, paramsSignature, run])\n\n return {\n response,\n result,\n data,\n loading,\n error,\n refresh: run,\n run,\n setResponse,\n setResult,\n setData,\n }\n}\n","import { usePageSdkStore } from \"../store\"\n\nimport type { PageSdk } from \"../../core/types\"\n\nexport const usePageSdk = (): PageSdk => {\n return usePageSdkStore().sdk\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\"\n\nimport { usePageSdk } from \"./usePageSdk\"\n\nimport type {\n PageApiResponse,\n ViewFieldPermissionValue,\n ViewOperationPermission,\n ViewPermissionSummary,\n} from \"../../core/types\"\n\nexport interface UseFormViewPermissionsOptions {\n appType?: string\n immediate?: boolean\n}\n\nexport interface UseFormViewPermissionsState {\n summary: ViewPermissionSummary\n response: PageApiResponse<ViewPermissionSummary> | null\n loading: boolean\n error: Error | null\n refresh: () => Promise<PageApiResponse<ViewPermissionSummary> | null>\n can: (operation: ViewOperationPermission) => boolean\n getFieldPermission: (fieldName: string) => ViewFieldPermissionValue | null\n}\n\nconst EMPTY_SUMMARY: ViewPermissionSummary = {\n fieldPermissions: {},\n operations: [],\n actions: [],\n}\n\nconst normalizeSummary = (summary?: ViewPermissionSummary): ViewPermissionSummary => {\n const actions = Array.from(\n new Set([...(summary?.actions || []), ...(summary?.operations || [])]),\n ) as ViewOperationPermission[]\n const can = actions.reduce(\n (result, operation) => {\n result[operation] = Boolean(summary?.can?.[operation] ?? true)\n return result\n },\n {} as Record<ViewOperationPermission, boolean>,\n )\n return {\n ...summary,\n fieldPermissions: summary?.fieldPermissions || {},\n operations: actions,\n actions,\n can,\n }\n}\n\nconst toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return new Error(error.message)\n }\n return new Error(String(error || \"获取查看态权限失败\"))\n}\n\nexport const useFormViewPermissions = (\n formUuid: string,\n options: UseFormViewPermissionsOptions = {},\n): UseFormViewPermissionsState => {\n const sdk = usePageSdk()\n const [summary, setSummary] = useState<ViewPermissionSummary>(EMPTY_SUMMARY)\n const [response, setResponse] =\n useState<PageApiResponse<ViewPermissionSummary> | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const immediate = options.immediate ?? true\n\n const refresh = useCallback(async () => {\n const normalizedFormUuid = String(formUuid || \"\").trim()\n if (!normalizedFormUuid) {\n setSummary(EMPTY_SUMMARY)\n setResponse(null)\n return null\n }\n\n setLoading(true)\n setError(null)\n\n try {\n const nextResponse =\n await sdk.permission.formGroup.getViewPermissionSummary({\n appType: options.appType,\n formUuid: normalizedFormUuid,\n })\n const nextSummary = nextResponse.result || EMPTY_SUMMARY\n setResponse(nextResponse)\n setSummary(normalizeSummary(nextSummary))\n return nextResponse\n } catch (requestError) {\n const nextError = toError(requestError)\n setError(nextError)\n setResponse(null)\n setSummary(EMPTY_SUMMARY)\n return null\n } finally {\n setLoading(false)\n }\n }, [formUuid, options.appType, sdk])\n\n useEffect(() => {\n if (!immediate) {\n return\n }\n void refresh()\n }, [immediate, refresh])\n\n const operationSet = useMemo(\n () => new Set(summary.actions || summary.operations),\n [summary.actions, summary.operations],\n )\n\n const can = useCallback(\n (operation: ViewOperationPermission) =>\n Boolean(summary.can?.[operation] ?? operationSet.has(operation)),\n [operationSet, summary.can],\n )\n\n const getFieldPermission = useCallback(\n (fieldName: string) => summary.fieldPermissions[fieldName] || null,\n [summary.fieldPermissions],\n )\n\n return {\n summary,\n response,\n loading,\n error,\n refresh,\n can,\n getFieldPermission,\n }\n}\n","import { usePageContext } from \"./usePageContext\"\n\nimport type { PageMessageApi } from \"../../core/types\"\n\nexport const useMessage = (): PageMessageApi => {\n return usePageContext().ui.message\n}\n","import { usePageContext } from \"./usePageContext\"\n\nimport type { PageModalApi } from \"../../core/types\"\n\nexport const useModal = (): PageModalApi => {\n return usePageContext().ui.modal\n}\n","import { usePageContext } from \"./usePageContext\"\n\nimport type { PageNavigationApi } from \"../../core/types\"\n\nexport const useNavigation = (): PageNavigationApi => {\n return usePageContext().navigation\n}\n","import { usePageContext } from \"./usePageContext\"\n\nexport const usePageProps = <T extends object = Record<string, unknown>>() => {\n return usePageContext().page.props as T\n}\n","import { usePageContext } from \"./usePageContext\"\n\nimport type { PageRouteInfo } from \"../../core/types\"\n\nexport const usePageRoute = (): PageRouteInfo => {\n return usePageContext().route\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport { Form, Input, Modal, Select } from \"antd\"\nimport {\n CheckOutlined,\n CloseOutlined,\n ReloadOutlined,\n RollbackOutlined,\n SaveOutlined,\n SwapOutlined,\n} from \"@ant-design/icons\"\n\nimport type {\n ProcessCapabilities,\n ProcessCapabilityOperation,\n ResolveProcessCapabilitiesParams,\n WorkflowCapabilityActionKey,\n} from \"../core/types\"\nimport { usePageSdk } from \"./hooks/usePageSdk\"\nimport { StickyActionBar } from \"../../components/modules/StickyActionBar\"\nimport type { ActionConfig } from \"../../components/modules/FormActionBar\"\nimport { ApprovalTimeline } from \"../../components/modules/ApprovalTimeline\"\nimport type { ApprovalTimelineProps } from \"../../components/modules/ApprovalTimeline\"\nimport { ProcessPreview } from \"../../components/modules/ProcessPreview\"\nimport type { ProcessPreviewProps } from \"../../components/modules/ProcessPreview\"\nimport { InitiatorApproverSelector } from \"../../components/modules/InitiatorApproverSelector\"\n\nexport interface UseProcessCapabilitiesOptions\n extends ResolveProcessCapabilitiesParams {\n enabled?: boolean\n refreshKey?: unknown\n onError?: (error: Error) => void\n}\n\nexport interface UseProcessCapabilitiesReturn {\n capabilities: ProcessCapabilities | null\n operations: ProcessCapabilityOperation[]\n timeline: Array<Record<string, unknown>>\n loading: boolean\n error: Error | null\n refresh: () => Promise<ProcessCapabilities | null>\n}\n\nconst getError = (error: unknown): Error =>\n error instanceof Error ? error : new Error(String(error || \"流程能力解析失败\"))\n\nconst normalizeCapabilities = (value: unknown): ProcessCapabilities => {\n const raw = (value || {}) as ProcessCapabilities\n return {\n ...raw,\n operations: Array.isArray(raw.operations) ? raw.operations : [],\n timeline: Array.isArray(raw.timeline) ? raw.timeline : [],\n }\n}\n\nexport function useProcessCapabilities(\n options: UseProcessCapabilitiesOptions,\n): UseProcessCapabilitiesReturn {\n const { enabled = true, refreshKey, onError, ...params } = options\n const sdk = usePageSdk()\n const [capabilities, setCapabilities] = useState<ProcessCapabilities | null>(\n null,\n )\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const mountedRef = useRef(true)\n const paramsKey = JSON.stringify({ ...params, refreshKey })\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n const refresh = useCallback(async () => {\n if (!enabled) return capabilities\n setLoading(true)\n setError(null)\n try {\n const response = await sdk.process.resolveCapabilities<ProcessCapabilities>(\n params,\n )\n const nextCapabilities = normalizeCapabilities(response.result)\n if (mountedRef.current) {\n setCapabilities(nextCapabilities)\n }\n return nextCapabilities\n } catch (input) {\n const nextError = getError(input)\n if (mountedRef.current) {\n setError(nextError)\n }\n onError?.(nextError)\n return null\n } finally {\n if (mountedRef.current) {\n setLoading(false)\n }\n }\n }, [capabilities, enabled, onError, paramsKey, sdk])\n\n useEffect(() => {\n if (!enabled) return\n void refresh()\n }, [enabled, paramsKey, refresh])\n\n return {\n capabilities,\n operations: capabilities?.operations || [],\n timeline: capabilities?.timeline || [],\n loading,\n error,\n refresh,\n }\n}\n\nexport interface ExecuteProcessOperationInput {\n comments?: string\n reason?: string\n newAssignee?: string\n targetNodeId?: string\n payload?: unknown\n submissionDepartmentId?: string\n selectedApprovers?: Record<string, string[]>\n initiatorSelectedApprovers?: Record<string, string[]>\n updateFormDataJson?: string\n}\n\nexport interface UseProcessActionsOptions {\n capabilities?: ProcessCapabilities | null\n formUuid?: string\n appType?: string\n getFormValues?: () => Record<string, unknown>\n onActionComplete?: (\n action: WorkflowCapabilityActionKey,\n operation: ProcessCapabilityOperation,\n ) => Promise<void> | void\n}\n\nexport interface UseProcessActionsReturn {\n loadingAction: WorkflowCapabilityActionKey | null\n executeOperation: (\n operation: ProcessCapabilityOperation,\n input?: ExecuteProcessOperationInput,\n ) => Promise<boolean>\n execute: (\n action: WorkflowCapabilityActionKey,\n input?: ExecuteProcessOperationInput,\n ) => Promise<boolean>\n}\n\nconst getInstanceId = (\n operation: ProcessCapabilityOperation,\n capabilities?: ProcessCapabilities | null,\n) =>\n String(\n operation.instanceId ||\n operation.formInstanceId ||\n capabilities?.instance?.id ||\n capabilities?.instance?.formInstanceId ||\n \"\",\n )\n\nconst getTaskId = (operation: ProcessCapabilityOperation) =>\n String(operation.taskId || \"\")\n\nconst requireValue = (value: string | undefined, message: string) => {\n const normalized = String(value || \"\").trim()\n if (!normalized) throw new Error(message)\n return normalized\n}\n\nexport function useProcessActions(\n options: UseProcessActionsOptions,\n): UseProcessActionsReturn {\n const { capabilities, formUuid, appType, getFormValues, onActionComplete } =\n options\n const sdk = usePageSdk()\n const [loadingAction, setLoadingAction] =\n useState<WorkflowCapabilityActionKey | null>(null)\n\n const buildUpdateFormDataJson = useCallback(\n (input?: ExecuteProcessOperationInput) => {\n if (input?.updateFormDataJson !== undefined) return input.updateFormDataJson\n const values = getFormValues?.()\n return values ? JSON.stringify(values) : undefined\n },\n [getFormValues],\n )\n\n const executeOperation = useCallback(\n async (\n operation: ProcessCapabilityOperation,\n input: ExecuteProcessOperationInput = {},\n ) => {\n if (!operation.enabled) return false\n setLoadingAction(operation.key)\n try {\n const instanceId = getInstanceId(operation, capabilities)\n const taskId = getTaskId(operation)\n if (operation.key === \"startProcess\") {\n const definition = capabilities?.instance?.definition as\n | Record<string, unknown>\n | undefined\n await sdk.process.startFromExistingInstance({\n appType,\n formUuid: requireValue(\n formUuid ||\n String(operation.formUuid || definition?.formUuid || \"\"),\n \"formUuid 不能为空\",\n ),\n formInstId: requireValue(instanceId, \"表单实例ID不能为空\"),\n formInstanceId: instanceId,\n updateFormDataJson: buildUpdateFormDataJson(input),\n submissionDepartmentId: input.submissionDepartmentId,\n selectedApprovers: input.selectedApprovers,\n initiatorSelectedApprovers:\n input.initiatorSelectedApprovers || input.selectedApprovers,\n })\n } else if (operation.key === \"approve\") {\n await sdk.process.approve({\n instanceId: requireValue(instanceId, \"流程实例ID不能为空\"),\n appType,\n formUuid,\n comments: input.comments,\n updateFormDataJson: buildUpdateFormDataJson(input),\n })\n } else if (operation.key === \"reject\") {\n await sdk.process.reject({\n instanceId: requireValue(instanceId, \"流程实例ID不能为空\"),\n appType,\n formUuid,\n comments: input.comments || input.reason,\n updateFormDataJson: buildUpdateFormDataJson(input),\n })\n } else if (operation.key === \"transfer\") {\n await sdk.process.transferTask({\n taskId: requireValue(taskId, \"流程任务ID不能为空\"),\n newAssignee: requireValue(input.newAssignee, \"转交人不能为空\"),\n reason: input.reason,\n })\n } else if (operation.key === \"adminTransfer\") {\n await sdk.process.adminTransferTask({\n taskId: requireValue(taskId, \"流程任务ID不能为空\"),\n newAssignee: requireValue(input.newAssignee, \"转交人不能为空\"),\n reason: input.reason,\n })\n } else if (operation.key === \"return\") {\n await sdk.process.returnTask({\n taskId: requireValue(taskId, \"流程任务ID不能为空\"),\n targetNodeId: requireValue(input.targetNodeId, \"退回节点不能为空\"),\n reason: input.reason,\n })\n } else if (operation.key === \"withdraw\") {\n await sdk.process.withdraw({\n instanceId: requireValue(instanceId, \"流程实例ID不能为空\"),\n reason: input.reason || input.comments,\n })\n } else if (operation.key === \"save\") {\n await sdk.process.saveTask({\n instanceId: requireValue(instanceId, \"流程实例ID不能为空\"),\n appType,\n formUuid: requireValue(formUuid, \"formUuid 不能为空\"),\n updateFormDataJson: requireValue(\n buildUpdateFormDataJson(input),\n \"暂存数据不能为空\",\n ),\n comments: input.comments,\n })\n } else if (operation.key === \"resubmit\") {\n await sdk.process.resubmitTask({\n taskId: requireValue(taskId, \"流程任务ID不能为空\"),\n appType,\n formUuid: requireValue(formUuid, \"formUuid 不能为空\"),\n updateFormDataJson: requireValue(\n buildUpdateFormDataJson(input),\n \"重新提交数据不能为空\",\n ),\n comments: input.comments,\n selectedApprovers: input.selectedApprovers,\n initiatorSelectedApprovers: input.selectedApprovers,\n })\n } else if (operation.key === \"callback\") {\n await sdk.process.triggerCallback({\n taskId: requireValue(taskId, \"流程任务ID不能为空\"),\n payload: input.payload,\n })\n } else if (operation.key === \"retryException\") {\n await sdk.process.retryException({\n instanceId: requireValue(instanceId, \"流程实例ID不能为空\"),\n })\n }\n await onActionComplete?.(operation.key, operation)\n return true\n } finally {\n setLoadingAction(null)\n }\n },\n [\n appType,\n buildUpdateFormDataJson,\n capabilities,\n formUuid,\n onActionComplete,\n sdk,\n ],\n )\n\n const execute = useCallback(\n async (\n action: WorkflowCapabilityActionKey,\n input?: ExecuteProcessOperationInput,\n ) => {\n const operation = (capabilities?.operations || []).find(\n (item) => item.key === action,\n )\n if (!operation) return false\n return executeOperation(operation, input)\n },\n [capabilities?.operations, executeOperation],\n )\n\n return {\n loadingAction,\n executeOperation,\n execute,\n }\n}\n\nexport interface ProcessActionBarProps extends UseProcessActionsOptions {\n capabilities?: ProcessCapabilities | null\n capabilityParams?: UseProcessCapabilitiesOptions\n operations?: ProcessCapabilityOperation[]\n onRefreshCapabilities?: () => Promise<void> | void\n className?: string\n maxMobileButtons?: number\n inDrawer?: boolean\n maxWidth?: number | string\n position?: \"sticky\" | \"fixed\" | \"inline\"\n}\n\ntype ModalAction = Extract<\n WorkflowCapabilityActionKey,\n \"reject\" | \"transfer\" | \"adminTransfer\" | \"return\" | \"withdraw\" | \"resubmit\"\n>\n\nconst modalActions = new Set<WorkflowCapabilityActionKey>([\n \"reject\",\n \"transfer\",\n \"adminTransfer\",\n \"return\",\n \"withdraw\",\n \"resubmit\",\n])\n\nconst actionPriority: Record<WorkflowCapabilityActionKey, number> = {\n startProcess: 5,\n approve: 10,\n resubmit: 15,\n callback: 20,\n save: 40,\n transfer: 50,\n adminTransfer: 55,\n return: 60,\n retryException: 70,\n withdraw: 80,\n reject: 90,\n}\n\nconst actionTone = (\n key: WorkflowCapabilityActionKey,\n): ActionConfig[\"type\"] => {\n if (key === \"startProcess\" || key === \"approve\" || key === \"resubmit\") return \"primary\"\n if (key === \"reject\" || key === \"withdraw\") return \"danger\"\n return \"default\"\n}\n\nconst actionIcon = (key: WorkflowCapabilityActionKey) => {\n if (key === \"startProcess\" || key === \"approve\") return <CheckOutlined />\n if (key === \"reject\") return <CloseOutlined />\n if (key === \"transfer\" || key === \"adminTransfer\") return <SwapOutlined />\n if (key === \"return\" || key === \"withdraw\") return <RollbackOutlined />\n if (key === \"save\") return <SaveOutlined />\n if (key === \"retryException\" || key === \"callback\") return <ReloadOutlined />\n return undefined\n}\n\nconst getModalTitle = (key: ModalAction) => {\n if (key === \"reject\") return \"拒绝理由\"\n if (key === \"transfer\") return \"转交任务\"\n if (key === \"adminTransfer\") return \"管理员转交\"\n if (key === \"return\") return \"退回任务\"\n if (key === \"withdraw\") return \"撤回流程\"\n return \"重新提交\"\n}\n\nexport const ProcessActionBar: React.FC<ProcessActionBarProps> = ({\n capabilities: controlledCapabilities,\n capabilityParams,\n operations: controlledOperations,\n formUuid,\n appType,\n getFormValues,\n onActionComplete,\n onRefreshCapabilities,\n className,\n maxMobileButtons = 2,\n inDrawer,\n maxWidth,\n position = \"sticky\",\n}) => {\n const [form] = Form.useForm()\n const [activeOperation, setActiveOperation] =\n useState<ProcessCapabilityOperation | null>(null)\n const autoCapabilities = useProcessCapabilities({\n ...(capabilityParams || {}),\n enabled: Boolean(capabilityParams) && capabilityParams?.enabled !== false,\n })\n const capabilities = controlledCapabilities || autoCapabilities.capabilities\n const operations = controlledOperations || capabilities?.operations || []\n const actions = useProcessActions({\n capabilities,\n formUuid,\n appType,\n getFormValues,\n onActionComplete: async (action, operation) => {\n await onActionComplete?.(action, operation)\n await onRefreshCapabilities?.()\n if (capabilityParams) {\n await autoCapabilities.refresh()\n }\n },\n })\n\n const openOperation = (operation: ProcessCapabilityOperation) => {\n if (!operation.enabled) return\n if (modalActions.has(operation.key)) {\n const firstReturnNode = operation.returnableNodes?.[0]\n form.setFieldsValue({\n comments: \"\",\n reason: \"\",\n newAssignee: undefined,\n targetNodeId:\n typeof firstReturnNode?.nodeId === \"string\"\n ? firstReturnNode.nodeId\n : typeof firstReturnNode?.id === \"string\"\n ? firstReturnNode.id\n : undefined,\n })\n setActiveOperation(operation)\n return\n }\n void actions.executeOperation(operation)\n }\n\n const actionConfigs: ActionConfig[] = useMemo(\n () =>\n operations.map((operation) => ({\n key: operation.key,\n label: operation.label || operation.key,\n type: actionTone(operation.key),\n icon: actionIcon(operation.key),\n disabled: !operation.enabled,\n disabledReason: operation.disabledReason,\n visible: operation.visible !== false,\n loading: actions.loadingAction === operation.key,\n priority: actionPriority[operation.key] || 50,\n onClick: () => openOperation(operation),\n })),\n [actions.loadingAction, operations],\n )\n\n const handleModalOk = async () => {\n if (!activeOperation) return\n const values = await form.validateFields()\n const ok = await actions.executeOperation(activeOperation, values)\n if (ok) {\n setActiveOperation(null)\n form.resetFields()\n }\n }\n\n const modalKey = activeOperation?.key as ModalAction | undefined\n const returnOptions = (activeOperation?.returnableNodes || []).map((node) => {\n const value = String(node.nodeId || node.id || \"\")\n return {\n value,\n label: String(node.nodeName || node.name || node.label || value),\n }\n })\n\n return (\n <>\n <StickyActionBar\n actions={actionConfigs}\n layoutMode=\"approval\"\n maxMobileButtons={maxMobileButtons}\n className={className}\n inDrawer={inDrawer}\n maxWidth={maxWidth}\n position={position}\n />\n <Modal\n getContainer={false}\n title={modalKey ? getModalTitle(modalKey) : \"流程操作\"}\n open={Boolean(activeOperation)}\n okText=\"确认\"\n cancelText=\"取消\"\n confirmLoading={Boolean(\n activeOperation && actions.loadingAction === activeOperation.key,\n )}\n onOk={handleModalOk}\n onCancel={() => {\n setActiveOperation(null)\n form.resetFields()\n }}\n destroyOnHidden\n >\n <Form form={form} layout=\"vertical\">\n {(modalKey === \"transfer\" || modalKey === \"adminTransfer\") && (\n <Form.Item\n name=\"newAssignee\"\n label=\"接收人\"\n rules={[{ required: true, message: \"请输入接收人用户ID\" }]}\n >\n <Input placeholder=\"请输入用户ID\" />\n </Form.Item>\n )}\n {modalKey === \"return\" && (\n <Form.Item\n name=\"targetNodeId\"\n label=\"退回节点\"\n rules={[{ required: true, message: \"请选择退回节点\" }]}\n >\n <Select placeholder=\"请选择退回节点\" options={returnOptions} />\n </Form.Item>\n )}\n <Form.Item\n name={modalKey === \"reject\" || modalKey === \"resubmit\" ? \"comments\" : \"reason\"}\n label={\n modalKey === \"reject\"\n ? \"拒绝理由\"\n : modalKey === \"resubmit\"\n ? \"提交意见\"\n : \"说明\"\n }\n rules={[\n {\n required: modalKey === \"reject\" || modalKey === \"withdraw\",\n message: \"请填写说明\",\n },\n ]}\n >\n <Input.TextArea rows={4} maxLength={500} showCount />\n </Form.Item>\n </Form>\n </Modal>\n </>\n )\n}\n\nexport interface ProcessTimelineProps\n extends Omit<ApprovalTimelineProps, \"tasks\"> {\n capabilities?: ProcessCapabilities | null\n tasks?: ApprovalTimelineProps[\"tasks\"]\n}\n\nexport const ProcessTimeline: React.FC<ProcessTimelineProps> = ({\n capabilities,\n tasks,\n ...props\n}) => (\n <ApprovalTimeline\n {...props}\n tasks={(tasks || capabilities?.timeline || []) as ApprovalTimelineProps[\"tasks\"]}\n />\n)\n\nexport const ProcessPreviewPanel = ProcessPreview\nexport type ProcessPreviewPanelProps = ProcessPreviewProps\nexport { InitiatorApproverSelector }\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Button, Dropdown, Tooltip } from 'antd';\nimport { MoreOutlined } from '@ant-design/icons';\nimport type { ActionConfig } from './FormActionBar';\nimport { confirmAction } from '../utils/confirmAction';\n\nexport interface StickyActionBarProps {\n actions: ActionConfig[];\n className?: string;\n maxMobileButtons?: number;\n layoutMode?: 'default' | 'approval';\n align?: 'left' | 'center' | 'right';\n inDrawer?: boolean;\n maxWidth?: number | string;\n position?: 'sticky' | 'fixed' | 'inline';\n surface?: 'default' | 'transparent';\n}\n\nconst getActionPriority = (action: ActionConfig) => {\n const maybePriority = (action as ActionConfig & { priority?: number }).priority;\n if (typeof maybePriority === 'number') return maybePriority;\n if (action.type === 'primary') return 10;\n if (action.type === 'danger') return 90;\n return 50;\n};\n\nexport const StickyActionBar: React.FC<StickyActionBarProps> = ({\n actions,\n className = '',\n maxMobileButtons = 2,\n layoutMode = 'default',\n align = 'right',\n maxWidth = 1120,\n position = 'sticky',\n surface = 'default',\n}) => {\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const update = () => setIsMobile(typeof window !== 'undefined' && window.innerWidth <= 768);\n update();\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }, []);\n\n const visibleActions = useMemo(\n () =>\n actions\n .filter((action) => action.visible !== false)\n .sort((left, right) => getActionPriority(left) - getActionPriority(right)),\n [actions],\n );\n\n if (visibleActions.length === 0) return null;\n\n const maxWidthStyle = typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth;\n const primaryMobile = visibleActions.slice(0, maxMobileButtons);\n const moreMobile = visibleActions.slice(maxMobileButtons);\n const desktopAlign = layoutMode === 'approval' ? 'center' : align;\n const desktopJustifyClass =\n desktopAlign === 'left'\n ? 'justify-start'\n : desktopAlign === 'center'\n ? 'justify-center'\n : 'justify-end';\n const positionClass =\n position === 'fixed'\n ? 'fixed bottom-0 left-0 right-0'\n : position === 'inline'\n ? 'relative'\n : 'sticky bottom-0';\n const surfaceClass =\n surface === 'transparent'\n ? 'border-t-0 bg-transparent shadow-none backdrop-blur-0'\n : 'border-t border-ant-border-secondary bg-ant-bg-container/95 shadow-[0_-8px_24px_rgba(15,23,42,0.06)] backdrop-blur';\n const spacingClass =\n surface === 'transparent'\n ? 'px-0 py-0'\n : 'px-4 py-3 supports-[padding:max(0px)]:pb-[max(0.75rem,env(safe-area-inset-bottom))]';\n\n const runAction = (action: ActionConfig) => {\n if (action.confirm) {\n const confirmed = confirmAction(action.confirm.title, action.confirm.content);\n if (!confirmed) return;\n }\n action.onClick();\n };\n\n const renderButton = (action: ActionConfig, mobile = false) => {\n const button = (\n <Button\n key={action.key}\n type={\n action.type === 'danger'\n ? 'primary'\n : action.type === 'text'\n ? 'text'\n : action.type || 'default'\n }\n danger={action.type === 'danger'}\n loading={action.loading}\n disabled={action.disabled}\n icon={action.icon}\n onClick={() => runAction(action)}\n className={`${mobile ? 'min-w-0 flex-1' : 'min-w-[88px]'} rounded-md`}\n >\n {action.label}\n </Button>\n );\n if (!action.disabled || !action.disabledReason) return button;\n return (\n <Tooltip key={action.key} title={action.disabledReason}>\n <span className={mobile ? 'flex min-w-0 flex-1' : 'inline-flex'}>{button}</span>\n </Tooltip>\n );\n };\n\n return (\n <div className={`${positionClass} z-20 ${spacingClass} ${surfaceClass} ${className}`}>\n <div\n className={`mx-auto flex w-full items-center gap-3 ${\n !isMobile ? desktopJustifyClass : 'justify-end'\n }`}\n style={{ maxWidth: maxWidthStyle }}\n >\n {isMobile ? (\n <>\n <div className=\"flex flex-1 gap-2\">\n {primaryMobile.map((action) => renderButton(action, true))}\n </div>\n {moreMobile.length > 0 && (\n <Dropdown\n trigger={['click']}\n placement=\"topRight\"\n menu={{\n items: moreMobile.map((action) => ({\n key: action.key,\n label: action.label,\n danger: action.type === 'danger',\n disabled: action.disabled,\n icon: action.icon,\n onClick: () => runAction(action),\n })),\n }}\n >\n <Button icon={<MoreOutlined />} className=\"rounded-md\">\n 更多\n </Button>\n </Dropdown>\n )}\n </>\n ) : layoutMode === 'approval' ? (\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n {visibleActions.map((action) => renderButton(action))}\n </div>\n ) : (\n <div className={`flex flex-wrap items-center ${desktopJustifyClass} gap-3`}>\n {visibleActions.map((action) => renderButton(action))}\n </div>\n )}\n </div>\n </div>\n );\n};\n","export const confirmAction = (title?: string, content?: string) => {\n const message = [title, content].filter(Boolean).join('\\n') || '确认继续吗?';\n if (typeof window === 'undefined' || typeof window.confirm !== 'function') {\n return true;\n }\n\n try {\n return window.confirm(message);\n } catch {\n return true;\n }\n};\n","import React, { useMemo } from 'react';\nimport {\n ApiOutlined,\n CheckCircleFilled,\n ClockCircleOutlined,\n CloseCircleFilled,\n CodeOutlined,\n CopyOutlined,\n EditOutlined,\n FileTextOutlined,\n LoadingOutlined,\n NotificationOutlined,\n ReloadOutlined,\n RollbackOutlined,\n UserOutlined,\n} from '@ant-design/icons';\nimport type { ProcessTask, StatusMeta } from '../types';\nimport { TASK_STATUS_META } from '../core/constants';\n\nexport interface ApprovalTimelineProps {\n tasks: ProcessTask[];\n className?: string;\n renderNode?: (task: ProcessTask, index: number) => React.ReactNode;\n showRemarks?: boolean;\n compactMode?: boolean;\n showApproverInfo?: boolean;\n}\n\ntype VisualState =\n | 'completed'\n | 'current'\n | 'waiting'\n | 'future'\n | 'rejected'\n | 'returned'\n | 'neutral';\n\nconst systemNodeTypes = new Set([\n 'condition',\n 'condition_branch',\n 'js_code',\n 'data_retrieve_single',\n 'data_retrieve_batch',\n 'data_create',\n 'data_update',\n 'connector_call',\n 'loop_container',\n 'work_notification',\n 'dingtalk_card',\n 'system',\n]);\n\nconst systemLabels: Record<string, string> = {\n condition: '条件判断',\n condition_branch: '条件分支',\n js_code: 'JS 代码',\n data_retrieve_single: '数据读取',\n data_retrieve_batch: '批量读取',\n data_create: '数据创建',\n data_update: '数据更新',\n connector_call: '连接器调用',\n loop_container: '循环节点',\n work_notification: '工作通知',\n dingtalk_card: '钉钉卡片',\n system: '系统动作',\n};\n\nconst toneClasses: Record<StatusMeta['tone'] | 'return' | 'future', string> = {\n brand: 'bg-blue-600 text-white border-blue-600',\n success: 'bg-emerald-50 text-emerald-700 border-emerald-200',\n danger: 'bg-red-50 text-red-700 border-red-200',\n neutral: 'bg-gray-50 text-gray-600 border-gray-200',\n warning: 'bg-amber-50 text-amber-700 border-amber-200',\n return: 'bg-amber-50 text-amber-700 border-amber-200',\n future: 'bg-gray-50 text-gray-400 border-gray-200',\n};\n\nfunction groupTasks(tasks: ProcessTask[]) {\n const groups = new Map<string, ProcessTask[]>();\n tasks.forEach((task, index) => {\n const key = task.nodeVisitId || `${task.nodeId || 'node'}-${task.id || task.taskId || index}`;\n const group = groups.get(key) || [];\n group.push(task);\n groups.set(key, group);\n });\n return Array.from(groups.values()).map((group) => {\n const hasOrSignResult = group.some(\n (task) =>\n task.nodeType === 'approval' &&\n task.multiApproveMode === 'or' &&\n !task.isSimulated &&\n ['approved', 'rejected', 'returned'].includes(task.status),\n );\n if (!hasOrSignResult) return group;\n const outcome = group.filter(\n (task) => !task.isSimulated && ['approved', 'rejected', 'returned'].includes(task.status),\n );\n return outcome.length > 0 ? outcome : group;\n });\n}\n\nfunction isCompactNode(task: ProcessTask) {\n return (\n task.nodeType === 'start' ||\n task.nodeType === 'copy' ||\n task.nodeType === 'end' ||\n systemNodeTypes.has(task.nodeType)\n );\n}\n\nfunction getNodeTitle(task: ProcessTask) {\n if (task.nodeType === 'start') return task.title || task.nodeName || '流程提交';\n if (task.nodeType === 'originator_return') return task.title || task.nodeName || '发起人修改';\n if (task.nodeType === 'copy') return task.title || task.nodeName || '抄送通知';\n if (task.nodeType === 'callback_wait') return task.title || task.nodeName || '等待第三方回调';\n if (task.nodeType === 'end') return task.title || task.nodeName || '流程完成';\n if (systemNodeTypes.has(task.nodeType))\n return task.title || task.nodeName || systemLabels[task.nodeType] || '系统动作';\n return task.title || task.nodeName || '审批';\n}\n\nfunction getVisualState(task: ProcessTask, isFutureGroup: boolean): VisualState {\n if (isFutureGroup || task.isSimulated || task.status === 'simulated') return 'future';\n if (task.status === 'rejected') return 'rejected';\n if (task.status === 'returned') return 'returned';\n if (task.status === 'pending' || task.status === 'waiting' || task.canApprove)\n return task.canApprove ? 'current' : 'waiting';\n if (\n task.status === 'approved' ||\n task.status === 'copied' ||\n task.nodeType === 'start' ||\n task.nodeType === 'end'\n ) {\n return 'completed';\n }\n return 'neutral';\n}\n\nfunction getStatusMeta(task: ProcessTask, state: VisualState, compact: boolean): StatusMeta {\n if (state === 'future') return { label: '未开始', tone: 'neutral' };\n if (state === 'current')\n return { label: task.nodeType === 'callback_wait' ? '等待回调' : '审批中', tone: 'brand' };\n if (state === 'waiting') return { label: '等待处理中', tone: 'neutral' };\n if (state === 'rejected') return TASK_STATUS_META.rejected;\n if (state === 'returned') return TASK_STATUS_META.returned;\n if (task.nodeType === 'copy' || task.status === 'copied') return TASK_STATUS_META.copied;\n if (compact) return { label: '已完成', tone: 'neutral' };\n return TASK_STATUS_META[task.status] || TASK_STATUS_META.approved;\n}\n\nfunction getIcon(task: ProcessTask, state: VisualState) {\n if (state === 'current')\n return task.nodeType === 'callback_wait' ? <ClockCircleOutlined /> : <LoadingOutlined />;\n if (state === 'future' || state === 'waiting')\n return task.nodeType === 'approval' ? <UserOutlined /> : <ClockCircleOutlined />;\n if (state === 'rejected') return <CloseCircleFilled />;\n if (state === 'returned') return <RollbackOutlined />;\n switch (task.nodeType as string) {\n case 'start':\n return <FileTextOutlined />;\n case 'approval':\n return <CheckCircleFilled />;\n case 'originator_return':\n return <EditOutlined />;\n case 'copy':\n return <CopyOutlined />;\n case 'callback_wait':\n return <ClockCircleOutlined />;\n case 'js_code':\n return <CodeOutlined />;\n case 'connector_call':\n return <ApiOutlined />;\n case 'work_notification':\n case 'dingtalk_card':\n return <NotificationOutlined />;\n case 'data_retrieve_single':\n case 'data_retrieve_batch':\n case 'data_create':\n case 'data_update':\n case 'loop_container':\n return <ReloadOutlined />;\n default:\n return <CheckCircleFilled />;\n }\n}\n\nfunction getDotClass(state: VisualState) {\n const map: Record<VisualState, string> = {\n completed: 'border-emerald-500 text-emerald-600 bg-white',\n current: 'border-blue-600 bg-blue-600 text-white',\n waiting: 'border-gray-200 text-gray-300 bg-white',\n future: 'border-dashed border-gray-300 text-gray-300 bg-white',\n rejected: 'border-red-500 text-red-600 bg-white',\n returned: 'border-amber-500 text-amber-600 bg-white',\n neutral: 'border-gray-200 text-gray-400 bg-white',\n };\n return map[state];\n}\n\nexport const ApprovalTimeline: React.FC<ApprovalTimelineProps> = ({\n tasks,\n className = '',\n renderNode,\n showRemarks = true,\n compactMode = false,\n showApproverInfo = true,\n}) => {\n const taskList = useMemo(() => (Array.isArray(tasks) ? tasks : []), [tasks]);\n const groups = useMemo(() => groupTasks(taskList), [taskList]);\n\n if (taskList.length === 0) {\n return (\n <div\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container p-6 ${className}`}\n >\n <p className=\"m-0 text-center text-sm text-ant-text-tertiary\">暂无审批记录</p>\n </div>\n );\n }\n\n if (renderNode) {\n return (\n <div className={className}>\n {taskList.map((task, index) => (\n <div key={task.taskId || task.id || index}>{renderNode(task, index)}</div>\n ))}\n </div>\n );\n }\n\n return (\n <div className={`approval-timeline ${className}`}>\n {groups.map((group, index) => {\n const node = group[0];\n const isLast = index === groups.length - 1;\n const isFutureGroup = group.some((task) => task.isSimulated || task.status === 'simulated');\n const compact = compactMode || isCompactNode(node);\n const state = getVisualState(node, isFutureGroup);\n const statusMeta = getStatusMeta(node, state, compact);\n const title = getNodeTitle(node);\n const time = node.actionAt || node.createdAt;\n\n return (\n <div\n key={node.nodeVisitId || `${node.nodeId}-${node.taskId}-${index}`}\n className={`relative flex gap-4 pb-5 ${isLast ? 'pb-0' : ''}`}\n >\n {!isLast && (\n <div\n className={`absolute bottom-0 left-[21px] top-11 w-px ${\n state === 'future'\n ? 'border-l border-dashed border-gray-300'\n : 'bg-ant-border-secondary'\n }`}\n />\n )}\n <div\n className={`relative z-10 flex h-11 w-11 shrink-0 items-center justify-center rounded-full border-2 shadow-[0_0_0_4px_var(--ant-color-bg-layout,#f5f5f5)] ${getDotClass(state)}`}\n >\n {getIcon(node, state)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div\n className={`rounded-lg border p-4 ${\n state === 'current'\n ? 'border-blue-300 bg-blue-50/60'\n : state === 'future'\n ? 'border-dashed border-gray-200 bg-gray-50/70'\n : 'border-ant-border-secondary bg-ant-bg-container'\n }`}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <span className=\"font-medium text-ant-text\">{title}</span>\n <span\n className={`inline-flex min-h-6 items-center rounded-md border px-2 text-xs font-medium ${\n state === 'future' ? toneClasses.future : toneClasses[statusMeta.tone]\n }`}\n >\n {statusMeta.label}\n </span>\n {node.nodeType === 'originator_return' && (\n <span className=\"rounded-md bg-amber-50 px-2 py-1 text-xs text-amber-700\">\n 发起人操作\n </span>\n )}\n </div>\n {!isFutureGroup && time && (\n <span className=\"text-xs text-ant-text-tertiary\">{time}</span>\n )}\n </div>\n\n {showApproverInfo && !compact && group.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-3\">\n <span className=\"w-full text-xs font-medium text-ant-text-tertiary\">\n {state === 'current' || state === 'waiting' ? '当前审批人' : '处理人'}\n </span>\n {group.map((assignee) => (\n <span\n key={assignee.taskId || assignee.id}\n className=\"inline-flex min-w-0 items-center gap-2\"\n >\n <span className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-blue-50 text-xs font-semibold text-blue-700\">\n {assignee.assigneeName?.slice(0, 1) || '?'}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-ant-text\">\n {assignee.assigneeName || '系统'}\n </span>\n <span className=\"block text-xs text-ant-text-tertiary\">\n {assignee.departmentName ||\n assignee.actionAt ||\n assignee.createdAt ||\n ''}\n </span>\n </span>\n </span>\n ))}\n </div>\n )}\n\n {showApproverInfo && compact && (\n <div className=\"mt-2 text-sm text-ant-text-secondary\">\n {group\n .map((item) => item.assigneeName)\n .filter(Boolean)\n .join('、') ||\n (node.nodeType === 'start'\n ? '提交申请'\n : systemNodeTypes.has(node.nodeType)\n ? node.comments || '系统自动处理'\n : '')}\n </div>\n )}\n\n {showRemarks && node.comments && (\n <div\n className={`mt-3 border-l-2 pl-3 text-sm leading-6 ${\n state === 'rejected'\n ? 'border-red-300 text-red-700'\n : state === 'returned'\n ? 'border-amber-300 text-amber-700'\n : 'border-ant-border-secondary text-ant-text-secondary'\n }`}\n >\n {node.comments}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n","import type { ProcessStatus, StatusMeta, TaskStatus } from '../types';\n\n/** 流程状态元映射 */\nexport const PROCESS_STATUS_META: Record<ProcessStatus, StatusMeta> = {\n running: { label: '审批中', tone: 'brand' },\n waiting: { label: '等待中', tone: 'neutral' },\n exception: { label: '流程异常', tone: 'danger' },\n completed: { label: '已完成', tone: 'success' },\n terminated: { label: '已拒绝', tone: 'danger' },\n withdrawn: { label: '已撤销', tone: 'neutral' },\n pending: { label: '待处理', tone: 'brand' },\n cancelled: { label: '已取消', tone: 'neutral' },\n};\n\n/** 任务状态元映射 */\nexport const TASK_STATUS_META: Record<TaskStatus, StatusMeta> = {\n pending: { label: '待处理', tone: 'brand' },\n approved: { label: '已同意', tone: 'success' },\n rejected: { label: '已拒绝', tone: 'danger' },\n returned: { label: '已退回', tone: 'warning' },\n suspended: { label: '已挂起', tone: 'neutral' },\n cancelled: { label: '已取消', tone: 'neutral' },\n copied: { label: '已抄送', tone: 'neutral' },\n waiting: { label: '等待中', tone: 'neutral' },\n simulated: { label: '未开始', tone: 'neutral' },\n};\n","import React from 'react';\nimport { Modal, Skeleton, Button } from 'antd';\nimport { CheckCircleOutlined, UserOutlined } from '@ant-design/icons';\nimport type { ProcessRoute } from '../types';\n\nexport interface ProcessPreviewProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n routes: ProcessRoute[];\n loading?: boolean;\n}\n\nexport const ProcessPreview: React.FC<ProcessPreviewProps> = ({\n open,\n onClose,\n onConfirm,\n routes,\n loading = false,\n}) => {\n const routeList = Array.isArray(routes) ? routes : [];\n\n return (\n <Modal\n getContainer={false}\n title=\"流程预览\"\n open={open}\n onCancel={onClose}\n width={520}\n footer={\n <div className=\"flex justify-end gap-3\">\n <Button onClick={onClose}>取消</Button>\n <Button type=\"primary\" onClick={onConfirm} loading={loading}>\n 确认提交\n </Button>\n </div>\n }\n >\n {loading && routeList.length === 0 ? (\n <Skeleton active paragraph={{ rows: 4 }} />\n ) : routeList.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-8\">暂无流程节点</p>\n ) : (\n <div className=\"py-2\">\n {routeList.map((route, index) => {\n const isLast = index === routeList.length - 1;\n return (\n <div key={route.nodeId} className=\"flex gap-3\">\n {/* Left timeline */}\n <div className=\"flex flex-col items-center\">\n <div className=\"w-6 h-6 rounded-full bg-blue-50 border-2 border-blue-400 flex items-center justify-center flex-shrink-0\">\n <CheckCircleOutlined className=\"text-blue-500 text-xs\" />\n </div>\n {!isLast && <div className=\"w-0.5 flex-1 bg-blue-200 mt-1\" />}\n </div>\n\n {/* Right content */}\n <div className={`flex-1 ${isLast ? 'pb-0' : 'pb-5'}`}>\n <div className=\"text-sm font-medium text-gray-900\">{route.nodeName}</div>\n {route.assignees && route.assignees.length > 0 && (\n <div className=\"mt-1 flex items-center gap-1.5 flex-wrap\">\n <UserOutlined className=\"text-gray-400 text-xs\" />\n {route.assignees.map((assignee) => (\n <span\n key={assignee.id}\n className=\"text-xs text-gray-500 bg-gray-100 px-1.5 py-0.5 rounded\"\n >\n {assignee.name}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </Modal>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Button, Empty, Modal, Select, Space, Tag, Typography, message } from 'antd';\nimport type {\n FormRuntimeApi,\n InitiatorSelectCandidate,\n InitiatorSelectRequirement,\n} from '../types';\nimport { getInitiatorSelectCandidates } from '../core/processApi';\nimport { UserPicker } from '../fields/shared/UserPicker';\n\nexport type SelectedApproverMap = Record<string, InitiatorSelectCandidate[]>;\n\ninterface InitiatorApproverSelectorProps {\n open: boolean;\n formUuid: string;\n appType: string;\n api: FormRuntimeApi;\n requirements: InitiatorSelectRequirement[];\n value?: SelectedApproverMap;\n onOk: (selected: SelectedApproverMap) => void;\n onCancel: () => void;\n}\n\ninterface RequirementSelectProps {\n open: boolean;\n formUuid: string;\n appType: string;\n api: FormRuntimeApi;\n requirement: InitiatorSelectRequirement;\n selectedUsers: InitiatorSelectCandidate[];\n onChange: (nodeId: string, users: InitiatorSelectCandidate[]) => void;\n}\n\nconst scopeText: Record<InitiatorSelectRequirement['scope'], string> = {\n all: '全部成员',\n members: '指定成员',\n roles: '指定角色',\n};\n\nconst EMPTY_SELECTED_USERS: InitiatorSelectCandidate[] = [];\nconst EMPTY_SELECTED_MAP: SelectedApproverMap = {};\n\nconst getUserId = (user: any) =>\n String(user?.id ?? user?.userId ?? user?.userid ?? user?.value ?? '').trim();\n\nconst normalizeCandidate = (user: any): InitiatorSelectCandidate | null => {\n const id = getUserId(user);\n if (!id) return null;\n return {\n ...user,\n id,\n name: String(user?.name ?? user?.label ?? user?.username ?? id),\n };\n};\n\nconst getUserLabel = (user: InitiatorSelectCandidate) => user.name || user.username || user.id;\n\nconst mergeUsers = (current: InitiatorSelectCandidate[], incoming: InitiatorSelectCandidate[]) => {\n const map = new Map<string, InitiatorSelectCandidate>();\n current.forEach((user) => map.set(user.id, user));\n incoming.forEach((user) => map.set(user.id, user));\n return Array.from(map.values());\n};\n\nconst RequirementSelect: React.FC<RequirementSelectProps> = ({\n open,\n formUuid,\n appType,\n api,\n requirement,\n selectedUsers,\n onChange,\n}) => {\n const [pickerOpen, setPickerOpen] = useState(false);\n const initialCandidates = useMemo(\n () =>\n (requirement.candidateUsers || [])\n .map(normalizeCandidate)\n .filter(Boolean) as InitiatorSelectCandidate[],\n [requirement.candidateUsers],\n );\n const [optionsSource, setOptionsSource] = useState<InitiatorSelectCandidate[]>(initialCandidates);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n setOptionsSource((current) =>\n mergeUsers(initialCandidates, mergeUsers(current, selectedUsers)),\n );\n }, [initialCandidates, selectedUsers]);\n\n const loadCandidates = useCallback(\n async (keyword?: string) => {\n setLoading(true);\n try {\n const result = await getInitiatorSelectCandidates(api.request, {\n formUuid,\n appType,\n nodeId: requirement.nodeId,\n keyword,\n page: 1,\n pageSize: 50,\n });\n setOptionsSource((current) =>\n mergeUsers(\n current,\n result.items.map(normalizeCandidate).filter(Boolean) as InitiatorSelectCandidate[],\n ),\n );\n } catch {\n if (requirement.scope === 'all' && typeof api.getUserList === 'function') {\n const users = await api.getUserList(\n keyword ? { name: keyword, username: keyword } : undefined,\n );\n setOptionsSource((current) =>\n mergeUsers(\n current,\n users.map(normalizeCandidate).filter(Boolean) as InitiatorSelectCandidate[],\n ),\n );\n } else if (initialCandidates.length === 0) {\n message.error('加载审批候选人失败');\n }\n } finally {\n setLoading(false);\n }\n },\n [api, appType, formUuid, initialCandidates.length, requirement.nodeId, requirement.scope],\n );\n\n useEffect(() => {\n if (requirement.scope !== 'all' && open && formUuid && appType && requirement.nodeId) {\n void loadCandidates();\n }\n }, [appType, formUuid, loadCandidates, open, requirement.nodeId, requirement.scope]);\n\n const options = useMemo(\n () =>\n optionsSource.map((user) => ({\n value: user.id,\n label: getUserLabel(user),\n })),\n [optionsSource],\n );\n\n if (requirement.scope === 'all') {\n return (\n <div className=\"rounded-lg border border-ant-border-secondary bg-ant-bg-container p-3\">\n <div className=\"mb-2 flex items-start justify-between gap-3\">\n <div>\n <Typography.Text strong>{requirement.nodeName}</Typography.Text>\n <div className=\"mt-1 text-xs text-ant-color-text-tertiary\">\n 选择范围:{scopeText[requirement.scope] || '全部成员'}\n </div>\n </div>\n <Button onClick={() => setPickerOpen(true)}>\n {selectedUsers.length > 0 ? '重新选择成员' : '选择成员'}\n </Button>\n </div>\n {selectedUsers.length > 0 ? (\n <Space size={[4, 4]} wrap className=\"mt-2\">\n {selectedUsers.map((user) => (\n <Tag key={user.id}>{getUserLabel(user)}</Tag>\n ))}\n </Space>\n ) : (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"请从组织架构选择成员\" />\n )}\n <UserPicker\n api={api}\n open={pickerOpen}\n onOpenChange={setPickerOpen}\n multiple\n value={selectedUsers}\n loadAllWhenNoDepartment={false}\n onConfirm={(items) => {\n onChange(\n requirement.nodeId,\n items.map(normalizeCandidate).filter(Boolean) as InitiatorSelectCandidate[],\n );\n }}\n onCancel={() => undefined}\n />\n </div>\n );\n }\n\n return (\n <div className=\"rounded-lg border border-ant-border-secondary bg-ant-bg-container p-3\">\n <div className=\"mb-2\">\n <Typography.Text strong>{requirement.nodeName}</Typography.Text>\n <div className=\"mt-1 text-xs text-ant-color-text-tertiary\">\n 选择范围:{scopeText[requirement.scope] || '全部成员'}\n </div>\n </div>\n <Select\n mode=\"multiple\"\n className=\"w-full\"\n allowClear\n showSearch\n filterOption={false}\n placeholder=\"请选择审批人\"\n loading={loading}\n value={selectedUsers.map((user) => user.id)}\n options={options}\n notFoundContent={loading ? '加载中...' : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />}\n onSearch={(keyword) => {\n void loadCandidates(keyword);\n }}\n onChange={(ids: string[]) => {\n const next = ids\n .map(\n (id) =>\n optionsSource.find((user) => user.id === id) ||\n selectedUsers.find((user) => user.id === id),\n )\n .filter(Boolean) as InitiatorSelectCandidate[];\n onChange(requirement.nodeId, next);\n }}\n />\n {selectedUsers.length > 0 ? (\n <Space size={[4, 4]} wrap className=\"mt-2\">\n {selectedUsers.map((user) => (\n <Tag key={user.id}>{getUserLabel(user)}</Tag>\n ))}\n </Space>\n ) : null}\n </div>\n );\n};\n\nexport const InitiatorApproverSelector: React.FC<InitiatorApproverSelectorProps> = ({\n open,\n formUuid,\n appType,\n api,\n requirements,\n value,\n onOk,\n onCancel,\n}) => {\n const [selected, setSelected] = useState<SelectedApproverMap>({});\n const wasOpenRef = useRef(false);\n\n useEffect(() => {\n if (open && !wasOpenRef.current) {\n setSelected(value || EMPTY_SELECTED_MAP);\n }\n wasOpenRef.current = open;\n }, [open, value]);\n\n const missingNodes = requirements.filter(\n (requirement) => !(selected[requirement.nodeId] || []).length,\n );\n\n return (\n <Modal\n getContainer={false}\n title=\"选择审批人\"\n open={open}\n width={760}\n okText=\"确定\"\n cancelText=\"取消\"\n onCancel={onCancel}\n onOk={() => {\n if (missingNodes.length > 0) {\n message.error('请为所有发起人自选节点选择审批人');\n return;\n }\n onOk(selected);\n }}\n destroyOnHidden\n >\n <Space direction=\"vertical\" size={12} className=\"w-full\">\n {requirements.map((requirement) => (\n <RequirementSelect\n key={requirement.nodeId}\n open={open}\n formUuid={formUuid}\n appType={appType}\n api={api}\n requirement={requirement}\n selectedUsers={selected[requirement.nodeId] ?? EMPTY_SELECTED_USERS}\n onChange={(nodeId, users) =>\n setSelected((current) => ({ ...current, [nodeId]: users }))\n }\n />\n ))}\n </Space>\n </Modal>\n );\n};\n\nexport default InitiatorApproverSelector;\n","import type {\n ApprovalPermission,\n ApproveParams,\n ChangeRecordListResponse,\n ChangeRecordQueryParams,\n FormDataDeleteParams,\n FormDataQueryParams,\n FormInstanceData,\n FormRuntimeApi,\n InitiatorSelectCandidate,\n InitiatorSelectRequirement,\n PreviewParams,\n ProcessBasicInfo,\n ProcessDefinition,\n ProcessRoute,\n ProcessTask,\n ReturnableNode,\n ReturnableNodeResult,\n ReturnParams,\n ResubmitParams,\n RuntimeResponse,\n SaveTaskParams,\n TransferParams,\n ViewPermissionQueryParams,\n ViewPermissionSummary,\n WithdrawParams,\n} from '../types';\n\n// ============ 流程基础 ============\n\nconst hasOwn = (value: object, key: string) => Object.prototype.hasOwnProperty.call(value, key);\n\nconst isRuntimeEnvelope = (value: any): value is RuntimeResponse<any> =>\n !!value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n (hasOwn(value, 'code') ||\n hasOwn(value, 'success') ||\n hasOwn(value, 'data') ||\n hasOwn(value, 'result') ||\n hasOwn(value, 'message') ||\n hasOwn(value, 'error'));\n\nconst isSuccessCode = (code: unknown) => {\n if (code === undefined || code === null || code === '') return true;\n const normalized = Number(code);\n return Number.isFinite(normalized) ? normalized === 0 || normalized === 200 : false;\n};\n\nconst unwrapRuntimeResponse = <T = any>(response: RuntimeResponse<T> | any): T => {\n if (!isRuntimeEnvelope(response)) return response as T;\n\n if (response.success === false || !isSuccessCode(response.code)) {\n throw new Error(response.message || response.error || '请求失败');\n }\n\n if (hasOwn(response, 'data')) return response.data as T;\n if (hasOwn(response, 'result')) return response.result as T;\n return response as T;\n};\n\nconst withInitiatorSelectedApprovers = <T extends Record<string, any>>(\n payload: T,\n initiatorSelectedApprovers?: Record<string, string[]>,\n): T & {\n selectedApprovers?: Record<string, string[]>;\n initiatorSelectedApprovers?: Record<string, string[]>;\n} => {\n if (!initiatorSelectedApprovers) return payload;\n return {\n ...payload,\n selectedApprovers: initiatorSelectedApprovers,\n initiatorSelectedApprovers,\n };\n};\n\nconst normalizeProcessTask = (value: any): ProcessTask => {\n const taskId = value?.taskId ?? value?.id ?? value?.task_id ?? '';\n return {\n ...value,\n id: value?.id ?? taskId,\n taskId,\n nodeId: value?.nodeId ?? value?.node_id ?? '',\n nodeType: value?.nodeType ?? value?.node_type ?? 'approval',\n nodeName: value?.nodeName ?? value?.title ?? value?.name ?? value?.nodeId ?? '审批节点',\n status: value?.status ?? 'pending',\n assigneeId: value?.assigneeId ?? value?.assignee,\n };\n};\n\nconst normalizeProcessTasks = (value: any): ProcessTask[] => {\n if (Array.isArray(value)) return value.map(normalizeProcessTask);\n if (!value || typeof value !== 'object') return [];\n if (Array.isArray(value.tasks)) return value.tasks.map(normalizeProcessTask);\n if (Array.isArray(value.currentTasks)) return value.currentTasks.map(normalizeProcessTask);\n if (Array.isArray(value.list)) return value.list.map(normalizeProcessTask);\n if (Array.isArray(value.items)) return value.items.map(normalizeProcessTask);\n if (Array.isArray(value.records)) return value.records.map(normalizeProcessTask);\n return [];\n};\n\nconst normalizePreviewAssignees = (value: any): Array<{ id: string; name: string }> => {\n if (Array.isArray(value?.assignees)) {\n return value.assignees\n .map((assignee: any) => {\n if (typeof assignee === 'string' || typeof assignee === 'number') {\n const id = String(assignee);\n return { id, name: id };\n }\n const id = String(\n assignee?.id ?? assignee?.userId ?? assignee?.userid ?? assignee?.assignee ?? '',\n );\n if (!id) return null;\n return {\n id,\n name: String(assignee?.name ?? assignee?.label ?? assignee?.userName ?? id),\n };\n })\n .filter(Boolean) as Array<{ id: string; name: string }>;\n }\n\n const assigneeId = value?.assignee ?? value?.assigneeId;\n if (assigneeId) {\n const id = String(assigneeId);\n return [\n {\n id,\n name: String(value?.assigneeName ?? value?.assignee_name ?? value?.userName ?? id),\n },\n ];\n }\n\n const ids = Array.isArray(value?.allAssignees) ? value.allAssignees : [];\n const names = Array.isArray(value?.allAssigneeNames) ? value.allAssigneeNames : [];\n\n return ids\n .map((id: any, index: number) => {\n const normalizedId = String(id ?? '');\n if (!normalizedId) return null;\n return {\n id: normalizedId,\n name: String(names[index] ?? (ids.length === 1 ? value?.assigneeName : undefined) ?? id),\n };\n })\n .filter(Boolean) as Array<{ id: string; name: string }>;\n};\n\nconst normalizePreviewRoutes = (value: any): ProcessRoute[] => {\n const raw = value?.data ?? value?.result ?? value;\n const list = Array.isArray(raw)\n ? raw\n : Array.isArray(raw?.routes)\n ? raw.routes\n : Array.isArray(raw?.tasks)\n ? raw.tasks\n : Array.isArray(raw?.nodes)\n ? raw.nodes\n : Array.isArray(raw?.items)\n ? raw.items\n : [];\n\n return list.map((route: any, index: number) => ({\n ...route,\n nodeId: String(route?.nodeId ?? route?.node_id ?? route?.id ?? `preview-${index}`),\n nodeName: String(\n route?.nodeName ?? route?.title ?? route?.name ?? route?.nodeId ?? `流程节点 ${index + 1}`,\n ),\n nodeType: route?.nodeType ?? route?.node_type ?? route?.type ?? 'approval',\n assignees: normalizePreviewAssignees(route),\n }));\n};\n\nconst normalizeInitiatorSelectCandidate = (value: any): InitiatorSelectCandidate => {\n const id = String(value?.id ?? value?.userId ?? value?.userid ?? value?.value ?? '');\n return {\n ...value,\n id,\n name: String(value?.name ?? value?.label ?? value?.username ?? id),\n };\n};\n\nconst normalizeInitiatorSelectRequirements = (value: any): InitiatorSelectRequirement[] => {\n const raw = value?.data ?? value?.result ?? value;\n const nodes = Array.isArray(raw?.nodes) ? raw.nodes : Array.isArray(raw) ? raw : [];\n return nodes\n .map((node: any) => ({\n ...node,\n nodeId: String(node?.nodeId ?? node?.id ?? ''),\n nodeName: String(node?.nodeName ?? node?.name ?? node?.title ?? node?.nodeId ?? ''),\n scope: node?.scope ?? node?.initiatorSelectScope ?? 'all',\n approvals: Array.isArray(node?.approvals) ? node.approvals : [],\n approvalNames: Array.isArray(node?.approvalNames) ? node.approvalNames : [],\n candidateUsers: Array.isArray(node?.candidateUsers)\n ? node.candidateUsers.map(normalizeInitiatorSelectCandidate).filter((user: any) => user.id)\n : undefined,\n }))\n .filter((node: InitiatorSelectRequirement) => node.nodeId);\n};\n\nconst normalizeProcessBasic = (value: any): ProcessBasicInfo => {\n const raw = value ?? {};\n const instance = raw.instance ?? raw;\n const currentTask = raw.currentTask ? normalizeProcessTask(raw.currentTask) : undefined;\n\n return {\n ...raw,\n instanceId: raw.instanceId ?? raw.id ?? instance.formInstanceId ?? instance.id,\n processStatus: raw.processStatus ?? raw.status ?? instance.processStatus ?? instance.status,\n formUuid: raw.formUuid ?? instance.formUuid ?? instance.definition?.formUuid,\n appType: raw.appType ?? instance.appType ?? instance.definition?.appType,\n title: raw.title ?? instance.title ?? instance.instanceTitle,\n originatorId: raw.originatorId ?? instance.originatorId ?? instance.startedBy,\n originatorName: raw.originatorName ?? instance.originatorName ?? instance.startedByName,\n originatorDepartment:\n raw.originatorDepartment ?? instance.originatorDepartment ?? instance.startedDepartmentName,\n createdAt: raw.createdAt ?? instance.createdAt ?? instance.startedAt,\n currentTask,\n isExecuting: raw.isExecuting ?? instance.isExecuting,\n };\n};\n\nconst normalizeApprovalPermission = (value: any): ApprovalPermission => {\n const raw = value ?? {};\n const currentTasks = normalizeProcessTasks(raw.currentTasks);\n const hasPermission = Boolean(raw.hasPermission ?? raw.isApprover ?? currentTasks.length > 0);\n\n return {\n ...raw,\n hasPermission,\n isApprover: Boolean(raw.isApprover ?? hasPermission),\n canUndo: Boolean(raw.canUndo ?? raw.canWithdraw),\n currentTasks,\n };\n};\n\nconst normalizeReturnableNodes = (value: any): ReturnableNode[] => {\n const raw = value?.candidates || value?.nodes || value?.data || value;\n if (!Array.isArray(raw)) return [];\n return raw.map((node) => ({\n ...node,\n nodeId: node?.nodeId || node?.id || '',\n nodeName: node?.nodeName || node?.name || node?.title || node?.id || '',\n }));\n};\n\nconst normalizeReturnableNodeResult = (value: any): ReturnableNodeResult => {\n const raw = value?.data || value || {};\n return {\n nodes: normalizeReturnableNodes(raw),\n policy: raw?.policy || null,\n };\n};\n\nconst normalizeProcessDefinition = (value: any): ProcessDefinition => {\n const raw = value?.definitionJson || value?.viewJson || value || {};\n const nodes = Array.isArray(raw.nodes) ? raw.nodes : [];\n const startNode = nodes.find((node: any) => node?.type === 'start' || node?.nodeType === 'start');\n return {\n ...raw,\n processId: raw.processId || raw.id || value?.id || '',\n flowConfig: raw.flowConfig || value?.flowConfig || {},\n startNodeId: raw.startNodeId || startNode?.id || value?.startNodeId,\n };\n};\n\n/** 获取流程基本信息 */\nexport async function getProcessBasic(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ProcessBasicInfo> {\n const response = (await request<ProcessBasicInfo>({\n url: `/workflow/instance/${formInstId}/basic`,\n method: 'get',\n })) as RuntimeResponse<ProcessBasicInfo>;\n return normalizeProcessBasic(unwrapRuntimeResponse(response));\n}\n\n/** 获取流程进度(任务列表) */\nexport async function getProcessProgress(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ProcessTask[]> {\n const response = (await request<any>({\n url: `/workflow/instance/${formInstId}/all-tasks`,\n method: 'get',\n })) as RuntimeResponse<any>;\n return normalizeProcessTasks(unwrapRuntimeResponse(response));\n}\n\n/** 检查当前用户审批权限 */\nexport async function checkUserApproval(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ApprovalPermission> {\n const response = (await request<ApprovalPermission>({\n url: `/workflow/instance/${formInstId}/permission`,\n method: 'get',\n })) as RuntimeResponse<ApprovalPermission>;\n return normalizeApprovalPermission(unwrapRuntimeResponse(response));\n}\n\n// ============ 审批操作 ============\n\n/** 审批(同意/拒绝) */\nexport async function handleApproval(\n request: FormRuntimeApi['request'],\n params: ApproveParams,\n): Promise<any> {\n const response = (await request<any>({\n url: '/workflow/approve',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 撤销流程 */\nexport async function withdrawProcess(\n request: FormRuntimeApi['request'],\n params: WithdrawParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/instance/${params.instanceId}/withdraw`,\n method: 'post',\n data: { reason: params.reason },\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 转交任务 */\nexport async function transferTask(\n request: FormRuntimeApi['request'],\n params: TransferParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/transfer`,\n method: 'post',\n data: { newAssignee: params.newAssignee, reason: params.reason },\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 退回任务 */\nexport async function returnTask(\n request: FormRuntimeApi['request'],\n params: ReturnParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/return`,\n method: 'post',\n data: { targetNodeId: params.targetNodeId, reason: params.reason },\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 重新提交任务 */\nexport async function resubmitTask(\n request: FormRuntimeApi['request'],\n params: ResubmitParams,\n): Promise<any> {\n const initiatorSelectedApprovers = params.initiatorSelectedApprovers || params.selectedApprovers;\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/resubmit`,\n method: 'post',\n data: withInitiatorSelectedApprovers(\n {\n formUuid: params.formUuid,\n appType: params.appType,\n updateFormDataJson: params.updateFormDataJson,\n comments: params.comments,\n },\n initiatorSelectedApprovers,\n ),\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 暂存任务 */\nexport async function saveTask(\n request: FormRuntimeApi['request'],\n params: SaveTaskParams,\n): Promise<any> {\n const response = (await request<any>({\n url: '/workflow/task/save',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 获取可退回节点 */\nexport async function getReturnableNodes(\n request: FormRuntimeApi['request'],\n taskId: string,\n): Promise<ReturnableNode[]> {\n const result = await getReturnableNodeResult(request, taskId);\n return result.nodes;\n}\n\n/** 获取可退回节点和退回策略 */\nexport async function getReturnableNodeResult(\n request: FormRuntimeApi['request'],\n taskId: string,\n): Promise<ReturnableNodeResult> {\n const response = (await request<ReturnableNode[]>({\n url: `/workflow/task/${taskId}/returnable-nodes`,\n method: 'get',\n })) as RuntimeResponse<ReturnableNode[]>;\n return normalizeReturnableNodeResult(unwrapRuntimeResponse(response));\n}\n\n// ============ 流程预览和定义 ============\n\n/** 预览流程路由 */\nexport async function previewProcess(\n request: FormRuntimeApi['request'],\n params: PreviewParams,\n): Promise<ProcessRoute[]> {\n const initiatorSelectedApprovers = params.initiatorSelectedApprovers || params.selectedApprovers;\n const response = (await request<ProcessRoute[]>({\n url: '/workflow/preview',\n method: 'post',\n data: withInitiatorSelectedApprovers(params, initiatorSelectedApprovers),\n })) as RuntimeResponse<ProcessRoute[]>;\n return normalizePreviewRoutes(unwrapRuntimeResponse(response));\n}\n\nexport async function getInitiatorSelectRequirements(\n request: FormRuntimeApi['request'],\n params: {\n formUuid: string;\n appType: string;\n data: Record<string, any>;\n submissionDepartmentId?: string;\n },\n): Promise<InitiatorSelectRequirement[]> {\n const response = (await request<any>({\n url: '/workflow/initiator-approver/requirements',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return normalizeInitiatorSelectRequirements(unwrapRuntimeResponse(response));\n}\n\nexport async function getResubmitInitiatorSelectRequirements(\n request: FormRuntimeApi['request'],\n params: {\n taskId: string;\n formUuid: string;\n appType: string;\n data: Record<string, any>;\n },\n): Promise<InitiatorSelectRequirement[]> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/resubmit/initiator-approver/requirements`,\n method: 'post',\n data: {\n formUuid: params.formUuid,\n appType: params.appType,\n data: params.data,\n },\n })) as RuntimeResponse<any>;\n return normalizeInitiatorSelectRequirements(unwrapRuntimeResponse(response));\n}\n\nexport async function getInitiatorSelectCandidates(\n request: FormRuntimeApi['request'],\n params: {\n formUuid: string;\n appType: string;\n nodeId: string;\n page?: number;\n pageSize?: number;\n keyword?: string;\n departmentId?: string;\n },\n): Promise<{\n items: InitiatorSelectCandidate[];\n total: number;\n page: number;\n pageSize: number;\n}> {\n const response = (await request<any>({\n url: '/workflow/initiator-select/candidates',\n method: 'get',\n params,\n })) as RuntimeResponse<any>;\n const raw = unwrapRuntimeResponse(response) || {};\n const items = Array.isArray(raw.items) ? raw.items : [];\n return {\n items: items\n .map(normalizeInitiatorSelectCandidate)\n .filter((user: InitiatorSelectCandidate) => user.id),\n total: Number(raw.total || items.length || 0),\n page: Number(raw.page || params.page || 1),\n pageSize: Number(raw.pageSize || params.pageSize || 50),\n };\n}\n\n/** 获取流程定义 */\nexport async function getProcessDefinition(\n request: FormRuntimeApi['request'],\n formUuid: string,\n): Promise<ProcessDefinition> {\n const response = (await request<ProcessDefinition>({\n url: '/workflow/definition/form',\n method: 'get',\n params: { formUuid },\n })) as RuntimeResponse<ProcessDefinition>;\n return normalizeProcessDefinition(unwrapRuntimeResponse(response));\n}\n\n/** 触发回调等待任务 */\nexport async function triggerCallbackTask(\n request: FormRuntimeApi['request'],\n params: { taskId: string; payload?: Record<string, any> },\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/callback`,\n method: 'post',\n data: params.payload || {},\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n// ============ 表单详情 ============\n\n/** 获取表单实例数据 */\nexport async function getFormData(\n request: FormRuntimeApi['request'],\n params: FormDataQueryParams,\n): Promise<FormInstanceData> {\n const response = (await request<FormInstanceData>({\n url: '/form/queryFormDataByFormInstanceId',\n method: 'get',\n params,\n })) as RuntimeResponse<FormInstanceData>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 删除表单数据 */\nexport async function deleteFormData(\n request: FormRuntimeApi['request'],\n params: FormDataDeleteParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/${params.appType}/v1/form/deleteFormData.json`,\n method: 'post',\n data: {\n appType: params.appType,\n formUuid: params.formUuid,\n formInstId: params.formInstanceId,\n },\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 获取表单变更记录 */\nexport async function getChangeRecords(\n request: FormRuntimeApi['request'],\n params: ChangeRecordQueryParams,\n): Promise<ChangeRecordListResponse> {\n const response = (await request<ChangeRecordListResponse>({\n url: '/form/getFormDataChangeRecords',\n method: 'get',\n params,\n })) as RuntimeResponse<ChangeRecordListResponse>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 获取视图权限摘要 */\nexport async function getViewPermission(\n request: FormRuntimeApi['request'],\n params: ViewPermissionQueryParams,\n): Promise<ViewPermissionSummary> {\n const response = (await request<ViewPermissionSummary>({\n url: '/permission/form-group/view-permissions',\n method: 'get',\n params,\n })) as RuntimeResponse<ViewPermissionSummary>;\n return unwrapRuntimeResponse(response);\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n Avatar,\n Button,\n Checkbox,\n Empty,\n Input,\n List,\n Modal,\n Pagination,\n Space,\n Spin,\n Tag,\n Tree,\n} from 'antd';\nimport { SearchOutlined, TeamOutlined, UserOutlined } from '@ant-design/icons';\nimport * as MobileAntd from 'antd-mobile';\nimport type { DepartmentTreeNode, FormRuntimeApi, UserItem } from '../../types';\nimport {\n getDepartmentId,\n getDepartmentName,\n getUserId,\n getUserName,\n normalizeUser,\n} from './fieldFormat';\nimport { useLazyDepartmentTree } from './useLazyDepartmentTree';\n\nconst DEFAULT_MEMBER_PAGE_SIZE = 10;\n\nconst getMobileComponent = (name: string) => {\n try {\n return (MobileAntd as any)[name];\n } catch {\n return undefined;\n }\n};\n\ninterface UserPickerPanelProps {\n api: FormRuntimeApi;\n multiple?: boolean;\n value: UserItem[];\n dataSource?: UserItem[];\n treeData?: DepartmentTreeNode[];\n displaySearch?: boolean;\n loadAllWhenNoDepartment?: boolean;\n onConfirm: (items: UserItem[]) => void;\n onCancel: () => void;\n mobile?: boolean;\n}\n\nfunction normalizeUsers(users?: UserItem[]) {\n return (users || []).map(normalizeUser).filter((user) => getUserId(user));\n}\n\nexport function UserPickerPanel({\n api,\n multiple = true,\n value,\n dataSource,\n treeData,\n displaySearch = true,\n loadAllWhenNoDepartment = true,\n onConfirm,\n onCancel,\n mobile = false,\n}: UserPickerPanelProps) {\n const {\n treeData: deptTreeData,\n treeLoading,\n nodeMap,\n parentMap,\n flatNodes,\n loadChildren,\n } = useLazyDepartmentTree(api, treeData);\n const [departmentKeyword, setDepartmentKeyword] = useState('');\n const [memberKeyword, setMemberKeyword] = useState('');\n const [mobileKeyword, setMobileKeyword] = useState('');\n const [currentDeptId, setCurrentDeptId] = useState('');\n const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);\n const [members, setMembers] = useState<UserItem[]>(() => normalizeUsers(dataSource));\n const [memberPage, setMemberPage] = useState(1);\n const [memberPageSize, setMemberPageSize] = useState(DEFAULT_MEMBER_PAGE_SIZE);\n const [memberTotal, setMemberTotal] = useState(() => normalizeUsers(dataSource).length);\n const [memberReloadKey, setMemberReloadKey] = useState(0);\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<UserItem[]>(() => normalizeUsers(value));\n const selectedIds = selected.map(getUserId);\n const MobileSearchBar = getMobileComponent('SearchBar');\n const activeMemberKeyword = (mobile ? mobileKeyword : memberKeyword).trim();\n const staticUsers = useMemo(() => normalizeUsers(dataSource), [dataSource]);\n const hasStaticUserSource = staticUsers.length > 0;\n\n useEffect(() => {\n if (mobile) return;\n if (currentDeptId || deptTreeData.length === 0) return;\n setExpandedKeys(deptTreeData.map((node) => getDepartmentId(node)));\n if (loadAllWhenNoDepartment) {\n setCurrentDeptId(getDepartmentId(deptTreeData[0]));\n }\n }, [currentDeptId, deptTreeData, loadAllWhenNoDepartment, mobile]);\n\n useEffect(() => {\n setMemberPage(1);\n }, [activeMemberKeyword, currentDeptId, dataSource, mobile]);\n\n const handleDepartmentSelect = useCallback((deptId: string) => {\n const nextDeptId = String(deptId || '');\n setCurrentDeptId(nextDeptId);\n setMemberKeyword('');\n setMemberPage(1);\n setMemberReloadKey((current) => current + 1);\n }, []);\n\n useEffect(() => {\n let active = true;\n const keyword = activeMemberKeyword;\n if (hasStaticUserSource) {\n const lower = keyword.toLowerCase();\n const filtered = staticUsers.filter((user) =>\n keyword ? getUserName(user).toLowerCase().includes(lower) : true,\n );\n const start = (memberPage - 1) * memberPageSize;\n setMembers(filtered.slice(start, start + memberPageSize));\n setMemberTotal(filtered.length);\n setLoading(false);\n return;\n }\n if (!loadAllWhenNoDepartment && !keyword && !currentDeptId) {\n setMembers([]);\n setMemberTotal(0);\n setLoading(false);\n return;\n }\n setLoading(true);\n const timer = setTimeout(\n () => {\n const pageParams = { page: memberPage, pageSize: memberPageSize };\n const request = keyword\n ? api\n .getUserList({\n keyword,\n name: keyword,\n username: keyword,\n ...pageParams,\n })\n .then((users) => ({\n items: users,\n total: Array.isArray(users) ? users.length : 0,\n ...pageParams,\n }))\n : currentDeptId\n ? api.getDepartmentMembersPage\n ? api.getDepartmentMembersPage(currentDeptId, pageParams)\n : api.getDepartmentMembers(currentDeptId).then((users) => ({\n items: users,\n total: users.length,\n ...pageParams,\n }))\n : api.getUserList(pageParams).then((users) => ({\n items: users,\n total: Array.isArray(users) ? users.length : 0,\n ...pageParams,\n }));\n request\n .then((result) => {\n if (!active) return;\n const items = Array.isArray(result) ? result : result.items;\n setMembers(normalizeUsers(items as UserItem[]));\n setMemberTotal(Number(Array.isArray(result) ? result.length : result.total) || 0);\n })\n .catch(() => {\n if (active) {\n setMembers([]);\n setMemberTotal(0);\n }\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n },\n keyword ? 250 : 0,\n );\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [\n activeMemberKeyword,\n api,\n currentDeptId,\n hasStaticUserSource,\n loadAllWhenNoDepartment,\n memberPage,\n memberPageSize,\n memberReloadKey,\n staticUsers,\n ]);\n\n const currentPath = useMemo(() => {\n if (!currentDeptId) return [];\n const path: Array<{ id: string; name: string }> = [];\n let cursor: string | null = currentDeptId;\n while (cursor) {\n const node = nodeMap.get(cursor);\n if (!node) break;\n path.unshift({ id: cursor, name: getDepartmentName(node) });\n cursor = parentMap.get(cursor) ?? null;\n }\n return path;\n }, [currentDeptId, nodeMap, parentMap]);\n\n const mobileDepartments = useMemo(() => {\n const keyword = mobileKeyword.trim().toLowerCase();\n if (keyword) {\n return flatNodes\n .filter((item) => item.name.toLowerCase().includes(keyword))\n .map((item) => item.node);\n }\n if (!currentDeptId) return deptTreeData;\n return nodeMap.get(currentDeptId)?.children || [];\n }, [currentDeptId, deptTreeData, flatNodes, mobileKeyword, nodeMap]);\n\n const toggleUser = (user: UserItem, checked: boolean) => {\n const normalized = normalizeUser(user);\n const id = getUserId(normalized);\n if (!id) return;\n if (multiple) {\n setSelected((prev) => {\n if (checked)\n return prev.some((item) => getUserId(item) === id) ? prev : [...prev, normalized];\n return prev.filter((item) => getUserId(item) !== id);\n });\n return;\n }\n setSelected(checked ? [normalized] : []);\n };\n\n const renderSelected = () => (\n <div className=\"sy-user-picker-selected\">\n <div className=\"sy-org-picker-selected-head\">\n <span>已选 {selected.length} 人</span>\n <button type=\"button\" onClick={() => setSelected([])} disabled={!selected.length}>\n 清空\n </button>\n </div>\n {selected.length ? (\n <div className=\"sy-org-picker-tags\">\n {selected.map((item) => (\n <Tag key={getUserId(item)} closable onClose={() => toggleUser(item, false)}>\n {getUserName(item)}\n </Tag>\n ))}\n </div>\n ) : (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无选择\" />\n )}\n </div>\n );\n\n const renderMemberList = () => (\n <div className=\"sy-user-picker-member-panel\">\n <Spin spinning={loading} wrapperClassName=\"sy-user-picker-member-spin\">\n <div className=\"sy-user-picker-list\">\n <List\n dataSource={members}\n locale={{ emptyText: '暂无成员' }}\n renderItem={(user) => {\n const id = getUserId(user);\n const checked = selectedIds.includes(id);\n return (\n <List.Item key={id}>\n <label className=\"sy-user-picker-row\">\n <Checkbox\n checked={checked}\n onChange={(event) => toggleUser(user, event.target.checked)}\n />\n <Avatar size={36} src={user.avatar} icon={!user.avatar && <UserOutlined />} />\n <span>{getUserName(user)}</span>\n </label>\n </List.Item>\n );\n }}\n />\n </div>\n <div className=\"sy-user-picker-pagination\">\n <span>共 {memberTotal} 人</span>\n <Pagination\n size=\"small\"\n current={memberPage}\n pageSize={memberPageSize}\n total={memberTotal}\n showSizeChanger\n pageSizeOptions={[10, 20, 50, 100]}\n onChange={(page, pageSize) => {\n setMemberPage(page);\n setMemberPageSize(pageSize);\n }}\n />\n </div>\n </Spin>\n </div>\n );\n\n if (mobile) {\n return (\n <div className=\"sy-user-picker sy-user-picker-mobile\">\n <div className=\"sy-org-picker-mobile-head\">\n <button type=\"button\" onClick={onCancel}>\n 取消\n </button>\n <strong>选择成员</strong>\n <button type=\"button\" onClick={() => onConfirm(selected)}>\n 确定\n </button>\n </div>\n {MobileSearchBar ? (\n <MobileSearchBar\n placeholder=\"搜索部门或成员\"\n value={mobileKeyword}\n onChange={setMobileKeyword}\n />\n ) : (\n <input value={mobileKeyword} onChange={(event) => setMobileKeyword(event.target.value)} />\n )}\n <div className=\"sy-org-picker-breadcrumb\">\n <button type=\"button\" onClick={() => handleDepartmentSelect('')}>\n 通讯录\n </button>\n {currentPath.map((item) => (\n <button key={item.id} type=\"button\" onClick={() => handleDepartmentSelect(item.id)}>\n / {item.name}\n </button>\n ))}\n </div>\n <Spin spinning={treeLoading}>\n <List\n dataSource={mobileDepartments}\n locale={{ emptyText: null }}\n renderItem={(node) => {\n const id = getDepartmentId(node);\n return (\n <List.Item\n key={id}\n onClick={async () => {\n await loadChildren(id);\n handleDepartmentSelect(id);\n setMobileKeyword('');\n }}\n >\n <List.Item.Meta avatar={<TeamOutlined />} title={getDepartmentName(node)} />\n </List.Item>\n );\n }}\n />\n </Spin>\n {renderMemberList()}\n {renderSelected()}\n </div>\n );\n }\n\n const lowerDepartmentKeyword = departmentKeyword.trim().toLowerCase();\n const filteredTreeData = lowerDepartmentKeyword\n ? deptTreeData.filter((node) =>\n getDepartmentName(node).toLowerCase().includes(lowerDepartmentKeyword),\n )\n : deptTreeData;\n\n return (\n <div className=\"sy-user-picker\">\n <div className=\"sy-user-picker-main\">\n <div className=\"sy-user-picker-depts\">\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索部门\"\n value={departmentKeyword}\n onChange={(event) => setDepartmentKeyword(event.target.value)}\n />\n <Spin spinning={treeLoading}>\n <Tree\n selectedKeys={currentDeptId ? [currentDeptId] : []}\n expandedKeys={expandedKeys}\n onExpand={setExpandedKeys}\n onSelect={(keys, info: any) =>\n handleDepartmentSelect(String(info?.node?.key || keys[0] || ''))\n }\n loadData={(node) => loadChildren(String(node.key))}\n treeData={filteredTreeData}\n height={460}\n />\n </Spin>\n </div>\n <div className=\"sy-user-picker-members\">\n {displaySearch && (\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索成员\"\n value={memberKeyword}\n onChange={(event) => setMemberKeyword(event.target.value)}\n />\n )}\n {renderMemberList()}\n </div>\n {renderSelected()}\n </div>\n <div className=\"sy-org-picker-footer\">\n <Space>\n <Button onClick={onCancel}>取消</Button>\n <Button type=\"primary\" onClick={() => onConfirm(selected)}>\n 确定\n </Button>\n </Space>\n </div>\n </div>\n );\n}\n\nexport interface UserPickerProps extends Omit<UserPickerPanelProps, 'mobile'> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mobile?: boolean;\n}\n\nexport function UserPicker({\n open,\n onOpenChange,\n mobile,\n onCancel,\n ...panelProps\n}: UserPickerProps) {\n const handleCancel = () => {\n onOpenChange(false);\n onCancel();\n };\n const panel = (\n <UserPickerPanel\n {...panelProps}\n mobile={mobile}\n onCancel={handleCancel}\n onConfirm={(items) => {\n panelProps.onConfirm(items);\n onOpenChange(false);\n }}\n />\n );\n\n if (mobile) {\n const MobilePopup = getMobileComponent('Popup');\n if (!MobilePopup) return open ? panel : null;\n return (\n <MobilePopup\n visible={open}\n onMaskClick={handleCancel}\n destroyOnClose\n bodyStyle={{ height: '90vh' }}\n >\n {panel}\n </MobilePopup>\n );\n }\n\n return (\n <Modal\n title=\"选择成员\"\n open={open}\n onCancel={handleCancel}\n footer={null}\n width=\"min(980px, calc(100vw - 48px))\"\n destroyOnClose\n >\n {panel}\n </Modal>\n );\n}\n","import type { AttachmentItem, DepartmentTreeNode, UserDisplayFormat, UserItem } from '../../types';\n\nexport const EMPTY_TEXT = '--';\n\nexport function createUid(prefix = 'field') {\n return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function getUserId(user: Partial<UserItem> | any): string {\n if (typeof user === 'string' || typeof user === 'number') return String(user).trim();\n return String(user?.id || user?.userId || user?.userid || user?.value || user?.key || '').trim();\n}\n\nexport function getUserName(user: Partial<UserItem> | any): string {\n if (typeof user === 'string' || typeof user === 'number') return String(user).trim();\n return String(\n user?.name || user?.label || user?.title || user?.username || user?.nickname || getUserId(user),\n );\n}\n\nexport function normalizeUser(user: any): UserItem {\n const id = getUserId(user);\n const source = typeof user === 'object' && user !== null ? user : {};\n return {\n ...source,\n id,\n name: getUserName({ ...source, id }),\n };\n}\n\nexport function normalizeUserArray(value: any): UserItem[] {\n const source = Array.isArray(value)\n ? value\n : value === undefined || value === null || value === ''\n ? []\n : [value];\n return source.map(normalizeUser).filter((user) => getUserId(user));\n}\n\nexport function getDepartmentId(node: Partial<DepartmentTreeNode> | any): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node).trim();\n return String(\n node?.id || node?.departmentId || node?.deptId || node?.value || node?.key || '',\n ).trim();\n}\n\nexport function getDepartmentName(node: Partial<DepartmentTreeNode> | any): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node).trim();\n return String(\n node?.name ||\n node?.label ||\n node?.title ||\n node?.deptName ||\n node?.departmentName ||\n getDepartmentId(node),\n );\n}\n\nexport function normalizeDepartmentNode(node: any): DepartmentTreeNode {\n const id = getDepartmentId(node);\n const source = typeof node === 'object' && node !== null ? node : {};\n const name = getDepartmentName({ ...source, id });\n const hasChildren =\n typeof node?.hasChildren === 'boolean'\n ? node.hasChildren\n : Array.isArray(node?.children) && node.children.length > 0;\n const children = Array.isArray(node?.children)\n ? node.children.map((child: any) => normalizeDepartmentNode(child))\n : undefined;\n return {\n ...source,\n id,\n name,\n key: String(node?.key || id),\n title: String(node?.title || name),\n hasChildren,\n isLeaf: typeof node?.isLeaf === 'boolean' ? node.isLeaf : !hasChildren,\n children,\n };\n}\n\nexport function normalizeDepartmentArray(value: any): DepartmentTreeNode[] {\n const source = Array.isArray(value)\n ? value\n : value === undefined || value === null || value === ''\n ? []\n : [value];\n return source.map(normalizeDepartmentNode).filter((dept) => getDepartmentId(dept));\n}\n\nexport function flattenDepartments(nodes: DepartmentTreeNode[]) {\n const result: Array<{ id: string; name: string; node: DepartmentTreeNode }> = [];\n const walk = (items: DepartmentTreeNode[]) => {\n for (const node of items) {\n const id = getDepartmentId(node);\n if (id) result.push({ id, name: getDepartmentName(node), node });\n if (node.children?.length) walk(node.children);\n }\n };\n walk(nodes);\n return result;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function formatUserDisplay(user: UserItem, format?: UserDisplayFormat): string {\n const normalized = normalizeUser(user);\n if (!format || format === 'name') return normalized.name;\n switch (format) {\n case 'nameWithJobNumber':\n return normalized.jobNumber\n ? `${normalized.name}(${normalized.jobNumber})`\n : normalized.name;\n case 'nameWithDepartment':\n return normalized.departments?.[0]?.name\n ? `${normalized.name}(${normalized.departments[0].name})`\n : normalized.name;\n default:\n return normalized.name;\n }\n}\n\n/**\n * 获取部门全路径(从根节点到目标节点)\n */\nexport function getDepartmentFullPath(deptId: string, treeData?: DepartmentTreeNode[]): string {\n if (!treeData) return '';\n const path: string[] = [];\n\n function findPath(nodes: DepartmentTreeNode[], target: string): boolean {\n for (const node of nodes) {\n path.push(getDepartmentName(node));\n if (getDepartmentId(node) === target) return true;\n if (node.children && findPath(node.children, target)) return true;\n path.pop();\n }\n return false;\n }\n\n findPath(treeData, deptId);\n return path.join('/');\n}\n\n/**\n * 过滤部门树,只保留指定部门及其子树\n */\nexport function filterTreeByScope(\n treeData: DepartmentTreeNode[],\n scopeType?: 'all' | 'specified',\n specifiedDepts?: string[],\n): DepartmentTreeNode[] {\n if (!scopeType || scopeType === 'all' || !specifiedDepts?.length) {\n return treeData;\n }\n const specifiedSet = new Set(specifiedDepts);\n\n function filterNodes(nodes: DepartmentTreeNode[]): DepartmentTreeNode[] {\n const result: DepartmentTreeNode[] = [];\n for (const node of nodes) {\n const nodeId = getDepartmentId(node);\n if (specifiedSet.has(nodeId)) {\n // 保留此节点及其全部子树\n result.push(node);\n } else if (node.children?.length) {\n // 递归检查子节点\n const filteredChildren = filterNodes(node.children);\n if (filteredChildren.length > 0) {\n result.push({ ...node, children: filteredChildren });\n }\n }\n }\n return result;\n }\n\n return filterNodes(treeData);\n}\n\nexport function formatFileSize(bytes?: number): string {\n if (!bytes) return '';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let value = bytes;\n let index = 0;\n while (value >= 1024 && index < units.length - 1) {\n value /= 1024;\n index += 1;\n }\n return `${Number(value.toFixed(value >= 10 || index === 0 ? 0 : 1))} ${units[index]}`;\n}\n\nexport function getFileExtension(fileName?: string): string {\n return (\n String(fileName || '')\n .split('.')\n .pop()\n ?.toLowerCase() || ''\n );\n}\n\nexport function isImageFile(fileName?: string, contentType?: string): boolean {\n return (\n String(contentType || '').startsWith('image/') ||\n ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp'].includes(getFileExtension(fileName))\n );\n}\n\nexport function getFileCategory(fileName?: string, contentType?: string) {\n const ext = getFileExtension(fileName);\n if (isImageFile(fileName, contentType)) return 'image';\n if (['mp4', 'webm', 'ogg', 'mov', 'm4v'].includes(ext)) return 'video';\n if (['mp3', 'wav', 'aac', 'flac', 'm4a', 'ogg'].includes(ext)) return 'audio';\n if (ext === 'pdf') return 'pdf';\n if (['xls', 'xlsx', 'csv'].includes(ext)) return 'excel';\n if (['doc', 'docx'].includes(ext)) return 'word';\n if (['ppt', 'pptx'].includes(ext)) return 'ppt';\n if (['zip', 'rar', '7z', 'tar', 'gz'].includes(ext)) return 'archive';\n if (['txt', 'json', 'xml', 'log', 'md'].includes(ext)) return 'text';\n if (['js', 'jsx', 'ts', 'tsx', 'html', 'css', 'scss', 'less', 'java', 'py'].includes(ext)) {\n return 'code';\n }\n return 'file';\n}\n\nexport function normalizeAttachmentItem(\n item: any,\n fallback?: Partial<AttachmentItem>,\n): AttachmentItem {\n const id = String(item?.id || item?.uid || item?.objectName || fallback?.id || createUid('file'));\n const name = String(item?.name || item?.originalName || fallback?.name || item?.fileName || id);\n return {\n ...fallback,\n ...item,\n id,\n uid: String(item?.uid || item?.id || fallback?.uid || id),\n name,\n originalName: item?.originalName || fallback?.originalName || name,\n url: String(item?.url || item?.downloadUrl || item?.previewUrl || fallback?.url || ''),\n thumbUrl: item?.thumbUrl || item?.variants?.thumb?.url || fallback?.thumbUrl,\n previewUrl: item?.previewUrl || item?.variants?.preview?.url || fallback?.previewUrl,\n downloadUrl: item?.downloadUrl || fallback?.downloadUrl,\n publicUrl: item?.publicUrl || fallback?.publicUrl,\n status: item?.status || fallback?.status || 'done',\n size: item?.size ?? fallback?.size,\n percent: item?.percent ?? fallback?.percent,\n contentType: item?.contentType || item?.mimeType || fallback?.contentType,\n mimeType: item?.mimeType || item?.contentType || fallback?.mimeType,\n extension: item?.extension || fallback?.extension || getFileExtension(name),\n width: item?.width ?? fallback?.width,\n height: item?.height ?? fallback?.height,\n variants: item?.variants || fallback?.variants,\n };\n}\n\nexport function getAttachmentItemIdentity(item: Partial<AttachmentItem> | any): string {\n return String(item?.uid || item?.id || item?.objectName || item?.url || item?.name || '');\n}\n\nexport function dedupeAttachmentItems(items: AttachmentItem[]): AttachmentItem[] {\n const result: AttachmentItem[] = [];\n const indexes = new Map<string, number>();\n\n for (const item of items) {\n const key = getAttachmentItemIdentity(item);\n if (!key) {\n result.push(item);\n continue;\n }\n\n const existingIndex = indexes.get(key);\n if (existingIndex === undefined) {\n indexes.set(key, result.length);\n result.push(item);\n continue;\n }\n\n result[existingIndex] = {\n ...result[existingIndex],\n ...item,\n };\n }\n\n return result;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { DataNode } from 'antd/es/tree';\nimport type { DepartmentTreeNode, FormRuntimeApi } from '../../types';\nimport {\n flattenDepartments,\n getDepartmentId,\n getDepartmentName,\n normalizeDepartmentNode,\n} from './fieldFormat';\n\nexport interface LazyDepartmentNode extends DataNode, DepartmentTreeNode {\n key: string;\n title: string;\n childrenLoaded?: boolean;\n children?: LazyDepartmentNode[];\n}\n\nexport interface LazyDepartmentFlatNode {\n id: string;\n name: string;\n node: LazyDepartmentNode;\n path: Array<{ id: string; name: string }>;\n}\n\nconst toLazyNode = (node: DepartmentTreeNode): LazyDepartmentNode => {\n const normalized = normalizeDepartmentNode(node);\n const id = getDepartmentId(normalized);\n const name = getDepartmentName(normalized);\n const children = normalized.children?.map(toLazyNode);\n const hasChildren = normalized.hasChildren ?? Boolean(children?.length);\n return {\n ...normalized,\n id,\n name,\n key: id,\n title: name,\n hasChildren,\n isLeaf: normalized.isLeaf ?? !hasChildren,\n childrenLoaded: Boolean(children?.length) || normalized.isLeaf === true || !hasChildren,\n children,\n };\n};\n\nconst replaceChildren = (\n nodes: LazyDepartmentNode[],\n parentId: string,\n children: LazyDepartmentNode[],\n): LazyDepartmentNode[] =>\n nodes.map((node) => {\n if (getDepartmentId(node) === parentId) {\n return {\n ...node,\n children,\n hasChildren: children.length > 0,\n isLeaf: children.length === 0,\n childrenLoaded: true,\n };\n }\n return node.children?.length\n ? { ...node, children: replaceChildren(node.children, parentId, children) }\n : node;\n });\n\nfunction buildIndexes(nodes: LazyDepartmentNode[]) {\n const nodeMap = new Map<string, LazyDepartmentNode>();\n const parentMap = new Map<string, string | null>();\n const flatNodes: LazyDepartmentFlatNode[] = [];\n\n const walk = (\n list: LazyDepartmentNode[],\n parentId: string | null,\n path: Array<{ id: string; name: string }>,\n ) => {\n for (const node of list) {\n const id = getDepartmentId(node);\n const name = getDepartmentName(node);\n const nextPath = [...path, { id, name }];\n nodeMap.set(id, node);\n parentMap.set(id, parentId);\n flatNodes.push({ id, name, node, path: nextPath });\n if (node.children?.length) walk(node.children, id, nextPath);\n }\n };\n\n walk(nodes, null, []);\n return { nodeMap, parentMap, flatNodes };\n}\n\nexport function useLazyDepartmentTree(\n api: FormRuntimeApi,\n configuredTreeData?: DepartmentTreeNode[],\n) {\n const [treeData, setTreeDataState] = useState<LazyDepartmentNode[]>(() =>\n (configuredTreeData || []).map(toLazyNode),\n );\n const [treeLoading, setTreeLoading] = useState(false);\n const treeDataRef = useRef(treeData);\n const rootsLoadedRef = useRef(Boolean(configuredTreeData?.length));\n const rootPromiseRef = useRef<Promise<LazyDepartmentNode[]> | null>(null);\n const childPromiseRef = useRef<Record<string, Promise<LazyDepartmentNode[]> | undefined>>({});\n\n const setTreeData = useCallback(\n (next: LazyDepartmentNode[] | ((prev: LazyDepartmentNode[]) => LazyDepartmentNode[])) => {\n const resolved = typeof next === 'function' ? next(treeDataRef.current) : next;\n treeDataRef.current = resolved;\n setTreeDataState(resolved);\n return resolved;\n },\n [],\n );\n\n useEffect(() => {\n if (!configuredTreeData) return;\n const next = configuredTreeData.map(toLazyNode);\n rootsLoadedRef.current = next.length > 0;\n setTreeData(next);\n }, [configuredTreeData, setTreeData]);\n\n const loadRootDepartments = useCallback(async () => {\n if (rootsLoadedRef.current) return treeDataRef.current;\n if (rootPromiseRef.current) return rootPromiseRef.current;\n setTreeLoading(true);\n const promise = api\n .getDepartmentRoots()\n .then((nodes) => {\n const next = (nodes || []).map((node) => toLazyNode(node as DepartmentTreeNode));\n rootsLoadedRef.current = true;\n setTreeData(next);\n return next;\n })\n .finally(() => {\n rootPromiseRef.current = null;\n setTreeLoading(false);\n });\n rootPromiseRef.current = promise;\n return promise;\n }, [api, setTreeData]);\n\n const loadChildren = useCallback(\n async (parentId: string) => {\n const id = String(parentId || '');\n if (!id) return [];\n const current = flattenDepartments(treeDataRef.current).find((item) => item.id === id)\n ?.node as LazyDepartmentNode | undefined;\n if (!current || current.childrenLoaded || current.isLeaf || current.hasChildren === false) {\n return current?.children || [];\n }\n if (childPromiseRef.current[id]) return childPromiseRef.current[id];\n const promise = api\n .getDepartmentChildren(id)\n .then((nodes) => {\n const children = (nodes || []).map((node) => toLazyNode(node as DepartmentTreeNode));\n setTreeData((prev) => replaceChildren(prev, id, children));\n return children;\n })\n .finally(() => {\n delete childPromiseRef.current[id];\n });\n childPromiseRef.current[id] = promise;\n return promise;\n },\n [api, setTreeData],\n );\n\n const indexes = useMemo(() => buildIndexes(treeData), [treeData]);\n\n useEffect(() => {\n void loadRootDepartments();\n }, [loadRootDepartments]);\n\n return {\n treeData,\n treeLoading,\n ...indexes,\n loadRootDepartments,\n loadChildren,\n };\n}\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport { createBrowserPageContext } from \"../host/browserHost\"\nimport { createBoundFetch } from \"../core/fetch\"\nimport { PageProvider } from \"./provider\"\n\nimport type {\n PageContext,\n PageInfo,\n PageMessageApi,\n PageModalApi,\n PageNavigationApi,\n PageQueryValue,\n PageRouteInfo,\n} from \"../core/types\"\n\nexport type RuntimeErrorType =\n | \"unauthenticated\"\n | \"forbidden\"\n | \"network\"\n | \"unknown\"\n\nexport type RuntimeRequestError = Error & {\n type?: RuntimeErrorType\n status?: number\n code?: number | string\n payload?: unknown\n}\n\nexport interface RuntimeErrorSnapshot {\n type: RuntimeErrorType\n status?: number\n code?: number | string\n message: string\n payload?: unknown\n}\n\nexport class RuntimeHttpError extends Error {\n type: RuntimeErrorType\n status?: number\n code?: number | string\n payload?: unknown\n\n constructor(snapshot: RuntimeErrorSnapshot) {\n super(snapshot.message)\n this.name = \"RuntimeHttpError\"\n this.type = snapshot.type\n this.status = snapshot.status\n this.code = snapshot.code\n this.payload = snapshot.payload\n }\n}\n\nexport interface RuntimeMenuItem {\n id: string\n name: string\n resourceCode?: string | null\n routeCode?: string | null\n path?: string | null\n type?: string\n formUuid?: string | null\n pageId?: string | null\n parentId?: string | null\n sortOrder?: number\n isHidden?: boolean\n icon?: string | null\n children?: RuntimeMenuItem[]\n [key: string]: unknown\n}\n\nexport interface RuntimePagePermissions {\n appType: string\n hasFullAccess: boolean\n roleCodes: string[]\n roleSource?: string\n menuFormUuids: string[]\n menuCodes: string[]\n routeCodes: string[]\n pathPatterns: string[]\n}\n\nexport interface RuntimeBootstrap {\n appType: string\n app?: Record<string, unknown> | null\n user?: Record<string, unknown> | null\n runtime?: {\n mode?: \"legacy\" | \"react-spa\" | string\n settings?: Record<string, unknown>\n activeReleaseId?: string | null\n activeBuildId?: string | null\n indexUrl?: string | null\n assetBaseUrl?: string | null\n }\n permissions?: RuntimePagePermissions\n menus?: RuntimeMenuItem[]\n servicePrefix?: string\n}\n\nexport interface RouteAccessResult {\n appType: string\n canAccess: boolean\n routeCode?: string\n menuCode?: string\n path?: string\n status?: number\n code?: number | string\n message?: string\n errorType?: RuntimeErrorType\n payload?: unknown\n permissions?: RuntimePagePermissions\n}\n\nexport interface RuntimeRequestState<T> {\n data: T | null\n loading: boolean\n error: RuntimeRequestError | null\n}\n\nexport type RuntimeAuthStatus =\n | \"unknown\"\n | \"authenticated\"\n | \"refreshing\"\n | \"unauthenticated\"\n\nexport interface RuntimeAuthState {\n status: RuntimeAuthStatus\n error?: RuntimeRequestError | null\n refreshedAt?: number\n}\n\nexport interface RuntimeReloadOptions {\n accessToken?: string | null\n accessTokenOptions?: RuntimeAccessTokenOptions\n}\n\nexport interface RuntimeAccessTokenOptions {\n scope?: \"default\" | \"public\"\n path?: string | null\n clearIfToken?: string\n expiresAt?: number\n}\n\nexport interface OpenXiangdaProviderProps {\n appType?: string\n servicePrefix?: string\n fetchImpl?: typeof fetch\n children: React.ReactNode\n}\n\nexport interface OpenXiangdaPageProviderProps {\n children: React.ReactNode\n page?: Partial<PageInfo>\n route?: Partial<PageRouteInfo>\n env?: Record<string, unknown>\n message?: Partial<PageMessageApi>\n modal?: Partial<PageModalApi>\n navigation?: Partial<PageNavigationApi>\n}\n\ninterface OpenXiangdaRuntimeStore extends RuntimeRequestState<RuntimeBootstrap> {\n appType: string\n servicePrefix: string\n fetchImpl: typeof fetch\n baseFetchImpl: typeof fetch\n authState: RuntimeAuthState\n getAuthHeaders: () => HeadersInit\n reload: (options?: RuntimeReloadOptions) => Promise<void>\n setAccessToken: (\n accessToken?: string | null,\n options?: RuntimeAccessTokenOptions,\n ) => void\n}\n\ninterface RuntimeAccessTokenState {\n token: string\n scope: \"default\" | \"public\"\n path?: string | null\n expiresAt?: number\n}\n\nconst OpenXiangdaRuntimeContext =\n createContext<OpenXiangdaRuntimeStore | null>(null)\n\nexport const OpenXiangdaProvider: React.FC<OpenXiangdaProviderProps> = ({\n appType,\n servicePrefix = \"/service\",\n fetchImpl,\n children,\n}) => {\n const resolvedFetch = useMemo(() => createBoundFetch(fetchImpl), [fetchImpl])\n const resolvedAppType = useMemo(\n () => appType || resolveAppTypeFromLocation(),\n [appType],\n )\n const [, setAccessTokenState] = useState<RuntimeAccessTokenState | null>(null)\n const [authState, setAuthState] = useState<RuntimeAuthState>({\n status: \"unknown\",\n error: null,\n })\n const accessTokenRef = useRef<RuntimeAccessTokenState | null>(null)\n const refreshRequestRef = useRef<Promise<RuntimeAccessTokenState | null> | null>(null)\n const applyAccessToken = useCallback(\n (\n nextAccessToken?: string | null,\n options: RuntimeAccessTokenOptions = {},\n ): RuntimeAccessTokenState | null => {\n if (\n !nextAccessToken &&\n options.clearIfToken &&\n accessTokenRef.current?.token !== options.clearIfToken\n ) {\n return accessTokenRef.current\n }\n const normalizedAccessToken = nextAccessToken || null\n const nextState = normalizedAccessToken\n ? {\n token: normalizedAccessToken,\n scope: options.scope || \"default\",\n path: options.path || null,\n expiresAt: options.expiresAt,\n }\n : null\n accessTokenRef.current = nextState\n setAccessTokenState(nextState)\n return nextState\n },\n [],\n )\n const setAccessToken = useCallback(\n (\n nextAccessToken?: string | null,\n options: RuntimeAccessTokenOptions = {},\n ) => {\n const previousState = accessTokenRef.current\n const nextState = applyAccessToken(nextAccessToken, options)\n if (nextState) {\n if (nextState.scope === \"public\") return\n setAuthState({\n status: \"authenticated\",\n error: null,\n })\n } else if (previousState?.scope !== \"public\") {\n setAuthState({ status: \"unauthenticated\", error: null })\n }\n },\n [applyAccessToken],\n )\n const markUnauthenticated = useCallback(\n (error: unknown) => {\n const runtimeError = normalizeRuntimeError(error)\n applyAccessToken(null)\n setAuthState({ status: \"unauthenticated\", error: runtimeError })\n },\n [applyAccessToken],\n )\n const refreshAccessToken = useCallback(async () => {\n if (!resolvedAppType) return null\n if (!refreshRequestRef.current) {\n setAuthState(prev => ({ ...prev, status: \"refreshing\", error: null }))\n refreshRequestRef.current = (async () => {\n const response = await resolvedFetch(\n buildServiceUrl(\n servicePrefix,\n `/openxiangda-api/v1/apps/${encodeURIComponent(\n resolvedAppType,\n )}/auth/refresh`,\n ),\n {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n },\n body: \"{}\",\n },\n )\n const payload = await readJsonPayload(response)\n if (isRuntimeEnvelopeFailure(response, payload)) {\n throw createRuntimeHttpError(\n response,\n payload,\n payload?.message || `Token refresh failed: ${response.status}`,\n )\n }\n const data = unwrapRuntimePayload(payload)\n const nextAccessToken =\n getRecordString(data, \"accessToken\") || getRecordString(data, \"token\")\n if (!nextAccessToken) {\n throw createRuntimeError({\n type: \"unauthenticated\",\n status: response.status,\n code: getRecordValue(payload, \"code\") as number | string | undefined,\n message: \"Token refresh response missing accessToken\",\n payload,\n })\n }\n const nextState = applyAccessToken(nextAccessToken, {\n expiresAt: getRecordNumber(data, \"accessTokenExpiresAt\"),\n })\n setAuthState({\n status: \"authenticated\",\n error: null,\n refreshedAt: Date.now(),\n })\n return nextState\n })()\n .catch(error => {\n const runtimeError = normalizeRuntimeError(error)\n applyAccessToken(null)\n setAuthState({ status: \"unauthenticated\", error: runtimeError })\n throw runtimeError\n })\n .finally(() => {\n refreshRequestRef.current = null\n })\n }\n return refreshRequestRef.current\n }, [applyAccessToken, resolvedAppType, resolvedFetch, servicePrefix])\n const authorizedFetch = useMemo(\n () =>\n createAuthorizedFetch({\n appType: resolvedAppType,\n baseFetch: resolvedFetch,\n accessTokenRef,\n markUnauthenticated,\n refreshAccessToken,\n }),\n [markUnauthenticated, refreshAccessToken, resolvedAppType, resolvedFetch],\n )\n const getAuthHeaders = useCallback((): HeadersInit => {\n const state = accessTokenRef.current\n if (!state) return {}\n const token = resolveAccessTokenForCurrentRoute(state)\n return token ? { authorization: `Bearer ${token}` } : {}\n }, [])\n const [state, setState] = useState<RuntimeRequestState<RuntimeBootstrap>>({\n data: null,\n loading: true,\n error: null,\n })\n\n const reload = useCallback(async (options: RuntimeReloadOptions = {}) => {\n if (!resolvedAppType) {\n setState({\n data: null,\n loading: false,\n error: createRuntimeError({\n message: \"appType 不能为空\",\n type: \"unknown\",\n }),\n })\n return\n }\n setState(prev => ({ ...prev, loading: true, error: null }))\n const requestFetch =\n options.accessToken !== undefined\n ? createAccessTokenFetch(\n resolvedFetch,\n createAccessTokenState(\n options.accessToken || null,\n options.accessTokenOptions,\n ),\n )\n : authorizedFetch\n try {\n const response = await requestFetch(\n buildServiceUrl(\n servicePrefix,\n `/openxiangda-api/v1/apps/${encodeURIComponent(\n resolvedAppType,\n )}/runtime/bootstrap`,\n ),\n {\n credentials: \"include\",\n headers: { accept: \"application/json\" },\n },\n )\n const payload = await readJsonPayload(response)\n if (isRuntimeEnvelopeFailure(response, payload)) {\n throw createRuntimeHttpError(\n response,\n payload,\n payload?.message || `Runtime bootstrap failed: ${response.status}`,\n )\n }\n const nextData = payload?.data || null\n setState({\n data: nextData,\n loading: false,\n error: null,\n })\n if (isAuthenticatedBootstrap(nextData)) {\n setAuthState(prev =>\n prev.status === \"authenticated\"\n ? prev\n : { status: \"authenticated\", error: null },\n )\n }\n } catch (error) {\n const runtimeError = normalizeRuntimeError(error)\n setState({\n data: null,\n loading: false,\n error: runtimeError,\n })\n if (runtimeError.type === \"unauthenticated\") {\n setAuthState({ status: \"unauthenticated\", error: runtimeError })\n }\n }\n }, [authorizedFetch, resolvedAppType, resolvedFetch, servicePrefix])\n\n useEffect(() => {\n void reload()\n }, [reload])\n\n const value = useMemo<OpenXiangdaRuntimeStore>(\n () => ({\n ...state,\n appType: resolvedAppType,\n servicePrefix,\n fetchImpl: authorizedFetch,\n baseFetchImpl: resolvedFetch,\n authState,\n getAuthHeaders,\n reload,\n setAccessToken,\n }),\n [\n authorizedFetch,\n getAuthHeaders,\n reload,\n resolvedAppType,\n resolvedFetch,\n servicePrefix,\n state,\n authState,\n ],\n )\n\n return (\n <OpenXiangdaRuntimeContext.Provider value={value}>\n {children}\n </OpenXiangdaRuntimeContext.Provider>\n )\n}\n\nexport const useOpenXiangda = () => {\n const context = useContext(OpenXiangdaRuntimeContext)\n if (!context) {\n throw new Error(\"useOpenXiangda must be used inside OpenXiangdaProvider\")\n }\n return context\n}\n\nexport const useRuntimeBootstrap = () => useOpenXiangda()\n\nexport const OpenXiangdaPageProvider: React.FC<\n OpenXiangdaPageProviderProps\n> = ({\n children,\n page,\n route,\n env,\n message,\n modal,\n navigation,\n}) => {\n const runtime = useOpenXiangda()\n const context = useMemo<PageContext>(() => {\n const bootstrap = runtime.data\n const app = toRuntimeRecord(bootstrap?.app)\n const user = toRuntimeRecord(bootstrap?.user)\n const permissions = bootstrap?.permissions\n const unauthenticatedRuntime =\n !bootstrap?.user && runtime.error?.type === \"unauthenticated\"\n const runtimeGuestUser =\n unauthenticatedRuntime ||\n user.isGuest === true ||\n user.userType === \"guest\" ||\n Boolean(getRecordValue(user, \"publicAccess\"))\n const tenantId =\n toStringValue(getRecordValue(app, \"tenantId\")) ||\n toStringValue(getRecordValue(user, \"tenantId\")) ||\n toStringValue(getRecordValue(app, \"tenantCode\")) ||\n \"\"\n const appType =\n runtime.appType ||\n bootstrap?.appType ||\n toStringValue(getRecordValue(app, \"appType\"))\n const routeInfo = buildBrowserRouteInfo(route)\n\n return createBrowserPageContext(\n {\n app: {\n ...app,\n appType,\n tenantId,\n },\n page: {\n id: routeInfo.pathname || \"react-spa\",\n code: routeInfo.pathname || \"react-spa\",\n name: \"OpenXiangda React SPA\",\n type: \"react-spa\",\n rendererType: \"react-spa\",\n routeKey: routeInfo.pathname || \"react-spa\",\n status: \"ACTIVE\",\n props: {},\n route: {},\n dataSources: [],\n capabilities: {},\n buildId: toStringValue(\n getRecordValue(bootstrap?.runtime, \"activeBuildId\"),\n ),\n ...page,\n },\n user: {\n ...user,\n id:\n toStringValue(getRecordValue(user, \"id\")) ||\n (runtimeGuestUser ? \"guest\" : \"current\"),\n username:\n toStringValue(getRecordValue(user, \"username\")) ||\n toStringValue(getRecordValue(user, \"name\")) ||\n (runtimeGuestUser ? \"guest\" : \"current\"),\n tenantId,\n isGuest: runtimeGuestUser,\n userType: runtimeGuestUser ? \"guest\" : \"normal\",\n },\n env: {\n appType,\n servicePrefix: runtime.servicePrefix,\n runtimeMode: bootstrap?.runtime?.mode || \"react-spa\",\n ...(env || {}),\n },\n permissions: {\n canView: runtime.error?.type !== \"forbidden\",\n hasFullAccess: permissions?.hasFullAccess === true,\n ...(permissions || {}),\n },\n sdk: {\n packageName: \"openxiangda\",\n supportedBridgeMethods: [\"transport.request\", \"transport.download\"],\n },\n },\n {\n servicePrefix: runtime.servicePrefix,\n fetchImpl: runtime.fetchImpl,\n route: routeInfo,\n message,\n modal,\n navigation,\n },\n )\n }, [\n env,\n message,\n modal,\n navigation,\n page,\n route,\n runtime.appType,\n runtime.data,\n runtime.error?.type,\n runtime.fetchImpl,\n runtime.servicePrefix,\n ])\n\n return <PageProvider context={context}>{children}</PageProvider>\n}\n\nexport const useAppMenus = () => {\n const runtime = useOpenXiangda()\n return {\n ...runtime,\n data: runtime.data?.menus || [],\n }\n}\n\nexport const usePermission = () => {\n const runtime = useOpenXiangda()\n return {\n ...runtime,\n data: runtime.data?.permissions || null,\n }\n}\n\nexport interface UseCanAccessRouteInput {\n routeCode?: string\n menuCode?: string\n path?: string\n}\n\nexport const useCanAccessRoute = (input: UseCanAccessRouteInput) => {\n const runtime = useOpenXiangda()\n const [state, setState] = useState<RuntimeRequestState<RouteAccessResult>>({\n data: null,\n loading: true,\n error: null,\n })\n\n useEffect(() => {\n let disposed = false\n const check = async () => {\n const permissions = runtime.data?.permissions\n if (!runtime.appType || runtime.loading) {\n setState(prev => ({ ...prev, loading: runtime.loading }))\n return\n }\n if (runtime.error && !runtime.data) {\n const snapshot = toRuntimeErrorSnapshot(runtime.error)\n setState({\n data: {\n appType: runtime.appType,\n canAccess: false,\n status: snapshot.status,\n code: snapshot.code,\n message: snapshot.message,\n errorType: snapshot.type,\n payload: snapshot.payload,\n },\n loading: false,\n error: runtime.error,\n })\n return\n }\n if (permissions?.hasFullAccess) {\n setState({\n data: { appType: runtime.appType, canAccess: true, permissions },\n loading: false,\n error: null,\n })\n return\n }\n setState(prev => ({ ...prev, loading: true, error: null }))\n try {\n const response = await runtime.fetchImpl(\n buildServiceUrl(\n runtime.servicePrefix,\n `/openxiangda-api/v1/apps/${encodeURIComponent(\n runtime.appType,\n )}/runtime/routes/check`,\n ),\n {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(input),\n },\n )\n const payload = await readJsonPayload(response)\n const code = payload?.code ?? response.status\n const canAccess = Boolean(payload?.data?.canAccess)\n const errorType = canAccess\n ? undefined\n : classifyRuntimeError(response.status, code)\n const data: RouteAccessResult = {\n ...(payload?.data || {\n appType: runtime.appType,\n canAccess: false,\n }),\n appType: payload?.data?.appType || runtime.appType,\n canAccess,\n status: response.status,\n code,\n message: payload?.message,\n errorType,\n payload,\n }\n if (!disposed) {\n const shouldTreatAsError =\n !response.ok || isServerErrorCode(code)\n setState({\n data,\n loading: false,\n error: shouldTreatAsError\n ? createRuntimeHttpError(\n response,\n payload,\n payload?.message || `Route check failed: ${response.status}`,\n )\n : null,\n })\n }\n } catch (error) {\n if (!disposed) {\n setState({\n data: null,\n loading: false,\n error: normalizeRuntimeError(error),\n })\n }\n }\n }\n void check()\n return () => {\n disposed = true\n }\n }, [\n input.menuCode,\n input.path,\n input.routeCode,\n runtime.appType,\n runtime.data?.permissions,\n runtime.fetchImpl,\n runtime.loading,\n runtime.servicePrefix,\n ])\n\n return {\n ...state,\n canAccess: Boolean(state.data?.canAccess),\n }\n}\n\nexport interface PermissionBoundaryProps extends UseCanAccessRouteInput {\n children: React.ReactNode\n fallback?: React.ReactNode | PermissionBoundaryFallback\n loadingFallback?: React.ReactNode | PermissionBoundaryFallback\n}\n\nexport interface PermissionBoundaryFallbackState {\n access: ReturnType<typeof useCanAccessRoute>\n runtime: ReturnType<typeof useOpenXiangda>\n error: RuntimeRequestError | null\n errorType: RuntimeErrorType\n status?: number\n code?: number | string\n message: string\n}\n\nexport type PermissionBoundaryFallback = (\n state: PermissionBoundaryFallbackState,\n) => React.ReactNode\n\nexport const PermissionBoundary: React.FC<PermissionBoundaryProps> = ({\n children,\n fallback = null,\n loadingFallback = null,\n routeCode,\n menuCode,\n path,\n}) => {\n const runtime = useOpenXiangda()\n const access = useCanAccessRoute({ routeCode, menuCode, path })\n const fallbackState = createPermissionFallbackState(access, runtime)\n if (access.loading) {\n return <>{renderBoundaryFallback(loadingFallback, fallbackState)}</>\n }\n if (!access.canAccess) {\n return <>{renderBoundaryFallback(fallback, fallbackState)}</>\n }\n return <>{children}</>\n}\n\nexport interface RuntimeResolveLoginOptions {\n redirectUri?: string\n loginUrl?: string\n domain?: string\n}\n\nexport interface RuntimeRedirectLoginOptions extends RuntimeResolveLoginOptions {\n replace?: boolean\n}\n\nexport interface RuntimeLogoutOptions extends RuntimeRedirectLoginOptions {\n continueOnError?: boolean\n}\n\nexport const useRuntimeAuth = () => {\n const runtime = useOpenXiangda()\n\n const resolveLoginUrl = useCallback(\n async (options: RuntimeResolveLoginOptions = {}) => {\n const redirectUri = options.redirectUri || getCurrentHref()\n const domain = options.domain || getCurrentHostname()\n const appTenantId = getRecordString(runtime.data?.app, \"tenantId\")\n\n try {\n const statusUrl = withQuery(\n buildServiceUrl(runtime.servicePrefix, \"/api/sso/status\"),\n { domain },\n )\n const statusResponse = await runtime.baseFetchImpl(statusUrl, {\n credentials: \"include\",\n headers: { accept: \"application/json\" },\n })\n const statusPayload = await readJsonPayload(statusResponse)\n const sso = statusPayload?.data || {}\n const enabled = Boolean(sso.enabled)\n const shouldUseSso = Boolean(\n enabled && (sso.forceLogin ?? sso.autoRedirect ?? true),\n )\n if (shouldUseSso) {\n const loginUrlResponse = await runtime.baseFetchImpl(\n withQuery(buildServiceUrl(runtime.servicePrefix, \"/api/sso/login-url\"), {\n domain,\n redirectUri,\n ...(sso.tenantId || appTenantId\n ? { tenantId: String(sso.tenantId || appTenantId) }\n : {}),\n ...(sso.protocol ? { protocol: String(sso.protocol) } : {}),\n }),\n {\n credentials: \"include\",\n headers: { accept: \"application/json\" },\n },\n )\n const loginUrlPayload = await readJsonPayload(loginUrlResponse)\n const loginUrl =\n loginUrlPayload?.data?.loginUrl ||\n loginUrlPayload?.data?.url ||\n loginUrlPayload?.loginUrl ||\n loginUrlPayload?.url\n if (loginUrl) return String(loginUrl)\n }\n } catch {\n // Login resolution must always have a local fallback so logged-out\n // users are not stranded behind a permission state.\n }\n\n const configuredLoginUrl =\n options.loginUrl ||\n getRuntimeEnv(\"OPENXIANGDA_LOGIN_URL\") ||\n getRuntimeEnv(\"VITE_OPENXIANGDA_LOGIN_URL\") ||\n getRuntimeEnv(\"APP_LOGIN_URL\") ||\n getRuntimeEnv(\"VITE_APP_LOGIN_URL\") ||\n getRuntimeEnv(\"VITE_BATH_AUTH_URL\") ||\n getRuntimeEnv(\"BATH_AUTH_URL\")\n if (configuredLoginUrl) {\n return attachCallback(configuredLoginUrl, redirectUri)\n }\n return attachCallback(\"/platform/login\", redirectUri)\n },\n [runtime.baseFetchImpl, runtime.data?.app, runtime.servicePrefix],\n )\n\n const redirectToLogin = useCallback(\n async (options: RuntimeRedirectLoginOptions = {}) => {\n const loginUrl = await resolveLoginUrl(options)\n if (typeof window !== \"undefined\") {\n if (options.replace === false) {\n window.location.assign(loginUrl)\n } else {\n window.location.replace(loginUrl)\n }\n }\n return loginUrl\n },\n [resolveLoginUrl],\n )\n\n const logout = useCallback(async () => {\n const response = await runtime.baseFetchImpl(\n buildServiceUrl(runtime.servicePrefix, \"/api/auth/logout\"),\n {\n method: \"POST\",\n credentials: \"include\",\n headers: { accept: \"application/json\" },\n },\n )\n const payload = await readJsonPayload(response)\n if (isRuntimeEnvelopeFailure(response, payload)) {\n throw createRuntimeHttpError(\n response,\n payload,\n payload?.message || `Logout failed: ${response.status}`,\n )\n }\n runtime.setAccessToken(null)\n return payload\n }, [runtime.baseFetchImpl, runtime.servicePrefix, runtime.setAccessToken])\n\n const logoutAndRedirect = useCallback(\n async (options: RuntimeLogoutOptions = {}) => {\n try {\n await logout()\n } catch (error) {\n if (options.continueOnError === false) throw error\n }\n return redirectToLogin(options)\n },\n [logout, redirectToLogin],\n )\n\n return useMemo(\n () => ({\n logout,\n logoutAndRedirect,\n redirectToLogin,\n resolveLoginUrl,\n }),\n [logout, logoutAndRedirect, redirectToLogin, resolveLoginUrl],\n )\n}\n\nexport interface RuntimeAuthGuardProps extends RuntimeRedirectLoginOptions {\n children: React.ReactNode\n fallback?: React.ReactNode\n disabled?: boolean\n excludedPaths?: string[]\n}\n\nexport const RuntimeAuthGuard: React.FC<RuntimeAuthGuardProps> = ({\n children,\n fallback = null,\n disabled = false,\n excludedPaths = [],\n ...redirectOptions\n}) => {\n const runtime = useOpenXiangda()\n const auth = useRuntimeAuth()\n const redirectedRef = useRef(false)\n const currentPath = getCurrentPathname()\n const excluded = isRuntimeAuthGuardExcluded(\n currentPath,\n runtime.appType,\n excludedPaths,\n )\n const shouldRedirect =\n !disabled &&\n !excluded &&\n !runtime.loading &&\n (runtime.authState.status === \"unauthenticated\" ||\n runtime.error?.type === \"unauthenticated\")\n\n useEffect(() => {\n if (!shouldRedirect || redirectedRef.current) return\n redirectedRef.current = true\n void auth\n .redirectToLogin({\n ...redirectOptions,\n redirectUri: redirectOptions.redirectUri || getCurrentHref(),\n })\n .catch(() => {\n redirectedRef.current = false\n })\n }, [\n auth,\n redirectOptions.domain,\n redirectOptions.loginUrl,\n redirectOptions.redirectUri,\n redirectOptions.replace,\n shouldRedirect,\n ])\n\n if (excluded) return <>{children}</>\n if (shouldRedirect) return <>{fallback}</>\n return <>{children}</>\n}\n\nconst buildServiceUrl = (servicePrefix: string, path: string) => {\n const prefix = servicePrefix.endsWith(\"/\")\n ? servicePrefix.slice(0, -1)\n : servicePrefix\n const suffix = path.startsWith(\"/\") ? path : `/${path}`\n return `${prefix}${suffix}`\n}\n\ninterface CreateAuthorizedFetchOptions {\n appType: string\n baseFetch: typeof fetch\n accessTokenRef: React.MutableRefObject<RuntimeAccessTokenState | null>\n refreshAccessToken: () => Promise<RuntimeAccessTokenState | null>\n markUnauthenticated: (error: unknown) => void\n}\n\nconst createAuthorizedFetch = ({\n appType,\n baseFetch,\n accessTokenRef,\n refreshAccessToken,\n markUnauthenticated,\n}: CreateAuthorizedFetchOptions): typeof fetch =>\n (async (input, init = {}) => {\n const currentTokenState = accessTokenRef.current\n const response = await createAccessTokenFetch(\n baseFetch,\n currentTokenState,\n )(input, init)\n if (\n !shouldAttemptAuthRefresh({\n appType,\n input,\n init,\n tokenState: currentTokenState,\n })\n ) {\n return response\n }\n if (!(await isUnauthenticatedResponse(response))) return response\n\n try {\n const refreshedTokenState = await refreshAccessToken()\n if (!refreshedTokenState) return response\n return await createAccessTokenFetch(\n baseFetch,\n refreshedTokenState,\n )(input, init)\n } catch (error) {\n markUnauthenticated(error)\n return response\n }\n }) as typeof fetch\n\nconst createAccessTokenFetch = (\n baseFetch: typeof fetch,\n accessToken?: RuntimeAccessTokenState | null,\n): typeof fetch => {\n if (!accessToken) return baseFetch\n return ((input, init = {}) => {\n const token = resolveAccessTokenForCurrentRoute(accessToken)\n if (!token) return baseFetch(input, init)\n const headers = new Headers(init.headers || {})\n if (!headers.has(\"authorization\")) {\n headers.set(\"authorization\", `Bearer ${token}`)\n }\n return baseFetch(input, {\n ...init,\n headers,\n })\n }) as typeof fetch\n}\n\nconst createAccessTokenState = (\n accessToken?: string | null,\n options: RuntimeAccessTokenOptions = {},\n): RuntimeAccessTokenState | null =>\n accessToken\n ? {\n token: accessToken,\n scope: options.scope || \"default\",\n path: options.path || null,\n expiresAt: options.expiresAt,\n }\n : null\n\nconst shouldAttemptAuthRefresh = ({\n appType,\n input,\n init,\n tokenState,\n}: {\n appType: string\n input: Parameters<typeof fetch>[0]\n init?: Parameters<typeof fetch>[1]\n tokenState?: RuntimeAccessTokenState | null\n}) => {\n if (!appType) return false\n if (tokenState?.scope === \"public\") return false\n if (isPublicRoutePath(normalizeRoutePath(getCurrentPathname()))) return false\n if (hasAuthorizationHeader(init?.headers)) return false\n const pathname = getFetchInputPathname(input)\n if (!pathname) return false\n if (/\\/openxiangda-api\\/v1\\/apps\\/[^/]+\\/auth(?:\\/|$)/.test(pathname)) {\n return false\n }\n if (/\\/openxiangda-api\\/v1\\/apps\\/[^/]+\\/public\\/session(?:\\/|$)/.test(pathname)) {\n return false\n }\n if (/\\/openxiangda-api\\/v1\\/auth(?:\\/|$)/.test(pathname)) return false\n if (/\\/api\\/auth\\/logout(?:\\/|$)/.test(pathname)) return false\n if (/\\/api\\/sso(?:\\/|$)/.test(pathname)) return false\n return true\n}\n\nconst isUnauthenticatedResponse = async (response: Response) => {\n if (response.status === 401) return true\n const payload = await readJsonPayload(response.clone())\n const code = getRecordValue(payload, \"code\")\n return classifyRuntimeError(response.status, code as number | string | undefined) === \"unauthenticated\"\n}\n\nconst hasAuthorizationHeader = (headers?: HeadersInit) => {\n if (!headers) return false\n const normalized = new Headers(headers)\n return normalized.has(\"authorization\")\n}\n\nconst getFetchInputPathname = (input: Parameters<typeof fetch>[0]) => {\n const text =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : typeof Request !== \"undefined\" && input instanceof Request\n ? input.url\n : String(input || \"\")\n if (!text) return \"\"\n try {\n const base =\n typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\"\n return new URL(text, base).pathname\n } catch {\n return text.split(/[?#]/, 1)[0] || \"\"\n }\n}\n\nconst resolveAccessTokenForCurrentRoute = (\n accessToken: RuntimeAccessTokenState,\n) => {\n if (accessToken.scope !== \"public\") return accessToken.token\n const scopedPath = normalizeRoutePath(accessToken.path)\n const currentPath = normalizeRoutePath(getCurrentPathname())\n if (!scopedPath) {\n return isPublicRoutePath(currentPath) ? accessToken.token : null\n }\n if (\n currentPath === scopedPath ||\n (isPublicRoutePath(currentPath) && currentPath.startsWith(`${scopedPath}/`))\n ) {\n return accessToken.token\n }\n return null\n}\n\nconst normalizeRoutePath = (path?: string | null) => {\n const text = String(path || \"\").trim()\n if (!text) return \"\"\n try {\n const base =\n typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\"\n return new URL(text, base).pathname.replace(/\\/+$/, \"\") || \"/\"\n } catch {\n return text.split(/[?#]/, 1)[0].replace(/\\/+$/, \"\") || \"/\"\n }\n}\n\nconst isPublicRoutePath = (path: string) => /\\/public(?:\\/|$)/.test(path)\n\nconst readJsonPayload = async (response: Response) => {\n try {\n return await response.json()\n } catch {\n return null\n }\n}\n\nconst createRuntimeHttpError = (\n response: Response,\n payload: unknown,\n fallbackMessage: string,\n): RuntimeRequestError =>\n createRuntimeError({\n type: classifyRuntimeError(\n response.status,\n getRecordValue(payload, \"code\") as number | string | undefined,\n ),\n status: response.status,\n code: getRecordValue(payload, \"code\") as number | string | undefined,\n message:\n (getRecordValue(payload, \"message\") as string | undefined) ||\n fallbackMessage,\n payload,\n })\n\nconst createRuntimeError = (\n snapshot: RuntimeErrorSnapshot,\n): RuntimeRequestError =>\n new RuntimeHttpError({\n ...snapshot,\n type: snapshot.type || \"unknown\",\n message: snapshot.message || \"Runtime request failed\",\n })\n\nconst normalizeRuntimeError = (error: unknown): RuntimeRequestError => {\n if (error instanceof RuntimeHttpError) return error\n if (error instanceof Error) {\n const runtimeError = error as RuntimeRequestError\n runtimeError.type = runtimeError.type || classifyRuntimeError(runtimeError.status, runtimeError.code)\n return runtimeError\n }\n return createRuntimeError({\n type: \"unknown\",\n message: String(error),\n })\n}\n\nconst toRuntimeErrorSnapshot = (\n error: RuntimeRequestError,\n): RuntimeErrorSnapshot => ({\n type: error.type || classifyRuntimeError(error.status, error.code),\n status: error.status,\n code: error.code,\n message: error.message || \"Runtime request failed\",\n payload: error.payload,\n})\n\nconst classifyRuntimeError = (\n status?: number,\n code?: number | string,\n): RuntimeErrorType => {\n const normalizedCode = typeof code === \"string\" ? Number(code) : code\n if (status === 401 || normalizedCode === 401) return \"unauthenticated\"\n if (status === 403 || normalizedCode === 403) return \"forbidden\"\n if (typeof code === \"string\") {\n const normalizedText = code.toUpperCase()\n if (\n normalizedText.includes(\"DENIED\") ||\n normalizedText.includes(\"FORBIDDEN\")\n ) {\n return \"forbidden\"\n }\n if (\n normalizedText.includes(\"UNAUTH\") ||\n normalizedText.includes(\"LOGIN\")\n ) {\n return \"unauthenticated\"\n }\n }\n if (!status && !normalizedCode) return \"network\"\n return \"unknown\"\n}\n\nconst createPermissionFallbackState = (\n access: ReturnType<typeof useCanAccessRoute>,\n runtime: ReturnType<typeof useOpenXiangda>,\n): PermissionBoundaryFallbackState => {\n const error = access.error || runtime.error\n const accessData = access.data\n const errorType =\n accessData?.errorType ||\n error?.type ||\n (!access.canAccess ? \"forbidden\" : \"unknown\")\n return {\n access,\n runtime,\n error,\n errorType,\n status: accessData?.status || error?.status,\n code: accessData?.code || error?.code,\n message:\n accessData?.message ||\n error?.message ||\n (errorType === \"unauthenticated\"\n ? \"当前账号尚未登录\"\n : \"当前账号没有访问权限\"),\n }\n}\n\nconst renderBoundaryFallback = (\n fallback: React.ReactNode | PermissionBoundaryFallback,\n state: PermissionBoundaryFallbackState,\n) => (typeof fallback === \"function\" ? fallback(state) : fallback)\n\nconst withQuery = (\n url: string,\n params: Record<string, string | number | boolean | undefined>,\n) => {\n const query = new URLSearchParams()\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === \"\") return\n query.set(key, String(value))\n })\n const serialized = query.toString()\n if (!serialized) return url\n return `${url}${url.includes(\"?\") ? \"&\" : \"?\"}${serialized}`\n}\n\nconst attachCallback = (loginUrl: string, callback: string) => {\n if (!callback) return loginUrl\n try {\n const base =\n typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\"\n const parsed = new URL(loginUrl, base)\n if (!parsed.searchParams.has(\"callback\") && !parsed.searchParams.has(\"redirectUri\")) {\n parsed.searchParams.set(\"callback\", callback)\n }\n if (loginUrl.startsWith(\"http://\") || loginUrl.startsWith(\"https://\")) {\n return parsed.toString()\n }\n return `${parsed.pathname}${parsed.search}${parsed.hash}`\n } catch {\n const separator = loginUrl.includes(\"?\") ? \"&\" : \"?\"\n return `${loginUrl}${separator}callback=${encodeURIComponent(callback)}`\n }\n}\n\nconst getCurrentHref = () =>\n typeof window === \"undefined\" ? \"\" : window.location.href\n\nconst getCurrentPathname = () =>\n typeof window === \"undefined\" ? \"\" : window.location.pathname\n\nconst getCurrentHostname = () =>\n typeof window === \"undefined\" ? \"\" : window.location.hostname\n\nconst getRuntimeEnv = (key: string) => {\n const env =\n typeof process !== \"undefined\"\n ? (process as unknown as { env?: Record<string, string | undefined> }).env\n : undefined\n return env?.[key]\n}\n\nconst getRecordValue = (value: unknown, key: string) => {\n if (!value || typeof value !== \"object\") return undefined\n return (value as Record<string, unknown>)[key]\n}\n\nconst toRuntimeRecord = (value: unknown): Record<string, unknown> => {\n return value && typeof value === \"object\"\n ? { ...(value as Record<string, unknown>) }\n : {}\n}\n\nconst toStringValue = (value: unknown): string => {\n if (value === undefined || value === null) return \"\"\n return String(value)\n}\n\nconst parseBrowserQuery = (): Record<string, PageQueryValue> => {\n if (typeof window === \"undefined\") return {}\n const query: Record<string, PageQueryValue> = {}\n const params = new URLSearchParams(window.location.search)\n params.forEach((value, key) => {\n const currentValue = query[key]\n if (currentValue === undefined) {\n query[key] = value\n return\n }\n query[key] = Array.isArray(currentValue)\n ? [...currentValue, value]\n : [currentValue, value]\n })\n return query\n}\n\nconst buildBrowserRouteInfo = (\n route?: Partial<PageRouteInfo>,\n): PageRouteInfo => {\n const pathname =\n route?.pathname ||\n (typeof window !== \"undefined\" ? window.location.pathname : \"\")\n const search = typeof window !== \"undefined\" ? window.location.search : \"\"\n const hash =\n route?.hash || (typeof window !== \"undefined\" ? window.location.hash : \"\")\n return {\n pathname,\n fullPath:\n route?.fullPath ||\n (typeof window !== \"undefined\" ? `${pathname}${search}${hash}` : pathname),\n params: route?.params || {},\n query: route?.query || parseBrowserQuery(),\n hash,\n }\n}\n\nconst isSuccessCode = (code: unknown) => {\n if (code === undefined || code === null || code === \"\") return true\n const normalized = Number(code)\n return Number.isFinite(normalized)\n ? normalized === 0 || (normalized >= 200 && normalized < 300)\n : false\n}\n\nconst isRuntimeEnvelopeFailure = (response: Response, payload: unknown) => {\n const code = getRecordValue(payload, \"code\")\n const success = getRecordValue(payload, \"success\")\n return !response.ok || success === false || !isSuccessCode(code)\n}\n\nconst isServerErrorCode = (code: unknown) => {\n const normalized = Number(code)\n return Number.isFinite(normalized) && normalized >= 500\n}\n\nconst getRecordString = (value: unknown, key: string) => {\n const result = getRecordValue(value, key)\n return typeof result === \"string\" ? result : undefined\n}\n\nconst getRecordNumber = (value: unknown, key: string) => {\n const result = getRecordValue(value, key)\n const numberValue = Number(result)\n return Number.isFinite(numberValue) ? numberValue : undefined\n}\n\nconst unwrapRuntimePayload = (payload: unknown) => {\n if (!payload || typeof payload !== \"object\") return payload\n const record = payload as Record<string, unknown>\n return \"data\" in record ? record.data : payload\n}\n\nconst isAuthenticatedBootstrap = (value: unknown) => {\n if (!value || typeof value !== \"object\") return false\n const user = toRuntimeRecord(getRecordValue(value, \"user\"))\n if (!getRecordValue(user, \"id\") && !getRecordValue(user, \"username\")) {\n return false\n }\n return !getRecordValue(user, \"publicAccess\")\n}\n\nconst isRuntimeAuthGuardExcluded = (\n path: string,\n appType: string,\n excludedPaths: string[],\n) => {\n const normalizedPath = normalizeRoutePath(path)\n if (isPublicRoutePath(normalizedPath)) return true\n const loginPath = normalizeRoutePath(`/view/${encodeURIComponent(appType)}/login`)\n if (appType && normalizedPath === loginPath) return true\n return excludedPaths\n .map(item => normalizeRoutePath(item))\n .some(item => item && normalizedPath === item)\n}\n\nconst resolveAppTypeFromLocation = () => {\n if (typeof window === \"undefined\") return \"\"\n const segments = window.location.pathname.split(\"/\").filter(Boolean)\n const viewIndex = segments[0] === \"view\" ? 1 : 0\n if (segments[viewIndex] === \"submit\") return segments[viewIndex + 1] || \"\"\n if (segments[viewIndex] === \"preview\") return segments[viewIndex + 1] || \"\"\n return segments[viewIndex] || \"\"\n}\n\nexport {\n LoginPage,\n useAuth,\n useLoginMethods,\n} from \"./auth\"\nexport type {\n LoginPageProps,\n UseAuthOptions,\n UseLoginMethodsState,\n} from \"./auth\"\nexport {\n AuthClientError,\n createAuthClient,\n} from \"../core/auth\"\nexport type {\n AppAuthClient,\n AuthMethod,\n AuthMethodType,\n AuthTokenData,\n DingTalkLoginInput,\n GuestLoginInput,\n LoginMethodsResult,\n PasswordLoginInput,\n PhoneCodeInput,\n PhoneCodeLoginInput,\n PhoneCodeRegisterInput,\n PhoneCodeSendResult,\n RefreshInput,\n ResolveLoginUrlInput,\n SsoLoginUrlInput,\n SsoLoginUrlResult,\n} from \"../core/auth\"\n","export interface TransientFetchRetryOptions {\n enabled?: boolean;\n retries?: number;\n baseDelayMs?: number;\n}\n\nconst sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\nconst isTransientFetchError = (error: unknown) => {\n const anyError = error as any;\n const message = String(anyError?.message || error || \"\").toLowerCase();\n const causeCode = String(anyError?.cause?.code || \"\").toLowerCase();\n return (\n causeCode === \"und_err_connect_timeout\" ||\n message.includes(\"und_err_connect_timeout\") ||\n message.includes(\"connect_timeout\") ||\n message.includes(\"econnreset\") ||\n message.includes(\"socket hang up\") ||\n message.includes(\"network socket disconnected\") ||\n message.includes(\"fetch failed\")\n );\n};\n\nexport const fetchWithTransientRetry = async (\n fetchImpl: typeof fetch,\n input: Parameters<typeof fetch>[0],\n init?: Parameters<typeof fetch>[1],\n options: TransientFetchRetryOptions = {},\n): Promise<Response> => {\n if (!options.enabled) {\n return fetchImpl(input, init);\n }\n\n const retries = Number.isFinite(Number(options.retries))\n ? Number(options.retries)\n : 2;\n const baseDelayMs = Number.isFinite(Number(options.baseDelayMs))\n ? Number(options.baseDelayMs)\n : 250;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n try {\n return await fetchImpl(input, init);\n } catch (error) {\n lastError = error;\n if (attempt >= retries || !isTransientFetchError(error)) {\n throw error;\n }\n await sleep(Math.min(baseDelayMs * Math.pow(2, attempt), 2000));\n }\n }\n\n throw lastError;\n};\n\nexport const createBoundFetch = (fetchImpl?: typeof fetch): typeof fetch => {\n const baseFetch = fetchImpl || globalThis.fetch;\n return ((input, init) => baseFetch.call(globalThis, input, init)) as typeof fetch;\n};\n","import type {\n PageApiResponse,\n PageBinaryResponse,\n PageBridgeApi,\n PageContext,\n PageInfo,\n PageRequestOptions,\n} from \"../core/types\";\nimport { createBoundFetch, fetchWithTransientRetry } from \"../core/fetch\";\n\nexport type RuntimeCssIsolation = \"none\" | \"namespace\" | \"shadow\";\n\nexport interface RuntimeHostBootstrap {\n app: PageContext[\"app\"];\n page: PageInfo;\n user: PageContext[\"user\"];\n asset?: {\n protocolVersion?: string;\n version?: string;\n buildId?: string;\n entryUrl?: string;\n cssAssets?: string[];\n jsAssets?: string[];\n manifestUrl?: string;\n [key: string]: unknown;\n };\n runtimeAssets?: {\n entryUrl?: string;\n cssUrls?: string[];\n jsUrls?: string[];\n cssIsolation?: RuntimeCssIsolation | string;\n [key: string]: unknown;\n };\n env?: Record<string, unknown>;\n permissions?: Partial<PageContext[\"permissions\"]>;\n sdk?: PageContext[\"sdk\"];\n}\n\nexport type BrowserRuntimeRouteMode =\n | \"custom-page\"\n | \"builtin-route\"\n | \"legacy-fallback\"\n | \"not-found\";\n\nexport type BrowserRuntimeRouteKind =\n | \"custom-page\"\n | \"legacy-workbench\"\n | \"work-center\"\n | \"form-submit\"\n | \"process-submit\"\n | \"form-preview\"\n | \"form-detail\"\n | \"process-detail\"\n | \"data-manage-list\"\n | \"file-preview\"\n | \"unknown\";\n\nexport interface BrowserRuntimeRouteResolution {\n appType: string;\n path: string;\n search: string;\n kind: BrowserRuntimeRouteKind;\n mode: BrowserRuntimeRouteMode;\n params: Record<string, string>;\n query: Record<string, string | string[]>;\n runtime: Record<string, unknown>;\n fallback?: {\n legacyRoute: boolean;\n reason: string;\n };\n message?: string;\n}\n\nexport interface BrowserRuntimeHostOptions {\n servicePrefix?: string;\n fetchImpl?: typeof fetch;\n message?: Partial<PageContext[\"ui\"][\"message\"]>;\n modal?: Partial<PageContext[\"ui\"][\"modal\"]>;\n navigation?: Partial<PageContext[\"navigation\"]>;\n route?: Partial<PageContext[\"route\"]>;\n}\n\nexport interface BrowserRuntimeBootstrapOptions {\n appType: string;\n pageKey: string;\n servicePrefix?: string;\n bootstrapPath?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport interface BrowserRuntimeRouteResolveOptions {\n appType: string;\n path?: string;\n search?: string;\n servicePrefix?: string;\n resolvePath?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport interface LoadedRuntimeAssets {\n entryUrl: string;\n cssUrls: string[];\n jsUrls: string[];\n cssIsolation: RuntimeCssIsolation;\n}\n\nexport interface CustomPageModule {\n mount?: (el: HTMLElement, context: PageContext) => void | Promise<void>;\n update?: (\n el: HTMLElement,\n nextContext: PageContext,\n prevContext?: PageContext,\n ) => void | Promise<void>;\n unmount?: (el?: HTMLElement, context?: PageContext) => void | Promise<void>;\n default?: CustomPageModule;\n}\n\nexport interface RuntimeMountOptions {\n container: HTMLElement;\n module: CustomPageModule;\n context: PageContext;\n assets?: Partial<LoadedRuntimeAssets>;\n}\n\nexport interface BrowserRuntimeMountOptions extends BrowserRuntimeHostOptions {\n container: HTMLElement;\n appType: string;\n pageKey: string;\n bootstrapPath?: string;\n moduleLoader?: (url: string) => Promise<unknown>;\n}\n\nexport interface BrowserRuntimeMountResult {\n bootstrap: RuntimeHostBootstrap;\n assets: LoadedRuntimeAssets;\n context: PageContext;\n module: CustomPageModule;\n cleanup: () => Promise<void>;\n}\n\nconst NAMESPACE_ROOT_CLASS = \"sy-app-workspace\";\nconst defaultModuleLoader = (url: string) => import(/* @vite-ignore */ url);\n\nconst trimTrailingSlash = (value: string) => value.replace(/\\/+$/, \"\");\n\nconst getDefaultServicePrefix = () =>\n typeof window !== \"undefined\"\n ? trimTrailingSlash((window as any).__OPENXIANGDA_SERVICE_PREFIX__ || \"/service\")\n : \"/service\";\n\nconst joinServicePath = (servicePrefix: string, path: string) => {\n if (/^https?:\\/\\//i.test(path)) return path;\n const normalizedPrefix = trimTrailingSlash(servicePrefix || \"/service\");\n if (path.startsWith(normalizedPrefix)) return path;\n return `${normalizedPrefix}${path.startsWith(\"/\") ? path : `/${path}`}`;\n};\n\nconst appendQuery = (url: string, query?: string) => {\n if (!query) return url;\n return `${url}${url.includes(\"?\") ? \"&\" : \"?\"}${query}`;\n};\n\nconst normalizeMethod = (method?: string) => {\n const value = String(method || \"get\").toUpperCase();\n return [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"].includes(value)\n ? value\n : \"GET\";\n};\n\nconst shouldRetryTransportRequest = (payload: PageRequestOptions | any) => {\n const method = normalizeMethod(payload?.method);\n if (method === \"GET\") return true;\n const path = String(payload?.path || \"\").split(\"?\")[0];\n return method === \"POST\" && path === \"/workflow/capabilities/resolve\";\n};\n\nconst normalizeCssIsolation = (value: unknown): RuntimeCssIsolation => {\n if (value === \"namespace\" || value === \"shadow\" || value === \"none\") {\n return value;\n }\n return \"none\";\n};\n\nconst normalizeEnvelopeCode = (value: unknown, fallback: number): number | string => {\n if (value === undefined || value === null || value === \"\") return fallback;\n const normalized = Number(value);\n return Number.isFinite(normalized) ? normalized : String(value);\n};\n\nconst isSuccessCode = (value: unknown) => {\n if (value === undefined || value === null || value === \"\") return true;\n const normalized = Number(value);\n return Number.isFinite(normalized)\n ? normalized === 0 || (normalized >= 200 && normalized < 300)\n : false;\n};\n\nconst parseJsonResponse = async <TResult, TRaw = TResult>(\n response: Response,\n): Promise<PageApiResponse<TResult, TRaw>> => {\n const payload = await response.json().catch(() => null);\n if (!response.ok) {\n const message =\n payload && typeof payload === \"object\"\n ? payload.message || payload.error || response.statusText\n : response.statusText;\n throw new Error(message || \"请求失败\");\n }\n\n if (payload && typeof payload === \"object\" && \"code\" in payload) {\n const code = normalizeEnvelopeCode(payload.code, response.status);\n return {\n code,\n success: payload.success !== false && isSuccessCode(code),\n message: payload.message,\n result: (payload.result ?? payload.data ?? null) as TResult,\n data: payload.data as TRaw,\n raw: payload,\n };\n }\n\n return {\n code: response.status,\n success: response.ok,\n message: response.statusText,\n result: payload as TResult,\n data: payload as TRaw,\n raw: payload,\n };\n};\n\nexport const createBrowserPageBridge = (\n options: BrowserRuntimeHostOptions = {},\n): PageBridgeApi => {\n const servicePrefix = options.servicePrefix || getDefaultServicePrefix();\n const fetchImpl = createBoundFetch(options.fetchImpl);\n\n const request = async <TResult = unknown, TRaw = TResult>(\n payload: PageRequestOptions | any,\n ): Promise<PageApiResponse<TResult, TRaw>> => {\n if (!payload?.path) {\n throw new Error(\"transport.request 需要 path\");\n }\n const url = appendQuery(joinServicePath(servicePrefix, payload.path), payload.query);\n const headers = new Headers(payload.headers as HeadersInit);\n let body: BodyInit | undefined;\n if (payload.body !== undefined) {\n if (payload.body instanceof FormData) {\n body = payload.body;\n } else {\n headers.set(\"Content-Type\", headers.get(\"Content-Type\") || \"application/json\");\n body = JSON.stringify(payload.body);\n }\n }\n const response = await fetchWithTransientRetry(fetchImpl, url, {\n method: normalizeMethod(payload.method),\n headers,\n body,\n credentials: \"include\",\n }, {\n enabled: shouldRetryTransportRequest(payload),\n });\n return parseJsonResponse<TResult, TRaw>(response);\n };\n\n const download = async (payload: PageRequestOptions | any): Promise<PageBinaryResponse> => {\n if (!payload?.path) {\n throw new Error(\"transport.download 需要 path\");\n }\n const url = appendQuery(joinServicePath(servicePrefix, payload.path), payload.query);\n const headers = new Headers(payload.headers as HeadersInit);\n let body: BodyInit | undefined;\n if (payload.body !== undefined) {\n if (payload.body instanceof FormData) {\n body = payload.body;\n } else {\n headers.set(\"Content-Type\", headers.get(\"Content-Type\") || \"application/json\");\n body = JSON.stringify(payload.body);\n }\n }\n const response = await fetchImpl(url, {\n method: normalizeMethod(payload.method),\n headers,\n body,\n credentials: \"include\",\n });\n if (!response.ok) {\n throw new Error(response.statusText || \"下载失败\");\n }\n return {\n blob: await response.blob(),\n contentType: response.headers.get(\"content-type\") || undefined,\n fileName: response.headers.get(\"content-disposition\") || undefined,\n headers: Object.fromEntries(response.headers.entries()),\n };\n };\n\n return {\n invoke: async <T = unknown>(method: string, payload?: unknown): Promise<T> => {\n if (method === \"transport.request\") return (await request(payload)) as T;\n if (method === \"transport.download\") return (await download(payload)) as T;\n throw new Error(`不支持的 bridge 方法: ${method}`);\n },\n };\n};\n\nexport const createBrowserPageContext = (\n bootstrap: RuntimeHostBootstrap,\n options: BrowserRuntimeHostOptions = {},\n): PageContext => {\n const route = {\n pathname:\n options.route?.pathname ||\n (typeof window !== \"undefined\" ? window.location.pathname : \"\"),\n fullPath:\n options.route?.fullPath ||\n (typeof window !== \"undefined\"\n ? `${window.location.pathname}${window.location.search}${window.location.hash}`\n : \"\"),\n params: options.route?.params || {},\n query: options.route?.query || {},\n hash:\n options.route?.hash ||\n (typeof window !== \"undefined\" ? window.location.hash : \"\"),\n };\n\n return {\n protocolVersion: bootstrap.asset?.protocolVersion || \"1.0\",\n app: bootstrap.app,\n page: {\n ...bootstrap.page,\n version: bootstrap.asset?.version || bootstrap.page.version,\n buildId: bootstrap.asset?.buildId || bootstrap.page.buildId,\n },\n user: bootstrap.user,\n route,\n env: bootstrap.env || {},\n permissions: {\n canView: bootstrap.permissions?.canView !== false,\n hasFullAccess: bootstrap.permissions?.hasFullAccess === true,\n ...(bootstrap.permissions || {}),\n },\n capabilities: Array.from(\n new Set([\n \"navigation\",\n \"ui.message\",\n \"ui.modal\",\n \"transport.request\",\n \"transport.download\",\n ...(bootstrap.sdk?.supportedBridgeMethods || []),\n ]),\n ),\n ui: {\n message: {\n success: text => options.message?.success?.(text),\n error: text => options.message?.error?.(text),\n warning: text => options.message?.warning?.(text),\n info: text => options.message?.info?.(text),\n loading: text => options.message?.loading?.(text) || (() => undefined),\n },\n modal: {\n confirm: input => options.modal?.confirm?.(input) || Promise.resolve(false),\n },\n },\n navigation: {\n pushPage: (pageKey, query) => options.navigation?.pushPage?.(pageKey, query),\n replacePage: (pageKey, query) =>\n options.navigation?.replacePage?.(pageKey, query),\n pushRoute: (routeValue, query) =>\n options.navigation?.pushRoute?.(routeValue, query),\n replaceRoute: (routeValue, query) =>\n options.navigation?.replaceRoute?.(routeValue, query),\n updateQuery: query => options.navigation?.updateQuery?.(query),\n setHash: hash => options.navigation?.setHash?.(hash),\n back: () => options.navigation?.back?.(),\n },\n bridge: createBrowserPageBridge(options),\n sdk: {\n ...bootstrap.sdk,\n supportedBridgeMethods: [\"transport.request\", \"transport.download\"],\n },\n };\n};\n\nexport const resolveRuntimeAssets = async (\n bootstrap: RuntimeHostBootstrap,\n fetchImpl: typeof fetch = fetch,\n): Promise<LoadedRuntimeAssets> => {\n const boundFetch = createBoundFetch(fetchImpl);\n const fallback: LoadedRuntimeAssets = {\n entryUrl: bootstrap.runtimeAssets?.entryUrl || bootstrap.asset?.entryUrl || \"\",\n cssUrls: bootstrap.runtimeAssets?.cssUrls || bootstrap.asset?.cssAssets || [],\n jsUrls: bootstrap.runtimeAssets?.jsUrls || bootstrap.asset?.jsAssets || [],\n cssIsolation: normalizeCssIsolation(\n bootstrap.runtimeAssets?.cssIsolation ||\n bootstrap.page.capabilities?.cssIsolation,\n ),\n };\n\n if (bootstrap.runtimeAssets?.entryUrl || !bootstrap.asset?.manifestUrl) {\n return fallback;\n }\n\n try {\n const response = await boundFetch(bootstrap.asset.manifestUrl, {\n credentials: \"omit\",\n });\n if (!response.ok) return fallback;\n const manifest = await response.json();\n const base = bootstrap.asset.manifestUrl;\n const resolveUrl = (value: string) => new URL(value, base).toString();\n return {\n entryUrl: manifest?.entry?.url\n ? resolveUrl(manifest.entry.url)\n : fallback.entryUrl,\n cssUrls: Array.isArray(manifest?.assets?.css)\n ? manifest.assets.css.map(resolveUrl)\n : fallback.cssUrls,\n jsUrls: Array.isArray(manifest?.assets?.js)\n ? manifest.assets.js.map(resolveUrl)\n : fallback.jsUrls,\n cssIsolation: normalizeCssIsolation(\n manifest?.style?.isolation || fallback.cssIsolation,\n ),\n };\n } catch {\n return fallback;\n }\n};\n\nexport const fetchBrowserRuntimeBootstrap = async ({\n appType,\n bootstrapPath,\n fetchImpl = fetch,\n pageKey,\n servicePrefix,\n}: BrowserRuntimeBootstrapOptions): Promise<RuntimeHostBootstrap> => {\n if (!appType) {\n throw new Error(\"appType 缺失\");\n }\n if (!pageKey) {\n throw new Error(\"pageKey 缺失\");\n }\n const path =\n bootstrapPath ||\n `/openxiangda-api/v1/apps/${encodeURIComponent(\n appType,\n )}/pages/${encodeURIComponent(pageKey)}/bootstrap`;\n const boundFetch = createBoundFetch(fetchImpl);\n const response = await boundFetch(\n joinServicePath(servicePrefix || getDefaultServicePrefix(), path),\n {\n method: \"GET\",\n credentials: \"include\",\n },\n );\n const payload = await response.json().catch(() => null);\n if (!response.ok) {\n throw new Error(payload?.message || response.statusText || \"获取页面运行时失败\");\n }\n if (\n payload &&\n typeof payload === \"object\" &&\n (\"code\" in payload || \"success\" in payload)\n ) {\n if (payload.success === false || (payload.code && Number(payload.code) !== 200)) {\n throw new Error(payload.message || \"获取页面运行时失败\");\n }\n return (payload.data || {}) as RuntimeHostBootstrap;\n }\n return (payload || {}) as RuntimeHostBootstrap;\n};\n\nexport const resolveBrowserRuntimeRoute = async ({\n appType,\n fetchImpl = fetch,\n path,\n resolvePath,\n search,\n servicePrefix,\n}: BrowserRuntimeRouteResolveOptions): Promise<BrowserRuntimeRouteResolution> => {\n if (!appType) {\n throw new Error(\"appType 缺失\");\n }\n const currentPath =\n path ||\n (typeof window !== \"undefined\" ? window.location.pathname : \"/\");\n const currentSearch =\n search !== undefined\n ? search\n : typeof window !== \"undefined\"\n ? window.location.search\n : \"\";\n const endpoint =\n resolvePath ||\n `/openxiangda-api/v1/apps/${encodeURIComponent(\n appType,\n )}/runtime/routes/resolve`;\n const boundFetch = createBoundFetch(fetchImpl);\n const response = await boundFetch(\n joinServicePath(servicePrefix || getDefaultServicePrefix(), endpoint),\n {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path: currentPath,\n search: currentSearch,\n }),\n },\n );\n const parsed = await parseJsonResponse<BrowserRuntimeRouteResolution>(response);\n if (!parsed.success || !parsed.result) {\n throw new Error(parsed.message || \"解析运行时路由失败\");\n }\n return parsed.result;\n};\n\nexport const loadRuntimeScriptModules = async (\n jsUrls: string[] = [],\n moduleLoader: (url: string) => Promise<unknown> = defaultModuleLoader,\n): Promise<void> => {\n const urls = Array.from(\n new Set(jsUrls.map(url => String(url || \"\").trim()).filter(Boolean)),\n );\n for (const url of urls) {\n await moduleLoader(url);\n }\n};\n\nexport const loadCustomPageModule = async (\n entryUrl: string,\n moduleLoader: (url: string) => Promise<unknown> = defaultModuleLoader,\n jsUrls: string[] = [],\n): Promise<CustomPageModule> => {\n if (!entryUrl) {\n throw new Error(\"代码页面缺少 entryUrl\");\n }\n await loadRuntimeScriptModules(\n jsUrls.filter(url => url && url !== entryUrl),\n moduleLoader,\n );\n const loaded = (await moduleLoader(entryUrl)) as CustomPageModule;\n return loaded?.default && (loaded.default.mount || loaded.default.unmount)\n ? { ...loaded.default, ...loaded }\n : loaded || {};\n};\n\nexport const mountCustomPageRuntime = async ({\n assets,\n container,\n context,\n module,\n}: RuntimeMountOptions): Promise<() => Promise<void>> => {\n const cssIsolation = normalizeCssIsolation(assets?.cssIsolation);\n const mountedLinks: HTMLLinkElement[] = [];\n container.innerHTML = \"\";\n container.classList.toggle(NAMESPACE_ROOT_CLASS, cssIsolation === \"namespace\");\n\n (assets?.cssUrls || []).forEach(href => {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = href;\n link.setAttribute(\"data-openxiangda-runtime-style\", href);\n document.head.appendChild(link);\n mountedLinks.push(link);\n });\n\n await module.mount?.(container, context);\n\n return async () => {\n await module.unmount?.(container, context);\n mountedLinks.forEach(link => link.remove());\n container.classList.remove(NAMESPACE_ROOT_CLASS);\n container.innerHTML = \"\";\n };\n};\n\nexport const mountBrowserPageRuntime = async (\n options: BrowserRuntimeMountOptions,\n): Promise<BrowserRuntimeMountResult> => {\n const bootstrap = await fetchBrowserRuntimeBootstrap({\n appType: options.appType,\n pageKey: options.pageKey,\n bootstrapPath: options.bootstrapPath,\n fetchImpl: options.fetchImpl,\n servicePrefix: options.servicePrefix,\n });\n if (bootstrap.permissions?.canView === false) {\n throw new Error(String(bootstrap.permissions.message || \"您没有权限访问该页面\"));\n }\n const assets = await resolveRuntimeAssets(bootstrap, options.fetchImpl || fetch);\n if (!assets.entryUrl) {\n throw new Error(\"代码页面缺少 entryUrl\");\n }\n const context = createBrowserPageContext(bootstrap, options);\n const module = await loadCustomPageModule(\n assets.entryUrl,\n options.moduleLoader,\n assets.jsUrls,\n );\n const cleanup = await mountCustomPageRuntime({\n assets,\n container: options.container,\n context,\n module,\n });\n return {\n bootstrap,\n assets,\n context,\n module,\n cleanup,\n };\n};\n","import React, {\n type CSSProperties,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\"\nimport {\n Alert,\n Button,\n Card,\n Empty,\n Form,\n Input,\n Space,\n Tabs,\n Typography,\n} from \"antd\"\nimport {\n LoginOutlined,\n MobileOutlined,\n QrcodeOutlined,\n SafetyCertificateOutlined,\n UserOutlined,\n} from \"@ant-design/icons\"\nimport {\n type AppAuthClient,\n type AuthChallengePayload,\n type AuthClientOptions,\n type AuthMethod,\n type AuthTokenData,\n createAuthClient,\n getAuthErrorExtra,\n getAuthErrorReason,\n isAuthChallengeRequired,\n type LoginMethodsResult,\n} from \"../core/auth\"\nimport { useOpenXiangda } from \"./openxiangdaProvider\"\n\nexport interface UseAuthOptions extends Partial<AuthClientOptions> {}\n\nexport interface UseLoginMethodsState {\n data: LoginMethodsResult | null\n methods: AuthMethod[]\n loading: boolean\n error: Error | null\n reload: () => Promise<void>\n}\n\nexport interface LoginPageProps extends UseAuthOptions {\n title?: React.ReactNode\n subtitle?: React.ReactNode\n className?: string\n style?: CSSProperties\n defaultMethod?: \"password\" | \"phone_code\"\n redirectUrl?: string\n redirectOnSuccess?: boolean\n onSuccess?: (data: AuthTokenData) => void | Promise<void>\n}\n\ninterface PasswordFormValues {\n challengeAnswer?: string\n username: string\n password: string\n}\n\ninterface PhoneCodeFormValues {\n phone: string\n code: string\n}\n\nexport const useAuth = (options: UseAuthOptions = {}) => {\n const runtime = useOpenXiangda()\n const client = useMemo(\n () =>\n createAuthClient({\n appType: options.appType || runtime.appType,\n servicePrefix: options.servicePrefix || runtime.servicePrefix,\n fetchImpl: options.fetchImpl || runtime.baseFetchImpl,\n }),\n [\n options.appType,\n options.fetchImpl,\n options.servicePrefix,\n runtime.appType,\n runtime.baseFetchImpl,\n runtime.servicePrefix,\n ],\n )\n\n return useMemo(\n () => ({\n client,\n getMethods: client.getMethods,\n passwordLogin: client.passwordLogin,\n dingtalkLogin: client.dingtalkLogin,\n guestLogin: client.guestLogin,\n sendPhoneCode: client.sendPhoneCode,\n phoneCodeLogin: client.phoneCodeLogin,\n registerWithPhoneCode: client.registerWithPhoneCode,\n getSsoLoginUrl: client.getSsoLoginUrl,\n refresh: client.refresh,\n logout: client.logout,\n resolveLoginUrl: client.resolveLoginUrl,\n }),\n [client],\n )\n}\n\nexport const useLoginMethods = (\n options: UseAuthOptions = {},\n): UseLoginMethodsState => {\n const auth = useAuth(options)\n const [state, setState] = useState<{\n data: LoginMethodsResult | null\n loading: boolean\n error: Error | null\n }>({\n data: null,\n loading: true,\n error: null,\n })\n\n const reload = useCallback(async () => {\n setState(prev => ({ ...prev, loading: true, error: null }))\n try {\n const data = await auth.getMethods()\n setState({ data, loading: false, error: null })\n } catch (error) {\n setState({\n data: null,\n loading: false,\n error: normalizeError(error),\n })\n }\n }, [auth])\n\n useEffect(() => {\n let disposed = false\n const run = async () => {\n setState(prev => ({ ...prev, loading: true, error: null }))\n try {\n const data = await auth.getMethods()\n if (!disposed) setState({ data, loading: false, error: null })\n } catch (error) {\n if (!disposed) {\n setState({\n data: null,\n loading: false,\n error: normalizeError(error),\n })\n }\n }\n }\n void run()\n return () => {\n disposed = true\n }\n }, [auth])\n\n return {\n ...state,\n methods: state.data?.methods || [],\n reload,\n }\n}\n\nexport const LoginPage: React.FC<LoginPageProps> = ({\n title,\n subtitle,\n className,\n style,\n defaultMethod,\n redirectUrl,\n redirectOnSuccess = true,\n onSuccess,\n ...authOptions\n}) => {\n const runtime = useOpenXiangda()\n const auth = useAuth(authOptions)\n const methodsState = useLoginMethods(authOptions)\n const [passwordForm] = Form.useForm<PasswordFormValues>()\n const [phoneForm] = Form.useForm<PhoneCodeFormValues>()\n const [activeMethod, setActiveMethod] = useState<string>(\n defaultMethod || \"password\",\n )\n const [phonePurpose, setPhonePurpose] = useState<\"login\" | \"register\">(\n \"login\",\n )\n const [phoneChallengeId, setPhoneChallengeId] = useState(\"\")\n const [passwordChallenge, setPasswordChallenge] =\n useState<AuthChallengePayload | null>(null)\n const [submitting, setSubmitting] = useState(false)\n const [sendingCode, setSendingCode] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const methods = methodsState.methods.filter(method => method.enabled !== false)\n const passwordMethod = findMethod(methods, \"password\")\n const phoneMethod = findMethod(methods, \"phone_code\")\n const dingtalkMethod = findMethod(methods, \"dingtalk\")\n const ssoMethod = findMethod(methods, \"sso\")\n const guestMethod = findMethod(methods, \"guest\")\n const allowRegister = methodsState.data?.registration?.mode !== \"reject\"\n\n const tabItems = useMemo(() => {\n const items = []\n if (passwordMethod) {\n items.push({\n key: \"password\",\n label: (\n <Space size={6}>\n <UserOutlined />\n <span>{passwordMethod.label || \"账号密码\"}</span>\n </Space>\n ),\n children: (\n <PasswordLoginForm\n challenge={passwordChallenge}\n form={passwordForm}\n loading={submitting}\n onFinish={async values => {\n setSubmitting(true)\n setError(null)\n try {\n await handleSuccess(\n await auth.passwordLogin({\n challengeAnswer: passwordChallenge\n ? values.challengeAnswer\n : undefined,\n challengeId: readChallengeId(passwordChallenge),\n clientFingerprint: getOrCreateLoginFingerprint(auth.client),\n username: values.username,\n password: values.password,\n }),\n )\n setPasswordChallenge(null)\n } catch (loginError) {\n if (isAuthChallengeRequired(loginError)) {\n const nextChallenge = getAuthErrorExtra(loginError)?.challenge\n if (nextChallenge) {\n setPasswordChallenge(nextChallenge)\n passwordForm.setFieldValue(\"challengeAnswer\", \"\")\n }\n } else {\n setPasswordChallenge(null)\n }\n setError(formatAuthErrorMessage(loginError))\n } finally {\n setSubmitting(false)\n }\n }}\n />\n ),\n })\n }\n if (phoneMethod) {\n items.push({\n key: \"phone_code\",\n label: (\n <Space size={6}>\n <MobileOutlined />\n <span>{phoneMethod.label || \"手机号\"}</span>\n </Space>\n ),\n children: (\n <PhoneCodeLoginForm\n allowRegister={allowRegister}\n form={phoneForm}\n loading={submitting}\n phonePurpose={phonePurpose}\n sendingCode={sendingCode}\n onPurposeChange={setPhonePurpose}\n onSendCode={async () => {\n const values = await phoneForm.validateFields([\"phone\"])\n setSendingCode(true)\n setError(null)\n try {\n const result = await auth.sendPhoneCode({\n phone: values.phone,\n purpose: phonePurpose,\n })\n setPhoneChallengeId(result.challengeId)\n } catch (sendError) {\n setError(normalizeError(sendError).message)\n } finally {\n setSendingCode(false)\n }\n }}\n onFinish={async values => {\n setSubmitting(true)\n setError(null)\n try {\n const data =\n phonePurpose === \"register\"\n ? await auth.registerWithPhoneCode({\n phone: values.phone,\n code: values.code,\n challengeId: phoneChallengeId,\n })\n : await auth.phoneCodeLogin({\n phone: values.phone,\n code: values.code,\n challengeId: phoneChallengeId,\n })\n await handleSuccess(data)\n } catch (loginError) {\n setError(normalizeError(loginError).message)\n } finally {\n setSubmitting(false)\n }\n }}\n />\n ),\n })\n }\n return items\n }, [\n allowRegister,\n auth,\n handleSuccess,\n passwordChallenge,\n passwordForm,\n passwordMethod,\n phoneChallengeId,\n phoneForm,\n phoneMethod,\n phonePurpose,\n sendingCode,\n submitting,\n ])\n\n useEffect(() => {\n const firstKey = tabItems[0]?.key\n if (firstKey && !tabItems.some(item => item.key === activeMethod)) {\n setActiveMethod(firstKey)\n }\n }, [activeMethod, tabItems])\n\n const handleDingTalkLogin = async () => {\n setSubmitting(true)\n setError(null)\n try {\n const code = await requestDingTalkCode(dingtalkMethod)\n await handleSuccess(\n await auth.dingtalkLogin({\n code,\n corpId: getString(dingtalkMethod, \"corpId\"),\n }),\n )\n } catch (loginError) {\n setError(normalizeError(loginError).message)\n } finally {\n setSubmitting(false)\n }\n }\n\n const handleSsoLogin = async () => {\n setSubmitting(true)\n setError(null)\n try {\n const redirectUri = getCurrentHref()\n const result = await auth.getSsoLoginUrl({\n protocol: getString(ssoMethod, \"protocol\") || \"cas\",\n redirectUri,\n })\n window.location.assign(result.loginUrl)\n } catch (loginError) {\n setError(normalizeError(loginError).message)\n setSubmitting(false)\n }\n }\n\n const handleGuestLogin = async () => {\n setSubmitting(true)\n setError(null)\n try {\n await handleSuccess(\n await auth.guestLogin({\n guestIdentifier: getOrCreateGuestIdentifier(auth.client),\n domain: getCurrentHostname(),\n }),\n )\n } catch (loginError) {\n setError(normalizeError(loginError).message)\n } finally {\n setSubmitting(false)\n }\n }\n\n async function handleSuccess(data: AuthTokenData) {\n await onSuccess?.(data)\n const accessToken = data.accessToken || data.token\n const accessTokenOptions = {\n expiresAt: data.accessTokenExpiresAt,\n }\n if (accessToken) {\n runtime.setAccessToken(accessToken, accessTokenOptions)\n }\n await runtime.reload(\n accessToken\n ? {\n accessToken,\n accessTokenOptions,\n }\n : undefined,\n )\n if (redirectOnSuccess && typeof window !== \"undefined\") {\n window.location.replace(\n redirectUrl || getCallbackUrl() || `/view/${auth.client.appType}`,\n )\n }\n }\n\n return (\n <div\n className={className}\n style={{\n minHeight: \"100vh\",\n display: \"grid\",\n placeItems: \"center\",\n padding: 24,\n background: \"#f6f8fb\",\n ...style,\n }}\n >\n <Card\n style={{\n width: \"min(100%, 420px)\",\n borderRadius: 8,\n boxShadow: \"0 16px 48px rgba(15, 23, 42, 0.10)\",\n }}\n styles={{ body: { padding: 28 } }}\n >\n <Space direction=\"vertical\" size={20} style={{ width: \"100%\" }}>\n <div>\n <Typography.Title level={3} style={{ margin: 0 }}>\n {title || \"应用登录\"}\n </Typography.Title>\n {subtitle ? (\n <Typography.Text type=\"secondary\">{subtitle}</Typography.Text>\n ) : null}\n </div>\n {methodsState.error ? (\n <Alert\n showIcon\n type=\"error\"\n message={methodsState.error.message}\n />\n ) : null}\n {error ? <Alert showIcon type=\"error\" message={error} /> : null}\n {methodsState.loading ? (\n <Button block loading>\n 加载中\n </Button>\n ) : tabItems.length > 0 ? (\n <Tabs\n activeKey={activeMethod}\n items={tabItems}\n onChange={setActiveMethod}\n />\n ) : (\n <Empty description=\"未启用登录方式\" />\n )}\n <Space direction=\"vertical\" size={10} style={{ width: \"100%\" }}>\n {dingtalkMethod ? (\n <Button\n block\n icon={<QrcodeOutlined />}\n loading={submitting}\n onClick={handleDingTalkLogin}\n >\n {dingtalkMethod.label || \"钉钉免登\"}\n </Button>\n ) : null}\n {ssoMethod ? (\n <Button\n block\n icon={<SafetyCertificateOutlined />}\n loading={submitting}\n onClick={handleSsoLogin}\n >\n {ssoMethod.label || \"SSO 登录\"}\n </Button>\n ) : null}\n {guestMethod ? (\n <Button\n block\n icon={<LoginOutlined />}\n loading={submitting}\n onClick={handleGuestLogin}\n >\n {guestMethod.label || \"访客访问\"}\n </Button>\n ) : null}\n </Space>\n </Space>\n </Card>\n </div>\n )\n}\n\nconst PasswordLoginForm: React.FC<{\n challenge?: AuthChallengePayload | null\n form: ReturnType<typeof Form.useForm<PasswordFormValues>>[0]\n loading: boolean\n onFinish: (values: PasswordFormValues) => void\n}> = ({ challenge, form, loading, onFinish }) => (\n <Form form={form} layout=\"vertical\" requiredMark={false} onFinish={onFinish}>\n <Form.Item\n label=\"账号\"\n name=\"username\"\n rules={[{ required: true, message: \"请输入账号\" }]}\n >\n <Input autoComplete=\"username\" />\n </Form.Item>\n <Form.Item\n label=\"密码\"\n name=\"password\"\n rules={[{ required: true, message: \"请输入密码\" }]}\n >\n <Input.Password autoComplete=\"current-password\" />\n </Form.Item>\n {challenge ? (\n <>\n <Alert\n showIcon\n type=\"warning\"\n message=\"请完成额外验证\"\n description={readChallengeQuestion(challenge) || \"请输入验证码后继续登录。\"}\n />\n <Form.Item\n label=\"验证答案\"\n name=\"challengeAnswer\"\n rules={[{ required: true, message: \"请输入验证答案\" }]}\n >\n <Input autoComplete=\"one-time-code\" />\n </Form.Item>\n </>\n ) : null}\n <Button block htmlType=\"submit\" icon={<LoginOutlined />} loading={loading} type=\"primary\">\n 登录\n </Button>\n </Form>\n)\n\nconst PhoneCodeLoginForm: React.FC<{\n allowRegister: boolean\n form: ReturnType<typeof Form.useForm<PhoneCodeFormValues>>[0]\n loading: boolean\n phonePurpose: \"login\" | \"register\"\n sendingCode: boolean\n onPurposeChange: (purpose: \"login\" | \"register\") => void\n onSendCode: () => Promise<void>\n onFinish: (values: PhoneCodeFormValues) => void\n}> = ({\n allowRegister,\n form,\n loading,\n phonePurpose,\n sendingCode,\n onPurposeChange,\n onSendCode,\n onFinish,\n}) => (\n <Form form={form} layout=\"vertical\" requiredMark={false} onFinish={onFinish}>\n {allowRegister ? (\n <Form.Item style={{ marginBottom: 12 }}>\n <Tabs\n activeKey={phonePurpose}\n items={[\n { key: \"login\", label: \"登录\" },\n { key: \"register\", label: \"注册\" },\n ]}\n onChange={key => onPurposeChange(key === \"register\" ? \"register\" : \"login\")}\n size=\"small\"\n />\n </Form.Item>\n ) : null}\n <Form.Item\n label=\"手机号\"\n name=\"phone\"\n rules={[{ required: true, message: \"请输入手机号\" }]}\n >\n <Input autoComplete=\"tel\" />\n </Form.Item>\n <Form.Item\n label=\"验证码\"\n name=\"code\"\n rules={[{ required: true, message: \"请输入验证码\" }]}\n >\n <Input\n addonAfter={\n <Button\n loading={sendingCode}\n onClick={onSendCode}\n size=\"small\"\n type=\"link\"\n >\n 发送\n </Button>\n }\n autoComplete=\"one-time-code\"\n />\n </Form.Item>\n <Button block htmlType=\"submit\" icon={<MobileOutlined />} loading={loading} type=\"primary\">\n {phonePurpose === \"register\" ? \"注册\" : \"登录\"}\n </Button>\n </Form>\n)\n\nconst findMethod = (methods: AuthMethod[], type: string) =>\n methods.find(method => method.type === type)\n\nconst normalizeError = (error: unknown): Error =>\n error instanceof Error ? error : new Error(String(error || \"请求失败\"))\n\nconst formatAuthErrorMessage = (error: unknown) => {\n const normalized = normalizeError(error)\n const extra = getAuthErrorExtra(error)\n const reason = getAuthErrorReason(error)\n if (isAuthChallengeRequired(error)) {\n return extra?.challenge?.question\n ? \"请完成下方验证后再登录\"\n : normalized.message || \"请先完成额外验证后再尝试登录\"\n }\n if (\n reason === \"LOGIN_BLOCKED\" ||\n reason === \"USERNAME_BLOCKED\" ||\n reason === \"IP_BLOCKED\" ||\n reason === \"ACCOUNT_LOCKED\"\n ) {\n const retryAfter = Number(extra?.retryAfter ?? extra?.retryAfterSeconds)\n if (Number.isFinite(retryAfter) && retryAfter > 0) {\n const minutes = Math.ceil(retryAfter / 60)\n return `登录受限,请约 ${minutes} 分钟后再试或联系管理员`\n }\n }\n return normalized.message || \"登录失败\"\n}\n\nconst getString = (value: unknown, key: string) => {\n if (!value || typeof value !== \"object\") return undefined\n const result = (value as Record<string, unknown>)[key]\n return typeof result === \"string\" ? result : undefined\n}\n\nconst requestDingTalkCode = (method?: AuthMethod): Promise<string> => {\n const dd =\n typeof window === \"undefined\"\n ? undefined\n : (window as unknown as { dd?: any }).dd\n const corpId = getString(method, \"corpId\")\n return new Promise((resolve, reject) => {\n const requestAuthCode =\n dd?.runtime?.permission?.requestAuthCode || dd?.requestAuthCode\n if (!requestAuthCode) {\n reject(new Error(\"当前环境不支持钉钉免登\"))\n return\n }\n requestAuthCode({\n corpId,\n onSuccess: (result: { code?: string }) => {\n if (result?.code) resolve(result.code)\n else reject(new Error(\"钉钉未返回免登码\"))\n },\n onFail: (error: unknown) => reject(normalizeError(error)),\n })\n })\n}\n\nconst getOrCreateGuestIdentifier = (client: AppAuthClient) => {\n const key = `openxiangda:${client.appType}:guest_id`\n if (typeof window === \"undefined\") return createGuestIdentifier()\n const current = window.localStorage.getItem(key)\n if (current) return current\n const next = createGuestIdentifier()\n window.localStorage.setItem(key, next)\n return next\n}\n\nconst getOrCreateLoginFingerprint = (client: AppAuthClient) => {\n const key = `openxiangda:${client.appType}:login_fingerprint`\n if (typeof window === \"undefined\") return createGuestIdentifier()\n const current = window.localStorage.getItem(key)\n const id = current || createGuestIdentifier()\n if (!current) window.localStorage.setItem(key, id)\n return `${id}:${window.navigator?.userAgent || \"unknown\"}`\n}\n\nconst createGuestIdentifier = () =>\n `guest_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`\n\nconst readChallengeId = (challenge?: AuthChallengePayload | null) => {\n if (!challenge) return undefined\n const id = challenge.id || challenge.challengeId\n return typeof id === \"string\" && id.trim() ? id.trim() : undefined\n}\n\nconst readChallengeQuestion = (challenge: AuthChallengePayload) =>\n typeof challenge.question === \"string\" ? challenge.question : undefined\n\nconst getCurrentHref = () =>\n typeof window === \"undefined\" ? \"\" : window.location.href\n\nconst getCurrentHostname = () =>\n typeof window === \"undefined\" ? \"\" : window.location.hostname\n\nconst getCallbackUrl = () => {\n if (typeof window === \"undefined\") return \"\"\n const query = new URLSearchParams(window.location.search)\n return query.get(\"callback\") || query.get(\"redirectUri\") || \"\"\n}\n","import { createBoundFetch } from \"./fetch\"\n\nexport type AuthMethodType =\n | \"password\"\n | \"dingtalk\"\n | \"sso\"\n | \"guest\"\n | \"phone_code\"\n | string\n\nexport interface AuthMethod {\n type: AuthMethodType\n enabled?: boolean\n label?: string\n protocol?: string\n [key: string]: unknown\n}\n\nexport interface LoginMethodsResult {\n appType: string\n configCode?: string\n methods: AuthMethod[]\n registration?: {\n mode?: string\n [key: string]: unknown\n }\n security?: {\n hideFailureReason?: boolean\n [key: string]: unknown\n }\n defaultRedirectUrl?: string\n}\n\nexport interface AuthUser {\n id: string\n username?: string\n name?: string\n phone?: string | null\n email?: string | null\n avatar?: string | null\n jobNumber?: string | null\n departments?: Array<Record<string, unknown>>\n affiliatedDepartmentId?: string | null\n affiliatedDepartment?: Record<string, unknown> | null\n [key: string]: unknown\n}\n\nexport interface AuthTokenData {\n accessToken: string\n refreshToken: string\n token?: string\n accessTokenExpiresAt?: number\n refreshTokenExpiresAt?: number\n user?: AuthUser\n guestUser?: AuthUser\n [key: string]: unknown\n}\n\nexport interface PhoneCodeSendResult {\n challengeId: string\n expiresAt?: string | Date\n ttlSeconds?: number\n message?: string\n}\n\nexport interface AuthChallengePayload {\n id?: string\n challengeId?: string\n type?: string\n question?: string\n attemptsLeft?: number\n expireAt?: number | string | Date\n expiresAt?: number | string | Date\n [key: string]: unknown\n}\n\nexport interface AuthErrorExtra {\n reason?: string\n guardCode?: string\n challenge?: AuthChallengePayload\n retryAfter?: number\n retryAfterSeconds?: number\n remainingAttempts?: number\n lockUntil?: string | Date | null\n [key: string]: unknown\n}\n\nexport interface SsoLoginUrlResult {\n loginUrl: string\n protocol?: string\n}\n\nexport interface AuthClientOptions {\n appType: string\n servicePrefix?: string\n fetchImpl?: typeof fetch\n}\n\nexport interface PasswordLoginInput {\n username: string\n password: string\n clientFingerprint?: string\n challengeId?: string\n challengeAnswer?: string\n}\n\nexport interface DingTalkLoginInput {\n code: string\n corpId?: string\n}\n\nexport interface GuestLoginInput {\n guestIdentifier?: string\n domain?: string\n ipAddress?: string\n userAgent?: string\n formUuid?: string\n}\n\nexport interface PhoneCodeInput {\n phone: string\n purpose?: \"login\" | \"register\" | string\n}\n\nexport interface PhoneCodeLoginInput {\n phone: string\n code: string\n challengeId?: string\n}\n\nexport interface PhoneCodeRegisterInput extends PhoneCodeLoginInput {\n name?: string\n email?: string\n}\n\nexport interface SsoLoginUrlInput {\n protocol?: string\n redirectUri?: string\n}\n\nexport interface RefreshInput {\n refreshToken?: string\n}\n\nexport interface ResolveLoginUrlInput {\n callbackUrl?: string\n callbackParamName?: string\n loginUrl?: string\n}\n\nexport interface AppAuthClient {\n appType: string\n servicePrefix: string\n getMethods: () => Promise<LoginMethodsResult>\n passwordLogin: (input: PasswordLoginInput) => Promise<AuthTokenData>\n dingtalkLogin: (input: DingTalkLoginInput) => Promise<AuthTokenData>\n guestLogin: (input?: GuestLoginInput) => Promise<AuthTokenData>\n sendPhoneCode: (input: PhoneCodeInput) => Promise<PhoneCodeSendResult>\n phoneCodeLogin: (input: PhoneCodeLoginInput) => Promise<AuthTokenData>\n registerWithPhoneCode: (\n input: PhoneCodeRegisterInput,\n ) => Promise<AuthTokenData>\n getSsoLoginUrl: (input?: SsoLoginUrlInput) => Promise<SsoLoginUrlResult>\n refresh: (input?: RefreshInput) => Promise<AuthTokenData>\n logout: () => Promise<void>\n resolveLoginUrl: (input?: ResolveLoginUrlInput) => string\n}\n\nexport interface AuthClientErrorOptions {\n status?: number\n code?: number | string\n payload?: unknown\n extra?: AuthErrorExtra\n}\n\nexport class AuthClientError extends Error {\n status?: number\n code?: number | string\n payload?: unknown\n extra?: AuthErrorExtra\n reason?: string\n challenge?: AuthChallengePayload\n retryAfter?: number\n remainingAttempts?: number\n lockUntil?: string | Date | null\n\n constructor(message: string, options: AuthClientErrorOptions = {}) {\n super(message)\n this.name = \"AuthClientError\"\n this.status = options.status\n this.code = options.code\n this.payload = options.payload\n this.extra = normalizeAuthErrorExtra(\n options.extra || getRecordValue(options.payload, \"extra\"),\n )\n this.reason =\n this.extra?.reason ||\n this.extra?.guardCode ||\n (typeof options.code === \"string\" ? options.code : undefined)\n this.challenge = this.extra?.challenge\n this.retryAfter = readNumber(\n this.extra?.retryAfter ?? this.extra?.retryAfterSeconds,\n )\n this.remainingAttempts = readNumber(this.extra?.remainingAttempts)\n this.lockUntil = (this.extra?.lockUntil as string | Date | null | undefined) ?? null\n }\n}\n\nexport const isAuthClientError = (error: unknown): error is AuthClientError => {\n if (error instanceof AuthClientError) return true\n return Boolean(\n error &&\n typeof error === \"object\" &&\n (error as Record<string, unknown>).name === \"AuthClientError\",\n )\n}\n\nexport const getAuthErrorExtra = (\n error: unknown,\n): AuthErrorExtra | undefined => {\n if (!error || typeof error !== \"object\") return undefined\n const record = error as Record<string, unknown>\n return normalizeAuthErrorExtra(record.extra || getRecordValue(record.payload, \"extra\"))\n}\n\nexport const getAuthErrorReason = (error: unknown) => {\n if (!error || typeof error !== \"object\") return undefined\n const record = error as Record<string, unknown>\n const extra = getAuthErrorExtra(error)\n return (\n extra?.reason ||\n extra?.guardCode ||\n (typeof record.reason === \"string\" ? record.reason : undefined) ||\n (typeof record.code === \"string\" ? record.code : undefined)\n )\n}\n\nexport const isAuthChallengeRequired = (error: unknown) => {\n if (!error || typeof error !== \"object\") return false\n const record = error as Record<string, unknown>\n const code = record.code\n const reason = getAuthErrorReason(error)\n const extra = getAuthErrorExtra(error)\n return (\n code === 460 ||\n code === \"460\" ||\n code === \"LOGIN_CHALLENGE_REQUIRED\" ||\n reason === \"LOGIN_CHALLENGE_REQUIRED\" ||\n reason === \"CHALLENGE_REQUIRED\" ||\n extra?.guardCode === \"LOGIN_CHALLENGE_REQUIRED\"\n )\n}\n\nexport const createAuthClient = ({\n appType,\n servicePrefix = \"/service\",\n fetchImpl,\n}: AuthClientOptions): AppAuthClient => {\n const normalizedAppType = String(appType || \"\").trim()\n if (!normalizedAppType) {\n throw new Error(\"appType 不能为空\")\n }\n const boundFetch = createBoundFetch(fetchImpl)\n const request = async <T>(\n path: string,\n options: RequestInit = {},\n ): Promise<T> => {\n const response = await boundFetch(buildServiceUrl(servicePrefix, path), {\n credentials: \"include\",\n ...options,\n headers: {\n accept: \"application/json\",\n ...(options.body ? { \"content-type\": \"application/json\" } : {}),\n ...(options.headers || {}),\n },\n })\n const payload = await readPayload(response)\n const code = getRecordValue(payload, \"code\")\n const success = getRecordValue(payload, \"success\")\n if (!response.ok || success === false || !isSuccessCode(code)) {\n throw new AuthClientError(\n String(getRecordValue(payload, \"message\") || `Auth request failed: ${response.status}`),\n {\n status: response.status,\n code: code as number | string | undefined,\n payload,\n extra: normalizeAuthErrorExtra(getRecordValue(payload, \"extra\")),\n },\n )\n }\n return unwrapPayload<T>(payload)\n }\n\n const appAuthPath = (suffix: string) =>\n `/openxiangda-api/v1/apps/${encodeURIComponent(normalizedAppType)}/auth${suffix}`\n\n return {\n appType: normalizedAppType,\n servicePrefix,\n getMethods: () => request<LoginMethodsResult>(appAuthPath(\"/methods\")),\n passwordLogin: input =>\n request<AuthTokenData>(appAuthPath(\"/password/login\"), postJson(input)),\n dingtalkLogin: input =>\n request<AuthTokenData>(appAuthPath(\"/dingtalk/login\"), postJson(input)),\n guestLogin: input =>\n request<AuthTokenData>(appAuthPath(\"/guest/login\"), postJson(input || {})),\n sendPhoneCode: input =>\n request<PhoneCodeSendResult>(appAuthPath(\"/phone-code/send\"), postJson(input)),\n phoneCodeLogin: input =>\n request<AuthTokenData>(appAuthPath(\"/phone-code/login\"), postJson(input)),\n registerWithPhoneCode: input =>\n request<AuthTokenData>(appAuthPath(\"/phone-code/register\"), postJson(input)),\n getSsoLoginUrl: input =>\n request<SsoLoginUrlResult>(appAuthPath(\"/sso/login-url\"), postJson(input || {})),\n refresh: input =>\n request<AuthTokenData>(appAuthPath(\"/refresh\"), postJson(input || {})),\n logout: async () => {\n await request<null>(appAuthPath(\"/logout\"), { method: \"POST\" })\n },\n resolveLoginUrl: input =>\n resolveLoginUrl(normalizedAppType, input || {}),\n }\n}\n\nconst postJson = (body: unknown): RequestInit => ({\n method: \"POST\",\n body: JSON.stringify(body || {}),\n})\n\nconst buildServiceUrl = (servicePrefix: string, path: string) => {\n const prefix = servicePrefix.endsWith(\"/\")\n ? servicePrefix.slice(0, -1)\n : servicePrefix\n const suffix = path.startsWith(\"/\") ? path : `/${path}`\n return `${prefix}${suffix}`\n}\n\nconst readPayload = async (response: Response) => {\n try {\n return await response.json()\n } catch {\n return null\n }\n}\n\nconst unwrapPayload = <T>(payload: unknown): T => {\n if (!payload || typeof payload !== \"object\") return payload as T\n const record = payload as Record<string, unknown>\n if (\"data\" in record) return record.data as T\n return payload as T\n}\n\nconst getRecordValue = (value: unknown, key: string) => {\n if (!value || typeof value !== \"object\") return undefined\n return (value as Record<string, unknown>)[key]\n}\n\nconst normalizeAuthErrorExtra = (value: unknown): AuthErrorExtra | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n const record = value as Record<string, unknown>\n const challenge =\n record.challenge && typeof record.challenge === \"object\" && !Array.isArray(record.challenge)\n ? (record.challenge as AuthChallengePayload)\n : undefined\n const reason = readString(record.reason)\n const guardCode = readString(record.guardCode)\n return {\n ...record,\n ...(reason ? { reason } : {}),\n ...(guardCode ? { guardCode } : {}),\n ...(challenge ? { challenge } : {}),\n ...(readNumber(record.retryAfter) !== undefined\n ? { retryAfter: readNumber(record.retryAfter) }\n : {}),\n ...(readNumber(record.retryAfterSeconds) !== undefined\n ? { retryAfterSeconds: readNumber(record.retryAfterSeconds) }\n : {}),\n ...(readNumber(record.remainingAttempts) !== undefined\n ? { remainingAttempts: readNumber(record.remainingAttempts) }\n : {}),\n } as AuthErrorExtra\n}\n\nconst readString = (value: unknown) =>\n typeof value === \"string\" ? value : undefined\n\nconst readNumber = (value: unknown) => {\n const numberValue = Number(value)\n return Number.isFinite(numberValue) ? numberValue : undefined\n}\n\nconst isSuccessCode = (code: unknown) => {\n if (code === undefined || code === null || code === \"\") return true\n const normalized = Number(code)\n return Number.isFinite(normalized)\n ? normalized === 0 || (normalized >= 200 && normalized < 300)\n : false\n}\n\nconst resolveLoginUrl = (\n appType: string,\n {\n callbackUrl = getCurrentHref(),\n callbackParamName = \"callback\",\n loginUrl,\n }: ResolveLoginUrlInput,\n) => {\n const target = loginUrl || `/view/${encodeURIComponent(appType)}/login`\n if (!callbackUrl) return target\n try {\n const base =\n typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\"\n const url = new URL(target, base)\n if (!url.searchParams.has(callbackParamName)) {\n url.searchParams.set(callbackParamName, callbackUrl)\n }\n if (target.startsWith(\"http://\") || target.startsWith(\"https://\")) {\n return url.toString()\n }\n return `${url.pathname}${url.search}${url.hash}`\n } catch {\n const separator = target.includes(\"?\") ? \"&\" : \"?\"\n return `${target}${separator}${callbackParamName}=${encodeURIComponent(callbackUrl)}`\n }\n}\n\nconst getCurrentHref = () =>\n typeof window === \"undefined\" ? \"\" : window.location.href\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport {\n createPublicAccessClient,\n PublicAccessClientError,\n type PublicAccessClaim,\n type PublicAccessSessionData,\n type PublicAccessSessionInput,\n} from \"../core/publicAccess\"\nimport { useOpenXiangda } from \"./openxiangdaProvider\"\n\nexport interface UsePublicAccessOptions extends PublicAccessSessionInput {\n appType?: string\n servicePrefix?: string\n fetchImpl?: typeof fetch\n autoStart?: boolean\n}\n\nexport interface UsePublicAccessState {\n loading: boolean\n error: PublicAccessClientError | null\n session: PublicAccessSessionData | null\n publicAccess: PublicAccessClaim | null\n startSession: (\n input?: PublicAccessSessionInput,\n ) => Promise<PublicAccessSessionData>\n}\n\nexport const usePublicAccess = (\n options: UsePublicAccessOptions = {},\n): UsePublicAccessState => {\n const runtime = useOpenXiangda()\n const {\n appType: runtimeAppType,\n servicePrefix: runtimeServicePrefix,\n baseFetchImpl: runtimeBaseFetchImpl,\n reload: reloadRuntime,\n setAccessToken,\n } = runtime\n const {\n appType = runtimeAppType,\n servicePrefix = runtimeServicePrefix,\n fetchImpl = runtimeBaseFetchImpl,\n autoStart = true,\n ...sessionInput\n } = options\n const [session, setSession] = useState<PublicAccessSessionData | null>(null)\n const [error, setError] = useState<PublicAccessClientError | null>(null)\n const [loading, setLoading] = useState(Boolean(autoStart))\n const activeSessionRef = useRef<{\n accessToken: string\n path?: string\n } | null>(null)\n const mountedRef = useRef(true)\n const sessionInputKey = JSON.stringify(sessionInput)\n const stableSessionInput = useMemo(() => sessionInput, [sessionInputKey])\n\n const client = useMemo(\n () =>\n createPublicAccessClient({\n appType,\n servicePrefix,\n fetchImpl,\n }),\n [appType, fetchImpl, servicePrefix],\n )\n\n const startSession = useCallback(\n async (input: PublicAccessSessionInput = {}) => {\n setLoading(true)\n setError(null)\n try {\n const resolvedPath =\n input.path || stableSessionInput.path || readPathFromLocation()\n const data = await client.startSession({\n ...stableSessionInput,\n ...input,\n ticket:\n input.ticket || stableSessionInput.ticket || readTicketFromLocation(),\n path: resolvedPath,\n })\n if (!mountedRef.current) return data\n activeSessionRef.current = {\n accessToken: data.accessToken,\n path: resolvedPath,\n }\n setSession(data)\n setAccessToken(data.accessToken, {\n scope: \"public\",\n path: resolvedPath,\n })\n await reloadRuntime({\n accessToken: data.accessToken,\n accessTokenOptions: {\n scope: \"public\",\n path: resolvedPath,\n },\n })\n if (!mountedRef.current) return data\n setLoading(false)\n return data\n } catch (caught) {\n const nextError =\n caught instanceof PublicAccessClientError\n ? caught\n : new PublicAccessClientError(\n caught instanceof Error ? caught.message : \"公开访问会话创建失败\",\n { payload: caught },\n )\n if (mountedRef.current) {\n setError(nextError)\n setLoading(false)\n }\n throw nextError\n }\n },\n [client, reloadRuntime, setAccessToken, stableSessionInput],\n )\n\n useEffect(() => {\n if (!autoStart) return\n void startSession().catch(() => undefined)\n }, [autoStart, startSession])\n\n useEffect(\n () => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n const activeSession = activeSessionRef.current\n if (!activeSession) return\n activeSessionRef.current = null\n setAccessToken(null, { clearIfToken: activeSession.accessToken })\n void reloadRuntime({ accessToken: null })\n }\n },\n [reloadRuntime, setAccessToken],\n )\n\n return {\n loading,\n error,\n session,\n publicAccess: session?.publicAccess || null,\n startSession,\n }\n}\n\nexport interface PublicAccessGateProps extends UsePublicAccessOptions {\n children: React.ReactNode\n fallback?: React.ReactNode\n errorFallback?: React.ReactNode | ((error: PublicAccessClientError) => React.ReactNode)\n}\n\nexport const PublicAccessGate: React.FC<PublicAccessGateProps> = ({\n children,\n fallback = null,\n errorFallback = null,\n ...options\n}) => {\n const state = usePublicAccess(options)\n if (state.loading) return <>{fallback}</>\n if (state.error) {\n return (\n <>\n {typeof errorFallback === \"function\"\n ? errorFallback(state.error)\n : errorFallback}\n </>\n )\n }\n return <>{children}</>\n}\n\nconst readTicketFromLocation = () => {\n if (typeof window === \"undefined\") return undefined\n return new URLSearchParams(window.location.search).get(\"ticket\") || undefined\n}\n\nconst readPathFromLocation = () =>\n typeof window === \"undefined\" ? undefined : window.location.pathname\n","import { createBoundFetch } from \"./fetch\"\nimport type { AuthTokenData } from \"./auth\"\n\nexport type PublicStorageAction = \"upload\" | \"preview\" | \"download\"\n\nexport interface PublicStorageGrant {\n bucketName: string\n actions: PublicStorageAction[]\n allowedMimeTypes?: string[]\n allowedExtensions?: string[]\n maxSizeBytes?: number\n visibility?: \"public\" | \"private\"\n pathPrefix?: string\n}\n\nexport interface PublicAccessClaim {\n type: \"openxiangda_public\"\n appType: string\n policyCode: string\n routeCode?: string\n pathPattern?: string\n mode: \"guest\" | \"ticket\"\n externalRoleCodes: string[]\n grants: {\n forms?: string[]\n dataViews?: string[]\n functions?: string[]\n connectors?: string[]\n storage?: PublicStorageGrant[]\n }\n issuedAt: string\n expiresAt?: string | null\n ticketId?: string | null\n guestIdentifier?: string\n}\n\nexport interface PublicAccessSessionInput {\n policyCode?: string\n routeCode?: string\n path?: string\n ticket?: string\n guestIdentifier?: string\n domain?: string\n ipAddress?: string\n userAgent?: string\n}\n\nexport interface PublicAccessSessionData extends AuthTokenData {\n publicAccess?: PublicAccessClaim | null\n raw?: unknown\n}\n\nexport interface PublicAccessClientOptions {\n appType: string\n servicePrefix?: string\n fetchImpl?: typeof fetch\n}\n\nexport interface PublicAccessClient {\n appType: string\n servicePrefix: string\n startSession: (\n input?: PublicAccessSessionInput,\n ) => Promise<PublicAccessSessionData>\n}\n\nexport class PublicAccessClientError extends Error {\n status?: number\n code?: number | string\n payload?: unknown\n\n constructor(\n message: string,\n options: { status?: number; code?: number | string; payload?: unknown } = {},\n ) {\n super(message)\n this.name = \"PublicAccessClientError\"\n this.status = options.status\n this.code = options.code\n this.payload = options.payload\n }\n}\n\nexport const createPublicAccessClient = ({\n appType,\n servicePrefix = \"/service\",\n fetchImpl,\n}: PublicAccessClientOptions): PublicAccessClient => {\n const normalizedAppType = String(appType || \"\").trim()\n if (!normalizedAppType) {\n throw new Error(\"appType 不能为空\")\n }\n const boundFetch = createBoundFetch(fetchImpl)\n const request = async (\n input: PublicAccessSessionInput = {},\n ): Promise<PublicAccessSessionData> => {\n const body: PublicAccessSessionInput = {\n ...input,\n path: input.path || getCurrentPathname(),\n domain: input.domain || getCurrentDomain(),\n userAgent: input.userAgent || getCurrentUserAgent(),\n guestIdentifier:\n input.guestIdentifier || getOrCreatePublicGuestIdentifier(normalizedAppType),\n }\n const response = await boundFetch(\n buildServiceUrl(\n servicePrefix,\n `/openxiangda-api/v1/apps/${encodeURIComponent(\n normalizedAppType,\n )}/public/session`,\n ),\n {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(body),\n },\n )\n const payload = await readPayload(response)\n const code = getRecordValue(payload, \"code\")\n const success = getRecordValue(payload, \"success\")\n if (!response.ok || success === false || !isSuccessCode(code)) {\n throw new PublicAccessClientError(\n String(\n getRecordValue(payload, \"message\") ||\n `Public access session failed: ${response.status}`,\n ),\n { status: response.status, code: code as number | string | undefined, payload },\n )\n }\n const data = getRecordValue(payload, \"data\") as AuthTokenData\n const extra = getRecordValue(payload, \"extra\") as\n | Record<string, unknown>\n | undefined\n return {\n ...data,\n publicAccess: (extra?.publicAccess as PublicAccessClaim | undefined) || null,\n raw: payload,\n }\n }\n\n return {\n appType: normalizedAppType,\n servicePrefix,\n startSession: request,\n }\n}\n\nconst buildServiceUrl = (servicePrefix: string, path: string) => {\n const prefix = servicePrefix.endsWith(\"/\")\n ? servicePrefix.slice(0, -1)\n : servicePrefix\n const suffix = path.startsWith(\"/\") ? path : `/${path}`\n return `${prefix}${suffix}`\n}\n\nconst readPayload = async (response: Response) => {\n try {\n return await response.json()\n } catch {\n return null\n }\n}\n\nconst getRecordValue = (value: unknown, key: string) => {\n if (!value || typeof value !== \"object\") return undefined\n return (value as Record<string, unknown>)[key]\n}\n\nconst isSuccessCode = (code: unknown) => {\n if (code === undefined || code === null || code === \"\") return true\n const normalized = Number(code)\n return Number.isFinite(normalized)\n ? normalized === 0 || (normalized >= 200 && normalized < 300)\n : false\n}\n\nconst getCurrentPathname = () =>\n typeof window === \"undefined\" ? undefined : window.location.pathname\n\nconst getCurrentDomain = () =>\n typeof window === \"undefined\" ? undefined : window.location.host\n\nconst getCurrentUserAgent = () =>\n typeof navigator === \"undefined\" ? undefined : navigator.userAgent\n\nconst getOrCreatePublicGuestIdentifier = (appType: string) => {\n const key = `openxiangda:public:guest:${appType}`\n try {\n if (typeof window !== \"undefined\" && window.localStorage) {\n const existing = window.localStorage.getItem(key)\n if (existing) return existing\n const next = createRandomIdentifier(appType)\n window.localStorage.setItem(key, next)\n return next\n }\n } catch {\n // ignore storage failures and fall back to an in-memory value.\n }\n return createRandomIdentifier(appType)\n}\n\nconst createRandomIdentifier = (appType: string) => {\n const random =\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : Math.random().toString(36).slice(2)\n return `public:${appType}:${random}`\n}\n"],"mappings":"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","names":["React","process","jsx","React","useMemo","useMemo","response","useCallback","useEffect","useMemo","useState","useState","useCallback","useEffect","useMemo","useCallback","useEffect","useMemo","useRef","useState","Input","Modal","Select","ReloadOutlined","RollbackOutlined","useEffect","useMemo","useState","message","Fragment","jsx","useState","useEffect","useMemo","useMemo","jsx","jsxs","useMemo","Button","UserOutlined","jsx","jsxs","useCallback","useEffect","useMemo","useRef","useState","Button","Empty","Modal","Space","Tag","message","hasOwn","isSuccessCode","useCallback","useEffect","useMemo","useState","Button","Modal","UserOutlined","useCallback","useEffect","useMemo","useRef","useState","useState","useRef","useCallback","useEffect","useMemo","jsx","jsxs","useState","useMemo","useEffect","useCallback","UserOutlined","Button","Modal","jsx","jsxs","getUserId","useState","useMemo","useEffect","useCallback","message","Button","Space","Tag","Empty","useRef","Modal","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","message","RollbackOutlined","ReloadOutlined","useMemo","Modal","Input","Select","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","message","normalizeMethod","normalizeEnvelopeCode","isSuccessCode","message","normalizeMethod","useCallback","useEffect","useMemo","useState","Button","Empty","Form","Input","Space","Typography","UserOutlined","message","isSuccessCode","getCurrentHref","Fragment","jsx","jsxs","useMemo","useState","useCallback","useEffect","Form","Space","UserOutlined","getCurrentHref","Typography","Button","Empty","Input","Fragment","jsx","createContext","useMemo","useState","useRef","useCallback","buildServiceUrl","getRecordValue","state","useEffect","useContext","message","resolveLoginUrl","getCurrentHref","getCurrentHostname","isSuccessCode","useCallback","useEffect","useMemo","useRef","useState","message","getCurrentPathname","buildServiceUrl","readPayload","getRecordValue","isSuccessCode","Fragment","jsx","useState","useRef","useMemo","useCallback","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/react/createReactPage.tsx","../../src/runtime/react/provider.tsx","../../src/runtime/react/store.ts","../../src/runtime/core/client.ts","../../src/styles/antd-theme.ts","../../src/runtime/react/hooks/useCurrentUser.ts","../../src/runtime/react/hooks/usePageContext.ts","../../src/runtime/react/hooks/useDataSource.ts","../../src/runtime/react/hooks/usePageSdk.ts","../../src/runtime/react/hooks/useFormViewPermissions.ts","../../src/runtime/react/hooks/useMessage.ts","../../src/runtime/react/hooks/useModal.ts","../../src/runtime/react/hooks/useNavigation.ts","../../src/runtime/react/hooks/usePageProps.ts","../../src/runtime/react/hooks/usePageRoute.ts","../../src/runtime/react/workflow.tsx","../../src/components/modules/StickyActionBar.tsx","../../src/components/utils/confirmAction.ts","../../src/components/modules/ApprovalTimeline.tsx","../../src/components/core/constants.ts","../../src/components/modules/ProcessPreview.tsx","../../src/components/modules/InitiatorApproverSelector.tsx","../../src/components/core/processApi.ts","../../src/components/fields/shared/UserPicker.tsx","../../src/components/fields/shared/fieldFormat.ts","../../src/components/fields/shared/useLazyDepartmentTree.ts","../../src/runtime/react/openxiangdaProvider.tsx","../../src/runtime/core/fetch.ts","../../src/runtime/host/browserHost.ts","../../src/runtime/react/auth.tsx","../../src/runtime/core/auth.ts","../../src/runtime/react/publicAccess.tsx","../../src/runtime/core/publicAccess.ts"],"sourcesContent":["import { StyleProvider } from \"@ant-design/cssinjs\";\nimport { App as AntdApp, ConfigProvider, message } from \"antd\";\nimport zhCN from \"antd/locale/zh_CN.js\";\nimport dayjs from \"dayjs\";\nimport \"dayjs/locale/zh-cn.js\";\nimport React from \"react\";\nimport { createRoot } from \"react-dom/client\";\n\nimport { PageProvider } from \"./provider\";\nimport { antdTheme, legacyAntdTheme } from \"../../styles/antd-theme\";\n\nimport type { PageContext } from \"../core/types\";\n\ndayjs.locale(\"zh-cn\");\n\ntype RootLike = {\n render: (node: React.ReactNode) => void;\n unmount: () => void;\n};\n\nconst NAMESPACE_ROOT_CLASS = \"sy-app-workspace\";\nconst RUNTIME_PORTAL_ATTR = \"data-sy-runtime-portal\";\nconst PORTAL_CONTAINER_STACK_GLOBAL = \"__OPENXIANGDA_PORTAL_CONTAINER_STACK__\";\nconst PORTAL_CONTAINER_RESOLVER_GLOBAL = \"__OPENXIANGDA_GET_PORTAL_CONTAINER__\";\nconst MESSAGE_PROXY_GLOBAL = \"__OPENXIANGDA_ANTD_MESSAGE_PROXY__\";\nconst MESSAGE_METHODS = [\n \"open\",\n \"success\",\n \"info\",\n \"warning\",\n \"error\",\n \"loading\",\n \"destroy\",\n] as const;\n\ntype RuntimePortalHandle = {\n container: HTMLElement | null;\n release: () => void;\n};\n\ntype RuntimeCssIsolation = \"none\" | \"namespace\" | \"shadow\";\n\ntype MessageMethod = (typeof MESSAGE_METHODS)[number];\n\ntype AntdMessageProxyState = {\n apiStack: Array<Record<string, unknown>>;\n installed: boolean;\n originalMethods: Partial<Record<MessageMethod, (...args: unknown[]) => unknown>>;\n};\n\nconst createRuntimeRoot = (el: HTMLElement): RootLike => {\n return createRoot(el);\n};\n\nconst normalizeCssIsolation = (value: unknown): RuntimeCssIsolation => {\n if (value === \"namespace\" || value === \"shadow\") return value;\n return \"none\";\n};\n\nconst usesLegacyCssIsolation = (cssIsolation: RuntimeCssIsolation) =>\n cssIsolation === \"namespace\" || cssIsolation === \"shadow\";\n\nconst getRuntimeCssIsolation = (context: PageContext): RuntimeCssIsolation =>\n normalizeCssIsolation(context.page?.capabilities?.cssIsolation);\n\nconst getAntdRuntimeOptions = (cssIsolation: RuntimeCssIsolation) => {\n const legacy = usesLegacyCssIsolation(cssIsolation);\n return {\n prefixCls: legacy ? \"sy-ant\" : \"ant\",\n iconPrefixCls: legacy ? \"sy-anticon\" : \"anticon\",\n messagePrefixCls: legacy ? \"sy-ant-message\" : \"ant-message\",\n theme: legacy ? legacyAntdTheme : antdTheme,\n };\n};\n\nconst isShadowRoot = (rootNode: Node | null | undefined): rootNode is ShadowRoot =>\n typeof ShadowRoot !== \"undefined\" && rootNode instanceof ShadowRoot;\n\nconst getStyleContainer = (el: HTMLElement): HTMLElement | ShadowRoot => {\n const rootNode = el.getRootNode?.();\n if (isShadowRoot(rootNode)) {\n return rootNode;\n }\n return document.head;\n};\n\nconst getRuntimeRoot = (el: HTMLElement, triggerNode?: HTMLElement) => {\n const rootNode = el.getRootNode?.();\n if (isShadowRoot(rootNode)) return el;\n const triggerRoot = triggerNode?.closest?.<HTMLElement>(\n `.${NAMESPACE_ROOT_CLASS}`,\n );\n return (\n triggerRoot ||\n el.closest<HTMLElement>(`.${NAMESPACE_ROOT_CLASS}`) ||\n el.querySelector<HTMLElement>(`.${NAMESPACE_ROOT_CLASS}`) ||\n el\n );\n};\n\nconst getRuntimeOverlayContainer = (\n el: HTMLElement,\n portalContainer: HTMLElement | null,\n): {\n getPopupContainer: (triggerNode?: HTMLElement) => HTMLElement | ShadowRoot;\n getTargetContainer: () => HTMLElement | ShadowRoot;\n} => {\n const getOverlayRoot = (triggerNode?: HTMLElement) => {\n if (portalContainer?.isConnected) return portalContainer;\n return getRuntimeRoot(el, triggerNode);\n };\n\n return {\n getPopupContainer: (triggerNode?: HTMLElement) => {\n return getOverlayRoot(triggerNode);\n },\n getTargetContainer: () => getRuntimeRoot(el),\n };\n};\n\nconst createAntdConfig = (\n overlayContainer: ReturnType<typeof getRuntimeOverlayContainer>,\n cssIsolation: RuntimeCssIsolation,\n) => {\n const antdOptions = getAntdRuntimeOptions(cssIsolation);\n return {\n locale: zhCN,\n prefixCls: antdOptions.prefixCls,\n iconPrefixCls: antdOptions.iconPrefixCls,\n theme: antdOptions.theme,\n ...(usesLegacyCssIsolation(cssIsolation)\n ? {\n getPopupContainer: overlayContainer.getPopupContainer,\n getTargetContainer: overlayContainer.getTargetContainer,\n }\n : {}),\n };\n};\n\nconst createPortalContainer = (el: HTMLElement) => {\n const rootNode = el.getRootNode?.();\n const parent = isShadowRoot(rootNode)\n ? rootNode\n : el.ownerDocument?.body || document.body;\n const portalContainer = el.ownerDocument.createElement(\"div\");\n portalContainer.setAttribute(RUNTIME_PORTAL_ATTR, \"\");\n portalContainer.classList.add(NAMESPACE_ROOT_CLASS);\n parent.appendChild(portalContainer);\n return portalContainer;\n};\n\nconst getAntdMessageProxyState = (): AntdMessageProxyState => {\n const globalScope = globalThis as typeof globalThis & {\n [MESSAGE_PROXY_GLOBAL]?: AntdMessageProxyState;\n };\n if (!globalScope[MESSAGE_PROXY_GLOBAL]) {\n globalScope[MESSAGE_PROXY_GLOBAL] = {\n apiStack: [],\n installed: false,\n originalMethods: {},\n };\n }\n return globalScope[MESSAGE_PROXY_GLOBAL];\n};\n\nconst installAntdMessageProxy = () => {\n const state = getAntdMessageProxyState();\n if (state.installed) return state;\n MESSAGE_METHODS.forEach((method) => {\n const originalMethod = (message as unknown as Record<string, unknown>)[method];\n if (typeof originalMethod !== \"function\") return;\n state.originalMethods[method] = originalMethod.bind(message) as (\n ...args: unknown[]\n ) => unknown;\n (message as unknown as Record<string, unknown>)[method] = (\n ...args: unknown[]\n ) => {\n const api = state.apiStack.at(-1);\n const apiMethod = api?.[method];\n if (typeof apiMethod === \"function\") {\n return apiMethod(...args);\n }\n return state.originalMethods[method]?.(...args);\n };\n });\n state.installed = true;\n return state;\n};\n\nconst registerAntdMessageApi = (api: Record<string, unknown>) => {\n const state = installAntdMessageProxy();\n state.apiStack.push(api);\n return () => {\n const position = state.apiStack.lastIndexOf(api);\n if (position >= 0) {\n state.apiStack.splice(position, 1);\n }\n };\n};\n\nconst installRuntimePortalContainer = (\n el: HTMLElement,\n cssIsolation: RuntimeCssIsolation,\n): RuntimePortalHandle => {\n const globalScope = globalThis as typeof globalThis & {\n [PORTAL_CONTAINER_STACK_GLOBAL]?: HTMLElement[];\n [PORTAL_CONTAINER_RESOLVER_GLOBAL]?: () => HTMLElement;\n };\n const portalContainer = usesLegacyCssIsolation(cssIsolation)\n ? createPortalContainer(el)\n : null;\n const stack = Array.isArray(globalScope[PORTAL_CONTAINER_STACK_GLOBAL])\n ? globalScope[PORTAL_CONTAINER_STACK_GLOBAL]\n : [];\n const stackTarget = portalContainer ?? el.ownerDocument?.body ?? document.body;\n stack.push(stackTarget);\n globalScope[PORTAL_CONTAINER_STACK_GLOBAL] = stack;\n globalScope[PORTAL_CONTAINER_RESOLVER_GLOBAL] = () => {\n for (let index = stack.length - 1; index >= 0; index -= 1) {\n const candidate = stack[index];\n if (candidate?.isConnected) {\n return candidate;\n }\n }\n return (\n document.querySelector<HTMLElement>(`[${RUNTIME_PORTAL_ATTR}]`) ||\n document.querySelector<HTMLElement>(`.${NAMESPACE_ROOT_CLASS}`) ||\n document.body\n );\n };\n\n return {\n container: portalContainer,\n release: () => {\n const position = stack.lastIndexOf(stackTarget);\n if (position >= 0) {\n stack.splice(position, 1);\n }\n portalContainer?.remove();\n },\n };\n};\n\nconst installAntdStaticHolder = (\n el: HTMLElement,\n portalContainer: HTMLElement | null,\n cssIsolation: RuntimeCssIsolation,\n) => {\n installAntdMessageProxy();\n const antdOptions = getAntdRuntimeOptions(cssIsolation);\n const getMessageContainer = () => {\n if (portalContainer?.isConnected) return portalContainer;\n return usesLegacyCssIsolation(cssIsolation) ? getRuntimeRoot(el) : document.body;\n };\n\n ConfigProvider.config({\n prefixCls: antdOptions.prefixCls,\n iconPrefixCls: antdOptions.iconPrefixCls,\n theme: antdOptions.theme,\n holderRender: (children) => {\n if (!el.isConnected) {\n return (\n <ConfigProvider\n locale={zhCN}\n prefixCls={antdOptions.prefixCls}\n iconPrefixCls={antdOptions.iconPrefixCls}\n theme={antdOptions.theme}\n >\n {children}\n </ConfigProvider>\n );\n }\n const overlayContainer = getRuntimeOverlayContainer(el, portalContainer);\n return (\n <StyleProvider hashPriority=\"high\" container={getStyleContainer(el)}>\n <ConfigProvider {...createAntdConfig(overlayContainer, cssIsolation)}>\n {children}\n </ConfigProvider>\n </StyleProvider>\n );\n },\n });\n message.config({\n prefixCls: antdOptions.messagePrefixCls,\n getContainer: getMessageContainer,\n });\n};\n\nconst RuntimeMessageBridge = ({ children }: { children: React.ReactNode }) => {\n const appContext = AntdApp.useApp();\n React.useLayoutEffect(() => {\n return registerAntdMessageApi(\n appContext.message as unknown as Record<string, unknown>,\n );\n }, [appContext.message]);\n return <>{children}</>;\n};\n\nexport const createReactPage = (\n AppComponent: React.ComponentType,\n): {\n mount: (el: HTMLElement, context: PageContext) => void;\n update: (el: HTMLElement, context: PageContext) => void;\n unmount: () => void;\n} => {\n let root: RootLike | null = null;\n let currentContainer: HTMLElement | null = null;\n let releasePortalContainer: (() => void) | null = null;\n let portalContainer: HTMLElement | null = null;\n let currentCssIsolation: RuntimeCssIsolation | null = null;\n\n const render = (el: HTMLElement, context: PageContext) => {\n const cssIsolation = getRuntimeCssIsolation(context);\n if (usesLegacyCssIsolation(cssIsolation)) {\n el.classList.add(NAMESPACE_ROOT_CLASS);\n } else {\n el.classList.remove(NAMESPACE_ROOT_CLASS);\n }\n if (\n !root ||\n currentContainer !== el ||\n currentCssIsolation !== cssIsolation ||\n (usesLegacyCssIsolation(cssIsolation) && !portalContainer?.isConnected)\n ) {\n root?.unmount();\n releasePortalContainer?.();\n root = createRuntimeRoot(el);\n currentContainer = el;\n currentCssIsolation = cssIsolation;\n const portalHandle = installRuntimePortalContainer(el, cssIsolation);\n portalContainer = portalHandle.container;\n releasePortalContainer = portalHandle.release;\n }\n const overlayContainer = getRuntimeOverlayContainer(el, portalContainer);\n installAntdStaticHolder(el, portalContainer, cssIsolation);\n const antdConfig = createAntdConfig(overlayContainer, cssIsolation);\n\n root.render(\n <StyleProvider hashPriority=\"high\" container={getStyleContainer(el)}>\n <ConfigProvider {...antdConfig}>\n <AntdApp>\n <RuntimeMessageBridge>\n <PageProvider context={context}>\n <AppComponent />\n </PageProvider>\n </RuntimeMessageBridge>\n </AntdApp>\n </ConfigProvider>\n </StyleProvider>,\n );\n };\n\n return {\n mount: (el, context) => {\n render(el, context);\n },\n update: (el, context) => {\n render(el, context);\n },\n unmount: () => {\n root?.unmount();\n releasePortalContainer?.();\n root = null;\n currentContainer = null;\n releasePortalContainer = null;\n portalContainer = null;\n currentCssIsolation = null;\n },\n };\n};\n","import React, { useMemo } from \"react\"\n\nimport { ReactPageContext } from \"./store\"\nimport { createPageSdk } from \"../core/client\"\n\nimport type { PageSdkStore } from \"./store\"\nimport type { PageContext } from \"../core/types\"\n\nexport interface PageProviderProps {\n context: PageContext\n children: React.ReactNode\n}\n\nexport const PageProvider: React.FC<PageProviderProps> = ({\n context,\n children,\n}) => {\n const value = useMemo<PageSdkStore>(\n () => ({\n context,\n sdk: createPageSdk(context),\n }),\n [context],\n )\n\n return (\n <ReactPageContext.Provider value={value}>\n {children}\n </ReactPageContext.Provider>\n )\n}\n","import { createContext, useContext } from \"react\"\n\nimport type { PageContext, PageSdk } from \"../core/types\"\n\nexport interface PageSdkStore {\n context: PageContext\n sdk: PageSdk\n}\n\nexport const ReactPageContext = createContext<PageSdkStore | null>(null)\n\nexport const usePageSdkStore = () => {\n const store = useContext(ReactPageContext)\n if (!store) {\n throw new Error(\"usePageSdkStore 必须在 PageProvider 内使用\")\n }\n return store\n}\n","import type {\n ApiPermissionListParams,\n AuthLogoutRedirectOptions,\n ApproveTaskParams,\n AssignPermissionsParams,\n AssignRolesParams,\n BatchAddUsersToRoleParams,\n BatchSendNotificationByTypeParams,\n ConnectorCallParams,\n ConnectorInvokeParams,\n ConnectorInvokeResult,\n CreateApiPermissionParams,\n CreateOrganizationAccountParams,\n CreateOrganizationDepartmentParams,\n CreateFormPermissionGroupDto,\n CreatePagePermissionGroupDto,\n CreateRoleParams,\n CreateUiPermissionParams,\n CurrentUserDepartmentParents,\n DataManagementConfigParams,\n DataViewQueryParams,\n DataViewQueryResult,\n DataViewStatsParams,\n FileAccessTicketResult,\n FormAdvancedSearchParams,\n FormChangeRecordParams,\n FormCreateParams,\n FormCreateResult,\n FormExportParams,\n FormGetDetailParams,\n FormImportParams,\n FormRemoveParams,\n FormSearchParams,\n FormUpdateParams,\n FunctionInvokeParams,\n FunctionInvokeResult,\n GetParentDepartmentsOptions,\n GetProcessInstanceParams,\n GetUserRolesParams,\n ImportExportRecordDownloadParams,\n ImportExportRecordQuery,\n LoginLogGetParams,\n LoginLogListParams,\n LoginLogRecord,\n LoginLogStats,\n LoginLogStatsParams,\n PageApiResponse,\n PageBinaryResponse,\n PageContext,\n PageDataSourceDescriptor,\n PageDepartmentRecord,\n PageHttpMethod,\n PageListResult,\n PageOffsetListResult,\n PagePermissionGroup,\n PageRequestOptions,\n PageSdk,\n PageSdkError,\n PageUserRecord,\n PageTransportDownloadPayload,\n PageTransportRequestPayload,\n PreviewDingTalkNotificationParams,\n PreviewNotificationTemplateParams,\n ProcessInstanceLookupParams,\n ResetOrganizationAccountPasswordParams,\n ResolveProcessCapabilitiesParams,\n FormPermissionGroup,\n ListNotificationInboxParams,\n ListWorkCenterItemsParams,\n MarkAllNotificationReadResult,\n NotificationInboxListResult,\n NotificationInboxMessage,\n NotificationUnreadCountResult,\n OrganizationAccountListParams,\n RoleListParams,\n RoleUsersParams,\n SaveDataManagementConfigParams,\n SearchExpression,\n SearchGroup,\n SearchRule,\n SearchSortItem,\n SubFormRule,\n SwitchAppRoleParams,\n SwitchPlatformRoleParams,\n TerminateProcessInstanceParams,\n TriggerCallbackTaskParams,\n ChangeOrganizationAccountPasswordParams,\n UiPermissionListParams,\n UpdateApiPermissionParams,\n UpdateFormPermissionGroupDto,\n UpdateOrganizationAccountParams,\n UpdateOrganizationDepartmentParams,\n UpdatePagePermissionGroupDto,\n UpdateRoleParams,\n UpdateUiPermissionParams,\n UpdateUserParams,\n QueryFormPermissionGroupDto,\n QueryPagePermissionGroupDto,\n UserListParams,\n UserMenuPermissionsResponse,\n ValidateUserParams,\n CreateUserParams,\n SendNotificationByTypeParams,\n SendNotificationResult,\n ViewFieldPermissionValue,\n ViewPermissionSummary,\n WorkCenterItem,\n WorkCenterListResult,\n WorkCenterStats,\n WorkCenterStatsParams,\n WorkflowApproveParams,\n WorkflowDefinitionByFormParams,\n WorkflowInitiatorSelectCandidatesParams,\n WorkflowInitiatorSelectRequirementsParams,\n WorkflowPreviewParams,\n WorkflowResubmitInitiatorSelectRequirementsParams,\n WorkflowResubmitParams,\n WorkflowReturnParams,\n WorkflowSaveTaskParams,\n WorkflowStartFromExistingInstanceParams,\n WorkflowTaskParams,\n WorkflowTransferParams,\n WorkflowWithdrawParams,\n} from \"./types\"\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst isSearchRuleLike = (value: unknown): value is SearchRule | SubFormRule =>\n isRecord(value) &&\n typeof value.key === \"string\" &&\n (value.componentName === undefined || typeof value.componentName === \"string\")\n\nconst isBlobLike = (value: unknown): value is Blob =>\n typeof Blob !== \"undefined\" && value instanceof Blob\n\nconst nowMs = () =>\n typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now()\n\nconst normalizeMethod = (value: PageHttpMethod | string): PageHttpMethod => {\n const method = String(value || \"get\").toLowerCase()\n if (\n method === \"get\" ||\n method === \"post\" ||\n method === \"put\" ||\n method === \"delete\" ||\n method === \"patch\"\n ) {\n return method\n }\n return \"get\"\n}\n\nconst resolveAppType = (\n context: PageContext,\n explicitAppType?: string,\n): string => {\n const appType = String(explicitAppType || context.app.appType || \"\").trim()\n if (!appType) {\n throw new Error(\"appType 不能为空\")\n }\n return appType\n}\n\nconst buildAppPath = (\n context: PageContext,\n explicitAppType: string | undefined,\n suffix: string,\n) => `/${resolveAppType(context, explicitAppType)}${suffix}`\n\nconst buildOpenXiangdaAppPath = (\n context: PageContext,\n explicitAppType: string | undefined,\n suffix: string,\n) =>\n `/openxiangda-api/v1/apps/${encodePathSegment(\n resolveAppType(context, explicitAppType),\n )}${suffix}`\n\nconst encodePathSegment = (value: string) => encodeURIComponent(String(value))\n\nconst withPostDeleteAction = (path: string) =>\n path.includes(\"/delete\") ? path : `${path.replace(/\\/$/, \"\")}/delete`\n\nconst getHeaderValue = (\n headers: Record<string, unknown> | undefined,\n name: string,\n): string | undefined => {\n if (!headers) {\n return undefined\n }\n const target = name.toLowerCase()\n const entry = Object.entries(headers).find(\n ([key]) => key.toLowerCase() === target,\n )\n return entry ? String(entry[1]) : undefined\n}\n\nconst parseContentDispositionFileName = (\n contentDisposition?: string,\n): string | undefined => {\n if (!contentDisposition) {\n return undefined\n }\n\n const utf8Match = contentDisposition.match(/filename\\*=UTF-8''([^;]+)/i)\n if (utf8Match?.[1]) {\n try {\n return decodeURIComponent(utf8Match[1])\n } catch {\n return utf8Match[1]\n }\n }\n\n const quotedMatch = contentDisposition.match(/filename=\"([^\"]+)\"/i)\n if (quotedMatch?.[1]) {\n return quotedMatch[1]\n }\n\n const plainMatch = contentDisposition.match(/filename=([^;]+)/i)\n if (plainMatch?.[1]) {\n return plainMatch[1].trim()\n }\n\n return undefined\n}\n\nconst parseConnectorCallName = (name: string) => {\n const value = String(name || \"\").trim()\n const separatorIndex = value.indexOf(\".\")\n if (separatorIndex <= 0 || separatorIndex === value.length - 1) {\n throw new Error(\"连接器调用名必须是 connector.api 格式\")\n }\n\n return {\n connector: value.slice(0, separatorIndex),\n api: value.slice(separatorIndex + 1),\n }\n}\n\nconst serializeQuery = (query?: Record<string, unknown>) => {\n if (!query) {\n return undefined\n }\n\n const params = new URLSearchParams()\n\n const appendValue = (key: string, value: unknown) => {\n if (value === undefined || value === null || value === \"\") {\n return\n }\n if (Array.isArray(value)) {\n value.forEach((item) => appendValue(key, item))\n return\n }\n if (value instanceof Date) {\n params.append(key, value.toISOString())\n return\n }\n params.append(key, String(value))\n }\n\n Object.entries(query).forEach(([key, value]) => {\n appendValue(key, value)\n })\n\n const serialized = params.toString()\n return serialized || undefined\n}\n\nconst serializeCommaList = (value: unknown) =>\n Array.isArray(value)\n ? value\n .map((item) => String(item ?? \"\").trim())\n .filter(Boolean)\n .join(\",\")\n : value\n\nconst toLegacyRules = (value: Record<string, unknown>) =>\n Object.entries(value).flatMap(([key, itemValue]) => {\n if (itemValue === undefined) {\n return []\n }\n return [\n {\n key,\n operator: Array.isArray(itemValue) ? \"IN\" : \"EQ\",\n value: itemValue,\n },\n ]\n })\n\nconst toSearchGroup = (value: unknown): SearchGroup | undefined => {\n if (value === undefined || value === null || value === \"\") {\n return undefined\n }\n\n if (typeof value === \"string\") {\n try {\n return toSearchGroup(JSON.parse(value))\n } catch {\n return undefined\n }\n }\n\n if (Array.isArray(value)) {\n const rules: Array<SearchRule | SubFormRule> = []\n const conditions: SearchGroup[] = []\n\n value.forEach((item) => {\n const group = toSearchGroup(item)\n if (group) {\n if (group.rules?.length) {\n rules.push(...group.rules)\n }\n if (group.conditions?.length) {\n conditions.push(...group.conditions)\n }\n return\n }\n\n if (isSearchRuleLike(item)) {\n rules.push(item)\n return\n }\n\n if (isRecord(item)) {\n rules.push(...(toLegacyRules(item) as SearchRule[]))\n }\n })\n\n if (rules.length === 0 && conditions.length === 0) {\n return undefined\n }\n\n return {\n logic: \"AND\",\n ...(rules.length > 0 ? { rules } : {}),\n ...(conditions.length > 0 ? { conditions } : {}),\n }\n }\n\n if (isRecord(value)) {\n if (isSearchRuleLike(value)) {\n return {\n logic: \"AND\",\n rules: [value],\n }\n }\n\n if (\"rules\" in value || \"conditions\" in value || \"logic\" in value) {\n const nextGroup: SearchGroup = {\n logic:\n value.logic === \"OR\" || value.logic === \"AND\" ? value.logic : \"AND\",\n }\n\n if (Array.isArray(value.rules)) {\n nextGroup.rules = value.rules.filter(isSearchRuleLike)\n }\n\n if (Array.isArray(value.conditions)) {\n nextGroup.conditions = value.conditions\n .map((item) => toSearchGroup(item))\n .filter((item): item is SearchGroup => Boolean(item))\n }\n\n if (!nextGroup.rules?.length && !nextGroup.conditions?.length) {\n return undefined\n }\n\n return nextGroup\n }\n\n const rules = toLegacyRules(value)\n if (rules.length === 0) {\n return undefined\n }\n return {\n logic: \"AND\",\n rules,\n }\n }\n\n return undefined\n}\n\nconst mergeSearchExpressions = (base: unknown, extra: unknown) => {\n const baseGroup = toSearchGroup(base)\n const extraGroup = toSearchGroup(extra)\n\n if (!baseGroup) {\n return extraGroup\n }\n\n if (!extraGroup) {\n return baseGroup\n }\n\n return {\n logic: \"AND\",\n conditions: [baseGroup, extraGroup],\n } satisfies SearchGroup\n}\n\nconst serializeSearchExpression = (value?: SearchExpression | string) => {\n if (value === undefined || value === null || value === \"\") {\n return undefined\n }\n if (typeof value === \"string\") {\n return value\n }\n const group = toSearchGroup(value)\n return group ? JSON.stringify(group) : undefined\n}\n\nconst normalizeAdvancedOrder = (value?: SearchSortItem | SearchSortItem[]) => {\n if (!value) {\n return undefined\n }\n const nextValue = Array.isArray(value) ? value : [value]\n return JSON.stringify(nextValue)\n}\n\nconst normalizeDynamicOrder = (value?: string | SearchSortItem) => {\n if (!value) {\n return undefined\n }\n if (typeof value === \"string\") {\n return value\n }\n return `${value.id}:${value.isAsc === \"n\" ? \"-\" : \"+\"}`\n}\n\nconst hasOwn = (value: object, key: string) =>\n Object.prototype.hasOwnProperty.call(value, key)\n\nconst normalizeEnvelopeCode = (value: unknown): number | string => {\n if (value === undefined || value === null || value === \"\") {\n return 200\n }\n const normalized = Number(value)\n return Number.isFinite(normalized) ? normalized : String(value)\n}\n\nconst isSuccessCode = (value: unknown) => {\n if (value === undefined || value === null || value === \"\") {\n return true\n }\n const normalized = Number(value)\n return Number.isFinite(normalized)\n ? normalized === 0 || (normalized >= 200 && normalized < 300)\n : false\n}\n\nconst getEnvelopeCode = (rawResponse: unknown) => {\n if (isRecord(rawResponse) && hasOwn(rawResponse, \"code\")) {\n return rawResponse.code\n }\n const nestedData = (rawResponse as { data?: unknown })?.data\n if (isRecord(nestedData) && hasOwn(nestedData, \"code\")) {\n return nestedData.code\n }\n return undefined\n}\n\nconst normalizeJsonResponse = <TResult = unknown, TRaw = TResult>(\n rawResponse: unknown,\n): PageApiResponse<TResult, TRaw> => {\n const code = normalizeEnvelopeCode(getEnvelopeCode(rawResponse))\n\n const topLevelResult =\n isRecord(rawResponse) && \"result\" in rawResponse\n ? (rawResponse.result as TResult)\n : undefined\n const nestedResult =\n isRecord((rawResponse as { data?: unknown })?.data) &&\n \"result\" in ((rawResponse as { data?: Record<string, unknown> }).data || {})\n ? ((rawResponse as { data?: Record<string, unknown> }).data\n ?.result as TResult)\n : undefined\n const topLevelData =\n isRecord(rawResponse) && \"data\" in rawResponse\n ? (rawResponse.data as TRaw)\n : undefined\n\n const result =\n topLevelResult !== undefined\n ? topLevelResult\n : nestedResult !== undefined\n ? nestedResult\n : topLevelData !== undefined\n ? (topLevelData as unknown as TResult)\n : isRecord(rawResponse)\n ? (rawResponse as TResult)\n : null\n\n const nestedSuccess =\n typeof (rawResponse as { data?: { success?: boolean } })?.data?.success ===\n \"boolean\"\n ? (rawResponse as { data?: { success?: boolean } }).data?.success\n : undefined\n\n const success =\n (rawResponse as { success?: boolean })?.success === false ||\n nestedSuccess === false\n ? false\n : isSuccessCode(code)\n\n return {\n code,\n success,\n message:\n typeof (rawResponse as { message?: string })?.message === \"string\"\n ? (rawResponse as { message?: string }).message\n : typeof (rawResponse as { data?: { message?: string } })?.data\n ?.message === \"string\"\n ? (rawResponse as { data?: { message?: string } }).data?.message\n : undefined,\n result,\n data:\n topLevelData !== undefined\n ? topLevelData\n : topLevelResult !== undefined\n ? (topLevelResult as unknown as TRaw)\n : undefined,\n raw: rawResponse,\n }\n}\n\nconst createMissingFormInstanceIdError = (response: PageApiResponse<unknown>) => {\n const error = new Error(\n \"保存接口未返回 formInstId/formInstanceId。保存接口只承诺返回实例标识和已生成的流水号;如需完整行数据、公式回填或其他服务端字段,请在保存成功后显式调用 sdk.form.getDetail。\",\n ) as PageSdkError\n error.response = response\n error.raw = response.raw\n return error\n}\n\nconst isRequestTracingEnabled = (\n context: PageContext,\n options: PageRequestOptions,\n) => {\n if (options.trace) return true\n const env = context.env || {}\n const value =\n env.OPENXIANGDA_REQUEST_TRACE ??\n env.openxiangdaRequestTrace ??\n env.requestTrace\n return value === true || value === \"true\" || value === \"1\"\n}\n\nconst buildRequestDedupeKey = (payload: PageTransportRequestPayload) =>\n JSON.stringify({\n path: payload.path,\n method: payload.method,\n query: payload.query || \"\",\n headers: payload.headers || {},\n })\n\nconst normalizeBinaryResponse = (rawResponse: unknown): PageBinaryResponse => {\n if (isRecord(rawResponse) && isBlobLike(rawResponse.blob)) {\n return rawResponse as unknown as PageBinaryResponse\n }\n\n if (isBlobLike(rawResponse)) {\n return {\n blob: rawResponse,\n raw: rawResponse,\n }\n }\n\n const responseData = (rawResponse as { data?: unknown })?.data\n const responseHeaders = isRecord(\n (rawResponse as { headers?: unknown })?.headers,\n )\n ? ((rawResponse as { headers?: Record<string, unknown> }).headers as Record<\n string,\n unknown\n >)\n : undefined\n\n if (!isBlobLike(responseData)) {\n throw new Error(\"transport.download 未返回 Blob 数据\")\n }\n\n const contentDisposition = getHeaderValue(\n responseHeaders,\n \"content-disposition\",\n )\n\n return {\n blob: responseData,\n fileName: parseContentDispositionFileName(contentDisposition),\n contentType:\n getHeaderValue(responseHeaders, \"content-type\") || responseData.type,\n headers: responseHeaders\n ? Object.fromEntries(\n Object.entries(responseHeaders).map(([key, value]) => [\n key,\n value === undefined ? undefined : String(value),\n ]),\n )\n : undefined,\n raw: rawResponse,\n }\n}\n\nconst toSdkError = (\n input: unknown,\n payload: PageTransportRequestPayload | PageTransportDownloadPayload,\n): PageSdkError => {\n if (input instanceof Error && (input as PageSdkError).response) {\n return input as PageSdkError\n }\n\n const normalizedResponse = isRecord(input)\n ? normalizeJsonResponse(input)\n : undefined\n\n const nextError =\n input instanceof Error\n ? input\n : new Error(\n normalizedResponse?.message ||\n `请求失败: ${String(payload.method).toUpperCase()} ${payload.path}`,\n )\n\n const sdkError = nextError as PageSdkError\n sdkError.method = String(payload.method).toUpperCase()\n sdkError.path = payload.path\n sdkError.response = normalizedResponse\n sdkError.raw = input\n return sdkError\n}\n\nconst ensureSuccess = <TResult = unknown, TRaw = TResult>(\n response: PageApiResponse<TResult, TRaw>,\n payload: PageTransportRequestPayload,\n) => {\n if (!response.success) {\n throw toSdkError(response, payload)\n }\n return response\n}\n\nconst resolveFormInstanceId = (params: {\n formInstId?: string\n formInstanceId?: string\n instanceId?: string\n}) => {\n const formInstanceId = String(\n params.formInstId || params.formInstanceId || params.instanceId || \"\",\n ).trim()\n if (!formInstanceId) {\n throw new Error(\"formInstanceId 不能为空\")\n }\n return formInstanceId\n}\n\nconst pickCreatedFormInstanceId = (value: unknown): string | undefined => {\n if (!value) return undefined\n if (typeof value === \"string\") {\n const text = value.trim()\n return text || undefined\n }\n if (!isRecord(value)) return undefined\n\n const direct =\n value.formInstId ||\n value.formInstanceId ||\n value.instanceId ||\n value.id\n if (direct !== value && direct !== undefined && direct !== null) {\n const picked = pickCreatedFormInstanceId(direct)\n if (picked) return picked\n }\n for (const candidate of [value.result, value.data, value.raw]) {\n const picked = pickCreatedFormInstanceId(candidate)\n if (picked) return picked\n }\n return undefined\n}\n\nconst pickCreatedProcessInstanceId = (value: unknown): string | undefined => {\n if (!value || typeof value === \"string\") return undefined\n if (!isRecord(value)) return undefined\n const direct = value.processInstanceId || value.processInstId\n if (typeof direct === \"string\" && direct.trim()) return direct.trim()\n for (const candidate of [value.result, value.data, value.raw]) {\n const picked = pickCreatedProcessInstanceId(candidate)\n if (picked) return picked\n }\n return undefined\n}\n\nconst pickSerialNumbers = (value: unknown): Record<string, string> | undefined => {\n if (!value || typeof value === \"string\" || !isRecord(value)) return undefined\n const direct = value.serialNumbers\n if (isRecord(direct)) {\n const entries = Object.entries(direct)\n .map(([key, item]) => [key, String(item ?? \"\").trim()] as const)\n .filter(([, item]) => Boolean(item))\n if (entries.length > 0) return Object.fromEntries(entries)\n }\n for (const candidate of [value.result, value.data, value.raw]) {\n const picked = pickSerialNumbers(candidate)\n if (picked) return picked\n }\n return undefined\n}\n\nconst pickSerialNumber = (value: unknown): string | undefined => {\n if (!value || typeof value === \"string\") return undefined\n if (!isRecord(value)) return undefined\n const direct = value.serialNumber || value.serialNo || value.sequenceNo\n if (typeof direct === \"string\" && direct.trim()) return direct.trim()\n const serialNumbers = pickSerialNumbers(value)\n if (serialNumbers) {\n const first = Object.values(serialNumbers)[0]\n if (first) return first\n }\n for (const candidate of [value.result, value.data, value.raw]) {\n const picked = pickSerialNumber(candidate)\n if (picked) return picked\n }\n return undefined\n}\n\nconst normalizeFormCreateResponse = <\n TResult = FormCreateResult,\n TRaw = unknown,\n>(\n response: PageApiResponse<TResult, TRaw>,\n formInstanceId: string,\n): PageApiResponse<TResult, TRaw> => {\n const processInstanceId = pickCreatedProcessInstanceId(response)\n const serialNumbers = pickSerialNumbers(response)\n const serialNumber = pickSerialNumber(response)\n const sourceResult: Record<string, unknown> = isRecord(response.result)\n ? response.result\n : {}\n const normalizedResult = {\n ...sourceResult,\n formInstId: formInstanceId,\n formInstanceId,\n result:\n typeof response.result === \"string\" && response.result.trim()\n ? response.result.trim()\n : (sourceResult.result as unknown) || formInstanceId,\n ...(processInstanceId ? { processInstanceId } : {}),\n ...(serialNumber ? { serialNumber } : {}),\n ...(serialNumbers ? { serialNumbers } : {}),\n } as TResult\n\n const normalizedData = isRecord(response.data)\n ? ({\n ...response.data,\n formInstId:\n (response.data as Record<string, unknown>).formInstId || formInstanceId,\n formInstanceId:\n (response.data as Record<string, unknown>).formInstanceId ||\n formInstanceId,\n ...(processInstanceId ? { processInstanceId } : {}),\n ...(serialNumber ? { serialNumber } : {}),\n ...(serialNumbers ? { serialNumbers } : {}),\n } as TRaw)\n : response.data\n\n return {\n ...(response as PageApiResponse<TResult, TRaw> & {\n formInstId?: string\n formInstanceId?: string\n processInstanceId?: string\n serialNumber?: string\n serialNumbers?: Record<string, string>\n }),\n formInstId: formInstanceId,\n formInstanceId,\n ...(processInstanceId ? { processInstanceId } : {}),\n ...(serialNumber ? { serialNumber } : {}),\n ...(serialNumbers ? { serialNumbers } : {}),\n result: normalizedResult,\n data: normalizedData,\n }\n}\n\nconst isStableCreateLookupValue = (value: unknown) => {\n if (value === undefined || value === null || value === \"\") return false\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n )\n}\n\nconst buildCreateLookupFilters = (\n data: Record<string, unknown>,\n lookupFields?: string[],\n): SearchGroup | undefined => {\n const sourceFields = lookupFields?.length\n ? lookupFields\n : Object.keys(data).filter((key) => isStableCreateLookupValue(data[key]))\n const rules = sourceFields\n .filter((key) => isStableCreateLookupValue(data[key]))\n .slice(0, 6)\n .map(\n (key): SearchRule => ({\n key,\n operator: \"EQ\",\n value: data[key],\n }),\n )\n return rules.length > 0 ? { logic: \"AND\", rules } : undefined\n}\n\nconst firstListItem = (value: unknown): Record<string, unknown> | undefined => {\n if (!value) return undefined\n if (Array.isArray(value)) {\n return isRecord(value[0]) ? value[0] : undefined\n }\n if (!isRecord(value)) return undefined\n const candidates = [\n value.data,\n value.list,\n value.items,\n value.records,\n value.result,\n ]\n for (const candidate of candidates) {\n const item = firstListItem(candidate)\n if (item) return item\n }\n return undefined\n}\n\nconst attachFormInstanceId = <TResult = unknown, TRaw = TResult>(\n response: PageApiResponse<TResult, TRaw>,\n formInstanceId: string,\n): PageApiResponse<TResult, TRaw> => {\n const withIds = (value: unknown) =>\n isRecord(value)\n ? ({\n ...value,\n formInstId: value.formInstId || formInstanceId,\n formInstanceId: value.formInstanceId || formInstanceId,\n } as unknown)\n : value\n\n return {\n ...(response as PageApiResponse<TResult, TRaw> & {\n formInstId?: string\n formInstanceId?: string\n }),\n formInstId: formInstanceId,\n formInstanceId,\n result:\n response.result === null || response.result === undefined\n ? (formInstanceId as unknown as TResult)\n : (withIds(response.result) as TResult),\n data:\n response.data === undefined\n ? response.data\n : (withIds(response.data) as TRaw),\n }\n}\n\nconst withDefaultAppType = <\n T extends {\n appType?: string\n scope?: string\n },\n>(\n context: PageContext,\n params: T | undefined,\n) => {\n if (!params) {\n return params\n }\n\n if (params.appType) {\n return params\n }\n\n if (params.scope === \"app\") {\n return {\n ...params,\n appType: context.app.appType,\n }\n }\n\n return params\n}\n\nconst AUTH_LOGIN_URL_ENV_KEYS = [\n \"loginUrl\",\n \"authLoginUrl\",\n \"bathAuthUrl\",\n \"REACT_APP_VITE_BATH_AUTH_URL\",\n \"VITE_BATH_AUTH_URL\",\n \"BATH_AUTH_URL\",\n]\n\nconst DEFAULT_PLATFORM_LOGIN_URL = \"/platform/login\"\n\nconst normalizeOptionalString = (value: unknown) => {\n const text = typeof value === \"string\" ? value.trim() : \"\"\n return text || undefined\n}\n\nconst getCurrentHref = () => {\n if (typeof window === \"undefined\") {\n return \"\"\n }\n return window.location?.href || \"\"\n}\n\nconst resolveAuthLoginUrl = (\n context: PageContext,\n options: AuthLogoutRedirectOptions,\n) => {\n const explicitLoginUrl = normalizeOptionalString(options.loginUrl)\n if (explicitLoginUrl) {\n return explicitLoginUrl\n }\n\n for (const key of AUTH_LOGIN_URL_ENV_KEYS) {\n const loginUrl = normalizeOptionalString(context.env?.[key])\n if (loginUrl) {\n return loginUrl\n }\n }\n\n return undefined\n}\n\nconst buildAuthRedirectUrl = (\n loginUrl: string,\n callbackUrl: string | undefined,\n callbackParamName: string | undefined,\n) => {\n const paramName = normalizeOptionalString(callbackParamName) || \"callback\"\n const normalizedCallbackUrl = normalizeOptionalString(callbackUrl)\n\n if (!normalizedCallbackUrl) {\n return loginUrl\n }\n\n const baseHref = getCurrentHref() || \"http://localhost/\"\n const isAbsoluteUrl = /^[a-z][a-z\\d+.-]*:/i.test(loginUrl)\n const isProtocolRelativeUrl = loginUrl.startsWith(\"//\")\n const isRootRelativeUrl = loginUrl.startsWith(\"/\")\n\n try {\n const url = new URL(loginUrl, baseHref)\n url.searchParams.set(paramName, normalizedCallbackUrl)\n\n if (isAbsoluteUrl || isProtocolRelativeUrl) {\n return url.toString()\n }\n\n const path = `${url.pathname}${url.search}${url.hash}`\n return isRootRelativeUrl ? path : path.replace(/^\\//, \"\")\n } catch {\n const hashIndex = loginUrl.indexOf(\"#\")\n const pathAndQuery =\n hashIndex >= 0 ? loginUrl.slice(0, hashIndex) : loginUrl\n const hash = hashIndex >= 0 ? loginUrl.slice(hashIndex) : \"\"\n const separator = pathAndQuery.includes(\"?\") ? \"&\" : \"?\"\n\n return `${pathAndQuery}${separator}${encodeURIComponent(\n paramName,\n )}=${encodeURIComponent(normalizedCallbackUrl)}${hash}`\n }\n}\n\nconst performRedirect = (\n url: string,\n options: AuthLogoutRedirectOptions,\n) => {\n if (options.redirect) {\n options.redirect(url)\n return\n }\n\n if (typeof window === \"undefined\" || !window.location) {\n return\n }\n\n if (options.replace && typeof window.location.replace === \"function\") {\n window.location.replace(url)\n return\n }\n\n window.location.href = url\n}\n\nconst reloadCurrentPage = () => {\n if (\n typeof window === \"undefined\" ||\n !window.location ||\n typeof window.location.reload !== \"function\"\n ) {\n return\n }\n\n window.location.reload()\n}\n\nconst redirectAfterLogout = (\n context: PageContext,\n options: AuthLogoutRedirectOptions,\n) => {\n const loginUrl = resolveAuthLoginUrl(context, options)\n const callbackUrl = normalizeOptionalString(options.callbackUrl) || getCurrentHref()\n\n if (loginUrl) {\n performRedirect(\n buildAuthRedirectUrl(loginUrl, callbackUrl, options.callbackParamName),\n options,\n )\n return\n }\n\n if (options.fallback === \"none\") {\n return\n }\n\n if (options.fallback === \"reload\") {\n reloadCurrentPage()\n return\n }\n\n const redirectLoginUrl = DEFAULT_PLATFORM_LOGIN_URL\n performRedirect(\n buildAuthRedirectUrl(redirectLoginUrl, callbackUrl, options.callbackParamName),\n options,\n )\n}\n\nexport const createPageSdk = (context: PageContext): PageSdk => {\n const inFlightGetRequests = new Map<\n string,\n Promise<PageApiResponse<unknown, unknown>>\n >()\n const recentRequestStats = new Map<string, { count: number; lastAt: number }>()\n\n const request = async <TResult = unknown, TRaw = TResult>(\n options: PageRequestOptions,\n ) => {\n const payload: PageTransportRequestPayload = {\n path: options.path,\n method: normalizeMethod(options.method),\n query: serializeQuery(options.query),\n body: options.body,\n headers: options.headers,\n }\n const traceEnabled = isRequestTracingEnabled(context, options)\n const traceLabel = options.traceLabel || `${payload.method.toUpperCase()} ${payload.path}`\n const dedupeKey =\n options.dedupe !== false && payload.method === \"get\"\n ? buildRequestDedupeKey(payload)\n : undefined\n\n if (traceEnabled && dedupeKey) {\n const currentAt = nowMs()\n const previous = recentRequestStats.get(dedupeKey)\n const nextCount =\n previous && currentAt - previous.lastAt < 500 ? previous.count + 1 : 1\n recentRequestStats.set(dedupeKey, { count: nextCount, lastAt: currentAt })\n if (nextCount > 1) {\n console.warn(\n `[OpenXiangda SDK] repeated request within 500ms (${nextCount}): ${traceLabel}`,\n )\n }\n }\n\n if (dedupeKey && inFlightGetRequests.has(dedupeKey)) {\n if (traceEnabled) {\n console.debug(`[OpenXiangda SDK] deduped in-flight request: ${traceLabel}`)\n }\n return inFlightGetRequests.get(dedupeKey) as Promise<\n PageApiResponse<TResult, TRaw>\n >\n }\n\n const task = (async () => {\n const startedAt = nowMs()\n const rawResponse = await context.bridge.invoke<unknown>(\n \"transport.request\",\n payload,\n )\n const normalized = ensureSuccess(\n normalizeJsonResponse<TResult, TRaw>(rawResponse),\n payload,\n )\n if (traceEnabled) {\n console.debug(\n `[OpenXiangda SDK] ${traceLabel} ${Math.round(nowMs() - startedAt)}ms`,\n )\n }\n return normalized\n })()\n\n if (dedupeKey) {\n inFlightGetRequests.set(dedupeKey, task as Promise<PageApiResponse<unknown, unknown>>)\n }\n\n try {\n return await task\n } catch (error) {\n throw toSdkError(error, payload)\n } finally {\n if (dedupeKey && inFlightGetRequests.get(dedupeKey) === task) {\n inFlightGetRequests.delete(dedupeKey)\n }\n }\n }\n\n const download = async (options: PageRequestOptions) => {\n const payload: PageTransportDownloadPayload = {\n path: options.path,\n method: normalizeMethod(options.method),\n query: serializeQuery(options.query),\n body: options.body,\n headers: options.headers,\n }\n\n try {\n const rawResponse = await context.bridge.invoke<unknown>(\n \"transport.download\",\n payload,\n )\n return normalizeBinaryResponse(rawResponse)\n } catch (error) {\n throw toSdkError(error, payload)\n }\n }\n\n const createFileAccessTicket: PageSdk[\"createFileAccessTicket\"] = (\n bucketName,\n objectName,\n fileName,\n purpose = \"preview\",\n options = {},\n ) =>\n request<FileAccessTicketResult>({\n path: \"/file/access-ticket\",\n method: \"post\",\n body: {\n bucketName,\n objectName,\n fileName,\n purpose,\n appType: resolveAppType(context, options.appType),\n },\n })\n\n const logout = <T = boolean>() =>\n request<T>({\n path: \"/api/auth/logout\",\n method: \"post\",\n })\n\n const auth = {\n logout,\n logoutAndRedirect: async <T = boolean>(\n options: AuthLogoutRedirectOptions = {},\n ) => {\n try {\n const response = await logout<T>()\n redirectAfterLogout(context, options)\n return response\n } catch (error) {\n if (options.continueOnLogoutError === false) {\n throw error\n }\n redirectAfterLogout(context, options)\n return null\n }\n },\n }\n\n const connector = {\n invoke: <TResult = unknown, TBody = unknown>(\n params: ConnectorInvokeParams<TBody>,\n ) =>\n request<ConnectorInvokeResult<TResult>>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/connectors/actions/invoke\",\n ),\n method: \"post\",\n body: {\n connector: params.connector,\n api: params.api,\n pathParams: params.pathParams,\n query: params.query,\n body: params.body,\n headers: params.headers,\n requestBodyType: params.requestBodyType,\n responseType: params.responseType,\n },\n }),\n call: <TResult = unknown, TBody = unknown>(\n name: string,\n params: ConnectorCallParams<TBody> = {},\n ) => {\n const target = parseConnectorCallName(name)\n return connector.invoke<TResult, TBody>({\n ...params,\n connector: target.connector,\n api: target.api,\n })\n },\n download: <TBody = unknown>(\n params: ConnectorInvokeParams<TBody>,\n ): Promise<PageBinaryResponse> =>\n download({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/connectors/actions/download\",\n ),\n method: \"post\",\n body: {\n connector: params.connector,\n api: params.api,\n pathParams: params.pathParams,\n query: params.query,\n body: params.body,\n headers: params.headers,\n requestBodyType: params.requestBodyType,\n responseType: \"binary\",\n },\n }),\n }\n\n const form = {\n getDetail: <T = unknown>(params: FormGetDetailParams) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/getFormDataById.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n formInstId: resolveFormInstanceId(params),\n },\n }),\n create: async <T = FormCreateResult, TRaw = unknown>(\n params: FormCreateParams,\n ) => {\n const response = await request<T, TRaw>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/saveFormData.json\",\n ),\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n formDataJson: JSON.stringify(params.data || {}),\n saveAsDraft: params.saveAsDraft,\n draft: params.draft,\n startProcess: params.startProcess,\n autoStartProcess: params.autoStartProcess,\n processStartMode: params.processStartMode,\n },\n })\n const directId = pickCreatedFormInstanceId(response)\n if (directId) {\n return normalizeFormCreateResponse(response, directId)\n }\n if (!params.lookupAfterCreate) {\n throw createMissingFormInstanceIdError(response)\n }\n const filters = buildCreateLookupFilters(params.data || {}, params.lookupFields)\n if (!filters) {\n if (params.lookupAfterCreate === \"legacy\") return response\n throw createMissingFormInstanceIdError(response)\n }\n const lookupResponse = await request<PageListResult<Record<string, unknown>>>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/advancedSearch.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n filters: serializeSearchExpression(filters),\n currentPage: 1,\n pageSize: 1,\n order: normalizeAdvancedOrder([{ id: \"createTime\", isAsc: \"n\" }]),\n },\n })\n const lookupId = pickCreatedFormInstanceId(firstListItem(lookupResponse))\n if (lookupId) return normalizeFormCreateResponse(response, lookupId)\n if (params.lookupAfterCreate === \"legacy\") return response\n throw createMissingFormInstanceIdError(response)\n },\n update: <T = unknown, TRaw = unknown>(params: FormUpdateParams) =>\n request<T, TRaw>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/updateFormData.json\",\n ),\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n formInstId: resolveFormInstanceId(params),\n updateFormDataJson:\n params.updateFormDataJson || JSON.stringify(params.data || {}),\n },\n }),\n remove: <T = unknown, TRaw = unknown>(params: FormRemoveParams) =>\n request<T, TRaw>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/deleteFormData.json\",\n ),\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n formInstId: resolveFormInstanceId(params),\n },\n }),\n getChangeRecords: <T = unknown>(params: FormChangeRecordParams) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/getFormDataChangeRecords.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n formInstId: resolveFormInstanceId(params),\n page: params.page,\n pageSize: params.pageSize,\n },\n }),\n search: <T = unknown>(params: FormSearchParams) =>\n request<PageListResult<T>>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/searchFormDatas.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n searchFieldJson: serializeSearchExpression(params.search),\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n originatorId: params.originatorId,\n createFrom: params.createFrom,\n createTo: params.createTo,\n modifiedFrom: params.modifiedFrom,\n modifiedTo: params.modifiedTo,\n dynamicOrder: normalizeDynamicOrder(params.dynamicOrder),\n instanceStatus: params.instanceStatus,\n },\n }),\n searchIds: <T = string>(params: FormSearchParams) =>\n request<PageListResult<T>>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/searchFormDataIds.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n searchFieldJson: serializeSearchExpression(params.search),\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n originatorId: params.originatorId,\n createFrom: params.createFrom,\n createTo: params.createTo,\n modifiedFrom: params.modifiedFrom,\n modifiedTo: params.modifiedTo,\n dynamicOrder: normalizeDynamicOrder(params.dynamicOrder),\n instanceStatus: params.instanceStatus,\n },\n }),\n advancedSearch: <T = unknown>(params: FormAdvancedSearchParams) =>\n request<PageListResult<T>>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/advancedSearch.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n filters: serializeSearchExpression(params.filters),\n conditionType: params.conditionType,\n searchKeyWord: params.searchKeyWord,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n order: normalizeAdvancedOrder(params.order),\n instanceStatus: params.instanceStatus,\n },\n }),\n advancedExport: (params: FormExportParams) =>\n download({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/advancedExport.xlsx\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n filters: serializeSearchExpression(params.filters),\n conditionType: params.conditionType,\n searchKeyWord: params.searchKeyWord,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n order: normalizeAdvancedOrder(params.order),\n instanceStatus: params.instanceStatus,\n exportAll: params.exportAll,\n embedImages: params.embedImages,\n exportFields: params.exportFields?.join(\",\"),\n },\n }),\n downloadImportTemplate: (params: DataManagementConfigParams) =>\n download({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/advancedExportTemplate.xlsx\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n },\n }),\n importPreview: <T = unknown>(params: FormImportParams) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/importPreview.xlsx\",\n ),\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n fileBase64: params.fileBase64,\n fileName: params.fileName,\n },\n }),\n importExcel: <T = unknown>(params: FormImportParams) =>\n request<T>({\n path: buildAppPath(context, params.appType, \"/v1/form/import.xlsx\"),\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n fileBase64: params.fileBase64,\n fileName: params.fileName,\n },\n }),\n getImportRecords: <T = unknown>(params: ImportExportRecordQuery) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/importRecords.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n },\n }),\n getExportRecords: <T = unknown>(params: ImportExportRecordQuery) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/exportRecords.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n },\n }),\n downloadImportSource: (params: ImportExportRecordDownloadParams) =>\n download({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/importRecord/downloadSource.xlsx\",\n ),\n method: \"get\",\n query: {\n recordId: params.recordId,\n },\n }),\n downloadImportFailed: (params: ImportExportRecordDownloadParams) =>\n download({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/importRecord/downloadFailed.xlsx\",\n ),\n method: \"get\",\n query: {\n recordId: params.recordId,\n },\n }),\n downloadExportRecord: (params: ImportExportRecordDownloadParams) =>\n download({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/exportRecord/download.xlsx\",\n ),\n method: \"get\",\n query: {\n recordId: params.recordId,\n },\n }),\n getDataManagementConfig: <T = unknown>(\n params: DataManagementConfigParams,\n ) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/dataManagement/config/get.json\",\n ),\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n },\n }),\n saveDataManagementConfig: <T = unknown>(\n params: SaveDataManagementConfigParams,\n ) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/form/dataManagement/config/save.json\",\n ),\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n config: params.config,\n },\n }),\n }\n\n const user = {\n create: <T = unknown>(params: CreateUserParams) =>\n request<T>({\n path: \"/user/create\",\n method: \"post\",\n body: params,\n }),\n update: <T = unknown>(params: UpdateUserParams) =>\n request<T>({\n path: \"/user/update\",\n method: \"post\",\n body: params,\n }),\n remove: <T = boolean>(id: string) =>\n request<T>({\n path: withPostDeleteAction(`/user/${encodePathSegment(id)}`),\n method: \"post\",\n }),\n get: <T = unknown>(id = \"current\") =>\n request<T>({\n path: `/user/${encodePathSegment(id)}`,\n method: \"get\",\n }),\n getCurrent: <T = unknown>() =>\n request<T>({\n path: \"/user/current\",\n method: \"get\",\n }),\n getByUsername: <T = unknown>(username: string) =>\n request<T>({\n path: `/user/username/${encodePathSegment(username)}`,\n method: \"get\",\n }),\n list: <T = unknown>(params?: UserListParams) =>\n request<T>({\n path: \"/user/list\",\n method: \"get\",\n query: {\n ids: serializeCommaList(params?.ids),\n departmentIds: serializeCommaList(params?.departmentIds),\n keyword: params?.keyword,\n name: params?.name,\n username: params?.username,\n phone: params?.phone,\n email: params?.email,\n jobNumber: params?.jobNumber,\n page: params?.page,\n pageSize: params?.pageSize,\n },\n }),\n search: <T = unknown>(keyword?: string) =>\n request<T>({\n path: \"/user/search\",\n method: \"get\",\n query: {\n keyword,\n },\n }),\n listAll: <T = unknown>() =>\n request<T>({\n path: \"/user/all\",\n method: \"get\",\n }),\n listByDepartment: <T = unknown>(departmentId: string) =>\n request<T>({\n path: `/user/department/${encodePathSegment(departmentId)}`,\n method: \"get\",\n }),\n validate: <T = unknown>(params: ValidateUserParams) =>\n request<T>({\n path: \"/user/validate\",\n method: \"post\",\n body: params,\n }),\n }\n\n const getParentDepartments = <T = PageDepartmentRecord[]>(\n departmentId: string,\n options: GetParentDepartmentsOptions = {},\n ) =>\n request<T>({\n path: `/department/${encodePathSegment(departmentId)}/parentDepartments`,\n method: \"get\",\n query: {\n includeSelf: options.includeSelf ?? true,\n },\n })\n\n const department = {\n getParentDepartments,\n getCurrentUserParentDepartments: async (\n options: GetParentDepartmentsOptions = {},\n ): Promise<CurrentUserDepartmentParents[]> => {\n const departments = (context.user.departments || []).filter(\n (item) => typeof item.id === \"string\" && item.id.trim(),\n )\n\n return Promise.all(\n departments.map(async (item) => {\n const response = await getParentDepartments(item.id || \"\", {\n includeSelf: options.includeSelf,\n })\n return {\n department: item,\n parents: response.result || [],\n }\n }),\n )\n },\n }\n\n const organization = {\n capabilities: <T = unknown>(params: { appType?: string } = {}) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/organization/capabilities\",\n ),\n method: \"get\",\n }),\n departments: {\n list: <T = PageDepartmentRecord[]>(params: { appType?: string } = {}) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/organization/departments\",\n ),\n method: \"get\",\n }),\n get: <T = PageDepartmentRecord>(\n departmentId: string,\n params: { appType?: string } = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/organization/departments/${encodePathSegment(departmentId)}`,\n ),\n method: \"get\",\n }),\n create: <T = PageDepartmentRecord>(\n params: CreateOrganizationDepartmentParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/organization/departments\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n update: <T = PageDepartmentRecord>(\n departmentId: string,\n params: UpdateOrganizationDepartmentParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/organization/departments/${encodePathSegment(departmentId)}`,\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n },\n accounts: {\n list: <T = unknown>(params: OrganizationAccountListParams = {}) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/organization/accounts\",\n ),\n method: \"get\",\n query: {\n ids: serializeCommaList(params.ids),\n departmentIds: serializeCommaList(params.departmentIds),\n keyword: params.keyword,\n name: params.name,\n username: params.username,\n phone: params.phone,\n email: params.email,\n jobNumber: params.jobNumber,\n page: params.page,\n pageSize: params.pageSize,\n },\n }),\n get: <T = PageUserRecord>(\n userId: string,\n params: { appType?: string } = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/organization/accounts/${encodePathSegment(userId)}`,\n ),\n method: \"get\",\n }),\n create: <T = PageUserRecord>(params: CreateOrganizationAccountParams) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/organization/accounts\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n update: <T = PageUserRecord>(\n userId: string,\n params: UpdateOrganizationAccountParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/organization/accounts/${encodePathSegment(userId)}`,\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n resetPassword: <T = PageUserRecord>(\n userId: string,\n params: ResetOrganizationAccountPasswordParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/organization/accounts/${encodePathSegment(userId)}/password/reset`,\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n changeMyPassword: <T = PageUserRecord>(\n params: ChangeOrganizationAccountPasswordParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/organization/accounts/me/password/change\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n },\n }\n\n const role = {\n create: <T = unknown>(params: CreateRoleParams) =>\n request<T>({\n path: \"/role/\",\n method: \"post\",\n body: params,\n }),\n update: <T = unknown>(id: string, params: UpdateRoleParams) =>\n request<T>({\n path: `/role/${encodePathSegment(id)}/update`,\n method: \"post\",\n body: params,\n }),\n remove: <T = boolean>(id: string) =>\n request<T>({\n path: withPostDeleteAction(`/role/${encodePathSegment(id)}`),\n method: \"post\",\n }),\n get: <T = unknown>(id: string) =>\n request<T>({\n path: `/role/${encodePathSegment(id)}`,\n method: \"get\",\n }),\n list: <T = unknown>(params?: RoleListParams) =>\n request<T>({\n path: \"/role/\",\n method: \"get\",\n query: withDefaultAppType(context, params) as\n | Record<string, unknown>\n | undefined,\n }),\n listUsers: <T = unknown>(roleId: string, params?: RoleUsersParams) =>\n request<T>({\n path: `/role/${encodePathSegment(roleId)}/users`,\n method: \"get\",\n query: params as Record<string, unknown> | undefined,\n }),\n assignRoles: <T = unknown>(params: AssignRolesParams) =>\n request<T>({\n path: \"/role/assign\",\n method: \"post\",\n body: params,\n }),\n addUserRole: <T = boolean>(params: { userId: string; roleId: string }) =>\n request<T>({\n path: \"/role/add\",\n method: \"post\",\n body: params,\n }),\n removeUserRole: <T = boolean>(params: { userId: string; roleId: string }) =>\n request<T>({\n path: \"/role/remove\",\n method: \"post\",\n body: params,\n }),\n batchAddUsers: <T = unknown>(params: BatchAddUsersToRoleParams) =>\n request<T>({\n path: \"/role/batch-add-users\",\n method: \"post\",\n body: params,\n }),\n getMyRoles: <T = unknown>(params?: GetUserRolesParams) =>\n request<T>({\n path: \"/role/my/roles\",\n method: \"get\",\n query: withDefaultAppType(context, params) as\n | Record<string, unknown>\n | undefined,\n }),\n getCurrentRole: <T = unknown>(params?: GetUserRolesParams) =>\n request<T>({\n path: \"/role/my/current\",\n method: \"get\",\n query: withDefaultAppType(context, params) as\n | Record<string, unknown>\n | undefined,\n }),\n switchPlatformRole: <T = boolean>(params: SwitchPlatformRoleParams) =>\n request<T>({\n path: \"/role/switch/platform\",\n method: \"post\",\n body: params,\n }),\n switchAppRole: <T = boolean>(params: SwitchAppRoleParams) =>\n request<T>({\n path: \"/role/switch/app\",\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n }\n\n const permission = {\n formGroup: {\n create: <T = FormPermissionGroup>(params: CreateFormPermissionGroupDto) =>\n request<T>({\n path: \"/permission/form-group/\",\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n update: <T = FormPermissionGroup>(\n id: string,\n params: UpdateFormPermissionGroupDto,\n ) =>\n request<T>({\n path: `/permission/form-group/${encodePathSegment(id)}`,\n method: \"post\",\n body: {\n ...params,\n ...(params.appType\n ? { appType: resolveAppType(context, params.appType) }\n : {}),\n },\n }),\n remove: <T = boolean>(id: string) =>\n request<T>({\n path: withPostDeleteAction(\n `/permission/form-group/${encodePathSegment(id)}`,\n ),\n method: \"post\",\n }),\n get: <T = FormPermissionGroup | null>(id: string) =>\n request<T>({\n path: `/permission/form-group/${encodePathSegment(id)}`,\n method: \"get\",\n }),\n list: <T = PageOffsetListResult<FormPermissionGroup>>(\n params?: QueryFormPermissionGroupDto,\n ) =>\n request<T>({\n path: \"/permission/form-group/\",\n method: \"get\",\n query: {\n ...params,\n appType: resolveAppType(context, params?.appType),\n },\n }),\n getViewFieldPermissions: <\n T = Record<string, ViewFieldPermissionValue>,\n >(params: {\n appType?: string\n formUuid: string\n }) =>\n request<T>({\n path: \"/permission/form-group/field-permissions\",\n method: \"get\",\n query: {\n appType: resolveAppType(context, params.appType),\n formUuid: params.formUuid,\n },\n }),\n getViewPermissionSummary: <T = ViewPermissionSummary>(params: {\n appType?: string\n formUuid: string\n }) =>\n request<T>({\n path: \"/permission/form-group/view-permissions\",\n method: \"get\",\n query: {\n appType: resolveAppType(context, params.appType),\n formUuid: params.formUuid,\n },\n }),\n },\n pageGroup: {\n create: <T = PagePermissionGroup>(params: CreatePagePermissionGroupDto) =>\n request<T>({\n path: \"/permission/page-group/\",\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n update: <T = PagePermissionGroup>(\n id: string,\n params: UpdatePagePermissionGroupDto,\n ) =>\n request<T>({\n path: `/permission/page-group/${encodePathSegment(id)}`,\n method: \"post\",\n body: {\n ...params,\n ...(params.appType\n ? { appType: resolveAppType(context, params.appType) }\n : {}),\n },\n }),\n remove: <T = boolean>(id: string) =>\n request<T>({\n path: withPostDeleteAction(\n `/permission/page-group/${encodePathSegment(id)}`,\n ),\n method: \"post\",\n }),\n get: <T = PagePermissionGroup | null>(id: string) =>\n request<T>({\n path: `/permission/page-group/${encodePathSegment(id)}`,\n method: \"get\",\n }),\n list: <T = PageOffsetListResult<PagePermissionGroup>>(\n params?: QueryPagePermissionGroupDto,\n ) =>\n request<T>({\n path: \"/permission/page-group/\",\n method: \"get\",\n query: {\n ...params,\n appType: resolveAppType(context, params?.appType),\n },\n }),\n getUserMenuPermissions: <T = UserMenuPermissionsResponse>(\n appType?: string,\n ) =>\n request<T>({\n path: \"/permission/page-group/user-menu-permissions\",\n method: \"get\",\n query: {\n appType: resolveAppType(context, appType),\n },\n }),\n },\n api: {\n create: <T = unknown>(params: CreateApiPermissionParams) =>\n request<T>({\n path: \"/permission/api\",\n method: \"post\",\n body: params,\n }),\n update: <T = unknown>(id: string, params: UpdateApiPermissionParams) =>\n request<T>({\n path: `/permission/api/${encodePathSegment(id)}/update`,\n method: \"post\",\n body: params,\n }),\n remove: <T = boolean>(id: string) =>\n request<T>({\n path: withPostDeleteAction(`/permission/api/${encodePathSegment(id)}`),\n method: \"post\",\n }),\n list: <T = unknown>(params?: ApiPermissionListParams) =>\n request<T>({\n path: \"/permission/api\",\n method: \"get\",\n query: withDefaultAppType(context, params) as\n | Record<string, unknown>\n | undefined,\n }),\n assign: <T = boolean>(params: AssignPermissionsParams) =>\n request<T>({\n path: \"/permission/api/assign\",\n method: \"post\",\n body: params,\n }),\n getByRole: <T = unknown>(roleId: string) =>\n request<T>({\n path: `/permission/api/role/${encodePathSegment(roleId)}`,\n method: \"get\",\n }),\n getRolesByPermission: <T = unknown>(permissionId: string) =>\n request<T>({\n path: `/permission/api/${encodePathSegment(permissionId)}/roles`,\n method: \"get\",\n }),\n },\n ui: {\n create: <T = unknown>(params: CreateUiPermissionParams) =>\n request<T>({\n path: \"/permission/api/ui\",\n method: \"post\",\n body: params,\n }),\n update: <T = unknown>(id: string, params: UpdateUiPermissionParams) =>\n request<T>({\n path: `/permission/api/ui/${encodePathSegment(id)}/update`,\n method: \"post\",\n body: params,\n }),\n remove: <T = boolean>(id: string) =>\n request<T>({\n path: withPostDeleteAction(\n `/permission/api/ui/${encodePathSegment(id)}`,\n ),\n method: \"post\",\n }),\n list: <T = unknown>(params?: UiPermissionListParams) =>\n request<T>({\n path: \"/permission/api/ui\",\n method: \"get\",\n query: withDefaultAppType(context, params) as\n | Record<string, unknown>\n | undefined,\n }),\n assign: <T = boolean>(params: AssignPermissionsParams) =>\n request<T>({\n path: \"/permission/api/ui/assign\",\n method: \"post\",\n body: params,\n }),\n getMyPlatform: <T = unknown>() =>\n request<T>({\n path: \"/permission/api/ui/me/platform\",\n method: \"get\",\n }),\n getMyApp: <T = unknown>(appType?: string) =>\n request<T>({\n path: \"/permission/api/ui/me/app\",\n method: \"get\",\n query: {\n appType: resolveAppType(context, appType),\n },\n }),\n },\n }\n\n const process = {\n getInstance: <T = unknown>(params: GetProcessInstanceParams) =>\n request<T>({\n path: buildAppPath(context, params.appType, \"/v1/process/instance\"),\n method: \"get\",\n query: {\n instanceId: params.instanceId,\n },\n }),\n terminateInstance: <T = unknown>(params: TerminateProcessInstanceParams) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/process/terminateInstance.json\",\n ),\n method: \"post\",\n body: {\n processInstanceId: params.processInstanceId,\n reason: params.reason,\n },\n }),\n approveTask: <T = unknown>(params: ApproveTaskParams) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/process/approveTask.json\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n triggerCallbackTask: <T = unknown>(params: TriggerCallbackTaskParams) =>\n request<T>({\n path: buildAppPath(\n context,\n params.appType,\n \"/v1/process/triggerCallback.json\",\n ),\n method: \"post\",\n body: {\n taskId: params.taskId,\n payload: params.payload,\n },\n }),\n getBasic: <T = unknown>(params: ProcessInstanceLookupParams) =>\n request<T>({\n path: `/workflow/instance/${encodePathSegment(\n resolveFormInstanceId(params),\n )}/basic`,\n method: \"get\",\n }),\n getProgress: <T = unknown>(params: ProcessInstanceLookupParams) =>\n request<T>({\n path: `/workflow/instance/${encodePathSegment(\n resolveFormInstanceId(params),\n )}/all-tasks`,\n method: \"get\",\n }),\n getPermission: <T = unknown>(params: ProcessInstanceLookupParams) =>\n request<T>({\n path: `/workflow/instance/${encodePathSegment(\n resolveFormInstanceId(params),\n )}/permission`,\n method: \"get\",\n }),\n resolveCapabilities: <T = unknown>(\n params: ResolveProcessCapabilitiesParams,\n ) =>\n request<T>({\n path: \"/workflow/capabilities/resolve\",\n method: \"post\",\n body: {\n ...params,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n },\n }),\n startFromExistingInstance: <T = unknown>(\n params: WorkflowStartFromExistingInstanceParams,\n ) =>\n request<T>({\n path: \"/workflow/start-from-form-instance\",\n method: \"post\",\n body: {\n ...params,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n formInstId: params.formInstId || params.formInstanceId,\n initiatorSelectedApprovers:\n params.initiatorSelectedApprovers || params.selectedApprovers,\n },\n }),\n approve: <T = unknown>(params: WorkflowApproveParams) =>\n request<T>({\n path: \"/workflow/approve\",\n method: \"post\",\n body: {\n ...params,\n action: params.action || \"approved\",\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n },\n }),\n reject: <T = unknown>(params: WorkflowApproveParams) =>\n request<T>({\n path: \"/workflow/approve\",\n method: \"post\",\n body: {\n ...params,\n action: \"rejected\",\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n },\n }),\n transferTask: <T = unknown>(params: WorkflowTransferParams) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(params.taskId)}/transfer`,\n method: \"post\",\n body: {\n newAssignee: params.newAssignee,\n reason: params.reason,\n },\n }),\n adminTransferTask: <T = unknown>(params: WorkflowTransferParams) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(params.taskId)}/admin-transfer`,\n method: \"post\",\n body: {\n newAssignee: params.newAssignee,\n reason: params.reason,\n },\n }),\n returnTask: <T = unknown>(params: WorkflowReturnParams) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(params.taskId)}/return`,\n method: \"post\",\n body: {\n targetNodeId: params.targetNodeId,\n reason: params.reason,\n },\n }),\n withdraw: <T = unknown>(params: WorkflowWithdrawParams) =>\n request<T>({\n path: `/workflow/instance/${encodePathSegment(\n params.instanceId,\n )}/withdraw`,\n method: \"post\",\n body: {\n reason: params.reason,\n },\n }),\n retryException: <T = unknown>(params: { instanceId: string }) =>\n request<T>({\n path: `/workflow/instance/${encodePathSegment(\n params.instanceId,\n )}/retry-exception`,\n method: \"post\",\n }),\n saveTask: <T = unknown>(params: WorkflowSaveTaskParams) =>\n request<T>({\n path: \"/workflow/task/save\",\n method: \"post\",\n body: {\n ...params,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n },\n }),\n resubmitTask: <T = unknown>(params: WorkflowResubmitParams) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(params.taskId)}/resubmit`,\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n updateFormDataJson: params.updateFormDataJson,\n comments: params.comments,\n selectedApprovers: params.selectedApprovers,\n initiatorSelectedApprovers:\n params.initiatorSelectedApprovers || params.selectedApprovers,\n },\n }),\n getReturnableNodes: <T = unknown>(params: WorkflowTaskParams) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(\n params.taskId,\n )}/returnable-nodes`,\n method: \"get\",\n }),\n preview: <T = unknown>(params: WorkflowPreviewParams) =>\n request<T>({\n path: \"/workflow/preview\",\n method: \"post\",\n body: {\n ...params,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n selectedApprovers: params.selectedApprovers,\n initiatorSelectedApprovers:\n params.initiatorSelectedApprovers || params.selectedApprovers,\n },\n }),\n getDefinitionByForm: <T = unknown>(params: WorkflowDefinitionByFormParams) =>\n request<T>({\n path: \"/workflow/definition/form\",\n method: \"get\",\n query: {\n formUuid: params.formUuid,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n id: params.id,\n },\n }),\n getInitiatorSelectRequirements: <T = unknown>(\n params: WorkflowInitiatorSelectRequirementsParams,\n ) =>\n request<T>({\n path: \"/workflow/initiator-approver/requirements\",\n method: \"post\",\n body: {\n ...params,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n },\n }),\n getResubmitInitiatorSelectRequirements: <T = unknown>(\n params: WorkflowResubmitInitiatorSelectRequirementsParams,\n ) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(\n params.taskId,\n )}/resubmit/initiator-approver/requirements`,\n method: \"post\",\n body: {\n formUuid: params.formUuid,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n data: params.data,\n submissionDepartmentId: params.submissionDepartmentId,\n },\n }),\n getInitiatorSelectCandidates: <T = unknown>(\n params: WorkflowInitiatorSelectCandidatesParams,\n ) =>\n request<T>({\n path: \"/workflow/initiator-select/candidates\",\n method: \"get\",\n query: {\n ...params,\n appType: params.appType\n ? resolveAppType(context, params.appType)\n : context.app.appType,\n },\n }),\n triggerCallback: <T = unknown>(params: TriggerCallbackTaskParams) =>\n request<T>({\n path: `/workflow/task/${encodePathSegment(params.taskId)}/callback`,\n method: \"post\",\n body:\n params.payload === undefined\n ? {}\n : params.payload && typeof params.payload === \"object\"\n ? params.payload\n : { payload: params.payload },\n }),\n }\n\n const dataView = {\n query: <T = unknown>(code: string, params: DataViewQueryParams = {}) => {\n const dataViewCode = String(code || \"\").trim()\n if (!dataViewCode) {\n throw new Error(\"数据视图 code 不能为空\")\n }\n return request<DataViewQueryResult<T>>({\n path: buildAppPath(\n context,\n params.appType,\n `/v1/data-views/${encodePathSegment(dataViewCode)}/query.json`,\n ),\n method: \"post\",\n body: {\n fields: params.fields,\n filters: serializeSearchExpression(params.filters),\n conditionType: params.conditionType,\n searchKeyWord: params.searchKeyWord,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n order: Array.isArray(params.order)\n ? params.order\n : params.order\n ? [params.order]\n : undefined,\n },\n })\n },\n stats: <T = unknown>(code: string, params: DataViewStatsParams = {}) => {\n const dataViewCode = String(code || \"\").trim()\n if (!dataViewCode) {\n throw new Error(\"数据视图 code 不能为空\")\n }\n return request<DataViewQueryResult<T>>({\n path: buildAppPath(\n context,\n params.appType,\n `/v1/data-views/${encodePathSegment(dataViewCode)}/stats.json`,\n ),\n method: \"post\",\n body: {\n fields: params.fields,\n filters: serializeSearchExpression(params.filters),\n having: serializeSearchExpression(params.having),\n conditionType: params.conditionType,\n searchKeyWord: params.searchKeyWord,\n currentPage: params.currentPage,\n pageSize: params.pageSize,\n order: Array.isArray(params.order)\n ? params.order\n : params.order\n ? [params.order]\n : undefined,\n },\n })\n },\n }\n\n const appFunction = {\n invoke: <TResult = unknown, TInput = unknown>(\n code: string,\n params: FunctionInvokeParams<TInput> = {},\n ) => {\n const functionCode = String(code || \"\").trim()\n if (!functionCode) {\n throw new Error(\"应用函数 code 不能为空\")\n }\n return request<FunctionInvokeResult<TResult>>({\n path: buildAppPath(\n context,\n params.appType,\n `/v1/functions/${encodePathSegment(functionCode)}/invoke.json`,\n ),\n method: \"post\",\n body: {\n input: params.input,\n },\n })\n },\n }\n\n const notification = {\n sendByType: <T = SendNotificationResult>(\n params: SendNotificationByTypeParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/send-by-type\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n batchSendByType: <T = SendNotificationResult>(\n params: BatchSendNotificationByTypeParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/batch-send-by-type\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n findConfig: <T = unknown>(\n notificationType: string,\n params: { appType?: string; formUuid?: string } = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/notifications/type-configs/${encodePathSegment(notificationType)}`,\n ),\n method: \"get\",\n query: params.formUuid ? { formUuid: params.formUuid } : undefined,\n }),\n previewTemplate: <T = unknown>(params: PreviewNotificationTemplateParams) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/templates/preview\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n previewDingTalk: <T = unknown>(params: PreviewDingTalkNotificationParams) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/dingtalk/preview\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n sendDingTalk: <T = SendNotificationResult>(\n params: SendNotificationByTypeParams,\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/dingtalk/send\",\n ),\n method: \"post\",\n body: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n capabilities: <T = unknown>(params: { appType?: string } = {}) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/dingtalk/capabilities\",\n ),\n method: \"get\",\n }),\n listInbox: <T = NotificationInboxListResult>(\n params: ListNotificationInboxParams = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/inbox\",\n ),\n method: \"get\",\n query: {\n page: params.page,\n limit: params.limit,\n readStatus: params.readStatus,\n keyword: params.keyword,\n templateCode: params.templateCode,\n },\n }),\n getUnreadCount: <T = NotificationUnreadCountResult>(\n params: { appType?: string } = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/inbox/unread-count\",\n ),\n method: \"get\",\n }),\n markRead: <T = NotificationInboxMessage>(\n messageId: string,\n params: { appType?: string } = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n `/notifications/inbox/${encodePathSegment(messageId)}/read`,\n ),\n method: \"post\",\n }),\n markAllRead: <T = MarkAllNotificationReadResult>(\n params: { appType?: string } = {},\n ) =>\n request<T>({\n path: buildOpenXiangdaAppPath(\n context,\n params.appType,\n \"/notifications/inbox/read-all\",\n ),\n method: \"post\",\n }),\n }\n\n const workCenter = {\n listItems: <T = WorkCenterItem>(params: ListWorkCenterItemsParams) =>\n request<WorkCenterListResult<T>>({\n path: \"/work-center/items\",\n method: \"get\",\n query: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n getStats: <T = WorkCenterStats>(params: WorkCenterStatsParams = {}) =>\n request<T>({\n path: \"/work-center/stats\",\n method: \"get\",\n query: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n }\n\n const loginLog = {\n list: <T = PageOffsetListResult<LoginLogRecord>>(\n params: LoginLogListParams = {},\n ) =>\n request<T>({\n path: \"/login-log\",\n method: \"get\",\n query: {\n ...params,\n appType: resolveAppType(context, params.appType),\n },\n }),\n get: <T = LoginLogRecord | null>(\n id: string,\n params: LoginLogGetParams = {},\n ) => {\n const logId = String(id || \"\").trim()\n if (!logId) {\n throw new Error(\"登录日志 id 不能为空\")\n }\n return request<T>({\n path: `/login-log/${encodePathSegment(logId)}`,\n method: \"get\",\n query: {\n appType: resolveAppType(context, params.appType),\n includeSensitive: params.includeSensitive,\n },\n })\n },\n stats: <T = LoginLogStats>(params: LoginLogStatsParams = {}) =>\n request<T>({\n path: \"/login-log/stats\",\n method: \"get\",\n query: {\n appType: resolveAppType(context, params.appType),\n startAt: params.startAt,\n endAt: params.endAt,\n },\n }),\n }\n\n const sdk: PageSdk = {\n context,\n request,\n download,\n createFileAccessTicket,\n transport: {\n request,\n download,\n },\n auth,\n connector,\n form,\n user,\n department,\n organization,\n role,\n permission,\n process,\n notification,\n workCenter,\n loginLog,\n dataView,\n function: appFunction,\n dataSource: {\n run: async <TResult = unknown, TRaw = TResult>(\n name: string,\n params: Record<string, unknown> = {},\n ): Promise<PageApiResponse<TResult, TRaw>> => {\n const descriptor = (context.page.dataSources || []).find(\n (item) => item.key === name,\n ) as PageDataSourceDescriptor | undefined\n\n if (!descriptor) {\n throw new Error(`未找到数据源: ${String(name || \"\")}`)\n }\n\n const runtimeParams = params\n const resolvedFormUuid = String(\n runtimeParams.formUuid || descriptor.formUuid || \"\",\n ).trim()\n\n switch (descriptor.type) {\n case \"dataView.query\":\n case \"dataView.stats\": {\n const dataViewCode = String(\n runtimeParams.code ||\n runtimeParams.dataViewCode ||\n descriptor.code ||\n descriptor.dataViewCode ||\n descriptor.viewCode ||\n descriptor.key ||\n \"\",\n ).trim()\n const queryParams = {\n ...(descriptor.params && typeof descriptor.params === \"object\"\n ? (descriptor.params as Record<string, unknown>)\n : {}),\n ...runtimeParams,\n fields: runtimeParams.fields || descriptor.fields,\n filters: mergeSearchExpressions(\n descriptor.defaultFilter,\n runtimeParams.filters as SearchExpression | string | undefined,\n ),\n having: mergeSearchExpressions(\n descriptor.defaultHaving || descriptor.having,\n runtimeParams.having as SearchExpression | string | undefined,\n ),\n } as unknown as DataViewStatsParams\n delete (queryParams as Record<string, unknown>).code\n delete (queryParams as Record<string, unknown>).dataViewCode\n delete (queryParams as Record<string, unknown>).viewCode\n if (descriptor.type === \"dataView.stats\") {\n return dataView.stats<TResult>(\n dataViewCode,\n queryParams,\n ) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n }\n delete (queryParams as Record<string, unknown>).having\n return dataView.query<TResult>(\n dataViewCode,\n queryParams,\n ) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n }\n case \"form.list\":\n return form.advancedSearch<TResult>({\n ...(runtimeParams as unknown as Omit<\n FormAdvancedSearchParams,\n \"formUuid\"\n >),\n formUuid: resolvedFormUuid,\n filters: mergeSearchExpressions(\n descriptor.defaultFilter,\n runtimeParams.filters as SearchExpression | string | undefined,\n ),\n }) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n case \"form.detail\":\n return form.getDetail<TResult>({\n ...(runtimeParams as unknown as Omit<\n FormGetDetailParams,\n \"formUuid\"\n >),\n formUuid: resolvedFormUuid,\n }) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n case \"form.create\":\n return form.create<TResult>({\n ...(runtimeParams as unknown as Omit<\n FormCreateParams,\n \"formUuid\"\n >),\n formUuid: resolvedFormUuid,\n }) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n case \"form.update\":\n return form.update<TResult>({\n ...(runtimeParams as unknown as Omit<\n FormUpdateParams,\n \"formUuid\"\n >),\n formUuid: resolvedFormUuid,\n }) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n case \"form.delete\":\n return form.remove<TResult>({\n ...(runtimeParams as unknown as Omit<\n FormRemoveParams,\n \"formUuid\"\n >),\n formUuid: resolvedFormUuid,\n }) as unknown as Promise<PageApiResponse<TResult, TRaw>>\n default:\n throw new Error(`暂不支持的数据源类型: ${String(descriptor.type)}`)\n }\n },\n },\n navigation: context.navigation,\n ui: context.ui,\n }\n\n return sdk\n}\n","import type { ThemeConfig } from 'antd';\n\nconst baseTheme = {\n hashed: false,\n token: {\n colorPrimary: '#1677ff',\n colorInfo: '#1677ff',\n colorSuccess: '#52c41a',\n colorWarning: '#faad14',\n colorError: '#ff4d4f',\n colorText: 'rgba(0,0,0,0.88)',\n colorTextSecondary: 'rgba(0,0,0,0.65)',\n colorTextTertiary: 'rgba(0,0,0,0.45)',\n colorTextDisabled: 'rgba(0,0,0,0.25)',\n colorBgContainer: '#ffffff',\n colorBgLayout: '#f5f5f5',\n colorBgElevated: '#ffffff',\n colorBorder: '#d9d9d9',\n colorBorderSecondary: '#f0f0f0',\n borderRadius: 6,\n borderRadiusSM: 4,\n borderRadiusLG: 8,\n fontSize: 14,\n controlHeight: 32,\n },\n components: {\n Form: { itemMarginBottom: 16 },\n Card: { paddingLG: 24 },\n },\n} satisfies ThemeConfig;\n\nexport const antdTheme: ThemeConfig = {\n ...baseTheme,\n cssVar: { prefix: 'ant' },\n};\n\nexport const legacyAntdTheme: ThemeConfig = {\n ...baseTheme,\n cssVar: { prefix: 'sy-ant' },\n};\n\nexport default antdTheme;\n","import { useMemo } from \"react\"\n\nimport { usePageContext } from \"./usePageContext\"\n\nimport type { PageUserInfo, PageUserType } from \"../../core/types\"\n\nexport interface CurrentUserState {\n user: PageUserInfo & { userType: PageUserType; isGuest: boolean }\n isGuest: boolean\n isInternalUser: boolean\n displayName: string\n primaryDepartment: NonNullable<PageUserInfo[\"departments\"]>[number] | null\n affiliatedDepartment: PageUserInfo[\"affiliatedDepartment\"] | null\n}\n\nexport const useCurrentUser = (): CurrentUserState => {\n const { user } = usePageContext()\n\n return useMemo(() => {\n const userType: PageUserType =\n user.userType === \"guest\" || user.isGuest ? \"guest\" : \"normal\"\n const isGuest = userType === \"guest\"\n\n return {\n user: {\n ...user,\n isGuest,\n userType,\n },\n isGuest,\n isInternalUser: !isGuest,\n displayName: user.name || user.username || user.id,\n primaryDepartment: user.departments?.[0] || null,\n affiliatedDepartment: user.affiliatedDepartment || null,\n }\n }, [user])\n}\n","import { usePageSdkStore } from \"../store\"\n\nimport type { PageContext } from \"../../core/types\"\n\nexport const usePageContext = (): PageContext => {\n return usePageSdkStore().context\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\"\n\nimport { usePageSdk } from \"./usePageSdk\"\n\nimport type { PageApiResponse } from \"../../core/types\"\nimport type { Dispatch, SetStateAction } from \"react\"\n\nconst createParamsSignature = (value: unknown): string => {\n try {\n return JSON.stringify(value || {})\n } catch {\n return \"\"\n }\n}\n\nexport interface UseDataSourceOptions<\n TResult = unknown,\n TData = TResult,\n TParams extends Record<string, unknown> = Record<string, unknown>,\n> {\n params?: TParams\n immediate?: boolean\n transform?: (result: TResult, response: PageApiResponse<TResult>) => TData\n}\n\nexport interface UseDataSourceResult<\n TResult = unknown,\n TData = TResult,\n TParams extends Record<string, unknown> = Record<string, unknown>,\n> {\n response: PageApiResponse<TResult> | null\n result: TResult | null\n data: TData | null\n loading: boolean\n error: Error | null\n refresh: (params?: TParams) => Promise<PageApiResponse<TResult> | null>\n run: (params?: TParams) => Promise<PageApiResponse<TResult> | null>\n setResponse: Dispatch<SetStateAction<PageApiResponse<TResult> | null>>\n setResult: Dispatch<SetStateAction<TResult | null>>\n setData: Dispatch<SetStateAction<TData | null>>\n}\n\nexport const useDataSource = <\n TResult = unknown,\n TData = TResult,\n TParams extends Record<string, unknown> = Record<string, unknown>,\n>(\n name: string,\n options: UseDataSourceOptions<TResult, TData, TParams> = {},\n): UseDataSourceResult<TResult, TData, TParams> => {\n const sdk = usePageSdk()\n const { params, immediate = true, transform } = options\n const paramsRef = useRef(params)\n const transformRef = useRef(transform)\n const paramsSignature = createParamsSignature(params)\n const [response, setResponse] = useState<PageApiResponse<TResult> | null>(\n null,\n )\n const [result, setResult] = useState<TResult | null>(null)\n const [data, setData] = useState<TData | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n paramsRef.current = params\n transformRef.current = transform\n\n const run = useCallback(\n async (overrideParams?: TParams) => {\n setLoading(true)\n setError(null)\n try {\n const response = await sdk.dataSource.run<TResult>(\n name,\n overrideParams || paramsRef.current || {},\n )\n setResponse(response)\n setResult(response.result as TResult | null)\n const activeTransform = transformRef.current\n const nextData = activeTransform\n ? activeTransform(response.result as TResult, response)\n : ((response.result ?? null) as unknown as TData | null)\n setData(nextData)\n return response\n } catch (runtimeError) {\n const nextError =\n runtimeError instanceof Error\n ? runtimeError\n : new Error(String(runtimeError))\n setError(nextError)\n setResponse(null)\n setResult(null)\n return null\n } finally {\n setLoading(false)\n }\n },\n [name, sdk.dataSource],\n )\n\n useEffect(() => {\n if (!immediate) {\n return\n }\n void run()\n }, [immediate, paramsSignature, run])\n\n return {\n response,\n result,\n data,\n loading,\n error,\n refresh: run,\n run,\n setResponse,\n setResult,\n setData,\n }\n}\n","import { usePageSdkStore } from \"../store\"\n\nimport type { PageSdk } from \"../../core/types\"\n\nexport const usePageSdk = (): PageSdk => {\n return usePageSdkStore().sdk\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\"\n\nimport { usePageSdk } from \"./usePageSdk\"\n\nimport type {\n PageApiResponse,\n ViewFieldPermissionValue,\n ViewOperationPermission,\n ViewPermissionSummary,\n} from \"../../core/types\"\n\nexport interface UseFormViewPermissionsOptions {\n appType?: string\n immediate?: boolean\n}\n\nexport interface UseFormViewPermissionsState {\n summary: ViewPermissionSummary\n response: PageApiResponse<ViewPermissionSummary> | null\n loading: boolean\n error: Error | null\n refresh: () => Promise<PageApiResponse<ViewPermissionSummary> | null>\n can: (operation: ViewOperationPermission) => boolean\n getFieldPermission: (fieldName: string) => ViewFieldPermissionValue | null\n}\n\nconst EMPTY_SUMMARY: ViewPermissionSummary = {\n fieldPermissions: {},\n operations: [],\n actions: [],\n}\n\nconst normalizeSummary = (summary?: ViewPermissionSummary): ViewPermissionSummary => {\n const actions = Array.from(\n new Set([...(summary?.actions || []), ...(summary?.operations || [])]),\n ) as ViewOperationPermission[]\n const can = actions.reduce(\n (result, operation) => {\n result[operation] = Boolean(summary?.can?.[operation] ?? true)\n return result\n },\n {} as Record<ViewOperationPermission, boolean>,\n )\n return {\n ...summary,\n fieldPermissions: summary?.fieldPermissions || {},\n operations: actions,\n actions,\n can,\n }\n}\n\nconst toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error\n }\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n return new Error(error.message)\n }\n return new Error(String(error || \"获取查看态权限失败\"))\n}\n\nexport const useFormViewPermissions = (\n formUuid: string,\n options: UseFormViewPermissionsOptions = {},\n): UseFormViewPermissionsState => {\n const sdk = usePageSdk()\n const [summary, setSummary] = useState<ViewPermissionSummary>(EMPTY_SUMMARY)\n const [response, setResponse] =\n useState<PageApiResponse<ViewPermissionSummary> | null>(null)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const immediate = options.immediate ?? true\n\n const refresh = useCallback(async () => {\n const normalizedFormUuid = String(formUuid || \"\").trim()\n if (!normalizedFormUuid) {\n setSummary(EMPTY_SUMMARY)\n setResponse(null)\n return null\n }\n\n setLoading(true)\n setError(null)\n\n try {\n const nextResponse =\n await sdk.permission.formGroup.getViewPermissionSummary({\n appType: options.appType,\n formUuid: normalizedFormUuid,\n })\n const nextSummary = nextResponse.result || EMPTY_SUMMARY\n setResponse(nextResponse)\n setSummary(normalizeSummary(nextSummary))\n return nextResponse\n } catch (requestError) {\n const nextError = toError(requestError)\n setError(nextError)\n setResponse(null)\n setSummary(EMPTY_SUMMARY)\n return null\n } finally {\n setLoading(false)\n }\n }, [formUuid, options.appType, sdk])\n\n useEffect(() => {\n if (!immediate) {\n return\n }\n void refresh()\n }, [immediate, refresh])\n\n const operationSet = useMemo(\n () => new Set(summary.actions || summary.operations),\n [summary.actions, summary.operations],\n )\n\n const can = useCallback(\n (operation: ViewOperationPermission) =>\n Boolean(summary.can?.[operation] ?? operationSet.has(operation)),\n [operationSet, summary.can],\n )\n\n const getFieldPermission = useCallback(\n (fieldName: string) => summary.fieldPermissions[fieldName] || null,\n [summary.fieldPermissions],\n )\n\n return {\n summary,\n response,\n loading,\n error,\n refresh,\n can,\n getFieldPermission,\n }\n}\n","import { usePageContext } from \"./usePageContext\"\n\nimport type { PageMessageApi } from \"../../core/types\"\n\nexport const useMessage = (): PageMessageApi => {\n return usePageContext().ui.message\n}\n","import { usePageContext } from \"./usePageContext\"\n\nimport type { PageModalApi } from \"../../core/types\"\n\nexport const useModal = (): PageModalApi => {\n return usePageContext().ui.modal\n}\n","import { usePageContext } from \"./usePageContext\"\n\nimport type { PageNavigationApi } from \"../../core/types\"\n\nexport const useNavigation = (): PageNavigationApi => {\n return usePageContext().navigation\n}\n","import { usePageContext } from \"./usePageContext\"\n\nexport const usePageProps = <T extends object = Record<string, unknown>>() => {\n return usePageContext().page.props as T\n}\n","import { usePageContext } from \"./usePageContext\"\n\nimport type { PageRouteInfo } from \"../../core/types\"\n\nexport const usePageRoute = (): PageRouteInfo => {\n return usePageContext().route\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport { Form, Input, Modal, Select } from \"antd\"\nimport {\n CheckOutlined,\n CloseOutlined,\n ReloadOutlined,\n RollbackOutlined,\n SaveOutlined,\n SwapOutlined,\n} from \"@ant-design/icons\"\n\nimport type {\n ProcessCapabilities,\n ProcessCapabilityOperation,\n ResolveProcessCapabilitiesParams,\n WorkflowCapabilityActionKey,\n} from \"../core/types\"\nimport { usePageSdk } from \"./hooks/usePageSdk\"\nimport { StickyActionBar } from \"../../components/modules/StickyActionBar\"\nimport type { ActionConfig } from \"../../components/modules/FormActionBar\"\nimport { ApprovalTimeline } from \"../../components/modules/ApprovalTimeline\"\nimport type { ApprovalTimelineProps } from \"../../components/modules/ApprovalTimeline\"\nimport { ProcessPreview } from \"../../components/modules/ProcessPreview\"\nimport type { ProcessPreviewProps } from \"../../components/modules/ProcessPreview\"\nimport { InitiatorApproverSelector } from \"../../components/modules/InitiatorApproverSelector\"\n\nexport interface UseProcessCapabilitiesOptions\n extends ResolveProcessCapabilitiesParams {\n enabled?: boolean\n refreshKey?: unknown\n onError?: (error: Error) => void\n}\n\nexport interface UseProcessCapabilitiesReturn {\n capabilities: ProcessCapabilities | null\n operations: ProcessCapabilityOperation[]\n timeline: Array<Record<string, unknown>>\n loading: boolean\n error: Error | null\n refresh: () => Promise<ProcessCapabilities | null>\n}\n\nconst getError = (error: unknown): Error =>\n error instanceof Error ? error : new Error(String(error || \"流程能力解析失败\"))\n\nconst normalizeCapabilities = (value: unknown): ProcessCapabilities => {\n const raw = (value || {}) as ProcessCapabilities\n return {\n ...raw,\n operations: Array.isArray(raw.operations) ? raw.operations : [],\n timeline: Array.isArray(raw.timeline) ? raw.timeline : [],\n }\n}\n\nexport function useProcessCapabilities(\n options: UseProcessCapabilitiesOptions,\n): UseProcessCapabilitiesReturn {\n const { enabled = true, refreshKey, onError, ...params } = options\n const sdk = usePageSdk()\n const [capabilities, setCapabilities] = useState<ProcessCapabilities | null>(\n null,\n )\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const mountedRef = useRef(true)\n const paramsKey = JSON.stringify({ ...params, refreshKey })\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n const refresh = useCallback(async () => {\n if (!enabled) return capabilities\n setLoading(true)\n setError(null)\n try {\n const response = await sdk.process.resolveCapabilities<ProcessCapabilities>(\n params,\n )\n const nextCapabilities = normalizeCapabilities(response.result)\n if (mountedRef.current) {\n setCapabilities(nextCapabilities)\n }\n return nextCapabilities\n } catch (input) {\n const nextError = getError(input)\n if (mountedRef.current) {\n setError(nextError)\n }\n onError?.(nextError)\n return null\n } finally {\n if (mountedRef.current) {\n setLoading(false)\n }\n }\n }, [capabilities, enabled, onError, paramsKey, sdk])\n\n useEffect(() => {\n if (!enabled) return\n void refresh()\n }, [enabled, paramsKey, refresh])\n\n return {\n capabilities,\n operations: capabilities?.operations || [],\n timeline: capabilities?.timeline || [],\n loading,\n error,\n refresh,\n }\n}\n\nexport interface ExecuteProcessOperationInput {\n comments?: string\n reason?: string\n newAssignee?: string\n targetNodeId?: string\n payload?: unknown\n submissionDepartmentId?: string\n selectedApprovers?: Record<string, string[]>\n initiatorSelectedApprovers?: Record<string, string[]>\n updateFormDataJson?: string\n}\n\nexport interface UseProcessActionsOptions {\n capabilities?: ProcessCapabilities | null\n formUuid?: string\n appType?: string\n getFormValues?: () => Record<string, unknown>\n onActionComplete?: (\n action: WorkflowCapabilityActionKey,\n operation: ProcessCapabilityOperation,\n ) => Promise<void> | void\n}\n\nexport interface UseProcessActionsReturn {\n loadingAction: WorkflowCapabilityActionKey | null\n executeOperation: (\n operation: ProcessCapabilityOperation,\n input?: ExecuteProcessOperationInput,\n ) => Promise<boolean>\n execute: (\n action: WorkflowCapabilityActionKey,\n input?: ExecuteProcessOperationInput,\n ) => Promise<boolean>\n}\n\nconst getInstanceId = (\n operation: ProcessCapabilityOperation,\n capabilities?: ProcessCapabilities | null,\n) =>\n String(\n operation.instanceId ||\n operation.formInstanceId ||\n capabilities?.instance?.id ||\n capabilities?.instance?.formInstanceId ||\n \"\",\n )\n\nconst getTaskId = (operation: ProcessCapabilityOperation) =>\n String(operation.taskId || \"\")\n\nconst requireValue = (value: string | undefined, message: string) => {\n const normalized = String(value || \"\").trim()\n if (!normalized) throw new Error(message)\n return normalized\n}\n\nexport function useProcessActions(\n options: UseProcessActionsOptions,\n): UseProcessActionsReturn {\n const { capabilities, formUuid, appType, getFormValues, onActionComplete } =\n options\n const sdk = usePageSdk()\n const [loadingAction, setLoadingAction] =\n useState<WorkflowCapabilityActionKey | null>(null)\n\n const buildUpdateFormDataJson = useCallback(\n (input?: ExecuteProcessOperationInput) => {\n if (input?.updateFormDataJson !== undefined) return input.updateFormDataJson\n const values = getFormValues?.()\n return values ? JSON.stringify(values) : undefined\n },\n [getFormValues],\n )\n\n const executeOperation = useCallback(\n async (\n operation: ProcessCapabilityOperation,\n input: ExecuteProcessOperationInput = {},\n ) => {\n if (!operation.enabled) return false\n setLoadingAction(operation.key)\n try {\n const instanceId = getInstanceId(operation, capabilities)\n const taskId = getTaskId(operation)\n if (operation.key === \"startProcess\") {\n const definition = capabilities?.instance?.definition as\n | Record<string, unknown>\n | undefined\n await sdk.process.startFromExistingInstance({\n appType,\n formUuid: requireValue(\n formUuid ||\n String(operation.formUuid || definition?.formUuid || \"\"),\n \"formUuid 不能为空\",\n ),\n formInstId: requireValue(instanceId, \"表单实例ID不能为空\"),\n formInstanceId: instanceId,\n updateFormDataJson: buildUpdateFormDataJson(input),\n submissionDepartmentId: input.submissionDepartmentId,\n selectedApprovers: input.selectedApprovers,\n initiatorSelectedApprovers:\n input.initiatorSelectedApprovers || input.selectedApprovers,\n })\n } else if (operation.key === \"approve\") {\n await sdk.process.approve({\n instanceId: requireValue(instanceId, \"流程实例ID不能为空\"),\n appType,\n formUuid,\n comments: input.comments,\n updateFormDataJson: buildUpdateFormDataJson(input),\n })\n } else if (operation.key === \"reject\") {\n await sdk.process.reject({\n instanceId: requireValue(instanceId, \"流程实例ID不能为空\"),\n appType,\n formUuid,\n comments: input.comments || input.reason,\n updateFormDataJson: buildUpdateFormDataJson(input),\n })\n } else if (operation.key === \"transfer\") {\n await sdk.process.transferTask({\n taskId: requireValue(taskId, \"流程任务ID不能为空\"),\n newAssignee: requireValue(input.newAssignee, \"转交人不能为空\"),\n reason: input.reason,\n })\n } else if (operation.key === \"adminTransfer\") {\n await sdk.process.adminTransferTask({\n taskId: requireValue(taskId, \"流程任务ID不能为空\"),\n newAssignee: requireValue(input.newAssignee, \"转交人不能为空\"),\n reason: input.reason,\n })\n } else if (operation.key === \"return\") {\n await sdk.process.returnTask({\n taskId: requireValue(taskId, \"流程任务ID不能为空\"),\n targetNodeId: requireValue(input.targetNodeId, \"退回节点不能为空\"),\n reason: input.reason,\n })\n } else if (operation.key === \"withdraw\") {\n await sdk.process.withdraw({\n instanceId: requireValue(instanceId, \"流程实例ID不能为空\"),\n reason: input.reason || input.comments,\n })\n } else if (operation.key === \"save\") {\n await sdk.process.saveTask({\n instanceId: requireValue(instanceId, \"流程实例ID不能为空\"),\n appType,\n formUuid: requireValue(formUuid, \"formUuid 不能为空\"),\n updateFormDataJson: requireValue(\n buildUpdateFormDataJson(input),\n \"暂存数据不能为空\",\n ),\n comments: input.comments,\n })\n } else if (operation.key === \"resubmit\") {\n await sdk.process.resubmitTask({\n taskId: requireValue(taskId, \"流程任务ID不能为空\"),\n appType,\n formUuid: requireValue(formUuid, \"formUuid 不能为空\"),\n updateFormDataJson: requireValue(\n buildUpdateFormDataJson(input),\n \"重新提交数据不能为空\",\n ),\n comments: input.comments,\n selectedApprovers: input.selectedApprovers,\n initiatorSelectedApprovers: input.selectedApprovers,\n })\n } else if (operation.key === \"callback\") {\n await sdk.process.triggerCallback({\n taskId: requireValue(taskId, \"流程任务ID不能为空\"),\n payload: input.payload,\n })\n } else if (operation.key === \"retryException\") {\n await sdk.process.retryException({\n instanceId: requireValue(instanceId, \"流程实例ID不能为空\"),\n })\n }\n await onActionComplete?.(operation.key, operation)\n return true\n } finally {\n setLoadingAction(null)\n }\n },\n [\n appType,\n buildUpdateFormDataJson,\n capabilities,\n formUuid,\n onActionComplete,\n sdk,\n ],\n )\n\n const execute = useCallback(\n async (\n action: WorkflowCapabilityActionKey,\n input?: ExecuteProcessOperationInput,\n ) => {\n const operation = (capabilities?.operations || []).find(\n (item) => item.key === action,\n )\n if (!operation) return false\n return executeOperation(operation, input)\n },\n [capabilities?.operations, executeOperation],\n )\n\n return {\n loadingAction,\n executeOperation,\n execute,\n }\n}\n\nexport interface ProcessActionBarProps extends UseProcessActionsOptions {\n capabilities?: ProcessCapabilities | null\n capabilityParams?: UseProcessCapabilitiesOptions\n operations?: ProcessCapabilityOperation[]\n onRefreshCapabilities?: () => Promise<void> | void\n className?: string\n maxMobileButtons?: number\n inDrawer?: boolean\n maxWidth?: number | string\n position?: \"sticky\" | \"fixed\" | \"inline\"\n}\n\ntype ModalAction = Extract<\n WorkflowCapabilityActionKey,\n \"reject\" | \"transfer\" | \"adminTransfer\" | \"return\" | \"withdraw\" | \"resubmit\"\n>\n\nconst modalActions = new Set<WorkflowCapabilityActionKey>([\n \"reject\",\n \"transfer\",\n \"adminTransfer\",\n \"return\",\n \"withdraw\",\n \"resubmit\",\n])\n\nconst actionPriority: Record<WorkflowCapabilityActionKey, number> = {\n startProcess: 5,\n approve: 10,\n resubmit: 15,\n callback: 20,\n save: 40,\n transfer: 50,\n adminTransfer: 55,\n return: 60,\n retryException: 70,\n withdraw: 80,\n reject: 90,\n}\n\nconst actionTone = (\n key: WorkflowCapabilityActionKey,\n): ActionConfig[\"type\"] => {\n if (key === \"startProcess\" || key === \"approve\" || key === \"resubmit\") return \"primary\"\n if (key === \"reject\" || key === \"withdraw\") return \"danger\"\n return \"default\"\n}\n\nconst actionIcon = (key: WorkflowCapabilityActionKey) => {\n if (key === \"startProcess\" || key === \"approve\") return <CheckOutlined />\n if (key === \"reject\") return <CloseOutlined />\n if (key === \"transfer\" || key === \"adminTransfer\") return <SwapOutlined />\n if (key === \"return\" || key === \"withdraw\") return <RollbackOutlined />\n if (key === \"save\") return <SaveOutlined />\n if (key === \"retryException\" || key === \"callback\") return <ReloadOutlined />\n return undefined\n}\n\nconst getModalTitle = (key: ModalAction) => {\n if (key === \"reject\") return \"拒绝理由\"\n if (key === \"transfer\") return \"转交任务\"\n if (key === \"adminTransfer\") return \"管理员转交\"\n if (key === \"return\") return \"退回任务\"\n if (key === \"withdraw\") return \"撤回流程\"\n return \"重新提交\"\n}\n\nexport const ProcessActionBar: React.FC<ProcessActionBarProps> = ({\n capabilities: controlledCapabilities,\n capabilityParams,\n operations: controlledOperations,\n formUuid,\n appType,\n getFormValues,\n onActionComplete,\n onRefreshCapabilities,\n className,\n maxMobileButtons = 2,\n inDrawer,\n maxWidth,\n position = \"sticky\",\n}) => {\n const [form] = Form.useForm()\n const [activeOperation, setActiveOperation] =\n useState<ProcessCapabilityOperation | null>(null)\n const autoCapabilities = useProcessCapabilities({\n ...(capabilityParams || {}),\n enabled: Boolean(capabilityParams) && capabilityParams?.enabled !== false,\n })\n const capabilities = controlledCapabilities || autoCapabilities.capabilities\n const operations = controlledOperations || capabilities?.operations || []\n const actions = useProcessActions({\n capabilities,\n formUuid,\n appType,\n getFormValues,\n onActionComplete: async (action, operation) => {\n await onActionComplete?.(action, operation)\n await onRefreshCapabilities?.()\n if (capabilityParams) {\n await autoCapabilities.refresh()\n }\n },\n })\n\n const openOperation = (operation: ProcessCapabilityOperation) => {\n if (!operation.enabled) return\n if (modalActions.has(operation.key)) {\n const firstReturnNode = operation.returnableNodes?.[0]\n form.setFieldsValue({\n comments: \"\",\n reason: \"\",\n newAssignee: undefined,\n targetNodeId:\n typeof firstReturnNode?.nodeId === \"string\"\n ? firstReturnNode.nodeId\n : typeof firstReturnNode?.id === \"string\"\n ? firstReturnNode.id\n : undefined,\n })\n setActiveOperation(operation)\n return\n }\n void actions.executeOperation(operation)\n }\n\n const actionConfigs: ActionConfig[] = useMemo(\n () =>\n operations.map((operation) => ({\n key: operation.key,\n label: operation.label || operation.key,\n type: actionTone(operation.key),\n icon: actionIcon(operation.key),\n disabled: !operation.enabled,\n disabledReason: operation.disabledReason,\n visible: operation.visible !== false,\n loading: actions.loadingAction === operation.key,\n priority: actionPriority[operation.key] || 50,\n onClick: () => openOperation(operation),\n })),\n [actions.loadingAction, operations],\n )\n\n const handleModalOk = async () => {\n if (!activeOperation) return\n const values = await form.validateFields()\n const ok = await actions.executeOperation(activeOperation, values)\n if (ok) {\n setActiveOperation(null)\n form.resetFields()\n }\n }\n\n const modalKey = activeOperation?.key as ModalAction | undefined\n const returnOptions = (activeOperation?.returnableNodes || []).map((node) => {\n const value = String(node.nodeId || node.id || \"\")\n return {\n value,\n label: String(node.nodeName || node.name || node.label || value),\n }\n })\n\n return (\n <>\n <StickyActionBar\n actions={actionConfigs}\n layoutMode=\"approval\"\n maxMobileButtons={maxMobileButtons}\n className={className}\n inDrawer={inDrawer}\n maxWidth={maxWidth}\n position={position}\n />\n <Modal\n getContainer={false}\n title={modalKey ? getModalTitle(modalKey) : \"流程操作\"}\n open={Boolean(activeOperation)}\n okText=\"确认\"\n cancelText=\"取消\"\n confirmLoading={Boolean(\n activeOperation && actions.loadingAction === activeOperation.key,\n )}\n onOk={handleModalOk}\n onCancel={() => {\n setActiveOperation(null)\n form.resetFields()\n }}\n destroyOnHidden\n >\n <Form form={form} layout=\"vertical\">\n {(modalKey === \"transfer\" || modalKey === \"adminTransfer\") && (\n <Form.Item\n name=\"newAssignee\"\n label=\"接收人\"\n rules={[{ required: true, message: \"请输入接收人用户ID\" }]}\n >\n <Input placeholder=\"请输入用户ID\" />\n </Form.Item>\n )}\n {modalKey === \"return\" && (\n <Form.Item\n name=\"targetNodeId\"\n label=\"退回节点\"\n rules={[{ required: true, message: \"请选择退回节点\" }]}\n >\n <Select placeholder=\"请选择退回节点\" options={returnOptions} />\n </Form.Item>\n )}\n <Form.Item\n name={modalKey === \"reject\" || modalKey === \"resubmit\" ? \"comments\" : \"reason\"}\n label={\n modalKey === \"reject\"\n ? \"拒绝理由\"\n : modalKey === \"resubmit\"\n ? \"提交意见\"\n : \"说明\"\n }\n rules={[\n {\n required: modalKey === \"reject\" || modalKey === \"withdraw\",\n message: \"请填写说明\",\n },\n ]}\n >\n <Input.TextArea rows={4} maxLength={500} showCount />\n </Form.Item>\n </Form>\n </Modal>\n </>\n )\n}\n\nexport interface ProcessTimelineProps\n extends Omit<ApprovalTimelineProps, \"tasks\"> {\n capabilities?: ProcessCapabilities | null\n tasks?: ApprovalTimelineProps[\"tasks\"]\n}\n\nexport const ProcessTimeline: React.FC<ProcessTimelineProps> = ({\n capabilities,\n tasks,\n ...props\n}) => (\n <ApprovalTimeline\n {...props}\n tasks={(tasks || capabilities?.timeline || []) as ApprovalTimelineProps[\"tasks\"]}\n />\n)\n\nexport const ProcessPreviewPanel = ProcessPreview\nexport type ProcessPreviewPanelProps = ProcessPreviewProps\nexport { InitiatorApproverSelector }\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { Button, Dropdown, Tooltip } from 'antd';\nimport { MoreOutlined } from '@ant-design/icons';\nimport type { ActionConfig } from './FormActionBar';\nimport { confirmAction } from '../utils/confirmAction';\n\nexport interface StickyActionBarProps {\n actions: ActionConfig[];\n className?: string;\n maxMobileButtons?: number;\n layoutMode?: 'default' | 'approval';\n align?: 'left' | 'center' | 'right';\n inDrawer?: boolean;\n maxWidth?: number | string;\n position?: 'sticky' | 'fixed' | 'inline';\n surface?: 'default' | 'transparent';\n}\n\nconst getActionPriority = (action: ActionConfig) => {\n const maybePriority = (action as ActionConfig & { priority?: number }).priority;\n if (typeof maybePriority === 'number') return maybePriority;\n if (action.type === 'primary') return 10;\n if (action.type === 'danger') return 90;\n return 50;\n};\n\nexport const StickyActionBar: React.FC<StickyActionBarProps> = ({\n actions,\n className = '',\n maxMobileButtons = 2,\n layoutMode = 'default',\n align = 'right',\n maxWidth = 1120,\n position = 'sticky',\n surface = 'default',\n}) => {\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const update = () => setIsMobile(typeof window !== 'undefined' && window.innerWidth <= 768);\n update();\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }, []);\n\n const visibleActions = useMemo(\n () =>\n actions\n .filter((action) => action.visible !== false)\n .sort((left, right) => getActionPriority(left) - getActionPriority(right)),\n [actions],\n );\n\n if (visibleActions.length === 0) return null;\n\n const maxWidthStyle = typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth;\n const primaryMobile = visibleActions.slice(0, maxMobileButtons);\n const moreMobile = visibleActions.slice(maxMobileButtons);\n const desktopAlign = layoutMode === 'approval' ? 'center' : align;\n const desktopJustifyClass =\n desktopAlign === 'left'\n ? 'justify-start'\n : desktopAlign === 'center'\n ? 'justify-center'\n : 'justify-end';\n const positionClass =\n position === 'fixed'\n ? 'fixed bottom-0 left-0 right-0'\n : position === 'inline'\n ? 'relative'\n : 'sticky bottom-0';\n const surfaceClass =\n surface === 'transparent'\n ? 'border-t-0 bg-transparent shadow-none backdrop-blur-0'\n : 'border-t border-ant-border-secondary bg-ant-bg-container/95 shadow-[0_-8px_24px_rgba(15,23,42,0.06)] backdrop-blur';\n const spacingClass =\n surface === 'transparent'\n ? 'px-0 py-0'\n : 'px-4 py-3 supports-[padding:max(0px)]:pb-[max(0.75rem,env(safe-area-inset-bottom))]';\n\n const runAction = (action: ActionConfig) => {\n if (action.confirm) {\n const confirmed = confirmAction(action.confirm.title, action.confirm.content);\n if (!confirmed) return;\n }\n action.onClick();\n };\n\n const renderButton = (action: ActionConfig, mobile = false) => {\n const button = (\n <Button\n key={action.key}\n type={\n action.type === 'danger'\n ? 'primary'\n : action.type === 'text'\n ? 'text'\n : action.type || 'default'\n }\n danger={action.type === 'danger'}\n loading={action.loading}\n disabled={action.disabled}\n icon={action.icon}\n onClick={() => runAction(action)}\n className={`${mobile ? 'min-w-0 flex-1' : 'min-w-[88px]'} rounded-md`}\n >\n {action.label}\n </Button>\n );\n if (!action.disabled || !action.disabledReason) return button;\n return (\n <Tooltip key={action.key} title={action.disabledReason}>\n <span className={mobile ? 'flex min-w-0 flex-1' : 'inline-flex'}>{button}</span>\n </Tooltip>\n );\n };\n\n return (\n <div className={`${positionClass} z-20 ${spacingClass} ${surfaceClass} ${className}`}>\n <div\n className={`mx-auto flex w-full items-center gap-3 ${\n !isMobile ? desktopJustifyClass : 'justify-end'\n }`}\n style={{ maxWidth: maxWidthStyle }}\n >\n {isMobile ? (\n <>\n <div className=\"flex flex-1 gap-2\">\n {primaryMobile.map((action) => renderButton(action, true))}\n </div>\n {moreMobile.length > 0 && (\n <Dropdown\n trigger={['click']}\n placement=\"topRight\"\n menu={{\n items: moreMobile.map((action) => ({\n key: action.key,\n label: action.label,\n danger: action.type === 'danger',\n disabled: action.disabled,\n icon: action.icon,\n onClick: () => runAction(action),\n })),\n }}\n >\n <Button icon={<MoreOutlined />} className=\"rounded-md\">\n 更多\n </Button>\n </Dropdown>\n )}\n </>\n ) : layoutMode === 'approval' ? (\n <div className=\"flex flex-wrap items-center justify-center gap-3\">\n {visibleActions.map((action) => renderButton(action))}\n </div>\n ) : (\n <div className={`flex flex-wrap items-center ${desktopJustifyClass} gap-3`}>\n {visibleActions.map((action) => renderButton(action))}\n </div>\n )}\n </div>\n </div>\n );\n};\n","export const confirmAction = (title?: string, content?: string) => {\n const message = [title, content].filter(Boolean).join('\\n') || '确认继续吗?';\n if (typeof window === 'undefined' || typeof window.confirm !== 'function') {\n return true;\n }\n\n try {\n return window.confirm(message);\n } catch {\n return true;\n }\n};\n","import React, { useMemo } from 'react';\nimport {\n ApiOutlined,\n CheckCircleFilled,\n ClockCircleOutlined,\n CloseCircleFilled,\n CodeOutlined,\n CopyOutlined,\n EditOutlined,\n FileTextOutlined,\n LoadingOutlined,\n NotificationOutlined,\n ReloadOutlined,\n RollbackOutlined,\n UserOutlined,\n} from '@ant-design/icons';\nimport type { ProcessTask, StatusMeta } from '../types';\nimport { TASK_STATUS_META } from '../core/constants';\n\nexport interface ApprovalTimelineProps {\n tasks: ProcessTask[];\n className?: string;\n renderNode?: (task: ProcessTask, index: number) => React.ReactNode;\n showRemarks?: boolean;\n compactMode?: boolean;\n showApproverInfo?: boolean;\n}\n\ntype VisualState =\n | 'completed'\n | 'current'\n | 'waiting'\n | 'future'\n | 'rejected'\n | 'returned'\n | 'neutral';\n\nconst systemNodeTypes = new Set([\n 'condition',\n 'condition_branch',\n 'js_code',\n 'data_retrieve_single',\n 'data_retrieve_batch',\n 'data_create',\n 'data_update',\n 'connector_call',\n 'loop_container',\n 'work_notification',\n 'dingtalk_card',\n 'system',\n]);\n\nconst systemLabels: Record<string, string> = {\n condition: '条件判断',\n condition_branch: '条件分支',\n js_code: 'JS 代码',\n data_retrieve_single: '数据读取',\n data_retrieve_batch: '批量读取',\n data_create: '数据创建',\n data_update: '数据更新',\n connector_call: '连接器调用',\n loop_container: '循环节点',\n work_notification: '工作通知',\n dingtalk_card: '钉钉卡片',\n system: '系统动作',\n};\n\nconst toneClasses: Record<StatusMeta['tone'] | 'return' | 'future', string> = {\n brand: 'bg-blue-600 text-white border-blue-600',\n success: 'bg-emerald-50 text-emerald-700 border-emerald-200',\n danger: 'bg-red-50 text-red-700 border-red-200',\n neutral: 'bg-gray-50 text-gray-600 border-gray-200',\n warning: 'bg-amber-50 text-amber-700 border-amber-200',\n return: 'bg-amber-50 text-amber-700 border-amber-200',\n future: 'bg-gray-50 text-gray-400 border-gray-200',\n};\n\nfunction groupTasks(tasks: ProcessTask[]) {\n const groups = new Map<string, ProcessTask[]>();\n tasks.forEach((task, index) => {\n const key = task.nodeVisitId || `${task.nodeId || 'node'}-${task.id || task.taskId || index}`;\n const group = groups.get(key) || [];\n group.push(task);\n groups.set(key, group);\n });\n return Array.from(groups.values()).map((group) => {\n const hasOrSignResult = group.some(\n (task) =>\n task.nodeType === 'approval' &&\n task.multiApproveMode === 'or' &&\n !task.isSimulated &&\n ['approved', 'rejected', 'returned'].includes(task.status),\n );\n if (!hasOrSignResult) return group;\n const outcome = group.filter(\n (task) => !task.isSimulated && ['approved', 'rejected', 'returned'].includes(task.status),\n );\n return outcome.length > 0 ? outcome : group;\n });\n}\n\nfunction isCompactNode(task: ProcessTask) {\n return (\n task.nodeType === 'start' ||\n task.nodeType === 'copy' ||\n task.nodeType === 'end' ||\n systemNodeTypes.has(task.nodeType)\n );\n}\n\nfunction getNodeTitle(task: ProcessTask) {\n if (task.nodeType === 'start') return task.title || task.nodeName || '流程提交';\n if (task.nodeType === 'originator_return') return task.title || task.nodeName || '发起人修改';\n if (task.nodeType === 'copy') return task.title || task.nodeName || '抄送通知';\n if (task.nodeType === 'callback_wait') return task.title || task.nodeName || '等待第三方回调';\n if (task.nodeType === 'end') return task.title || task.nodeName || '流程完成';\n if (systemNodeTypes.has(task.nodeType))\n return task.title || task.nodeName || systemLabels[task.nodeType] || '系统动作';\n return task.title || task.nodeName || '审批';\n}\n\nfunction getVisualState(task: ProcessTask, isFutureGroup: boolean): VisualState {\n if (isFutureGroup || task.isSimulated || task.status === 'simulated') return 'future';\n if (task.status === 'rejected') return 'rejected';\n if (task.status === 'returned') return 'returned';\n if (task.status === 'pending' || task.status === 'waiting' || task.canApprove)\n return task.canApprove ? 'current' : 'waiting';\n if (\n task.status === 'approved' ||\n task.status === 'copied' ||\n task.nodeType === 'start' ||\n task.nodeType === 'end'\n ) {\n return 'completed';\n }\n return 'neutral';\n}\n\nfunction getStatusMeta(task: ProcessTask, state: VisualState, compact: boolean): StatusMeta {\n if (state === 'future') return { label: '未开始', tone: 'neutral' };\n if (state === 'current')\n return { label: task.nodeType === 'callback_wait' ? '等待回调' : '审批中', tone: 'brand' };\n if (state === 'waiting') return { label: '等待处理中', tone: 'neutral' };\n if (state === 'rejected') return TASK_STATUS_META.rejected;\n if (state === 'returned') return TASK_STATUS_META.returned;\n if (task.nodeType === 'copy' || task.status === 'copied') return TASK_STATUS_META.copied;\n if (compact) return { label: '已完成', tone: 'neutral' };\n return TASK_STATUS_META[task.status] || TASK_STATUS_META.approved;\n}\n\nfunction getIcon(task: ProcessTask, state: VisualState) {\n if (state === 'current')\n return task.nodeType === 'callback_wait' ? <ClockCircleOutlined /> : <LoadingOutlined />;\n if (state === 'future' || state === 'waiting')\n return task.nodeType === 'approval' ? <UserOutlined /> : <ClockCircleOutlined />;\n if (state === 'rejected') return <CloseCircleFilled />;\n if (state === 'returned') return <RollbackOutlined />;\n switch (task.nodeType as string) {\n case 'start':\n return <FileTextOutlined />;\n case 'approval':\n return <CheckCircleFilled />;\n case 'originator_return':\n return <EditOutlined />;\n case 'copy':\n return <CopyOutlined />;\n case 'callback_wait':\n return <ClockCircleOutlined />;\n case 'js_code':\n return <CodeOutlined />;\n case 'connector_call':\n return <ApiOutlined />;\n case 'work_notification':\n case 'dingtalk_card':\n return <NotificationOutlined />;\n case 'data_retrieve_single':\n case 'data_retrieve_batch':\n case 'data_create':\n case 'data_update':\n case 'loop_container':\n return <ReloadOutlined />;\n default:\n return <CheckCircleFilled />;\n }\n}\n\nfunction getDotClass(state: VisualState) {\n const map: Record<VisualState, string> = {\n completed: 'border-emerald-500 text-emerald-600 bg-white',\n current: 'border-blue-600 bg-blue-600 text-white',\n waiting: 'border-gray-200 text-gray-300 bg-white',\n future: 'border-dashed border-gray-300 text-gray-300 bg-white',\n rejected: 'border-red-500 text-red-600 bg-white',\n returned: 'border-amber-500 text-amber-600 bg-white',\n neutral: 'border-gray-200 text-gray-400 bg-white',\n };\n return map[state];\n}\n\nexport const ApprovalTimeline: React.FC<ApprovalTimelineProps> = ({\n tasks,\n className = '',\n renderNode,\n showRemarks = true,\n compactMode = false,\n showApproverInfo = true,\n}) => {\n const taskList = useMemo(() => (Array.isArray(tasks) ? tasks : []), [tasks]);\n const groups = useMemo(() => groupTasks(taskList), [taskList]);\n\n if (taskList.length === 0) {\n return (\n <div\n className={`rounded-lg border border-ant-border-secondary bg-ant-bg-container p-6 ${className}`}\n >\n <p className=\"m-0 text-center text-sm text-ant-text-tertiary\">暂无审批记录</p>\n </div>\n );\n }\n\n if (renderNode) {\n return (\n <div className={className}>\n {taskList.map((task, index) => (\n <div key={task.taskId || task.id || index}>{renderNode(task, index)}</div>\n ))}\n </div>\n );\n }\n\n return (\n <div className={`approval-timeline ${className}`}>\n {groups.map((group, index) => {\n const node = group[0];\n const isLast = index === groups.length - 1;\n const isFutureGroup = group.some((task) => task.isSimulated || task.status === 'simulated');\n const compact = compactMode || isCompactNode(node);\n const state = getVisualState(node, isFutureGroup);\n const statusMeta = getStatusMeta(node, state, compact);\n const title = getNodeTitle(node);\n const time = node.actionAt || node.createdAt;\n\n return (\n <div\n key={node.nodeVisitId || `${node.nodeId}-${node.taskId}-${index}`}\n className={`relative flex gap-4 pb-5 ${isLast ? 'pb-0' : ''}`}\n >\n {!isLast && (\n <div\n className={`absolute bottom-0 left-[21px] top-11 w-px ${\n state === 'future'\n ? 'border-l border-dashed border-gray-300'\n : 'bg-ant-border-secondary'\n }`}\n />\n )}\n <div\n className={`relative z-10 flex h-11 w-11 shrink-0 items-center justify-center rounded-full border-2 shadow-[0_0_0_4px_var(--ant-color-bg-layout,#f5f5f5)] ${getDotClass(state)}`}\n >\n {getIcon(node, state)}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div\n className={`rounded-lg border p-4 ${\n state === 'current'\n ? 'border-blue-300 bg-blue-50/60'\n : state === 'future'\n ? 'border-dashed border-gray-200 bg-gray-50/70'\n : 'border-ant-border-secondary bg-ant-bg-container'\n }`}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <span className=\"font-medium text-ant-text\">{title}</span>\n <span\n className={`inline-flex min-h-6 items-center rounded-md border px-2 text-xs font-medium ${\n state === 'future' ? toneClasses.future : toneClasses[statusMeta.tone]\n }`}\n >\n {statusMeta.label}\n </span>\n {node.nodeType === 'originator_return' && (\n <span className=\"rounded-md bg-amber-50 px-2 py-1 text-xs text-amber-700\">\n 发起人操作\n </span>\n )}\n </div>\n {!isFutureGroup && time && (\n <span className=\"text-xs text-ant-text-tertiary\">{time}</span>\n )}\n </div>\n\n {showApproverInfo && !compact && group.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-3\">\n <span className=\"w-full text-xs font-medium text-ant-text-tertiary\">\n {state === 'current' || state === 'waiting' ? '当前审批人' : '处理人'}\n </span>\n {group.map((assignee) => (\n <span\n key={assignee.taskId || assignee.id}\n className=\"inline-flex min-w-0 items-center gap-2\"\n >\n <span className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-blue-50 text-xs font-semibold text-blue-700\">\n {assignee.assigneeName?.slice(0, 1) || '?'}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-ant-text\">\n {assignee.assigneeName || '系统'}\n </span>\n <span className=\"block text-xs text-ant-text-tertiary\">\n {assignee.departmentName ||\n assignee.actionAt ||\n assignee.createdAt ||\n ''}\n </span>\n </span>\n </span>\n ))}\n </div>\n )}\n\n {showApproverInfo && compact && (\n <div className=\"mt-2 text-sm text-ant-text-secondary\">\n {group\n .map((item) => item.assigneeName)\n .filter(Boolean)\n .join('、') ||\n (node.nodeType === 'start'\n ? '提交申请'\n : systemNodeTypes.has(node.nodeType)\n ? node.comments || '系统自动处理'\n : '')}\n </div>\n )}\n\n {showRemarks && node.comments && (\n <div\n className={`mt-3 border-l-2 pl-3 text-sm leading-6 ${\n state === 'rejected'\n ? 'border-red-300 text-red-700'\n : state === 'returned'\n ? 'border-amber-300 text-amber-700'\n : 'border-ant-border-secondary text-ant-text-secondary'\n }`}\n >\n {node.comments}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n","import type { ProcessStatus, StatusMeta, TaskStatus } from '../types';\n\n/** 流程状态元映射 */\nexport const PROCESS_STATUS_META: Record<ProcessStatus, StatusMeta> = {\n running: { label: '审批中', tone: 'brand' },\n waiting: { label: '等待中', tone: 'neutral' },\n exception: { label: '流程异常', tone: 'danger' },\n completed: { label: '已完成', tone: 'success' },\n terminated: { label: '已拒绝', tone: 'danger' },\n withdrawn: { label: '已撤销', tone: 'neutral' },\n pending: { label: '待处理', tone: 'brand' },\n cancelled: { label: '已取消', tone: 'neutral' },\n};\n\n/** 任务状态元映射 */\nexport const TASK_STATUS_META: Record<TaskStatus, StatusMeta> = {\n pending: { label: '待处理', tone: 'brand' },\n approved: { label: '已同意', tone: 'success' },\n rejected: { label: '已拒绝', tone: 'danger' },\n returned: { label: '已退回', tone: 'warning' },\n suspended: { label: '已挂起', tone: 'neutral' },\n cancelled: { label: '已取消', tone: 'neutral' },\n copied: { label: '已抄送', tone: 'neutral' },\n waiting: { label: '等待中', tone: 'neutral' },\n simulated: { label: '未开始', tone: 'neutral' },\n};\n","import React from 'react';\nimport { Modal, Skeleton, Button } from 'antd';\nimport { CheckCircleOutlined, UserOutlined } from '@ant-design/icons';\nimport type { ProcessRoute } from '../types';\n\nexport interface ProcessPreviewProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n routes: ProcessRoute[];\n loading?: boolean;\n}\n\nexport const ProcessPreview: React.FC<ProcessPreviewProps> = ({\n open,\n onClose,\n onConfirm,\n routes,\n loading = false,\n}) => {\n const routeList = Array.isArray(routes) ? routes : [];\n\n return (\n <Modal\n getContainer={false}\n title=\"流程预览\"\n open={open}\n onCancel={onClose}\n width={520}\n footer={\n <div className=\"flex justify-end gap-3\">\n <Button onClick={onClose}>取消</Button>\n <Button type=\"primary\" onClick={onConfirm} loading={loading}>\n 确认提交\n </Button>\n </div>\n }\n >\n {loading && routeList.length === 0 ? (\n <Skeleton active paragraph={{ rows: 4 }} />\n ) : routeList.length === 0 ? (\n <p className=\"text-sm text-gray-400 text-center py-8\">暂无流程节点</p>\n ) : (\n <div className=\"py-2\">\n {routeList.map((route, index) => {\n const isLast = index === routeList.length - 1;\n return (\n <div key={route.nodeId} className=\"flex gap-3\">\n {/* Left timeline */}\n <div className=\"flex flex-col items-center\">\n <div className=\"w-6 h-6 rounded-full bg-blue-50 border-2 border-blue-400 flex items-center justify-center flex-shrink-0\">\n <CheckCircleOutlined className=\"text-blue-500 text-xs\" />\n </div>\n {!isLast && <div className=\"w-0.5 flex-1 bg-blue-200 mt-1\" />}\n </div>\n\n {/* Right content */}\n <div className={`flex-1 ${isLast ? 'pb-0' : 'pb-5'}`}>\n <div className=\"text-sm font-medium text-gray-900\">{route.nodeName}</div>\n {route.assignees && route.assignees.length > 0 && (\n <div className=\"mt-1 flex items-center gap-1.5 flex-wrap\">\n <UserOutlined className=\"text-gray-400 text-xs\" />\n {route.assignees.map((assignee) => (\n <span\n key={assignee.id}\n className=\"text-xs text-gray-500 bg-gray-100 px-1.5 py-0.5 rounded\"\n >\n {assignee.name}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </Modal>\n );\n};\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Button, Empty, Modal, Select, Space, Tag, Typography, message } from 'antd';\nimport type {\n FormRuntimeApi,\n InitiatorSelectCandidate,\n InitiatorSelectRequirement,\n} from '../types';\nimport { getInitiatorSelectCandidates } from '../core/processApi';\nimport { UserPicker } from '../fields/shared/UserPicker';\n\nexport type SelectedApproverMap = Record<string, InitiatorSelectCandidate[]>;\n\ninterface InitiatorApproverSelectorProps {\n open: boolean;\n formUuid: string;\n appType: string;\n api: FormRuntimeApi;\n requirements: InitiatorSelectRequirement[];\n value?: SelectedApproverMap;\n onOk: (selected: SelectedApproverMap) => void;\n onCancel: () => void;\n}\n\ninterface RequirementSelectProps {\n open: boolean;\n formUuid: string;\n appType: string;\n api: FormRuntimeApi;\n requirement: InitiatorSelectRequirement;\n selectedUsers: InitiatorSelectCandidate[];\n onChange: (nodeId: string, users: InitiatorSelectCandidate[]) => void;\n}\n\nconst scopeText: Record<InitiatorSelectRequirement['scope'], string> = {\n all: '全部成员',\n members: '指定成员',\n roles: '指定角色',\n};\n\nconst EMPTY_SELECTED_USERS: InitiatorSelectCandidate[] = [];\nconst EMPTY_SELECTED_MAP: SelectedApproverMap = {};\n\nconst getUserId = (user: any) =>\n String(user?.id ?? user?.userId ?? user?.userid ?? user?.value ?? '').trim();\n\nconst normalizeCandidate = (user: any): InitiatorSelectCandidate | null => {\n const id = getUserId(user);\n if (!id) return null;\n return {\n ...user,\n id,\n name: String(user?.name ?? user?.label ?? user?.username ?? id),\n };\n};\n\nconst getUserLabel = (user: InitiatorSelectCandidate) => user.name || user.username || user.id;\n\nconst mergeUsers = (current: InitiatorSelectCandidate[], incoming: InitiatorSelectCandidate[]) => {\n const map = new Map<string, InitiatorSelectCandidate>();\n current.forEach((user) => map.set(user.id, user));\n incoming.forEach((user) => map.set(user.id, user));\n return Array.from(map.values());\n};\n\nconst RequirementSelect: React.FC<RequirementSelectProps> = ({\n open,\n formUuid,\n appType,\n api,\n requirement,\n selectedUsers,\n onChange,\n}) => {\n const [pickerOpen, setPickerOpen] = useState(false);\n const initialCandidates = useMemo(\n () =>\n (requirement.candidateUsers || [])\n .map(normalizeCandidate)\n .filter(Boolean) as InitiatorSelectCandidate[],\n [requirement.candidateUsers],\n );\n const [optionsSource, setOptionsSource] = useState<InitiatorSelectCandidate[]>(initialCandidates);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n setOptionsSource((current) =>\n mergeUsers(initialCandidates, mergeUsers(current, selectedUsers)),\n );\n }, [initialCandidates, selectedUsers]);\n\n const loadCandidates = useCallback(\n async (keyword?: string) => {\n setLoading(true);\n try {\n const result = await getInitiatorSelectCandidates(api.request, {\n formUuid,\n appType,\n nodeId: requirement.nodeId,\n keyword,\n page: 1,\n pageSize: 50,\n });\n setOptionsSource((current) =>\n mergeUsers(\n current,\n result.items.map(normalizeCandidate).filter(Boolean) as InitiatorSelectCandidate[],\n ),\n );\n } catch {\n if (requirement.scope === 'all' && typeof api.getUserList === 'function') {\n const users = await api.getUserList(\n keyword ? { name: keyword, username: keyword } : undefined,\n );\n setOptionsSource((current) =>\n mergeUsers(\n current,\n users.map(normalizeCandidate).filter(Boolean) as InitiatorSelectCandidate[],\n ),\n );\n } else if (initialCandidates.length === 0) {\n message.error('加载审批候选人失败');\n }\n } finally {\n setLoading(false);\n }\n },\n [api, appType, formUuid, initialCandidates.length, requirement.nodeId, requirement.scope],\n );\n\n useEffect(() => {\n if (requirement.scope !== 'all' && open && formUuid && appType && requirement.nodeId) {\n void loadCandidates();\n }\n }, [appType, formUuid, loadCandidates, open, requirement.nodeId, requirement.scope]);\n\n const options = useMemo(\n () =>\n optionsSource.map((user) => ({\n value: user.id,\n label: getUserLabel(user),\n })),\n [optionsSource],\n );\n\n if (requirement.scope === 'all') {\n return (\n <div className=\"rounded-lg border border-ant-border-secondary bg-ant-bg-container p-3\">\n <div className=\"mb-2 flex items-start justify-between gap-3\">\n <div>\n <Typography.Text strong>{requirement.nodeName}</Typography.Text>\n <div className=\"mt-1 text-xs text-ant-color-text-tertiary\">\n 选择范围:{scopeText[requirement.scope] || '全部成员'}\n </div>\n </div>\n <Button onClick={() => setPickerOpen(true)}>\n {selectedUsers.length > 0 ? '重新选择成员' : '选择成员'}\n </Button>\n </div>\n {selectedUsers.length > 0 ? (\n <Space size={[4, 4]} wrap className=\"mt-2\">\n {selectedUsers.map((user) => (\n <Tag key={user.id}>{getUserLabel(user)}</Tag>\n ))}\n </Space>\n ) : (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"请从组织架构选择成员\" />\n )}\n <UserPicker\n api={api}\n open={pickerOpen}\n onOpenChange={setPickerOpen}\n multiple\n value={selectedUsers}\n loadAllWhenNoDepartment={false}\n onConfirm={(items) => {\n onChange(\n requirement.nodeId,\n items.map(normalizeCandidate).filter(Boolean) as InitiatorSelectCandidate[],\n );\n }}\n onCancel={() => undefined}\n />\n </div>\n );\n }\n\n return (\n <div className=\"rounded-lg border border-ant-border-secondary bg-ant-bg-container p-3\">\n <div className=\"mb-2\">\n <Typography.Text strong>{requirement.nodeName}</Typography.Text>\n <div className=\"mt-1 text-xs text-ant-color-text-tertiary\">\n 选择范围:{scopeText[requirement.scope] || '全部成员'}\n </div>\n </div>\n <Select\n mode=\"multiple\"\n className=\"w-full\"\n allowClear\n showSearch\n filterOption={false}\n placeholder=\"请选择审批人\"\n loading={loading}\n value={selectedUsers.map((user) => user.id)}\n options={options}\n notFoundContent={loading ? '加载中...' : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />}\n onSearch={(keyword) => {\n void loadCandidates(keyword);\n }}\n onChange={(ids: string[]) => {\n const next = ids\n .map(\n (id) =>\n optionsSource.find((user) => user.id === id) ||\n selectedUsers.find((user) => user.id === id),\n )\n .filter(Boolean) as InitiatorSelectCandidate[];\n onChange(requirement.nodeId, next);\n }}\n />\n {selectedUsers.length > 0 ? (\n <Space size={[4, 4]} wrap className=\"mt-2\">\n {selectedUsers.map((user) => (\n <Tag key={user.id}>{getUserLabel(user)}</Tag>\n ))}\n </Space>\n ) : null}\n </div>\n );\n};\n\nexport const InitiatorApproverSelector: React.FC<InitiatorApproverSelectorProps> = ({\n open,\n formUuid,\n appType,\n api,\n requirements,\n value,\n onOk,\n onCancel,\n}) => {\n const [selected, setSelected] = useState<SelectedApproverMap>({});\n const wasOpenRef = useRef(false);\n\n useEffect(() => {\n if (open && !wasOpenRef.current) {\n setSelected(value || EMPTY_SELECTED_MAP);\n }\n wasOpenRef.current = open;\n }, [open, value]);\n\n const missingNodes = requirements.filter(\n (requirement) => !(selected[requirement.nodeId] || []).length,\n );\n\n return (\n <Modal\n getContainer={false}\n title=\"选择审批人\"\n open={open}\n width={760}\n okText=\"确定\"\n cancelText=\"取消\"\n onCancel={onCancel}\n onOk={() => {\n if (missingNodes.length > 0) {\n message.error('请为所有发起人自选节点选择审批人');\n return;\n }\n onOk(selected);\n }}\n destroyOnHidden\n >\n <Space direction=\"vertical\" size={12} className=\"w-full\">\n {requirements.map((requirement) => (\n <RequirementSelect\n key={requirement.nodeId}\n open={open}\n formUuid={formUuid}\n appType={appType}\n api={api}\n requirement={requirement}\n selectedUsers={selected[requirement.nodeId] ?? EMPTY_SELECTED_USERS}\n onChange={(nodeId, users) =>\n setSelected((current) => ({ ...current, [nodeId]: users }))\n }\n />\n ))}\n </Space>\n </Modal>\n );\n};\n\nexport default InitiatorApproverSelector;\n","import type {\n ApprovalPermission,\n ApproveParams,\n ChangeRecordListResponse,\n ChangeRecordQueryParams,\n FormDataDeleteParams,\n FormDataQueryParams,\n FormInstanceData,\n FormRuntimeApi,\n InitiatorSelectCandidate,\n InitiatorSelectRequirement,\n PreviewParams,\n ProcessBasicInfo,\n ProcessDefinition,\n ProcessRoute,\n ProcessTask,\n ReturnableNode,\n ReturnableNodeResult,\n ReturnParams,\n ResubmitParams,\n RuntimeResponse,\n SaveTaskParams,\n TransferParams,\n ViewPermissionQueryParams,\n ViewPermissionSummary,\n WithdrawParams,\n} from '../types';\n\n// ============ 流程基础 ============\n\nconst hasOwn = (value: object, key: string) => Object.prototype.hasOwnProperty.call(value, key);\n\nconst isRuntimeEnvelope = (value: any): value is RuntimeResponse<any> =>\n !!value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n (hasOwn(value, 'code') ||\n hasOwn(value, 'success') ||\n hasOwn(value, 'data') ||\n hasOwn(value, 'result') ||\n hasOwn(value, 'message') ||\n hasOwn(value, 'error'));\n\nconst isSuccessCode = (code: unknown) => {\n if (code === undefined || code === null || code === '') return true;\n const normalized = Number(code);\n return Number.isFinite(normalized) ? normalized === 0 || normalized === 200 : false;\n};\n\nconst unwrapRuntimeResponse = <T = any>(response: RuntimeResponse<T> | any): T => {\n if (!isRuntimeEnvelope(response)) return response as T;\n\n if (response.success === false || !isSuccessCode(response.code)) {\n throw new Error(response.message || response.error || '请求失败');\n }\n\n if (hasOwn(response, 'data')) return response.data as T;\n if (hasOwn(response, 'result')) return response.result as T;\n return response as T;\n};\n\nconst withInitiatorSelectedApprovers = <T extends Record<string, any>>(\n payload: T,\n initiatorSelectedApprovers?: Record<string, string[]>,\n): T & {\n selectedApprovers?: Record<string, string[]>;\n initiatorSelectedApprovers?: Record<string, string[]>;\n} => {\n if (!initiatorSelectedApprovers) return payload;\n return {\n ...payload,\n selectedApprovers: initiatorSelectedApprovers,\n initiatorSelectedApprovers,\n };\n};\n\nconst normalizeProcessTask = (value: any): ProcessTask => {\n const taskId = value?.taskId ?? value?.id ?? value?.task_id ?? '';\n return {\n ...value,\n id: value?.id ?? taskId,\n taskId,\n nodeId: value?.nodeId ?? value?.node_id ?? '',\n nodeType: value?.nodeType ?? value?.node_type ?? 'approval',\n nodeName: value?.nodeName ?? value?.title ?? value?.name ?? value?.nodeId ?? '审批节点',\n status: value?.status ?? 'pending',\n assigneeId: value?.assigneeId ?? value?.assignee,\n };\n};\n\nconst normalizeProcessTasks = (value: any): ProcessTask[] => {\n if (Array.isArray(value)) return value.map(normalizeProcessTask);\n if (!value || typeof value !== 'object') return [];\n if (Array.isArray(value.tasks)) return value.tasks.map(normalizeProcessTask);\n if (Array.isArray(value.currentTasks)) return value.currentTasks.map(normalizeProcessTask);\n if (Array.isArray(value.list)) return value.list.map(normalizeProcessTask);\n if (Array.isArray(value.items)) return value.items.map(normalizeProcessTask);\n if (Array.isArray(value.records)) return value.records.map(normalizeProcessTask);\n return [];\n};\n\nconst normalizePreviewAssignees = (value: any): Array<{ id: string; name: string }> => {\n if (Array.isArray(value?.assignees)) {\n return value.assignees\n .map((assignee: any) => {\n if (typeof assignee === 'string' || typeof assignee === 'number') {\n const id = String(assignee);\n return { id, name: id };\n }\n const id = String(\n assignee?.id ?? assignee?.userId ?? assignee?.userid ?? assignee?.assignee ?? '',\n );\n if (!id) return null;\n return {\n id,\n name: String(assignee?.name ?? assignee?.label ?? assignee?.userName ?? id),\n };\n })\n .filter(Boolean) as Array<{ id: string; name: string }>;\n }\n\n const assigneeId = value?.assignee ?? value?.assigneeId;\n if (assigneeId) {\n const id = String(assigneeId);\n return [\n {\n id,\n name: String(value?.assigneeName ?? value?.assignee_name ?? value?.userName ?? id),\n },\n ];\n }\n\n const ids = Array.isArray(value?.allAssignees) ? value.allAssignees : [];\n const names = Array.isArray(value?.allAssigneeNames) ? value.allAssigneeNames : [];\n\n return ids\n .map((id: any, index: number) => {\n const normalizedId = String(id ?? '');\n if (!normalizedId) return null;\n return {\n id: normalizedId,\n name: String(names[index] ?? (ids.length === 1 ? value?.assigneeName : undefined) ?? id),\n };\n })\n .filter(Boolean) as Array<{ id: string; name: string }>;\n};\n\nconst normalizePreviewRoutes = (value: any): ProcessRoute[] => {\n const raw = value?.data ?? value?.result ?? value;\n const list = Array.isArray(raw)\n ? raw\n : Array.isArray(raw?.routes)\n ? raw.routes\n : Array.isArray(raw?.tasks)\n ? raw.tasks\n : Array.isArray(raw?.nodes)\n ? raw.nodes\n : Array.isArray(raw?.items)\n ? raw.items\n : [];\n\n return list.map((route: any, index: number) => ({\n ...route,\n nodeId: String(route?.nodeId ?? route?.node_id ?? route?.id ?? `preview-${index}`),\n nodeName: String(\n route?.nodeName ?? route?.title ?? route?.name ?? route?.nodeId ?? `流程节点 ${index + 1}`,\n ),\n nodeType: route?.nodeType ?? route?.node_type ?? route?.type ?? 'approval',\n assignees: normalizePreviewAssignees(route),\n }));\n};\n\nconst normalizeInitiatorSelectCandidate = (value: any): InitiatorSelectCandidate => {\n const id = String(value?.id ?? value?.userId ?? value?.userid ?? value?.value ?? '');\n return {\n ...value,\n id,\n name: String(value?.name ?? value?.label ?? value?.username ?? id),\n };\n};\n\nconst normalizeInitiatorSelectRequirements = (value: any): InitiatorSelectRequirement[] => {\n const raw = value?.data ?? value?.result ?? value;\n const nodes = Array.isArray(raw?.nodes) ? raw.nodes : Array.isArray(raw) ? raw : [];\n return nodes\n .map((node: any) => ({\n ...node,\n nodeId: String(node?.nodeId ?? node?.id ?? ''),\n nodeName: String(node?.nodeName ?? node?.name ?? node?.title ?? node?.nodeId ?? ''),\n scope: node?.scope ?? node?.initiatorSelectScope ?? 'all',\n approvals: Array.isArray(node?.approvals) ? node.approvals : [],\n approvalNames: Array.isArray(node?.approvalNames) ? node.approvalNames : [],\n candidateUsers: Array.isArray(node?.candidateUsers)\n ? node.candidateUsers.map(normalizeInitiatorSelectCandidate).filter((user: any) => user.id)\n : undefined,\n }))\n .filter((node: InitiatorSelectRequirement) => node.nodeId);\n};\n\nconst normalizeProcessBasic = (value: any): ProcessBasicInfo => {\n const raw = value ?? {};\n const instance = raw.instance ?? raw;\n const currentTask = raw.currentTask ? normalizeProcessTask(raw.currentTask) : undefined;\n\n return {\n ...raw,\n instanceId: raw.instanceId ?? raw.id ?? instance.formInstanceId ?? instance.id,\n processStatus: raw.processStatus ?? raw.status ?? instance.processStatus ?? instance.status,\n formUuid: raw.formUuid ?? instance.formUuid ?? instance.definition?.formUuid,\n appType: raw.appType ?? instance.appType ?? instance.definition?.appType,\n title: raw.title ?? instance.title ?? instance.instanceTitle,\n originatorId: raw.originatorId ?? instance.originatorId ?? instance.startedBy,\n originatorName: raw.originatorName ?? instance.originatorName ?? instance.startedByName,\n originatorDepartment:\n raw.originatorDepartment ?? instance.originatorDepartment ?? instance.startedDepartmentName,\n createdAt: raw.createdAt ?? instance.createdAt ?? instance.startedAt,\n currentTask,\n isExecuting: raw.isExecuting ?? instance.isExecuting,\n };\n};\n\nconst normalizeApprovalPermission = (value: any): ApprovalPermission => {\n const raw = value ?? {};\n const currentTasks = normalizeProcessTasks(raw.currentTasks);\n const hasPermission = Boolean(raw.hasPermission ?? raw.isApprover ?? currentTasks.length > 0);\n\n return {\n ...raw,\n hasPermission,\n isApprover: Boolean(raw.isApprover ?? hasPermission),\n canUndo: Boolean(raw.canUndo ?? raw.canWithdraw),\n currentTasks,\n };\n};\n\nconst normalizeReturnableNodes = (value: any): ReturnableNode[] => {\n const raw = value?.candidates || value?.nodes || value?.data || value;\n if (!Array.isArray(raw)) return [];\n return raw.map((node) => ({\n ...node,\n nodeId: node?.nodeId || node?.id || '',\n nodeName: node?.nodeName || node?.name || node?.title || node?.id || '',\n }));\n};\n\nconst normalizeReturnableNodeResult = (value: any): ReturnableNodeResult => {\n const raw = value?.data || value || {};\n return {\n nodes: normalizeReturnableNodes(raw),\n policy: raw?.policy || null,\n };\n};\n\nconst normalizeProcessDefinition = (value: any): ProcessDefinition => {\n const raw = value?.definitionJson || value?.viewJson || value || {};\n const nodes = Array.isArray(raw.nodes) ? raw.nodes : [];\n const startNode = nodes.find((node: any) => node?.type === 'start' || node?.nodeType === 'start');\n return {\n ...raw,\n processId: raw.processId || raw.id || value?.id || '',\n flowConfig: raw.flowConfig || value?.flowConfig || {},\n startNodeId: raw.startNodeId || startNode?.id || value?.startNodeId,\n };\n};\n\n/** 获取流程基本信息 */\nexport async function getProcessBasic(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ProcessBasicInfo> {\n const response = (await request<ProcessBasicInfo>({\n url: `/workflow/instance/${formInstId}/basic`,\n method: 'get',\n })) as RuntimeResponse<ProcessBasicInfo>;\n return normalizeProcessBasic(unwrapRuntimeResponse(response));\n}\n\n/** 获取流程进度(任务列表) */\nexport async function getProcessProgress(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ProcessTask[]> {\n const response = (await request<any>({\n url: `/workflow/instance/${formInstId}/all-tasks`,\n method: 'get',\n })) as RuntimeResponse<any>;\n return normalizeProcessTasks(unwrapRuntimeResponse(response));\n}\n\n/** 检查当前用户审批权限 */\nexport async function checkUserApproval(\n request: FormRuntimeApi['request'],\n formInstId: string,\n): Promise<ApprovalPermission> {\n const response = (await request<ApprovalPermission>({\n url: `/workflow/instance/${formInstId}/permission`,\n method: 'get',\n })) as RuntimeResponse<ApprovalPermission>;\n return normalizeApprovalPermission(unwrapRuntimeResponse(response));\n}\n\n// ============ 审批操作 ============\n\n/** 审批(同意/拒绝) */\nexport async function handleApproval(\n request: FormRuntimeApi['request'],\n params: ApproveParams,\n): Promise<any> {\n const response = (await request<any>({\n url: '/workflow/approve',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 撤销流程 */\nexport async function withdrawProcess(\n request: FormRuntimeApi['request'],\n params: WithdrawParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/instance/${params.instanceId}/withdraw`,\n method: 'post',\n data: { reason: params.reason },\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 转交任务 */\nexport async function transferTask(\n request: FormRuntimeApi['request'],\n params: TransferParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/transfer`,\n method: 'post',\n data: { newAssignee: params.newAssignee, reason: params.reason },\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 退回任务 */\nexport async function returnTask(\n request: FormRuntimeApi['request'],\n params: ReturnParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/return`,\n method: 'post',\n data: { targetNodeId: params.targetNodeId, reason: params.reason },\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 重新提交任务 */\nexport async function resubmitTask(\n request: FormRuntimeApi['request'],\n params: ResubmitParams,\n): Promise<any> {\n const initiatorSelectedApprovers = params.initiatorSelectedApprovers || params.selectedApprovers;\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/resubmit`,\n method: 'post',\n data: withInitiatorSelectedApprovers(\n {\n formUuid: params.formUuid,\n appType: params.appType,\n updateFormDataJson: params.updateFormDataJson,\n comments: params.comments,\n },\n initiatorSelectedApprovers,\n ),\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 暂存任务 */\nexport async function saveTask(\n request: FormRuntimeApi['request'],\n params: SaveTaskParams,\n): Promise<any> {\n const response = (await request<any>({\n url: '/workflow/task/save',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 获取可退回节点 */\nexport async function getReturnableNodes(\n request: FormRuntimeApi['request'],\n taskId: string,\n): Promise<ReturnableNode[]> {\n const result = await getReturnableNodeResult(request, taskId);\n return result.nodes;\n}\n\n/** 获取可退回节点和退回策略 */\nexport async function getReturnableNodeResult(\n request: FormRuntimeApi['request'],\n taskId: string,\n): Promise<ReturnableNodeResult> {\n const response = (await request<ReturnableNode[]>({\n url: `/workflow/task/${taskId}/returnable-nodes`,\n method: 'get',\n })) as RuntimeResponse<ReturnableNode[]>;\n return normalizeReturnableNodeResult(unwrapRuntimeResponse(response));\n}\n\n// ============ 流程预览和定义 ============\n\n/** 预览流程路由 */\nexport async function previewProcess(\n request: FormRuntimeApi['request'],\n params: PreviewParams,\n): Promise<ProcessRoute[]> {\n const initiatorSelectedApprovers = params.initiatorSelectedApprovers || params.selectedApprovers;\n const response = (await request<ProcessRoute[]>({\n url: '/workflow/preview',\n method: 'post',\n data: withInitiatorSelectedApprovers(params, initiatorSelectedApprovers),\n })) as RuntimeResponse<ProcessRoute[]>;\n return normalizePreviewRoutes(unwrapRuntimeResponse(response));\n}\n\nexport async function getInitiatorSelectRequirements(\n request: FormRuntimeApi['request'],\n params: {\n formUuid: string;\n appType: string;\n data: Record<string, any>;\n submissionDepartmentId?: string;\n },\n): Promise<InitiatorSelectRequirement[]> {\n const response = (await request<any>({\n url: '/workflow/initiator-approver/requirements',\n method: 'post',\n data: params,\n })) as RuntimeResponse<any>;\n return normalizeInitiatorSelectRequirements(unwrapRuntimeResponse(response));\n}\n\nexport async function getResubmitInitiatorSelectRequirements(\n request: FormRuntimeApi['request'],\n params: {\n taskId: string;\n formUuid: string;\n appType: string;\n data: Record<string, any>;\n },\n): Promise<InitiatorSelectRequirement[]> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/resubmit/initiator-approver/requirements`,\n method: 'post',\n data: {\n formUuid: params.formUuid,\n appType: params.appType,\n data: params.data,\n },\n })) as RuntimeResponse<any>;\n return normalizeInitiatorSelectRequirements(unwrapRuntimeResponse(response));\n}\n\nexport async function getInitiatorSelectCandidates(\n request: FormRuntimeApi['request'],\n params: {\n formUuid: string;\n appType: string;\n nodeId: string;\n page?: number;\n pageSize?: number;\n keyword?: string;\n departmentId?: string;\n },\n): Promise<{\n items: InitiatorSelectCandidate[];\n total: number;\n page: number;\n pageSize: number;\n}> {\n const response = (await request<any>({\n url: '/workflow/initiator-select/candidates',\n method: 'get',\n params,\n })) as RuntimeResponse<any>;\n const raw = unwrapRuntimeResponse(response) || {};\n const items = Array.isArray(raw.items) ? raw.items : [];\n return {\n items: items\n .map(normalizeInitiatorSelectCandidate)\n .filter((user: InitiatorSelectCandidate) => user.id),\n total: Number(raw.total || items.length || 0),\n page: Number(raw.page || params.page || 1),\n pageSize: Number(raw.pageSize || params.pageSize || 50),\n };\n}\n\n/** 获取流程定义 */\nexport async function getProcessDefinition(\n request: FormRuntimeApi['request'],\n formUuid: string,\n): Promise<ProcessDefinition> {\n const response = (await request<ProcessDefinition>({\n url: '/workflow/definition/form',\n method: 'get',\n params: { formUuid },\n })) as RuntimeResponse<ProcessDefinition>;\n return normalizeProcessDefinition(unwrapRuntimeResponse(response));\n}\n\n/** 触发回调等待任务 */\nexport async function triggerCallbackTask(\n request: FormRuntimeApi['request'],\n params: { taskId: string; payload?: Record<string, any> },\n): Promise<any> {\n const response = (await request<any>({\n url: `/workflow/task/${params.taskId}/callback`,\n method: 'post',\n data: params.payload || {},\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n// ============ 表单详情 ============\n\n/** 获取表单实例数据 */\nexport async function getFormData(\n request: FormRuntimeApi['request'],\n params: FormDataQueryParams,\n): Promise<FormInstanceData> {\n const response = (await request<FormInstanceData>({\n url: '/form/queryFormDataByFormInstanceId',\n method: 'get',\n params,\n })) as RuntimeResponse<FormInstanceData>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 删除表单数据 */\nexport async function deleteFormData(\n request: FormRuntimeApi['request'],\n params: FormDataDeleteParams,\n): Promise<any> {\n const response = (await request<any>({\n url: `/${params.appType}/v1/form/deleteFormData.json`,\n method: 'post',\n data: {\n appType: params.appType,\n formUuid: params.formUuid,\n formInstId: params.formInstanceId,\n },\n })) as RuntimeResponse<any>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 获取表单变更记录 */\nexport async function getChangeRecords(\n request: FormRuntimeApi['request'],\n params: ChangeRecordQueryParams,\n): Promise<ChangeRecordListResponse> {\n const response = (await request<ChangeRecordListResponse>({\n url: '/form/getFormDataChangeRecords',\n method: 'get',\n params,\n })) as RuntimeResponse<ChangeRecordListResponse>;\n return unwrapRuntimeResponse(response);\n}\n\n/** 获取视图权限摘要 */\nexport async function getViewPermission(\n request: FormRuntimeApi['request'],\n params: ViewPermissionQueryParams,\n): Promise<ViewPermissionSummary> {\n const response = (await request<ViewPermissionSummary>({\n url: '/permission/form-group/view-permissions',\n method: 'get',\n params,\n })) as RuntimeResponse<ViewPermissionSummary>;\n return unwrapRuntimeResponse(response);\n}\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n Avatar,\n Button,\n Checkbox,\n Empty,\n Input,\n List,\n Modal,\n Pagination,\n Space,\n Spin,\n Tag,\n Tree,\n} from 'antd';\nimport { SearchOutlined, TeamOutlined, UserOutlined } from '@ant-design/icons';\nimport * as MobileAntd from 'antd-mobile';\nimport type { DepartmentTreeNode, FormRuntimeApi, UserItem } from '../../types';\nimport {\n getDepartmentId,\n getDepartmentName,\n getUserId,\n getUserName,\n normalizeUser,\n} from './fieldFormat';\nimport { useLazyDepartmentTree } from './useLazyDepartmentTree';\n\nconst DEFAULT_MEMBER_PAGE_SIZE = 10;\n\nconst getMobileComponent = (name: string) => {\n try {\n return (MobileAntd as any)[name];\n } catch {\n return undefined;\n }\n};\n\ninterface UserPickerPanelProps {\n api: FormRuntimeApi;\n multiple?: boolean;\n value: UserItem[];\n dataSource?: UserItem[];\n treeData?: DepartmentTreeNode[];\n displaySearch?: boolean;\n loadAllWhenNoDepartment?: boolean;\n onConfirm: (items: UserItem[]) => void;\n onCancel: () => void;\n mobile?: boolean;\n}\n\nfunction normalizeUsers(users?: UserItem[]) {\n return (users || []).map(normalizeUser).filter((user) => getUserId(user));\n}\n\nexport function UserPickerPanel({\n api,\n multiple = true,\n value,\n dataSource,\n treeData,\n displaySearch = true,\n loadAllWhenNoDepartment = true,\n onConfirm,\n onCancel,\n mobile = false,\n}: UserPickerPanelProps) {\n const {\n treeData: deptTreeData,\n treeLoading,\n nodeMap,\n parentMap,\n flatNodes,\n loadChildren,\n } = useLazyDepartmentTree(api, treeData);\n const [departmentKeyword, setDepartmentKeyword] = useState('');\n const [memberKeyword, setMemberKeyword] = useState('');\n const [mobileKeyword, setMobileKeyword] = useState('');\n const [currentDeptId, setCurrentDeptId] = useState('');\n const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);\n const [members, setMembers] = useState<UserItem[]>(() => normalizeUsers(dataSource));\n const [memberPage, setMemberPage] = useState(1);\n const [memberPageSize, setMemberPageSize] = useState(DEFAULT_MEMBER_PAGE_SIZE);\n const [memberTotal, setMemberTotal] = useState(() => normalizeUsers(dataSource).length);\n const [memberReloadKey, setMemberReloadKey] = useState(0);\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<UserItem[]>(() => normalizeUsers(value));\n const selectedIds = selected.map(getUserId);\n const MobileSearchBar = getMobileComponent('SearchBar');\n const activeMemberKeyword = (mobile ? mobileKeyword : memberKeyword).trim();\n const staticUsers = useMemo(() => normalizeUsers(dataSource), [dataSource]);\n const hasStaticUserSource = staticUsers.length > 0;\n\n useEffect(() => {\n if (mobile) return;\n if (currentDeptId || deptTreeData.length === 0) return;\n setExpandedKeys(deptTreeData.map((node) => getDepartmentId(node)));\n if (loadAllWhenNoDepartment) {\n setCurrentDeptId(getDepartmentId(deptTreeData[0]));\n }\n }, [currentDeptId, deptTreeData, loadAllWhenNoDepartment, mobile]);\n\n useEffect(() => {\n setMemberPage(1);\n }, [activeMemberKeyword, currentDeptId, dataSource, mobile]);\n\n const handleDepartmentSelect = useCallback((deptId: string) => {\n const nextDeptId = String(deptId || '');\n setCurrentDeptId(nextDeptId);\n setMemberKeyword('');\n setMemberPage(1);\n setMemberReloadKey((current) => current + 1);\n }, []);\n\n useEffect(() => {\n let active = true;\n const keyword = activeMemberKeyword;\n if (hasStaticUserSource) {\n const lower = keyword.toLowerCase();\n const filtered = staticUsers.filter((user) =>\n keyword ? getUserName(user).toLowerCase().includes(lower) : true,\n );\n const start = (memberPage - 1) * memberPageSize;\n setMembers(filtered.slice(start, start + memberPageSize));\n setMemberTotal(filtered.length);\n setLoading(false);\n return;\n }\n if (!loadAllWhenNoDepartment && !keyword && !currentDeptId) {\n setMembers([]);\n setMemberTotal(0);\n setLoading(false);\n return;\n }\n setLoading(true);\n const timer = setTimeout(\n () => {\n const pageParams = { page: memberPage, pageSize: memberPageSize };\n const request = keyword\n ? api\n .getUserList({\n keyword,\n name: keyword,\n username: keyword,\n ...pageParams,\n })\n .then((users) => ({\n items: users,\n total: Array.isArray(users) ? users.length : 0,\n ...pageParams,\n }))\n : currentDeptId\n ? api.getDepartmentMembersPage\n ? api.getDepartmentMembersPage(currentDeptId, pageParams)\n : api.getDepartmentMembers(currentDeptId).then((users) => ({\n items: users,\n total: users.length,\n ...pageParams,\n }))\n : api.getUserList(pageParams).then((users) => ({\n items: users,\n total: Array.isArray(users) ? users.length : 0,\n ...pageParams,\n }));\n request\n .then((result) => {\n if (!active) return;\n const items = Array.isArray(result) ? result : result.items;\n setMembers(normalizeUsers(items as UserItem[]));\n setMemberTotal(Number(Array.isArray(result) ? result.length : result.total) || 0);\n })\n .catch(() => {\n if (active) {\n setMembers([]);\n setMemberTotal(0);\n }\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n },\n keyword ? 250 : 0,\n );\n return () => {\n active = false;\n clearTimeout(timer);\n };\n }, [\n activeMemberKeyword,\n api,\n currentDeptId,\n hasStaticUserSource,\n loadAllWhenNoDepartment,\n memberPage,\n memberPageSize,\n memberReloadKey,\n staticUsers,\n ]);\n\n const currentPath = useMemo(() => {\n if (!currentDeptId) return [];\n const path: Array<{ id: string; name: string }> = [];\n let cursor: string | null = currentDeptId;\n while (cursor) {\n const node = nodeMap.get(cursor);\n if (!node) break;\n path.unshift({ id: cursor, name: getDepartmentName(node) });\n cursor = parentMap.get(cursor) ?? null;\n }\n return path;\n }, [currentDeptId, nodeMap, parentMap]);\n\n const mobileDepartments = useMemo(() => {\n const keyword = mobileKeyword.trim().toLowerCase();\n if (keyword) {\n return flatNodes\n .filter((item) => item.name.toLowerCase().includes(keyword))\n .map((item) => item.node);\n }\n if (!currentDeptId) return deptTreeData;\n return nodeMap.get(currentDeptId)?.children || [];\n }, [currentDeptId, deptTreeData, flatNodes, mobileKeyword, nodeMap]);\n\n const toggleUser = (user: UserItem, checked: boolean) => {\n const normalized = normalizeUser(user);\n const id = getUserId(normalized);\n if (!id) return;\n if (multiple) {\n setSelected((prev) => {\n if (checked)\n return prev.some((item) => getUserId(item) === id) ? prev : [...prev, normalized];\n return prev.filter((item) => getUserId(item) !== id);\n });\n return;\n }\n setSelected(checked ? [normalized] : []);\n };\n\n const renderSelected = () => (\n <div className=\"sy-user-picker-selected\">\n <div className=\"sy-org-picker-selected-head\">\n <span>已选 {selected.length} 人</span>\n <button type=\"button\" onClick={() => setSelected([])} disabled={!selected.length}>\n 清空\n </button>\n </div>\n {selected.length ? (\n <div className=\"sy-org-picker-tags\">\n {selected.map((item) => (\n <Tag key={getUserId(item)} closable onClose={() => toggleUser(item, false)}>\n {getUserName(item)}\n </Tag>\n ))}\n </div>\n ) : (\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description=\"暂无选择\" />\n )}\n </div>\n );\n\n const renderMemberList = () => (\n <div className=\"sy-user-picker-member-panel\">\n <Spin spinning={loading} wrapperClassName=\"sy-user-picker-member-spin\">\n <div className=\"sy-user-picker-list\">\n <List\n dataSource={members}\n locale={{ emptyText: '暂无成员' }}\n renderItem={(user) => {\n const id = getUserId(user);\n const checked = selectedIds.includes(id);\n return (\n <List.Item key={id}>\n <label className=\"sy-user-picker-row\">\n <Checkbox\n checked={checked}\n onChange={(event) => toggleUser(user, event.target.checked)}\n />\n <Avatar size={36} src={user.avatar} icon={!user.avatar && <UserOutlined />} />\n <span>{getUserName(user)}</span>\n </label>\n </List.Item>\n );\n }}\n />\n </div>\n <div className=\"sy-user-picker-pagination\">\n <span>共 {memberTotal} 人</span>\n <Pagination\n size=\"small\"\n current={memberPage}\n pageSize={memberPageSize}\n total={memberTotal}\n showSizeChanger\n pageSizeOptions={[10, 20, 50, 100]}\n onChange={(page, pageSize) => {\n setMemberPage(page);\n setMemberPageSize(pageSize);\n }}\n />\n </div>\n </Spin>\n </div>\n );\n\n if (mobile) {\n return (\n <div className=\"sy-user-picker sy-user-picker-mobile\">\n <div className=\"sy-org-picker-mobile-head\">\n <button type=\"button\" onClick={onCancel}>\n 取消\n </button>\n <strong>选择成员</strong>\n <button type=\"button\" onClick={() => onConfirm(selected)}>\n 确定\n </button>\n </div>\n {MobileSearchBar ? (\n <MobileSearchBar\n placeholder=\"搜索部门或成员\"\n value={mobileKeyword}\n onChange={setMobileKeyword}\n />\n ) : (\n <input value={mobileKeyword} onChange={(event) => setMobileKeyword(event.target.value)} />\n )}\n <div className=\"sy-org-picker-breadcrumb\">\n <button type=\"button\" onClick={() => handleDepartmentSelect('')}>\n 通讯录\n </button>\n {currentPath.map((item) => (\n <button key={item.id} type=\"button\" onClick={() => handleDepartmentSelect(item.id)}>\n / {item.name}\n </button>\n ))}\n </div>\n <Spin spinning={treeLoading}>\n <List\n dataSource={mobileDepartments}\n locale={{ emptyText: null }}\n renderItem={(node) => {\n const id = getDepartmentId(node);\n return (\n <List.Item\n key={id}\n onClick={async () => {\n await loadChildren(id);\n handleDepartmentSelect(id);\n setMobileKeyword('');\n }}\n >\n <List.Item.Meta avatar={<TeamOutlined />} title={getDepartmentName(node)} />\n </List.Item>\n );\n }}\n />\n </Spin>\n {renderMemberList()}\n {renderSelected()}\n </div>\n );\n }\n\n const lowerDepartmentKeyword = departmentKeyword.trim().toLowerCase();\n const filteredTreeData = lowerDepartmentKeyword\n ? deptTreeData.filter((node) =>\n getDepartmentName(node).toLowerCase().includes(lowerDepartmentKeyword),\n )\n : deptTreeData;\n\n return (\n <div className=\"sy-user-picker\">\n <div className=\"sy-user-picker-main\">\n <div className=\"sy-user-picker-depts\">\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索部门\"\n value={departmentKeyword}\n onChange={(event) => setDepartmentKeyword(event.target.value)}\n />\n <Spin spinning={treeLoading}>\n <Tree\n selectedKeys={currentDeptId ? [currentDeptId] : []}\n expandedKeys={expandedKeys}\n onExpand={setExpandedKeys}\n onSelect={(keys, info: any) =>\n handleDepartmentSelect(String(info?.node?.key || keys[0] || ''))\n }\n loadData={(node) => loadChildren(String(node.key))}\n treeData={filteredTreeData}\n height={460}\n />\n </Spin>\n </div>\n <div className=\"sy-user-picker-members\">\n {displaySearch && (\n <Input\n allowClear\n prefix={<SearchOutlined />}\n placeholder=\"搜索成员\"\n value={memberKeyword}\n onChange={(event) => setMemberKeyword(event.target.value)}\n />\n )}\n {renderMemberList()}\n </div>\n {renderSelected()}\n </div>\n <div className=\"sy-org-picker-footer\">\n <Space>\n <Button onClick={onCancel}>取消</Button>\n <Button type=\"primary\" onClick={() => onConfirm(selected)}>\n 确定\n </Button>\n </Space>\n </div>\n </div>\n );\n}\n\nexport interface UserPickerProps extends Omit<UserPickerPanelProps, 'mobile'> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n mobile?: boolean;\n}\n\nexport function UserPicker({\n open,\n onOpenChange,\n mobile,\n onCancel,\n ...panelProps\n}: UserPickerProps) {\n const handleCancel = () => {\n onOpenChange(false);\n onCancel();\n };\n const panel = (\n <UserPickerPanel\n {...panelProps}\n mobile={mobile}\n onCancel={handleCancel}\n onConfirm={(items) => {\n panelProps.onConfirm(items);\n onOpenChange(false);\n }}\n />\n );\n\n if (mobile) {\n const MobilePopup = getMobileComponent('Popup');\n if (!MobilePopup) return open ? panel : null;\n return (\n <MobilePopup\n visible={open}\n onMaskClick={handleCancel}\n destroyOnClose\n bodyStyle={{ height: '90vh' }}\n >\n {panel}\n </MobilePopup>\n );\n }\n\n return (\n <Modal\n title=\"选择成员\"\n open={open}\n onCancel={handleCancel}\n footer={null}\n width=\"min(980px, calc(100vw - 48px))\"\n destroyOnClose\n >\n {panel}\n </Modal>\n );\n}\n","import type { AttachmentItem, DepartmentTreeNode, UserDisplayFormat, UserItem } from '../../types';\n\nexport const EMPTY_TEXT = '--';\n\nexport function createUid(prefix = 'field') {\n return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport function getUserId(user: Partial<UserItem> | any): string {\n if (typeof user === 'string' || typeof user === 'number') return String(user).trim();\n return String(user?.id || user?.userId || user?.userid || user?.value || user?.key || '').trim();\n}\n\nexport function getUserName(user: Partial<UserItem> | any): string {\n if (typeof user === 'string' || typeof user === 'number') return String(user).trim();\n return String(\n user?.name || user?.label || user?.title || user?.username || user?.nickname || getUserId(user),\n );\n}\n\nexport function normalizeUser(user: any): UserItem {\n const id = getUserId(user);\n const source = typeof user === 'object' && user !== null ? user : {};\n return {\n ...source,\n id,\n name: getUserName({ ...source, id }),\n };\n}\n\nexport function normalizeUserArray(value: any): UserItem[] {\n const source = Array.isArray(value)\n ? value\n : value === undefined || value === null || value === ''\n ? []\n : [value];\n return source.map(normalizeUser).filter((user) => getUserId(user));\n}\n\nexport function getDepartmentId(node: Partial<DepartmentTreeNode> | any): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node).trim();\n return String(\n node?.id || node?.departmentId || node?.deptId || node?.value || node?.key || '',\n ).trim();\n}\n\nexport function getDepartmentName(node: Partial<DepartmentTreeNode> | any): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node).trim();\n return String(\n node?.name ||\n node?.label ||\n node?.title ||\n node?.deptName ||\n node?.departmentName ||\n getDepartmentId(node),\n );\n}\n\nexport function normalizeDepartmentNode(node: any): DepartmentTreeNode {\n const id = getDepartmentId(node);\n const source = typeof node === 'object' && node !== null ? node : {};\n const name = getDepartmentName({ ...source, id });\n const hasChildren =\n typeof node?.hasChildren === 'boolean'\n ? node.hasChildren\n : Array.isArray(node?.children) && node.children.length > 0;\n const children = Array.isArray(node?.children)\n ? node.children.map((child: any) => normalizeDepartmentNode(child))\n : undefined;\n return {\n ...source,\n id,\n name,\n key: String(node?.key || id),\n title: String(node?.title || name),\n hasChildren,\n isLeaf: typeof node?.isLeaf === 'boolean' ? node.isLeaf : !hasChildren,\n children,\n };\n}\n\nexport function normalizeDepartmentArray(value: any): DepartmentTreeNode[] {\n const source = Array.isArray(value)\n ? value\n : value === undefined || value === null || value === ''\n ? []\n : [value];\n return source.map(normalizeDepartmentNode).filter((dept) => getDepartmentId(dept));\n}\n\nexport function flattenDepartments(nodes: DepartmentTreeNode[]) {\n const result: Array<{ id: string; name: string; node: DepartmentTreeNode }> = [];\n const walk = (items: DepartmentTreeNode[]) => {\n for (const node of items) {\n const id = getDepartmentId(node);\n if (id) result.push({ id, name: getDepartmentName(node), node });\n if (node.children?.length) walk(node.children);\n }\n };\n walk(nodes);\n return result;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function formatUserDisplay(user: UserItem, format?: UserDisplayFormat): string {\n const normalized = normalizeUser(user);\n if (!format || format === 'name') return normalized.name;\n switch (format) {\n case 'nameWithJobNumber':\n return normalized.jobNumber\n ? `${normalized.name}(${normalized.jobNumber})`\n : normalized.name;\n case 'nameWithDepartment':\n return normalized.departments?.[0]?.name\n ? `${normalized.name}(${normalized.departments[0].name})`\n : normalized.name;\n default:\n return normalized.name;\n }\n}\n\n/**\n * 获取部门全路径(从根节点到目标节点)\n */\nexport function getDepartmentFullPath(deptId: string, treeData?: DepartmentTreeNode[]): string {\n if (!treeData) return '';\n const path: string[] = [];\n\n function findPath(nodes: DepartmentTreeNode[], target: string): boolean {\n for (const node of nodes) {\n path.push(getDepartmentName(node));\n if (getDepartmentId(node) === target) return true;\n if (node.children && findPath(node.children, target)) return true;\n path.pop();\n }\n return false;\n }\n\n findPath(treeData, deptId);\n return path.join('/');\n}\n\n/**\n * 过滤部门树,只保留指定部门及其子树\n */\nexport function filterTreeByScope(\n treeData: DepartmentTreeNode[],\n scopeType?: 'all' | 'specified',\n specifiedDepts?: string[],\n): DepartmentTreeNode[] {\n if (!scopeType || scopeType === 'all' || !specifiedDepts?.length) {\n return treeData;\n }\n const specifiedSet = new Set(specifiedDepts);\n\n function filterNodes(nodes: DepartmentTreeNode[]): DepartmentTreeNode[] {\n const result: DepartmentTreeNode[] = [];\n for (const node of nodes) {\n const nodeId = getDepartmentId(node);\n if (specifiedSet.has(nodeId)) {\n // 保留此节点及其全部子树\n result.push(node);\n } else if (node.children?.length) {\n // 递归检查子节点\n const filteredChildren = filterNodes(node.children);\n if (filteredChildren.length > 0) {\n result.push({ ...node, children: filteredChildren });\n }\n }\n }\n return result;\n }\n\n return filterNodes(treeData);\n}\n\nexport function formatFileSize(bytes?: number): string {\n if (!bytes) return '';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let value = bytes;\n let index = 0;\n while (value >= 1024 && index < units.length - 1) {\n value /= 1024;\n index += 1;\n }\n return `${Number(value.toFixed(value >= 10 || index === 0 ? 0 : 1))} ${units[index]}`;\n}\n\nexport function getFileExtension(fileName?: string): string {\n return (\n String(fileName || '')\n .split('.')\n .pop()\n ?.toLowerCase() || ''\n );\n}\n\nexport function isImageFile(fileName?: string, contentType?: string): boolean {\n return (\n String(contentType || '').startsWith('image/') ||\n [\n 'jpg',\n 'jpeg',\n 'png',\n 'gif',\n 'bmp',\n 'svg',\n 'webp',\n 'avif',\n 'ico',\n 'heic',\n 'heif',\n 'tif',\n 'tiff',\n ].includes(getFileExtension(fileName))\n );\n}\n\nexport function getFileCategory(fileName?: string, contentType?: string) {\n const ext = getFileExtension(fileName);\n if (isImageFile(fileName, contentType)) return 'image';\n if (['mp4', 'webm', 'ogg', 'mov', 'm4v'].includes(ext)) return 'video';\n if (['mp3', 'wav', 'aac', 'flac', 'm4a', 'ogg'].includes(ext)) return 'audio';\n if (ext === 'pdf') return 'pdf';\n if (['xls', 'xlsx', 'csv'].includes(ext)) return 'excel';\n if (['doc', 'docx'].includes(ext)) return 'word';\n if (['ppt', 'pptx'].includes(ext)) return 'ppt';\n if (['zip', 'rar', '7z', 'tar', 'gz'].includes(ext)) return 'archive';\n if (['txt', 'json', 'xml', 'log', 'md'].includes(ext)) return 'text';\n if (['js', 'jsx', 'ts', 'tsx', 'html', 'css', 'scss', 'less', 'java', 'py'].includes(ext)) {\n return 'code';\n }\n return 'file';\n}\n\nexport function normalizeAttachmentItem(\n item: any,\n fallback?: Partial<AttachmentItem>,\n): AttachmentItem {\n const id = String(item?.id || item?.uid || item?.objectName || fallback?.id || createUid('file'));\n const name = String(item?.name || item?.originalName || fallback?.name || item?.fileName || id);\n return {\n ...fallback,\n ...item,\n id,\n uid: String(item?.uid || item?.id || fallback?.uid || id),\n name,\n originalName: item?.originalName || fallback?.originalName || name,\n url: String(item?.url || item?.downloadUrl || item?.previewUrl || fallback?.url || ''),\n thumbUrl: item?.thumbUrl || item?.variants?.thumb?.url || fallback?.thumbUrl,\n previewUrl: item?.previewUrl || item?.variants?.preview?.url || fallback?.previewUrl,\n downloadUrl: item?.downloadUrl || fallback?.downloadUrl,\n publicUrl: item?.publicUrl || fallback?.publicUrl,\n status: item?.status || fallback?.status || 'done',\n size: item?.size ?? fallback?.size,\n percent: item?.percent ?? fallback?.percent,\n contentType: item?.contentType || item?.mimeType || fallback?.contentType,\n mimeType: item?.mimeType || item?.contentType || fallback?.mimeType,\n extension: item?.extension || fallback?.extension || getFileExtension(name),\n width: item?.width ?? fallback?.width,\n height: item?.height ?? fallback?.height,\n variants: item?.variants || fallback?.variants,\n };\n}\n\nexport function getAttachmentItemIdentity(item: Partial<AttachmentItem> | any): string {\n return String(item?.uid || item?.id || item?.objectName || item?.url || item?.name || '');\n}\n\nexport function dedupeAttachmentItems(items: AttachmentItem[]): AttachmentItem[] {\n const result: AttachmentItem[] = [];\n const indexes = new Map<string, number>();\n\n for (const item of items) {\n const key = getAttachmentItemIdentity(item);\n if (!key) {\n result.push(item);\n continue;\n }\n\n const existingIndex = indexes.get(key);\n if (existingIndex === undefined) {\n indexes.set(key, result.length);\n result.push(item);\n continue;\n }\n\n result[existingIndex] = {\n ...result[existingIndex],\n ...item,\n };\n }\n\n return result;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { DataNode } from 'antd/es/tree';\nimport type { DepartmentTreeNode, FormRuntimeApi } from '../../types';\nimport {\n flattenDepartments,\n getDepartmentId,\n getDepartmentName,\n normalizeDepartmentNode,\n} from './fieldFormat';\n\nexport interface LazyDepartmentNode extends DataNode, DepartmentTreeNode {\n key: string;\n title: string;\n childrenLoaded?: boolean;\n children?: LazyDepartmentNode[];\n}\n\nexport interface LazyDepartmentFlatNode {\n id: string;\n name: string;\n node: LazyDepartmentNode;\n path: Array<{ id: string; name: string }>;\n}\n\nconst toLazyNode = (node: DepartmentTreeNode): LazyDepartmentNode => {\n const normalized = normalizeDepartmentNode(node);\n const id = getDepartmentId(normalized);\n const name = getDepartmentName(normalized);\n const children = normalized.children?.map(toLazyNode);\n const hasChildren = normalized.hasChildren ?? Boolean(children?.length);\n return {\n ...normalized,\n id,\n name,\n key: id,\n title: name,\n hasChildren,\n isLeaf: normalized.isLeaf ?? !hasChildren,\n childrenLoaded: Boolean(children?.length) || normalized.isLeaf === true || !hasChildren,\n children,\n };\n};\n\nconst replaceChildren = (\n nodes: LazyDepartmentNode[],\n parentId: string,\n children: LazyDepartmentNode[],\n): LazyDepartmentNode[] =>\n nodes.map((node) => {\n if (getDepartmentId(node) === parentId) {\n return {\n ...node,\n children,\n hasChildren: children.length > 0,\n isLeaf: children.length === 0,\n childrenLoaded: true,\n };\n }\n return node.children?.length\n ? { ...node, children: replaceChildren(node.children, parentId, children) }\n : node;\n });\n\nfunction buildIndexes(nodes: LazyDepartmentNode[]) {\n const nodeMap = new Map<string, LazyDepartmentNode>();\n const parentMap = new Map<string, string | null>();\n const flatNodes: LazyDepartmentFlatNode[] = [];\n\n const walk = (\n list: LazyDepartmentNode[],\n parentId: string | null,\n path: Array<{ id: string; name: string }>,\n ) => {\n for (const node of list) {\n const id = getDepartmentId(node);\n const name = getDepartmentName(node);\n const nextPath = [...path, { id, name }];\n nodeMap.set(id, node);\n parentMap.set(id, parentId);\n flatNodes.push({ id, name, node, path: nextPath });\n if (node.children?.length) walk(node.children, id, nextPath);\n }\n };\n\n walk(nodes, null, []);\n return { nodeMap, parentMap, flatNodes };\n}\n\nexport function useLazyDepartmentTree(\n api: FormRuntimeApi,\n configuredTreeData?: DepartmentTreeNode[],\n) {\n const [treeData, setTreeDataState] = useState<LazyDepartmentNode[]>(() =>\n (configuredTreeData || []).map(toLazyNode),\n );\n const [treeLoading, setTreeLoading] = useState(false);\n const treeDataRef = useRef(treeData);\n const rootsLoadedRef = useRef(Boolean(configuredTreeData?.length));\n const rootPromiseRef = useRef<Promise<LazyDepartmentNode[]> | null>(null);\n const childPromiseRef = useRef<Record<string, Promise<LazyDepartmentNode[]> | undefined>>({});\n\n const setTreeData = useCallback(\n (next: LazyDepartmentNode[] | ((prev: LazyDepartmentNode[]) => LazyDepartmentNode[])) => {\n const resolved = typeof next === 'function' ? next(treeDataRef.current) : next;\n treeDataRef.current = resolved;\n setTreeDataState(resolved);\n return resolved;\n },\n [],\n );\n\n useEffect(() => {\n if (!configuredTreeData) return;\n const next = configuredTreeData.map(toLazyNode);\n rootsLoadedRef.current = next.length > 0;\n setTreeData(next);\n }, [configuredTreeData, setTreeData]);\n\n const loadRootDepartments = useCallback(async () => {\n if (rootsLoadedRef.current) return treeDataRef.current;\n if (rootPromiseRef.current) return rootPromiseRef.current;\n setTreeLoading(true);\n const promise = api\n .getDepartmentRoots()\n .then((nodes) => {\n const next = (nodes || []).map((node) => toLazyNode(node as DepartmentTreeNode));\n rootsLoadedRef.current = true;\n setTreeData(next);\n return next;\n })\n .finally(() => {\n rootPromiseRef.current = null;\n setTreeLoading(false);\n });\n rootPromiseRef.current = promise;\n return promise;\n }, [api, setTreeData]);\n\n const loadChildren = useCallback(\n async (parentId: string) => {\n const id = String(parentId || '');\n if (!id) return [];\n const current = flattenDepartments(treeDataRef.current).find((item) => item.id === id)\n ?.node as LazyDepartmentNode | undefined;\n if (!current || current.childrenLoaded || current.isLeaf || current.hasChildren === false) {\n return current?.children || [];\n }\n if (childPromiseRef.current[id]) return childPromiseRef.current[id];\n const promise = api\n .getDepartmentChildren(id)\n .then((nodes) => {\n const children = (nodes || []).map((node) => toLazyNode(node as DepartmentTreeNode));\n setTreeData((prev) => replaceChildren(prev, id, children));\n return children;\n })\n .finally(() => {\n delete childPromiseRef.current[id];\n });\n childPromiseRef.current[id] = promise;\n return promise;\n },\n [api, setTreeData],\n );\n\n const indexes = useMemo(() => buildIndexes(treeData), [treeData]);\n\n useEffect(() => {\n void loadRootDepartments();\n }, [loadRootDepartments]);\n\n return {\n treeData,\n treeLoading,\n ...indexes,\n loadRootDepartments,\n loadChildren,\n };\n}\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport { createBrowserPageContext } from \"../host/browserHost\"\nimport { createBoundFetch } from \"../core/fetch\"\nimport { PageProvider } from \"./provider\"\n\nimport type {\n PageContext,\n PageInfo,\n PageMessageApi,\n PageModalApi,\n PageNavigationApi,\n PageQueryValue,\n PageRouteInfo,\n} from \"../core/types\"\n\nexport type RuntimeErrorType =\n | \"unauthenticated\"\n | \"forbidden\"\n | \"network\"\n | \"unknown\"\n\nexport type RuntimeRequestError = Error & {\n type?: RuntimeErrorType\n status?: number\n code?: number | string\n payload?: unknown\n}\n\nexport interface RuntimeErrorSnapshot {\n type: RuntimeErrorType\n status?: number\n code?: number | string\n message: string\n payload?: unknown\n}\n\nexport class RuntimeHttpError extends Error {\n type: RuntimeErrorType\n status?: number\n code?: number | string\n payload?: unknown\n\n constructor(snapshot: RuntimeErrorSnapshot) {\n super(snapshot.message)\n this.name = \"RuntimeHttpError\"\n this.type = snapshot.type\n this.status = snapshot.status\n this.code = snapshot.code\n this.payload = snapshot.payload\n }\n}\n\nexport interface RuntimeMenuItem {\n id: string\n name: string\n resourceCode?: string | null\n routeCode?: string | null\n path?: string | null\n type?: string\n formUuid?: string | null\n pageId?: string | null\n parentId?: string | null\n sortOrder?: number\n isHidden?: boolean\n icon?: string | null\n children?: RuntimeMenuItem[]\n [key: string]: unknown\n}\n\nexport interface RuntimePagePermissions {\n appType: string\n hasFullAccess: boolean\n roleCodes: string[]\n roleSource?: string\n menuFormUuids: string[]\n menuCodes: string[]\n routeCodes: string[]\n pathPatterns: string[]\n}\n\nexport interface RuntimeBootstrap {\n appType: string\n app?: Record<string, unknown> | null\n user?: Record<string, unknown> | null\n runtime?: {\n mode?: \"legacy\" | \"react-spa\" | string\n settings?: Record<string, unknown>\n activeReleaseId?: string | null\n activeBuildId?: string | null\n indexUrl?: string | null\n assetBaseUrl?: string | null\n }\n permissions?: RuntimePagePermissions\n menus?: RuntimeMenuItem[]\n servicePrefix?: string\n}\n\nexport interface RouteAccessResult {\n appType: string\n canAccess: boolean\n routeCode?: string\n menuCode?: string\n path?: string\n status?: number\n code?: number | string\n message?: string\n errorType?: RuntimeErrorType\n payload?: unknown\n permissions?: RuntimePagePermissions\n}\n\nexport interface RuntimeRequestState<T> {\n data: T | null\n loading: boolean\n error: RuntimeRequestError | null\n}\n\nexport type RuntimeAuthStatus =\n | \"unknown\"\n | \"authenticated\"\n | \"refreshing\"\n | \"unauthenticated\"\n\nexport interface RuntimeAuthState {\n status: RuntimeAuthStatus\n error?: RuntimeRequestError | null\n refreshedAt?: number\n}\n\nexport interface RuntimeReloadOptions {\n accessToken?: string | null\n accessTokenOptions?: RuntimeAccessTokenOptions\n}\n\nexport interface RuntimeAccessTokenOptions {\n scope?: \"default\" | \"public\"\n path?: string | null\n clearIfToken?: string\n expiresAt?: number\n}\n\nexport interface OpenXiangdaProviderProps {\n appType?: string\n servicePrefix?: string\n fetchImpl?: typeof fetch\n children: React.ReactNode\n}\n\nexport interface OpenXiangdaPageProviderProps {\n children: React.ReactNode\n page?: Partial<PageInfo>\n route?: Partial<PageRouteInfo>\n env?: Record<string, unknown>\n message?: Partial<PageMessageApi>\n modal?: Partial<PageModalApi>\n navigation?: Partial<PageNavigationApi>\n}\n\ninterface OpenXiangdaRuntimeStore extends RuntimeRequestState<RuntimeBootstrap> {\n appType: string\n servicePrefix: string\n fetchImpl: typeof fetch\n baseFetchImpl: typeof fetch\n authState: RuntimeAuthState\n getAuthHeaders: () => HeadersInit\n reload: (options?: RuntimeReloadOptions) => Promise<void>\n setAccessToken: (\n accessToken?: string | null,\n options?: RuntimeAccessTokenOptions,\n ) => void\n}\n\ninterface RuntimeAccessTokenState {\n token: string\n scope: \"default\" | \"public\"\n path?: string | null\n expiresAt?: number\n}\n\nconst OpenXiangdaRuntimeContext =\n createContext<OpenXiangdaRuntimeStore | null>(null)\n\nexport const OpenXiangdaProvider: React.FC<OpenXiangdaProviderProps> = ({\n appType,\n servicePrefix = \"/service\",\n fetchImpl,\n children,\n}) => {\n const resolvedFetch = useMemo(() => createBoundFetch(fetchImpl), [fetchImpl])\n const resolvedAppType = useMemo(\n () => appType || resolveAppTypeFromLocation(),\n [appType],\n )\n const [, setAccessTokenState] = useState<RuntimeAccessTokenState | null>(null)\n const [authState, setAuthState] = useState<RuntimeAuthState>({\n status: \"unknown\",\n error: null,\n })\n const accessTokenRef = useRef<RuntimeAccessTokenState | null>(null)\n const refreshRequestRef = useRef<Promise<RuntimeAccessTokenState | null> | null>(null)\n const applyAccessToken = useCallback(\n (\n nextAccessToken?: string | null,\n options: RuntimeAccessTokenOptions = {},\n ): RuntimeAccessTokenState | null => {\n if (\n !nextAccessToken &&\n options.clearIfToken &&\n accessTokenRef.current?.token !== options.clearIfToken\n ) {\n return accessTokenRef.current\n }\n const normalizedAccessToken = nextAccessToken || null\n const nextState = normalizedAccessToken\n ? {\n token: normalizedAccessToken,\n scope: options.scope || \"default\",\n path: options.path || null,\n expiresAt: options.expiresAt,\n }\n : null\n accessTokenRef.current = nextState\n setAccessTokenState(nextState)\n return nextState\n },\n [],\n )\n const setAccessToken = useCallback(\n (\n nextAccessToken?: string | null,\n options: RuntimeAccessTokenOptions = {},\n ) => {\n const previousState = accessTokenRef.current\n const nextState = applyAccessToken(nextAccessToken, options)\n if (nextState) {\n if (nextState.scope === \"public\") return\n setAuthState({\n status: \"authenticated\",\n error: null,\n })\n } else if (previousState?.scope !== \"public\") {\n setAuthState({ status: \"unauthenticated\", error: null })\n }\n },\n [applyAccessToken],\n )\n const markUnauthenticated = useCallback(\n (error: unknown) => {\n const runtimeError = normalizeRuntimeError(error)\n applyAccessToken(null)\n setAuthState({ status: \"unauthenticated\", error: runtimeError })\n },\n [applyAccessToken],\n )\n const refreshAccessToken = useCallback(async () => {\n if (!resolvedAppType) return null\n if (!refreshRequestRef.current) {\n setAuthState(prev => ({ ...prev, status: \"refreshing\", error: null }))\n refreshRequestRef.current = (async () => {\n const response = await resolvedFetch(\n buildServiceUrl(\n servicePrefix,\n `/openxiangda-api/v1/apps/${encodeURIComponent(\n resolvedAppType,\n )}/auth/refresh`,\n ),\n {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n },\n body: \"{}\",\n },\n )\n const payload = await readJsonPayload(response)\n if (isRuntimeEnvelopeFailure(response, payload)) {\n throw createRuntimeHttpError(\n response,\n payload,\n payload?.message || `Token refresh failed: ${response.status}`,\n )\n }\n const data = unwrapRuntimePayload(payload)\n const nextAccessToken =\n getRecordString(data, \"accessToken\") || getRecordString(data, \"token\")\n if (!nextAccessToken) {\n throw createRuntimeError({\n type: \"unauthenticated\",\n status: response.status,\n code: getRecordValue(payload, \"code\") as number | string | undefined,\n message: \"Token refresh response missing accessToken\",\n payload,\n })\n }\n const nextState = applyAccessToken(nextAccessToken, {\n expiresAt: getRecordNumber(data, \"accessTokenExpiresAt\"),\n })\n setAuthState({\n status: \"authenticated\",\n error: null,\n refreshedAt: Date.now(),\n })\n return nextState\n })()\n .catch(error => {\n const runtimeError = normalizeRuntimeError(error)\n applyAccessToken(null)\n setAuthState({ status: \"unauthenticated\", error: runtimeError })\n throw runtimeError\n })\n .finally(() => {\n refreshRequestRef.current = null\n })\n }\n return refreshRequestRef.current\n }, [applyAccessToken, resolvedAppType, resolvedFetch, servicePrefix])\n const authorizedFetch = useMemo(\n () =>\n createAuthorizedFetch({\n appType: resolvedAppType,\n baseFetch: resolvedFetch,\n accessTokenRef,\n markUnauthenticated,\n refreshAccessToken,\n }),\n [markUnauthenticated, refreshAccessToken, resolvedAppType, resolvedFetch],\n )\n const getAuthHeaders = useCallback((): HeadersInit => {\n const state = accessTokenRef.current\n if (!state) return {}\n const token = resolveAccessTokenForCurrentRoute(state)\n return token ? { authorization: `Bearer ${token}` } : {}\n }, [])\n const [state, setState] = useState<RuntimeRequestState<RuntimeBootstrap>>({\n data: null,\n loading: true,\n error: null,\n })\n\n const reload = useCallback(async (options: RuntimeReloadOptions = {}) => {\n if (!resolvedAppType) {\n setState({\n data: null,\n loading: false,\n error: createRuntimeError({\n message: \"appType 不能为空\",\n type: \"unknown\",\n }),\n })\n return\n }\n setState(prev => ({ ...prev, loading: true, error: null }))\n const requestFetch =\n options.accessToken !== undefined\n ? createAccessTokenFetch(\n resolvedFetch,\n createAccessTokenState(\n options.accessToken || null,\n options.accessTokenOptions,\n ),\n )\n : authorizedFetch\n try {\n const response = await requestFetch(\n buildServiceUrl(\n servicePrefix,\n `/openxiangda-api/v1/apps/${encodeURIComponent(\n resolvedAppType,\n )}/runtime/bootstrap`,\n ),\n {\n credentials: \"include\",\n headers: { accept: \"application/json\" },\n },\n )\n const payload = await readJsonPayload(response)\n if (isRuntimeEnvelopeFailure(response, payload)) {\n throw createRuntimeHttpError(\n response,\n payload,\n payload?.message || `Runtime bootstrap failed: ${response.status}`,\n )\n }\n const nextData = payload?.data || null\n setState({\n data: nextData,\n loading: false,\n error: null,\n })\n if (isAuthenticatedBootstrap(nextData)) {\n setAuthState(prev =>\n prev.status === \"authenticated\"\n ? prev\n : { status: \"authenticated\", error: null },\n )\n }\n } catch (error) {\n const runtimeError = normalizeRuntimeError(error)\n setState({\n data: null,\n loading: false,\n error: runtimeError,\n })\n if (runtimeError.type === \"unauthenticated\") {\n setAuthState({ status: \"unauthenticated\", error: runtimeError })\n }\n }\n }, [authorizedFetch, resolvedAppType, resolvedFetch, servicePrefix])\n\n useEffect(() => {\n void reload()\n }, [reload])\n\n const value = useMemo<OpenXiangdaRuntimeStore>(\n () => ({\n ...state,\n appType: resolvedAppType,\n servicePrefix,\n fetchImpl: authorizedFetch,\n baseFetchImpl: resolvedFetch,\n authState,\n getAuthHeaders,\n reload,\n setAccessToken,\n }),\n [\n authorizedFetch,\n getAuthHeaders,\n reload,\n resolvedAppType,\n resolvedFetch,\n servicePrefix,\n state,\n authState,\n ],\n )\n\n return (\n <OpenXiangdaRuntimeContext.Provider value={value}>\n {children}\n </OpenXiangdaRuntimeContext.Provider>\n )\n}\n\nexport const useOpenXiangda = () => {\n const context = useContext(OpenXiangdaRuntimeContext)\n if (!context) {\n throw new Error(\"useOpenXiangda must be used inside OpenXiangdaProvider\")\n }\n return context\n}\n\nexport const useRuntimeBootstrap = () => useOpenXiangda()\n\nexport const OpenXiangdaPageProvider: React.FC<\n OpenXiangdaPageProviderProps\n> = ({\n children,\n page,\n route,\n env,\n message,\n modal,\n navigation,\n}) => {\n const runtime = useOpenXiangda()\n const context = useMemo<PageContext>(() => {\n const bootstrap = runtime.data\n const app = toRuntimeRecord(bootstrap?.app)\n const user = toRuntimeRecord(bootstrap?.user)\n const permissions = bootstrap?.permissions\n const unauthenticatedRuntime =\n !bootstrap?.user && runtime.error?.type === \"unauthenticated\"\n const runtimeGuestUser =\n unauthenticatedRuntime ||\n user.isGuest === true ||\n user.userType === \"guest\" ||\n Boolean(getRecordValue(user, \"publicAccess\"))\n const tenantId =\n toStringValue(getRecordValue(app, \"tenantId\")) ||\n toStringValue(getRecordValue(user, \"tenantId\")) ||\n toStringValue(getRecordValue(app, \"tenantCode\")) ||\n \"\"\n const appType =\n runtime.appType ||\n bootstrap?.appType ||\n toStringValue(getRecordValue(app, \"appType\"))\n const routeInfo = buildBrowserRouteInfo(route)\n\n return createBrowserPageContext(\n {\n app: {\n ...app,\n appType,\n tenantId,\n },\n page: {\n id: routeInfo.pathname || \"react-spa\",\n code: routeInfo.pathname || \"react-spa\",\n name: \"OpenXiangda React SPA\",\n type: \"react-spa\",\n rendererType: \"react-spa\",\n routeKey: routeInfo.pathname || \"react-spa\",\n status: \"ACTIVE\",\n props: {},\n route: {},\n dataSources: [],\n capabilities: {},\n buildId: toStringValue(\n getRecordValue(bootstrap?.runtime, \"activeBuildId\"),\n ),\n ...page,\n },\n user: {\n ...user,\n id:\n toStringValue(getRecordValue(user, \"id\")) ||\n (runtimeGuestUser ? \"guest\" : \"current\"),\n username:\n toStringValue(getRecordValue(user, \"username\")) ||\n toStringValue(getRecordValue(user, \"name\")) ||\n (runtimeGuestUser ? \"guest\" : \"current\"),\n tenantId,\n isGuest: runtimeGuestUser,\n userType: runtimeGuestUser ? \"guest\" : \"normal\",\n },\n env: {\n appType,\n servicePrefix: runtime.servicePrefix,\n runtimeMode: bootstrap?.runtime?.mode || \"react-spa\",\n ...(env || {}),\n },\n permissions: {\n canView: runtime.error?.type !== \"forbidden\",\n hasFullAccess: permissions?.hasFullAccess === true,\n ...(permissions || {}),\n },\n sdk: {\n packageName: \"openxiangda\",\n supportedBridgeMethods: [\"transport.request\", \"transport.download\"],\n },\n },\n {\n servicePrefix: runtime.servicePrefix,\n fetchImpl: runtime.fetchImpl,\n route: routeInfo,\n message,\n modal,\n navigation,\n },\n )\n }, [\n env,\n message,\n modal,\n navigation,\n page,\n route,\n runtime.appType,\n runtime.data,\n runtime.error?.type,\n runtime.fetchImpl,\n runtime.servicePrefix,\n ])\n\n return <PageProvider context={context}>{children}</PageProvider>\n}\n\nexport const useAppMenus = () => {\n const runtime = useOpenXiangda()\n return {\n ...runtime,\n data: runtime.data?.menus || [],\n }\n}\n\nexport const usePermission = () => {\n const runtime = useOpenXiangda()\n return {\n ...runtime,\n data: runtime.data?.permissions || null,\n }\n}\n\nexport interface UseCanAccessRouteInput {\n routeCode?: string\n menuCode?: string\n path?: string\n}\n\nexport const useCanAccessRoute = (input: UseCanAccessRouteInput) => {\n const runtime = useOpenXiangda()\n const [state, setState] = useState<RuntimeRequestState<RouteAccessResult>>({\n data: null,\n loading: true,\n error: null,\n })\n\n useEffect(() => {\n let disposed = false\n const check = async () => {\n const permissions = runtime.data?.permissions\n if (!runtime.appType || runtime.loading) {\n setState(prev => ({ ...prev, loading: runtime.loading }))\n return\n }\n if (runtime.error && !runtime.data) {\n const snapshot = toRuntimeErrorSnapshot(runtime.error)\n setState({\n data: {\n appType: runtime.appType,\n canAccess: false,\n status: snapshot.status,\n code: snapshot.code,\n message: snapshot.message,\n errorType: snapshot.type,\n payload: snapshot.payload,\n },\n loading: false,\n error: runtime.error,\n })\n return\n }\n if (permissions?.hasFullAccess) {\n setState({\n data: { appType: runtime.appType, canAccess: true, permissions },\n loading: false,\n error: null,\n })\n return\n }\n setState(prev => ({ ...prev, loading: true, error: null }))\n try {\n const response = await runtime.fetchImpl(\n buildServiceUrl(\n runtime.servicePrefix,\n `/openxiangda-api/v1/apps/${encodeURIComponent(\n runtime.appType,\n )}/runtime/routes/check`,\n ),\n {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(input),\n },\n )\n const payload = await readJsonPayload(response)\n const code = payload?.code ?? response.status\n const canAccess = Boolean(payload?.data?.canAccess)\n const errorType = canAccess\n ? undefined\n : classifyRuntimeError(response.status, code)\n const data: RouteAccessResult = {\n ...(payload?.data || {\n appType: runtime.appType,\n canAccess: false,\n }),\n appType: payload?.data?.appType || runtime.appType,\n canAccess,\n status: response.status,\n code,\n message: payload?.message,\n errorType,\n payload,\n }\n if (!disposed) {\n const shouldTreatAsError =\n !response.ok || isServerErrorCode(code)\n setState({\n data,\n loading: false,\n error: shouldTreatAsError\n ? createRuntimeHttpError(\n response,\n payload,\n payload?.message || `Route check failed: ${response.status}`,\n )\n : null,\n })\n }\n } catch (error) {\n if (!disposed) {\n setState({\n data: null,\n loading: false,\n error: normalizeRuntimeError(error),\n })\n }\n }\n }\n void check()\n return () => {\n disposed = true\n }\n }, [\n input.menuCode,\n input.path,\n input.routeCode,\n runtime.appType,\n runtime.data?.permissions,\n runtime.fetchImpl,\n runtime.loading,\n runtime.servicePrefix,\n ])\n\n return {\n ...state,\n canAccess: Boolean(state.data?.canAccess),\n }\n}\n\nexport interface PermissionBoundaryProps extends UseCanAccessRouteInput {\n children: React.ReactNode\n fallback?: React.ReactNode | PermissionBoundaryFallback\n loadingFallback?: React.ReactNode | PermissionBoundaryFallback\n}\n\nexport interface PermissionBoundaryFallbackState {\n access: ReturnType<typeof useCanAccessRoute>\n runtime: ReturnType<typeof useOpenXiangda>\n error: RuntimeRequestError | null\n errorType: RuntimeErrorType\n status?: number\n code?: number | string\n message: string\n}\n\nexport type PermissionBoundaryFallback = (\n state: PermissionBoundaryFallbackState,\n) => React.ReactNode\n\nexport const PermissionBoundary: React.FC<PermissionBoundaryProps> = ({\n children,\n fallback = null,\n loadingFallback = null,\n routeCode,\n menuCode,\n path,\n}) => {\n const runtime = useOpenXiangda()\n const access = useCanAccessRoute({ routeCode, menuCode, path })\n const fallbackState = createPermissionFallbackState(access, runtime)\n if (access.loading) {\n return <>{renderBoundaryFallback(loadingFallback, fallbackState)}</>\n }\n if (!access.canAccess) {\n return <>{renderBoundaryFallback(fallback, fallbackState)}</>\n }\n return <>{children}</>\n}\n\nexport interface RuntimeResolveLoginOptions {\n redirectUri?: string\n loginUrl?: string\n domain?: string\n}\n\nexport interface RuntimeRedirectLoginOptions extends RuntimeResolveLoginOptions {\n replace?: boolean\n}\n\nexport interface RuntimeLogoutOptions extends RuntimeRedirectLoginOptions {\n continueOnError?: boolean\n}\n\nexport const useRuntimeAuth = () => {\n const runtime = useOpenXiangda()\n\n const resolveLoginUrl = useCallback(\n async (options: RuntimeResolveLoginOptions = {}) => {\n const redirectUri = options.redirectUri || getCurrentHref()\n const domain = options.domain || getCurrentHostname()\n const appTenantId = getRecordString(runtime.data?.app, \"tenantId\")\n\n try {\n const statusUrl = withQuery(\n buildServiceUrl(runtime.servicePrefix, \"/api/sso/status\"),\n { domain },\n )\n const statusResponse = await runtime.baseFetchImpl(statusUrl, {\n credentials: \"include\",\n headers: { accept: \"application/json\" },\n })\n const statusPayload = await readJsonPayload(statusResponse)\n const sso = statusPayload?.data || {}\n const enabled = Boolean(sso.enabled)\n const shouldUseSso = Boolean(\n enabled && (sso.forceLogin ?? sso.autoRedirect ?? true),\n )\n if (shouldUseSso) {\n const loginUrlResponse = await runtime.baseFetchImpl(\n withQuery(buildServiceUrl(runtime.servicePrefix, \"/api/sso/login-url\"), {\n domain,\n redirectUri,\n ...(sso.tenantId || appTenantId\n ? { tenantId: String(sso.tenantId || appTenantId) }\n : {}),\n ...(sso.protocol ? { protocol: String(sso.protocol) } : {}),\n }),\n {\n credentials: \"include\",\n headers: { accept: \"application/json\" },\n },\n )\n const loginUrlPayload = await readJsonPayload(loginUrlResponse)\n const loginUrl =\n loginUrlPayload?.data?.loginUrl ||\n loginUrlPayload?.data?.url ||\n loginUrlPayload?.loginUrl ||\n loginUrlPayload?.url\n if (loginUrl) return String(loginUrl)\n }\n } catch {\n // Login resolution must always have a local fallback so logged-out\n // users are not stranded behind a permission state.\n }\n\n const configuredLoginUrl =\n options.loginUrl ||\n getRuntimeEnv(\"OPENXIANGDA_LOGIN_URL\") ||\n getRuntimeEnv(\"VITE_OPENXIANGDA_LOGIN_URL\") ||\n getRuntimeEnv(\"APP_LOGIN_URL\") ||\n getRuntimeEnv(\"VITE_APP_LOGIN_URL\") ||\n getRuntimeEnv(\"VITE_BATH_AUTH_URL\") ||\n getRuntimeEnv(\"BATH_AUTH_URL\")\n if (configuredLoginUrl) {\n return attachCallback(configuredLoginUrl, redirectUri)\n }\n return attachCallback(\"/platform/login\", redirectUri)\n },\n [runtime.baseFetchImpl, runtime.data?.app, runtime.servicePrefix],\n )\n\n const redirectToLogin = useCallback(\n async (options: RuntimeRedirectLoginOptions = {}) => {\n const loginUrl = await resolveLoginUrl(options)\n if (typeof window !== \"undefined\") {\n if (options.replace === false) {\n window.location.assign(loginUrl)\n } else {\n window.location.replace(loginUrl)\n }\n }\n return loginUrl\n },\n [resolveLoginUrl],\n )\n\n const logout = useCallback(async () => {\n const response = await runtime.baseFetchImpl(\n buildServiceUrl(runtime.servicePrefix, \"/api/auth/logout\"),\n {\n method: \"POST\",\n credentials: \"include\",\n headers: { accept: \"application/json\" },\n },\n )\n const payload = await readJsonPayload(response)\n if (isRuntimeEnvelopeFailure(response, payload)) {\n throw createRuntimeHttpError(\n response,\n payload,\n payload?.message || `Logout failed: ${response.status}`,\n )\n }\n runtime.setAccessToken(null)\n return payload\n }, [runtime.baseFetchImpl, runtime.servicePrefix, runtime.setAccessToken])\n\n const logoutAndRedirect = useCallback(\n async (options: RuntimeLogoutOptions = {}) => {\n try {\n await logout()\n } catch (error) {\n if (options.continueOnError === false) throw error\n }\n return redirectToLogin(options)\n },\n [logout, redirectToLogin],\n )\n\n return useMemo(\n () => ({\n logout,\n logoutAndRedirect,\n redirectToLogin,\n resolveLoginUrl,\n }),\n [logout, logoutAndRedirect, redirectToLogin, resolveLoginUrl],\n )\n}\n\nexport interface RuntimeAuthGuardProps extends RuntimeRedirectLoginOptions {\n children: React.ReactNode\n fallback?: React.ReactNode\n disabled?: boolean\n excludedPaths?: string[]\n}\n\nexport const RuntimeAuthGuard: React.FC<RuntimeAuthGuardProps> = ({\n children,\n fallback = null,\n disabled = false,\n excludedPaths = [],\n ...redirectOptions\n}) => {\n const runtime = useOpenXiangda()\n const auth = useRuntimeAuth()\n const redirectedRef = useRef(false)\n const currentPath = getCurrentPathname()\n const excluded = isRuntimeAuthGuardExcluded(\n currentPath,\n runtime.appType,\n excludedPaths,\n )\n const shouldRedirect =\n !disabled &&\n !excluded &&\n !runtime.loading &&\n (runtime.authState.status === \"unauthenticated\" ||\n runtime.error?.type === \"unauthenticated\")\n\n useEffect(() => {\n if (!shouldRedirect || redirectedRef.current) return\n redirectedRef.current = true\n void auth\n .redirectToLogin({\n ...redirectOptions,\n redirectUri: redirectOptions.redirectUri || getCurrentHref(),\n })\n .catch(() => {\n redirectedRef.current = false\n })\n }, [\n auth,\n redirectOptions.domain,\n redirectOptions.loginUrl,\n redirectOptions.redirectUri,\n redirectOptions.replace,\n shouldRedirect,\n ])\n\n if (excluded) return <>{children}</>\n if (shouldRedirect) return <>{fallback}</>\n return <>{children}</>\n}\n\nconst buildServiceUrl = (servicePrefix: string, path: string) => {\n const prefix = servicePrefix.endsWith(\"/\")\n ? servicePrefix.slice(0, -1)\n : servicePrefix\n const suffix = path.startsWith(\"/\") ? path : `/${path}`\n return `${prefix}${suffix}`\n}\n\ninterface CreateAuthorizedFetchOptions {\n appType: string\n baseFetch: typeof fetch\n accessTokenRef: React.MutableRefObject<RuntimeAccessTokenState | null>\n refreshAccessToken: () => Promise<RuntimeAccessTokenState | null>\n markUnauthenticated: (error: unknown) => void\n}\n\nconst createAuthorizedFetch = ({\n appType,\n baseFetch,\n accessTokenRef,\n refreshAccessToken,\n markUnauthenticated,\n}: CreateAuthorizedFetchOptions): typeof fetch =>\n (async (input, init = {}) => {\n const currentTokenState = accessTokenRef.current\n const response = await createAccessTokenFetch(\n baseFetch,\n currentTokenState,\n )(input, init)\n if (\n !shouldAttemptAuthRefresh({\n appType,\n input,\n init,\n tokenState: currentTokenState,\n })\n ) {\n return response\n }\n if (!(await isUnauthenticatedResponse(response))) return response\n\n try {\n const refreshedTokenState = await refreshAccessToken()\n if (!refreshedTokenState) return response\n return await createAccessTokenFetch(\n baseFetch,\n refreshedTokenState,\n )(input, init)\n } catch (error) {\n markUnauthenticated(error)\n return response\n }\n }) as typeof fetch\n\nconst createAccessTokenFetch = (\n baseFetch: typeof fetch,\n accessToken?: RuntimeAccessTokenState | null,\n): typeof fetch => {\n if (!accessToken) return baseFetch\n return ((input, init = {}) => {\n const token = resolveAccessTokenForCurrentRoute(accessToken)\n if (!token) return baseFetch(input, init)\n const headers = new Headers(init.headers || {})\n if (!headers.has(\"authorization\")) {\n headers.set(\"authorization\", `Bearer ${token}`)\n }\n return baseFetch(input, {\n ...init,\n headers,\n })\n }) as typeof fetch\n}\n\nconst createAccessTokenState = (\n accessToken?: string | null,\n options: RuntimeAccessTokenOptions = {},\n): RuntimeAccessTokenState | null =>\n accessToken\n ? {\n token: accessToken,\n scope: options.scope || \"default\",\n path: options.path || null,\n expiresAt: options.expiresAt,\n }\n : null\n\nconst shouldAttemptAuthRefresh = ({\n appType,\n input,\n init,\n tokenState,\n}: {\n appType: string\n input: Parameters<typeof fetch>[0]\n init?: Parameters<typeof fetch>[1]\n tokenState?: RuntimeAccessTokenState | null\n}) => {\n if (!appType) return false\n if (tokenState?.scope === \"public\") return false\n if (isPublicRoutePath(normalizeRoutePath(getCurrentPathname()))) return false\n if (hasAuthorizationHeader(init?.headers)) return false\n const pathname = getFetchInputPathname(input)\n if (!pathname) return false\n if (/\\/openxiangda-api\\/v1\\/apps\\/[^/]+\\/auth(?:\\/|$)/.test(pathname)) {\n return false\n }\n if (/\\/openxiangda-api\\/v1\\/apps\\/[^/]+\\/public\\/session(?:\\/|$)/.test(pathname)) {\n return false\n }\n if (/\\/openxiangda-api\\/v1\\/auth(?:\\/|$)/.test(pathname)) return false\n if (/\\/api\\/auth\\/logout(?:\\/|$)/.test(pathname)) return false\n if (/\\/api\\/sso(?:\\/|$)/.test(pathname)) return false\n return true\n}\n\nconst isUnauthenticatedResponse = async (response: Response) => {\n if (response.status === 401) return true\n const payload = await readJsonPayload(response.clone())\n const code = getRecordValue(payload, \"code\")\n return classifyRuntimeError(response.status, code as number | string | undefined) === \"unauthenticated\"\n}\n\nconst hasAuthorizationHeader = (headers?: HeadersInit) => {\n if (!headers) return false\n const normalized = new Headers(headers)\n return normalized.has(\"authorization\")\n}\n\nconst getFetchInputPathname = (input: Parameters<typeof fetch>[0]) => {\n const text =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : typeof Request !== \"undefined\" && input instanceof Request\n ? input.url\n : String(input || \"\")\n if (!text) return \"\"\n try {\n const base =\n typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\"\n return new URL(text, base).pathname\n } catch {\n return text.split(/[?#]/, 1)[0] || \"\"\n }\n}\n\nconst resolveAccessTokenForCurrentRoute = (\n accessToken: RuntimeAccessTokenState,\n) => {\n if (accessToken.scope !== \"public\") return accessToken.token\n const scopedPath = normalizeRoutePath(accessToken.path)\n const currentPath = normalizeRoutePath(getCurrentPathname())\n if (!scopedPath) {\n return isPublicRoutePath(currentPath) ? accessToken.token : null\n }\n if (\n currentPath === scopedPath ||\n (isPublicRoutePath(currentPath) && currentPath.startsWith(`${scopedPath}/`))\n ) {\n return accessToken.token\n }\n return null\n}\n\nconst normalizeRoutePath = (path?: string | null) => {\n const text = String(path || \"\").trim()\n if (!text) return \"\"\n try {\n const base =\n typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\"\n return new URL(text, base).pathname.replace(/\\/+$/, \"\") || \"/\"\n } catch {\n return text.split(/[?#]/, 1)[0].replace(/\\/+$/, \"\") || \"/\"\n }\n}\n\nconst isPublicRoutePath = (path: string) => /\\/public(?:\\/|$)/.test(path)\n\nconst readJsonPayload = async (response: Response) => {\n try {\n return await response.json()\n } catch {\n return null\n }\n}\n\nconst createRuntimeHttpError = (\n response: Response,\n payload: unknown,\n fallbackMessage: string,\n): RuntimeRequestError =>\n createRuntimeError({\n type: classifyRuntimeError(\n response.status,\n getRecordValue(payload, \"code\") as number | string | undefined,\n ),\n status: response.status,\n code: getRecordValue(payload, \"code\") as number | string | undefined,\n message:\n (getRecordValue(payload, \"message\") as string | undefined) ||\n fallbackMessage,\n payload,\n })\n\nconst createRuntimeError = (\n snapshot: RuntimeErrorSnapshot,\n): RuntimeRequestError =>\n new RuntimeHttpError({\n ...snapshot,\n type: snapshot.type || \"unknown\",\n message: snapshot.message || \"Runtime request failed\",\n })\n\nconst normalizeRuntimeError = (error: unknown): RuntimeRequestError => {\n if (error instanceof RuntimeHttpError) return error\n if (error instanceof Error) {\n const runtimeError = error as RuntimeRequestError\n runtimeError.type = runtimeError.type || classifyRuntimeError(runtimeError.status, runtimeError.code)\n return runtimeError\n }\n return createRuntimeError({\n type: \"unknown\",\n message: String(error),\n })\n}\n\nconst toRuntimeErrorSnapshot = (\n error: RuntimeRequestError,\n): RuntimeErrorSnapshot => ({\n type: error.type || classifyRuntimeError(error.status, error.code),\n status: error.status,\n code: error.code,\n message: error.message || \"Runtime request failed\",\n payload: error.payload,\n})\n\nconst classifyRuntimeError = (\n status?: number,\n code?: number | string,\n): RuntimeErrorType => {\n const normalizedCode = typeof code === \"string\" ? Number(code) : code\n if (status === 401 || normalizedCode === 401) return \"unauthenticated\"\n if (status === 403 || normalizedCode === 403) return \"forbidden\"\n if (typeof code === \"string\") {\n const normalizedText = code.toUpperCase()\n if (\n normalizedText.includes(\"DENIED\") ||\n normalizedText.includes(\"FORBIDDEN\")\n ) {\n return \"forbidden\"\n }\n if (\n normalizedText.includes(\"UNAUTH\") ||\n normalizedText.includes(\"LOGIN\")\n ) {\n return \"unauthenticated\"\n }\n }\n if (!status && !normalizedCode) return \"network\"\n return \"unknown\"\n}\n\nconst createPermissionFallbackState = (\n access: ReturnType<typeof useCanAccessRoute>,\n runtime: ReturnType<typeof useOpenXiangda>,\n): PermissionBoundaryFallbackState => {\n const error = access.error || runtime.error\n const accessData = access.data\n const errorType =\n accessData?.errorType ||\n error?.type ||\n (!access.canAccess ? \"forbidden\" : \"unknown\")\n return {\n access,\n runtime,\n error,\n errorType,\n status: accessData?.status || error?.status,\n code: accessData?.code || error?.code,\n message:\n accessData?.message ||\n error?.message ||\n (errorType === \"unauthenticated\"\n ? \"当前账号尚未登录\"\n : \"当前账号没有访问权限\"),\n }\n}\n\nconst renderBoundaryFallback = (\n fallback: React.ReactNode | PermissionBoundaryFallback,\n state: PermissionBoundaryFallbackState,\n) => (typeof fallback === \"function\" ? fallback(state) : fallback)\n\nconst withQuery = (\n url: string,\n params: Record<string, string | number | boolean | undefined>,\n) => {\n const query = new URLSearchParams()\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === \"\") return\n query.set(key, String(value))\n })\n const serialized = query.toString()\n if (!serialized) return url\n return `${url}${url.includes(\"?\") ? \"&\" : \"?\"}${serialized}`\n}\n\nconst attachCallback = (loginUrl: string, callback: string) => {\n if (!callback) return loginUrl\n try {\n const base =\n typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\"\n const parsed = new URL(loginUrl, base)\n if (!parsed.searchParams.has(\"callback\") && !parsed.searchParams.has(\"redirectUri\")) {\n parsed.searchParams.set(\"callback\", callback)\n }\n if (loginUrl.startsWith(\"http://\") || loginUrl.startsWith(\"https://\")) {\n return parsed.toString()\n }\n return `${parsed.pathname}${parsed.search}${parsed.hash}`\n } catch {\n const separator = loginUrl.includes(\"?\") ? \"&\" : \"?\"\n return `${loginUrl}${separator}callback=${encodeURIComponent(callback)}`\n }\n}\n\nconst getCurrentHref = () =>\n typeof window === \"undefined\" ? \"\" : window.location.href\n\nconst getCurrentPathname = () =>\n typeof window === \"undefined\" ? \"\" : window.location.pathname\n\nconst getCurrentHostname = () =>\n typeof window === \"undefined\" ? \"\" : window.location.hostname\n\nconst getRuntimeEnv = (key: string) => {\n const env =\n typeof process !== \"undefined\"\n ? (process as unknown as { env?: Record<string, string | undefined> }).env\n : undefined\n return env?.[key]\n}\n\nconst getRecordValue = (value: unknown, key: string) => {\n if (!value || typeof value !== \"object\") return undefined\n return (value as Record<string, unknown>)[key]\n}\n\nconst toRuntimeRecord = (value: unknown): Record<string, unknown> => {\n return value && typeof value === \"object\"\n ? { ...(value as Record<string, unknown>) }\n : {}\n}\n\nconst toStringValue = (value: unknown): string => {\n if (value === undefined || value === null) return \"\"\n return String(value)\n}\n\nconst parseBrowserQuery = (): Record<string, PageQueryValue> => {\n if (typeof window === \"undefined\") return {}\n const query: Record<string, PageQueryValue> = {}\n const params = new URLSearchParams(window.location.search)\n params.forEach((value, key) => {\n const currentValue = query[key]\n if (currentValue === undefined) {\n query[key] = value\n return\n }\n query[key] = Array.isArray(currentValue)\n ? [...currentValue, value]\n : [currentValue, value]\n })\n return query\n}\n\nconst buildBrowserRouteInfo = (\n route?: Partial<PageRouteInfo>,\n): PageRouteInfo => {\n const pathname =\n route?.pathname ||\n (typeof window !== \"undefined\" ? window.location.pathname : \"\")\n const search = typeof window !== \"undefined\" ? window.location.search : \"\"\n const hash =\n route?.hash || (typeof window !== \"undefined\" ? window.location.hash : \"\")\n return {\n pathname,\n fullPath:\n route?.fullPath ||\n (typeof window !== \"undefined\" ? `${pathname}${search}${hash}` : pathname),\n params: route?.params || {},\n query: route?.query || parseBrowserQuery(),\n hash,\n }\n}\n\nconst isSuccessCode = (code: unknown) => {\n if (code === undefined || code === null || code === \"\") return true\n const normalized = Number(code)\n return Number.isFinite(normalized)\n ? normalized === 0 || (normalized >= 200 && normalized < 300)\n : false\n}\n\nconst isRuntimeEnvelopeFailure = (response: Response, payload: unknown) => {\n const code = getRecordValue(payload, \"code\")\n const success = getRecordValue(payload, \"success\")\n return !response.ok || success === false || !isSuccessCode(code)\n}\n\nconst isServerErrorCode = (code: unknown) => {\n const normalized = Number(code)\n return Number.isFinite(normalized) && normalized >= 500\n}\n\nconst getRecordString = (value: unknown, key: string) => {\n const result = getRecordValue(value, key)\n return typeof result === \"string\" ? result : undefined\n}\n\nconst getRecordNumber = (value: unknown, key: string) => {\n const result = getRecordValue(value, key)\n const numberValue = Number(result)\n return Number.isFinite(numberValue) ? numberValue : undefined\n}\n\nconst unwrapRuntimePayload = (payload: unknown) => {\n if (!payload || typeof payload !== \"object\") return payload\n const record = payload as Record<string, unknown>\n return \"data\" in record ? record.data : payload\n}\n\nconst isAuthenticatedBootstrap = (value: unknown) => {\n if (!value || typeof value !== \"object\") return false\n const user = toRuntimeRecord(getRecordValue(value, \"user\"))\n if (!getRecordValue(user, \"id\") && !getRecordValue(user, \"username\")) {\n return false\n }\n return !getRecordValue(user, \"publicAccess\")\n}\n\nconst isRuntimeAuthGuardExcluded = (\n path: string,\n appType: string,\n excludedPaths: string[],\n) => {\n const normalizedPath = normalizeRoutePath(path)\n if (isPublicRoutePath(normalizedPath)) return true\n const loginPath = normalizeRoutePath(`/view/${encodeURIComponent(appType)}/login`)\n if (appType && normalizedPath === loginPath) return true\n return excludedPaths\n .map(item => normalizeRoutePath(item))\n .some(item => item && normalizedPath === item)\n}\n\nconst resolveAppTypeFromLocation = () => {\n if (typeof window === \"undefined\") return \"\"\n const segments = window.location.pathname.split(\"/\").filter(Boolean)\n const viewIndex = segments[0] === \"view\" ? 1 : 0\n if (segments[viewIndex] === \"submit\") return segments[viewIndex + 1] || \"\"\n if (segments[viewIndex] === \"preview\") return segments[viewIndex + 1] || \"\"\n return segments[viewIndex] || \"\"\n}\n\nexport {\n LoginPage,\n useAuth,\n useLoginMethods,\n} from \"./auth\"\nexport type {\n LoginPageProps,\n UseAuthOptions,\n UseLoginMethodsState,\n} from \"./auth\"\nexport {\n AuthClientError,\n createAuthClient,\n} from \"../core/auth\"\nexport type {\n AppAuthClient,\n AuthMethod,\n AuthMethodType,\n AuthTokenData,\n DingTalkLoginInput,\n GuestLoginInput,\n LoginMethodsResult,\n PasswordLoginInput,\n PhoneCodeInput,\n PhoneCodeLoginInput,\n PhoneCodeRegisterInput,\n PhoneCodeSendResult,\n RefreshInput,\n ResolveLoginUrlInput,\n SsoLoginUrlInput,\n SsoLoginUrlResult,\n} from \"../core/auth\"\n","export interface TransientFetchRetryOptions {\n enabled?: boolean;\n retries?: number;\n baseDelayMs?: number;\n}\n\nconst sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\nconst isTransientFetchError = (error: unknown) => {\n const anyError = error as any;\n const message = String(anyError?.message || error || \"\").toLowerCase();\n const causeCode = String(anyError?.cause?.code || \"\").toLowerCase();\n return (\n causeCode === \"und_err_connect_timeout\" ||\n message.includes(\"und_err_connect_timeout\") ||\n message.includes(\"connect_timeout\") ||\n message.includes(\"econnreset\") ||\n message.includes(\"socket hang up\") ||\n message.includes(\"network socket disconnected\") ||\n message.includes(\"fetch failed\")\n );\n};\n\nexport const fetchWithTransientRetry = async (\n fetchImpl: typeof fetch,\n input: Parameters<typeof fetch>[0],\n init?: Parameters<typeof fetch>[1],\n options: TransientFetchRetryOptions = {},\n): Promise<Response> => {\n if (!options.enabled) {\n return fetchImpl(input, init);\n }\n\n const retries = Number.isFinite(Number(options.retries))\n ? Number(options.retries)\n : 2;\n const baseDelayMs = Number.isFinite(Number(options.baseDelayMs))\n ? Number(options.baseDelayMs)\n : 250;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n try {\n return await fetchImpl(input, init);\n } catch (error) {\n lastError = error;\n if (attempt >= retries || !isTransientFetchError(error)) {\n throw error;\n }\n await sleep(Math.min(baseDelayMs * Math.pow(2, attempt), 2000));\n }\n }\n\n throw lastError;\n};\n\nexport const createBoundFetch = (fetchImpl?: typeof fetch): typeof fetch => {\n const baseFetch = fetchImpl || globalThis.fetch;\n return ((input, init) => baseFetch.call(globalThis, input, init)) as typeof fetch;\n};\n","import type {\n PageApiResponse,\n PageBinaryResponse,\n PageBridgeApi,\n PageContext,\n PageInfo,\n PageRequestOptions,\n} from \"../core/types\";\nimport { createBoundFetch, fetchWithTransientRetry } from \"../core/fetch\";\n\nexport type RuntimeCssIsolation = \"none\" | \"namespace\" | \"shadow\";\n\nexport interface RuntimeHostBootstrap {\n app: PageContext[\"app\"];\n page: PageInfo;\n user: PageContext[\"user\"];\n asset?: {\n protocolVersion?: string;\n version?: string;\n buildId?: string;\n entryUrl?: string;\n cssAssets?: string[];\n jsAssets?: string[];\n manifestUrl?: string;\n [key: string]: unknown;\n };\n runtimeAssets?: {\n entryUrl?: string;\n cssUrls?: string[];\n jsUrls?: string[];\n cssIsolation?: RuntimeCssIsolation | string;\n [key: string]: unknown;\n };\n env?: Record<string, unknown>;\n permissions?: Partial<PageContext[\"permissions\"]>;\n sdk?: PageContext[\"sdk\"];\n}\n\nexport type BrowserRuntimeRouteMode =\n | \"custom-page\"\n | \"builtin-route\"\n | \"legacy-fallback\"\n | \"not-found\";\n\nexport type BrowserRuntimeRouteKind =\n | \"custom-page\"\n | \"legacy-workbench\"\n | \"work-center\"\n | \"form-submit\"\n | \"process-submit\"\n | \"form-preview\"\n | \"form-detail\"\n | \"process-detail\"\n | \"data-manage-list\"\n | \"file-preview\"\n | \"unknown\";\n\nexport interface BrowserRuntimeRouteResolution {\n appType: string;\n path: string;\n search: string;\n kind: BrowserRuntimeRouteKind;\n mode: BrowserRuntimeRouteMode;\n params: Record<string, string>;\n query: Record<string, string | string[]>;\n runtime: Record<string, unknown>;\n fallback?: {\n legacyRoute: boolean;\n reason: string;\n };\n message?: string;\n}\n\nexport interface BrowserRuntimeHostOptions {\n servicePrefix?: string;\n fetchImpl?: typeof fetch;\n message?: Partial<PageContext[\"ui\"][\"message\"]>;\n modal?: Partial<PageContext[\"ui\"][\"modal\"]>;\n navigation?: Partial<PageContext[\"navigation\"]>;\n route?: Partial<PageContext[\"route\"]>;\n}\n\nexport interface BrowserRuntimeBootstrapOptions {\n appType: string;\n pageKey: string;\n servicePrefix?: string;\n bootstrapPath?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport interface BrowserRuntimeRouteResolveOptions {\n appType: string;\n path?: string;\n search?: string;\n servicePrefix?: string;\n resolvePath?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport interface LoadedRuntimeAssets {\n entryUrl: string;\n cssUrls: string[];\n jsUrls: string[];\n cssIsolation: RuntimeCssIsolation;\n}\n\nexport interface CustomPageModule {\n mount?: (el: HTMLElement, context: PageContext) => void | Promise<void>;\n update?: (\n el: HTMLElement,\n nextContext: PageContext,\n prevContext?: PageContext,\n ) => void | Promise<void>;\n unmount?: (el?: HTMLElement, context?: PageContext) => void | Promise<void>;\n default?: CustomPageModule;\n}\n\nexport interface RuntimeMountOptions {\n container: HTMLElement;\n module: CustomPageModule;\n context: PageContext;\n assets?: Partial<LoadedRuntimeAssets>;\n}\n\nexport interface BrowserRuntimeMountOptions extends BrowserRuntimeHostOptions {\n container: HTMLElement;\n appType: string;\n pageKey: string;\n bootstrapPath?: string;\n moduleLoader?: (url: string) => Promise<unknown>;\n}\n\nexport interface BrowserRuntimeMountResult {\n bootstrap: RuntimeHostBootstrap;\n assets: LoadedRuntimeAssets;\n context: PageContext;\n module: CustomPageModule;\n cleanup: () => Promise<void>;\n}\n\nconst NAMESPACE_ROOT_CLASS = \"sy-app-workspace\";\nconst defaultModuleLoader = (url: string) => import(/* @vite-ignore */ url);\n\nconst trimTrailingSlash = (value: string) => value.replace(/\\/+$/, \"\");\n\nconst getDefaultServicePrefix = () =>\n typeof window !== \"undefined\"\n ? trimTrailingSlash((window as any).__OPENXIANGDA_SERVICE_PREFIX__ || \"/service\")\n : \"/service\";\n\nconst joinServicePath = (servicePrefix: string, path: string) => {\n if (/^https?:\\/\\//i.test(path)) return path;\n const normalizedPrefix = trimTrailingSlash(servicePrefix || \"/service\");\n if (path.startsWith(normalizedPrefix)) return path;\n return `${normalizedPrefix}${path.startsWith(\"/\") ? path : `/${path}`}`;\n};\n\nconst appendQuery = (url: string, query?: string) => {\n if (!query) return url;\n return `${url}${url.includes(\"?\") ? \"&\" : \"?\"}${query}`;\n};\n\nconst normalizeMethod = (method?: string) => {\n const value = String(method || \"get\").toUpperCase();\n return [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"].includes(value)\n ? value\n : \"GET\";\n};\n\nconst shouldRetryTransportRequest = (payload: PageRequestOptions | any) => {\n const method = normalizeMethod(payload?.method);\n if (method === \"GET\") return true;\n const path = String(payload?.path || \"\").split(\"?\")[0];\n return method === \"POST\" && path === \"/workflow/capabilities/resolve\";\n};\n\nconst normalizeCssIsolation = (value: unknown): RuntimeCssIsolation => {\n if (value === \"namespace\" || value === \"shadow\" || value === \"none\") {\n return value;\n }\n return \"none\";\n};\n\nconst normalizeEnvelopeCode = (value: unknown, fallback: number): number | string => {\n if (value === undefined || value === null || value === \"\") return fallback;\n const normalized = Number(value);\n return Number.isFinite(normalized) ? normalized : String(value);\n};\n\nconst isSuccessCode = (value: unknown) => {\n if (value === undefined || value === null || value === \"\") return true;\n const normalized = Number(value);\n return Number.isFinite(normalized)\n ? normalized === 0 || (normalized >= 200 && normalized < 300)\n : false;\n};\n\nconst parseJsonResponse = async <TResult, TRaw = TResult>(\n response: Response,\n): Promise<PageApiResponse<TResult, TRaw>> => {\n const payload = await response.json().catch(() => null);\n if (!response.ok) {\n const message =\n payload && typeof payload === \"object\"\n ? payload.message || payload.error || response.statusText\n : response.statusText;\n throw new Error(message || \"请求失败\");\n }\n\n if (payload && typeof payload === \"object\" && \"code\" in payload) {\n const code = normalizeEnvelopeCode(payload.code, response.status);\n return {\n code,\n success: payload.success !== false && isSuccessCode(code),\n message: payload.message,\n result: (payload.result ?? payload.data ?? null) as TResult,\n data: payload.data as TRaw,\n raw: payload,\n };\n }\n\n return {\n code: response.status,\n success: response.ok,\n message: response.statusText,\n result: payload as TResult,\n data: payload as TRaw,\n raw: payload,\n };\n};\n\nexport const createBrowserPageBridge = (\n options: BrowserRuntimeHostOptions = {},\n): PageBridgeApi => {\n const servicePrefix = options.servicePrefix || getDefaultServicePrefix();\n const fetchImpl = createBoundFetch(options.fetchImpl);\n\n const request = async <TResult = unknown, TRaw = TResult>(\n payload: PageRequestOptions | any,\n ): Promise<PageApiResponse<TResult, TRaw>> => {\n if (!payload?.path) {\n throw new Error(\"transport.request 需要 path\");\n }\n const url = appendQuery(joinServicePath(servicePrefix, payload.path), payload.query);\n const headers = new Headers(payload.headers as HeadersInit);\n let body: BodyInit | undefined;\n if (payload.body !== undefined) {\n if (payload.body instanceof FormData) {\n body = payload.body;\n } else {\n headers.set(\"Content-Type\", headers.get(\"Content-Type\") || \"application/json\");\n body = JSON.stringify(payload.body);\n }\n }\n const response = await fetchWithTransientRetry(fetchImpl, url, {\n method: normalizeMethod(payload.method),\n headers,\n body,\n credentials: \"include\",\n }, {\n enabled: shouldRetryTransportRequest(payload),\n });\n return parseJsonResponse<TResult, TRaw>(response);\n };\n\n const download = async (payload: PageRequestOptions | any): Promise<PageBinaryResponse> => {\n if (!payload?.path) {\n throw new Error(\"transport.download 需要 path\");\n }\n const url = appendQuery(joinServicePath(servicePrefix, payload.path), payload.query);\n const headers = new Headers(payload.headers as HeadersInit);\n let body: BodyInit | undefined;\n if (payload.body !== undefined) {\n if (payload.body instanceof FormData) {\n body = payload.body;\n } else {\n headers.set(\"Content-Type\", headers.get(\"Content-Type\") || \"application/json\");\n body = JSON.stringify(payload.body);\n }\n }\n const response = await fetchImpl(url, {\n method: normalizeMethod(payload.method),\n headers,\n body,\n credentials: \"include\",\n });\n if (!response.ok) {\n throw new Error(response.statusText || \"下载失败\");\n }\n return {\n blob: await response.blob(),\n contentType: response.headers.get(\"content-type\") || undefined,\n fileName: response.headers.get(\"content-disposition\") || undefined,\n headers: Object.fromEntries(response.headers.entries()),\n };\n };\n\n return {\n invoke: async <T = unknown>(method: string, payload?: unknown): Promise<T> => {\n if (method === \"transport.request\") return (await request(payload)) as T;\n if (method === \"transport.download\") return (await download(payload)) as T;\n throw new Error(`不支持的 bridge 方法: ${method}`);\n },\n };\n};\n\nexport const createBrowserPageContext = (\n bootstrap: RuntimeHostBootstrap,\n options: BrowserRuntimeHostOptions = {},\n): PageContext => {\n const route = {\n pathname:\n options.route?.pathname ||\n (typeof window !== \"undefined\" ? window.location.pathname : \"\"),\n fullPath:\n options.route?.fullPath ||\n (typeof window !== \"undefined\"\n ? `${window.location.pathname}${window.location.search}${window.location.hash}`\n : \"\"),\n params: options.route?.params || {},\n query: options.route?.query || {},\n hash:\n options.route?.hash ||\n (typeof window !== \"undefined\" ? window.location.hash : \"\"),\n };\n\n return {\n protocolVersion: bootstrap.asset?.protocolVersion || \"1.0\",\n app: bootstrap.app,\n page: {\n ...bootstrap.page,\n version: bootstrap.asset?.version || bootstrap.page.version,\n buildId: bootstrap.asset?.buildId || bootstrap.page.buildId,\n },\n user: bootstrap.user,\n route,\n env: bootstrap.env || {},\n permissions: {\n canView: bootstrap.permissions?.canView !== false,\n hasFullAccess: bootstrap.permissions?.hasFullAccess === true,\n ...(bootstrap.permissions || {}),\n },\n capabilities: Array.from(\n new Set([\n \"navigation\",\n \"ui.message\",\n \"ui.modal\",\n \"transport.request\",\n \"transport.download\",\n ...(bootstrap.sdk?.supportedBridgeMethods || []),\n ]),\n ),\n ui: {\n message: {\n success: text => options.message?.success?.(text),\n error: text => options.message?.error?.(text),\n warning: text => options.message?.warning?.(text),\n info: text => options.message?.info?.(text),\n loading: text => options.message?.loading?.(text) || (() => undefined),\n },\n modal: {\n confirm: input => options.modal?.confirm?.(input) || Promise.resolve(false),\n },\n },\n navigation: {\n pushPage: (pageKey, query) => options.navigation?.pushPage?.(pageKey, query),\n replacePage: (pageKey, query) =>\n options.navigation?.replacePage?.(pageKey, query),\n pushRoute: (routeValue, query) =>\n options.navigation?.pushRoute?.(routeValue, query),\n replaceRoute: (routeValue, query) =>\n options.navigation?.replaceRoute?.(routeValue, query),\n updateQuery: query => options.navigation?.updateQuery?.(query),\n setHash: hash => options.navigation?.setHash?.(hash),\n back: () => options.navigation?.back?.(),\n },\n bridge: createBrowserPageBridge(options),\n sdk: {\n ...bootstrap.sdk,\n supportedBridgeMethods: [\"transport.request\", \"transport.download\"],\n },\n };\n};\n\nexport const resolveRuntimeAssets = async (\n bootstrap: RuntimeHostBootstrap,\n fetchImpl: typeof fetch = fetch,\n): Promise<LoadedRuntimeAssets> => {\n const boundFetch = createBoundFetch(fetchImpl);\n const fallback: LoadedRuntimeAssets = {\n entryUrl: bootstrap.runtimeAssets?.entryUrl || bootstrap.asset?.entryUrl || \"\",\n cssUrls: bootstrap.runtimeAssets?.cssUrls || bootstrap.asset?.cssAssets || [],\n jsUrls: bootstrap.runtimeAssets?.jsUrls || bootstrap.asset?.jsAssets || [],\n cssIsolation: normalizeCssIsolation(\n bootstrap.runtimeAssets?.cssIsolation ||\n bootstrap.page.capabilities?.cssIsolation,\n ),\n };\n\n if (bootstrap.runtimeAssets?.entryUrl || !bootstrap.asset?.manifestUrl) {\n return fallback;\n }\n\n try {\n const response = await boundFetch(bootstrap.asset.manifestUrl, {\n credentials: \"omit\",\n });\n if (!response.ok) return fallback;\n const manifest = await response.json();\n const base = bootstrap.asset.manifestUrl;\n const resolveUrl = (value: string) => new URL(value, base).toString();\n return {\n entryUrl: manifest?.entry?.url\n ? resolveUrl(manifest.entry.url)\n : fallback.entryUrl,\n cssUrls: Array.isArray(manifest?.assets?.css)\n ? manifest.assets.css.map(resolveUrl)\n : fallback.cssUrls,\n jsUrls: Array.isArray(manifest?.assets?.js)\n ? manifest.assets.js.map(resolveUrl)\n : fallback.jsUrls,\n cssIsolation: normalizeCssIsolation(\n manifest?.style?.isolation || fallback.cssIsolation,\n ),\n };\n } catch {\n return fallback;\n }\n};\n\nexport const fetchBrowserRuntimeBootstrap = async ({\n appType,\n bootstrapPath,\n fetchImpl = fetch,\n pageKey,\n servicePrefix,\n}: BrowserRuntimeBootstrapOptions): Promise<RuntimeHostBootstrap> => {\n if (!appType) {\n throw new Error(\"appType 缺失\");\n }\n if (!pageKey) {\n throw new Error(\"pageKey 缺失\");\n }\n const path =\n bootstrapPath ||\n `/openxiangda-api/v1/apps/${encodeURIComponent(\n appType,\n )}/pages/${encodeURIComponent(pageKey)}/bootstrap`;\n const boundFetch = createBoundFetch(fetchImpl);\n const response = await boundFetch(\n joinServicePath(servicePrefix || getDefaultServicePrefix(), path),\n {\n method: \"GET\",\n credentials: \"include\",\n },\n );\n const payload = await response.json().catch(() => null);\n if (!response.ok) {\n throw new Error(payload?.message || response.statusText || \"获取页面运行时失败\");\n }\n if (\n payload &&\n typeof payload === \"object\" &&\n (\"code\" in payload || \"success\" in payload)\n ) {\n if (payload.success === false || (payload.code && Number(payload.code) !== 200)) {\n throw new Error(payload.message || \"获取页面运行时失败\");\n }\n return (payload.data || {}) as RuntimeHostBootstrap;\n }\n return (payload || {}) as RuntimeHostBootstrap;\n};\n\nexport const resolveBrowserRuntimeRoute = async ({\n appType,\n fetchImpl = fetch,\n path,\n resolvePath,\n search,\n servicePrefix,\n}: BrowserRuntimeRouteResolveOptions): Promise<BrowserRuntimeRouteResolution> => {\n if (!appType) {\n throw new Error(\"appType 缺失\");\n }\n const currentPath =\n path ||\n (typeof window !== \"undefined\" ? window.location.pathname : \"/\");\n const currentSearch =\n search !== undefined\n ? search\n : typeof window !== \"undefined\"\n ? window.location.search\n : \"\";\n const endpoint =\n resolvePath ||\n `/openxiangda-api/v1/apps/${encodeURIComponent(\n appType,\n )}/runtime/routes/resolve`;\n const boundFetch = createBoundFetch(fetchImpl);\n const response = await boundFetch(\n joinServicePath(servicePrefix || getDefaultServicePrefix(), endpoint),\n {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path: currentPath,\n search: currentSearch,\n }),\n },\n );\n const parsed = await parseJsonResponse<BrowserRuntimeRouteResolution>(response);\n if (!parsed.success || !parsed.result) {\n throw new Error(parsed.message || \"解析运行时路由失败\");\n }\n return parsed.result;\n};\n\nexport const loadRuntimeScriptModules = async (\n jsUrls: string[] = [],\n moduleLoader: (url: string) => Promise<unknown> = defaultModuleLoader,\n): Promise<void> => {\n const urls = Array.from(\n new Set(jsUrls.map(url => String(url || \"\").trim()).filter(Boolean)),\n );\n for (const url of urls) {\n await moduleLoader(url);\n }\n};\n\nexport const loadCustomPageModule = async (\n entryUrl: string,\n moduleLoader: (url: string) => Promise<unknown> = defaultModuleLoader,\n jsUrls: string[] = [],\n): Promise<CustomPageModule> => {\n if (!entryUrl) {\n throw new Error(\"代码页面缺少 entryUrl\");\n }\n await loadRuntimeScriptModules(\n jsUrls.filter(url => url && url !== entryUrl),\n moduleLoader,\n );\n const loaded = (await moduleLoader(entryUrl)) as CustomPageModule;\n return loaded?.default && (loaded.default.mount || loaded.default.unmount)\n ? { ...loaded.default, ...loaded }\n : loaded || {};\n};\n\nexport const mountCustomPageRuntime = async ({\n assets,\n container,\n context,\n module,\n}: RuntimeMountOptions): Promise<() => Promise<void>> => {\n const cssIsolation = normalizeCssIsolation(assets?.cssIsolation);\n const mountedLinks: HTMLLinkElement[] = [];\n container.innerHTML = \"\";\n container.classList.toggle(NAMESPACE_ROOT_CLASS, cssIsolation === \"namespace\");\n\n (assets?.cssUrls || []).forEach(href => {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = href;\n link.setAttribute(\"data-openxiangda-runtime-style\", href);\n document.head.appendChild(link);\n mountedLinks.push(link);\n });\n\n await module.mount?.(container, context);\n\n return async () => {\n await module.unmount?.(container, context);\n mountedLinks.forEach(link => link.remove());\n container.classList.remove(NAMESPACE_ROOT_CLASS);\n container.innerHTML = \"\";\n };\n};\n\nexport const mountBrowserPageRuntime = async (\n options: BrowserRuntimeMountOptions,\n): Promise<BrowserRuntimeMountResult> => {\n const bootstrap = await fetchBrowserRuntimeBootstrap({\n appType: options.appType,\n pageKey: options.pageKey,\n bootstrapPath: options.bootstrapPath,\n fetchImpl: options.fetchImpl,\n servicePrefix: options.servicePrefix,\n });\n if (bootstrap.permissions?.canView === false) {\n throw new Error(String(bootstrap.permissions.message || \"您没有权限访问该页面\"));\n }\n const assets = await resolveRuntimeAssets(bootstrap, options.fetchImpl || fetch);\n if (!assets.entryUrl) {\n throw new Error(\"代码页面缺少 entryUrl\");\n }\n const context = createBrowserPageContext(bootstrap, options);\n const module = await loadCustomPageModule(\n assets.entryUrl,\n options.moduleLoader,\n assets.jsUrls,\n );\n const cleanup = await mountCustomPageRuntime({\n assets,\n container: options.container,\n context,\n module,\n });\n return {\n bootstrap,\n assets,\n context,\n module,\n cleanup,\n };\n};\n","import React, {\n type CSSProperties,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\"\nimport {\n Alert,\n Button,\n Card,\n Empty,\n Form,\n Input,\n Space,\n Tabs,\n Typography,\n} from \"antd\"\nimport {\n LoginOutlined,\n MobileOutlined,\n QrcodeOutlined,\n SafetyCertificateOutlined,\n UserOutlined,\n} from \"@ant-design/icons\"\nimport {\n type AppAuthClient,\n type AuthChallengePayload,\n type AuthClientOptions,\n type AuthMethod,\n type AuthTokenData,\n createAuthClient,\n getAuthErrorExtra,\n getAuthErrorReason,\n isAuthChallengeRequired,\n type LoginMethodsResult,\n} from \"../core/auth\"\nimport { useOpenXiangda } from \"./openxiangdaProvider\"\n\nexport interface UseAuthOptions extends Partial<AuthClientOptions> {}\n\nexport interface UseLoginMethodsState {\n data: LoginMethodsResult | null\n methods: AuthMethod[]\n loading: boolean\n error: Error | null\n reload: () => Promise<void>\n}\n\nexport interface LoginPageProps extends UseAuthOptions {\n title?: React.ReactNode\n subtitle?: React.ReactNode\n className?: string\n style?: CSSProperties\n defaultMethod?: \"password\" | \"phone_code\"\n redirectUrl?: string\n redirectOnSuccess?: boolean\n onSuccess?: (data: AuthTokenData) => void | Promise<void>\n}\n\ninterface PasswordFormValues {\n challengeAnswer?: string\n username: string\n password: string\n}\n\ninterface PhoneCodeFormValues {\n phone: string\n code: string\n}\n\nexport const useAuth = (options: UseAuthOptions = {}) => {\n const runtime = useOpenXiangda()\n const client = useMemo(\n () =>\n createAuthClient({\n appType: options.appType || runtime.appType,\n servicePrefix: options.servicePrefix || runtime.servicePrefix,\n fetchImpl: options.fetchImpl || runtime.baseFetchImpl,\n }),\n [\n options.appType,\n options.fetchImpl,\n options.servicePrefix,\n runtime.appType,\n runtime.baseFetchImpl,\n runtime.servicePrefix,\n ],\n )\n\n return useMemo(\n () => ({\n client,\n getMethods: client.getMethods,\n passwordLogin: client.passwordLogin,\n dingtalkLogin: client.dingtalkLogin,\n guestLogin: client.guestLogin,\n sendPhoneCode: client.sendPhoneCode,\n phoneCodeLogin: client.phoneCodeLogin,\n registerWithPhoneCode: client.registerWithPhoneCode,\n getSsoLoginUrl: client.getSsoLoginUrl,\n refresh: client.refresh,\n logout: client.logout,\n resolveLoginUrl: client.resolveLoginUrl,\n }),\n [client],\n )\n}\n\nexport const useLoginMethods = (\n options: UseAuthOptions = {},\n): UseLoginMethodsState => {\n const auth = useAuth(options)\n const [state, setState] = useState<{\n data: LoginMethodsResult | null\n loading: boolean\n error: Error | null\n }>({\n data: null,\n loading: true,\n error: null,\n })\n\n const reload = useCallback(async () => {\n setState(prev => ({ ...prev, loading: true, error: null }))\n try {\n const data = await auth.getMethods()\n setState({ data, loading: false, error: null })\n } catch (error) {\n setState({\n data: null,\n loading: false,\n error: normalizeError(error),\n })\n }\n }, [auth])\n\n useEffect(() => {\n let disposed = false\n const run = async () => {\n setState(prev => ({ ...prev, loading: true, error: null }))\n try {\n const data = await auth.getMethods()\n if (!disposed) setState({ data, loading: false, error: null })\n } catch (error) {\n if (!disposed) {\n setState({\n data: null,\n loading: false,\n error: normalizeError(error),\n })\n }\n }\n }\n void run()\n return () => {\n disposed = true\n }\n }, [auth])\n\n return {\n ...state,\n methods: state.data?.methods || [],\n reload,\n }\n}\n\nexport const LoginPage: React.FC<LoginPageProps> = ({\n title,\n subtitle,\n className,\n style,\n defaultMethod,\n redirectUrl,\n redirectOnSuccess = true,\n onSuccess,\n ...authOptions\n}) => {\n const runtime = useOpenXiangda()\n const auth = useAuth(authOptions)\n const methodsState = useLoginMethods(authOptions)\n const [passwordForm] = Form.useForm<PasswordFormValues>()\n const [phoneForm] = Form.useForm<PhoneCodeFormValues>()\n const [activeMethod, setActiveMethod] = useState<string>(\n defaultMethod || \"password\",\n )\n const [phonePurpose, setPhonePurpose] = useState<\"login\" | \"register\">(\n \"login\",\n )\n const [phoneChallengeId, setPhoneChallengeId] = useState(\"\")\n const [passwordChallenge, setPasswordChallenge] =\n useState<AuthChallengePayload | null>(null)\n const [submitting, setSubmitting] = useState(false)\n const [sendingCode, setSendingCode] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const methods = methodsState.methods.filter(method => method.enabled !== false)\n const passwordMethod = findMethod(methods, \"password\")\n const phoneMethod = findMethod(methods, \"phone_code\")\n const dingtalkMethod = findMethod(methods, \"dingtalk\")\n const ssoMethod = findMethod(methods, \"sso\")\n const guestMethod = findMethod(methods, \"guest\")\n const allowRegister = methodsState.data?.registration?.mode !== \"reject\"\n\n const tabItems = useMemo(() => {\n const items = []\n if (passwordMethod) {\n items.push({\n key: \"password\",\n label: (\n <Space size={6}>\n <UserOutlined />\n <span>{passwordMethod.label || \"账号密码\"}</span>\n </Space>\n ),\n children: (\n <PasswordLoginForm\n challenge={passwordChallenge}\n form={passwordForm}\n loading={submitting}\n onFinish={async values => {\n setSubmitting(true)\n setError(null)\n try {\n await handleSuccess(\n await auth.passwordLogin({\n challengeAnswer: passwordChallenge\n ? values.challengeAnswer\n : undefined,\n challengeId: readChallengeId(passwordChallenge),\n clientFingerprint: getOrCreateLoginFingerprint(auth.client),\n username: values.username,\n password: values.password,\n }),\n )\n setPasswordChallenge(null)\n } catch (loginError) {\n if (isAuthChallengeRequired(loginError)) {\n const nextChallenge = getAuthErrorExtra(loginError)?.challenge\n if (nextChallenge) {\n setPasswordChallenge(nextChallenge)\n passwordForm.setFieldValue(\"challengeAnswer\", \"\")\n }\n } else {\n setPasswordChallenge(null)\n }\n setError(formatAuthErrorMessage(loginError))\n } finally {\n setSubmitting(false)\n }\n }}\n />\n ),\n })\n }\n if (phoneMethod) {\n items.push({\n key: \"phone_code\",\n label: (\n <Space size={6}>\n <MobileOutlined />\n <span>{phoneMethod.label || \"手机号\"}</span>\n </Space>\n ),\n children: (\n <PhoneCodeLoginForm\n allowRegister={allowRegister}\n form={phoneForm}\n loading={submitting}\n phonePurpose={phonePurpose}\n sendingCode={sendingCode}\n onPurposeChange={setPhonePurpose}\n onSendCode={async () => {\n const values = await phoneForm.validateFields([\"phone\"])\n setSendingCode(true)\n setError(null)\n try {\n const result = await auth.sendPhoneCode({\n phone: values.phone,\n purpose: phonePurpose,\n })\n setPhoneChallengeId(result.challengeId)\n } catch (sendError) {\n setError(normalizeError(sendError).message)\n } finally {\n setSendingCode(false)\n }\n }}\n onFinish={async values => {\n setSubmitting(true)\n setError(null)\n try {\n const data =\n phonePurpose === \"register\"\n ? await auth.registerWithPhoneCode({\n phone: values.phone,\n code: values.code,\n challengeId: phoneChallengeId,\n })\n : await auth.phoneCodeLogin({\n phone: values.phone,\n code: values.code,\n challengeId: phoneChallengeId,\n })\n await handleSuccess(data)\n } catch (loginError) {\n setError(normalizeError(loginError).message)\n } finally {\n setSubmitting(false)\n }\n }}\n />\n ),\n })\n }\n return items\n }, [\n allowRegister,\n auth,\n handleSuccess,\n passwordChallenge,\n passwordForm,\n passwordMethod,\n phoneChallengeId,\n phoneForm,\n phoneMethod,\n phonePurpose,\n sendingCode,\n submitting,\n ])\n\n useEffect(() => {\n const firstKey = tabItems[0]?.key\n if (firstKey && !tabItems.some(item => item.key === activeMethod)) {\n setActiveMethod(firstKey)\n }\n }, [activeMethod, tabItems])\n\n const handleDingTalkLogin = async () => {\n setSubmitting(true)\n setError(null)\n try {\n const code = await requestDingTalkCode(dingtalkMethod)\n await handleSuccess(\n await auth.dingtalkLogin({\n code,\n corpId: getString(dingtalkMethod, \"corpId\"),\n }),\n )\n } catch (loginError) {\n setError(normalizeError(loginError).message)\n } finally {\n setSubmitting(false)\n }\n }\n\n const handleSsoLogin = async () => {\n setSubmitting(true)\n setError(null)\n try {\n const redirectUri = getCurrentHref()\n const result = await auth.getSsoLoginUrl({\n protocol: getString(ssoMethod, \"protocol\") || \"cas\",\n redirectUri,\n })\n window.location.assign(result.loginUrl)\n } catch (loginError) {\n setError(normalizeError(loginError).message)\n setSubmitting(false)\n }\n }\n\n const handleGuestLogin = async () => {\n setSubmitting(true)\n setError(null)\n try {\n await handleSuccess(\n await auth.guestLogin({\n guestIdentifier: getOrCreateGuestIdentifier(auth.client),\n domain: getCurrentHostname(),\n }),\n )\n } catch (loginError) {\n setError(normalizeError(loginError).message)\n } finally {\n setSubmitting(false)\n }\n }\n\n async function handleSuccess(data: AuthTokenData) {\n await onSuccess?.(data)\n const accessToken = data.accessToken || data.token\n const accessTokenOptions = {\n expiresAt: data.accessTokenExpiresAt,\n }\n if (accessToken) {\n runtime.setAccessToken(accessToken, accessTokenOptions)\n }\n await runtime.reload(\n accessToken\n ? {\n accessToken,\n accessTokenOptions,\n }\n : undefined,\n )\n if (redirectOnSuccess && typeof window !== \"undefined\") {\n window.location.replace(\n redirectUrl || getCallbackUrl() || `/view/${auth.client.appType}`,\n )\n }\n }\n\n return (\n <div\n className={className}\n style={{\n minHeight: \"100vh\",\n display: \"grid\",\n placeItems: \"center\",\n padding: 24,\n background: \"#f6f8fb\",\n ...style,\n }}\n >\n <Card\n style={{\n width: \"min(100%, 420px)\",\n borderRadius: 8,\n boxShadow: \"0 16px 48px rgba(15, 23, 42, 0.10)\",\n }}\n styles={{ body: { padding: 28 } }}\n >\n <Space direction=\"vertical\" size={20} style={{ width: \"100%\" }}>\n <div>\n <Typography.Title level={3} style={{ margin: 0 }}>\n {title || \"应用登录\"}\n </Typography.Title>\n {subtitle ? (\n <Typography.Text type=\"secondary\">{subtitle}</Typography.Text>\n ) : null}\n </div>\n {methodsState.error ? (\n <Alert\n showIcon\n type=\"error\"\n message={methodsState.error.message}\n />\n ) : null}\n {error ? <Alert showIcon type=\"error\" message={error} /> : null}\n {methodsState.loading ? (\n <Button block loading>\n 加载中\n </Button>\n ) : tabItems.length > 0 ? (\n <Tabs\n activeKey={activeMethod}\n items={tabItems}\n onChange={setActiveMethod}\n />\n ) : (\n <Empty description=\"未启用登录方式\" />\n )}\n <Space direction=\"vertical\" size={10} style={{ width: \"100%\" }}>\n {dingtalkMethod ? (\n <Button\n block\n icon={<QrcodeOutlined />}\n loading={submitting}\n onClick={handleDingTalkLogin}\n >\n {dingtalkMethod.label || \"钉钉免登\"}\n </Button>\n ) : null}\n {ssoMethod ? (\n <Button\n block\n icon={<SafetyCertificateOutlined />}\n loading={submitting}\n onClick={handleSsoLogin}\n >\n {ssoMethod.label || \"SSO 登录\"}\n </Button>\n ) : null}\n {guestMethod ? (\n <Button\n block\n icon={<LoginOutlined />}\n loading={submitting}\n onClick={handleGuestLogin}\n >\n {guestMethod.label || \"访客访问\"}\n </Button>\n ) : null}\n </Space>\n </Space>\n </Card>\n </div>\n )\n}\n\nconst PasswordLoginForm: React.FC<{\n challenge?: AuthChallengePayload | null\n form: ReturnType<typeof Form.useForm<PasswordFormValues>>[0]\n loading: boolean\n onFinish: (values: PasswordFormValues) => void\n}> = ({ challenge, form, loading, onFinish }) => (\n <Form form={form} layout=\"vertical\" requiredMark={false} onFinish={onFinish}>\n <Form.Item\n label=\"账号\"\n name=\"username\"\n rules={[{ required: true, message: \"请输入账号\" }]}\n >\n <Input autoComplete=\"username\" />\n </Form.Item>\n <Form.Item\n label=\"密码\"\n name=\"password\"\n rules={[{ required: true, message: \"请输入密码\" }]}\n >\n <Input.Password autoComplete=\"current-password\" />\n </Form.Item>\n {challenge ? (\n <>\n <Alert\n showIcon\n type=\"warning\"\n message=\"请完成额外验证\"\n description={readChallengeQuestion(challenge) || \"请输入验证码后继续登录。\"}\n />\n <Form.Item\n label=\"验证答案\"\n name=\"challengeAnswer\"\n rules={[{ required: true, message: \"请输入验证答案\" }]}\n >\n <Input autoComplete=\"one-time-code\" />\n </Form.Item>\n </>\n ) : null}\n <Button block htmlType=\"submit\" icon={<LoginOutlined />} loading={loading} type=\"primary\">\n 登录\n </Button>\n </Form>\n)\n\nconst PhoneCodeLoginForm: React.FC<{\n allowRegister: boolean\n form: ReturnType<typeof Form.useForm<PhoneCodeFormValues>>[0]\n loading: boolean\n phonePurpose: \"login\" | \"register\"\n sendingCode: boolean\n onPurposeChange: (purpose: \"login\" | \"register\") => void\n onSendCode: () => Promise<void>\n onFinish: (values: PhoneCodeFormValues) => void\n}> = ({\n allowRegister,\n form,\n loading,\n phonePurpose,\n sendingCode,\n onPurposeChange,\n onSendCode,\n onFinish,\n}) => (\n <Form form={form} layout=\"vertical\" requiredMark={false} onFinish={onFinish}>\n {allowRegister ? (\n <Form.Item style={{ marginBottom: 12 }}>\n <Tabs\n activeKey={phonePurpose}\n items={[\n { key: \"login\", label: \"登录\" },\n { key: \"register\", label: \"注册\" },\n ]}\n onChange={key => onPurposeChange(key === \"register\" ? \"register\" : \"login\")}\n size=\"small\"\n />\n </Form.Item>\n ) : null}\n <Form.Item\n label=\"手机号\"\n name=\"phone\"\n rules={[{ required: true, message: \"请输入手机号\" }]}\n >\n <Input autoComplete=\"tel\" />\n </Form.Item>\n <Form.Item\n label=\"验证码\"\n name=\"code\"\n rules={[{ required: true, message: \"请输入验证码\" }]}\n >\n <Input\n addonAfter={\n <Button\n loading={sendingCode}\n onClick={onSendCode}\n size=\"small\"\n type=\"link\"\n >\n 发送\n </Button>\n }\n autoComplete=\"one-time-code\"\n />\n </Form.Item>\n <Button block htmlType=\"submit\" icon={<MobileOutlined />} loading={loading} type=\"primary\">\n {phonePurpose === \"register\" ? \"注册\" : \"登录\"}\n </Button>\n </Form>\n)\n\nconst findMethod = (methods: AuthMethod[], type: string) =>\n methods.find(method => method.type === type)\n\nconst normalizeError = (error: unknown): Error =>\n error instanceof Error ? error : new Error(String(error || \"请求失败\"))\n\nconst formatAuthErrorMessage = (error: unknown) => {\n const normalized = normalizeError(error)\n const extra = getAuthErrorExtra(error)\n const reason = getAuthErrorReason(error)\n if (isAuthChallengeRequired(error)) {\n return extra?.challenge?.question\n ? \"请完成下方验证后再登录\"\n : normalized.message || \"请先完成额外验证后再尝试登录\"\n }\n if (\n reason === \"LOGIN_BLOCKED\" ||\n reason === \"USERNAME_BLOCKED\" ||\n reason === \"IP_BLOCKED\" ||\n reason === \"ACCOUNT_LOCKED\"\n ) {\n const retryAfter = Number(extra?.retryAfter ?? extra?.retryAfterSeconds)\n if (Number.isFinite(retryAfter) && retryAfter > 0) {\n const minutes = Math.ceil(retryAfter / 60)\n return `登录受限,请约 ${minutes} 分钟后再试或联系管理员`\n }\n }\n return normalized.message || \"登录失败\"\n}\n\nconst getString = (value: unknown, key: string) => {\n if (!value || typeof value !== \"object\") return undefined\n const result = (value as Record<string, unknown>)[key]\n return typeof result === \"string\" ? result : undefined\n}\n\nconst requestDingTalkCode = (method?: AuthMethod): Promise<string> => {\n const dd =\n typeof window === \"undefined\"\n ? undefined\n : (window as unknown as { dd?: any }).dd\n const corpId = getString(method, \"corpId\")\n return new Promise((resolve, reject) => {\n const requestAuthCode =\n dd?.runtime?.permission?.requestAuthCode || dd?.requestAuthCode\n if (!requestAuthCode) {\n reject(new Error(\"当前环境不支持钉钉免登\"))\n return\n }\n requestAuthCode({\n corpId,\n onSuccess: (result: { code?: string }) => {\n if (result?.code) resolve(result.code)\n else reject(new Error(\"钉钉未返回免登码\"))\n },\n onFail: (error: unknown) => reject(normalizeError(error)),\n })\n })\n}\n\nconst getOrCreateGuestIdentifier = (client: AppAuthClient) => {\n const key = `openxiangda:${client.appType}:guest_id`\n if (typeof window === \"undefined\") return createGuestIdentifier()\n const current = window.localStorage.getItem(key)\n if (current) return current\n const next = createGuestIdentifier()\n window.localStorage.setItem(key, next)\n return next\n}\n\nconst getOrCreateLoginFingerprint = (client: AppAuthClient) => {\n const key = `openxiangda:${client.appType}:login_fingerprint`\n if (typeof window === \"undefined\") return createGuestIdentifier()\n const current = window.localStorage.getItem(key)\n const id = current || createGuestIdentifier()\n if (!current) window.localStorage.setItem(key, id)\n return `${id}:${window.navigator?.userAgent || \"unknown\"}`\n}\n\nconst createGuestIdentifier = () =>\n `guest_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`\n\nconst readChallengeId = (challenge?: AuthChallengePayload | null) => {\n if (!challenge) return undefined\n const id = challenge.id || challenge.challengeId\n return typeof id === \"string\" && id.trim() ? id.trim() : undefined\n}\n\nconst readChallengeQuestion = (challenge: AuthChallengePayload) =>\n typeof challenge.question === \"string\" ? challenge.question : undefined\n\nconst getCurrentHref = () =>\n typeof window === \"undefined\" ? \"\" : window.location.href\n\nconst getCurrentHostname = () =>\n typeof window === \"undefined\" ? \"\" : window.location.hostname\n\nconst getCallbackUrl = () => {\n if (typeof window === \"undefined\") return \"\"\n const query = new URLSearchParams(window.location.search)\n return query.get(\"callback\") || query.get(\"redirectUri\") || \"\"\n}\n","import { createBoundFetch } from \"./fetch\"\n\nexport type AuthMethodType =\n | \"password\"\n | \"dingtalk\"\n | \"sso\"\n | \"guest\"\n | \"phone_code\"\n | string\n\nexport interface AuthMethod {\n type: AuthMethodType\n enabled?: boolean\n label?: string\n protocol?: string\n [key: string]: unknown\n}\n\nexport interface LoginMethodsResult {\n appType: string\n configCode?: string\n methods: AuthMethod[]\n registration?: {\n mode?: string\n [key: string]: unknown\n }\n security?: {\n hideFailureReason?: boolean\n [key: string]: unknown\n }\n defaultRedirectUrl?: string\n}\n\nexport interface AuthUser {\n id: string\n username?: string\n name?: string\n phone?: string | null\n email?: string | null\n avatar?: string | null\n jobNumber?: string | null\n departments?: Array<Record<string, unknown>>\n affiliatedDepartmentId?: string | null\n affiliatedDepartment?: Record<string, unknown> | null\n [key: string]: unknown\n}\n\nexport interface AuthTokenData {\n accessToken: string\n refreshToken: string\n token?: string\n accessTokenExpiresAt?: number\n refreshTokenExpiresAt?: number\n user?: AuthUser\n guestUser?: AuthUser\n [key: string]: unknown\n}\n\nexport interface PhoneCodeSendResult {\n challengeId: string\n expiresAt?: string | Date\n ttlSeconds?: number\n message?: string\n}\n\nexport interface AuthChallengePayload {\n id?: string\n challengeId?: string\n type?: string\n question?: string\n attemptsLeft?: number\n expireAt?: number | string | Date\n expiresAt?: number | string | Date\n [key: string]: unknown\n}\n\nexport interface AuthErrorExtra {\n reason?: string\n guardCode?: string\n challenge?: AuthChallengePayload\n retryAfter?: number\n retryAfterSeconds?: number\n remainingAttempts?: number\n lockUntil?: string | Date | null\n [key: string]: unknown\n}\n\nexport interface SsoLoginUrlResult {\n loginUrl: string\n protocol?: string\n}\n\nexport interface AuthClientOptions {\n appType: string\n servicePrefix?: string\n fetchImpl?: typeof fetch\n}\n\nexport interface PasswordLoginInput {\n username: string\n password: string\n clientFingerprint?: string\n challengeId?: string\n challengeAnswer?: string\n}\n\nexport interface DingTalkLoginInput {\n code: string\n corpId?: string\n}\n\nexport interface GuestLoginInput {\n guestIdentifier?: string\n domain?: string\n ipAddress?: string\n userAgent?: string\n formUuid?: string\n}\n\nexport interface PhoneCodeInput {\n phone: string\n purpose?: \"login\" | \"register\" | string\n}\n\nexport interface PhoneCodeLoginInput {\n phone: string\n code: string\n challengeId?: string\n}\n\nexport interface PhoneCodeRegisterInput extends PhoneCodeLoginInput {\n name?: string\n email?: string\n}\n\nexport interface SsoLoginUrlInput {\n protocol?: string\n redirectUri?: string\n}\n\nexport interface RefreshInput {\n refreshToken?: string\n}\n\nexport interface ResolveLoginUrlInput {\n callbackUrl?: string\n callbackParamName?: string\n loginUrl?: string\n}\n\nexport interface AppAuthClient {\n appType: string\n servicePrefix: string\n getMethods: () => Promise<LoginMethodsResult>\n passwordLogin: (input: PasswordLoginInput) => Promise<AuthTokenData>\n dingtalkLogin: (input: DingTalkLoginInput) => Promise<AuthTokenData>\n guestLogin: (input?: GuestLoginInput) => Promise<AuthTokenData>\n sendPhoneCode: (input: PhoneCodeInput) => Promise<PhoneCodeSendResult>\n phoneCodeLogin: (input: PhoneCodeLoginInput) => Promise<AuthTokenData>\n registerWithPhoneCode: (\n input: PhoneCodeRegisterInput,\n ) => Promise<AuthTokenData>\n getSsoLoginUrl: (input?: SsoLoginUrlInput) => Promise<SsoLoginUrlResult>\n refresh: (input?: RefreshInput) => Promise<AuthTokenData>\n logout: () => Promise<void>\n resolveLoginUrl: (input?: ResolveLoginUrlInput) => string\n}\n\nexport interface AuthClientErrorOptions {\n status?: number\n code?: number | string\n payload?: unknown\n extra?: AuthErrorExtra\n}\n\nexport class AuthClientError extends Error {\n status?: number\n code?: number | string\n payload?: unknown\n extra?: AuthErrorExtra\n reason?: string\n challenge?: AuthChallengePayload\n retryAfter?: number\n remainingAttempts?: number\n lockUntil?: string | Date | null\n\n constructor(message: string, options: AuthClientErrorOptions = {}) {\n super(message)\n this.name = \"AuthClientError\"\n this.status = options.status\n this.code = options.code\n this.payload = options.payload\n this.extra = normalizeAuthErrorExtra(\n options.extra || getRecordValue(options.payload, \"extra\"),\n )\n this.reason =\n this.extra?.reason ||\n this.extra?.guardCode ||\n (typeof options.code === \"string\" ? options.code : undefined)\n this.challenge = this.extra?.challenge\n this.retryAfter = readNumber(\n this.extra?.retryAfter ?? this.extra?.retryAfterSeconds,\n )\n this.remainingAttempts = readNumber(this.extra?.remainingAttempts)\n this.lockUntil = (this.extra?.lockUntil as string | Date | null | undefined) ?? null\n }\n}\n\nexport const isAuthClientError = (error: unknown): error is AuthClientError => {\n if (error instanceof AuthClientError) return true\n return Boolean(\n error &&\n typeof error === \"object\" &&\n (error as Record<string, unknown>).name === \"AuthClientError\",\n )\n}\n\nexport const getAuthErrorExtra = (\n error: unknown,\n): AuthErrorExtra | undefined => {\n if (!error || typeof error !== \"object\") return undefined\n const record = error as Record<string, unknown>\n return normalizeAuthErrorExtra(record.extra || getRecordValue(record.payload, \"extra\"))\n}\n\nexport const getAuthErrorReason = (error: unknown) => {\n if (!error || typeof error !== \"object\") return undefined\n const record = error as Record<string, unknown>\n const extra = getAuthErrorExtra(error)\n return (\n extra?.reason ||\n extra?.guardCode ||\n (typeof record.reason === \"string\" ? record.reason : undefined) ||\n (typeof record.code === \"string\" ? record.code : undefined)\n )\n}\n\nexport const isAuthChallengeRequired = (error: unknown) => {\n if (!error || typeof error !== \"object\") return false\n const record = error as Record<string, unknown>\n const code = record.code\n const reason = getAuthErrorReason(error)\n const extra = getAuthErrorExtra(error)\n return (\n code === 460 ||\n code === \"460\" ||\n code === \"LOGIN_CHALLENGE_REQUIRED\" ||\n reason === \"LOGIN_CHALLENGE_REQUIRED\" ||\n reason === \"CHALLENGE_REQUIRED\" ||\n extra?.guardCode === \"LOGIN_CHALLENGE_REQUIRED\"\n )\n}\n\nexport const createAuthClient = ({\n appType,\n servicePrefix = \"/service\",\n fetchImpl,\n}: AuthClientOptions): AppAuthClient => {\n const normalizedAppType = String(appType || \"\").trim()\n if (!normalizedAppType) {\n throw new Error(\"appType 不能为空\")\n }\n const boundFetch = createBoundFetch(fetchImpl)\n const request = async <T>(\n path: string,\n options: RequestInit = {},\n ): Promise<T> => {\n const response = await boundFetch(buildServiceUrl(servicePrefix, path), {\n credentials: \"include\",\n ...options,\n headers: {\n accept: \"application/json\",\n ...(options.body ? { \"content-type\": \"application/json\" } : {}),\n ...(options.headers || {}),\n },\n })\n const payload = await readPayload(response)\n const code = getRecordValue(payload, \"code\")\n const success = getRecordValue(payload, \"success\")\n if (!response.ok || success === false || !isSuccessCode(code)) {\n throw new AuthClientError(\n String(getRecordValue(payload, \"message\") || `Auth request failed: ${response.status}`),\n {\n status: response.status,\n code: code as number | string | undefined,\n payload,\n extra: normalizeAuthErrorExtra(getRecordValue(payload, \"extra\")),\n },\n )\n }\n return unwrapPayload<T>(payload)\n }\n\n const appAuthPath = (suffix: string) =>\n `/openxiangda-api/v1/apps/${encodeURIComponent(normalizedAppType)}/auth${suffix}`\n\n return {\n appType: normalizedAppType,\n servicePrefix,\n getMethods: () => request<LoginMethodsResult>(appAuthPath(\"/methods\")),\n passwordLogin: input =>\n request<AuthTokenData>(appAuthPath(\"/password/login\"), postJson(input)),\n dingtalkLogin: input =>\n request<AuthTokenData>(appAuthPath(\"/dingtalk/login\"), postJson(input)),\n guestLogin: input =>\n request<AuthTokenData>(appAuthPath(\"/guest/login\"), postJson(input || {})),\n sendPhoneCode: input =>\n request<PhoneCodeSendResult>(appAuthPath(\"/phone-code/send\"), postJson(input)),\n phoneCodeLogin: input =>\n request<AuthTokenData>(appAuthPath(\"/phone-code/login\"), postJson(input)),\n registerWithPhoneCode: input =>\n request<AuthTokenData>(appAuthPath(\"/phone-code/register\"), postJson(input)),\n getSsoLoginUrl: input =>\n request<SsoLoginUrlResult>(appAuthPath(\"/sso/login-url\"), postJson(input || {})),\n refresh: input =>\n request<AuthTokenData>(appAuthPath(\"/refresh\"), postJson(input || {})),\n logout: async () => {\n await request<null>(appAuthPath(\"/logout\"), { method: \"POST\" })\n },\n resolveLoginUrl: input =>\n resolveLoginUrl(normalizedAppType, input || {}),\n }\n}\n\nconst postJson = (body: unknown): RequestInit => ({\n method: \"POST\",\n body: JSON.stringify(body || {}),\n})\n\nconst buildServiceUrl = (servicePrefix: string, path: string) => {\n const prefix = servicePrefix.endsWith(\"/\")\n ? servicePrefix.slice(0, -1)\n : servicePrefix\n const suffix = path.startsWith(\"/\") ? path : `/${path}`\n return `${prefix}${suffix}`\n}\n\nconst readPayload = async (response: Response) => {\n try {\n return await response.json()\n } catch {\n return null\n }\n}\n\nconst unwrapPayload = <T>(payload: unknown): T => {\n if (!payload || typeof payload !== \"object\") return payload as T\n const record = payload as Record<string, unknown>\n if (\"data\" in record) return record.data as T\n return payload as T\n}\n\nconst getRecordValue = (value: unknown, key: string) => {\n if (!value || typeof value !== \"object\") return undefined\n return (value as Record<string, unknown>)[key]\n}\n\nconst normalizeAuthErrorExtra = (value: unknown): AuthErrorExtra | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n const record = value as Record<string, unknown>\n const challenge =\n record.challenge && typeof record.challenge === \"object\" && !Array.isArray(record.challenge)\n ? (record.challenge as AuthChallengePayload)\n : undefined\n const reason = readString(record.reason)\n const guardCode = readString(record.guardCode)\n return {\n ...record,\n ...(reason ? { reason } : {}),\n ...(guardCode ? { guardCode } : {}),\n ...(challenge ? { challenge } : {}),\n ...(readNumber(record.retryAfter) !== undefined\n ? { retryAfter: readNumber(record.retryAfter) }\n : {}),\n ...(readNumber(record.retryAfterSeconds) !== undefined\n ? { retryAfterSeconds: readNumber(record.retryAfterSeconds) }\n : {}),\n ...(readNumber(record.remainingAttempts) !== undefined\n ? { remainingAttempts: readNumber(record.remainingAttempts) }\n : {}),\n } as AuthErrorExtra\n}\n\nconst readString = (value: unknown) =>\n typeof value === \"string\" ? value : undefined\n\nconst readNumber = (value: unknown) => {\n const numberValue = Number(value)\n return Number.isFinite(numberValue) ? numberValue : undefined\n}\n\nconst isSuccessCode = (code: unknown) => {\n if (code === undefined || code === null || code === \"\") return true\n const normalized = Number(code)\n return Number.isFinite(normalized)\n ? normalized === 0 || (normalized >= 200 && normalized < 300)\n : false\n}\n\nconst resolveLoginUrl = (\n appType: string,\n {\n callbackUrl = getCurrentHref(),\n callbackParamName = \"callback\",\n loginUrl,\n }: ResolveLoginUrlInput,\n) => {\n const target = loginUrl || `/view/${encodeURIComponent(appType)}/login`\n if (!callbackUrl) return target\n try {\n const base =\n typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\"\n const url = new URL(target, base)\n if (!url.searchParams.has(callbackParamName)) {\n url.searchParams.set(callbackParamName, callbackUrl)\n }\n if (target.startsWith(\"http://\") || target.startsWith(\"https://\")) {\n return url.toString()\n }\n return `${url.pathname}${url.search}${url.hash}`\n } catch {\n const separator = target.includes(\"?\") ? \"&\" : \"?\"\n return `${target}${separator}${callbackParamName}=${encodeURIComponent(callbackUrl)}`\n }\n}\n\nconst getCurrentHref = () =>\n typeof window === \"undefined\" ? \"\" : window.location.href\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport {\n createPublicAccessClient,\n PublicAccessClientError,\n type PublicAccessClaim,\n type PublicAccessSessionData,\n type PublicAccessSessionInput,\n} from \"../core/publicAccess\"\nimport { useOpenXiangda } from \"./openxiangdaProvider\"\n\nexport interface UsePublicAccessOptions extends PublicAccessSessionInput {\n appType?: string\n servicePrefix?: string\n fetchImpl?: typeof fetch\n autoStart?: boolean\n}\n\nexport interface UsePublicAccessState {\n loading: boolean\n error: PublicAccessClientError | null\n session: PublicAccessSessionData | null\n publicAccess: PublicAccessClaim | null\n startSession: (\n input?: PublicAccessSessionInput,\n ) => Promise<PublicAccessSessionData>\n}\n\nexport const usePublicAccess = (\n options: UsePublicAccessOptions = {},\n): UsePublicAccessState => {\n const runtime = useOpenXiangda()\n const {\n appType: runtimeAppType,\n servicePrefix: runtimeServicePrefix,\n baseFetchImpl: runtimeBaseFetchImpl,\n reload: reloadRuntime,\n setAccessToken,\n } = runtime\n const {\n appType = runtimeAppType,\n servicePrefix = runtimeServicePrefix,\n fetchImpl = runtimeBaseFetchImpl,\n autoStart = true,\n ...sessionInput\n } = options\n const [session, setSession] = useState<PublicAccessSessionData | null>(null)\n const [error, setError] = useState<PublicAccessClientError | null>(null)\n const [loading, setLoading] = useState(Boolean(autoStart))\n const activeSessionRef = useRef<{\n accessToken: string\n path?: string\n } | null>(null)\n const mountedRef = useRef(true)\n const sessionInputKey = JSON.stringify(sessionInput)\n const stableSessionInput = useMemo(() => sessionInput, [sessionInputKey])\n\n const client = useMemo(\n () =>\n createPublicAccessClient({\n appType,\n servicePrefix,\n fetchImpl,\n }),\n [appType, fetchImpl, servicePrefix],\n )\n\n const startSession = useCallback(\n async (input: PublicAccessSessionInput = {}) => {\n setLoading(true)\n setError(null)\n try {\n const resolvedPath =\n input.path || stableSessionInput.path || readPathFromLocation()\n const data = await client.startSession({\n ...stableSessionInput,\n ...input,\n ticket:\n input.ticket || stableSessionInput.ticket || readTicketFromLocation(),\n path: resolvedPath,\n })\n if (!mountedRef.current) return data\n activeSessionRef.current = {\n accessToken: data.accessToken,\n path: resolvedPath,\n }\n setSession(data)\n setAccessToken(data.accessToken, {\n scope: \"public\",\n path: resolvedPath,\n })\n await reloadRuntime({\n accessToken: data.accessToken,\n accessTokenOptions: {\n scope: \"public\",\n path: resolvedPath,\n },\n })\n if (!mountedRef.current) return data\n setLoading(false)\n return data\n } catch (caught) {\n const nextError =\n caught instanceof PublicAccessClientError\n ? caught\n : new PublicAccessClientError(\n caught instanceof Error ? caught.message : \"公开访问会话创建失败\",\n { payload: caught },\n )\n if (mountedRef.current) {\n setError(nextError)\n setLoading(false)\n }\n throw nextError\n }\n },\n [client, reloadRuntime, setAccessToken, stableSessionInput],\n )\n\n useEffect(() => {\n if (!autoStart) return\n void startSession().catch(() => undefined)\n }, [autoStart, startSession])\n\n useEffect(\n () => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n const activeSession = activeSessionRef.current\n if (!activeSession) return\n activeSessionRef.current = null\n setAccessToken(null, { clearIfToken: activeSession.accessToken })\n void reloadRuntime({ accessToken: null })\n }\n },\n [reloadRuntime, setAccessToken],\n )\n\n return {\n loading,\n error,\n session,\n publicAccess: session?.publicAccess || null,\n startSession,\n }\n}\n\nexport interface PublicAccessGateProps extends UsePublicAccessOptions {\n children: React.ReactNode\n fallback?: React.ReactNode\n errorFallback?: React.ReactNode | ((error: PublicAccessClientError) => React.ReactNode)\n}\n\nexport const PublicAccessGate: React.FC<PublicAccessGateProps> = ({\n children,\n fallback = null,\n errorFallback = null,\n ...options\n}) => {\n const state = usePublicAccess(options)\n if (state.loading) return <>{fallback}</>\n if (state.error) {\n return (\n <>\n {typeof errorFallback === \"function\"\n ? errorFallback(state.error)\n : errorFallback}\n </>\n )\n }\n return <>{children}</>\n}\n\nconst readTicketFromLocation = () => {\n if (typeof window === \"undefined\") return undefined\n return new URLSearchParams(window.location.search).get(\"ticket\") || undefined\n}\n\nconst readPathFromLocation = () =>\n typeof window === \"undefined\" ? undefined : window.location.pathname\n","import { createBoundFetch } from \"./fetch\"\nimport type { AuthTokenData } from \"./auth\"\n\nexport type PublicStorageAction = \"upload\" | \"preview\" | \"download\"\n\nexport interface PublicStorageGrant {\n bucketName: string\n actions: PublicStorageAction[]\n allowedMimeTypes?: string[]\n allowedExtensions?: string[]\n maxSizeBytes?: number\n visibility?: \"public\" | \"private\"\n pathPrefix?: string\n}\n\nexport interface PublicAccessClaim {\n type: \"openxiangda_public\"\n appType: string\n policyCode: string\n routeCode?: string\n pathPattern?: string\n mode: \"guest\" | \"ticket\"\n externalRoleCodes: string[]\n grants: {\n forms?: string[]\n dataViews?: string[]\n functions?: string[]\n connectors?: string[]\n storage?: PublicStorageGrant[]\n }\n issuedAt: string\n expiresAt?: string | null\n ticketId?: string | null\n guestIdentifier?: string\n}\n\nexport interface PublicAccessSessionInput {\n policyCode?: string\n routeCode?: string\n path?: string\n ticket?: string\n guestIdentifier?: string\n domain?: string\n ipAddress?: string\n userAgent?: string\n}\n\nexport interface PublicAccessSessionData extends AuthTokenData {\n publicAccess?: PublicAccessClaim | null\n raw?: unknown\n}\n\nexport interface PublicAccessClientOptions {\n appType: string\n servicePrefix?: string\n fetchImpl?: typeof fetch\n}\n\nexport interface PublicAccessClient {\n appType: string\n servicePrefix: string\n startSession: (\n input?: PublicAccessSessionInput,\n ) => Promise<PublicAccessSessionData>\n}\n\nexport class PublicAccessClientError extends Error {\n status?: number\n code?: number | string\n payload?: unknown\n\n constructor(\n message: string,\n options: { status?: number; code?: number | string; payload?: unknown } = {},\n ) {\n super(message)\n this.name = \"PublicAccessClientError\"\n this.status = options.status\n this.code = options.code\n this.payload = options.payload\n }\n}\n\nexport const createPublicAccessClient = ({\n appType,\n servicePrefix = \"/service\",\n fetchImpl,\n}: PublicAccessClientOptions): PublicAccessClient => {\n const normalizedAppType = String(appType || \"\").trim()\n if (!normalizedAppType) {\n throw new Error(\"appType 不能为空\")\n }\n const boundFetch = createBoundFetch(fetchImpl)\n const request = async (\n input: PublicAccessSessionInput = {},\n ): Promise<PublicAccessSessionData> => {\n const body: PublicAccessSessionInput = {\n ...input,\n path: input.path || getCurrentPathname(),\n domain: input.domain || getCurrentDomain(),\n userAgent: input.userAgent || getCurrentUserAgent(),\n guestIdentifier:\n input.guestIdentifier || getOrCreatePublicGuestIdentifier(normalizedAppType),\n }\n const response = await boundFetch(\n buildServiceUrl(\n servicePrefix,\n `/openxiangda-api/v1/apps/${encodeURIComponent(\n normalizedAppType,\n )}/public/session`,\n ),\n {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(body),\n },\n )\n const payload = await readPayload(response)\n const code = getRecordValue(payload, \"code\")\n const success = getRecordValue(payload, \"success\")\n if (!response.ok || success === false || !isSuccessCode(code)) {\n throw new PublicAccessClientError(\n String(\n getRecordValue(payload, \"message\") ||\n `Public access session failed: ${response.status}`,\n ),\n { status: response.status, code: code as number | string | undefined, payload },\n )\n }\n const data = getRecordValue(payload, \"data\") as AuthTokenData\n const extra = getRecordValue(payload, \"extra\") as\n | Record<string, unknown>\n | undefined\n return {\n ...data,\n publicAccess: (extra?.publicAccess as PublicAccessClaim | undefined) || null,\n raw: payload,\n }\n }\n\n return {\n appType: normalizedAppType,\n servicePrefix,\n startSession: request,\n }\n}\n\nconst buildServiceUrl = (servicePrefix: string, path: string) => {\n const prefix = servicePrefix.endsWith(\"/\")\n ? servicePrefix.slice(0, -1)\n : servicePrefix\n const suffix = path.startsWith(\"/\") ? path : `/${path}`\n return `${prefix}${suffix}`\n}\n\nconst readPayload = async (response: Response) => {\n try {\n return await response.json()\n } catch {\n return null\n }\n}\n\nconst getRecordValue = (value: unknown, key: string) => {\n if (!value || typeof value !== \"object\") return undefined\n return (value as Record<string, unknown>)[key]\n}\n\nconst isSuccessCode = (code: unknown) => {\n if (code === undefined || code === null || code === \"\") return true\n const normalized = Number(code)\n return Number.isFinite(normalized)\n ? normalized === 0 || (normalized >= 200 && normalized < 300)\n : false\n}\n\nconst getCurrentPathname = () =>\n typeof window === \"undefined\" ? undefined : window.location.pathname\n\nconst getCurrentDomain = () =>\n typeof window === \"undefined\" ? undefined : window.location.host\n\nconst getCurrentUserAgent = () =>\n typeof navigator === \"undefined\" ? undefined : navigator.userAgent\n\nconst getOrCreatePublicGuestIdentifier = (appType: string) => {\n const key = `openxiangda:public:guest:${appType}`\n try {\n if (typeof window !== \"undefined\" && window.localStorage) {\n const existing = window.localStorage.getItem(key)\n if (existing) return existing\n const next = createRandomIdentifier(appType)\n window.localStorage.setItem(key, next)\n return next\n }\n } catch {\n // ignore storage failures and fall back to an in-memory value.\n }\n return createRandomIdentifier(appType)\n}\n\nconst createRandomIdentifier = (appType: string) => {\n const random =\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : Math.random().toString(36).slice(2)\n return `public:${appType}:${random}`\n}\n"],"mappings":"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","names":["React","process","jsx","React","useMemo","useMemo","response","useCallback","useEffect","useMemo","useState","useState","useCallback","useEffect","useMemo","useCallback","useEffect","useMemo","useRef","useState","Input","Modal","Select","ReloadOutlined","RollbackOutlined","useEffect","useMemo","useState","message","Fragment","jsx","useState","useEffect","useMemo","useMemo","jsx","jsxs","useMemo","Button","UserOutlined","jsx","jsxs","useCallback","useEffect","useMemo","useRef","useState","Button","Empty","Modal","Space","Tag","message","hasOwn","isSuccessCode","useCallback","useEffect","useMemo","useState","Button","Modal","UserOutlined","useCallback","useEffect","useMemo","useRef","useState","useState","useRef","useCallback","useEffect","useMemo","jsx","jsxs","useState","useMemo","useEffect","useCallback","UserOutlined","Button","Modal","jsx","jsxs","getUserId","useState","useMemo","useEffect","useCallback","message","Button","Space","Tag","Empty","useRef","Modal","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","message","RollbackOutlined","ReloadOutlined","useMemo","Modal","Input","Select","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","message","normalizeMethod","normalizeEnvelopeCode","isSuccessCode","message","normalizeMethod","useCallback","useEffect","useMemo","useState","Button","Empty","Form","Input","Space","Typography","UserOutlined","message","isSuccessCode","getCurrentHref","Fragment","jsx","jsxs","useMemo","useState","useCallback","useEffect","Form","Space","UserOutlined","getCurrentHref","Typography","Button","Empty","Input","Fragment","jsx","createContext","useMemo","useState","useRef","useCallback","buildServiceUrl","getRecordValue","state","useEffect","useContext","message","resolveLoginUrl","getCurrentHref","getCurrentHostname","isSuccessCode","useCallback","useEffect","useMemo","useRef","useState","message","getCurrentPathname","buildServiceUrl","readPayload","getRecordValue","isSuccessCode","Fragment","jsx","useState","useRef","useMemo","useCallback","useEffect"]}
|