weaver-e10-builder 1.0.10-beta → 1.0.12-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/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +13 -0
- package/dist/commands/auth.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-list-permission.d.ts.map +1 -1
- package/dist/commands/form-list-permission.js +130 -15
- package/dist/commands/form-list-permission.js.map +1 -1
- package/dist/commands/form-nlist.d.ts +22 -0
- package/dist/commands/form-nlist.d.ts.map +1 -0
- package/dist/commands/form-nlist.js +179 -0
- package/dist/commands/form-nlist.js.map +1 -0
- package/dist/commands/form-serial-mark.d.ts +0 -15
- package/dist/commands/form-serial-mark.d.ts.map +1 -1
- package/dist/commands/form-serial-mark.js +604 -137
- package/dist/commands/form-serial-mark.js.map +1 -1
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +145 -16
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/skill.d.ts +3 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +112 -0
- package/dist/commands/skill.js.map +1 -0
- 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-condition.d.ts.map +1 -1
- package/dist/commands/workflow-condition.js +3 -1
- package/dist/commands/workflow-condition.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 +58 -42
- package/dist/commands/workflow.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.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/condition-rules.d.ts.map +1 -1
- package/dist/services/condition-rules.js +3 -1
- package/dist/services/condition-rules.js.map +1 -1
- package/dist/services/form-create.d.ts.map +1 -1
- package/dist/services/form-create.js +4 -1
- package/dist/services/form-create.js.map +1 -1
- package/dist/services/form-nlist.d.ts +42 -0
- package/dist/services/form-nlist.d.ts.map +1 -0
- package/dist/services/form-nlist.js +332 -0
- package/dist/services/form-nlist.js.map +1 -0
- package/dist/services/skill-provision.d.ts +18 -0
- package/dist/services/skill-provision.d.ts.map +1 -0
- package/dist/services/skill-provision.js +86 -0
- package/dist/services/skill-provision.js.map +1 -0
- package/dist/services/workflow-initiator.js +3 -3
- package/dist/services/workflow-initiator.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 +4 -2
- package/skill-docs/SKILL.md +348 -0
- package/skill-docs/actionflows/references/components/calendar/MeetingCreate.md +17 -0
- package/skill-docs/actionflows/references/components/calendar/ScheduleCreate.md +17 -0
- package/skill-docs/actionflows/references/components/document/AttachmentCopy.md +17 -0
- package/skill-docs/actionflows/references/components/document/AttachmentMove.md +17 -0
- package/skill-docs/actionflows/references/components/document/DocumentCopy.md +17 -0
- package/skill-docs/actionflows/references/components/document/DocumentDelete.md +17 -0
- package/skill-docs/actionflows/references/components/document/DocumentEdit.md +17 -0
- package/skill-docs/actionflows/references/components/document/DocumentMove.md +17 -0
- package/skill-docs/actionflows/references/components/document/DocumentPermissionChange.md +17 -0
- package/skill-docs/actionflows/references/components/document/DocumentRenewal.md +17 -0
- package/skill-docs/actionflows/references/components/document/DocumentRevert.md +17 -0
- package/skill-docs/actionflows/references/components/document/DocumentSave.md +17 -0
- package/skill-docs/actionflows/references/components/document/DocumentSubscription.md +17 -0
- package/skill-docs/actionflows/references/components/document/DocumentSubscriptionApprove.md +17 -0
- package/skill-docs/actionflows/references/components/document/DocumentSubscriptionSendBack.md +17 -0
- package/skill-docs/actionflows/references/components/document/DocumentSubscriptionWithdraw.md +17 -0
- package/skill-docs/actionflows/references/components/document/FileFolderSave.md +17 -0
- package/skill-docs/actionflows/references/components/document/GetAttachmentInfo.md +17 -0
- package/skill-docs/actionflows/references/components/document/GetDocumentInfo.md +17 -0
- package/skill-docs/actionflows/references/components/document/ModifyDocumentStatus.md +17 -0
- package/skill-docs/actionflows/references/components/document/ReplaceAttachment.md +17 -0
- package/skill-docs/actionflows/references/components/document/UpdatePrintNum.md +17 -0
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +39 -0
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +21 -0
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbRecover.md +17 -0
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbSaveVersion.md +17 -0
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +21 -0
- package/skill-docs/actionflows/references/components/ebuilder/DateTrigger.md +17 -0
- package/skill-docs/actionflows/references/components/ebuilder/EbGetDataById.md +17 -0
- package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +75 -0
- package/skill-docs/actionflows/references/components/ebuilder/EventFormData.md +17 -0
- package/skill-docs/actionflows/references/components/ebuilder/TimeBatchTrigger.md +17 -0
- package/skill-docs/actionflows/references/components/logic/Condition.md +23 -0
- package/skill-docs/actionflows/references/components/logic/LogicFlowSet.md +17 -0
- package/skill-docs/actionflows/references/components/logic/MultipleExecution.md +38 -0
- package/skill-docs/actionflows/references/components/logic/Output.md +17 -0
- package/skill-docs/actionflows/references/components/message/SendMessage.md +17 -0
- package/skill-docs/actionflows/references/components/personnel/AlterPersonStatus.md +30 -0
- package/skill-docs/actionflows/references/components/personnel/HrmEmployeeUpdate.md +32 -0
- package/skill-docs/actionflows/references/components/personnel/PersonnelOnboarding.md +34 -0
- package/skill-docs/actionflows/references/components/trigger/SimpleScheduler.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveAddSign.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveAgreeRejectApply.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveCommit.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveCompletelyDelete.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveConsulTurnTodo.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveDelete.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveDoCirculate.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveDoForward.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveDoTurnTodo.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveEntrust.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveIntervention.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveMandatoryArchiving.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveManualCC.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveRefuseRejectApply.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveRejectApply.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveSave.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveSendBack.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveShareEntry.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveTrigger.md +49 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveWithdraw.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/WorkFlowDocEmpowerment.md +17 -0
- package/skill-docs/actionflows/references/components/workflow/WorkflowToDoc.md +17 -0
- package/skill-docs/actionflows/references/condition_rules.md +97 -0
- package/skill-docs/actionflows/references/examples/enquiry-form-batch-insert-scene2.json +1046 -0
- package/skill-docs/actionflows/references/function_rules.md +13 -0
- package/skill-docs/actionflows/references/trigger_runtime_notes.md +51 -0
- package/skill-docs/assets/sample/.claude/settings.local.json +8 -0
- package/skill-docs/assets/sample/api/formApi.js +510 -0
- package/skill-docs/assets/sample/config/config.js +0 -0
- package/skill-docs/assets/sample/config/configLoad.js +0 -0
- package/skill-docs/assets/sample/config/configLoad_default.js +0 -0
- package/skill-docs/assets/sample/config/config_default.js +0 -0
- package/skill-docs/assets/sample/entry.js +22 -0
- package/skill-docs/assets/sample/eslint.config.cjs +48 -0
- package/skill-docs/assets/sample/memo.md +0 -0
- package/skill-docs/assets/sample/readme.js +8 -0
- package/skill-docs/references/auth/guide-auth.md +88 -0
- package/skill-docs/references/coding/guide-edit-backfill.md +189 -0
- package/skill-docs/references/coding/guide-form-crud.md +262 -0
- package/skill-docs/references/coding/guide-page-code.md +224 -0
- package/skill-docs/references/coding/guide-page-export.md +119 -0
- package/skill-docs/references/coding/ref-compile-rules.md +106 -0
- package/skill-docs/references/common/ref-cli-commands.md +286 -0
- package/skill-docs/references/components/@weapp-Button.md +104 -0
- package/skill-docs/references/components/base-Badge.md +100 -0
- package/skill-docs/references/components/base-Dialog.md +358 -0
- package/skill-docs/references/components/base-Empty.md +58 -0
- package/skill-docs/references/components/base-Tag.md +112 -0
- package/skill-docs/references/components/display-Alert.md +64 -0
- package/skill-docs/references/components/display-Avatar.md +150 -0
- package/skill-docs/references/components/display-Calendar.md +263 -0
- package/skill-docs/references/components/display-Carousel.md +115 -0
- package/skill-docs/references/components/display-Collapse.md +299 -0
- package/skill-docs/references/components/display-FilePreview.md +49 -0
- package/skill-docs/references/components/display-Icon.md +66 -0
- package/skill-docs/references/components/display-List.md +320 -0
- package/skill-docs/references/components/display-Pagination.md +41 -0
- package/skill-docs/references/components/display-Spin.md +34 -0
- package/skill-docs/references/components/display-Steps.md +89 -0
- package/skill-docs/references/components/display-Table.md +160 -0
- package/skill-docs/references/components/display-Title.md +117 -0
- package/skill-docs/references/components/form-Checkbox.md +161 -0
- package/skill-docs/references/components/form-DepartmentBrowser-api.md +52 -0
- package/skill-docs/references/components/form-EmployeeBrowser-api.md +51 -0
- package/skill-docs/references/components/form-EmployeeBrowser.md +51 -0
- package/skill-docs/references/components/form-Input.md +123 -0
- package/skill-docs/references/components/form-Radio.md +145 -0
- package/skill-docs/references/components/form-Select.md +191 -0
- package/skill-docs/references/components/form-Switch.md +46 -0
- package/skill-docs/references/components/form-Upload.md +53 -0
- package/skill-docs/references/components/generic-Echarts.md +102 -0
- package/skill-docs/references/form/guide-create-form.md +407 -0
- package/skill-docs/references/form/guide-ebuilder-filter.md +73 -0
- package/skill-docs/references/form/guide-ebuilder-scope.md +82 -0
- package/skill-docs/references/form/guide-form-data.md +48 -0
- package/skill-docs/references/form/guide-form-formula-functions.md +297 -0
- package/skill-docs/references/form/guide-form-linkage.md +185 -0
- package/skill-docs/references/form/guide-form-view-permission.md +38 -0
- package/skill-docs/references/form/guide-form-view.md +267 -0
- package/skill-docs/references/form/style-templates.md +44 -0
- package/skill-docs/references/hrm/guide-matrix.md +103 -0
- package/skill-docs/references/menu/system-menus.md +63 -0
- package/skill-docs/references/workflow/guide-workflow-action.md +168 -0
- package/skill-docs/references/workflow/guide-workflow-condition.md +405 -0
- package/skill-docs/references/workflow/guide-workflow.md +388 -0
- package/skill-docs/references/workflow/operator-matrix.md +74 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# 标准函数规则
|
|
2
|
+
|
|
3
|
+
`custom`(自定义 JS)和 `code`(编码函数)不支持跨环境生成。其余标准函数内置名称、类别和参数约束。
|
|
4
|
+
|
|
5
|
+
需要计算、转换或拼接时,函数树可用于组件明确支持的公式属性:e-builder 的 `formula` 字段、流程/文档的 `formula_or_reference` 字段,以及 `ApproveCreate.requestName`。写法统一为:
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{"kind":"function","name":"CONCAT","args":[{"kind":"fixed","value":"项目-"},{"kind":"context","paramKey":"<真实字段paramKey>","label":"项目名称"}]}
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
函数参数可为 `fixed`、`context`、`system_variable` 或嵌套 `function`。生成时仅对实际使用的函数调用当前租户接口,校验可用性并获取当次函数 ID。
|
|
12
|
+
|
|
13
|
+
消息标题/内容、循环和条件各有专用 DTO;只有对应组件说明明确支持函数树时才使用,不能因为它们也显示“动态赋值”就套用通用函数结构。
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# 触发器运行时注意事项(真机验证)
|
|
2
|
+
|
|
3
|
+
本文沉淀验收 1(11 场景)真机验证得到的、与平台接口客观行为相关的经验,宿主 agent 生成 `semantic_plan` 时必须遵守。这些事实与实现语言无关(Python/Node 版同源)。
|
|
4
|
+
|
|
5
|
+
## 1. 「数据ID」paramKey 格式因触发器而异(最关键)
|
|
6
|
+
|
|
7
|
+
「按数据ID更新/引用当前数据」场景中,数据ID 字段的 paramKey **不是统一的 `{formId}.id`**,三种触发器各不相同:
|
|
8
|
+
|
|
9
|
+
| 触发器 | 数据ID 的 paramKey | 说明 |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| `TimeBatchTrigger` | `{formId}.id` | 例:`1300502645411717121.id` |
|
|
12
|
+
| `DateTrigger` | `dataResponse.id` | 前缀是 `dataResponse.`,不是表单 id |
|
|
13
|
+
| `EventFormData` | `{formId}.5` | **数据ID 是数字 `5`,不是 `.id`!** 极易踩坑 |
|
|
14
|
+
|
|
15
|
+
生成 plan 时,`mapping` 源侧引用「数据ID」必须按上表写真实 paramKey,否则 preflight 的源字段校验会报「源字段 paramKey 未在真实上下文中找到」。
|
|
16
|
+
|
|
17
|
+
> 最稳妥的做法:先跑 `workflow-context-fields` 查该触发器在当前数据源下的真实上下文,从返回里确认「数据ID」的精确 paramKey,再写入 plan,不要凭记忆猜格式。
|
|
18
|
+
|
|
19
|
+
## 2. queryFields 需包含系统字段
|
|
20
|
+
|
|
21
|
+
定时/批量/日期触发器的 `queryFields` 全选时,除了业务字段,还必须包含**平台系统字段**(数据ID / 标题 / 创建者 / 创建时间 等 9 个)。否则 `getComponentContext` 返回的上下文中**缺少「数据ID」**,导致「按数据ID更新」引用失败。
|
|
22
|
+
|
|
23
|
+
系统字段的 `id` 是英文字符串(`id`/`name`/`creator`/`createTime`/`lastUpdateTime`/`lastUpdater`/`dataStatus`/`myTag`/`publicTag`),`content` 是中文名。宿主 agent 侧无需手动列全,但需知晓:**数据ID 属于系统字段,不随业务字段自动出现**。
|
|
24
|
+
|
|
25
|
+
## 3. 动态人员引用用 `context`,不要用 `{userid}`
|
|
26
|
+
|
|
27
|
+
触发器/新建流程等节点的 `operator`(操作人)需要动态引用某字段值时,用**上下文引用**而非系统变量:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{"type": "context", "paramKey": "<formId>.<人员字段id>", "label": "<字段名>"}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`{userid}` 这类系统变量在 `resolveFixedPeople` 阶段会被当作「固定人员」去查浏览器解析,失败即拦截报错。动态人员一律走 context 引用。
|
|
34
|
+
|
|
35
|
+
## 4. filterCondition 的 `esbAssign.wId` 必须指向「当前节点」(真机验证 2026-08-18)
|
|
36
|
+
|
|
37
|
+
`ActionEbUpdate` 等数据动作的筛选条件(filterCondition)右值走上下文引用时,条件对象里的 `esbAssign.wId` 字段**必须指向「当前节点」**(filterInput 所属的数据动作节点 id),**不能指向上游 event 节点**。
|
|
38
|
+
|
|
39
|
+
- 设计器打开「动态赋值」对话框时,用 `esbAssign.wId` 在 `orginFlowDatas` 里定位当前组件;指向 event 节点 → 定位不到 → 右侧「暂无数据」(EmptyView,不可编辑/不可选)。
|
|
40
|
+
- `value.source` / `config.comId` 仍指向 event 节点(公式来源,不变);只有 `esbAssign.wId` 单独用当前节点 id。
|
|
41
|
+
- 判断口径:读回后 `esbAssign.wId` 应等于该 ActionEbAdd/Update/Delete 节点的 `id`,不等于 `event.id`。
|
|
42
|
+
|
|
43
|
+
## 4b. 同类问题全量修复:mapping / updateId / basisValue / 明细依据值下级 / updateFieldCondition / requestName 的上下文公式也要 `esbAssign.wId`(真机验证 2026-08-18)
|
|
44
|
+
|
|
45
|
+
第 4 节最初只修了 `filterCondition`(`buildFilterInput` 路径)。验收 1 重跑时发现:**ActionEbAdd/Update 的字段映射(mapping)、按数据 ID 更新的 `updateId`、批量新增依据值 `basisValueFormula`/`setting.bassisValue`、明细映射的 type=10 依据值下级、`updateFieldCondition` 的 assign、ApproveCreate 的 `requestName`** —— 这些位置的上下文公式(type 3/8/10)**同样必须带 `esbAssign.wId` 指向当前数据动作节点**,否则设计器打开「动态赋值」会把该条显示为「【组件名(已删除)】」(组件未删除,只是 wId 缺失导致前端定位不到当前组件)。
|
|
46
|
+
|
|
47
|
+
- 修复(2026-08-18):`formula_service.ts` 新增 `attachEsbAssign(bean, meta, fallbackSource)`,在 `buildSettingEntry` 的 context 分支(含提前 return 的 assignFlatEsbChild 子表路径)与统一 return 前、`workflow_compiler.ts` 的 `_updateId`/`_basisValueFormula`/`handleBasisValue`/`requestName`、`action_eb_update_compiler.ts` 的 `buildUpdateFieldCondition` 处统一调用。wId 取值顺序与 filterInput 一致:`meta._upstream_node_id`(convertNode 设的当前节点 id)→ 公式 `source` → `meta._upstream_w_id` → 时间戳前缀。
|
|
48
|
+
- 固定值(type=1)不加 esbAssign(设计器 fixvalue 不需要定位当前组件)。
|
|
49
|
+
- 真机回归:验收 1 全 12 场景 readBack 通过;抽查 S1(basisValue+主表映射+type10 下级)/S2(filterInput+主表映射+明细 type10)/S10(updateId)/S11(ApproveCreate formData)/S12(updateId+累加 mapping)—— 所有 esbAssign.wId == 当前数据动作节点 id,无一处指向 event。
|
|
50
|
+
- 新增/维护组件时,凡生成上下文公式的地方都要过一遍 `attachEsbAssign`;`actionflows/references/components/` 下各组件契约 md 与 SKILL.md「esbAssign.wId」条目已同步。
|
|
51
|
+
|
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import { appInfo } from '@weapp/utils';
|
|
2
|
+
const { publicUrl } = appInfo('@weapp/ecodesdk');
|
|
3
|
+
const API_BASE = `${publicUrl}/api/ebuilder/form/dataset`;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Fetches data with a timeout and retry mechanism.
|
|
7
|
+
* @param {string} url - The URL to fetch.
|
|
8
|
+
* @param {RequestInit} options - Fetch options.
|
|
9
|
+
* @param {number} [timeoutMs=5000] - Timeout in milliseconds.
|
|
10
|
+
* @param {number} [retries=3] - Number of retries.
|
|
11
|
+
* @returns {Promise<Response>}
|
|
12
|
+
*/
|
|
13
|
+
async function fetchWithRetry(url, options, timeoutMs = 5000, retries = 3) {
|
|
14
|
+
let lastError;
|
|
15
|
+
|
|
16
|
+
for (let i = 0; i <= retries; i++) {
|
|
17
|
+
const controller = new AbortController();
|
|
18
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const response = await fetch(url, {
|
|
22
|
+
...options,
|
|
23
|
+
signal: controller.signal,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
clearTimeout(timeoutId);
|
|
27
|
+
return response;
|
|
28
|
+
} catch (error) {
|
|
29
|
+
clearTimeout(timeoutId);
|
|
30
|
+
lastError = error;
|
|
31
|
+
|
|
32
|
+
// If it's the last attempt, throw the error
|
|
33
|
+
if (i === retries) {
|
|
34
|
+
throw new Error(`Request failed after ${retries + 1} attempts. Last error: ${lastError.message}`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Optional: Add exponential backoff or simple delay before retrying
|
|
38
|
+
await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// This line should theoretically not be reached due to the throw above
|
|
43
|
+
throw lastError;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 获取字段定义
|
|
48
|
+
* @param {string} objId
|
|
49
|
+
* @param {string} userId
|
|
50
|
+
* @returns {Promise<Array>}
|
|
51
|
+
*/
|
|
52
|
+
export async function getFields(objId, userId) {
|
|
53
|
+
const response = await fetchWithRetry(`${API_BASE}/v1/getFields`, {
|
|
54
|
+
method: 'POST',
|
|
55
|
+
headers: { 'Content-Type': 'application/json' },
|
|
56
|
+
body: JSON.stringify({
|
|
57
|
+
userid: userId,
|
|
58
|
+
objId: objId,
|
|
59
|
+
tenantKey: TENANTKEY,
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const result = await response.json();
|
|
64
|
+
|
|
65
|
+
if (result.message.code !== '0') {
|
|
66
|
+
throw new Error(`获取字段失败: ${result.message.msg}`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// 按 number 排序,保持表单原始顺序
|
|
70
|
+
return result.data.mainFields.sort((a, b) => a.number - b.number);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 获取所有数据
|
|
75
|
+
* @param {string} objId
|
|
76
|
+
* @param {string} userId
|
|
77
|
+
* @returns {Promise<Array>}
|
|
78
|
+
*/
|
|
79
|
+
const TENANTKEY = TEAMS.currentTenant.tenantKey
|
|
80
|
+
export async function getAllData(objId, userId) {
|
|
81
|
+
const response = await fetchWithRetry(`${API_BASE}/v2/getAllData?tenantkey=${TENANTKEY}`, {
|
|
82
|
+
method: 'POST',
|
|
83
|
+
headers: { 'Content-Type': 'application/json' },
|
|
84
|
+
body: JSON.stringify({
|
|
85
|
+
userid: userId,
|
|
86
|
+
datajson: {
|
|
87
|
+
header: { objId: objId },
|
|
88
|
+
},
|
|
89
|
+
}),
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const result = await response.json();
|
|
93
|
+
|
|
94
|
+
if (result.message.code !== '0') {
|
|
95
|
+
throw new Error(`获取数据失败: ${result.message.msg}`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return result.data.datajson.datas || [];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ==================== 数据解析函数 ====================
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* 解析单个字段的值
|
|
105
|
+
* @param {any} value
|
|
106
|
+
* @param {Object} fieldDef
|
|
107
|
+
* @returns {Object} ParsedValue
|
|
108
|
+
*/
|
|
109
|
+
export function parseFieldValue(value, fieldDef) {
|
|
110
|
+
// 处理 undefined 或 null 值
|
|
111
|
+
if (!value) {
|
|
112
|
+
return { displayValue: '', rawValue: value };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// 处理数组类型(Select, RadioBox, CheckBox 等多选/单选)
|
|
116
|
+
if (Array.isArray(value)) {
|
|
117
|
+
if (value.length === 0) {
|
|
118
|
+
return { displayValue: '', rawValue: [] };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// 提取选项名称列表
|
|
122
|
+
const optionNames = value
|
|
123
|
+
.map(v => v?.fieldOptionName || v?.fieldValue || '')
|
|
124
|
+
.filter(v => v);
|
|
125
|
+
|
|
126
|
+
const options = value.map(v => ({
|
|
127
|
+
id: v?.fieldOptionId || '',
|
|
128
|
+
name: v?.fieldOptionName || v?.fieldValue || '',
|
|
129
|
+
}));
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
displayValue: optionNames.join(', '),
|
|
133
|
+
rawValue: value,
|
|
134
|
+
options: options,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// 处理普通对象
|
|
139
|
+
const fieldType = fieldDef.fieldType;
|
|
140
|
+
|
|
141
|
+
switch (fieldType) {
|
|
142
|
+
case 'Employee':
|
|
143
|
+
// 员工字段可能返回用户ID或姓名
|
|
144
|
+
return {
|
|
145
|
+
displayValue: value.fieldValue || '',
|
|
146
|
+
rawValue: value,
|
|
147
|
+
};
|
|
148
|
+
case 'Date':
|
|
149
|
+
// 日期格式化
|
|
150
|
+
const dateValue = value.fieldValue;
|
|
151
|
+
if (dateValue && dateValue.includes('-')) {
|
|
152
|
+
return { displayValue: dateValue, rawValue: value };
|
|
153
|
+
}
|
|
154
|
+
return { displayValue: dateValue || '', rawValue: value };
|
|
155
|
+
case 'Number':
|
|
156
|
+
return {
|
|
157
|
+
displayValue: value.fieldValue || '0',
|
|
158
|
+
rawValue: value,
|
|
159
|
+
};
|
|
160
|
+
case 'Select':
|
|
161
|
+
case 'RadioBox':
|
|
162
|
+
return {
|
|
163
|
+
displayValue: value.fieldOptionName || value.fieldValue || '',
|
|
164
|
+
rawValue: value,
|
|
165
|
+
};
|
|
166
|
+
default:
|
|
167
|
+
return {
|
|
168
|
+
displayValue: value.fieldValue || '',
|
|
169
|
+
rawValue: value,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// ==================== 数据格式转换函数 ====================
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* 将API返回的复杂数据结构转换为简单的键值对格式
|
|
178
|
+
* @param {Array} dataRows
|
|
179
|
+
* @param {Array} fields
|
|
180
|
+
* @returns {Array<SimpleDataItem>}
|
|
181
|
+
*/
|
|
182
|
+
export function transformToSimpleFormat(dataRows, fields) {
|
|
183
|
+
if (!dataRows || !dataRows.length) return [];
|
|
184
|
+
// Create a map for quick lookup: fieldId -> FieldDefinition
|
|
185
|
+
const fieldMap = new Map();
|
|
186
|
+
fields.forEach(field => {
|
|
187
|
+
fieldMap.set(field.fieldId, field);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
return dataRows.map(row => {
|
|
191
|
+
const simpleItem = {};
|
|
192
|
+
|
|
193
|
+
// Copy row-level id (data ID) to simple item
|
|
194
|
+
if (row.id) {
|
|
195
|
+
simpleItem.id = row.id;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Process mainTable
|
|
199
|
+
if (row.mainTable) {
|
|
200
|
+
Object.entries(row.mainTable).forEach(([key, value]) => {
|
|
201
|
+
// Handle the special 'id' field in mainTable
|
|
202
|
+
if (key === 'id' && value && typeof value === 'object') {
|
|
203
|
+
simpleItem.id = value.fieldValue || value.fieldOptionName || '';
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
let actualFieldId;
|
|
208
|
+
let parsedValue;
|
|
209
|
+
|
|
210
|
+
// Case 1: Value is an object/array containing fieldId (Standard dynamic form structure)
|
|
211
|
+
if (value && typeof value === 'object') {
|
|
212
|
+
if (Array.isArray(value)) {
|
|
213
|
+
// For arrays (like RadioBox/Select), the fieldId is usually in the first item
|
|
214
|
+
actualFieldId = value[0]?.fieldId;
|
|
215
|
+
} else {
|
|
216
|
+
// For objects (like TextArea, Number), the fieldId is directly on the object
|
|
217
|
+
actualFieldId = value.fieldId;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Case 2: Value is a primitive (fallback)
|
|
221
|
+
else {
|
|
222
|
+
actualFieldId = key;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Find the field definition using the extracted actualFieldId
|
|
226
|
+
const fieldDef = actualFieldId ? fieldMap.get(actualFieldId) : undefined;
|
|
227
|
+
|
|
228
|
+
// Determine the key: Use fieldId if available, otherwise fallback to original key
|
|
229
|
+
const resultKey = fieldDef ? fieldDef.fieldId : key;
|
|
230
|
+
|
|
231
|
+
// Parse the value using the correct field definition
|
|
232
|
+
// Fallback definition if fieldDef is missing
|
|
233
|
+
const fallbackDef = {
|
|
234
|
+
id: 0,
|
|
235
|
+
fieldId: actualFieldId || key,
|
|
236
|
+
fieldName: resultKey,
|
|
237
|
+
fieldType: 'String',
|
|
238
|
+
fieldKey: 'Text',
|
|
239
|
+
number: 0,
|
|
240
|
+
multiSelect: false,
|
|
241
|
+
objId: 0
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
parsedValue = parseFieldValue(value, fieldDef || fallbackDef);
|
|
245
|
+
|
|
246
|
+
// Assign to result using the fieldId as the key
|
|
247
|
+
let finalValue = parsedValue.displayValue;
|
|
248
|
+
|
|
249
|
+
// 特殊类型统一返回 fieldOptionId(写入和组件回显需要的 ID)
|
|
250
|
+
// Select/RadioBox/CheckBox → 选项ID, Employee → 人员ID, Department → 部门ID, FileComponent → 文件ID
|
|
251
|
+
// 如需显示名称,配合 getFieldOptions 或从 uploadedFiles/selectedPerson 状态中获取
|
|
252
|
+
const fieldType = fieldDef?.fieldType;
|
|
253
|
+
const isIdType = fieldType === 'Select' || fieldType === 'RadioBox' || fieldType === 'CheckBox'
|
|
254
|
+
|| fieldType === 'Employee' || fieldType === 'Department' || fieldType === 'FileComponent';
|
|
255
|
+
|
|
256
|
+
if (isIdType) {
|
|
257
|
+
if (Array.isArray(value)) {
|
|
258
|
+
const ids = value
|
|
259
|
+
.map((v) => v?.fieldOptionId)
|
|
260
|
+
.filter((id) => id !== undefined && id !== null && id !== '');
|
|
261
|
+
|
|
262
|
+
finalValue = ids.length > 0 ? ids.join(',') : '';
|
|
263
|
+
} else if (value && typeof value === 'object') {
|
|
264
|
+
finalValue = value.fieldOptionId ? String(value.fieldOptionId) : '';
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
simpleItem[actualFieldId] = finalValue;
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
return simpleItem;
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* 获取转换后的简单格式数据
|
|
278
|
+
* @param {string} objId
|
|
279
|
+
* @param {string} userId
|
|
280
|
+
* @returns {Promise<Array<SimpleDataItem>>}
|
|
281
|
+
*/
|
|
282
|
+
export async function getSimpleData(objId, userId) {
|
|
283
|
+
const [fields, dataRows] = await Promise.all([
|
|
284
|
+
getFields(objId, userId),
|
|
285
|
+
getAllData(objId, userId)
|
|
286
|
+
]);
|
|
287
|
+
const result = transformToSimpleFormat(dataRows, fields);
|
|
288
|
+
return result;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// ==================== ID → 名称映射(用于表格展示) ====================
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* 将 simpleData 中 Select/Employee/Department 等字段的 ID 替换为显示名称。
|
|
295
|
+
* getSimpleData 返回的是 ID(用于写入),表格展示需要名称,用此函数转换。
|
|
296
|
+
*
|
|
297
|
+
* @param {Array<Object>} simpleData — getSimpleData 的返回值
|
|
298
|
+
* @param {Object} optionsMap — { fieldId: [{valueKey, name}, ...] },valueKey→name 的映射表
|
|
299
|
+
* @returns {Array<Object>} 字段值为显示名称的新数组
|
|
300
|
+
*
|
|
301
|
+
* 用法:
|
|
302
|
+
* var [data, setData] = useState([]);
|
|
303
|
+
* useEffect(function () {
|
|
304
|
+
* Promise.all([
|
|
305
|
+
* getSimpleData(OBJ_ID, USER_ID),
|
|
306
|
+
* getFieldOptions(F.status, FORM_ID),
|
|
307
|
+
* ]).then(function ([rows, statusOpts]) {
|
|
308
|
+
* setData(withDisplayNames(rows, { [F.status]: statusOpts }));
|
|
309
|
+
* });
|
|
310
|
+
* }, []);
|
|
311
|
+
*/
|
|
312
|
+
export function withDisplayNames(simpleData, optionsMap) {
|
|
313
|
+
return simpleData.map(function (row) {
|
|
314
|
+
var displayRow = {};
|
|
315
|
+
Object.keys(row).forEach(function (key) {
|
|
316
|
+
var options = optionsMap[key];
|
|
317
|
+
if (options && options.length) {
|
|
318
|
+
var ids = (row[key] || '').split(',');
|
|
319
|
+
displayRow[key] = ids.map(function (id) {
|
|
320
|
+
var opt = options.find(function (o) { return o.valueKey === id; });
|
|
321
|
+
return opt ? opt.name : id;
|
|
322
|
+
}).join(', ');
|
|
323
|
+
} else {
|
|
324
|
+
displayRow[key] = row[key];
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
return displayRow;
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// ==================== 保存表单数据 ====================
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* 保存表单数据
|
|
335
|
+
* @param {string} objId
|
|
336
|
+
* @param {Object} formData
|
|
337
|
+
* @param {string} userId
|
|
338
|
+
* @returns {Promise<Object>}
|
|
339
|
+
*/
|
|
340
|
+
export async function saveFormData(objId, formData, userId) {
|
|
341
|
+
const requestData = {
|
|
342
|
+
userid: userId,
|
|
343
|
+
datajson: {
|
|
344
|
+
datas: {
|
|
345
|
+
mainTable: formData,
|
|
346
|
+
operationinfo: {
|
|
347
|
+
doAction: 'n', // 新增操作
|
|
348
|
+
optionNoFindIgnore: 'false'
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
header: {
|
|
352
|
+
objId: objId,
|
|
353
|
+
tenantKey: TENANTKEY
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
const response = await fetchWithRetry(`${API_BASE}/v1/saveFormData`, {
|
|
359
|
+
method: 'POST',
|
|
360
|
+
headers: {
|
|
361
|
+
'Content-Type': 'application/json'
|
|
362
|
+
},
|
|
363
|
+
body: JSON.stringify(requestData),
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
const result = await response.json();
|
|
367
|
+
if (result.data && result.data.isSuccess === false) {
|
|
368
|
+
throw new Error('保存失败: ' + (result.data.msg || JSON.stringify(result.data)));
|
|
369
|
+
}
|
|
370
|
+
if (result.message && result.message.code !== '0') {
|
|
371
|
+
throw new Error('保存失败: ' + (result.message.msg || JSON.stringify(result.message)));
|
|
372
|
+
}
|
|
373
|
+
return result;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// ==================== 更新表单数据 ====================
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* 更新表单数据
|
|
380
|
+
* @param {string} objId
|
|
381
|
+
* @param {Object} formData
|
|
382
|
+
* @param {string} dataId - 数据ID
|
|
383
|
+
* @param {string} userId
|
|
384
|
+
* @returns {Promise<Object>}
|
|
385
|
+
*/
|
|
386
|
+
export async function updateFormData(objId, formData, dataId, userId) {
|
|
387
|
+
const requestData = {
|
|
388
|
+
userid: userId,
|
|
389
|
+
datajson: {
|
|
390
|
+
datas: {
|
|
391
|
+
mainTable: Object.assign({ id: dataId }, formData),
|
|
392
|
+
operationinfo: {
|
|
393
|
+
doAction: 'u',
|
|
394
|
+
optionNoFindIgnore: 'false'
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
header: {
|
|
398
|
+
objId: objId,
|
|
399
|
+
tenantKey: TENANTKEY
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
const response = await fetchWithRetry(`${API_BASE}/v1/saveFormData`, {
|
|
405
|
+
method: 'POST',
|
|
406
|
+
headers: {
|
|
407
|
+
'Content-Type': 'application/json'
|
|
408
|
+
},
|
|
409
|
+
body: JSON.stringify(requestData),
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
const result = await response.json();
|
|
413
|
+
if (result.data && result.data.isSuccess === false) {
|
|
414
|
+
throw new Error('更新失败: ' + (result.data.msg || JSON.stringify(result.data)));
|
|
415
|
+
}
|
|
416
|
+
if (result.message && result.message.code !== '0') {
|
|
417
|
+
throw new Error('更新失败: ' + (result.message.msg || JSON.stringify(result.message)));
|
|
418
|
+
}
|
|
419
|
+
return result;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// ==================== 删除表单数据 ====================
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* 删除表单数据
|
|
426
|
+
* @param {string} objId - 表单ID (objId)
|
|
427
|
+
* @param {string|number} dataId - 数据ID
|
|
428
|
+
* @param {string} userId - User ID
|
|
429
|
+
* @returns {Promise<Object>}
|
|
430
|
+
*/
|
|
431
|
+
export async function deleteFormData(objId, dataId, userId) {
|
|
432
|
+
const requestData = {
|
|
433
|
+
userid: userId,
|
|
434
|
+
datajson: {
|
|
435
|
+
header: {
|
|
436
|
+
objId: objId
|
|
437
|
+
},
|
|
438
|
+
mainTable: {
|
|
439
|
+
id: dataId
|
|
440
|
+
},
|
|
441
|
+
operationinfo: {
|
|
442
|
+
fieldNoFindIgnore: 'false'
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
|
|
447
|
+
const response = await fetchWithRetry(`${API_BASE}/v2/deleteData`, {
|
|
448
|
+
method: 'POST',
|
|
449
|
+
headers: {
|
|
450
|
+
'Content-Type': 'application/json'
|
|
451
|
+
},
|
|
452
|
+
body: JSON.stringify(requestData),
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
const result = await response.json();
|
|
456
|
+
|
|
457
|
+
if (result.message.code !== '0') {
|
|
458
|
+
throw new Error(`删除数据失败: ${result.message.msg}`);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
return result;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// ==================== 获取选项字段的具体选项值 ====================
|
|
465
|
+
export async function getFieldOptions(fieldId, objId) {
|
|
466
|
+
// 注意:第二个参数是 objId(表单对象 ID),与 getSimpleData/saveFormData 用的是同一个值
|
|
467
|
+
const infoUrl = `${publicUrl}/api/ebuilder/form/obj/getInfo/${objId}`;
|
|
468
|
+
const infoResponse = await fetchWithRetry(infoUrl, {
|
|
469
|
+
method: 'GET',
|
|
470
|
+
headers: { 'Content-Type': 'application/json' },
|
|
471
|
+
});
|
|
472
|
+
const infoResult = await infoResponse.json();
|
|
473
|
+
if (infoResult.code !== 200 || !infoResult.status) {
|
|
474
|
+
throw new Error(`获取表单信息失败: ${infoResult.msg || 'Unknown error'}`);
|
|
475
|
+
}
|
|
476
|
+
const formIdNew = infoResult.data?.formId;
|
|
477
|
+
|
|
478
|
+
if (!formIdNew) {
|
|
479
|
+
throw new Error('未能从表单信息中获取有效的 formId');
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
const url = `${publicUrl}/api/ebuilder/form/form/field/manage/getFormField`;
|
|
483
|
+
const requestBody = {
|
|
484
|
+
module: "ebuilderform",
|
|
485
|
+
formTableField: {
|
|
486
|
+
formField: {
|
|
487
|
+
id: fieldId,
|
|
488
|
+
form: {
|
|
489
|
+
id: formIdNew // Use the dynamically fetched formId
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
};
|
|
494
|
+
const response = await fetchWithRetry(url, {
|
|
495
|
+
method: 'POST',
|
|
496
|
+
headers: { 'Content-Type': 'application/json' },
|
|
497
|
+
body: JSON.stringify(requestBody),
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
const result = await response.json();
|
|
501
|
+
if (result.code !== 200 || !result.status) {
|
|
502
|
+
throw new Error(`获取字段选项失败: ${result.msg || 'Unknown error'}`);
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
const options = result.data?.options || [];
|
|
506
|
+
return options.map(option => ({
|
|
507
|
+
valueKey: option.valueKey,
|
|
508
|
+
name: option.name
|
|
509
|
+
}));
|
|
510
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React, { useState, useEffect, Suspense } from 'react';
|
|
2
|
+
import { Route } from 'react-router-dom';
|
|
3
|
+
import { regOvProps, appInfo, regReactChildren } from '@weapp/utils';
|
|
4
|
+
import { getSimpleData } from './api/formApi.js';
|
|
5
|
+
import { asyncImport } from '@weapp/ecodesdk';
|
|
6
|
+
|
|
7
|
+
// 初始的空白模板项目
|
|
8
|
+
const { publicUrl } = appInfo('@weapp/ecodesdk');
|
|
9
|
+
const extract = (
|
|
10
|
+
<Route path={`${publicUrl}/sp/custom/123123`}>
|
|
11
|
+
<React.Suspense fallback={<div>Loading...</div>}>
|
|
12
|
+
<>
|
|
13
|
+
HELLO WORLD
|
|
14
|
+
</>
|
|
15
|
+
</React.Suspense>
|
|
16
|
+
</Route>
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
regOvProps('weappEcodesdk', 'Switch', (props) => {
|
|
20
|
+
regReactChildren(props, extract);
|
|
21
|
+
return props;
|
|
22
|
+
}, 0);
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module.exports = [
|
|
2
|
+
{
|
|
3
|
+
files: ["**/*.js"],
|
|
4
|
+
languageOptions: {
|
|
5
|
+
ecmaVersion: 2022,
|
|
6
|
+
sourceType: "module",
|
|
7
|
+
parserOptions: {
|
|
8
|
+
ecmaFeatures: { jsx: true }
|
|
9
|
+
},
|
|
10
|
+
globals: {
|
|
11
|
+
React: "readonly",
|
|
12
|
+
TEAMS: "readonly",
|
|
13
|
+
TENANTKEY: "readonly",
|
|
14
|
+
Route: "readonly",
|
|
15
|
+
console: "readonly",
|
|
16
|
+
alert: "readonly",
|
|
17
|
+
confirm: "readonly",
|
|
18
|
+
Promise: "readonly",
|
|
19
|
+
AbortController: "readonly",
|
|
20
|
+
fetch: "readonly",
|
|
21
|
+
setTimeout: "readonly",
|
|
22
|
+
clearTimeout: "readonly",
|
|
23
|
+
JSON: "readonly",
|
|
24
|
+
Object: "readonly",
|
|
25
|
+
Array: "readonly",
|
|
26
|
+
Date: "readonly",
|
|
27
|
+
String: "readonly",
|
|
28
|
+
parseInt: "readonly",
|
|
29
|
+
encodeURIComponent: "readonly",
|
|
30
|
+
Error: "readonly",
|
|
31
|
+
URLSearchParams: "readonly",
|
|
32
|
+
Map: "readonly",
|
|
33
|
+
document: "readonly",
|
|
34
|
+
window: "readonly",
|
|
35
|
+
FormData: "readonly",
|
|
36
|
+
Event: "readonly",
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
rules: {
|
|
40
|
+
"no-undef": "error",
|
|
41
|
+
"no-unused-vars": "warn",
|
|
42
|
+
"no-redeclare": "error",
|
|
43
|
+
"no-dupe-keys": "error",
|
|
44
|
+
"no-const-assign": "error",
|
|
45
|
+
"no-empty": "warn",
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
];
|
|
File without changes
|