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.
Files changed (219) hide show
  1. package/README.md +358 -0
  2. package/dist/cli/kcode.d.ts +15 -0
  3. package/dist/cli/kcode.js +153 -0
  4. package/dist/cli/main.d.ts +2 -0
  5. package/dist/cli/main.js +7 -0
  6. package/docs/KCODE_DISTRIBUTION.md +91 -0
  7. package/extensions/kingdee-harness.ts +180 -0
  8. package/extensions/kingdee-header.ts +122 -0
  9. package/extensions/kingdee-tools.ts +379 -0
  10. package/knowledge/.backup/v1.0.0/version.json +10 -0
  11. package/knowledge/cangqiong/product-notes.md +15 -0
  12. package/knowledge/common/business-flows.md +115 -0
  13. package/knowledge/common/config-guides.md +110 -0
  14. package/knowledge/common/error-patterns.md +170 -0
  15. package/knowledge/common/implementation.md +144 -0
  16. package/knowledge/cosmic/hard-constraints.md +38 -0
  17. package/knowledge/cosmic/ksql-datafix.md +34 -0
  18. package/knowledge/cosmic/platform-baseline.md +32 -0
  19. package/knowledge/cosmic/plugin-decision-matrix.md +40 -0
  20. package/knowledge/cosmic/review-checklist.md +40 -0
  21. package/knowledge/cosmic/unittest.md +35 -0
  22. package/knowledge/enterprise/api-reference.md +186 -0
  23. package/knowledge/enterprise/code-patterns.md +217 -0
  24. package/knowledge/enterprise/plugin-lifecycle.md +188 -0
  25. package/knowledge/enterprise/tables.json +159 -0
  26. package/knowledge/flagship/api-reference.md +237 -0
  27. package/knowledge/flagship/code-patterns.md +246 -0
  28. package/knowledge/flagship/cosmic-platform-note.md +15 -0
  29. package/knowledge/flagship/plugin-lifecycle.md +248 -0
  30. package/knowledge/flagship/tables.json +159 -0
  31. package/knowledge/version.json +10 -0
  32. package/knowledge/xinghan/product-notes.md +15 -0
  33. package/package.json +71 -0
  34. package/prompts/kd-discuss.md +11 -0
  35. package/prompts/kd-execute.md +12 -0
  36. package/prompts/kd-plan.md +12 -0
  37. package/prompts/kd-ship.md +12 -0
  38. package/prompts/kd-spec.md +12 -0
  39. package/prompts/kd-verify.md +12 -0
  40. package/skills/kd-check/SKILL.md +26 -0
  41. package/skills/kd-cosmic-dev/SKILL.md +82 -0
  42. package/skills/kd-cosmic-review/SKILL.md +90 -0
  43. package/skills/kd-cosmic-unittest/SKILL.md +92 -0
  44. package/skills/kd-debug/SKILL.md +30 -0
  45. package/skills/kd-discuss/SKILL.md +24 -0
  46. package/skills/kd-execute/SKILL.md +22 -0
  47. package/skills/kd-gen/SKILL.md +34 -0
  48. package/skills/kd-ksql/SKILL.md +86 -0
  49. package/skills/kd-plan/SKILL.md +24 -0
  50. package/skills/kd-ship/SKILL.md +22 -0
  51. package/skills/kd-spec/SKILL.md +24 -0
  52. package/skills/kd-verify/SKILL.md +22 -0
  53. package/themes/kcode-dark.json +81 -0
  54. package/vendor/kingdee-skills/cosmic-unittest/SKILL.md +788 -0
  55. package/vendor/kingdee-skills/cosmic-unittest/author-cache.json +5 -0
  56. package/vendor/kingdee-skills/cosmic-unittest/cosmic-unittest-skill-overview.html +746 -0
  57. package/vendor/kingdee-skills/cosmic-unittest/examples/business-test.md +205 -0
  58. package/vendor/kingdee-skills/cosmic-unittest/examples/common-test.md +257 -0
  59. package/vendor/kingdee-skills/cosmic-unittest/examples/formplugin-test.md +560 -0
  60. package/vendor/kingdee-skills/cosmic-unittest/examples/op-plugin-test.md +231 -0
  61. package/vendor/kingdee-skills/cosmic-unittest/examples/validator-test.md +232 -0
  62. package/vendor/kingdee-skills/cosmic-unittest/patterns/business-helper.md +184 -0
  63. package/vendor/kingdee-skills/cosmic-unittest/patterns/common-module.md +355 -0
  64. package/vendor/kingdee-skills/cosmic-unittest/patterns/convert-plugin.md +130 -0
  65. package/vendor/kingdee-skills/cosmic-unittest/patterns/formplugin.md +235 -0
  66. package/vendor/kingdee-skills/cosmic-unittest/patterns/op-plugin.md +226 -0
  67. package/vendor/kingdee-skills/cosmic-unittest/patterns/validator.md +206 -0
  68. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/SKILL.md +674 -0
  69. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/advanced-scenario-checklist.md +307 -0
  70. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/algox-performance-checklist.md +129 -0
  71. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/coding-standard-checklist.md +491 -0
  72. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/cosmic-api-checklist.md +285 -0
  73. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/data-access-checklist.md +261 -0
  74. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/data-transaction-checklist.md +390 -0
  75. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/domain-logic-checklist.md +295 -0
  76. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/form-plugin-checklist.md +508 -0
  77. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/infra-checklist.md +254 -0
  78. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/ksql-checklist.md +305 -0
  79. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/lifecycle-checklist.md +298 -0
  80. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/operation-plugin-checklist.md +442 -0
  81. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/test-mock-checklist.md +120 -0
  82. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/references/ui-performance-checklist.md +320 -0
  83. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/scripts/pattern-matcher.py +336 -0
  84. package/vendor/kingdee-skills/kingdee-cosmic-reviewer/scripts/review-score-calculator.py +121 -0
  85. package/vendor/kingdee-skills/ok-cosmic/CHANGELOG.md +295 -0
  86. package/vendor/kingdee-skills/ok-cosmic/README.md +460 -0
  87. package/vendor/kingdee-skills/ok-cosmic/SKILL.md +287 -0
  88. package/vendor/kingdee-skills/ok-cosmic/agents/openai.yaml +17 -0
  89. package/vendor/kingdee-skills/ok-cosmic/assets/BatchImportPluginTemplate.java +93 -0
  90. package/vendor/kingdee-skills/ok-cosmic/assets/BillPlugInTemplate.java +156 -0
  91. package/vendor/kingdee-skills/ok-cosmic/assets/ConvertPlugInTemplate.java +255 -0
  92. package/vendor/kingdee-skills/ok-cosmic/assets/FormPluginTemplate.java +597 -0
  93. package/vendor/kingdee-skills/ok-cosmic/assets/IWorkflowPluginTemplate.java +91 -0
  94. package/vendor/kingdee-skills/ok-cosmic/assets/ListPluginTemplate.java +194 -0
  95. package/vendor/kingdee-skills/ok-cosmic/assets/OpPluginTemplate.java +201 -0
  96. package/vendor/kingdee-skills/ok-cosmic/assets/OpenApiControllerTemplate.java +103 -0
  97. package/vendor/kingdee-skills/ok-cosmic/assets/PrintPluginTemplate.java +95 -0
  98. package/vendor/kingdee-skills/ok-cosmic/assets/ReportFormPluginTemplate.java +257 -0
  99. package/vendor/kingdee-skills/ok-cosmic/assets/ReportListDataPluginTemplate.java +70 -0
  100. package/vendor/kingdee-skills/ok-cosmic/assets/StandardTreeListPluginTemplate.java +130 -0
  101. package/vendor/kingdee-skills/ok-cosmic/assets/TaskTemplate.java +80 -0
  102. package/vendor/kingdee-skills/ok-cosmic/assets/TreeListPluginTemplate.java +152 -0
  103. package/vendor/kingdee-skills/ok-cosmic/assets/WriteBackPlugInTemplate.java +286 -0
  104. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/attachment/AttachmentUploadBindSample.java +93 -0
  105. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/botp/BotpTracePushSample.java +168 -0
  106. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/botp/SampleConvertPlugin.java +223 -0
  107. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/cache/SampleCacheUsage.java +218 -0
  108. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/concurrent/SampleThreadPoolBatch.java +156 -0
  109. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/data/DynamicObjectCrudSample.java +205 -0
  110. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/data/DynamicObjectOpsSample.java +100 -0
  111. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/BeforeOperationConfirmSample.java +217 -0
  112. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ConfirmDialogSample.java +131 -0
  113. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/EntryRowCalculateSample.java +116 -0
  114. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/F7FilterSample.java +134 -0
  115. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/GetAndSetValueSample.java +176 -0
  116. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/HyperlinkJumpSample.java +124 -0
  117. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/OpenBillModalSample.java +253 -0
  118. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ReturnParentDataSample.java +295 -0
  119. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/TreeControlSample.java +140 -0
  120. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/form/ViewControlOpsSample.java +132 -0
  121. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/list/ListPluginBasicSample.java +170 -0
  122. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/list/ListPreOpenFilterSample.java +68 -0
  123. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/message/MessageNotifySample.java +95 -0
  124. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/mq/SampleMQConsumer.java +198 -0
  125. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/mq/sample_mq.xml +15 -0
  126. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/operation/OpAddValidatorsSample.java +137 -0
  127. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/operation/OperationOptionBridgeSample.java +228 -0
  128. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/package-info.java +19 -0
  129. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/BaseDataQuerySample.java +194 -0
  130. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/BatchQuerySample.java +368 -0
  131. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/query/DataSetQueryStatSample.java +131 -0
  132. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/report/SampleReportFormPlugin.java +179 -0
  133. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/report/SampleReportListDataPlugin.java +616 -0
  134. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/snippets-guide.md +64 -0
  135. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/task/ScheduleTaskSample.java +160 -0
  136. package/vendor/kingdee-skills/ok-cosmic/assets/snippets/workflow/SampleWorkflowPlugin.java +302 -0
  137. package/vendor/kingdee-skills/ok-cosmic/manifest.json +78 -0
  138. package/vendor/kingdee-skills/ok-cosmic/ok-cosmic-intro.html +903 -0
  139. package/vendor/kingdee-skills/ok-cosmic/references/adv/attachment-api.md +114 -0
  140. package/vendor/kingdee-skills/ok-cosmic/references/adv/botp-convert.md +98 -0
  141. package/vendor/kingdee-skills/ok-cosmic/references/adv/dynamic-object.md +113 -0
  142. package/vendor/kingdee-skills/ok-cosmic/references/adv/entity-metadata.md +123 -0
  143. package/vendor/kingdee-skills/ok-cosmic/references/adv/event-lifecycle.md +184 -0
  144. package/vendor/kingdee-skills/ok-cosmic/references/adv/flex-prop.md +114 -0
  145. package/vendor/kingdee-skills/ok-cosmic/references/adv/form-utils.md +133 -0
  146. package/vendor/kingdee-skills/ok-cosmic/references/adv/operate-chain.md +159 -0
  147. package/vendor/kingdee-skills/ok-cosmic/references/adv/plugin-base.md +218 -0
  148. package/vendor/kingdee-skills/ok-cosmic/references/adv/query-dataset.md +149 -0
  149. package/vendor/kingdee-skills/ok-cosmic/references/adv/request-context.md +88 -0
  150. package/vendor/kingdee-skills/ok-cosmic/references/adv/view-handler.md +157 -0
  151. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-bill.md +76 -0
  152. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-botp.md +70 -0
  153. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-form.md +165 -0
  154. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-import.md +69 -0
  155. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-list.md +227 -0
  156. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-openapi.md +112 -0
  157. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-operation.md +135 -0
  158. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-print.md +65 -0
  159. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-report-data.md +64 -0
  160. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-report-form.md +90 -0
  161. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-task.md +62 -0
  162. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-tree-list.md +71 -0
  163. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-workflow.md +82 -0
  164. package/vendor/kingdee-skills/ok-cosmic/references/base/plugin/plugin-writeback.md +71 -0
  165. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-algo.md +67 -0
  166. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-cache.md +63 -0
  167. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-dynamic-model-svc.md +82 -0
  168. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-dynamic-object.md +70 -0
  169. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-entity-model.md +61 -0
  170. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-exception.md +64 -0
  171. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-file.md +63 -0
  172. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-id.md +47 -0
  173. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-lock.md +61 -0
  174. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-log.md +63 -0
  175. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-network-control.md +70 -0
  176. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-orm-access.md +78 -0
  177. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-request-context.md +62 -0
  178. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-threadpool.md +63 -0
  179. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-tx.md +64 -0
  180. package/vendor/kingdee-skills/ok-cosmic/references/base/sdk/sdk-utils.md +67 -0
  181. package/vendor/kingdee-skills/ok-cosmic/requirements.txt +2 -0
  182. package/vendor/kingdee-skills/ok-cosmic/rules/a-layer-rules.json +24 -0
  183. package/vendor/kingdee-skills/ok-cosmic/rules/anti-patterns.md +48 -0
  184. package/vendor/kingdee-skills/ok-cosmic/rules/cheat-sheet.md +256 -0
  185. package/vendor/kingdee-skills/ok-cosmic/rules/coding-preferences.md +140 -0
  186. package/vendor/kingdee-skills/ok-cosmic/rules/constraints.md +61 -0
  187. package/vendor/kingdee-skills/ok-cosmic/rules/decision-matrix.md +222 -0
  188. package/vendor/kingdee-skills/ok-cosmic/rules/intent-routing.md +94 -0
  189. package/vendor/kingdee-skills/ok-cosmic/rules/platform-baseline.md +69 -0
  190. package/vendor/kingdee-skills/ok-cosmic/rules/post-check.md +109 -0
  191. package/vendor/kingdee-skills/ok-cosmic/scripts/config_loader.py +204 -0
  192. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-api-knowledge.py +910 -0
  193. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-basedata-query.py +359 -0
  194. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-config-check.py +181 -0
  195. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-extpoints-query.py +389 -0
  196. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-form-metadata.py +856 -0
  197. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-post-check.py +262 -0
  198. package/vendor/kingdee-skills/ok-cosmic/scripts/cosmic-post-lint.py +293 -0
  199. package/vendor/kingdee-skills/ok-cosmic/scripts/lint/__init__.py +2 -0
  200. package/vendor/kingdee-skills/ok-cosmic/scripts/lint/base.py +393 -0
  201. package/vendor/kingdee-skills/ok-cosmic/scripts/lint/resource_check.py +176 -0
  202. package/vendor/kingdee-skills/ok-cosmic/scripts/lint/scene_check.py +375 -0
  203. package/vendor/kingdee-skills/ok-cosmic/scripts/lint/style_check.py +434 -0
  204. package/vendor/kingdee-skills/ok-cosmic/scripts/lint/verify_check.py +36 -0
  205. package/vendor/kingdee-skills/ok-cosmic/scripts/route_client.py +186 -0
  206. package/vendor/kingdee-skills/ok-cosmic/scripts/script_utils.py +40 -0
  207. package/vendor/kingdee-skills/ok-cosmic/scripts/sqlite_cache.py +142 -0
  208. package/vendor/kingdee-skills/ok-cosmic/setup/cuslib/kd-cd-cosmic-commons.jar +0 -0
  209. package/vendor/kingdee-skills/ok-cosmic/setup/cuslib/kd-cd-cosmic-features.jar +0 -0
  210. package/vendor/kingdee-skills/ok-cosmic/setup/ok-cosmic-docs.db +0 -0
  211. package/vendor/kingdee-skills/ok-cosmic/setup/ok-cosmic.json +13 -0
  212. package/vendor/kingdee-skills/ok-cosmic/setup/setup-mac.sh +18 -0
  213. package/vendor/kingdee-skills/ok-cosmic/setup/setup-windows.bat +53 -0
  214. package/vendor/kingdee-skills/ok-cosmic/setup/setup.jar +0 -0
  215. package/vendor/kingdee-skills/ok-ksql/SKILL.md +81 -0
  216. package/vendor/kingdee-skills/ok-ksql/agents/openai.yaml +7 -0
  217. package/vendor/kingdee-skills/ok-ksql/manifest.json +14 -0
  218. package/vendor/kingdee-skills/ok-ksql/references/ksql-datafix.md +452 -0
  219. package/vendor/kingdee-skills/ok-ksql/scripts/ksql_lint.py +363 -0
