openxiangda 1.0.133 → 1.0.134
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/lib/cli.js +29 -5
- package/package.json +1 -1
- package/packages/sdk/dist/{ProcessPreview-B2-umzSY.d.mts → ProcessPreview-Dfc4-wIq.d.mts} +2 -3
- package/packages/sdk/dist/{ProcessPreview-B2-umzSY.d.ts → ProcessPreview-Dfc4-wIq.d.ts} +2 -3
- package/packages/sdk/dist/components/index.d.mts +35 -36
- package/packages/sdk/dist/components/index.d.ts +35 -36
- package/packages/sdk/dist/runtime/index.d.mts +2 -3
- package/packages/sdk/dist/runtime/index.d.ts +2 -3
- package/packages/sdk/dist/runtime/react.d.mts +1 -2
- package/packages/sdk/dist/runtime/react.d.ts +1 -2
- package/packages/sdk/dist/workflow/index.cjs +70 -12
- package/packages/sdk/dist/workflow/index.cjs.map +1 -1
- package/packages/sdk/dist/workflow/index.mjs +70 -12
- package/packages/sdk/dist/workflow/index.mjs.map +1 -1
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { PageContext, PageInfo, PageBridgeApi } from './react.js';
|
|
2
2
|
export { ApiPermissionListParams, AppAuthClient, AppFunctionConnectorApi, AppFunctionContext, AppFunctionDataViewApi, AppFunctionFormApi, AppFunctionFormGetByIdParams, AppFunctionFormQueryParams, AppFunctionFormWriteParams, AppFunctionNotificationApi, AppFunctionOperatorInfo, AppFunctionOrganizationApi, AppFunctionPermissionContext, AppFunctionRuntimeContext, ApproveTaskParams, AssignPermissionsParams, AssignRolesParams, AuthChallengePayload, AuthClientError, AuthClientErrorOptions, AuthClientOptions, AuthErrorExtra, AuthLogoutRedirectOptions, AuthMethod, AuthMethodType, AuthTokenData, AuthUser, BatchAddUsersToRoleParams, BatchSendNotificationByTypeParams, ChangeOrganizationAccountPasswordParams, ChangeUserRoleParams, ConnectorCallParams, ConnectorInvokeParams, ConnectorInvokeResult, ConnectorRequestBodyType, ConnectorResponseType, CreateApiPermissionParams, CreateFormPermissionGroupDto, CreateOrganizationAccountParams, CreateOrganizationDepartmentParams, CreatePagePermissionGroupDto, CreateRoleParams, CreateUiPermissionParams, CreateUserParams, CurrentUserDepartmentParents, CustomPageEntryConfig, CustomPageEntryMode, DataManagementConfigParams, DataManagementFilterState, DataPermissionConditionDto, DataPermissionDto, DataPermissionRuleDto, DataViewQueryParams, DataViewQueryResult, DataViewStatsParams, DingTalkLoginInput, DingTalkNotificationCapabilities, DingTalkNotificationCardConfig, DingTalkNotificationCardField, DingTalkNotificationCardMode, DingTalkNotificationCardPreview, DingTalkNotificationChannelConfig, DingTalkNotificationDeliveryMode, DingTalkNotificationPreviewResult, ExecuteProcessOperationInput, FieldAccessLevel, FieldAccessPolicyDto, FieldAccessPolicyItemDto, FieldPermissionDto, FindNotificationConfigParams, FormAdvancedSearchParams, FormChangeRecordParams, FormCreateParams, FormExportParams, FormGetDetailParams, FormImportParams, FormPermissionGroup, FormRemoveParams, FormSearchParams, FormUpdateParams, FunctionInvokeParams, FunctionInvokeResult, GetParentDepartmentsOptions, GetProcessInstanceParams, GetUserRolesParams, GuestLoginInput, ImportExportRecordDownloadParams, ImportExportRecordQuery, InitiatorApproverSelector, InstanceStatus, ListNotificationInboxParams, ListWorkCenterItemsParams, LoginLogGetParams, LoginLogListParams, LoginLogRecord, LoginLogStats, LoginLogStatsParams, LoginLogStatus, LoginMethodsResult, LoginPage, LoginPageProps, MarkAllNotificationReadResult, NotificationChannel, NotificationChannelConfig, NotificationChannelsConfig, NotificationConfigLevel, NotificationInboxListResult, NotificationInboxMessage, NotificationInboxReadStatus, NotificationMessageRecord, NotificationTemplate, NotificationTemplatePreview, NotificationTypeConfig, NotificationUnreadCountResult, OpenXiangdaPageProvider, OpenXiangdaPageProviderProps, OpenXiangdaProvider, OpenXiangdaProviderProps, OrganizationAccountListParams, OrganizationCapabilities, OrganizationListResult, PageApiPermissionRecord, PageApiResponse, PageAppInfo, PageBinaryResponse, PageDataManagementConfig, PageDataSourceDescriptor, PageDepartmentInfo, PageDepartmentRecord, PageHttpMethod, PageListResult, PageMessageApi, PageModalApi, PageNavigationApi, PageOffsetListResult, PagePermissionGroup, PagePermissionInfo, PageProvider, PageQueryValue, PageRequestOptions, PageRoleRecord, PageRouteInfo, PageScope, PageSdk, PageSdkError, PageSdkMeta, PageTransportDownloadPayload, PageTransportRequestPayload, PageUiPermissionRecord, PageUiPermissionType, PageUserInfo, PageUserRecord, PageUserType, PasswordLoginInput, PermissionBoundary, PermissionBoundaryFallback, PermissionBoundaryFallbackState, PermissionBoundaryProps, PhoneCodeInput, PhoneCodeLoginInput, PhoneCodeRegisterInput, PhoneCodeSendResult, PreviewDingTalkNotificationParams, PreviewNotificationTemplateParams, ProcessActionBar, ProcessActionBarProps, ProcessApproveAction, ProcessCapabilities, ProcessCapabilityOperation, ProcessInstanceLookupParams, ProcessPreviewPanel, ProcessPreviewPanelProps, ProcessTimeline, ProcessTimelineProps, PublicAccessClaim, PublicAccessClient, PublicAccessClientError, PublicAccessClientOptions, PublicAccessGate, PublicAccessGateProps, PublicAccessSessionData, PublicAccessSessionInput, QueryFormPermissionGroupDto, QueryPagePermissionGroupDto, RefreshInput, ResetOrganizationAccountPasswordParams, ResolveLoginUrlInput, ResolveProcessCapabilitiesParams, RoleListParams, RoleUsersParams, RouteAccessResult, RuntimeBootstrap, RuntimeErrorSnapshot, RuntimeErrorType, RuntimeLogoutOptions, RuntimeMenuItem, RuntimePagePermissions, RuntimeRedirectLoginOptions, RuntimeRequestError, RuntimeRequestState, RuntimeResolveLoginOptions, SaveDataManagementConfigParams, SearchComponentName, SearchExpression, SearchFieldKey, SearchGroup, SearchLogic, SearchOperator, SearchRule, SearchSortItem, SearchSystemField, SendNotificationByTypeParams, SendNotificationResult, SsoLoginUrlInput, SsoLoginUrlResult, SubFormRule, SwitchAppRoleParams, SwitchPlatformRoleParams, TerminateProcessInstanceParams, TriggerCallbackTaskParams, UiPermissionListParams, UpdateApiPermissionParams, UpdateFormPermissionGroupDto, UpdateOrganizationAccountParams, UpdateOrganizationDepartmentParams, UpdatePagePermissionGroupDto, UpdateRoleParams, UpdateUiPermissionParams, UpdateUserParams, UseAuthOptions, UseCanAccessRouteInput, UseLoginMethodsState, UseProcessActionsOptions, UseProcessActionsReturn, UseProcessCapabilitiesOptions, UseProcessCapabilitiesReturn, UsePublicAccessOptions, UsePublicAccessState, UserListParams, UserMenuPermissionsResponse, ValidateUserParams, ViewFieldPermissionValue, ViewOperationPermission, ViewPermissionSummary, WorkCenterBoxType, WorkCenterGroupedStat, WorkCenterItem, WorkCenterListResult, WorkCenterStats, WorkCenterStatsParams, WorkflowApproveParams, WorkflowCapabilityActionKey, WorkflowDefinitionByFormParams, WorkflowInitiatorSelectCandidatesParams, WorkflowInitiatorSelectRequirementsParams, WorkflowPreviewParams, WorkflowResubmitInitiatorSelectRequirementsParams, WorkflowResubmitParams, WorkflowReturnParams, WorkflowSaveTaskParams, WorkflowStartFromExistingInstanceParams, WorkflowTaskParams, WorkflowTransferParams, WorkflowWithdrawParams, createAuthClient, createPageSdk, createPublicAccessClient, createReactPage, getAuthErrorExtra, getAuthErrorReason, isAuthChallengeRequired, isAuthClientError, useAppMenus, useAuth, useCanAccessRoute, useCurrentUser, useDataSource, useFormViewPermissions, useLoginMethods, useMessage, useModal, useNavigation, useOpenXiangda, usePageContext, usePageProps, usePageRoute, usePageSdk, usePermission, useProcessActions, useProcessCapabilities, usePublicAccess, useRuntimeAuth, useRuntimeBootstrap } from './react.js';
|
|
3
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
3
|
import React__default from 'react';
|
|
5
|
-
import {
|
|
4
|
+
import { F as FormSchema, a as FormRuntimeApi, b as FormRuntimeApiConfig, c as FieldDefinition } from '../ProcessPreview-Dfc4-wIq.js';
|
|
6
5
|
|
|
7
6
|
type RuntimeCssIsolation = "none" | "namespace" | "shadow";
|
|
8
7
|
interface RuntimeHostBootstrap {
|
|
@@ -160,7 +159,7 @@ interface BuiltinRouteRendererProps {
|
|
|
160
159
|
style?: React__default.CSSProperties;
|
|
161
160
|
}
|
|
162
161
|
declare const createBuiltinRouteRequest: (servicePrefix?: string, fetchImpl?: typeof fetch) => FormRuntimeApi["request"];
|
|
163
|
-
declare function BuiltinRouteRenderer({ route, appType: appTypeProp, className, config, fetchImpl, overrides, requestOverride, servicePrefix, style, }: BuiltinRouteRendererProps):
|
|
162
|
+
declare function BuiltinRouteRenderer({ route, appType: appTypeProp, className, config, fetchImpl, overrides, requestOverride, servicePrefix, style, }: BuiltinRouteRendererProps): React__default.JSX.Element | null;
|
|
164
163
|
|
|
165
164
|
interface NormalizeRuntimeFormSchemaOptions {
|
|
166
165
|
appType: string;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React__default, { Dispatch, SetStateAction, CSSProperties } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import 'react/jsx-runtime';
|
|
2
|
+
import { a as FormRuntimeApi, o as InitiatorSelectRequirement, I as InitiatorSelectCandidate, b0 as ProcessPreviewProps, ai as ApprovalTimelineProps } from '../ProcessPreview-Dfc4-wIq.mjs';
|
|
4
3
|
|
|
5
4
|
type PageQueryValue = string | string[];
|
|
6
5
|
type PageHttpMethod = "get" | "post" | "put" | "delete" | "patch";
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import React__default, { Dispatch, SetStateAction, CSSProperties } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import 'react/jsx-runtime';
|
|
2
|
+
import { a as FormRuntimeApi, o as InitiatorSelectRequirement, I as InitiatorSelectCandidate, b0 as ProcessPreviewProps, ai as ApprovalTimelineProps } from '../ProcessPreview-Dfc4-wIq.js';
|
|
4
3
|
|
|
5
4
|
type PageQueryValue = string | string[];
|
|
6
5
|
type PageHttpMethod = "get" | "post" | "put" | "delete" | "patch";
|
|
@@ -152,6 +152,29 @@ function normalizeFieldPermissions(value) {
|
|
|
152
152
|
}
|
|
153
153
|
return void 0;
|
|
154
154
|
}
|
|
155
|
+
function normalizeConditionRule(rule) {
|
|
156
|
+
if (!rule || typeof rule !== "object") return rule;
|
|
157
|
+
if (Array.isArray(rule)) return rule.map(normalizeConditionRule);
|
|
158
|
+
const normalized = { ...rule };
|
|
159
|
+
const fieldId = rule.id || rule.fieldId || rule.field || rule.key || rule.column;
|
|
160
|
+
const operator = rule.opCode || rule.op || rule.operator;
|
|
161
|
+
const componentType = rule.componentType || rule.componentName;
|
|
162
|
+
if (Array.isArray(rule.rules)) {
|
|
163
|
+
normalized.rules = rule.rules.map(normalizeConditionRule);
|
|
164
|
+
}
|
|
165
|
+
if (fieldId) {
|
|
166
|
+
normalized.id = normalized.id || fieldId;
|
|
167
|
+
normalized.fieldId = normalized.fieldId || fieldId;
|
|
168
|
+
}
|
|
169
|
+
if (operator) {
|
|
170
|
+
normalized.opCode = normalized.opCode || operator;
|
|
171
|
+
normalized.operator = normalized.operator || operator;
|
|
172
|
+
}
|
|
173
|
+
if (componentType) {
|
|
174
|
+
normalized.componentType = normalized.componentType || componentType;
|
|
175
|
+
}
|
|
176
|
+
return normalized;
|
|
177
|
+
}
|
|
155
178
|
function createDeclarativeNode(type, id, data = {}) {
|
|
156
179
|
return {
|
|
157
180
|
__openxiangdaWorkflowNode: true,
|
|
@@ -347,34 +370,46 @@ var WorkflowBuilder = class {
|
|
|
347
370
|
});
|
|
348
371
|
}
|
|
349
372
|
condition(id, data) {
|
|
373
|
+
const condition = normalizeConditionRule(
|
|
374
|
+
data.condition || { ruleType: "group", condition: "AND", rules: [] }
|
|
375
|
+
);
|
|
350
376
|
return this.node("condition_branch", id, {
|
|
351
377
|
type: "condition_branch",
|
|
352
378
|
label: data.label || "\u6761\u4EF6\u5206\u652F",
|
|
353
|
-
condition: data.condition || { ruleType: "group", condition: "AND", rules: [] },
|
|
354
379
|
isElse: data.isElse === true,
|
|
355
380
|
priority: data.priority || "1",
|
|
356
381
|
trueNodeId: data.trueNodeId,
|
|
357
382
|
falseNodeId: data.falseNodeId,
|
|
358
|
-
...data
|
|
383
|
+
...data,
|
|
384
|
+
condition
|
|
359
385
|
});
|
|
360
386
|
}
|
|
361
387
|
branch(id, data = {}) {
|
|
362
388
|
return this.node("branch", id, {
|
|
363
389
|
label: data.label || "\u8F85\u52A9\u5206\u652F",
|
|
364
390
|
isAuxNode: data.isAuxNode ?? true,
|
|
365
|
-
branchType: data.branchType || "
|
|
391
|
+
branchType: data.branchType || "condition_controller",
|
|
366
392
|
...data
|
|
367
393
|
});
|
|
368
394
|
}
|
|
369
395
|
parallel(id, branches, data = {}) {
|
|
370
|
-
const
|
|
396
|
+
const branchId = sanitizeId(id);
|
|
397
|
+
const entryId = sanitizeId(`${id}_branch`);
|
|
398
|
+
const convergeId = sanitizeId(`${id}_converge`);
|
|
399
|
+
const entry = this.branch(entryId, {
|
|
371
400
|
label: data.label || "\u5E76\u884C\u5206\u652F",
|
|
372
|
-
branchType: "
|
|
401
|
+
branchType: "parallel",
|
|
402
|
+
branchId,
|
|
403
|
+
branchControllerId: entryId,
|
|
404
|
+
convergeNodeId: convergeId,
|
|
373
405
|
hidden: true
|
|
374
406
|
});
|
|
375
|
-
const converge = this.branch(
|
|
407
|
+
const converge = this.branch(convergeId, {
|
|
376
408
|
label: data.convergeLabel || "\u5E76\u884C\u6C47\u805A",
|
|
377
409
|
branchType: "converge",
|
|
410
|
+
branchId,
|
|
411
|
+
branchControllerId: entryId,
|
|
412
|
+
convergeNodeId: convergeId,
|
|
378
413
|
hidden: true
|
|
379
414
|
});
|
|
380
415
|
branches.forEach((branch, index) => {
|
|
@@ -392,14 +427,23 @@ var WorkflowBuilder = class {
|
|
|
392
427
|
return { entry, converge };
|
|
393
428
|
}
|
|
394
429
|
conditionBranches(id, branches, data = {}) {
|
|
395
|
-
const
|
|
430
|
+
const branchId = sanitizeId(id);
|
|
431
|
+
const entryId = sanitizeId(`${id}_controller`);
|
|
432
|
+
const convergeId = sanitizeId(`${id}_converge`);
|
|
433
|
+
const entry = this.branch(entryId, {
|
|
396
434
|
label: data.label || "\u6761\u4EF6\u5206\u652F",
|
|
397
435
|
branchType: "condition_controller",
|
|
436
|
+
branchId,
|
|
437
|
+
branchControllerId: entryId,
|
|
438
|
+
convergeNodeId: convergeId,
|
|
398
439
|
hidden: true
|
|
399
440
|
});
|
|
400
|
-
const converge = this.branch(
|
|
441
|
+
const converge = this.branch(convergeId, {
|
|
401
442
|
label: data.convergeLabel || "\u6761\u4EF6\u6C47\u805A",
|
|
402
443
|
branchType: "converge",
|
|
444
|
+
branchId,
|
|
445
|
+
branchControllerId: entryId,
|
|
446
|
+
convergeNodeId: convergeId,
|
|
403
447
|
hidden: true
|
|
404
448
|
});
|
|
405
449
|
branches.forEach((branch, index) => {
|
|
@@ -411,7 +455,10 @@ var WorkflowBuilder = class {
|
|
|
411
455
|
rules: []
|
|
412
456
|
},
|
|
413
457
|
isElse: branch.isElse === true,
|
|
414
|
-
priority: String(index + 1)
|
|
458
|
+
priority: String(index + 1),
|
|
459
|
+
branchId,
|
|
460
|
+
branchControllerId: entryId,
|
|
461
|
+
convergeNodeId: convergeId
|
|
415
462
|
});
|
|
416
463
|
this.edge(entry, condition, {
|
|
417
464
|
id: `edge_${entry}_${condition}`,
|
|
@@ -438,7 +485,10 @@ var WorkflowBuilder = class {
|
|
|
438
485
|
label: "\u5176\u4ED6\u60C5\u51B5",
|
|
439
486
|
isElse: true,
|
|
440
487
|
priority: String(branches.length + 1),
|
|
441
|
-
condition: { ruleType: "group", condition: "AND", rules: [] }
|
|
488
|
+
condition: { ruleType: "group", condition: "AND", rules: [] },
|
|
489
|
+
branchId,
|
|
490
|
+
branchControllerId: entryId,
|
|
491
|
+
convergeNodeId: convergeId
|
|
442
492
|
});
|
|
443
493
|
this.edge(entry, elseNode, { id: `edge_${entry}_${elseNode}`, label: "\u5176\u4ED6\u60C5\u51B5" });
|
|
444
494
|
this.edge(elseNode, converge, { id: `edge_${elseNode}_${converge}` });
|
|
@@ -563,7 +613,13 @@ function addDeclarativeNode(builder, node) {
|
|
|
563
613
|
builder.condition(node.id, node.data);
|
|
564
614
|
return;
|
|
565
615
|
case "branch": {
|
|
566
|
-
|
|
616
|
+
const controllerId = sanitizeId(node.id);
|
|
617
|
+
const branchId = sanitizeId(node.data?.branchId || node.id);
|
|
618
|
+
builder.branch(node.id, {
|
|
619
|
+
...node.data,
|
|
620
|
+
branchId,
|
|
621
|
+
branchControllerId: node.data?.branchControllerId || controllerId
|
|
622
|
+
});
|
|
567
623
|
const branches = Array.isArray(node.data?.branches) ? node.data.branches : [];
|
|
568
624
|
branches.forEach((branch, index) => {
|
|
569
625
|
const conditionId = sanitizeId(`${node.id}_${branch.id || index + 1}`);
|
|
@@ -575,7 +631,9 @@ function addDeclarativeNode(builder, node) {
|
|
|
575
631
|
rules: []
|
|
576
632
|
},
|
|
577
633
|
isElse: branch.else === true || branch.isElse === true,
|
|
578
|
-
priority: String(index + 1)
|
|
634
|
+
priority: String(index + 1),
|
|
635
|
+
branchId,
|
|
636
|
+
branchControllerId: node.data?.branchControllerId || controllerId
|
|
579
637
|
});
|
|
580
638
|
builder.edge(node.id, conditionId, {
|
|
581
639
|
id: `edge_${node.id}_${conditionId}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/workflow/index.ts"],"sourcesContent":["export type WorkflowNodeRef = string;\n\nexport interface WorkflowCompileResult {\n definitionJson: {\n version: \"v3\";\n nodes: any[];\n edges: any[];\n flowConfig: Record<string, any[]>;\n globalSettings: Record<string, any>;\n };\n previewJson: {\n kind: \"workflow_code_preview\";\n version: \"preview_v1\";\n steps: any[];\n edges: any[];\n sourceMode: \"workflow_code_ts\";\n };\n}\n\nexport interface WorkflowDefinitionInput {\n name?: string;\n formCode?: string;\n formUuid?: string;\n globalSettings?: Record<string, any>;\n build: (flow: WorkflowBuilder) => void;\n}\n\nexport interface WorkflowDeclarativeInput {\n id?: string;\n name?: string;\n formCode?: string;\n formUuid?: string;\n globalSettings?: Record<string, any>;\n nodes: WorkflowDeclarativeNode[];\n edges?: WorkflowDeclarativeEdge[];\n}\n\nexport interface WorkflowDeclarativeNode {\n __openxiangdaWorkflowNode: true;\n id: WorkflowNodeRef;\n type: string;\n data: NodeOptions;\n}\n\nexport interface WorkflowDeclarativeEdge {\n __openxiangdaWorkflowEdge: true;\n source: WorkflowNodeRef;\n target: WorkflowNodeRef;\n data?: NodeOptions;\n}\n\ntype NodeOptions = Record<string, any>;\n\nfunction sanitizeId(value: string) {\n return String(value || \"\")\n .trim()\n .replace(/[^a-zA-Z0-9_-]/g, \"_\");\n}\n\nfunction createPosition(index: number) {\n return { x: 400, y: 100 + index * 150 };\n}\n\nfunction hasRequiredValue(value: any) {\n if (Array.isArray(value)) return value.length > 0;\n return value !== undefined && value !== null && String(value).trim() !== \"\";\n}\n\nfunction validateCompiledWorkflowDefinition(definitionJson: WorkflowCompileResult[\"definitionJson\"]) {\n const errors: string[] = [];\n for (const node of definitionJson.nodes || []) {\n const nodeId = node?.id || \"<unknown>\";\n const data = node?.data || {};\n switch (node?.type) {\n case \"function_call\":\n if (!hasRequiredValue(data.functionCode)) {\n errors.push(`function_call node ${nodeId} requires functionCode`);\n }\n break;\n case \"callback_wait\":\n if (!hasRequiredValue(data.eventCode)) {\n errors.push(`callback_wait node ${nodeId} requires eventCode`);\n }\n break;\n case \"work_notification\":\n if (\n !hasRequiredValue(data.title) ||\n !hasRequiredValue(data.content) ||\n !hasRequiredValue(data.recipientType)\n ) {\n errors.push(`work_notification node ${nodeId} requires title, content, and recipientType`);\n }\n break;\n default:\n break;\n }\n }\n if (errors.length > 0) {\n throw new Error(`workflow DSL validation failed:\\n- ${errors.join(\"\\n- \")}`);\n }\n}\n\nfunction normalizeAction(action: string, label: string, extra: NodeOptions = {}) {\n return {\n action,\n name: { zh_CN: label },\n ...extra,\n };\n}\n\nconst workflowActions = {\n approve: (label = \"同意\", extra: NodeOptions = {}) =>\n normalizeAction(\"agree\", label, extra),\n reject: (label = \"拒绝\", extra: NodeOptions = {}) =>\n normalizeAction(\"rejected\", label, extra),\n transfer: (label = \"转交\", extra: NodeOptions = {}) =>\n normalizeAction(\"transfer\", label, {\n remark: { popUp: true, required: false },\n ...extra,\n }),\n return: (label = \"退回\", extra: NodeOptions = {}) =>\n normalizeAction(\"return\", label, {\n remark: { popUp: true, required: false },\n ...extra,\n }),\n returnToInitiator: (label = \"退回发起人\", extra: NodeOptions = {}) =>\n normalizeAction(\"return\", label, {\n remark: { popUp: true, required: false },\n returnTarget: \"initiator\",\n returnScope: \"initiator\",\n ...extra,\n }),\n save: (label = \"暂存\", extra: NodeOptions = {}) =>\n normalizeAction(\"save\", label, extra),\n withdraw: (label = \"撤回\", extra: NodeOptions = {}) =>\n normalizeAction(\"withdraw\", label, extra),\n resubmit: (label = \"重新提交\", extra: NodeOptions = {}) =>\n normalizeAction(\"resubmit\", label, extra),\n callback: (label = \"触发回调\", extra: NodeOptions = {}) =>\n normalizeAction(\"callback\", label, extra),\n retryException: (label = \"重试异常\", extra: NodeOptions = {}) =>\n normalizeAction(\"retryException\", label, extra),\n adminTransfer: (label = \"管理员转交\", extra: NodeOptions = {}) =>\n normalizeAction(\"adminTransfer\", label, extra),\n};\n\nfunction normalizeReturnConfig(value: any) {\n if (value === false) return { enabled: false };\n if (value === true || value === undefined) {\n return { enabled: true, scopeType: \"previous_all\" };\n }\n return {\n enabled: value.enabled !== false,\n scopeType: value.scopeType || value.scope || \"previous_all\",\n resubmitMode: value.resubmitMode || \"resume_current\",\n ...value,\n };\n}\n\nfunction findInitiatorReturnAction(actions: any[]) {\n return actions.find(\n (action) =>\n action?.action === \"return\" &&\n (action.returnTarget === \"initiator\" || action.returnScope === \"initiator\"),\n );\n}\n\nfunction inferReturnConfigFromActions(actions: any[], explicitReturnConfig?: any) {\n const initiatorReturnAction = findInitiatorReturnAction(actions);\n if (!initiatorReturnAction) return explicitReturnConfig;\n\n const base =\n explicitReturnConfig ||\n normalizeReturnConfig({\n scopeType: \"initiator\",\n resubmitMode: initiatorReturnAction.resubmitMode || \"replay\",\n });\n\n return {\n ...base,\n scopeType: base.scopeType || \"initiator\",\n allowOriginatorReturn: true,\n };\n}\n\nfunction normalizeFieldBehavior(value: any) {\n const normalized = String(value || \"\").trim().toLowerCase();\n if ([\"normal\", \"edit\", \"editable\", \"write\", \"writable\"].includes(normalized)) return \"NORMAL\";\n if ([\"readonly\", \"read\", \"view\", \"visible\"].includes(normalized)) return \"READONLY\";\n if ([\"hidden\", \"hide\", \"invisible\"].includes(normalized)) return \"HIDDEN\";\n return String(value || \"READONLY\").toUpperCase();\n}\n\nfunction normalizeFieldPermissions(value: any): any[] | undefined {\n if (Array.isArray(value)) {\n return value.map((item) => {\n if (!item || typeof item !== \"object\") return item;\n return {\n ...item,\n fieldId: item.fieldId || item.field || item.id,\n fieldBehavior: normalizeFieldBehavior(item.fieldBehavior || item.behavior || item.permission),\n };\n });\n }\n if (value && typeof value === \"object\") {\n return Object.entries(value).map(([fieldId, fieldBehavior]) => ({\n fieldId,\n fieldBehavior: normalizeFieldBehavior(fieldBehavior),\n }));\n }\n return undefined;\n}\n\nfunction createDeclarativeNode(\n type: string,\n id: string,\n data: NodeOptions = {},\n): WorkflowDeclarativeNode {\n return {\n __openxiangdaWorkflowNode: true,\n id: sanitizeId(id),\n type,\n data,\n };\n}\n\nfunction createDeclarativeEdge(\n source: WorkflowNodeRef,\n target: WorkflowNodeRef,\n data: NodeOptions = {},\n): WorkflowDeclarativeEdge {\n return {\n __openxiangdaWorkflowEdge: true,\n source,\n target,\n data,\n };\n}\n\nfunction isDeclarativeInput(input: any): input is WorkflowDeclarativeInput {\n return input && Array.isArray(input.nodes);\n}\n\nfunction isWorkflowNodeDescriptor(value: any): value is WorkflowDeclarativeNode {\n return Boolean(value?.__openxiangdaWorkflowNode);\n}\n\nfunction normalizeAssignee(value: any) {\n if (typeof value === \"string\") {\n return { type: value === \"originator\" ? \"originator\" : \"user\", id: value, name: value };\n }\n return value || {};\n}\n\nfunction normalizeApprovalData(data: NodeOptions = {}) {\n const normalized: NodeOptions = { ...data };\n const assignees = Array.isArray(data.assignees)\n ? data.assignees.map(normalizeAssignee)\n : undefined;\n\n if (assignees && !normalized.approverType) {\n const supervisor = assignees.find((item) => item.type === \"department_supervisor\");\n const initiatorSelect = assignees.find((item) => item.type === \"initiator_select\");\n const roleAssignees = assignees.filter((item) => item.type === \"role\");\n const userAssignees = assignees.filter((item) => item.type === \"user\" || item.type === \"originator\");\n\n if (supervisor) {\n normalized.approverType = \"ext_target_approval_department_supervisor\";\n normalized.supervisorConfig = {\n level: supervisor.level || 1,\n fallbackToAncestorSupervisor: supervisor.fallbackToAncestorSupervisor !== false,\n ...(normalized.supervisorConfig || {}),\n };\n normalized.approvals = normalized.approvals || [];\n normalized.approvalNames = normalized.approvalNames || [];\n } else if (initiatorSelect) {\n normalized.approverType = \"ext_target_approval_initiator_select\";\n normalized.initiatorSelectScope = initiatorSelect.scope || initiatorSelect.initiatorSelectScope || \"all\";\n normalized.approvals =\n normalized.approvals ||\n (Array.isArray(initiatorSelect.approvals)\n ? initiatorSelect.approvals\n : roleAssignees.map((item) => item.id).filter(Boolean));\n normalized.approvalNames =\n normalized.approvalNames ||\n (Array.isArray(initiatorSelect.approvalNames)\n ? initiatorSelect.approvalNames\n : roleAssignees.map((item) => item.name || item.id).filter(Boolean));\n } else if (roleAssignees.length > 0 && userAssignees.length === 0) {\n normalized.approverType = \"ext_target_approval_role\";\n normalized.approvals = normalized.approvals || roleAssignees.map((item) => item.id).filter(Boolean);\n normalized.approvalNames =\n normalized.approvalNames || roleAssignees.map((item) => item.name || item.id).filter(Boolean);\n } else {\n normalized.approverType = \"ext_target_approval\";\n normalized.approvals =\n normalized.approvals ||\n userAssignees\n .map((item) => (item.type === \"originator\" ? \"originator\" : item.id))\n .filter(Boolean);\n normalized.approvalNames =\n normalized.approvalNames ||\n userAssignees\n .map((item) => item.name || (item.type === \"originator\" ? \"发起人\" : item.id))\n .filter(Boolean);\n }\n }\n\n return normalized;\n}\n\nexport class WorkflowBuilder {\n private nodes: any[] = [];\n private edges: any[] = [];\n private flowConfig: Record<string, any[]> = {};\n private globalSettings: Record<string, any> = {};\n readonly action = workflowActions;\n\n constructor(private readonly meta: Omit<WorkflowDefinitionInput, \"build\"> = {}) {\n this.globalSettings = { ...(meta.globalSettings || {}) };\n }\n\n start(id = \"start\", data: NodeOptions = {}): WorkflowNodeRef {\n return this.node(\"start\", id, { label: \"开始节点\", ...data });\n }\n\n end(id = \"end\", data: NodeOptions = {}): WorkflowNodeRef {\n return this.node(\"end\", id, { label: \"结束节点\", ...data });\n }\n\n approval(id: string, data: NodeOptions): WorkflowNodeRef {\n const approvalData = normalizeApprovalData(data);\n const actions =\n approvalData.buttons || approvalData.actions || [\n this.action.approve(),\n this.action.reject(),\n ];\n const returnConfig =\n approvalData.returnConfig !== undefined\n ? normalizeReturnConfig(approvalData.returnConfig)\n : approvalData.returnPolicy !== undefined\n ? normalizeReturnConfig(approvalData.returnPolicy)\n : undefined;\n const inferredReturnConfig = inferReturnConfigFromActions(actions, returnConfig);\n return this.node(\"approval\", id, {\n label: approvalData.label || \"审批\",\n value: approvalData.value || \"\",\n approverType: approvalData.approverType || \"ext_target_approval\",\n approvals: approvalData.approvals || [],\n approvalNames: approvalData.approvalNames || [],\n multiApprove: approvalData.multiApprove || \"or\",\n ...approvalData,\n actions,\n ...(inferredReturnConfig ? { returnConfig: inferredReturnConfig } : {}),\n });\n }\n\n copy(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"copy\", id, {\n label: data.label || \"抄送\",\n value: data.value || \"\",\n approverType: data.approverType || \"ext_target_approval\",\n approvals: data.approvals || [],\n approvalNames: data.approvalNames || [],\n ...data,\n });\n }\n\n jsCode(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"js_code\", id, {\n label: data.label || \"JS代码节点\",\n runtimeMode: \"trusted_node\",\n sourceType: data.sourceFile ? \"file_snapshot\" : data.sourceType || \"inline\",\n timeout: data.timeout || data.timeoutMs || 30000,\n ...data,\n });\n }\n\n functionCall(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"function_call\", id, {\n label: data.label || \"调用函数\",\n functionCode: data.functionCode || data.functionName || data.code,\n input: data.input || data.inputMapping || {},\n saveResponseTo: data.saveResponseTo || data.outputKey,\n timeout: data.timeout || data.timeoutMs || 30000,\n ...data,\n });\n }\n\n callbackWait(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"callback_wait\", id, {\n type: \"callback_wait\",\n label: data.label || \"回调等待\",\n timeoutSeconds: data.timeoutSeconds || 86400,\n timeoutStrategy: data.timeoutStrategy || \"FAIL\",\n ...data,\n });\n }\n\n connectorCall(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"connector_call\", id, {\n type: \"connector_call\",\n label: data.label || \"连接器\",\n timeout: data.timeout || 30000,\n ...data,\n });\n }\n\n workNotification(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"work_notification\", id, {\n label: data.label || \"工作通知\",\n buttonText: data.buttonText || \"查看详情\",\n linkType: data.linkType || \"current_form\",\n ...data,\n });\n }\n\n notification(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.workNotification(id, data);\n }\n\n dingtalkCard(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"dingtalk_card\", id, {\n config: {\n type: \"dingtalk_card\",\n label: data.label || \"钉钉消息卡片\",\n sameFieldStrategy: \"create\",\n ...(data.config || data),\n },\n });\n }\n\n condition(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"condition_branch\", id, {\n type: \"condition_branch\",\n label: data.label || \"条件分支\",\n condition: data.condition || { ruleType: \"group\", condition: \"AND\", rules: [] },\n isElse: data.isElse === true,\n priority: data.priority || \"1\",\n trueNodeId: data.trueNodeId,\n falseNodeId: data.falseNodeId,\n ...data,\n });\n }\n\n branch(id: string, data: NodeOptions = {}): WorkflowNodeRef {\n return this.node(\"branch\", id, {\n label: data.label || \"辅助分支\",\n isAuxNode: data.isAuxNode ?? true,\n branchType: data.branchType || \"controller\",\n ...data,\n });\n }\n\n parallel(\n id: string,\n branches: Array<{\n id: string;\n label?: string;\n nodes: WorkflowNodeRef[];\n }>,\n data: NodeOptions = {},\n ) {\n const entry = this.branch(`${id}_branch`, {\n label: data.label || \"并行分支\",\n branchType: \"parallel_controller\",\n hidden: true,\n });\n const converge = this.branch(`${id}_converge`, {\n label: data.convergeLabel || \"并行汇聚\",\n branchType: \"converge\",\n hidden: true,\n });\n\n branches.forEach((branch, index) => {\n const nodes = branch.nodes.filter(Boolean);\n if (nodes.length === 0) return;\n this.edge(entry, nodes[0], {\n id: `edge_${entry}_${sanitizeId(branch.id || String(index))}`,\n label: branch.label,\n });\n this.sequence(...nodes);\n this.edge(nodes[nodes.length - 1], converge, {\n id: `edge_${sanitizeId(branch.id || String(index))}_${converge}`,\n });\n });\n\n return { entry, converge };\n }\n\n conditionBranches(\n id: string,\n branches: Array<{\n id: string;\n label?: string;\n condition?: any;\n nodes: WorkflowNodeRef[];\n isElse?: boolean;\n }>,\n data: NodeOptions = {},\n ) {\n const entry = this.branch(`${id}_controller`, {\n label: data.label || \"条件分支\",\n branchType: \"condition_controller\",\n hidden: true,\n });\n const converge = this.branch(`${id}_converge`, {\n label: data.convergeLabel || \"条件汇聚\",\n branchType: \"converge\",\n hidden: true,\n });\n\n branches.forEach((branch, index) => {\n const condition = this.condition(`${id}_${branch.id}`, {\n label: branch.label || (branch.isElse ? \"其他情况\" : `条件 ${index + 1}`),\n condition:\n branch.condition || {\n ruleType: \"group\",\n condition: \"AND\",\n rules: [],\n },\n isElse: branch.isElse === true,\n priority: String(index + 1),\n });\n this.edge(entry, condition, {\n id: `edge_${entry}_${condition}`,\n label: branch.label,\n });\n const nodes = branch.nodes.filter(Boolean);\n if (nodes.length > 0) {\n this.edge(condition, nodes[0], {\n id: `edge_${condition}_${nodes[0]}`,\n label: branch.label,\n });\n this.sequence(...nodes);\n this.edge(nodes[nodes.length - 1], converge, {\n id: `edge_${nodes[nodes.length - 1]}_${converge}`,\n });\n } else {\n this.edge(condition, converge, {\n id: `edge_${condition}_${converge}`,\n });\n }\n });\n\n if (!branches.some((branch) => branch.isElse)) {\n const elseNode = this.condition(`${id}_else`, {\n label: \"其他情况\",\n isElse: true,\n priority: String(branches.length + 1),\n condition: { ruleType: \"group\", condition: \"AND\", rules: [] },\n });\n this.edge(entry, elseNode, { id: `edge_${entry}_${elseNode}`, label: \"其他情况\" });\n this.edge(elseNode, converge, { id: `edge_${elseNode}_${converge}` });\n }\n\n return { entry, converge };\n }\n\n data = {\n retrieveSingle: (id: string, data: NodeOptions) =>\n this.node(\"data_retrieve_single\", id, {\n type: \"data_retrieve_single\",\n label: data.label || \"获取单条数据\",\n filterType: data.filterType || \"condition\",\n ...data,\n }),\n retrieveBatch: (id: string, data: NodeOptions) =>\n this.node(\"data_retrieve_batch\", id, {\n type: \"data_retrieve_batch\",\n label: data.label || \"获取多条数据\",\n filterType: data.filterType || \"condition\",\n ...data,\n }),\n create: (id: string, data: NodeOptions) =>\n this.node(\"data_create\", id, {\n type: \"data_create\",\n label: data.label || \"新增数据\",\n insertType: data.insertType || \"form\",\n assignments: data.assignments || [],\n ...data,\n }),\n update: (id: string, data: NodeOptions) =>\n this.node(\"data_update\", id, {\n type: \"data_update\",\n label: data.label || \"更新数据\",\n updateType: data.updateType || \"direct_form\",\n assignments: data.assignments || [],\n noneOperation: data.noneOperation || \"ignored\",\n ...data,\n }),\n };\n\n node(type: string, id: string, data: NodeOptions): WorkflowNodeRef {\n const nodeId = sanitizeId(id);\n if (!nodeId) throw new Error(\"workflow node id is required\");\n if (this.nodes.some((node) => node.id === nodeId)) {\n throw new Error(`duplicate workflow node id: ${nodeId}`);\n }\n this.nodes.push({\n id: nodeId,\n type,\n data,\n position: createPosition(this.nodes.length),\n });\n const fieldPermissions = normalizeFieldPermissions(data.fieldPermissions);\n if (fieldPermissions) {\n this.flowConfig[nodeId] = fieldPermissions;\n }\n return nodeId;\n }\n\n edge(source: WorkflowNodeRef, target: WorkflowNodeRef, data: NodeOptions = {}) {\n const id = data.id || `edge_${source}_${target}`;\n this.edges.push({\n id,\n source,\n target,\n type: data.type || \"custom\",\n ...(data.label ? { label: data.label } : {}),\n });\n }\n\n connect(source: WorkflowNodeRef, target: WorkflowNodeRef, data: NodeOptions = {}) {\n this.edge(source, target, data);\n }\n\n sequence(...refs: WorkflowNodeRef[]) {\n for (let index = 0; index < refs.length - 1; index += 1) {\n this.edge(refs[index], refs[index + 1]);\n }\n }\n\n setFieldPermissions(nodeId: WorkflowNodeRef, permissions: any[]) {\n this.flowConfig[nodeId] = permissions;\n }\n\n setGlobalSettings(settings: Record<string, any>) {\n this.globalSettings = { ...this.globalSettings, ...settings };\n }\n\n compile(): WorkflowCompileResult {\n const definitionJson = {\n version: \"v3\" as const,\n nodes: this.nodes,\n edges: this.edges,\n flowConfig: this.flowConfig,\n globalSettings: this.globalSettings,\n };\n validateCompiledWorkflowDefinition(definitionJson);\n return {\n definitionJson,\n previewJson: {\n kind: \"workflow_code_preview\",\n version: \"preview_v1\",\n sourceMode: \"workflow_code_ts\",\n steps: this.nodes.map((node) => ({\n id: node.id,\n type: node.type,\n label: node.data?.label || node.id,\n config: node.data,\n })),\n edges: this.edges.map((edge) => ({\n source: edge.source,\n target: edge.target,\n label: edge.label,\n })),\n },\n };\n }\n}\n\nexport function defineWorkflow(input: WorkflowDefinitionInput) {\n return {\n __openxiangdaWorkflow: true,\n compile() {\n const builder = new WorkflowBuilder(input);\n input.build(builder);\n return builder.compile();\n },\n };\n}\n\nfunction addDeclarativeNode(builder: WorkflowBuilder, node: WorkflowDeclarativeNode) {\n if (!isWorkflowNodeDescriptor(node)) {\n throw new Error(\"workflow declarative nodes must be created by flow.* helpers\");\n }\n\n switch (node.type) {\n case \"start\":\n builder.start(node.id, node.data);\n return;\n case \"end\":\n builder.end(node.id, node.data);\n return;\n case \"approval\":\n builder.approval(node.id, node.data);\n return;\n case \"copy\":\n builder.copy(node.id, node.data);\n return;\n case \"js_code\":\n builder.jsCode(node.id, node.data);\n return;\n case \"function_call\":\n builder.functionCall(node.id, node.data);\n return;\n case \"callback_wait\":\n builder.callbackWait(node.id, node.data);\n return;\n case \"connector_call\":\n builder.connectorCall(node.id, node.data);\n return;\n case \"work_notification\":\n builder.workNotification(node.id, node.data);\n return;\n case \"condition_branch\":\n builder.condition(node.id, node.data);\n return;\n case \"branch\": {\n builder.branch(node.id, node.data);\n const branches = Array.isArray(node.data?.branches) ? node.data.branches : [];\n branches.forEach((branch: any, index: number) => {\n const conditionId = sanitizeId(`${node.id}_${branch.id || index + 1}`);\n builder.condition(conditionId, {\n label: branch.label || (branch.else || branch.isElse ? \"其他情况\" : `条件 ${index + 1}`),\n condition:\n branch.condition || {\n ruleType: \"group\",\n condition: \"AND\",\n rules: [],\n },\n isElse: branch.else === true || branch.isElse === true,\n priority: String(index + 1),\n });\n builder.edge(node.id, conditionId, {\n id: `edge_${node.id}_${conditionId}`,\n label: branch.label,\n });\n if (branch.next) {\n builder.edge(conditionId, sanitizeId(branch.next), {\n id: `edge_${conditionId}_${sanitizeId(branch.next)}`,\n label: branch.label,\n });\n }\n });\n return;\n }\n default:\n builder.node(node.type, node.id, node.data);\n }\n}\n\nfunction defineDeclarativeWorkflow(input: WorkflowDeclarativeInput) {\n return {\n __openxiangdaWorkflow: true,\n compile() {\n const builder = new WorkflowBuilder(input);\n input.nodes.forEach((node) => addDeclarativeNode(builder, node));\n (input.edges || []).forEach((edge) => {\n builder.edge(edge.source, edge.target, edge.data || {});\n });\n return builder.compile();\n },\n };\n}\n\nexport const flow = {\n define(input: WorkflowDefinitionInput | WorkflowDeclarativeInput) {\n if (isDeclarativeInput(input)) {\n return defineDeclarativeWorkflow(input);\n }\n return defineWorkflow(input);\n },\n action: workflowActions,\n assignee: {\n user: (id: string, name?: string) => ({ type: \"user\", id, name: name || id }),\n initiator: () => ({ type: \"originator\", id: \"originator\", name: \"发起人\" }),\n role: (id: string, name?: string) => ({ type: \"role\", id, name: name || id }),\n departmentSupervisor: (\n level = 1,\n extra: NodeOptions = {},\n ) => ({ type: \"department_supervisor\", level, ...extra }),\n initiatorSelect: (\n scope: \"all\" | \"members\" | \"roles\" = \"all\",\n extra: NodeOptions = {},\n ) => ({ type: \"initiator_select\", scope, ...extra }),\n },\n start: (id = \"start\", data: NodeOptions = {}) =>\n createDeclarativeNode(\"start\", id, data),\n end: (id = \"end\", data: NodeOptions = {}) =>\n createDeclarativeNode(\"end\", id, data),\n approval: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"approval\", id, data),\n copy: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"copy\", id, data),\n jsCode: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"js_code\", id, data),\n functionCall: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"function_call\", id, data),\n callbackWait: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"callback_wait\", id, data),\n connectorCall: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"connector_call\", id, data),\n workNotification: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"work_notification\", id, data),\n notification: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"work_notification\", id, data),\n condition: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"condition_branch\", id, data),\n branch: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"branch\", id, data),\n data: {\n retrieveSingle: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"data_retrieve_single\", id, data),\n retrieveBatch: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"data_retrieve_batch\", id, data),\n create: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"data_create\", id, data),\n update: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"data_update\", id, data),\n },\n connect: createDeclarativeEdge,\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/workflow/index.ts"],"sourcesContent":["export type WorkflowNodeRef = string;\n\nexport interface WorkflowCompileResult {\n definitionJson: {\n version: \"v3\";\n nodes: any[];\n edges: any[];\n flowConfig: Record<string, any[]>;\n globalSettings: Record<string, any>;\n };\n previewJson: {\n kind: \"workflow_code_preview\";\n version: \"preview_v1\";\n steps: any[];\n edges: any[];\n sourceMode: \"workflow_code_ts\";\n };\n}\n\nexport interface WorkflowDefinitionInput {\n name?: string;\n formCode?: string;\n formUuid?: string;\n globalSettings?: Record<string, any>;\n build: (flow: WorkflowBuilder) => void;\n}\n\nexport interface WorkflowDeclarativeInput {\n id?: string;\n name?: string;\n formCode?: string;\n formUuid?: string;\n globalSettings?: Record<string, any>;\n nodes: WorkflowDeclarativeNode[];\n edges?: WorkflowDeclarativeEdge[];\n}\n\nexport interface WorkflowDeclarativeNode {\n __openxiangdaWorkflowNode: true;\n id: WorkflowNodeRef;\n type: string;\n data: NodeOptions;\n}\n\nexport interface WorkflowDeclarativeEdge {\n __openxiangdaWorkflowEdge: true;\n source: WorkflowNodeRef;\n target: WorkflowNodeRef;\n data?: NodeOptions;\n}\n\ntype NodeOptions = Record<string, any>;\n\nfunction sanitizeId(value: string) {\n return String(value || \"\")\n .trim()\n .replace(/[^a-zA-Z0-9_-]/g, \"_\");\n}\n\nfunction createPosition(index: number) {\n return { x: 400, y: 100 + index * 150 };\n}\n\nfunction hasRequiredValue(value: any) {\n if (Array.isArray(value)) return value.length > 0;\n return value !== undefined && value !== null && String(value).trim() !== \"\";\n}\n\nfunction validateCompiledWorkflowDefinition(definitionJson: WorkflowCompileResult[\"definitionJson\"]) {\n const errors: string[] = [];\n for (const node of definitionJson.nodes || []) {\n const nodeId = node?.id || \"<unknown>\";\n const data = node?.data || {};\n switch (node?.type) {\n case \"function_call\":\n if (!hasRequiredValue(data.functionCode)) {\n errors.push(`function_call node ${nodeId} requires functionCode`);\n }\n break;\n case \"callback_wait\":\n if (!hasRequiredValue(data.eventCode)) {\n errors.push(`callback_wait node ${nodeId} requires eventCode`);\n }\n break;\n case \"work_notification\":\n if (\n !hasRequiredValue(data.title) ||\n !hasRequiredValue(data.content) ||\n !hasRequiredValue(data.recipientType)\n ) {\n errors.push(`work_notification node ${nodeId} requires title, content, and recipientType`);\n }\n break;\n default:\n break;\n }\n }\n if (errors.length > 0) {\n throw new Error(`workflow DSL validation failed:\\n- ${errors.join(\"\\n- \")}`);\n }\n}\n\nfunction normalizeAction(action: string, label: string, extra: NodeOptions = {}) {\n return {\n action,\n name: { zh_CN: label },\n ...extra,\n };\n}\n\nconst workflowActions = {\n approve: (label = \"同意\", extra: NodeOptions = {}) =>\n normalizeAction(\"agree\", label, extra),\n reject: (label = \"拒绝\", extra: NodeOptions = {}) =>\n normalizeAction(\"rejected\", label, extra),\n transfer: (label = \"转交\", extra: NodeOptions = {}) =>\n normalizeAction(\"transfer\", label, {\n remark: { popUp: true, required: false },\n ...extra,\n }),\n return: (label = \"退回\", extra: NodeOptions = {}) =>\n normalizeAction(\"return\", label, {\n remark: { popUp: true, required: false },\n ...extra,\n }),\n returnToInitiator: (label = \"退回发起人\", extra: NodeOptions = {}) =>\n normalizeAction(\"return\", label, {\n remark: { popUp: true, required: false },\n returnTarget: \"initiator\",\n returnScope: \"initiator\",\n ...extra,\n }),\n save: (label = \"暂存\", extra: NodeOptions = {}) =>\n normalizeAction(\"save\", label, extra),\n withdraw: (label = \"撤回\", extra: NodeOptions = {}) =>\n normalizeAction(\"withdraw\", label, extra),\n resubmit: (label = \"重新提交\", extra: NodeOptions = {}) =>\n normalizeAction(\"resubmit\", label, extra),\n callback: (label = \"触发回调\", extra: NodeOptions = {}) =>\n normalizeAction(\"callback\", label, extra),\n retryException: (label = \"重试异常\", extra: NodeOptions = {}) =>\n normalizeAction(\"retryException\", label, extra),\n adminTransfer: (label = \"管理员转交\", extra: NodeOptions = {}) =>\n normalizeAction(\"adminTransfer\", label, extra),\n};\n\nfunction normalizeReturnConfig(value: any) {\n if (value === false) return { enabled: false };\n if (value === true || value === undefined) {\n return { enabled: true, scopeType: \"previous_all\" };\n }\n return {\n enabled: value.enabled !== false,\n scopeType: value.scopeType || value.scope || \"previous_all\",\n resubmitMode: value.resubmitMode || \"resume_current\",\n ...value,\n };\n}\n\nfunction findInitiatorReturnAction(actions: any[]) {\n return actions.find(\n (action) =>\n action?.action === \"return\" &&\n (action.returnTarget === \"initiator\" || action.returnScope === \"initiator\"),\n );\n}\n\nfunction inferReturnConfigFromActions(actions: any[], explicitReturnConfig?: any) {\n const initiatorReturnAction = findInitiatorReturnAction(actions);\n if (!initiatorReturnAction) return explicitReturnConfig;\n\n const base =\n explicitReturnConfig ||\n normalizeReturnConfig({\n scopeType: \"initiator\",\n resubmitMode: initiatorReturnAction.resubmitMode || \"replay\",\n });\n\n return {\n ...base,\n scopeType: base.scopeType || \"initiator\",\n allowOriginatorReturn: true,\n };\n}\n\nfunction normalizeFieldBehavior(value: any) {\n const normalized = String(value || \"\").trim().toLowerCase();\n if ([\"normal\", \"edit\", \"editable\", \"write\", \"writable\"].includes(normalized)) return \"NORMAL\";\n if ([\"readonly\", \"read\", \"view\", \"visible\"].includes(normalized)) return \"READONLY\";\n if ([\"hidden\", \"hide\", \"invisible\"].includes(normalized)) return \"HIDDEN\";\n return String(value || \"READONLY\").toUpperCase();\n}\n\nfunction normalizeFieldPermissions(value: any): any[] | undefined {\n if (Array.isArray(value)) {\n return value.map((item) => {\n if (!item || typeof item !== \"object\") return item;\n return {\n ...item,\n fieldId: item.fieldId || item.field || item.id,\n fieldBehavior: normalizeFieldBehavior(item.fieldBehavior || item.behavior || item.permission),\n };\n });\n }\n if (value && typeof value === \"object\") {\n return Object.entries(value).map(([fieldId, fieldBehavior]) => ({\n fieldId,\n fieldBehavior: normalizeFieldBehavior(fieldBehavior),\n }));\n }\n return undefined;\n}\n\nfunction normalizeConditionRule(rule: any): any {\n if (!rule || typeof rule !== \"object\") return rule;\n if (Array.isArray(rule)) return rule.map(normalizeConditionRule);\n\n const normalized: NodeOptions = { ...rule };\n const fieldId = rule.id || rule.fieldId || rule.field || rule.key || rule.column;\n const operator = rule.opCode || rule.op || rule.operator;\n const componentType = rule.componentType || rule.componentName;\n\n if (Array.isArray(rule.rules)) {\n normalized.rules = rule.rules.map(normalizeConditionRule);\n }\n if (fieldId) {\n normalized.id = normalized.id || fieldId;\n normalized.fieldId = normalized.fieldId || fieldId;\n }\n if (operator) {\n normalized.opCode = normalized.opCode || operator;\n normalized.operator = normalized.operator || operator;\n }\n if (componentType) {\n normalized.componentType = normalized.componentType || componentType;\n }\n\n return normalized;\n}\n\nfunction createDeclarativeNode(\n type: string,\n id: string,\n data: NodeOptions = {},\n): WorkflowDeclarativeNode {\n return {\n __openxiangdaWorkflowNode: true,\n id: sanitizeId(id),\n type,\n data,\n };\n}\n\nfunction createDeclarativeEdge(\n source: WorkflowNodeRef,\n target: WorkflowNodeRef,\n data: NodeOptions = {},\n): WorkflowDeclarativeEdge {\n return {\n __openxiangdaWorkflowEdge: true,\n source,\n target,\n data,\n };\n}\n\nfunction isDeclarativeInput(input: any): input is WorkflowDeclarativeInput {\n return input && Array.isArray(input.nodes);\n}\n\nfunction isWorkflowNodeDescriptor(value: any): value is WorkflowDeclarativeNode {\n return Boolean(value?.__openxiangdaWorkflowNode);\n}\n\nfunction normalizeAssignee(value: any) {\n if (typeof value === \"string\") {\n return { type: value === \"originator\" ? \"originator\" : \"user\", id: value, name: value };\n }\n return value || {};\n}\n\nfunction normalizeApprovalData(data: NodeOptions = {}) {\n const normalized: NodeOptions = { ...data };\n const assignees = Array.isArray(data.assignees)\n ? data.assignees.map(normalizeAssignee)\n : undefined;\n\n if (assignees && !normalized.approverType) {\n const supervisor = assignees.find((item) => item.type === \"department_supervisor\");\n const initiatorSelect = assignees.find((item) => item.type === \"initiator_select\");\n const roleAssignees = assignees.filter((item) => item.type === \"role\");\n const userAssignees = assignees.filter((item) => item.type === \"user\" || item.type === \"originator\");\n\n if (supervisor) {\n normalized.approverType = \"ext_target_approval_department_supervisor\";\n normalized.supervisorConfig = {\n level: supervisor.level || 1,\n fallbackToAncestorSupervisor: supervisor.fallbackToAncestorSupervisor !== false,\n ...(normalized.supervisorConfig || {}),\n };\n normalized.approvals = normalized.approvals || [];\n normalized.approvalNames = normalized.approvalNames || [];\n } else if (initiatorSelect) {\n normalized.approverType = \"ext_target_approval_initiator_select\";\n normalized.initiatorSelectScope = initiatorSelect.scope || initiatorSelect.initiatorSelectScope || \"all\";\n normalized.approvals =\n normalized.approvals ||\n (Array.isArray(initiatorSelect.approvals)\n ? initiatorSelect.approvals\n : roleAssignees.map((item) => item.id).filter(Boolean));\n normalized.approvalNames =\n normalized.approvalNames ||\n (Array.isArray(initiatorSelect.approvalNames)\n ? initiatorSelect.approvalNames\n : roleAssignees.map((item) => item.name || item.id).filter(Boolean));\n } else if (roleAssignees.length > 0 && userAssignees.length === 0) {\n normalized.approverType = \"ext_target_approval_role\";\n normalized.approvals = normalized.approvals || roleAssignees.map((item) => item.id).filter(Boolean);\n normalized.approvalNames =\n normalized.approvalNames || roleAssignees.map((item) => item.name || item.id).filter(Boolean);\n } else {\n normalized.approverType = \"ext_target_approval\";\n normalized.approvals =\n normalized.approvals ||\n userAssignees\n .map((item) => (item.type === \"originator\" ? \"originator\" : item.id))\n .filter(Boolean);\n normalized.approvalNames =\n normalized.approvalNames ||\n userAssignees\n .map((item) => item.name || (item.type === \"originator\" ? \"发起人\" : item.id))\n .filter(Boolean);\n }\n }\n\n return normalized;\n}\n\nexport class WorkflowBuilder {\n private nodes: any[] = [];\n private edges: any[] = [];\n private flowConfig: Record<string, any[]> = {};\n private globalSettings: Record<string, any> = {};\n readonly action = workflowActions;\n\n constructor(private readonly meta: Omit<WorkflowDefinitionInput, \"build\"> = {}) {\n this.globalSettings = { ...(meta.globalSettings || {}) };\n }\n\n start(id = \"start\", data: NodeOptions = {}): WorkflowNodeRef {\n return this.node(\"start\", id, { label: \"开始节点\", ...data });\n }\n\n end(id = \"end\", data: NodeOptions = {}): WorkflowNodeRef {\n return this.node(\"end\", id, { label: \"结束节点\", ...data });\n }\n\n approval(id: string, data: NodeOptions): WorkflowNodeRef {\n const approvalData = normalizeApprovalData(data);\n const actions =\n approvalData.buttons || approvalData.actions || [\n this.action.approve(),\n this.action.reject(),\n ];\n const returnConfig =\n approvalData.returnConfig !== undefined\n ? normalizeReturnConfig(approvalData.returnConfig)\n : approvalData.returnPolicy !== undefined\n ? normalizeReturnConfig(approvalData.returnPolicy)\n : undefined;\n const inferredReturnConfig = inferReturnConfigFromActions(actions, returnConfig);\n return this.node(\"approval\", id, {\n label: approvalData.label || \"审批\",\n value: approvalData.value || \"\",\n approverType: approvalData.approverType || \"ext_target_approval\",\n approvals: approvalData.approvals || [],\n approvalNames: approvalData.approvalNames || [],\n multiApprove: approvalData.multiApprove || \"or\",\n ...approvalData,\n actions,\n ...(inferredReturnConfig ? { returnConfig: inferredReturnConfig } : {}),\n });\n }\n\n copy(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"copy\", id, {\n label: data.label || \"抄送\",\n value: data.value || \"\",\n approverType: data.approverType || \"ext_target_approval\",\n approvals: data.approvals || [],\n approvalNames: data.approvalNames || [],\n ...data,\n });\n }\n\n jsCode(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"js_code\", id, {\n label: data.label || \"JS代码节点\",\n runtimeMode: \"trusted_node\",\n sourceType: data.sourceFile ? \"file_snapshot\" : data.sourceType || \"inline\",\n timeout: data.timeout || data.timeoutMs || 30000,\n ...data,\n });\n }\n\n functionCall(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"function_call\", id, {\n label: data.label || \"调用函数\",\n functionCode: data.functionCode || data.functionName || data.code,\n input: data.input || data.inputMapping || {},\n saveResponseTo: data.saveResponseTo || data.outputKey,\n timeout: data.timeout || data.timeoutMs || 30000,\n ...data,\n });\n }\n\n callbackWait(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"callback_wait\", id, {\n type: \"callback_wait\",\n label: data.label || \"回调等待\",\n timeoutSeconds: data.timeoutSeconds || 86400,\n timeoutStrategy: data.timeoutStrategy || \"FAIL\",\n ...data,\n });\n }\n\n connectorCall(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"connector_call\", id, {\n type: \"connector_call\",\n label: data.label || \"连接器\",\n timeout: data.timeout || 30000,\n ...data,\n });\n }\n\n workNotification(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"work_notification\", id, {\n label: data.label || \"工作通知\",\n buttonText: data.buttonText || \"查看详情\",\n linkType: data.linkType || \"current_form\",\n ...data,\n });\n }\n\n notification(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.workNotification(id, data);\n }\n\n dingtalkCard(id: string, data: NodeOptions): WorkflowNodeRef {\n return this.node(\"dingtalk_card\", id, {\n config: {\n type: \"dingtalk_card\",\n label: data.label || \"钉钉消息卡片\",\n sameFieldStrategy: \"create\",\n ...(data.config || data),\n },\n });\n }\n\n condition(id: string, data: NodeOptions): WorkflowNodeRef {\n const condition = normalizeConditionRule(\n data.condition || { ruleType: \"group\", condition: \"AND\", rules: [] },\n );\n return this.node(\"condition_branch\", id, {\n type: \"condition_branch\",\n label: data.label || \"条件分支\",\n isElse: data.isElse === true,\n priority: data.priority || \"1\",\n trueNodeId: data.trueNodeId,\n falseNodeId: data.falseNodeId,\n ...data,\n condition,\n });\n }\n\n branch(id: string, data: NodeOptions = {}): WorkflowNodeRef {\n return this.node(\"branch\", id, {\n label: data.label || \"辅助分支\",\n isAuxNode: data.isAuxNode ?? true,\n branchType: data.branchType || \"condition_controller\",\n ...data,\n });\n }\n\n parallel(\n id: string,\n branches: Array<{\n id: string;\n label?: string;\n nodes: WorkflowNodeRef[];\n }>,\n data: NodeOptions = {},\n ) {\n const branchId = sanitizeId(id);\n const entryId = sanitizeId(`${id}_branch`);\n const convergeId = sanitizeId(`${id}_converge`);\n const entry = this.branch(entryId, {\n label: data.label || \"并行分支\",\n branchType: \"parallel\",\n branchId,\n branchControllerId: entryId,\n convergeNodeId: convergeId,\n hidden: true,\n });\n const converge = this.branch(convergeId, {\n label: data.convergeLabel || \"并行汇聚\",\n branchType: \"converge\",\n branchId,\n branchControllerId: entryId,\n convergeNodeId: convergeId,\n hidden: true,\n });\n\n branches.forEach((branch, index) => {\n const nodes = branch.nodes.filter(Boolean);\n if (nodes.length === 0) return;\n this.edge(entry, nodes[0], {\n id: `edge_${entry}_${sanitizeId(branch.id || String(index))}`,\n label: branch.label,\n });\n this.sequence(...nodes);\n this.edge(nodes[nodes.length - 1], converge, {\n id: `edge_${sanitizeId(branch.id || String(index))}_${converge}`,\n });\n });\n\n return { entry, converge };\n }\n\n conditionBranches(\n id: string,\n branches: Array<{\n id: string;\n label?: string;\n condition?: any;\n nodes: WorkflowNodeRef[];\n isElse?: boolean;\n }>,\n data: NodeOptions = {},\n ) {\n const branchId = sanitizeId(id);\n const entryId = sanitizeId(`${id}_controller`);\n const convergeId = sanitizeId(`${id}_converge`);\n const entry = this.branch(entryId, {\n label: data.label || \"条件分支\",\n branchType: \"condition_controller\",\n branchId,\n branchControllerId: entryId,\n convergeNodeId: convergeId,\n hidden: true,\n });\n const converge = this.branch(convergeId, {\n label: data.convergeLabel || \"条件汇聚\",\n branchType: \"converge\",\n branchId,\n branchControllerId: entryId,\n convergeNodeId: convergeId,\n hidden: true,\n });\n\n branches.forEach((branch, index) => {\n const condition = this.condition(`${id}_${branch.id}`, {\n label: branch.label || (branch.isElse ? \"其他情况\" : `条件 ${index + 1}`),\n condition:\n branch.condition || {\n ruleType: \"group\",\n condition: \"AND\",\n rules: [],\n },\n isElse: branch.isElse === true,\n priority: String(index + 1),\n branchId,\n branchControllerId: entryId,\n convergeNodeId: convergeId,\n });\n this.edge(entry, condition, {\n id: `edge_${entry}_${condition}`,\n label: branch.label,\n });\n const nodes = branch.nodes.filter(Boolean);\n if (nodes.length > 0) {\n this.edge(condition, nodes[0], {\n id: `edge_${condition}_${nodes[0]}`,\n label: branch.label,\n });\n this.sequence(...nodes);\n this.edge(nodes[nodes.length - 1], converge, {\n id: `edge_${nodes[nodes.length - 1]}_${converge}`,\n });\n } else {\n this.edge(condition, converge, {\n id: `edge_${condition}_${converge}`,\n });\n }\n });\n\n if (!branches.some((branch) => branch.isElse)) {\n const elseNode = this.condition(`${id}_else`, {\n label: \"其他情况\",\n isElse: true,\n priority: String(branches.length + 1),\n condition: { ruleType: \"group\", condition: \"AND\", rules: [] },\n branchId,\n branchControllerId: entryId,\n convergeNodeId: convergeId,\n });\n this.edge(entry, elseNode, { id: `edge_${entry}_${elseNode}`, label: \"其他情况\" });\n this.edge(elseNode, converge, { id: `edge_${elseNode}_${converge}` });\n }\n\n return { entry, converge };\n }\n\n data = {\n retrieveSingle: (id: string, data: NodeOptions) =>\n this.node(\"data_retrieve_single\", id, {\n type: \"data_retrieve_single\",\n label: data.label || \"获取单条数据\",\n filterType: data.filterType || \"condition\",\n ...data,\n }),\n retrieveBatch: (id: string, data: NodeOptions) =>\n this.node(\"data_retrieve_batch\", id, {\n type: \"data_retrieve_batch\",\n label: data.label || \"获取多条数据\",\n filterType: data.filterType || \"condition\",\n ...data,\n }),\n create: (id: string, data: NodeOptions) =>\n this.node(\"data_create\", id, {\n type: \"data_create\",\n label: data.label || \"新增数据\",\n insertType: data.insertType || \"form\",\n assignments: data.assignments || [],\n ...data,\n }),\n update: (id: string, data: NodeOptions) =>\n this.node(\"data_update\", id, {\n type: \"data_update\",\n label: data.label || \"更新数据\",\n updateType: data.updateType || \"direct_form\",\n assignments: data.assignments || [],\n noneOperation: data.noneOperation || \"ignored\",\n ...data,\n }),\n };\n\n node(type: string, id: string, data: NodeOptions): WorkflowNodeRef {\n const nodeId = sanitizeId(id);\n if (!nodeId) throw new Error(\"workflow node id is required\");\n if (this.nodes.some((node) => node.id === nodeId)) {\n throw new Error(`duplicate workflow node id: ${nodeId}`);\n }\n this.nodes.push({\n id: nodeId,\n type,\n data,\n position: createPosition(this.nodes.length),\n });\n const fieldPermissions = normalizeFieldPermissions(data.fieldPermissions);\n if (fieldPermissions) {\n this.flowConfig[nodeId] = fieldPermissions;\n }\n return nodeId;\n }\n\n edge(source: WorkflowNodeRef, target: WorkflowNodeRef, data: NodeOptions = {}) {\n const id = data.id || `edge_${source}_${target}`;\n this.edges.push({\n id,\n source,\n target,\n type: data.type || \"custom\",\n ...(data.label ? { label: data.label } : {}),\n });\n }\n\n connect(source: WorkflowNodeRef, target: WorkflowNodeRef, data: NodeOptions = {}) {\n this.edge(source, target, data);\n }\n\n sequence(...refs: WorkflowNodeRef[]) {\n for (let index = 0; index < refs.length - 1; index += 1) {\n this.edge(refs[index], refs[index + 1]);\n }\n }\n\n setFieldPermissions(nodeId: WorkflowNodeRef, permissions: any[]) {\n this.flowConfig[nodeId] = permissions;\n }\n\n setGlobalSettings(settings: Record<string, any>) {\n this.globalSettings = { ...this.globalSettings, ...settings };\n }\n\n compile(): WorkflowCompileResult {\n const definitionJson = {\n version: \"v3\" as const,\n nodes: this.nodes,\n edges: this.edges,\n flowConfig: this.flowConfig,\n globalSettings: this.globalSettings,\n };\n validateCompiledWorkflowDefinition(definitionJson);\n return {\n definitionJson,\n previewJson: {\n kind: \"workflow_code_preview\",\n version: \"preview_v1\",\n sourceMode: \"workflow_code_ts\",\n steps: this.nodes.map((node) => ({\n id: node.id,\n type: node.type,\n label: node.data?.label || node.id,\n config: node.data,\n })),\n edges: this.edges.map((edge) => ({\n source: edge.source,\n target: edge.target,\n label: edge.label,\n })),\n },\n };\n }\n}\n\nexport function defineWorkflow(input: WorkflowDefinitionInput) {\n return {\n __openxiangdaWorkflow: true,\n compile() {\n const builder = new WorkflowBuilder(input);\n input.build(builder);\n return builder.compile();\n },\n };\n}\n\nfunction addDeclarativeNode(builder: WorkflowBuilder, node: WorkflowDeclarativeNode) {\n if (!isWorkflowNodeDescriptor(node)) {\n throw new Error(\"workflow declarative nodes must be created by flow.* helpers\");\n }\n\n switch (node.type) {\n case \"start\":\n builder.start(node.id, node.data);\n return;\n case \"end\":\n builder.end(node.id, node.data);\n return;\n case \"approval\":\n builder.approval(node.id, node.data);\n return;\n case \"copy\":\n builder.copy(node.id, node.data);\n return;\n case \"js_code\":\n builder.jsCode(node.id, node.data);\n return;\n case \"function_call\":\n builder.functionCall(node.id, node.data);\n return;\n case \"callback_wait\":\n builder.callbackWait(node.id, node.data);\n return;\n case \"connector_call\":\n builder.connectorCall(node.id, node.data);\n return;\n case \"work_notification\":\n builder.workNotification(node.id, node.data);\n return;\n case \"condition_branch\":\n builder.condition(node.id, node.data);\n return;\n case \"branch\": {\n const controllerId = sanitizeId(node.id);\n const branchId = sanitizeId(node.data?.branchId || node.id);\n builder.branch(node.id, {\n ...node.data,\n branchId,\n branchControllerId: node.data?.branchControllerId || controllerId,\n });\n const branches = Array.isArray(node.data?.branches) ? node.data.branches : [];\n branches.forEach((branch: any, index: number) => {\n const conditionId = sanitizeId(`${node.id}_${branch.id || index + 1}`);\n builder.condition(conditionId, {\n label: branch.label || (branch.else || branch.isElse ? \"其他情况\" : `条件 ${index + 1}`),\n condition:\n branch.condition || {\n ruleType: \"group\",\n condition: \"AND\",\n rules: [],\n },\n isElse: branch.else === true || branch.isElse === true,\n priority: String(index + 1),\n branchId,\n branchControllerId: node.data?.branchControllerId || controllerId,\n });\n builder.edge(node.id, conditionId, {\n id: `edge_${node.id}_${conditionId}`,\n label: branch.label,\n });\n if (branch.next) {\n builder.edge(conditionId, sanitizeId(branch.next), {\n id: `edge_${conditionId}_${sanitizeId(branch.next)}`,\n label: branch.label,\n });\n }\n });\n return;\n }\n default:\n builder.node(node.type, node.id, node.data);\n }\n}\n\nfunction defineDeclarativeWorkflow(input: WorkflowDeclarativeInput) {\n return {\n __openxiangdaWorkflow: true,\n compile() {\n const builder = new WorkflowBuilder(input);\n input.nodes.forEach((node) => addDeclarativeNode(builder, node));\n (input.edges || []).forEach((edge) => {\n builder.edge(edge.source, edge.target, edge.data || {});\n });\n return builder.compile();\n },\n };\n}\n\nexport const flow = {\n define(input: WorkflowDefinitionInput | WorkflowDeclarativeInput) {\n if (isDeclarativeInput(input)) {\n return defineDeclarativeWorkflow(input);\n }\n return defineWorkflow(input);\n },\n action: workflowActions,\n assignee: {\n user: (id: string, name?: string) => ({ type: \"user\", id, name: name || id }),\n initiator: () => ({ type: \"originator\", id: \"originator\", name: \"发起人\" }),\n role: (id: string, name?: string) => ({ type: \"role\", id, name: name || id }),\n departmentSupervisor: (\n level = 1,\n extra: NodeOptions = {},\n ) => ({ type: \"department_supervisor\", level, ...extra }),\n initiatorSelect: (\n scope: \"all\" | \"members\" | \"roles\" = \"all\",\n extra: NodeOptions = {},\n ) => ({ type: \"initiator_select\", scope, ...extra }),\n },\n start: (id = \"start\", data: NodeOptions = {}) =>\n createDeclarativeNode(\"start\", id, data),\n end: (id = \"end\", data: NodeOptions = {}) =>\n createDeclarativeNode(\"end\", id, data),\n approval: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"approval\", id, data),\n copy: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"copy\", id, data),\n jsCode: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"js_code\", id, data),\n functionCall: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"function_call\", id, data),\n callbackWait: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"callback_wait\", id, data),\n connectorCall: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"connector_call\", id, data),\n workNotification: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"work_notification\", id, data),\n notification: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"work_notification\", id, data),\n condition: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"condition_branch\", id, data),\n branch: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"branch\", id, data),\n data: {\n retrieveSingle: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"data_retrieve_single\", id, data),\n retrieveBatch: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"data_retrieve_batch\", id, data),\n create: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"data_create\", id, data),\n update: (id: string, data: NodeOptions = {}) =>\n createDeclarativeNode(\"data_update\", id, data),\n },\n connect: createDeclarativeEdge,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -126,6 +126,29 @@ function normalizeFieldPermissions(value) {
|
|
|
126
126
|
}
|
|
127
127
|
return void 0;
|
|
128
128
|
}
|
|
129
|
+
function normalizeConditionRule(rule) {
|
|
130
|
+
if (!rule || typeof rule !== "object") return rule;
|
|
131
|
+
if (Array.isArray(rule)) return rule.map(normalizeConditionRule);
|
|
132
|
+
const normalized = { ...rule };
|
|
133
|
+
const fieldId = rule.id || rule.fieldId || rule.field || rule.key || rule.column;
|
|
134
|
+
const operator = rule.opCode || rule.op || rule.operator;
|
|
135
|
+
const componentType = rule.componentType || rule.componentName;
|
|
136
|
+
if (Array.isArray(rule.rules)) {
|
|
137
|
+
normalized.rules = rule.rules.map(normalizeConditionRule);
|
|
138
|
+
}
|
|
139
|
+
if (fieldId) {
|
|
140
|
+
normalized.id = normalized.id || fieldId;
|
|
141
|
+
normalized.fieldId = normalized.fieldId || fieldId;
|
|
142
|
+
}
|
|
143
|
+
if (operator) {
|
|
144
|
+
normalized.opCode = normalized.opCode || operator;
|
|
145
|
+
normalized.operator = normalized.operator || operator;
|
|
146
|
+
}
|
|
147
|
+
if (componentType) {
|
|
148
|
+
normalized.componentType = normalized.componentType || componentType;
|
|
149
|
+
}
|
|
150
|
+
return normalized;
|
|
151
|
+
}
|
|
129
152
|
function createDeclarativeNode(type, id, data = {}) {
|
|
130
153
|
return {
|
|
131
154
|
__openxiangdaWorkflowNode: true,
|
|
@@ -321,34 +344,46 @@ var WorkflowBuilder = class {
|
|
|
321
344
|
});
|
|
322
345
|
}
|
|
323
346
|
condition(id, data) {
|
|
347
|
+
const condition = normalizeConditionRule(
|
|
348
|
+
data.condition || { ruleType: "group", condition: "AND", rules: [] }
|
|
349
|
+
);
|
|
324
350
|
return this.node("condition_branch", id, {
|
|
325
351
|
type: "condition_branch",
|
|
326
352
|
label: data.label || "\u6761\u4EF6\u5206\u652F",
|
|
327
|
-
condition: data.condition || { ruleType: "group", condition: "AND", rules: [] },
|
|
328
353
|
isElse: data.isElse === true,
|
|
329
354
|
priority: data.priority || "1",
|
|
330
355
|
trueNodeId: data.trueNodeId,
|
|
331
356
|
falseNodeId: data.falseNodeId,
|
|
332
|
-
...data
|
|
357
|
+
...data,
|
|
358
|
+
condition
|
|
333
359
|
});
|
|
334
360
|
}
|
|
335
361
|
branch(id, data = {}) {
|
|
336
362
|
return this.node("branch", id, {
|
|
337
363
|
label: data.label || "\u8F85\u52A9\u5206\u652F",
|
|
338
364
|
isAuxNode: data.isAuxNode ?? true,
|
|
339
|
-
branchType: data.branchType || "
|
|
365
|
+
branchType: data.branchType || "condition_controller",
|
|
340
366
|
...data
|
|
341
367
|
});
|
|
342
368
|
}
|
|
343
369
|
parallel(id, branches, data = {}) {
|
|
344
|
-
const
|
|
370
|
+
const branchId = sanitizeId(id);
|
|
371
|
+
const entryId = sanitizeId(`${id}_branch`);
|
|
372
|
+
const convergeId = sanitizeId(`${id}_converge`);
|
|
373
|
+
const entry = this.branch(entryId, {
|
|
345
374
|
label: data.label || "\u5E76\u884C\u5206\u652F",
|
|
346
|
-
branchType: "
|
|
375
|
+
branchType: "parallel",
|
|
376
|
+
branchId,
|
|
377
|
+
branchControllerId: entryId,
|
|
378
|
+
convergeNodeId: convergeId,
|
|
347
379
|
hidden: true
|
|
348
380
|
});
|
|
349
|
-
const converge = this.branch(
|
|
381
|
+
const converge = this.branch(convergeId, {
|
|
350
382
|
label: data.convergeLabel || "\u5E76\u884C\u6C47\u805A",
|
|
351
383
|
branchType: "converge",
|
|
384
|
+
branchId,
|
|
385
|
+
branchControllerId: entryId,
|
|
386
|
+
convergeNodeId: convergeId,
|
|
352
387
|
hidden: true
|
|
353
388
|
});
|
|
354
389
|
branches.forEach((branch, index) => {
|
|
@@ -366,14 +401,23 @@ var WorkflowBuilder = class {
|
|
|
366
401
|
return { entry, converge };
|
|
367
402
|
}
|
|
368
403
|
conditionBranches(id, branches, data = {}) {
|
|
369
|
-
const
|
|
404
|
+
const branchId = sanitizeId(id);
|
|
405
|
+
const entryId = sanitizeId(`${id}_controller`);
|
|
406
|
+
const convergeId = sanitizeId(`${id}_converge`);
|
|
407
|
+
const entry = this.branch(entryId, {
|
|
370
408
|
label: data.label || "\u6761\u4EF6\u5206\u652F",
|
|
371
409
|
branchType: "condition_controller",
|
|
410
|
+
branchId,
|
|
411
|
+
branchControllerId: entryId,
|
|
412
|
+
convergeNodeId: convergeId,
|
|
372
413
|
hidden: true
|
|
373
414
|
});
|
|
374
|
-
const converge = this.branch(
|
|
415
|
+
const converge = this.branch(convergeId, {
|
|
375
416
|
label: data.convergeLabel || "\u6761\u4EF6\u6C47\u805A",
|
|
376
417
|
branchType: "converge",
|
|
418
|
+
branchId,
|
|
419
|
+
branchControllerId: entryId,
|
|
420
|
+
convergeNodeId: convergeId,
|
|
377
421
|
hidden: true
|
|
378
422
|
});
|
|
379
423
|
branches.forEach((branch, index) => {
|
|
@@ -385,7 +429,10 @@ var WorkflowBuilder = class {
|
|
|
385
429
|
rules: []
|
|
386
430
|
},
|
|
387
431
|
isElse: branch.isElse === true,
|
|
388
|
-
priority: String(index + 1)
|
|
432
|
+
priority: String(index + 1),
|
|
433
|
+
branchId,
|
|
434
|
+
branchControllerId: entryId,
|
|
435
|
+
convergeNodeId: convergeId
|
|
389
436
|
});
|
|
390
437
|
this.edge(entry, condition, {
|
|
391
438
|
id: `edge_${entry}_${condition}`,
|
|
@@ -412,7 +459,10 @@ var WorkflowBuilder = class {
|
|
|
412
459
|
label: "\u5176\u4ED6\u60C5\u51B5",
|
|
413
460
|
isElse: true,
|
|
414
461
|
priority: String(branches.length + 1),
|
|
415
|
-
condition: { ruleType: "group", condition: "AND", rules: [] }
|
|
462
|
+
condition: { ruleType: "group", condition: "AND", rules: [] },
|
|
463
|
+
branchId,
|
|
464
|
+
branchControllerId: entryId,
|
|
465
|
+
convergeNodeId: convergeId
|
|
416
466
|
});
|
|
417
467
|
this.edge(entry, elseNode, { id: `edge_${entry}_${elseNode}`, label: "\u5176\u4ED6\u60C5\u51B5" });
|
|
418
468
|
this.edge(elseNode, converge, { id: `edge_${elseNode}_${converge}` });
|
|
@@ -537,7 +587,13 @@ function addDeclarativeNode(builder, node) {
|
|
|
537
587
|
builder.condition(node.id, node.data);
|
|
538
588
|
return;
|
|
539
589
|
case "branch": {
|
|
540
|
-
|
|
590
|
+
const controllerId = sanitizeId(node.id);
|
|
591
|
+
const branchId = sanitizeId(node.data?.branchId || node.id);
|
|
592
|
+
builder.branch(node.id, {
|
|
593
|
+
...node.data,
|
|
594
|
+
branchId,
|
|
595
|
+
branchControllerId: node.data?.branchControllerId || controllerId
|
|
596
|
+
});
|
|
541
597
|
const branches = Array.isArray(node.data?.branches) ? node.data.branches : [];
|
|
542
598
|
branches.forEach((branch, index) => {
|
|
543
599
|
const conditionId = sanitizeId(`${node.id}_${branch.id || index + 1}`);
|
|
@@ -549,7 +605,9 @@ function addDeclarativeNode(builder, node) {
|
|
|
549
605
|
rules: []
|
|
550
606
|
},
|
|
551
607
|
isElse: branch.else === true || branch.isElse === true,
|
|
552
|
-
priority: String(index + 1)
|
|
608
|
+
priority: String(index + 1),
|
|
609
|
+
branchId,
|
|
610
|
+
branchControllerId: node.data?.branchControllerId || controllerId
|
|
553
611
|
});
|
|
554
612
|
builder.edge(node.id, conditionId, {
|
|
555
613
|
id: `edge_${node.id}_${conditionId}`,
|