weaver-e10-builder 1.0.10-beta → 1.0.11-beta
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/dist/commands/actionflow.d.ts.map +1 -1
- package/dist/commands/actionflow.js +10 -6
- package/dist/commands/actionflow.js.map +1 -1
- package/dist/commands/form-layout-init.d.ts.map +1 -1
- package/dist/commands/form-layout-init.js +7 -1
- package/dist/commands/form-layout-init.js.map +1 -1
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +54 -16
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/wf-form.d.ts +18 -0
- package/dist/commands/wf-form.d.ts.map +1 -1
- package/dist/commands/wf-form.js +156 -181
- package/dist/commands/wf-form.js.map +1 -1
- package/dist/commands/workflow-create-workflow.d.ts.map +1 -1
- package/dist/commands/workflow-create-workflow.js +14 -0
- package/dist/commands/workflow-create-workflow.js.map +1 -1
- package/dist/commands/workflow-node-validate.d.ts.map +1 -1
- package/dist/commands/workflow-node-validate.js +16 -2
- package/dist/commands/workflow-node-validate.js.map +1 -1
- package/dist/commands/workflow-numbering.d.ts.map +1 -1
- package/dist/commands/workflow-numbering.js +18 -2
- package/dist/commands/workflow-numbering.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +47 -35
- package/dist/commands/workflow.js.map +1 -1
- package/dist/services/actionflow/build_workflow_draft.d.ts.map +1 -1
- package/dist/services/actionflow/build_workflow_draft.js +23 -2
- package/dist/services/actionflow/build_workflow_draft.js.map +1 -1
- package/dist/services/actionflow/command_output.d.ts +6 -0
- package/dist/services/actionflow/command_output.d.ts.map +1 -0
- package/dist/services/actionflow/command_output.js +91 -0
- package/dist/services/actionflow/command_output.js.map +1 -0
- package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_add.js +5 -4
- package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_delete.js +1 -1
- package/dist/services/actionflow/components/action_eb_delete.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update.js +4 -4
- package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.js +4 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
- package/dist/services/actionflow/components/approve_create.js +1 -1
- package/dist/services/actionflow/components/approve_create.js.map +1 -1
- package/dist/services/actionflow/components/approve_trigger.d.ts.map +1 -1
- package/dist/services/actionflow/components/approve_trigger.js +48 -16
- package/dist/services/actionflow/components/approve_trigger.js.map +1 -1
- package/dist/services/actionflow/components/date_trigger.js +3 -3
- package/dist/services/actionflow/components/date_trigger.js.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.d.ts.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.js +15 -8
- package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
- package/dist/services/actionflow/enrich_approve_trigger.d.ts.map +1 -1
- package/dist/services/actionflow/enrich_approve_trigger.js +47 -17
- package/dist/services/actionflow/enrich_approve_trigger.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +71 -3
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/functions_catalog.d.ts +26 -0
- package/dist/services/actionflow/functions_catalog.d.ts.map +1 -0
- package/dist/services/actionflow/functions_catalog.js +8986 -0
- package/dist/services/actionflow/functions_catalog.js.map +1 -0
- package/dist/services/actionflow/functions_source.d.ts +7 -0
- package/dist/services/actionflow/functions_source.d.ts.map +1 -0
- package/dist/services/actionflow/functions_source.js +50 -0
- package/dist/services/actionflow/functions_source.js.map +1 -0
- package/dist/services/actionflow/generation_service.d.ts +8 -0
- package/dist/services/actionflow/generation_service.d.ts.map +1 -1
- package/dist/services/actionflow/generation_service.js +60 -2
- package/dist/services/actionflow/generation_service.js.map +1 -1
- package/dist/services/actionflow/preflight_service.d.ts +6 -0
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +69 -0
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +102 -85
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/actionflow/workflow_source.d.ts +2 -0
- package/dist/services/actionflow/workflow_source.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_source.js +8 -0
- package/dist/services/actionflow/workflow_source.js.map +1 -1
- package/dist/services/workflow-operator.d.ts +3 -1
- package/dist/services/workflow-operator.d.ts.map +1 -1
- package/dist/services/workflow-operator.js +5 -4
- package/dist/services/workflow-operator.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,7 +7,7 @@ import { genSfId } from './id_generator.js';
|
|
|
7
7
|
import fs from 'node:fs';
|
|
8
8
|
import { get, getCompiler, getNodePost } from './components/index.js';
|
|
9
9
|
import { findInMetadata, getTargetFormFields, getWorkflowDetailNames, getTargetDetailFields, getWorkflowDetailFields, getWorkflowFieldIds, workflowFieldId, getWorkflowContextFields, getWorkflowContextFieldsByKey } from './runtime_metadata.js';
|
|
10
|
-
import { buildPersonFormula, buildSettingEntry, attachEsbAssign, resolveEnumConstant, resolveParamKey, resolveSourceFieldLabel, resolveSourceFieldType, normalizeConstantAssignment, lookupTargetFieldMeta, formulaFixedForAssignSwitch, formulaSystemVar, formulaContext, assignFlatContext, assignFlatContextDirect, getFormulaFn, formulaFunction, } from './formula_service.js';
|
|
10
|
+
import { buildPersonFormula, buildSettingEntry, buildAssignBean, attachEsbAssign, resolveEnumConstant, resolveParamKey, resolveSourceFieldLabel, resolveSourceFieldType, normalizeConstantAssignment, lookupTargetFieldMeta, formulaFixedForAssignSwitch, formulaSystemVar, formulaContext, assignFlatContext, assignFlatContextDirect, getFormulaFn, formulaFunction, } from './formula_service.js';
|
|
11
11
|
import { buildFormulaReference, buildUpdateFieldCondition } from './components/action_eb_update_compiler.js';
|
|
12
12
|
import { resolveSystemParameter, isDateSystemParameter } from './system_params.js';
|
|
13
13
|
import { conditionFieldFamily, filterFieldType, normalizeFilterOperator, conditionOperatorOverride, resolveFormCtx, buildFilterContextFormula, } from './filter_rules.js';
|
|
@@ -264,6 +264,9 @@ function handleSpecial(draftKey, special, val, result, meta, appId, idx, eventId
|
|
|
264
264
|
const rawSystem = val.systemValue || val.key;
|
|
265
265
|
result.requestName = formulaSystemVar(rawSystem);
|
|
266
266
|
}
|
|
267
|
+
else if (String(val.kind || val.assignmentKind || '') === 'function') {
|
|
268
|
+
result.requestName = buildAssignBean(val, 'requestName', String(val.fieldType || val.valueType || 'string'), meta, appId, String(eventId || ''));
|
|
269
|
+
}
|
|
267
270
|
else {
|
|
268
271
|
const wfId = String(meta?._workflow_id || '');
|
|
269
272
|
const rqKey = resolveParamKey(wfId, String(val.key ?? val.value ?? ''));
|
|
@@ -414,7 +417,28 @@ export function fillSetting(result, updates, mapping, constants, formula, meta,
|
|
|
414
417
|
const refKey = String(targetFieldId.paramKey || sourceKey);
|
|
415
418
|
const refLabel = String(targetFieldId.label || resolveSourceFieldLabel(refKey, meta, String(sourceKey)));
|
|
416
419
|
const refDetail = String(targetFieldId.detailLabel || '');
|
|
417
|
-
const assignment = {
|
|
420
|
+
const assignment = {
|
|
421
|
+
...(targetFieldId.assignment && typeof targetFieldId.assignment === 'object' ? targetFieldId.assignment : {}),
|
|
422
|
+
kind: String(targetFieldId.kind || targetFieldId.assignmentKind || 'context'),
|
|
423
|
+
paramKey: refKey,
|
|
424
|
+
label: refLabel,
|
|
425
|
+
};
|
|
426
|
+
if (targetFieldId.source !== undefined)
|
|
427
|
+
assignment.source = targetFieldId.source;
|
|
428
|
+
if (targetFieldId.comId !== undefined)
|
|
429
|
+
assignment.comId = targetFieldId.comId;
|
|
430
|
+
if (targetFieldId.formId !== undefined)
|
|
431
|
+
assignment.formId = targetFieldId.formId;
|
|
432
|
+
if (targetFieldId.queryFormId !== undefined)
|
|
433
|
+
assignment.queryFormId = targetFieldId.queryFormId;
|
|
434
|
+
if (targetFieldId.fieldId !== undefined)
|
|
435
|
+
assignment.fieldId = targetFieldId.fieldId;
|
|
436
|
+
if (targetFieldId.queryFieldId !== undefined)
|
|
437
|
+
assignment.queryFieldId = targetFieldId.queryFieldId;
|
|
438
|
+
if (targetFieldId.index !== undefined)
|
|
439
|
+
assignment.index = targetFieldId.index;
|
|
440
|
+
if (targetFieldId.parentName !== undefined)
|
|
441
|
+
assignment.parentName = targetFieldId.parentName;
|
|
418
442
|
if (refDetail)
|
|
419
443
|
assignment.detailLabel = refDetail;
|
|
420
444
|
assertCompatibleEnumContextMapping(refKey, raw, result, meta || {});
|
|
@@ -463,6 +487,12 @@ export function fillSetting(result, updates, mapping, constants, formula, meta,
|
|
|
463
487
|
const fspec = fspecRaw;
|
|
464
488
|
if (!fspec || typeof fspec !== 'object')
|
|
465
489
|
continue;
|
|
490
|
+
if (String(fspec.kind || '') === 'function') {
|
|
491
|
+
const fieldMeta = lookupTargetFieldMeta(String(targetFieldId), result);
|
|
492
|
+
const targetFieldType = String(fieldMeta?.componentKey || fieldMeta?.type || fspec.resultType || 'Number');
|
|
493
|
+
main[String(targetFieldId)] = buildSettingEntry(String(targetFieldId), fspec, targetFieldType, meta, appId, String(eventId), 'OPERATE_EQUAL', componentType, false, assignmentMode);
|
|
494
|
+
continue;
|
|
495
|
+
}
|
|
466
496
|
const op = fspec.op || 'add';
|
|
467
497
|
const fields = fspec.fields || [];
|
|
468
498
|
if (!fields.length)
|
|
@@ -477,7 +507,7 @@ export function fillSetting(result, updates, mapping, constants, formula, meta,
|
|
|
477
507
|
child.fieldType = 'number';
|
|
478
508
|
childs.push(child);
|
|
479
509
|
}
|
|
480
|
-
const bean = formulaFunction(fnInfo.fnId, fnInfo.name, childs, 'double',
|
|
510
|
+
const bean = formulaFunction(fnInfo.fnId, fnInfo.name, childs, 'double', null, fnInfo.functionType || 'operation', undefined, appId);
|
|
481
511
|
const flatId = bean.id || genSfId();
|
|
482
512
|
const assign = Object.fromEntries(Object.entries(bean).filter(([k]) => !['configObject', 'childs', 'parentId', 'sortWeight', 'position'].includes(k)));
|
|
483
513
|
if (bean.childs)
|
|
@@ -520,13 +550,13 @@ export function fillSetting(result, updates, mapping, constants, formula, meta,
|
|
|
520
550
|
function isFilterGroup(value) {
|
|
521
551
|
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
522
552
|
return false;
|
|
523
|
-
const children = value.conditions
|
|
553
|
+
const children = value.conditions;
|
|
524
554
|
if (!Array.isArray(children))
|
|
525
555
|
return false;
|
|
526
556
|
return !['left', 'right', 'field', 'operator', 'value', 'id', 'key', 'fieldName'].some((k) => k in value);
|
|
527
557
|
}
|
|
528
558
|
function filterGroupChildren(value) {
|
|
529
|
-
const children = value.conditions ??
|
|
559
|
+
const children = value.conditions ?? [];
|
|
530
560
|
if (!Array.isArray(children))
|
|
531
561
|
throw new Error('filterCondition 分组的 conditions 必须是数组');
|
|
532
562
|
if (!children.length)
|
|
@@ -534,18 +564,18 @@ function filterGroupChildren(value) {
|
|
|
534
564
|
return children;
|
|
535
565
|
}
|
|
536
566
|
function filterRelationship(value) {
|
|
537
|
-
const text = String(value ?? '
|
|
538
|
-
if (
|
|
567
|
+
const text = String(value ?? '').trim().toLowerCase();
|
|
568
|
+
if (text === 'and')
|
|
539
569
|
return '1';
|
|
540
|
-
if (
|
|
570
|
+
if (text === 'or')
|
|
541
571
|
return '0';
|
|
542
|
-
throw new Error('filterCondition relationship 只支持 and/or
|
|
572
|
+
throw new Error('filterCondition relationship 只支持 and/or');
|
|
543
573
|
}
|
|
544
574
|
function containsFilterGroup(value) {
|
|
545
575
|
if (isFilterGroup(value))
|
|
546
576
|
return true;
|
|
547
577
|
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
548
|
-
const children = value.conditions
|
|
578
|
+
const children = value.conditions;
|
|
549
579
|
if (Array.isArray(children))
|
|
550
580
|
return children.some(containsFilterGroup);
|
|
551
581
|
return false;
|
|
@@ -567,25 +597,58 @@ function rejectUnsupportedFilterModes(value) {
|
|
|
567
597
|
rejectUnsupportedFilterModes(item);
|
|
568
598
|
}
|
|
569
599
|
}
|
|
600
|
+
const CANONICAL_FILTER_OPERATORS = new Set([
|
|
601
|
+
'eq', 'neq', 'gt', 'lt', 'gte', 'lte', 'contains', 'uncontains',
|
|
602
|
+
'empty', 'nempty', 'range', 'aggregate', 'unaggregate',
|
|
603
|
+
'startWith', 'unStartWith', 'endWith', 'unEndWith', 'containedWith',
|
|
604
|
+
]);
|
|
605
|
+
const CANONICAL_FILTER_RIGHT_TYPES = new Set([
|
|
606
|
+
'fixed', 'system', 'context', 'formfield', 'selectdata',
|
|
607
|
+
'custombyhander', 'native', 'varfield', 'filterval',
|
|
608
|
+
]);
|
|
609
|
+
/** Validates the public semantic plan. Platform filterInput is built only after this boundary. */
|
|
610
|
+
function assertCanonicalFilterPlan(value) {
|
|
611
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
612
|
+
throw new Error('filterCondition 必须是单个条件对象或 {relationship:"and|or",conditions:[...]};不接受数组');
|
|
613
|
+
}
|
|
614
|
+
if (isFilterGroup(value)) {
|
|
615
|
+
if ('datas' in value)
|
|
616
|
+
throw new Error('filterCondition 条件组只接受 conditions,不接受 datas');
|
|
617
|
+
filterRelationship(value.relationship);
|
|
618
|
+
for (const child of filterGroupChildren(value))
|
|
619
|
+
assertCanonicalFilterPlan(child);
|
|
620
|
+
return;
|
|
621
|
+
}
|
|
622
|
+
if ('value' in value || 'left' in value || 'key' in value || 'id' in value) {
|
|
623
|
+
throw new Error('filterCondition 叶子只接受 field/operator/right;不接受 value、left、key 或 id');
|
|
624
|
+
}
|
|
625
|
+
const field = value.field;
|
|
626
|
+
if (!field || typeof field !== 'object' || Array.isArray(field) || !String(field.id ?? '').trim()) {
|
|
627
|
+
throw new Error('filterCondition field 必须是 {id,label} 对象');
|
|
628
|
+
}
|
|
629
|
+
const operator = String(value.operator ?? '').trim();
|
|
630
|
+
if (!CANONICAL_FILTER_OPERATORS.has(operator)) {
|
|
631
|
+
throw new Error(`filterCondition operator='${operator}' 不支持;请使用 eq/neq/gt/lt/gte/lte/contains/uncontains/empty/nempty/range`);
|
|
632
|
+
}
|
|
633
|
+
if (operator === 'empty' || operator === 'nempty')
|
|
634
|
+
return;
|
|
635
|
+
const right = value.right;
|
|
636
|
+
if (!right || typeof right !== 'object' || Array.isArray(right)) {
|
|
637
|
+
throw new Error('filterCondition 非空操作符必须使用 right 对象');
|
|
638
|
+
}
|
|
639
|
+
const rightType = String(right.type ?? '').trim().toLowerCase();
|
|
640
|
+
if (!CANONICAL_FILTER_RIGHT_TYPES.has(rightType)) {
|
|
641
|
+
throw new Error(`filterCondition right.type='${rightType}' 不支持;请使用 fixed/system/context/formField/selectData/customByHander/native/varField/filterVal`);
|
|
642
|
+
}
|
|
643
|
+
}
|
|
570
644
|
export function buildFilterInput(result, val, meta, appId, componentType = '', allowTree = true) {
|
|
571
645
|
componentType = String(componentType || '');
|
|
646
|
+
assertCanonicalFilterPlan(val);
|
|
572
647
|
if (allowTree && containsFilterGroup(val)) {
|
|
573
648
|
return buildFilterTree(result, val, meta, appId, componentType);
|
|
574
649
|
}
|
|
575
650
|
const eventLocalFilter = (get(componentType) || {}).filterValueScope === 'local';
|
|
576
|
-
|
|
577
|
-
if (val && typeof val === 'object' && !Array.isArray(val)) {
|
|
578
|
-
if (val.condition && typeof val.condition === 'object')
|
|
579
|
-
conditions = [val.condition];
|
|
580
|
-
else if ('conditions' in val)
|
|
581
|
-
conditions = val.conditions;
|
|
582
|
-
else
|
|
583
|
-
conditions = [val];
|
|
584
|
-
}
|
|
585
|
-
else if (Array.isArray(val))
|
|
586
|
-
conditions = val;
|
|
587
|
-
else
|
|
588
|
-
conditions = [];
|
|
651
|
+
const conditions = [val];
|
|
589
652
|
const formId = result.objId || (result.targetForm || {}).id || (result.dataSource || {}).id || (result.dataSource || {}).sourceId || '';
|
|
590
653
|
const fctx = resolveFormCtx(result, meta, formId);
|
|
591
654
|
const form = findInMetadata(meta, 'forms', { id: formId }) || {};
|
|
@@ -598,30 +661,9 @@ export function buildFilterInput(result, val, meta, appId, componentType = '', a
|
|
|
598
661
|
conditions.forEach((c, idx) => {
|
|
599
662
|
if (!c || typeof c !== 'object')
|
|
600
663
|
return;
|
|
601
|
-
const
|
|
602
|
-
let
|
|
603
|
-
let
|
|
604
|
-
let right;
|
|
605
|
-
if (left.field && typeof left.field === 'object' && left.field.id) {
|
|
606
|
-
fieldId = String(left.field.id);
|
|
607
|
-
label = left.field.label || left.field.name || fieldId;
|
|
608
|
-
if (c.right && typeof c.right === 'object')
|
|
609
|
-
right = c.right;
|
|
610
|
-
else if (c.value && typeof c.value === 'object')
|
|
611
|
-
right = c.value;
|
|
612
|
-
else
|
|
613
|
-
right = { value: c.value ?? '' };
|
|
614
|
-
}
|
|
615
|
-
else if (left.key || left.id) {
|
|
616
|
-
fieldId = String(left.key ?? left.id ?? '');
|
|
617
|
-
label = left.label ?? left.name ?? '';
|
|
618
|
-
right = c.right ?? c.value ?? '';
|
|
619
|
-
}
|
|
620
|
-
else {
|
|
621
|
-
fieldId = '';
|
|
622
|
-
label = '';
|
|
623
|
-
right = '';
|
|
624
|
-
}
|
|
664
|
+
const fieldId = String(c.field.id);
|
|
665
|
+
let label = c.field.label || c.field.name || fieldId;
|
|
666
|
+
let right = c.right ?? { type: 'fixed', value: '' };
|
|
625
667
|
const fmeta = fieldIndex[fieldId] || {};
|
|
626
668
|
if (!fmeta || Object.keys(fmeta).length === 0) {
|
|
627
669
|
throw new Error(`filterCondition 左侧字段 id='${fieldId}' 不在目标表单 '${formId}' 的实时字段列表中`);
|
|
@@ -645,26 +687,7 @@ export function buildFilterInput(result, val, meta, appId, componentType = '', a
|
|
|
645
687
|
if (multiSelect === undefined && rawConfig && typeof rawConfig === 'object' && 'isSingle' in rawConfig)
|
|
646
688
|
multiSelect = !Boolean(rawConfig.isSingle);
|
|
647
689
|
const isMultiSelect = multiSelect === true || String(multiSelect).toLowerCase() === 'true';
|
|
648
|
-
|
|
649
|
-
throw new Error("filterCondition 不支持 value.kind:'context';请使用 right:{type:'context',paramKey:'<真实paramKey>',label:'<显示名>'}");
|
|
650
|
-
}
|
|
651
|
-
let rightType = right && typeof right === 'object' ? String(right.type || 'fixed').trim().toLowerCase() : 'fixed';
|
|
652
|
-
if (right && typeof right === 'object' && right.paramKey && !right.type) {
|
|
653
|
-
throw new Error("filterCondition 动态右值缺少 type:'context';请使用 right:{type:'context',paramKey:'<真实paramKey>',label:'<显示名>'}");
|
|
654
|
-
}
|
|
655
|
-
if (['manual', 'constant', 'const'].includes(rightType))
|
|
656
|
-
rightType = 'fixed';
|
|
657
|
-
else if (['dynamic', 'assign', 'workflowfield', 'workflow_field'].includes(rightType))
|
|
658
|
-
rightType = 'context';
|
|
659
|
-
else if (['formfield', 'form_field'].includes(rightType))
|
|
660
|
-
rightType = 'formfield';
|
|
661
|
-
else if (['custom', 'custombyhandler'].includes(rightType))
|
|
662
|
-
rightType = 'custombyhander';
|
|
663
|
-
else if (['platform', 'condition'].includes(rightType))
|
|
664
|
-
rightType = 'native';
|
|
665
|
-
if (!['fixed', 'system', 'context', 'formfield', 'selectdata', 'custombyhander', 'native', 'varfield', 'filterval'].includes(rightType)) {
|
|
666
|
-
throw new Error(`filterCondition 右值 type='${rightType}' 不支持; 支持 fixed/manual/context/formField/selectData/customByHander/native/varField/filterVal`);
|
|
667
|
-
}
|
|
690
|
+
let rightType = String(right.type).trim().toLowerCase();
|
|
668
691
|
// 原生「当前时间/当前日期」改写为系统参数(真机验证 2026-08-18):平台 native type 列表不含 currentTime/currentDate
|
|
669
692
|
// 等具体 token,原样透传后 conditionData.value="" 触发设计器「右值未配置」判断(外面能显示摘要,点进去空)。
|
|
670
693
|
// 与 system_params 的 currentTime→{time}/currentDate→{date} 映射一致,落到 system 路径后走完整校验+value 非空。
|
|
@@ -705,7 +728,7 @@ export function buildFilterInput(result, val, meta, appId, componentType = '', a
|
|
|
705
728
|
}
|
|
706
729
|
const isContext = ['context', 'formfield', 'custombyhander'].includes(rightType);
|
|
707
730
|
const isNative = ['native', 'varfield', 'filterval'].includes(rightType);
|
|
708
|
-
const filterValueType = String(
|
|
731
|
+
const filterValueType = String(right.filterValueType || '');
|
|
709
732
|
const allowedOverride = conditionOperatorOverride(fmeta, family, compType, fieldId, filterValueType);
|
|
710
733
|
let contextIsArray = false;
|
|
711
734
|
let value;
|
|
@@ -722,7 +745,7 @@ export function buildFilterInput(result, val, meta, appId, componentType = '', a
|
|
|
722
745
|
}
|
|
723
746
|
value = rawValue;
|
|
724
747
|
}
|
|
725
|
-
const func = normalizeFilterOperator(c.operator
|
|
748
|
+
const func = normalizeFilterOperator(c.operator, family, { contextIsArray, multiSelect: isMultiSelect, allowedOverride });
|
|
726
749
|
const isNullary = ['empty', 'nempty'].includes(func);
|
|
727
750
|
if (isNullary)
|
|
728
751
|
value = '';
|
|
@@ -808,15 +831,7 @@ export function buildFilterInput(result, val, meta, appId, componentType = '', a
|
|
|
808
831
|
}
|
|
809
832
|
function buildFilterTree(result, value, meta, appId, componentType) {
|
|
810
833
|
rejectUnsupportedFilterModes(value);
|
|
811
|
-
|
|
812
|
-
if (isFilterGroup(value))
|
|
813
|
-
rootSource = value;
|
|
814
|
-
else if (Array.isArray(value))
|
|
815
|
-
rootSource = { relationship: 'and', conditions: value };
|
|
816
|
-
else if (value && typeof value === 'object' && Array.isArray(value.conditions))
|
|
817
|
-
rootSource = value;
|
|
818
|
-
else
|
|
819
|
-
rootSource = { relationship: 'and', conditions: [value] };
|
|
834
|
+
const rootSource = value;
|
|
820
835
|
const build = (source) => {
|
|
821
836
|
if (isFilterGroup(source)) {
|
|
822
837
|
return {
|
|
@@ -825,7 +840,7 @@ function buildFilterTree(result, value, meta, appId, componentType) {
|
|
|
825
840
|
parentNode: '', relationship: filterRelationship(source.relationship), key: '',
|
|
826
841
|
};
|
|
827
842
|
}
|
|
828
|
-
const compiled = buildFilterInput(result,
|
|
843
|
+
const compiled = buildFilterInput(result, JSON.parse(JSON.stringify(source)), meta, appId, componentType, false);
|
|
829
844
|
if (compiled.datas.length !== 1)
|
|
830
845
|
throw new Error('filterCondition 叶子必须是单个有效条件');
|
|
831
846
|
return compiled.datas[0];
|
|
@@ -1411,12 +1426,10 @@ export function convertNode(draftAction, isEvent = false, meta = null, appId = '
|
|
|
1411
1426
|
}
|
|
1412
1427
|
else {
|
|
1413
1428
|
node.componentId = nidStr;
|
|
1414
|
-
//
|
|
1415
|
-
//
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
if (!['', '0', String(eventNodeId)].includes(String(previousNodeId)) || needsEventSource) {
|
|
1419
|
-
node.sources = [{ wId: needsEventSource ? String(eventNodeId) : String(previousNodeId) }];
|
|
1429
|
+
// 首个动作不写 sources;手工保存的场景 2 中 EnquiryForm 作为首动作也是无 sources。
|
|
1430
|
+
// 后续节点一律显式指向前序节点,避免出现多个起始执行组件。
|
|
1431
|
+
if (!['', '0', String(eventNodeId)].includes(String(previousNodeId))) {
|
|
1432
|
+
node.sources = [{ wId: String(previousNodeId) }];
|
|
1420
1433
|
}
|
|
1421
1434
|
}
|
|
1422
1435
|
// 设计器通过“添加操作”创建节点时,除平台执行 DTO 外还会保留组件目录项。
|
|
@@ -1589,6 +1602,9 @@ function registerRealNodeIds(draftNode, realNode, nodeIds) {
|
|
|
1589
1602
|
const realId = String(realNode?.id ?? '');
|
|
1590
1603
|
if (draftId && realId)
|
|
1591
1604
|
nodeIds[draftId] = realId;
|
|
1605
|
+
const ref = String(draftNode?.ref ?? '').trim();
|
|
1606
|
+
if (ref && realId)
|
|
1607
|
+
nodeIds[ref] = realId;
|
|
1592
1608
|
}
|
|
1593
1609
|
function replaceFormulaSourceAliases(value, nodeIds) {
|
|
1594
1610
|
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
@@ -1650,6 +1666,7 @@ export function convert(draft, appId = '', sceneId = '', metadataPath = '', leni
|
|
|
1650
1666
|
meta._componentOptions = draft._componentOptions && typeof draft._componentOptions === 'object'
|
|
1651
1667
|
? draft._componentOptions
|
|
1652
1668
|
: {};
|
|
1669
|
+
meta._function_registry = Array.isArray(draft._functionRegistry) ? draft._functionRegistry : undefined;
|
|
1653
1670
|
let draftEvent = draft.event || {};
|
|
1654
1671
|
let draftActions = draft.actions || [];
|
|
1655
1672
|
const lenientWarnings = [];
|