kcode-pi 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +358 -0
- package/dist/cli/kcode.d.ts +15 -0
- package/dist/cli/kcode.js +153 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +7 -0
- package/docs/KCODE_DISTRIBUTION.md +91 -0
- package/extensions/kingdee-harness.ts +180 -0
- package/extensions/kingdee-header.ts +122 -0
- package/extensions/kingdee-tools.ts +379 -0
- package/knowledge/.backup/v1.0.0/version.json +10 -0
- package/knowledge/cangqiong/product-notes.md +15 -0
- package/knowledge/common/business-flows.md +115 -0
- package/knowledge/common/config-guides.md +110 -0
- package/knowledge/common/error-patterns.md +170 -0
- package/knowledge/common/implementation.md +144 -0
- package/knowledge/cosmic/hard-constraints.md +38 -0
- package/knowledge/cosmic/ksql-datafix.md +34 -0
- package/knowledge/cosmic/platform-baseline.md +32 -0
- package/knowledge/cosmic/plugin-decision-matrix.md +40 -0
- package/knowledge/cosmic/review-checklist.md +40 -0
- package/knowledge/cosmic/unittest.md +35 -0
- package/knowledge/enterprise/api-reference.md +186 -0
- package/knowledge/enterprise/code-patterns.md +217 -0
- package/knowledge/enterprise/plugin-lifecycle.md +188 -0
- package/knowledge/enterprise/tables.json +159 -0
- package/knowledge/flagship/api-reference.md +237 -0
- package/knowledge/flagship/code-patterns.md +246 -0
- package/knowledge/flagship/cosmic-platform-note.md +15 -0
- package/knowledge/flagship/plugin-lifecycle.md +248 -0
- package/knowledge/flagship/tables.json +159 -0
- package/knowledge/version.json +10 -0
- package/knowledge/xinghan/product-notes.md +15 -0
- package/package.json +71 -0
- package/prompts/kd-discuss.md +11 -0
- package/prompts/kd-execute.md +12 -0
- package/prompts/kd-plan.md +12 -0
- package/prompts/kd-ship.md +12 -0
- package/prompts/kd-spec.md +12 -0
- package/prompts/kd-verify.md +12 -0
- package/skills/kd-check/SKILL.md +26 -0
- package/skills/kd-cosmic-dev/SKILL.md +82 -0
- package/skills/kd-cosmic-review/SKILL.md +90 -0
- package/skills/kd-cosmic-unittest/SKILL.md +92 -0
- package/skills/kd-debug/SKILL.md +30 -0
- package/skills/kd-discuss/SKILL.md +24 -0
- package/skills/kd-execute/SKILL.md +22 -0
- package/skills/kd-gen/SKILL.md +34 -0
- package/skills/kd-ksql/SKILL.md +86 -0
- package/skills/kd-plan/SKILL.md +24 -0
- package/skills/kd-ship/SKILL.md +22 -0
- package/skills/kd-spec/SKILL.md +24 -0
- package/skills/kd-verify/SKILL.md +22 -0
- package/themes/kcode-dark.json +81 -0
- package/vendor/kingdee-skills/cosmic-unittest/SKILL.md +788 -0
- package/vendor/kingdee-skills/cosmic-unittest/author-cache.json +5 -0
- package/vendor/kingdee-skills/cosmic-unittest/cosmic-unittest-skill-overview.html +746 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/business-test.md +205 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/common-test.md +257 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/formplugin-test.md +560 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/op-plugin-test.md +231 -0
- package/vendor/kingdee-skills/cosmic-unittest/examples/validator-test.md +232 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/business-helper.md +184 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/common-module.md +355 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/convert-plugin.md +130 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/formplugin.md +235 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/op-plugin.md +226 -0
- package/vendor/kingdee-skills/cosmic-unittest/patterns/validator.md +206 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/SKILL.md +674 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/advanced-scenario-checklist.md +307 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/algox-performance-checklist.md +129 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/coding-standard-checklist.md +491 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/cosmic-api-checklist.md +285 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/data-access-checklist.md +261 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/data-transaction-checklist.md +390 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/domain-logic-checklist.md +295 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/form-plugin-checklist.md +508 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/infra-checklist.md +254 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/ksql-checklist.md +305 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/lifecycle-checklist.md +298 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/operation-plugin-checklist.md +442 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/test-mock-checklist.md +120 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/ui-performance-checklist.md +320 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/scripts/pattern-matcher.py +336 -0
- package/vendor/kingdee-skills/kingdee-cosmic-reviewer/scripts/review-score-calculator.py +121 -0
- package/vendor/kingdee-skills/ok-cosmic/CHANGELOG.md +295 -0
- package/vendor/kingdee-skills/ok-cosmic/README.md +460 -0
- package/vendor/kingdee-skills/ok-cosmic/SKILL.md +287 -0
- package/vendor/kingdee-skills/ok-cosmic/agents/openai.yaml +17 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/BatchImportPluginTemplate.java +93 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/BillPlugInTemplate.java +156 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/ConvertPlugInTemplate.java +255 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/FormPluginTemplate.java +597 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/IWorkflowPluginTemplate.java +91 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/ListPluginTemplate.java +194 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/OpPluginTemplate.java +201 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/OpenApiControllerTemplate.java +103 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/PrintPluginTemplate.java +95 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/ReportFormPluginTemplate.java +257 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/ReportListDataPluginTemplate.java +70 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/StandardTreeListPluginTemplate.java +130 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/TaskTemplate.java +80 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/TreeListPluginTemplate.java +152 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/WriteBackPlugInTemplate.java +286 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/attachment/AttachmentUploadBindSample.java +93 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/botp/BotpTracePushSample.java +168 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/botp/SampleConvertPlugin.java +223 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/cache/SampleCacheUsage.java +218 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/concurrent/SampleThreadPoolBatch.java +156 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/data/DynamicObjectCrudSample.java +205 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/data/DynamicObjectOpsSample.java +100 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/BeforeOperationConfirmSample.java +217 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ConfirmDialogSample.java +131 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/EntryRowCalculateSample.java +116 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/F7FilterSample.java +134 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/GetAndSetValueSample.java +176 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/HyperlinkJumpSample.java +124 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/OpenBillModalSample.java +253 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ReturnParentDataSample.java +295 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/TreeControlSample.java +140 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ViewControlOpsSample.java +132 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/list/ListPluginBasicSample.java +170 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/list/ListPreOpenFilterSample.java +68 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/message/MessageNotifySample.java +95 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/mq/SampleMQConsumer.java +198 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/mq/sample_mq.xml +15 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/operation/OpAddValidatorsSample.java +137 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/operation/OperationOptionBridgeSample.java +228 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/package-info.java +19 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/BaseDataQuerySample.java +194 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/BatchQuerySample.java +368 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/DataSetQueryStatSample.java +131 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/report/SampleReportFormPlugin.java +179 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/report/SampleReportListDataPlugin.java +616 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/snippets-guide.md +64 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/task/ScheduleTaskSample.java +160 -0
- package/vendor/kingdee-skills/ok-cosmic/assets/snippets/workflow/SampleWorkflowPlugin.java +302 -0
- package/vendor/kingdee-skills/ok-cosmic/manifest.json +78 -0
- package/vendor/kingdee-skills/ok-cosmic/ok-cosmic-intro.html +903 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/attachment-api.md +114 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/botp-convert.md +98 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/dynamic-object.md +113 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/entity-metadata.md +123 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/event-lifecycle.md +184 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/flex-prop.md +114 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/form-utils.md +133 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/operate-chain.md +159 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/plugin-base.md +218 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/query-dataset.md +149 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/request-context.md +88 -0
- package/vendor/kingdee-skills/ok-cosmic/references/adv/view-handler.md +157 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-bill.md +76 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-botp.md +70 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-form.md +165 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-import.md +69 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-list.md +227 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-openapi.md +112 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-operation.md +135 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-print.md +65 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-report-data.md +64 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-report-form.md +90 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-task.md +62 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-tree-list.md +71 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-workflow.md +82 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-writeback.md +71 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-algo.md +67 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-cache.md +63 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-dynamic-model-svc.md +82 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-dynamic-object.md +70 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-entity-model.md +61 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-exception.md +64 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-file.md +63 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-id.md +47 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-lock.md +61 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-log.md +63 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-network-control.md +70 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-orm-access.md +78 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-request-context.md +62 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-threadpool.md +63 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-tx.md +64 -0
- package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-utils.md +67 -0
- package/vendor/kingdee-skills/ok-cosmic/requirements.txt +2 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/a-layer-rules.json +24 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/anti-patterns.md +48 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/cheat-sheet.md +256 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/coding-preferences.md +140 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/constraints.md +61 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/decision-matrix.md +222 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/intent-routing.md +94 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/platform-baseline.md +69 -0
- package/vendor/kingdee-skills/ok-cosmic/rules/post-check.md +109 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/config_loader.py +204 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-api-knowledge.py +910 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-basedata-query.py +359 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-config-check.py +181 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-extpoints-query.py +389 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-form-metadata.py +856 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-post-check.py +262 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-post-lint.py +293 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/__init__.py +2 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/base.py +393 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/resource_check.py +176 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/scene_check.py +375 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/style_check.py +434 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/lint/verify_check.py +36 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/route_client.py +186 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/script_utils.py +40 -0
- package/vendor/kingdee-skills/ok-cosmic/scripts/sqlite_cache.py +142 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/cuslib/kd-cd-cosmic-commons.jar +0 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/cuslib/kd-cd-cosmic-features.jar +0 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/ok-cosmic-docs.db +0 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/ok-cosmic.json +13 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/setup-mac.sh +18 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/setup-windows.bat +53 -0
- package/vendor/kingdee-skills/ok-cosmic/setup/setup.jar +0 -0
- package/vendor/kingdee-skills/ok-ksql/SKILL.md +81 -0
- package/vendor/kingdee-skills/ok-ksql/agents/openai.yaml +7 -0
- package/vendor/kingdee-skills/ok-ksql/manifest.json +14 -0
- package/vendor/kingdee-skills/ok-ksql/references/ksql-datafix.md +452 -0
- package/vendor/kingdee-skills/ok-ksql/scripts/ksql_lint.py +363 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# 动态表单插件
|
|
2
|
+
|
|
3
|
+
## TL;DR
|
|
4
|
+
- 适用:动态表单插件原生兜底,封装层没覆盖的 UI 生命周期和监听器时读本页。
|
|
5
|
+
- 先抓:`AbstractFormPlugin`、`registerListener`、核心事件顺序和上下文方法。
|
|
6
|
+
- 跳转:能用 `AbstractFormPluginExt` 就优先回到 `adv/plugin-base.md`;纯后台逻辑别读本页。
|
|
7
|
+
- 继续读全文:当你要确认字段联动、F7、页签/分录监听或文末坑位时。
|
|
8
|
+
|
|
9
|
+
## 概述
|
|
10
|
+
动态表单是金蝶云苍穹的基础 UI 承载,支持各类表单场景(单据、基础资料、活动等)。动态表单插件用于在表单加载、初始化、交互全生命周期进行业务逻辑干预。
|
|
11
|
+
|
|
12
|
+
> **适用边界**
|
|
13
|
+
> ✅ 本文档是原生兜底:当 `plugin-base.md`(封装层) 未覆盖你需要的表单事件时使用。
|
|
14
|
+
> ❌ 如果封装层 `AbstractFormPluginExt` 已满足需求,优先读 `references/adv/plugin-base.md`。
|
|
15
|
+
|
|
16
|
+
- 适用场景:表单字段联动、控件状态管理、事件拦截、参数验证
|
|
17
|
+
|
|
18
|
+
术语说明:文档中的 `F7` 指基础资料、引用数据等“选择引用数据”的控件弹窗场景,不是键盘按键事件。
|
|
19
|
+
|
|
20
|
+
## 核心基类
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
- 基类:`kd.bos.form.plugin.AbstractFormPlugin`
|
|
24
|
+
- 继承关系:`AbstractFormPlugin extends AbstractDataModelPlugin implements IFormPlugin`
|
|
25
|
+
|
|
26
|
+
## 额外监听器
|
|
27
|
+
|
|
28
|
+
- `BeforeF7SelectListener`:F7(基础资料/引用数据选择控件)弹出前,调整过滤条件
|
|
29
|
+
- `RowClickEventListener`:表格行点击
|
|
30
|
+
- `TreeNodeClickListener`:树形节点点击
|
|
31
|
+
- `TreeNodeCheckListener`:树形节点勾选
|
|
32
|
+
- `TabSelectListener`:标签页切换
|
|
33
|
+
- `ItemClickListener`:菜单/按钮点击
|
|
34
|
+
- `ClickListener`:控件通用点击
|
|
35
|
+
- `ProgresssListener`:进度条变化
|
|
36
|
+
|
|
37
|
+
## 核心事件
|
|
38
|
+
|
|
39
|
+
- `setPluginName`:// 显示界面前,准备显示配置时触发
|
|
40
|
+
- `preOpenForm`:// 显示界面前,准备参数时触发
|
|
41
|
+
- `loadCustomControlMetas`:// 显示界面前,构建参数时触发
|
|
42
|
+
- `setView`:// 表单视图模型初始化时调用,传入 IFormView
|
|
43
|
+
- `initialize`:// 表单视图初始化后触发
|
|
44
|
+
- `registerListener`:// 创建后触发,用于注册控件监听
|
|
45
|
+
- `getEntityType`:// 创建数据包前触发
|
|
46
|
+
- `createNewData`:// 开始新建数据包时触发
|
|
47
|
+
- `afterCreateNewData`:// 新建数据包完毕后触发
|
|
48
|
+
- `beforeBindData`:// 刷新前端前触发
|
|
49
|
+
- `afterBindData`:// 刷新前端后触发
|
|
50
|
+
- `beforeItemClick`:// 菜单按钮点击前触发
|
|
51
|
+
- `itemClick`:// 菜单按钮点击时触发
|
|
52
|
+
- `beforeDoOperation`:// 执行操作前触发
|
|
53
|
+
- `afterDoOperation`:// 执行操作后触发
|
|
54
|
+
- `confirmCallBack`:// 确认提示后触发
|
|
55
|
+
- `closedCallBack`:// 子界面关闭时触发
|
|
56
|
+
- `flexBeforeClosed`:// 弹性域维护界面关闭时触发
|
|
57
|
+
- `onGetControl`:// 获取控件编程模型时触发
|
|
58
|
+
- `customEvent`:// 自定义控件定制事件触发
|
|
59
|
+
- `TimerElapsed`:// 定时触发
|
|
60
|
+
- `beforeClosed`:// 界面关闭前触发
|
|
61
|
+
- `destory`:// 界面关闭后释放资源时触发
|
|
62
|
+
- `pageRelease`:// 界面关闭后释放资源时触发
|
|
63
|
+
- `beforeclick`:// 点击前校验事件
|
|
64
|
+
- `click`:// 点击后触发操作事件
|
|
65
|
+
- `propertyChanged`:// 修改字段值后触发
|
|
66
|
+
|
|
67
|
+
## 插件内上下文方法
|
|
68
|
+
|
|
69
|
+
```java
|
|
70
|
+
// 获取表单视图模型
|
|
71
|
+
IFormView view = this.getView();
|
|
72
|
+
|
|
73
|
+
// 获取表单数据模型
|
|
74
|
+
IDataModel model = this.getModel();
|
|
75
|
+
|
|
76
|
+
// 获取指定控件
|
|
77
|
+
Control control = this.getView().getControl("controlKey");
|
|
78
|
+
BasedataEdit basedataEdit = this.getView().getControl("basedatafield");
|
|
79
|
+
EntryGrid entryGrid = this.getView().getControl("entryentity");
|
|
80
|
+
|
|
81
|
+
// 获取字段值
|
|
82
|
+
Object value = this.getModel().getValue("fieldKey");
|
|
83
|
+
|
|
84
|
+
// 设置字段值(自动触发propertyChanged)
|
|
85
|
+
this.getModel().setValue("fieldKey", newValue);
|
|
86
|
+
|
|
87
|
+
// 控件启用/禁用
|
|
88
|
+
this.getView().setEnable(false, "controlKey");
|
|
89
|
+
|
|
90
|
+
// 控件隐显
|
|
91
|
+
this.getView().setVisible(false, "controlKey");
|
|
92
|
+
|
|
93
|
+
// 获取完整数据包
|
|
94
|
+
DynamicObject dataEntity = model.getDataEntity();
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
说明:`this.getView().getControl("controlKey")` 的返回类型是 `<T extends kd.bos.form.control.Control>`,所有控件都继承自 `kd.bos.form.control.Control`,实际拿到的是具体控件对象,例如 `BasedataEdit`、`EntryGrid`、`ProgressBar` 等。
|
|
98
|
+
|
|
99
|
+
## 示例代码
|
|
100
|
+
|
|
101
|
+
示例代码统一维护在模板文件中,直接参考:
|
|
102
|
+
|
|
103
|
+
- [FormPluginTemplate.java](../../../assets/FormPluginTemplate.java)
|
|
104
|
+
|
|
105
|
+
## 实践建议
|
|
106
|
+
|
|
107
|
+
1. **registerListener中统一注册所有监听**
|
|
108
|
+
- 不要分散在多个事件中注册监听
|
|
109
|
+
- 每个监听最多 add 一次
|
|
110
|
+
|
|
111
|
+
2. **propertyChanged做联动**
|
|
112
|
+
- 修改后的级联操作放propertyChanged
|
|
113
|
+
|
|
114
|
+
3. **afterCreateNewData内赋值不触发propertyChanged**
|
|
115
|
+
- 文档明确说明此时不触发propertyChanged
|
|
116
|
+
- 需要联动时在afterBindData里处理
|
|
117
|
+
|
|
118
|
+
4. **子页面返回统一走closedCallBack**
|
|
119
|
+
- 不要在各处open子页面时写回调
|
|
120
|
+
- 所有子页面返回由closedCallBack统一处理
|
|
121
|
+
|
|
122
|
+
5. **重逻辑不要放插件**
|
|
123
|
+
- 复杂业务逻辑写服务层
|
|
124
|
+
- UI插件仅做编排与界面控制
|
|
125
|
+
|
|
126
|
+
## 常见坑位
|
|
127
|
+
|
|
128
|
+
### ❌ 仅implements接口不注册监听
|
|
129
|
+
```java
|
|
130
|
+
// 错误:只implements但没注册
|
|
131
|
+
public class TreeClickBad extends AbstractFormPlugin implements TreeNodeClickListener {
|
|
132
|
+
@Override
|
|
133
|
+
public void treeNodeClick(TreeNodeClickEvent e) {
|
|
134
|
+
// 永远不会被调用
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// 正确:implement后在registerListener注册
|
|
139
|
+
public class TreeClickGood extends AbstractFormPlugin implements TreeNodeClickListener {
|
|
140
|
+
@Override
|
|
141
|
+
public void registerListener(EventObject e) {
|
|
142
|
+
super.registerListener(e);
|
|
143
|
+
TreeView tv = this.getView().getControl("treeKey");
|
|
144
|
+
if (tv != null) {
|
|
145
|
+
tv.addTreeNodeClickListener(this); // 必须注册
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### ❌ 在registerListener里调用model.getValue
|
|
152
|
+
- 此时数据尚未绑定,getValue返回null
|
|
153
|
+
- 应在afterBindData或propertyChanged里操作
|
|
154
|
+
|
|
155
|
+
### ❌ 期望afterCreateNewData触发propertyChanged
|
|
156
|
+
- 此时赋值不会触发propertyChanged事件
|
|
157
|
+
- 级联更新需在afterBindData里显式处理
|
|
158
|
+
|
|
159
|
+
### ❌ 嵌套树/表格重复注册监听
|
|
160
|
+
- 同一控件avoid重复addListener
|
|
161
|
+
- 使用标识符检查是否已注册
|
|
162
|
+
|
|
163
|
+
### ❌ destory拼写错误
|
|
164
|
+
- 方法名是destory(少r),不是destroy
|
|
165
|
+
- 跟风覆盖时要按文档准确拼写
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# 引入引出插件
|
|
2
|
+
|
|
3
|
+
## TL;DR
|
|
4
|
+
- 适用:Excel 导入流程扩展,包括导入前校验、保存拦截、日志和结果加工。
|
|
5
|
+
- 先抓:`BatchImportPlugin` 和导入生命周期,不要套用普通表单插件思路。
|
|
6
|
+
- 跳转:普通 UI 插件或批量按钮逻辑不看本页;模板优先参考 `BatchImportPluginTemplate`。
|
|
7
|
+
- 继续读全文:当你要确认导入事件、上下文对象或失败处理扩展点时。
|
|
8
|
+
|
|
9
|
+
## 概述
|
|
10
|
+
引入引出插件用于扩展 Excel 导入流程,包括批量策略、保存拦截、数据校验与日志记录。
|
|
11
|
+
|
|
12
|
+
> **适用边界**
|
|
13
|
+
> ✅ 本文档是原生兜底:引入引出场景直接使用,无封装层。
|
|
14
|
+
> ❌ 普通表单插件的导入事件已在 `FormPluginTemplate` 中省略,因为有独立的 `BatchImportPluginTemplate`。
|
|
15
|
+
|
|
16
|
+
## 核心基类
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
- 基类:`kd.bos.form.plugin.impt.BatchImportPlugin`
|
|
20
|
+
- 继承关系:`BatchImportPlugin implements Callable<Object>, IImportDataPlugin`
|
|
21
|
+
|
|
22
|
+
## 核心事件
|
|
23
|
+
|
|
24
|
+
- `save(List<ImportBillData> rowdatas, ImportLogger logger)`:每批导入数据保存时进入,是最核心的校验与过滤拦截点。
|
|
25
|
+
- `getBatchImportSize()`:初始化批量导入策略时调用,用于确定批次大小。
|
|
26
|
+
- `isForceBatch()`:初始化导入模式时调用,用于决定是否强制批处理。
|
|
27
|
+
|
|
28
|
+
## 插件内上下文方法
|
|
29
|
+
|
|
30
|
+
以下更适合作为导入插件的上下文/工具方法,不建议继续按“事件”理解:
|
|
31
|
+
|
|
32
|
+
- `getContext()`:获取导入上下文。
|
|
33
|
+
- `getLogger()`:获取导入日志对象。
|
|
34
|
+
- `getBatchSize()`:读取当前批次大小。
|
|
35
|
+
- `refreshHeartbeat()`:刷新任务心跳。
|
|
36
|
+
- `call()`:导入任务执行入口包装。
|
|
37
|
+
|
|
38
|
+
```java
|
|
39
|
+
Map<String, Object> billData = data.getData();
|
|
40
|
+
logger.log(data.getStartIndex(), "错误信息").fail();
|
|
41
|
+
return super.save(rowdatas, logger);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 其他扩展点
|
|
45
|
+
|
|
46
|
+
- `beforeSave(...)`:保存前批次预校验。
|
|
47
|
+
- `resolveExcel()`:Excel 解析扩展。
|
|
48
|
+
- `importData()`:导入主流程扩展。
|
|
49
|
+
- `getDefaultImportType()` / `getDefaultKeyFields()`:默认导入配置扩展。
|
|
50
|
+
|
|
51
|
+
## 示例代码
|
|
52
|
+
|
|
53
|
+
示例代码统一维护在模板文件中,直接参考:
|
|
54
|
+
|
|
55
|
+
- [BatchImportPluginTemplate.java](../../../assets/BatchImportPluginTemplate.java)
|
|
56
|
+
|
|
57
|
+
## 实践建议
|
|
58
|
+
|
|
59
|
+
1. 导入校验优先集中在 `save(...)`。
|
|
60
|
+
2. 大数据量场景要明确 `getBatchImportSize()` 和 `isForceBatch()`。
|
|
61
|
+
3. 对失败行必须写 `ImportLogger`,方便用户回溯。
|
|
62
|
+
4. 优先过滤非法数据后再复用 `super.save(...)`。
|
|
63
|
+
|
|
64
|
+
## 常见坑位
|
|
65
|
+
|
|
66
|
+
- 把 `call()`、`refreshHeartbeat()`、`getContext()` 这种上下文能力写成“事件说明”。
|
|
67
|
+
- 直接抛异常中断整批导入,导致可导入数据也丢失。
|
|
68
|
+
- 不记录失败日志,用户无法定位错误行。
|
|
69
|
+
- 批次过大导致内存抖动或请求超时。
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# 标准单据列表插件
|
|
2
|
+
|
|
3
|
+
## TL;DR
|
|
4
|
+
- 适用:标准/基础资料/左树右表列表的原生兜底事件与取数控制。
|
|
5
|
+
- 先抓:`AbstractListPlugin`、过滤容器、列定义、行点击和打开单据回调。
|
|
6
|
+
- 跳转:若 Ext 基类够用先回 `adv/plugin-base.md`;树侧联动再补读 `plugin-tree-list.md`。
|
|
7
|
+
- 继续读全文:当你要改过滤器、列表取数、超链接或行事件,并规避文末坑位时。
|
|
8
|
+
|
|
9
|
+
## 概述
|
|
10
|
+
单据列表插件用于控制列表的加载、显示、取数、过滤、行交互等全生命周期。列表支持标准的单据/基础资料列表、左树右表列表等多种布局。
|
|
11
|
+
|
|
12
|
+
> **适用边界**
|
|
13
|
+
> ✅ 本文档是原生兜底:当 `plugin-base.md`(封装层) 未覆盖你需要的列表事件时使用。
|
|
14
|
+
> ❌ 如果封装层 `AbstractListPluginExt` 已满足需求,优先读 `references/adv/plugin-base.md`。
|
|
15
|
+
|
|
16
|
+
- 适用场景:列表过滤定制、列表数据处理、行交互、超链接、单据打开回调
|
|
17
|
+
|
|
18
|
+
术语说明:文档中的 `F7` 指过滤容器或字段上的基础资料/引用数据选择控件弹窗,不是键盘按键事件。
|
|
19
|
+
|
|
20
|
+
## 核心基类
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
- 基类:`kd.bos.list.plugin.AbstractListPlugin`
|
|
24
|
+
- 继承关系:`AbstractListPlugin extends AbstractFormPlugin implements ListRowClickListener, IPCListPlugin`
|
|
25
|
+
|
|
26
|
+
## 额外监听器
|
|
27
|
+
|
|
28
|
+
- `IRegisterPropertyListener`:过滤/依赖字段事件
|
|
29
|
+
- `BeforeF7SelectListener`:F7(基础资料/引用数据选择控件)选择前拦截(过滤容器场景)
|
|
30
|
+
|
|
31
|
+
## 核心事件
|
|
32
|
+
|
|
33
|
+
- `filterContainerInit`:// 过滤容器初始化,可添加/修改过滤字段定义
|
|
34
|
+
- `beforeCreateListColumns`:// 创建列定义前,可添加/修改列信息
|
|
35
|
+
- `beforeCreateListDataProvider`:// 创建取数器前,可自定义取数逻辑
|
|
36
|
+
- `setFilter`:// 查询前调整过滤条件
|
|
37
|
+
- `filterContainerSearchClick`:// 用户点击查询或修改快捷过滤时触发
|
|
38
|
+
- `filterContainerAfterSearchClick`:// 过滤条件解析完毕后联动处理
|
|
39
|
+
- `filterContainerBeforeF7Select`:// 过滤容器 F7(基础资料/引用数据选择控件)弹出前拦截
|
|
40
|
+
- `filterColumnSetFilter`:// 基础资料过滤字段条件调整
|
|
41
|
+
- `baseDataColumnDependFieldSet`:// 设置常用过滤依赖字段
|
|
42
|
+
- `beforeItemClick`:// 菜单按钮点击前触发
|
|
43
|
+
- `itemClick`:// 菜单按钮点击时触发
|
|
44
|
+
- `billListHyperLinkClick`:// 点击超链接单元格时触发
|
|
45
|
+
- `beforeShowBill`:// 打开单据维护界面前触发
|
|
46
|
+
- `billClosedCallBack`:// 单据维护界面关闭返回时触发
|
|
47
|
+
- `listRowClick`:// 列表行点击时触发
|
|
48
|
+
- `listRowDoubleClick`:// 列表行双击时触发
|
|
49
|
+
- `setCellFieldValue`:// 设置单元格指令时触发
|
|
50
|
+
- `setPluginName`:// 界面显示前触发
|
|
51
|
+
- `preOpenForm`:// 界面打开前触发
|
|
52
|
+
- `loadCustomControlMetas`:// 自定义控件元数据加载时触发
|
|
53
|
+
- `setView`:// 视图注入时触发
|
|
54
|
+
- `initialize`:// 初始化时触发
|
|
55
|
+
- `registerListener`:// 注册监听时触发
|
|
56
|
+
- `beforeBindData`:// 绑定前触发
|
|
57
|
+
- `afterBindData`:// 绑定后触发
|
|
58
|
+
|
|
59
|
+
## 插件内上下文方法
|
|
60
|
+
|
|
61
|
+
### 过滤容器操作
|
|
62
|
+
```java
|
|
63
|
+
// filterContainerInit 中添加自定义过滤字段
|
|
64
|
+
FilterColumn filterColumn = new FilterColumn("datefield");
|
|
65
|
+
filterColumn.setDefaultValues("2019-1-30", "2019-1-31");
|
|
66
|
+
args.addFilterColumn(filterColumn);
|
|
67
|
+
|
|
68
|
+
// filterContainerSearchClick 中获取过滤值
|
|
69
|
+
String filterValue = args.getFilterValue("datefield");
|
|
70
|
+
Map<String, Object> fastFilters = args.getFastFilterValues();
|
|
71
|
+
|
|
72
|
+
// 动态添加过滤条件
|
|
73
|
+
QFilter qfilter = new QFilter("datefield", CompareTypeEnum.EQUAL, "2020-01-01");
|
|
74
|
+
args.addFilter("datefield", qfilter);
|
|
75
|
+
|
|
76
|
+
// 添加快速过滤
|
|
77
|
+
args.addFastFilter("textfield", "searchValue");
|
|
78
|
+
|
|
79
|
+
// 获取过滤后的 QFilter
|
|
80
|
+
QFilter filter = args.getQFilter("datefield");
|
|
81
|
+
|
|
82
|
+
// 获取选中的主组织
|
|
83
|
+
Set<String> mainOrgIds = args.getSelectMainOrgIds();
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 列定义操作
|
|
87
|
+
```java
|
|
88
|
+
// beforeCreateListColumns 中修改列定义
|
|
89
|
+
ComboListColumn comboColumn = new ComboListColumn();
|
|
90
|
+
comboColumn.setListFieldKey("combofield");
|
|
91
|
+
|
|
92
|
+
MergeListColumn mergeColumn = new MergeListColumn();
|
|
93
|
+
mergeColumn.setKey("mergecolumn");
|
|
94
|
+
mergeColumn.getItems().add(comboColumn);
|
|
95
|
+
|
|
96
|
+
beforecreatelistcolumnsargs.addListColumn(mergeColumn);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 行点击操作
|
|
100
|
+
```java
|
|
101
|
+
// listRowClick 中获取行数据
|
|
102
|
+
@Override
|
|
103
|
+
public void listRowClick(RowClickEventArgs e) {
|
|
104
|
+
DynamicObject dataEntity = e.getDataEntity();
|
|
105
|
+
String billNo = (String) dataEntity.get("billno");
|
|
106
|
+
System.out.println("点击行:" + billNo);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// listRowDoubleClick 中处理双击
|
|
110
|
+
@Override
|
|
111
|
+
public void listRowDoubleClick(RowClickEventArgs e) {
|
|
112
|
+
DynamicObject dataEntity = e.getDataEntity();
|
|
113
|
+
String billId = (String) dataEntity.get("id");
|
|
114
|
+
// 打开单据或其他操作
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## 示例代码
|
|
119
|
+
|
|
120
|
+
示例代码统一维护在模板文件中,直接参考:
|
|
121
|
+
|
|
122
|
+
- [ListPluginTemplate.java](../../../assets/ListPluginTemplate.java)
|
|
123
|
+
|
|
124
|
+
## 实践建议
|
|
125
|
+
|
|
126
|
+
1. **过滤定制优先用 filterContainerInit + filterContainerAfterSearchClick**
|
|
127
|
+
- 在 init 中定义字段
|
|
128
|
+
- 在 afterSearchClick 中处理联动
|
|
129
|
+
|
|
130
|
+
2. **避免在逐行处理链路中查库**
|
|
131
|
+
- 大数据量场景性能问题
|
|
132
|
+
- 应在 beforeCreateListDataProvider 或 setFilter 中提前准备数据
|
|
133
|
+
|
|
134
|
+
3. **基础资料引用字段不要在 beforeCreateListDataProvider 里修改**
|
|
135
|
+
- 会破坏内置缓存
|
|
136
|
+
- 只适合修改非基础资料字段
|
|
137
|
+
|
|
138
|
+
4. **行点击与菜单项点击分离**
|
|
139
|
+
- 行点击处理用 listRowClick
|
|
140
|
+
- 菜单按钮用 itemClick
|
|
141
|
+
- 避免混淆
|
|
142
|
+
|
|
143
|
+
5. **单据打开回调用 billClosedCallBack**
|
|
144
|
+
- 不要在打开前后分散写逻辑
|
|
145
|
+
- 统一由 billClosedCallBack 处理返回
|
|
146
|
+
|
|
147
|
+
## 常见坑位
|
|
148
|
+
|
|
149
|
+
### ❌ 在 beforeCreateListDataProvider 修改基础资料引用属性
|
|
150
|
+
```java
|
|
151
|
+
// 错误:破坏缓存
|
|
152
|
+
@Override
|
|
153
|
+
public void beforeCreateListDataProvider(BeforeCreateListDataProviderArgs args) {
|
|
154
|
+
// 不要修改基础资料字段(如 orgname、deptname)
|
|
155
|
+
args.getQueryStatement().getSelectItems().add("org.name"); // 错误!
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// 正确:只修改非基础资料字段
|
|
159
|
+
args.getQueryStatement().getSelectItems().add("customfield");
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### ❌ beforeItemClick 与 itemClick 逻辑混用
|
|
163
|
+
```java
|
|
164
|
+
// 错误:重复执行
|
|
165
|
+
@Override
|
|
166
|
+
public void beforeItemClick(ItemClickEvent e) {
|
|
167
|
+
// 在此修改单据状态
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
@Override
|
|
171
|
+
public void itemClick(ItemClickEvent e) {
|
|
172
|
+
// 在此又修改了同样的状态 → 重复!
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// 正确:职责分离
|
|
176
|
+
beforeItemClick → 检查权限、校验
|
|
177
|
+
itemClick → 执行操作
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### ❌ 逐行处理链路中循环查库
|
|
181
|
+
```java
|
|
182
|
+
// 错误:性能灾难
|
|
183
|
+
for (每一行) {
|
|
184
|
+
queryDatabase(); // ❌ 10000 行数据 = 10000 次查询
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// 正确:提前准备数据
|
|
188
|
+
@Override
|
|
189
|
+
public void beforeCreateListDataProvider(...) {
|
|
190
|
+
// 一次查询获取所有需要的数据
|
|
191
|
+
Map<String, Object> dataCache = queryAllDataOnce();
|
|
192
|
+
// 后续逐行逻辑直接从缓存取值
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### ❌ filterContainerSearchClick 中添加过滤后忘记调用 super
|
|
197
|
+
```java
|
|
198
|
+
// 错误
|
|
199
|
+
@Override
|
|
200
|
+
public void filterContainerSearchClick(FilterContainerSearchClickArgs args) {
|
|
201
|
+
args.addFilter(...);
|
|
202
|
+
// 忘记调用 super.filterContainerSearchClick(args);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// 正确
|
|
206
|
+
@Override
|
|
207
|
+
public void filterContainerSearchClick(FilterContainerSearchClickArgs args) {
|
|
208
|
+
args.addFilter(...);
|
|
209
|
+
super.filterContainerSearchClick(args); // 必须调用
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### ❌ listRowClick 中修改列表数据
|
|
214
|
+
- 行点击时不要直接修改数据源
|
|
215
|
+
- 应该打开编辑界面或触发操作,而非在列表里直接改
|
|
216
|
+
|
|
217
|
+
### ❌ 超链接点击不处理异常
|
|
218
|
+
```java
|
|
219
|
+
@Override
|
|
220
|
+
public void billListHyperLinkClick(HyperLinkClickEvent e) {
|
|
221
|
+
try {
|
|
222
|
+
// 跳转或打开
|
|
223
|
+
} catch (Exception ex) {
|
|
224
|
+
// 必须捕获,否则列表可能崩溃
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
```
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# 开放平台自定义 API(注解模式)
|
|
2
|
+
|
|
3
|
+
## TL;DR
|
|
4
|
+
- 适用:注解模式自定义 OpenAPI 控制器,不再走旧版 `IBillWebApiPlugin`。
|
|
5
|
+
- 先抓:`@ApiController`、`@ApiMapping`、方法路由与参数/返回注解。
|
|
6
|
+
- 跳转:普通后台服务或插件不是本页;这里解决的是 HTTP 接口声明。
|
|
7
|
+
- 继续读全文:当你要确认路径规则、异常返回、旧版差异或完整示例时。
|
|
8
|
+
|
|
9
|
+
## 概述
|
|
10
|
+
新版本自定义 API 已切换为注解驱动模式,不再使用旧版 `IBillWebApiPlugin` 接口扩展方式。
|
|
11
|
+
|
|
12
|
+
> **适用边界**
|
|
13
|
+
> ✅ 本文档直接使用:OpenAPI 控制器无封装层,注解模式直接参考本文档。
|
|
14
|
+
|
|
15
|
+
- 推荐模式:`@ApiController` + `@ApiMapping` + `@ApiGetMapping/@ApiPostMapping`
|
|
16
|
+
- 适用版本:文档基于 Cosmic V8.0.1(更新时间 2026-01)
|
|
17
|
+
- 注解包:`kd.bos.openapi.common.custom.annotation`
|
|
18
|
+
|
|
19
|
+
## 核心基类
|
|
20
|
+
该模式不是“继承插件基类”,而是“声明式控制器”。
|
|
21
|
+
|
|
22
|
+
### 1) 类级注解
|
|
23
|
+
- `@ApiController(value = "应用编码", desc = "描述")`
|
|
24
|
+
- `value` 必填:应用编码(如 `bos`、`open`)
|
|
25
|
+
- `@ApiMapping("/前缀")`
|
|
26
|
+
- 可选:类级路由前缀
|
|
27
|
+
|
|
28
|
+
### 2) 方法级注解
|
|
29
|
+
- `@ApiGetMapping("/path")`
|
|
30
|
+
- 适合基础类型参数场景
|
|
31
|
+
- `@ApiPostMapping("/path")`
|
|
32
|
+
- 适合复杂对象、Map、集合等
|
|
33
|
+
|
|
34
|
+
### 3) 参数与返回注解
|
|
35
|
+
- `@ApiParam`:参数说明/必填/示例
|
|
36
|
+
- `@ApiRequestBody`:POST 且单参数 Model 场景(请求体直解)
|
|
37
|
+
- `@ApiResponseBody`:返回值说明(标在 `CustomApiResult<T>` 的 `T` 上)
|
|
38
|
+
- `@ApiModel`:Model 标识
|
|
39
|
+
|
|
40
|
+
## 核心事件
|
|
41
|
+
|
|
42
|
+
注解模式没有传统插件回调接口,核心触发点是路由命中后的方法执行:
|
|
43
|
+
|
|
44
|
+
- `@ApiGetMapping`:// GET 路由命中后执行方法,适合基础类型参数查询
|
|
45
|
+
- `@ApiPostMapping`:// POST 路由命中后执行方法,适合复杂对象/集合/Map 入参
|
|
46
|
+
- `@ApiParam`:// 参数描述与必填约束(可配 `required/example`)
|
|
47
|
+
- `@ApiRequestBody`:// POST 单参数模型的请求体映射
|
|
48
|
+
- `@ApiResponseBody`:// 返回泛型描述,增强 API 文档可读性
|
|
49
|
+
|
|
50
|
+
## 常用 API/注解写法
|
|
51
|
+
|
|
52
|
+
```java
|
|
53
|
+
@ApiController(value = "open", desc = "用户API")
|
|
54
|
+
@ApiMapping("/user")
|
|
55
|
+
public class UserController implements java.io.Serializable {
|
|
56
|
+
|
|
57
|
+
@ApiGetMapping("/get")
|
|
58
|
+
public CustomApiResult<String> getUserNameById(
|
|
59
|
+
@ApiParam(value = "用户ID", required = true) Long id
|
|
60
|
+
) {
|
|
61
|
+
// ...
|
|
62
|
+
return CustomApiResult.success("Tom");
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@ApiPostMapping("/save")
|
|
66
|
+
public CustomApiResult<@ApiResponseBody("true-成功,false-失败") Boolean> saveUser(
|
|
67
|
+
@ApiParam(value = "用户数据", required = true) @jakarta.validation.Valid UserModel user
|
|
68
|
+
) {
|
|
69
|
+
// ...
|
|
70
|
+
return CustomApiResult.success(Boolean.TRUE);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 示例代码
|
|
76
|
+
|
|
77
|
+
示例代码统一维护在模板文件中,直接参考:
|
|
78
|
+
|
|
79
|
+
- [OpenApiControllerTemplate.java](../../../assets/OpenApiControllerTemplate.java)
|
|
80
|
+
|
|
81
|
+
## 请求路径规则
|
|
82
|
+
|
|
83
|
+
自定义 API 请求地址:
|
|
84
|
+
|
|
85
|
+
`/v2/{ISV}/{appId}/{api_number}`
|
|
86
|
+
|
|
87
|
+
其中:
|
|
88
|
+
- `{api_number}` = 类级 `@ApiMapping` + 方法级 `@ApiPostMapping/@ApiGetMapping`
|
|
89
|
+
- 当开发商标识为 `kingdee` 时,`{ISV}` 在某些场景可不显示(以平台实际网关配置为准)
|
|
90
|
+
|
|
91
|
+
## 实践建议
|
|
92
|
+
|
|
93
|
+
1. 类级统一加 `@ApiMapping`,方法只写尾路径,便于维护。
|
|
94
|
+
2. 参数必填优先用 `@ApiParam(required = true)` + JSR 校验注解(`@NotNull`、`@Min`)。
|
|
95
|
+
3. 复杂入参优先 Model(`@ApiModel`),避免散装 `Map` 带来的类型风险。
|
|
96
|
+
4. 返回值统一 `CustomApiResult<T>`,并补 `@ApiResponseBody` 说明。
|
|
97
|
+
5. GET 仅用于基础类型参数查询;复杂对象统一 POST。
|
|
98
|
+
|
|
99
|
+
## 常见坑位
|
|
100
|
+
|
|
101
|
+
- 继续按旧版 `IBillWebApiPlugin` 写法开发,导致新版本无法按预期发布/治理。
|
|
102
|
+
- 同一方法同时使用 `@ApiParam` 与 `@ApiRequestBody` 造成入参解析歧义。
|
|
103
|
+
- 忘记 `implements Serializable`(控制器/模型)导致序列化与工具链问题。
|
|
104
|
+
- Model 字段未标 `@ApiParam`,文档与参数解析表现不完整。
|
|
105
|
+
- 返回非 `CustomApiResult<T>`,导致平台响应规范与错误码治理失效。
|
|
106
|
+
|
|
107
|
+
## 与旧版模式对照
|
|
108
|
+
|
|
109
|
+
- 旧版:`IBillWebApiPlugin#doCustomService(...)` 接口回调
|
|
110
|
+
- 新版:`@ApiController` 注解声明式控制器
|
|
111
|
+
|
|
112
|
+
结论:新项目与迁移改造均应优先采用注解模式。
|