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,88 @@
|
|
|
1
|
+
# 鉴权与多环境管理
|
|
2
|
+
|
|
3
|
+
> e10-cli 支持多环境 Profile 切换,auth 文件和 config 按环境隔离存储。
|
|
4
|
+
|
|
5
|
+
## 目录结构
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
~/.e10-cli/
|
|
9
|
+
├── profile ← 当前激活的 profile 名
|
|
10
|
+
└── profiles/
|
|
11
|
+
├── yunteams/
|
|
12
|
+
│ ├── auth ← 加密的认证凭证
|
|
13
|
+
│ └── config.json ← baseUrl + passportUrl
|
|
14
|
+
└── mulinquan/
|
|
15
|
+
├── auth
|
|
16
|
+
└── config.json
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 命令参考
|
|
20
|
+
|
|
21
|
+
### 登录认证
|
|
22
|
+
|
|
23
|
+
| 命令 | 说明 |
|
|
24
|
+
|------|------|
|
|
25
|
+
| `e10-cli auth set --eteamsid <id> --base-url <url>` | 直接写入 ETEAMSID(**当前唯一可用方式**)。ETEAMSID 从浏览器 DevTools → Application → Cookies 复制。自动解析 userId + tenantKey |
|
|
26
|
+
| `e10-cli auth status` | 查看当前登录状态(含 profile 名、cookie 有效性) |
|
|
27
|
+
|
|
28
|
+
> ⚠️ `e10-cli auth login`(浏览器 OIDC 登录)**暂未实现,已禁用**,执行会提示"开发中"。当前一律用 `auth set`。
|
|
29
|
+
|
|
30
|
+
### Profile 管理
|
|
31
|
+
|
|
32
|
+
| 命令 | 说明 |
|
|
33
|
+
|------|------|
|
|
34
|
+
| `e10-cli auth profile list` | 列出本地所有 Profile |
|
|
35
|
+
| `e10-cli auth profile current` | 查看当前激活的 Profile |
|
|
36
|
+
| `e10-cli auth profile use <name>` | 切换到指定 Profile(不存在则自动创建) |
|
|
37
|
+
|
|
38
|
+
**单次覆盖**:所有命令支持 `--profile <name>` 临时用指定 profile(auth + config baseUrl),不切换全局激活态:
|
|
39
|
+
```bash
|
|
40
|
+
e10-cli --profile e-cology form list <appId> # 只用这一次,不改变当前环境
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 典型用法
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# 在 yunteams 环境登录
|
|
47
|
+
e10-cli auth set --eteamsid "PCACCOUNT_xxx" --base-url "https://weapp.yunteams.cn"
|
|
48
|
+
# → 自动创建/切换到 profile: yunteams
|
|
49
|
+
|
|
50
|
+
# 切到 mulinquan
|
|
51
|
+
e10-cli auth set --eteamsid "PCACCOUNT_yyy" --base-url "https://weapp.mulinquan.cn"
|
|
52
|
+
# → 自动创建/切换到 profile: mulinquan
|
|
53
|
+
|
|
54
|
+
# 查看所有环境
|
|
55
|
+
e10-cli auth profile list
|
|
56
|
+
|
|
57
|
+
# 切回 yunteams
|
|
58
|
+
e10-cli auth profile use yunteams
|
|
59
|
+
|
|
60
|
+
# 查看当前
|
|
61
|
+
e10-cli auth status
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 全局选项
|
|
65
|
+
|
|
66
|
+
| 选项 | 说明 |
|
|
67
|
+
|------|------|
|
|
68
|
+
| `--auth <path>` | 临时指定 auth 文件路径(覆盖 profile) |
|
|
69
|
+
| `--base-url <url>` | 临时指定平台地址 |
|
|
70
|
+
| `--json` | JSON 格式输出 |
|
|
71
|
+
|
|
72
|
+
## Profile 命名规则
|
|
73
|
+
|
|
74
|
+
`auth set` 时根据 `baseUrl` 域名自动生成 profile 名:
|
|
75
|
+
- `https://weapp.yunteams.cn` → `yunteams`
|
|
76
|
+
- `https://weapp.mulinquan.cn` → `mulinquan`
|
|
77
|
+
|
|
78
|
+
也可用 `auth profile use <自定义名>` 手动创建命名。
|
|
79
|
+
|
|
80
|
+
## 凭证加密
|
|
81
|
+
|
|
82
|
+
Auth 文件使用 AES-256-GCM 加密存储,密钥存于 **OS keychain**(每机一把动态密钥,源码不含密钥),headless 无 keychain 后端时回退到 `~/.e10-cli/.key`(0600)。详见 `core/crypto.ts`。格式:
|
|
83
|
+
```json
|
|
84
|
+
{ "enc": true, "v": 1, "data": "<base64>" }
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
> 与 `e10-login` 共用同一 keychain 条目(service=`e10-cli`/account=`auth-key`),auth 文件在 e10-cli 与 e10-login 间互通——用任一登录后另一个可直接用。
|
|
88
|
+
> ⚠️ 从硬编码密钥迁移到动态密钥后,旧版 auth 文件无法解密,需重新登录(`auth login` 或 `auth set --eteamsid`)。
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# 编辑回显指南
|
|
2
|
+
|
|
3
|
+
编辑已有数据时,需要将表单数据加载回表单控件中。`getSimpleData` 对特殊类型统一返回 ID,可直接用于表单回显,但选择器组件需要额外提取 name 信息。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 核心流程
|
|
8
|
+
|
|
9
|
+
### 第一步:加载时同时获取两份数据
|
|
10
|
+
|
|
11
|
+
```js
|
|
12
|
+
// loadData 中用 Promise.all 同时获取两份数据
|
|
13
|
+
function loadData() {
|
|
14
|
+
Promise.all([
|
|
15
|
+
getSimpleData(OBJ_ID, USER_ID),
|
|
16
|
+
getAllData(OBJ_ID, USER_ID),
|
|
17
|
+
]).then(function ([simpleRows, allRows]) {
|
|
18
|
+
setData(withDisplayNames(simpleRows, statusMap));
|
|
19
|
+
setRawData(allRows); // 保存原始数据用于编辑回显
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 第二步:编辑按钮点击时回填表单
|
|
25
|
+
|
|
26
|
+
```js
|
|
27
|
+
function handleEdit(rowData) {
|
|
28
|
+
var dataId = rowData._raw.id; // Table 回调的 rowData 有 _raw,不是 getSimpleData 返回的行
|
|
29
|
+
|
|
30
|
+
// 1. 从 rawData(原始接口数据) 中查找对应记录
|
|
31
|
+
var rawEntry = rawData.find(function (r) {
|
|
32
|
+
return r.mainTable && r.mainTable.id && r.mainTable.id.fieldValue === dataId;
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// 2. 用 getSimpleData 的值填充表单(所有特殊字段已是 ID,可直接用)
|
|
36
|
+
var editForm = {};
|
|
37
|
+
Object.keys(emptyForm).forEach(function (key) {
|
|
38
|
+
editForm[key] = rowData._raw[key] || '';
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// 3. 从 rawEntry.mainTable 中提取 name 信息(选择器组件需要 [{id, name}] 格式)
|
|
42
|
+
var newSelectedPerson = [];
|
|
43
|
+
var newSelectedDept = [];
|
|
44
|
+
var newUploadedFiles = [];
|
|
45
|
+
|
|
46
|
+
if (rawEntry && rawEntry.mainTable) {
|
|
47
|
+
Object.keys(rawEntry.mainTable).forEach(function (key) {
|
|
48
|
+
var val = rawEntry.mainTable[key];
|
|
49
|
+
if (!val) return;
|
|
50
|
+
|
|
51
|
+
if (Array.isArray(val) && val.length > 0) {
|
|
52
|
+
var fieldId = val[0].fieldId;
|
|
53
|
+
var fieldType = val[0].fieldType;
|
|
54
|
+
|
|
55
|
+
if (fieldId === F.person) {
|
|
56
|
+
newSelectedPerson = val.map(function (v) {
|
|
57
|
+
return { id: v.fieldOptionId, name: v.fieldOptionName };
|
|
58
|
+
});
|
|
59
|
+
} else if (fieldId === F.dept) {
|
|
60
|
+
newSelectedDept = val.map(function (v) {
|
|
61
|
+
return { id: v.fieldOptionId, name: v.fieldOptionName };
|
|
62
|
+
});
|
|
63
|
+
} else if (fieldId === F.attachment) {
|
|
64
|
+
newUploadedFiles = val.map(function (v) {
|
|
65
|
+
return { fileid: v.fieldOptionId, name: v.fieldOptionName };
|
|
66
|
+
});
|
|
67
|
+
} else if (fieldType === 'Select' || fieldType === 'RadioBox' || fieldType === 'CheckBox') {
|
|
68
|
+
// getSimpleData 已返回 ID,此处从 rawEntry 再次确认(多选时覆盖)
|
|
69
|
+
editForm[fieldId] = val.map(function (v) { return v.fieldOptionId; }).join(',');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// 4. 一次性设置所有状态
|
|
76
|
+
setForm(editForm);
|
|
77
|
+
setSelectedPerson(newSelectedPerson);
|
|
78
|
+
setSelectedDept(newSelectedDept);
|
|
79
|
+
setUploadedFiles(newUploadedFiles);
|
|
80
|
+
setModalVisible(true);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 关键点总结
|
|
87
|
+
|
|
88
|
+
| 要点 | 说明 |
|
|
89
|
+
|------|------|
|
|
90
|
+
| `getAllData` 返回结构中 `id` 在 `mainTable` 内部 | 查找原始记录必须是 `r.mainTable.id.fieldValue`,**不能**写成 `r.id.fieldValue` |
|
|
91
|
+
| `Browser`(人员/部门) 的 `value` | 需要 `[{id, name}]` 格式 |
|
|
92
|
+
| `Upload`(附件) 的 `data` | 需要 `[{fileid, name}]` 格式 |
|
|
93
|
+
| `Select` 下拉框的 `value` | 需要匹配 `fieldOptionId`(即 `opt.valueKey`),不能是显示名 |
|
|
94
|
+
| Table 的 `onRowClick` 回调 | `rowData._raw` 引用了原始数据行,`rowData._raw.id` 是 dataId |
|
|
95
|
+
| 表单字段值来源 | 从 `getSimpleData` 取值(已是 ID),选择器显示名从 `getAllData` 提取 |
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## getSimpleData vs getAllData 结构对比
|
|
100
|
+
|
|
101
|
+
### getSimpleData 返回(扁平,纯 ID,用于写入)
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
[
|
|
105
|
+
{
|
|
106
|
+
"1290462231772995585": "张三", // Text:直接就是值
|
|
107
|
+
"1290462231772995586": "1290462231772995612", // Select:选项 ID
|
|
108
|
+
"1290462231772995589": "2765550234448235905", // Employee:用户 ID
|
|
109
|
+
"id": "1290469928435908609"
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
所有特殊字段统一返回 `fieldOptionId`(纯 ID),直接用于 `formToSave`。
|
|
115
|
+
|
|
116
|
+
### getAllData 返回(含名称,用于展示/回显)
|
|
117
|
+
|
|
118
|
+
```json
|
|
119
|
+
{
|
|
120
|
+
"mainTable": {
|
|
121
|
+
"sjhfa391": { // ← key 是随机哈希,不是 fieldId!
|
|
122
|
+
"fieldId": "1290462231772995590",
|
|
123
|
+
"fieldType": "Text",
|
|
124
|
+
"fieldValue": "13800138000"
|
|
125
|
+
},
|
|
126
|
+
"zssj98f9d": [{ // ← Employee 是数组!
|
|
127
|
+
"fieldId": "1290462231772995589",
|
|
128
|
+
"fieldType": "Employee",
|
|
129
|
+
"fieldOptionId": "2765550234448235905",
|
|
130
|
+
"fieldOptionName": "张三"
|
|
131
|
+
}],
|
|
132
|
+
"bm1d630": [{ // ← Select 也是数组!
|
|
133
|
+
"fieldId": "1290462231772995586",
|
|
134
|
+
"fieldType": "Select",
|
|
135
|
+
"fieldOptionId": "1290462231772995612",
|
|
136
|
+
"fieldOptionName": "技术部"
|
|
137
|
+
}],
|
|
138
|
+
"id": { // ← 只有 id 的 key 是 "id"
|
|
139
|
+
"fieldId": "5",
|
|
140
|
+
"fieldType": "Text",
|
|
141
|
+
"fieldValue": "1290469928435908609"
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 三个关键规则
|
|
148
|
+
|
|
149
|
+
| 规则 | 说明 |
|
|
150
|
+
|------|------|
|
|
151
|
+
| **key 是随机哈希** | `mainTable` 的 key(如 `sjhfa391`)是随机字符串,**不能**用 `mainTable[fieldId]` 直接取值 |
|
|
152
|
+
| **只能用 fieldId 匹配** | 必须遍历 `Object.values(mainTable)`,通过 `val.fieldId` 或 `val[0].fieldId` 匹配目标字段 |
|
|
153
|
+
| **数组 vs 对象** | Employee / Select / FileComponent / RadioBox / CheckBox → **数组** `[{...}]`;Text / Number / DateComponent → **对象** `{...}` |
|
|
154
|
+
| **只有 id 是 deterministic** | 数据行 ID 的 key 固定为 `"id"`,可直接用 `mainTable.id.fieldValue` |
|
|
155
|
+
|
|
156
|
+
### 字段值 → 组件 props 映射表
|
|
157
|
+
|
|
158
|
+
> 这是整个编辑回显最容易出错的一步。getAllData 中的字段形状各不相同,映射到组件 props 的方式也不同。
|
|
159
|
+
|
|
160
|
+
| 字段类型 | getAllData 中的形状 | 目标组件 | 需要的 props 格式 | 映射方式 |
|
|
161
|
+
|---------|-------------------|---------|-----------------|---------|
|
|
162
|
+
| Employee | `[{fieldOptionId, fieldOptionName}]` | `Browser` | `value={[{id, name}]}` | `v.fieldOptionId → id`,`v.fieldOptionName → name` |
|
|
163
|
+
| Department | `[{fieldOptionId, fieldOptionName}]` | `Browser` | `value={[{id, name}]}` | 同上 |
|
|
164
|
+
| FileComponent | `[{fieldOptionId, fieldOptionName}]` | `Upload` | `data={[{fileid, name}]}` | `v.fieldOptionId → fileid`,`v.fieldOptionName → name` |
|
|
165
|
+
| Select(单选) | `[{fieldOptionId}]` | `<select>` | `value="fieldOptionId"` | 取 `val[0].fieldOptionId` |
|
|
166
|
+
| Select(多选) | `[{...}, {...}]` → 多个 | `<select multiple>` | 逗号分隔串 | `val.map(...).join(',')` |
|
|
167
|
+
| Text / Number | `{fieldValue}` | `<input>` | `value="fieldValue"` | 直接用 `getSimpleData` 的值 |
|
|
168
|
+
|
|
169
|
+
### 正确的字段提取方式
|
|
170
|
+
|
|
171
|
+
```js
|
|
172
|
+
// 查找 mainTable 中 fieldId 匹配的字段值
|
|
173
|
+
function findField(mainTable, targetFieldId) {
|
|
174
|
+
var keys = Object.keys(mainTable);
|
|
175
|
+
for (var i = 0; i < keys.length; i++) {
|
|
176
|
+
var val = mainTable[keys[i]];
|
|
177
|
+
if (!val) continue;
|
|
178
|
+
// 数组类型(Employee/Select 等)取 val[0].fieldId
|
|
179
|
+
if (Array.isArray(val) && val.length > 0 && val[0].fieldId === targetFieldId) {
|
|
180
|
+
return val;
|
|
181
|
+
}
|
|
182
|
+
// 普通类型(Text/DateComponent 等)取 val.fieldId
|
|
183
|
+
if (!Array.isArray(val) && val.fieldId === targetFieldId) {
|
|
184
|
+
return val;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
```
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# 表单数据操作指南
|
|
2
|
+
|
|
3
|
+
Ebuilder 项目没有后端,但可以通过读写 Ebuilder 的表单来实现数据交互。所有 CRUD 接口已实现在 `/api/formApi.js` 中。
|
|
4
|
+
|
|
5
|
+
> 应用已注册的表单信息及字段用 `e10-cli form read <objId> --app-id <appId> --out fields.json` 导出(机器可读 JSON),为空说明还没注册。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 〇、非对称设计(读写分离)
|
|
10
|
+
|
|
11
|
+
**这是整份指南最核心的概念,每次写表单页面之前必须理解。**
|
|
12
|
+
|
|
13
|
+
`getSimpleData` 对所有特殊类型(Select / RadioBox / CheckBox / Employee / Department / FileComponent)**统一返回 ID**(`fieldOptionId`)。好处是写入简单——直接拿 ID 原样写入,不用做任何转换。代价是展示麻烦——ID 是长数字,用户完全看不懂。
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
写入路径(简单):getSimpleData → form 直接用 ID → saveFormData/updateFormData
|
|
17
|
+
展示路径(复杂):getSimpleData → ID → 映射为名称 → 表格渲染
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**不同字段类型,名称来源不同**:
|
|
21
|
+
|
|
22
|
+
| 字段类型 | getSimpleData 返回值 | 名称来源 |
|
|
23
|
+
|---------|---------------------|---------|
|
|
24
|
+
| 普通文本/数字/日期 | `"名称"` / `123` / `"2026-01-01"` | 直接展示 |
|
|
25
|
+
| Select / RadioBox / CheckBox | `"1283421826353889337"`(ID) | `getFieldOptions` 映射 `valueKey → name` |
|
|
26
|
+
| Employee / Department | `"5140559860850691459"`(用户ID) | `getAllData` 提取 `fieldOptionName` |
|
|
27
|
+
| FileComponent | `"fileid1,fileid2"`(文件ID串) | 上传组件的 `name` 字段 |
|
|
28
|
+
|
|
29
|
+
> **铁律:表格里永远不要直接渲染 `row[字段ID]`。** 用户看到一列长数字 = 你漏掉了名称转换。
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 一、四个 API 的职责
|
|
34
|
+
|
|
35
|
+
| API | 职责 |
|
|
36
|
+
|-----|------|
|
|
37
|
+
| `getAllData` | 做源(含 `fieldOptionName`,用于提取名称信息) |
|
|
38
|
+
| `getSimpleData` | 做读写(纯 ID,不含名称) |
|
|
39
|
+
| `withDisplayNames` | 做展示(ID → 名称转换) |
|
|
40
|
+
| `getFieldOptions` | 做下拉(拿 `valueKey` + `name`) |
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 二、核心规则:读取用 ID,展示用名称
|
|
45
|
+
|
|
46
|
+
**最容易出错的点,每次编码前务必理解:**
|
|
47
|
+
|
|
48
|
+
`getSimpleData` 对所有特殊类型(Select/RadioBox/CheckBox/Employee/Department/FileComponent)**统一返回 ID**(`fieldOptionId`),读写一致。
|
|
49
|
+
|
|
50
|
+
> 写完代码逐条自检,90% 的 bug 都是这几个:
|
|
51
|
+
> 1. `if (row[roomField] === '101')` — Select 字段值是 `fieldOptionId`(长数字如 `"1283421826353889337"`),永远不等于选项名称
|
|
52
|
+
> 2. `{row[empField]}` 直接渲染 — Employee/Department 返回的是长数字 ID,人名需从 `getAllData` 提取 `fieldOptionName`
|
|
53
|
+
> 3. 表格里直接显示 `row[fieldId]` — 用户看到一列长数字。展示用 `withDisplayNames()`
|
|
54
|
+
|
|
55
|
+
- **写入保存** → 直接用 `getSimpleData` 的返回值,所有字段都是 ID,无需转换
|
|
56
|
+
- **表格展示** → 用 `withDisplayNames()` 把 ID 转成名称,否则用户看到的是数字
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 三、读取表单数据
|
|
61
|
+
|
|
62
|
+
### 3.1 getSimpleData — 获取简单格式数据
|
|
63
|
+
|
|
64
|
+
```js
|
|
65
|
+
import { getSimpleData } from '../api/formApi.js';
|
|
66
|
+
const CONFIG = {
|
|
67
|
+
objId: '12556432068......',
|
|
68
|
+
userId: TEAMS.currentUser.id
|
|
69
|
+
};
|
|
70
|
+
const data = await getSimpleData(CONFIG.objId, CONFIG.userId);
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
返回格式:
|
|
74
|
+
```js
|
|
75
|
+
[
|
|
76
|
+
{
|
|
77
|
+
"4765111450482898127": "具体的数据内容",
|
|
78
|
+
"4765111450482898155": "具体的数据内容",
|
|
79
|
+
"id":"1259017552222814208" // 表单数据固有的数据ID字段,fieldId固定为"id"
|
|
80
|
+
},
|
|
81
|
+
{.....}
|
|
82
|
+
]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
`getSimpleData` 返回的是扁平对象,字段 ID 作为 key 直接挂载在行上,**没有 `_raw` 层**。直接用 `item[字段ID]` 访问。
|
|
86
|
+
|
|
87
|
+
> 注意:Table 组件的 `onRowClick` 回调参数中会带 `_raw`(引用原始数据行),仅在编辑回显等场景通过回调参数访问,不要主动去构造 `_raw`。
|
|
88
|
+
|
|
89
|
+
### 3.2 withDisplayNames — ID → 名称转换(表格展示用)
|
|
90
|
+
|
|
91
|
+
用于在表格中把 Select/Employee/Department 等字段的 ID 转成可读名称。
|
|
92
|
+
|
|
93
|
+
推荐写法:
|
|
94
|
+
```js
|
|
95
|
+
import { getSimpleData, withDisplayNames, getFieldOptions } from '../api/formApi.js';
|
|
96
|
+
|
|
97
|
+
function TemplatePage() {
|
|
98
|
+
const [data, setData] = useState([]);
|
|
99
|
+
const [loading, setLoading] = useState(true);
|
|
100
|
+
|
|
101
|
+
useEffect(function () {
|
|
102
|
+
Promise.all([
|
|
103
|
+
getSimpleData(CONFIG.objId, CONFIG.userId),
|
|
104
|
+
// 为每个需要展示名称的 Select 字段调用 getFieldOptions
|
|
105
|
+
getFieldOptions(F.status, OBJ_ID),
|
|
106
|
+
]).then(function ([rows, statusOpts]) {
|
|
107
|
+
setData(withDisplayNames(rows, { [F.status]: statusOpts }));
|
|
108
|
+
}).catch(function () {})
|
|
109
|
+
.finally(function () { setLoading(false); });
|
|
110
|
+
}, []);
|
|
111
|
+
// ......
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 3.3 getFieldOptions — 获取选项列表
|
|
115
|
+
|
|
116
|
+
动态获取 Select/RadioBox/CheckBox 字段的可选值:
|
|
117
|
+
|
|
118
|
+
```js
|
|
119
|
+
import { getFieldOptions } from './api/formApi.js';
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
返回结构:
|
|
123
|
+
```js
|
|
124
|
+
[
|
|
125
|
+
{
|
|
126
|
+
"valueKey": "1263421826353889337",
|
|
127
|
+
"name": "已入职"
|
|
128
|
+
},{
|
|
129
|
+
"valueKey": "1263421826353889338",
|
|
130
|
+
"name": "已离职"
|
|
131
|
+
}
|
|
132
|
+
]
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 四、字段类型对应组件
|
|
138
|
+
|
|
139
|
+
`form read --out fields.json` 导出的字段列表会告诉你每个字段的类型和 ID,有一些特殊的类型你必须选用对应的组件进行输入:
|
|
140
|
+
|
|
141
|
+
| 字段类型 | 对应组件 |
|
|
142
|
+
|---------|---------|
|
|
143
|
+
| Employee | `Browser` — 人员选择框(`module="hrm" type="resource"`) |
|
|
144
|
+
| Department | `Browser` — 部门选择框(`module="hrm" type="department"`) |
|
|
145
|
+
| FileComponent | `Upload` — 文件上传(参考 `references/components/form-Upload.md`) |
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 五、数据写入
|
|
150
|
+
|
|
151
|
+
### 5.1 formData 格式
|
|
152
|
+
|
|
153
|
+
**一定是字段 ID 作为 key 的格式**,字段 ID 是纯数字组成的字符串,不包含任何其他符号。必须对照 `form read --out fields.json` 导出的字段来写,不要自己编造。
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
{
|
|
157
|
+
"4765111450482898127": "数据内容1",
|
|
158
|
+
"4765111450482898155": "数据内容2"
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 5.2 三个写接口
|
|
163
|
+
|
|
164
|
+
**新增:**
|
|
165
|
+
```js
|
|
166
|
+
export async function saveFormData(objId, formData, userId)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**更新(多一个 dataId 参数):**
|
|
170
|
+
```js
|
|
171
|
+
export async function updateFormData(objId, formData, dataId, userId)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**删除:**
|
|
175
|
+
```js
|
|
176
|
+
export async function deleteFormData(objId, dataId, userId)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 5.3 调用方式
|
|
180
|
+
|
|
181
|
+
```js
|
|
182
|
+
if (editingId) {
|
|
183
|
+
promise = updateFormData(OBJ_ID, formToSave, editingId, USER_ID);
|
|
184
|
+
} else {
|
|
185
|
+
promise = saveFormData(OBJ_ID, formToSave, USER_ID);
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 5.4 写入时直接使用 form 的值(已全部为 ID)
|
|
190
|
+
|
|
191
|
+
`getSimpleData` 对所有特殊类型(Select/Employee/Department/FileComponent)统一返回 ID。编辑保存时无需跳过任何字段,`form` 中的值可直接写入。
|
|
192
|
+
|
|
193
|
+
```js
|
|
194
|
+
var formToSave = {};
|
|
195
|
+
|
|
196
|
+
// 所有字段统一处理,getSimpleData 已返回 ID
|
|
197
|
+
Object.keys(form).forEach(function (key) {
|
|
198
|
+
var val = form[key];
|
|
199
|
+
if (val !== '' && val !== null && val !== undefined) {
|
|
200
|
+
formToSave[key] = val;
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// 用户操作选择器时用新值覆盖
|
|
205
|
+
if (selectedPerson.length > 0) {
|
|
206
|
+
formToSave[F.person] = selectedPerson[0].id;
|
|
207
|
+
}
|
|
208
|
+
if (selectedDept.length > 0) {
|
|
209
|
+
formToSave[F.dept] = selectedDept[0].id;
|
|
210
|
+
}
|
|
211
|
+
if (uploadedFiles.length > 0) {
|
|
212
|
+
formToSave[F.attachment] = uploadedFiles.map(function (f) { return f.fileid; }).join(',');
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 六、三个高频编码错误
|
|
219
|
+
|
|
220
|
+
编写 Ebuilder 页面时,以下三个错误非常高发,生成代码前务必检查:
|
|
221
|
+
|
|
222
|
+
### 错误 1:数据访问用错层级
|
|
223
|
+
|
|
224
|
+
`getSimpleData` 返回的每一行直接用 `item[字段ID]`,**没有 `_raw` 层**。
|
|
225
|
+
|
|
226
|
+
```js
|
|
227
|
+
// 错误
|
|
228
|
+
var title = item._raw[F.title];
|
|
229
|
+
|
|
230
|
+
// 正确
|
|
231
|
+
var title = item[F.title];
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### 错误 2:Select 字段用名称做判断
|
|
235
|
+
|
|
236
|
+
`getSimpleData` 对 Select/RadioBox/CheckBox 字段返回的是**选项 ID**(`fieldOptionId`,即 `valueKey`),如 `"1283421826353889337"`,不是显示名称。
|
|
237
|
+
|
|
238
|
+
```js
|
|
239
|
+
// 错误
|
|
240
|
+
if (item[F.status] === '已完成') { ... } // 显示名称永远不匹配
|
|
241
|
+
|
|
242
|
+
// 正确
|
|
243
|
+
if (item[F.status] === '1283421826353889337') { ... } // 用选项 ID
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**表格中显示名称**请使用 `withDisplayNames()`,不要在表格列渲染时逐行查 ID。
|
|
247
|
+
|
|
248
|
+
### 错误 3:React state 直接修改
|
|
249
|
+
|
|
250
|
+
直接修改对象属性再 `setForm` 不会触发 React 重新渲染。
|
|
251
|
+
|
|
252
|
+
```js
|
|
253
|
+
// 错误
|
|
254
|
+
form[F.name] = value;
|
|
255
|
+
setForm(form);
|
|
256
|
+
|
|
257
|
+
// 正确
|
|
258
|
+
var newForm = {};
|
|
259
|
+
Object.keys(form).forEach(function (k) { newForm[k] = form[k]; });
|
|
260
|
+
newForm[F.name] = value;
|
|
261
|
+
setForm(newForm);
|
|
262
|
+
```
|