@@ -0,0 +1,135 @@
1
+ # 单据操作插件
2
+
3
+ ## TL;DR
4
+ - 适用:服务端事务内的单据操作插件,用于校验、状态转换和级联同步。
5
+ - 先抓:`AbstractOperationServicePlugIn` 的事件顺序,先分清事务前、事务中和事务后。
6
+ - 跳转:若 `AbstractOperationServicePlugInExt` 足够,优先回 `adv/plugin-base.md`;纯 UI 联动别读本页。
7
+ - 继续读全文:当你要确认 `onPreparePropertys`、回滚边界、预置操作清单或常见误用时。
8
+
9
+ ## 概述
10
+ 单据操作插件用于在单据操作(保存、提交、审核、删除等)的事务内进行业务逻辑干预。与UI插件不同,操作插件运行在服务端,有数据库事务保护,用于实现关键业务逻辑。
11
+
12
+ > **适用边界**
13
+ > ✅ 本文档是原生兜底:当 `plugin-base.md`(封装层) 未覆盖你需要的操作事件时使用。
14
+ > ❌ 如果封装层 `AbstractOperationServicePlugInExt` 已满足需求,优先读 `references/adv/plugin-base.md`。
15
+
16
+ - 适用场景:单据操作的权限校验、数据校验、状态转换、级联数据同步
17
+ - 执行环境:**服务端事务内**(不同于UI插件)
18
+
19
+ ## 核心基类
20
+ - 基类:`kd.bos.entity.plugin.AbstractOperationServicePlugIn`
21
+ - 继承关系:`AbstractOperationServicePlugIn implements IOperationServicePlugIn, IOperationService`
22
+ - 执行位置:**服务端事务内**(不是客户端)
23
+
24
+ ## 核心事件(时间顺序)
25
+
26
+ - `onPreparePropertys(PreparePropertysEventArgs e)`:// 加载单据数据包前触发;用于补齐操作所需字段,避免后续取值为空
27
+ - `onAddValidators(AddValidatorsEventArgs e)`:// 校验器加载完毕后、执行校验前触发;用于增删校验器
28
+ - `beforeExecuteOperationTransaction(BeforeOperationArgs e)`:// 校验通过后、开启事务前触发;用于最后整理数据
29
+ - `beginOperationTransaction(BeginOperationTransactionArgs e)`:// 事务开启后、数据库提交前触发;用于事务内同步处理
30
+ - `endOperationTransaction(EndOperationTransactionArgs e)`:// 数据写库后、事务提交前触发;用于事务内后置处理
31
+ - `rollbackOperation(RollbackOperationArgs e)`:// 事务提交失败回滚后触发;用于无事务资源补偿
32
+ - `afterExecuteOperationTransaction(AfterOperationArgs e)`:// 事务提交后触发;用于消息通知、日志等后续处理
33
+
34
+ ## 插件内上下文方法
35
+
36
+ ```java
37
+ // 获取操作上下文
38
+ BillEntityType billType = this.billEntityType; // 单据主实体
39
+ OperateMeta operateMeta = this.operateMeta; // 操作信息
40
+ OperationResult result = this.operationResult; // 操作结果
41
+
42
+ // 获取自定义参数
43
+ Map<String, Object> options = this.getOption();
44
+ String customParam = (String) options.get("paramKey");
45
+
46
+ // 添加错误信息
47
+ result.addErrorMessage("错误提示文本");
48
+
49
+ // 添加成功提示
50
+ result.addSuccessMessage("操作成功");
51
+
52
+ // 设置操作状态
53
+ result.setSuccess(false); // 标记操作失败
54
+ ```
55
+
56
+ ## 示例代码
57
+
58
+ 示例代码统一维护在模板文件中,直接参考:
59
+
60
+ - [OpPluginTemplate.java](../../../assets/OpPluginTemplate.java)
61
+
62
+ ## 实践建议
63
+
64
+ 1. **必须理解状态转换逻辑**
65
+ - 单据状态有固定转换路径,不是任意转换
66
+ - 同一操作绑定多个插件时避免重复状态转换
67
+
68
+ 2. **onPreparePropertys中不要漏字段**
69
+ - 若操作依赖某字段,必须在此添加
70
+ - 否则系统加载的数据包会缺失此字段
71
+
72
+ 3. **规则校验优先放onAddValidators,事务前事件只做最后整理**
73
+ - 明确的业务规则优先注册校验器,失败会在事务开启前阻断
74
+ - `beforeExecuteOperationTransaction` 更适合最后整理数据、轻量兜底校验与整体取消
75
+
76
+ 4. **数据修改放beginOperationTransaction/endOperationTransaction**
77
+ - 这两个事件都在事务内,异常会自动回滚
78
+ - 数据库操作在此区间是安全的
79
+
80
+ 5. **级联数据同步放afterExecuteOperationTransaction**
81
+ - 此时事务已提交,可放心调用其他服务
82
+ - 但要做好异常处理,不要中断主逻辑
83
+
84
+ ## 常见坑位
85
+
86
+ ### ❌ 把所有校验都堆进beforeExecuteOperationTransaction
87
+ - 这样会弱化校验器机制,后续复用和错误定位都更差
88
+ - 明确规则优先放 `onAddValidators`,事务前事件只保留少量兜底检查
89
+
90
+ ### ❌ endOperationTransaction后想回滚
91
+ - endOperationTransaction时数据已入库
92
+ - 无法再回滚,只能在beforeExecuteOperationTransaction做校验
93
+
94
+ ### ❌ 多个操作绑定同一状态转换
95
+ ```java
96
+ // 错误:一级审批和会审都在同意时调用审核通过操作
97
+ // 导致单据从"已提交"试图再转为"已审核"->失败
98
+
99
+ // 正确:应在工作流配置中区分不同路径,操作插件不重复
100
+ ```
101
+
102
+ ### ❌ 在afterExecuteOperationTransaction里修改单据
103
+ - 此时事务已提交,修改会立即生效
104
+ - 应在beforeExecuteOperationTransaction或事务内完成修改
105
+
106
+ ### ❌ 忽视onPreparePropertys导致字段缺失
107
+ ```java
108
+ // 如果操作插件要读某字段但没在onPreparePropertys添加
109
+ // 系统加载的数据包就不含此字段,导致getValue返回null
110
+ ```
111
+
112
+ ### ❌ 在操作插件里查询与操作无关的数据
113
+ - 操作插件应只关注当前操作的单据数据
114
+ - 复杂查询逻辑优先写在服务层
115
+
116
+ ## 预置操作清单
117
+
118
+ 系统预置的可绑定操作(其他操作不支持操作插件):
119
+
120
+ | 操作 | 功能 |
121
+ |------|------|
122
+ | save | 保存单据到数据库 |
123
+ | saveandnew | 保存后清空界面进入新增 |
124
+ | statusconvert | 切换单据状态 |
125
+ | submit | 提交单据(状态→已提交) |
126
+ | submitandnew | 提交后新增 |
127
+ | unsubmit | 撤销提交(回到暂存) |
128
+ | audit | 审核(状态→已审核) |
129
+ | unaudit | 反审核(状态→暂存) |
130
+ | disable | 禁用 |
131
+ | enable | 启用 |
132
+ | invalid | 作废 |
133
+ | valid | 生效 |
134
+ | delete | 删除 |
135
+ | donothing | 空操作(用于触发事件流程) |
@@ -0,0 +1,65 @@
1
+ # 打印插件
2
+
3
+ ## TL;DR
4
+ - 适用:打印数据加载、自定义数据源和打印前后加工。
5
+ - 先抓:`AbstractPrintPlugin` 以及 `beforeLoadData` / `loadCustomData` 两类核心入口。
6
+ - 跳转:报表展示不是本页;文件和附件处理也不是本页。
7
+ - 继续读全文:当你要确认打印上下文、扩展点或自定义数据源示例时。
8
+
9
+ ## 概述
10
+ 打印插件用于控制打印数据加载、控件输出前后加工以及自定义数据源取数。
11
+
12
+ > **适用边界**
13
+ > ✅ 本文档直接使用:打印插件无封装层,直接参考本文档。
14
+
15
+ ## 核心基类
16
+ - 基类:`kd.bos.print.core.plugin.AbstractPrintPlugin`
17
+ - 继承关系:`AbstractPrintPlugin implements IPrintPlugin`
18
+
19
+ ## 核心事件
20
+
21
+ - `beforeLoadData(BeforeLoadDataEvent evt)`:打印数据加载前触发,可取消默认取数。
22
+ - `loadCustomData(CustomDataLoadEvent evt)`:自定义数据源加载数据时触发。
23
+ - `beforeOutputWidget(BeforeOutputWidgetEvent evt)`:控件输出前触发。
24
+ - `afterOutputWidget(AfterOutputWidgetEvent evt)`:控件输出后触发。
25
+
26
+ ## 插件内上下文方法
27
+
28
+ 以下更适合作为打印插件内主动访问的上下文能力:
29
+
30
+ - `getMainDataVisitor()`
31
+ - `getDataVisitor(String dataSource)`
32
+ - `getPrintSetting()`
33
+ - `getExtParam()`
34
+ - `getTplInfo()`
35
+ - `isPreview()`
36
+
37
+ ```java
38
+ Map extParam = this.getExtParam();
39
+ Object tplInfo = this.getTplInfo();
40
+ boolean preview = this.isPreview();
41
+ ```
42
+
43
+ ## 其他扩展点
44
+
45
+ - `parseRichImg(...)`:富文本图片解析扩展。
46
+ - `setExtParam(...)` 等 getter/setter:上下文读写接口,不建议写成事件说明。
47
+
48
+ ## 示例代码
49
+
50
+ 示例代码统一维护在模板文件中,直接参考:
51
+
52
+ - [PrintPluginTemplate.java](../../../assets/PrintPluginTemplate.java)
53
+
54
+ ## 实践建议
55
+
56
+ 1. 取消默认取数后,要在 `loadCustomData(...)` 中补回数据。
57
+ 2. 输出前后事件更适合做格式化和控件值调整,不要承载重型查询。
58
+ 3. 上下文 getter/setter 保持在模板提示里即可,不必按事件去展开。
59
+ 4. 自定义数据源场景优先让模板和数据源标识一一对应。
60
+
61
+ ## 常见坑位
62
+
63
+ - 把 `getExtParam()`、`getPrintSetting()` 这类上下文访问方法写成事件。
64
+ - 取消了默认取数却没有补自定义数据,导致打印空白。
65
+ - 在输出前后事件里执行过重逻辑,拖慢打印性能。
@@ -0,0 +1,64 @@
1
+ # 报表取数插件
2
+
3
+ ## TL;DR
4
+ - 适用:报表取数插件,接管查询、动态列和 `DataSet` 返回。
5
+ - 先抓:`AbstractReportListDataPlugin` 的 `query`、列定义和树数据入口。
6
+ - 跳转:如果你改的是报表界面交互而不是数据源,去 `plugin-report-form.md`。
7
+ - 继续读全文:当你要写复杂取数、左树右表报表或自定义列定义时。
8
+
9
+ ## 概述
10
+ 报表取数插件用于接管报表列表的数据查询与列定义,适合复杂查询、自定义数据源、左树右表联动和动态列场景。
11
+
12
+ > **适用边界**
13
+ > ✅ 本文档直接使用:报表取数插件无封装层,直接参考本文档。
14
+
15
+ ## 核心基类
16
+
17
+
18
+ - 基类:`kd.bos.entity.report.AbstractReportListDataPlugin`
19
+
20
+ ## 核心事件
21
+
22
+ - `query(ReportQueryParam queryParam, Object selectedObj)`:报表查询入口,返回 `DataSet`。
23
+ - `getColumns(List<AbstractReportColumn> columns)`:调整显示列定义,控制隐藏、顺序、宽度、冻结等属性。
24
+
25
+ ## 插件内上下文方法
26
+
27
+ 以下方法属于查询过程中的上下文访问能力,不建议当成“自动触发事件”处理:
28
+
29
+ - `getQueryParam()`:获取当前报表查询参数。
30
+ - `getSelectedObj()`:获取左树或左表当前选中对象。
31
+ - `setProgress(int)`:异步查询时回传进度。
32
+
33
+ ```java
34
+ ReportQueryParam qp = this.getQueryParam();
35
+ Object selected = this.getSelectedObj();
36
+ this.setProgress(30);
37
+ ```
38
+
39
+ ## 其他扩展点
40
+
41
+ - `export(...)`:导出时复用或覆盖查询结果。
42
+ - `exportWithSheet(...)`:多 sheet 导出扩展。
43
+ - `queryBatchBy(...)`:分批查询扩展。
44
+ - `getDynamicColumns(...)`:动态列构造扩展。
45
+
46
+ ## 示例代码
47
+
48
+ 示例代码统一维护在模板文件中,直接参考:
49
+
50
+ - [ReportListDataPluginTemplate.java](../../../assets/ReportListDataPluginTemplate.java)
51
+
52
+ ## 实践建议
53
+
54
+ 1. `query` 只负责取数和必要聚合,格式化尽量放界面插件。
55
+ 2. 左树右表场景优先使用 `selectedObj` 限定范围。
56
+ 3. 大数据量异步查询时使用 `setProgress(int)` 反馈执行进度。
57
+ 4. 列控制集中放在 `getColumns`,不要在 `query` 混入列逻辑。
58
+
59
+ ## 常见坑位
60
+
61
+ - 把 `getQueryParam()`、`getSelectedObj()`、`setProgress(int)` 当成事件去写说明或示例。
62
+ - 忽略 `selectedObj`,导致左树右表点击节点后仍返回全量数据。
63
+ - `query` 返回空对象而不是合法 `DataSet`。
64
+ - 在 `query` 里逐行远程调用,导致报表超时。
@@ -0,0 +1,90 @@
1
+ # 报表界面插件
2
+
3
+ ## TL;DR
4
+ - 适用:报表界面插件,控制过滤容器、查询前后处理、导出与展示。
5
+ - 先抓:`AbstractReportFormPlugin` 的查询相关事件和过滤容器上下文。
6
+ - 跳转:如果你要自定义数据源而不是界面交互,去 `plugin-report-data.md`。
7
+ - 继续读全文:当你要改过滤器、导出、行数据加工或报表 F7 行为时。
8
+
9
+ ## 概述
10
+ 报表界面插件用于控制过滤容器、查询前后处理、行数据加工、导出行为与列展示。
11
+
12
+ > **适用边界**
13
+ > ✅ 本文档直接使用:报表界面插件无封装层,直接参考本文档。
14
+
15
+ 术语说明:文档中的 `F7` 指过滤容器里的基础资料/引用数据选择控件弹窗,不是键盘按键事件。
16
+
17
+ ## 核心基类
18
+ - 基类:`kd.bos.report.plugin.AbstractReportFormPlugin`
19
+ - 继承关系:`AbstractReportFormPlugin extends AbstractFormPlugin`
20
+
21
+ ## 核心事件
22
+
23
+ - `initDefaultQueryParam(...)`:设置默认查询参数。
24
+ - `filterContainerInit(...)`:初始化过滤容器。
25
+ - `filterContainerBeforeF7Select(...)`:过滤容器 F7(基础资料/引用数据选择控件)打开前拦截。
26
+ - `filterContainerSearchClick(...)`:点击过滤容器查询按钮时触发。
27
+ - `verifyQuery(...)`:查询前校验。
28
+ - `beforeQuery(...)`:执行查询前追加或修正查询条件。
29
+ - `afterQuery(...)`:查询完成后处理。
30
+ - `afterCreateColumn(...)`:列创建完成后调整列显示属性。
31
+ - `packageData(...)`:单元格数据打包时格式化前端显示值。
32
+ - `processRowData(...)`:行数据返回后、渲染前进行加工。
33
+ - `preProcessExportData(...)`:导出数据预处理。
34
+ - `setExcelName(...)`:设置导出文件名。
35
+ - `setSortAndFilter(...)`:设置列排序和列过滤能力。
36
+
37
+ ## 插件内上下文方法
38
+
39
+ 以下更适合作为界面插件中的上下文能力,不建议当成“自动触发事件”:
40
+
41
+ - `getView()`:获取报表视图。
42
+ - `getModel()`:获取报表数据模型。
43
+ - `getQueryParam()`:获取当前查询参数。
44
+ - `getControl("reportlistap")`:获取报表控件,返回 `Control` 基类或具体控件对象。
45
+
46
+ ```java
47
+ ReportList reportList = this.getControl("reportlistap");
48
+ ReportQueryParam qp = this.getQueryParam();
49
+ reportList.setSelectedAll(true);
50
+ ```
51
+
52
+ 说明:`this.getControl("reportlistap")` 的返回类型是 `<T extends kd.bos.form.control.Control>`,所有控件都继承自 `kd.bos.form.control.Control`,实际拿到的是具体控件对象,例如 `ReportList`、`BasedataEdit`、`EntryGrid` 等。
53
+
54
+ ## 其他扩展点
55
+
56
+ - `getComboItems(...)`
57
+ - `colHeadFilterClick(...)`
58
+ - `afterSetModelValue(...)`
59
+ - `loadOtherEntryFilter(...)`
60
+ - `resetColumns(...)`
61
+ - `resetDataCount()`
62
+ - `setCellStyleRules(...)`
63
+ - `setFloatButtomData(...)`
64
+ - `setMergeColums(...)`
65
+ - `setRowCellStyleEvent(...)`
66
+ - `setFlexProperty(...)`
67
+ - `setTreeReportList(...)`
68
+ - `setOtherEntryFilter(...)`
69
+
70
+ 这些方法更适合归为专项扩展点,而不是和核心查询事件并列。
71
+
72
+ ## 示例代码
73
+
74
+ 示例代码统一维护在模板文件中,直接参考:
75
+
76
+ - [ReportFormPluginTemplate.java](../../../assets/ReportFormPluginTemplate.java)
77
+
78
+ ## 实践建议
79
+
80
+ 1. 查询合法性校验统一放 `verifyQuery(...)`。
81
+ 2. 过滤容器初始化与默认参数初始化要配合使用。
82
+ 3. `processRowData(...)` 避免逐行查库,导出时会放大性能问题。
83
+ 4. 导出相关逻辑放在 `preProcessExportData(...)` 和 `setExcelName(...)`。
84
+
85
+ ## 常见坑位
86
+
87
+ - 把 `getView()`、`getQueryParam()` 这类上下文访问能力写成事件说明。
88
+ - 在 `packageData(...)` 中实现导出逻辑。
89
+ - `verifyQuery(...)` 不校验空条件导致全表扫描。
90
+ - 把大量专项扩展点和核心查询事件混在一起,模板难以聚焦。
@@ -0,0 +1,62 @@
1
+ # 后台任务插件
2
+
3
+ ## TL;DR
4
+ - 适用:后台调度任务、批处理、定时同步和夜间修复作业。
5
+ - 先抓:`AbstractTask` 的执行入口、任务参数和日志/异常边界。
6
+ - 跳转:在线请求里的异步处理优先看线程池和请求上下文,不一定需要任务插件。
7
+ - 继续读全文:当你要确认调度模板、上下文对象或失败处理方式时。
8
+
9
+ ## 概述
10
+ 后台任务插件用于调度作业中的异步任务执行,适合定时批处理、夜间同步、批量修复等场景。
11
+
12
+ > **适用边界**
13
+ > ✅ 本文档直接使用:后台任务插件无封装层,直接参考本文档。
14
+
15
+ ## 核心基类
16
+
17
+
18
+ - 基类:`kd.bos.schedule.executor.AbstractTask`
19
+ - 继承关系:`AbstractTask implements Task`
20
+
21
+ ## 核心事件
22
+
23
+ - `execute(RequestContext ctx, Map<String, Object> params)`:调度中心触发任务执行时进入,承载任务主逻辑。
24
+ - `stop()`:调度中心主动停止任务时触发,用于安全退出与资源释放。
25
+
26
+ ## 插件内上下文方法
27
+
28
+ 这些方法更适合作为任务代码里主动调用的上下文能力,不建议继续按“事件”理解:
29
+
30
+ - `feedbackProgress(...)`:回传进度信息。
31
+ - `feedbackCustomdata(...)`:回传自定义运行数据。
32
+ - `checkIsStop()`:主动检查是否已收到停止指令。
33
+ - `isStop()`:读取当前停止标记。
34
+ - `getMessageHandler()`:获取调度消息处理器。
35
+ - `setTaskId(String)` / `getTaskId()`:访问任务标识。
36
+ - `isSupportReSchedule()`:判断是否支持重新调度。
37
+
38
+ ```java
39
+ this.feedbackProgress(20, "开始执行", null);
40
+ this.checkIsStop();
41
+ this.feedbackCustomdata(java.util.Collections.singletonMap("phase", "load-data"));
42
+ ```
43
+
44
+ ## 示例代码
45
+
46
+ 示例代码统一维护在模板文件中,直接参考:
47
+
48
+ - [TaskTemplate.java](../../../assets/TaskTemplate.java)
49
+
50
+ ## 实践建议
51
+
52
+ 1. 长任务应分阶段调用 `feedbackProgress(...)`。
53
+ 2. 每个大步骤后主动调用 `checkIsStop()`,避免无法及时响应停止。
54
+ 3. `params` 先做容错校验,避免任务启动即异常。
55
+ 4. 任务逻辑尽量保证幂等,防止重跑产生重复副作用。
56
+
57
+ ## 常见坑位
58
+
59
+ - 把 `feedbackProgress`、`feedbackCustomdata` 当成“自动触发事件”,导致代码放错位置。
60
+ - 长任务完全不检查 `checkIsStop()`,停止指令无法及时生效。
61
+ - 单次处理全量数据,导致内存和事务过大。
62
+ - 异常被吞掉,调度侧显示成功但业务未完成。
@@ -0,0 +1,71 @@
1
+ # 左树右表单据列表插件
2
+
3
+ ## TL;DR
4
+ - 适用:左树右表列表插件,处理树初始化、节点选择和树表联动。
5
+ - 先抓:`AbstractTreeListPlugin` 和树模型事件,先分清树模板类型。
6
+ - 跳转:标准列表无树场景先读 `plugin-list.md`;Ext 通用能力回 `adv/plugin-base.md`。
7
+ - 继续读全文:当你要改树筛选、节点点击、列表联动或特殊扩展点时。
8
+
9
+ ## 概述
10
+ 左树右表插件在标准列表上增加了“分组树 + 右侧列表”的协同能力,适用于组织树、分类树、业务分组树筛选场景。
11
+
12
+ > **适用边界**
13
+ > ✅ 本文档是原生兜底:左树右表有两个模板(TreeListPluginTemplate/StandardTreeListPluginTemplate),事件签名参考本文档。
14
+ > ❌ 封装层 Ext 基类的通用部分优先读 `references/adv/plugin-base.md`。
15
+
16
+ ## 核心基类
17
+ - 基类:`kd.bos.list.plugin.AbstractTreeListPlugin`
18
+ - 继承关系:`AbstractTreeListPlugin extends AbstractListPlugin implements ITreeListPlugin, SearchEnterListener`
19
+
20
+ ## 核心事件
21
+
22
+ - `initializeTree(...)`:树模型初始化时触发。
23
+ - `initTreeToolbar(...)`:树工具栏初始化后触发。
24
+ - `treeNodeClick(...)`:节点点击后触发。
25
+ - `buildTreeListFilter(...)`:基于当前节点构建右侧列表过滤条件。
26
+ - `refreshNode(...)`:树节点刷新时触发。
27
+ - `treeToolbarClick(...)`:树工具栏按钮点击时触发。
28
+ - `search(...)`:树搜索回车时触发。
29
+ - `beforeShowBill(...)`:打开右侧详情前触发。
30
+
31
+ ## 插件内上下文方法
32
+
33
+ 以下属于树列表插件的上下文访问能力,不建议继续按“事件”理解:
34
+
35
+ - `getTreeListView()`:获取树列表视图模型。
36
+ - `getTreeModel()`:获取树模型。
37
+ - `getView()` / `getModel()`:访问页面视图和数据模型。
38
+
39
+ ```java
40
+ ITreeListView treeListView = this.getTreeListView();
41
+ ITreeModel treeModel = this.getTreeModel();
42
+ Object currentNodeId = treeListView.getCurrentNodeId();
43
+ ```
44
+
45
+ ## 其他扩展点
46
+
47
+ - `setTreeListView(...)`:树列表视图模型注入阶段,偏框架上下文准备,不建议与业务事件并列。
48
+ - `nodeClickFilter()`:返回点击节点时附加到右表的过滤条件,更适合作为过滤扩展点理解。
49
+ - `setCustomerParam()`:树列表自定义参数构建扩展。
50
+ - `expendTreeNode(...)`:有的文档或版本中会出现,但官方说明更推荐统一在 `refreshNode(...)` 处理中做懒加载。
51
+
52
+ ## 示例代码
53
+
54
+ 示例代码统一维护在模板文件中,直接参考:
55
+
56
+ - [TreeListPluginTemplate.java](../../../assets/TreeListPluginTemplate.java)
57
+ - [StandardTreeListPluginTemplate.java](../../../assets/StandardTreeListPluginTemplate.java)
58
+
59
+ ## 实践建议
60
+
61
+ 1. 树节点驱动右表过滤优先放在 `buildTreeListFilter(...)`。
62
+ 2. 需要树模型时通过 `getTreeModel()` 访问,不要把它当成事件。
63
+ 3. 懒加载场景优先统一放在 `refreshNode(...)` 处理。
64
+ 4. 打开详情页前如需透传来源信息,可放在 `beforeShowBill(...)`。
65
+
66
+ ## 常见坑位
67
+
68
+ - 把 `getTreeListView()`、`getTreeModel()` 这类上下文方法写进事件总览。
69
+ - 在 `treeNodeClick(...)` 里直接写大量查询逻辑,导致点击卡顿。
70
+ - 节点懒加载和刷新逻辑分散在多个事件里,后续难维护。
71
+ - 只在 `initializeTree(...)` 加节点,没有同步处理 `refreshNode(...)`。
@@ -0,0 +1,82 @@
1
+ # 工作流插件
2
+
3
+ ## TL;DR
4
+ - 适用:工作流运行期扩展,处理参与人、条件、通知和审批记录定制。
5
+ - 先抓:`IWorkflowPlugin` 及其接口事件;这是接口型插件,不是常规 `super` 生命周期。
6
+ - 跳转:普通单据审核流转别误用本页;那通常是操作插件或下推链路。
7
+ - 继续读全文:当你要写动态审批人、条件分支或流程通知时。
8
+
9
+ ## 概述
10
+ 工作流插件用于在流程运行时参与参与人计算、条件判断、流程通知和审批记录格式化。
11
+
12
+ > **适用边界**
13
+ > ✅ 本文档直接使用:工作流插件是接口型(`IWorkflowPlugin`),无封装层,无需调用 super。
14
+
15
+ - 适用场景:动态审批人、条件分支、流程通知、审批记录定制
16
+
17
+ ## 核心基类
18
+
19
+ - 基类:`kd.bos.workflow.engine.extitf.IWorkflowPlugin`
20
+
21
+ ## 核心事件
22
+
23
+ - `calcUserIds(AgentExecution execution)`:参与人计算阶段触发。
24
+ - `hasTrueCondition(AgentExecution execution)`:条件分支判断阶段触发。
25
+ - `notify(AgentExecution execution)`:流程通知阶段触发。
26
+ - `notifyByWithdraw(AgentExecution execution)`:流程撤回阶段触发。
27
+ - `formatFlowRecord(IApprovalRecordItem item)`:审批记录展示格式化时触发。
28
+
29
+ ## 插件内上下文方法
30
+
31
+ 以下更适合作为 `AgentExecution` 上的上下文访问能力,而不是插件“事件”:
32
+
33
+ - `execution.getBusinessKey()`
34
+ - `execution.getEntityNumber()`
35
+ - `execution.getCurrentFlowElement()`
36
+ - `execution.getVariable(...)`
37
+ - `execution.setVariable(...)`
38
+ - `execution.getCurrentTaskResult()`
39
+ - `execution.getStartUserId()`
40
+ - `execution.setAssigneeList(...)`
41
+
42
+ ```java
43
+ String businessKey = execution.getBusinessKey();
44
+ Object amount = execution.getVariable("amount");
45
+ execution.setVariable("lastNodeName", "财务审核");
46
+ ```
47
+
48
+ ## 其他扩展点
49
+
50
+ 以下方法存在于接口默认实现或扩展能力中,但不建议在模板里与核心事件同层表达:
51
+
52
+ - `filterParticipant(...)`
53
+ - `handleTask(...)`
54
+ - `afterHandleTask(...)`
55
+ - `afterCancelTask(...)`
56
+ - `aggregateBills(...)`
57
+ - `getJointAuditResult(...)`
58
+ - `getExpireTime(...)`
59
+ - `getBillPermissions(...)`
60
+ - `validatePlugin(...)`
61
+ - `resetYZJGroupProperty(...)`
62
+
63
+ ## 示例代码
64
+
65
+ 示例代码统一维护在模板文件中,直接参考:
66
+
67
+ - [IWorkflowPluginTemplate.java](../../../assets/IWorkflowPluginTemplate.java)
68
+
69
+ ## 实践建议
70
+
71
+ 1. 参与人计算和条件分支尽量独立实现,避免职责混杂。
72
+ 2. `notify` 与 `notifyByWithdraw` 尽量成对设计,保证状态可恢复。
73
+ 3. 耗时逻辑不要放在 `notify` 中阻塞流程。
74
+ 4. 流程变量与单据数据是两套数据,要显式同步。
75
+ 5. `IWorkflowPlugin` 是接口型插件,不存在“先调用 `super.xxx()`”这一要求。
76
+
77
+ ## 常见坑位
78
+
79
+ - 把 `execution.getVariable(...)`、`execution.setAssigneeList(...)` 这类上下文访问方法写成插件事件。
80
+ - 一个插件同时塞太多流程扩展点,后续维护困难。
81
+ - `notify` 修改了单据状态,但 `notifyByWithdraw` 没有补偿恢复。
82
+ - 参与人计算完成后没有真正替换审批人列表。
@@ -0,0 +1,71 @@
1
+ # 单据反写插件
2
+
3
+ ## TL;DR
4
+ - 适用:反写插件,处理下游结果回写上游、超额校验、行关闭和补偿。
5
+ - 先抓:`AbstractWriteBackPlugIn` 的回写事件顺序,先区分下推阶段和反写阶段。
6
+ - 跳转:只是调用下推/选单业务动作时,优先读 `adv/botp-convert.md`。
7
+ - 继续读全文:当你要改数量金额反写、关闭控制或回滚补偿逻辑时。
8
+
9
+ ## 概述
10
+ 单据反写插件用于下游单据在保存/审核等操作时,把计算结果反写回上游单据,并参与关闭行、超额检查、保存回滚等完整流程。
11
+
12
+ > **适用边界**
13
+ > ✅ 本文档是原生兜底:反写插件没有 Ext 封装,直接读本文档。
14
+ > ❌ 下推/选单的业务调用优先用 `BotpUtils`,参见 `references/adv/botp-convert.md`。
15
+
16
+ - 适用场景:数量金额反写、上游行关闭控制、超额校验定制、反写补偿
17
+
18
+ ## 核心基类
19
+ - 基类:`kd.bos.entity.botp.plugin.AbstractWriteBackPlugIn`
20
+ - 继承关系:`AbstractWriteBackPlugIn implements IWriteBackPlugIn`
21
+
22
+ ## 核心事件
23
+
24
+ - `preparePropertys`:// 读取下游目标单前,准备所需目标字段
25
+ - `beforeTrack`:// 构建关联记录前,可取消本关联主实体反写
26
+ - `beforeCreateArticulationRow`:// 构建单行关联记录前,可取消该行反写
27
+ - `beforeExecWriteBackRule`:// 执行反写规则前,可禁用当前规则
28
+ - `afterCalcWriteValue`:// 反写值计算后,修正分配量
29
+ - `beforeReadSourceBill`:// 读取源单前,准备源单字段
30
+ - `afterReadSourceBill`:// 读取源单后,补充第三方数据
31
+ - `afterCommitAmount`:// 反写写入源单行后,做连锁更新
32
+ - `beforeExcessCheck`:// 超额检查前,可取消检查
33
+ - `afterExcessCheck`:// 超额检查后,决定提示/中断
34
+ - `beforeCloseRow`:// 关闭上游行前(可跳过关闭条件检查)
35
+ - `afterCloseRow`:// 上游行关闭状态写入后
36
+ - `beforeSaveTrans`:// 开启保存事务前,准备第三方数据
37
+ - `beforeSaveSourceBill`:// 源单保存前
38
+ - `afterSaveSourceBill`:// 源单保存后
39
+ - `rollbackSave`:// 保存失败回滚补偿
40
+ - `finishWriteBack`:// 反写结束释放资源(如网控)
41
+
42
+ ## 插件内上下文方法
43
+
44
+ ```java
45
+ // 上下文
46
+ BillEntityType targetSubMainType = this.getTargetSubMainType();
47
+ String opType = this.getOpType(); // Draft/Save/Audit/UnAudit/Delete/...
48
+ LinkSetItemElement currLinkSetItem = this.getCurrLinkSetItem();
49
+ ```
50
+
51
+ - `setContext(...)`:框架设置当前上下文的初始化入口,更适合作为上下文准备能力理解,而不是业务事件。
52
+
53
+ ## 示例代码
54
+
55
+ 示例代码统一维护在模板文件中,直接参考:
56
+
57
+ - [WriteBackPlugInTemplate.java](../../../assets/WriteBackPlugInTemplate.java)
58
+
59
+ ## 实践建议
60
+
61
+ 1. `preparePropertys` 与 `beforeReadSourceBill` 必须明确字段准备,避免后续空值。
62
+ 2. 超额场景优先在 `afterExcessCheck` 做统一提示策略。
63
+ 3. 涉及第三方系统写入,优先用 `beforeSaveTrans` + `rollbackSave` 做补偿闭环。
64
+ 4. 资源申请(网控、缓存句柄)必须在 `finishWriteBack` 释放。
65
+
66
+ ## 常见坑位
67
+
68
+ - 忽略 `rollbackSave`,保存失败后外部系统数据不一致。
69
+ - 在 `beforeExcessCheck` 一律取消检查,导致业务失控。
70
+ - `beforeTrack`/`beforeCreateArticulationRow` 误取消后反写缺失。
71
+ - `finishWriteBack` 未释放资源引发后续并发问题。