@shundoo-ai/dsh-cosmic 1.0.21 → 1.0.22

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 (218) hide show
  1. package/package.json +1 -1
  2. package/skills/cosmic-build/LOCAL-PATCHES.md +43 -14
  3. package/skills/cosmic-build/SKILL.md +24 -9
  4. package/skills/cosmic-build/examples/java-rules/CosmicReportAggregation.java +26 -17
  5. package/skills/cosmic-build/examples/java-rules/CosmicReportFilters.java +96 -2
  6. package/skills/cosmic-build/knowledge/cosmic/arch/security/security_standard.md +4 -4
  7. package/skills/cosmic-build/knowledge/cosmic/platform/allimport.md +2 -1
  8. package/skills/cosmic-build/knowledge/cosmic/platform/core/dynamic-object-collection.md +6 -4
  9. package/skills/cosmic-build/knowledge/cosmic/platform/core/model.md +9 -9
  10. package/skills/cosmic-build/knowledge/cosmic/platform/core/view.md +5 -5
  11. package/skills/cosmic-build/knowledge/cosmic/platform/form-plugin.md +8 -4
  12. package/skills/cosmic-build/knowledge/cosmic/platform/list-plugin.md +5 -3
  13. package/skills/cosmic-build/knowledge/cosmic/platform/print-plugin-guide.md +1 -0
  14. package/skills/cosmic-build/knowledge/cosmic/platform/report-plugin.md +269 -57
  15. package/skills/cosmic-build/knowledge/cosmic/platform/reportlistdata-plugin.md +130 -23
  16. package/skills/cosmic-build/knowledge/cosmic/platform/reporttreedata-plugin.md +48 -28
  17. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/_index.md +12 -3
  18. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/common/attachment-name-process.md +17 -13
  19. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/common/dynamic-update-field.md +4 -4
  20. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/filter-grid/filter-grid-set-value.md +1 -1
  21. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/filter-basedatafield.md +2 -3
  22. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/filter-container-init.md +0 -1
  23. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/filter-popup.md +0 -1
  24. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/filter-value-parse.md +5 -6
  25. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/list-show-form.md +1 -1
  26. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/control/list/query-field-dynamic.md +0 -7
  27. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/business-data/delete-service.md +24 -29
  28. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/ksql/db-batch.md +4 -0
  29. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/ksql/db-direct-access.md +4 -0
  30. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/qfilter/entity-object-access.md +8 -3
  31. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/data-access/qfilter/qfilter-compose.md +6 -5
  32. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/after-bind-data-set-visible.md +5 -1
  33. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/click-return-data.md +2 -2
  34. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/closed-call-back-set-value.md +2 -2
  35. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/register-listener.md +1 -1
  36. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/event/set-filter-tab-org.md +3 -0
  37. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/dispatch-service/microservice-dev.md +18 -11
  38. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/dist-lock/dist-lock-basic.md +3 -6
  39. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/mq/mq-subscribe.md +5 -1
  40. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/thread-pool/async-operation.md +10 -6
  41. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/thread-pool/big-task-async.md +4 -2
  42. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/infra/thread-pool/schedule-task.md +9 -7
  43. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/operation-interactive.md +33 -34
  44. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/operation-plugin-events.md +30 -22
  45. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-async-query.md +133 -0
  46. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-batch-query.md +26 -22
  47. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-chart.md +112 -0
  48. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-dataset-assembly.md +200 -0
  49. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-head-filter.md +177 -0
  50. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-hyperlink-drill.md +216 -0
  51. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-list-data-query.md +12 -12
  52. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-merge-column.md +44 -6
  53. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-print-data.md +163 -0
  54. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-row-data-toolbar.md +188 -0
  55. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-subtotal-total.md +139 -0
  56. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-tree-data-query.md +108 -12
  57. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/report/report-tree-list.md +181 -0
  58. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/system-service/report-plugin-interface.md +3 -0
  59. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-basedata-cascade-confirm.md +14 -11
  60. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-list-before-item-validate.md +1 -1
  61. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-list-build-filter.md +1 -1
  62. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-list-multi-level-filter.md +11 -11
  63. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/tree/tree-list-refresh-node.md +22 -15
  64. package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-algo.md +2 -2
  65. package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-entity-model.md +3 -4
  66. package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-exception.md +9 -5
  67. package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-orm-access.md +4 -0
  68. package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-request-context.md +7 -3
  69. package/skills/cosmic-build/knowledge/cosmic/platform/standards.md +28 -3
  70. package/skills/cosmic-build/references/compile-guide.md +36 -1
  71. package/skills/cosmic-build/references/dcs-code-rules.md +180 -0
  72. package/skills/cosmic-build/references/delivery.md +16 -2
  73. package/skills/cosmic-build/references/execution-contract.md +15 -3
  74. package/skills/cosmic-build/references/java-plugin-delivery.md +21 -11
  75. package/skills/cosmic-build/references/plugin-handoff-input.md +82 -24
  76. package/skills/cosmic-build/references/plugin-runtime-routing.md +23 -6
  77. package/skills/cosmic-build/references/report-filter-contract.md +53 -15
  78. package/skills/cosmic-build/references/sdk-inspection.md +4 -1
  79. package/skills/cosmic-build/references/type-registry.json +26 -17
  80. package/skills/cosmic-build/schemas/data-model-authoring.schema.json +1 -1
  81. package/skills/cosmic-build/scripts/_http_client.py +3 -0
  82. package/skills/cosmic-build/scripts/compile_plugin_source.py +251 -42
  83. package/skills/cosmic-build/scripts/configure_list.py +112 -0
  84. package/skills/cosmic-build/scripts/dcs-rule-catalog.json +799 -0
  85. package/skills/cosmic-build/scripts/dcs_code_gate.py +1976 -0
  86. package/skills/cosmic-build/scripts/execution_binding.py +25 -0
  87. package/skills/cosmic-build/scripts/platform_api_contract.py +352 -7
  88. package/skills/cosmic-build/scripts/plugin_source_gate.py +9 -1
  89. package/skills/cosmic-build/scripts/plugin_target_sdk.py +12 -8
  90. package/skills/cosmic-build/scripts/prepare_plugin_handoff.py +488 -88
  91. package/skills/cosmic-build/scripts/query_plugin_handoff.py +207 -20
  92. package/skills/cosmic-build/scripts/register_plugins.py +27 -10
  93. package/skills/cosmic-build/scripts/render_output_cards.py +57 -20
  94. package/skills/cosmic-build/scripts/resolve_output_path.py +60 -26
  95. package/skills/cosmic-build/scripts/run_java_tests.py +162 -0
  96. package/skills/cosmic-build/scripts/sync_generated_locale_assets.py +28 -0
  97. package/skills/cosmic-build/scripts/test/fixtures/ReportSdkCheck.java +1 -22
  98. package/skills/cosmic-build/scripts/test/fixtures/list_column_property_declarations.json +887 -0
  99. package/skills/cosmic-build/scripts/test/fixtures/operation-entry-field-prepare.java +78 -0
  100. package/skills/cosmic-build/scripts/test/test_add_field_required_contract.py +12 -0
  101. package/skills/cosmic-build/scripts/test/test_batch5_drift_governance.py +23 -2
  102. package/skills/cosmic-build/scripts/test/test_compile_plugin_source.py +287 -4
  103. package/skills/cosmic-build/scripts/test/test_configure_list_delivery.py +132 -0
  104. package/skills/cosmic-build/scripts/test/test_cosmic_sdk_examples.py +58 -1
  105. package/skills/cosmic-build/scripts/test/test_data_model_contract.py +19 -0
  106. package/skills/cosmic-build/scripts/test/test_dcs_code_gate.py +901 -0
  107. package/skills/cosmic-build/scripts/test/test_delivery_stage_boundary.py +1 -1
  108. package/skills/cosmic-build/scripts/test/test_direct_cli_architecture.py +2 -0
  109. package/skills/cosmic-build/scripts/test/test_http_client.py +6 -0
  110. package/skills/cosmic-build/scripts/test/test_java_toolchain_feedback.py +206 -0
  111. package/skills/cosmic-build/scripts/test/test_kd_api.py +21 -0
  112. package/skills/cosmic-build/scripts/test/test_list_configuration_closure.py +184 -0
  113. package/skills/cosmic-build/scripts/test/test_mcp_cli.py +139 -2
  114. package/skills/cosmic-build/scripts/test/test_menu_creation_closure.py +16 -0
  115. package/skills/cosmic-build/scripts/test/test_modeling_input_recovery.py +55 -1
  116. package/skills/cosmic-build/scripts/test/test_open_world_cli_catalog.py +1 -1
  117. package/skills/cosmic-build/scripts/test/test_operation_field_preparation.py +84 -0
  118. package/skills/cosmic-build/scripts/test/test_platform_api_contract.py +322 -1
  119. package/skills/cosmic-build/scripts/test/test_plugin_handoff.py +951 -4
  120. package/skills/cosmic-build/scripts/test/test_plugin_source_gate.py +30 -2
  121. package/skills/cosmic-build/scripts/test/test_plugin_target_sdk.py +21 -0
  122. package/skills/cosmic-build/scripts/test/test_property_reroute.py +165 -0
  123. package/skills/cosmic-build/scripts/test/test_property_schema_first.py +35 -0
  124. package/skills/cosmic-build/scripts/test/test_query_plugin_handoff.py +221 -0
  125. package/skills/cosmic-build/scripts/test/test_register_plugins.py +76 -4
  126. package/skills/cosmic-build/scripts/test/test_render_output_cards.py +75 -3
  127. package/skills/cosmic-build/scripts/test/test_report_business_contract.py +27 -5
  128. package/skills/cosmic-build/scripts/test/test_report_doc_contract_sync.py +103 -11
  129. package/skills/cosmic-build/scripts/test/test_report_plugin_source_gate.py +46 -16
  130. package/skills/cosmic-build/scripts/test/test_report_properties.py +74 -15
  131. package/skills/cosmic-build/scripts/test/test_report_query_data_source.py +3 -1
  132. package/skills/cosmic-build/scripts/test/test_report_sdk_optimization.py +1 -2
  133. package/skills/cosmic-build/scripts/test/test_test_environment.py +76 -1
  134. package/skills/cosmic-build/scripts/test_environment.py +67 -1
  135. package/skills/cosmic-build/skills/cosmic-coding-impl/SKILL.md +52 -10
  136. package/skills/cosmic-build/skills/cosmic-meta-api/apis/ai_meta.md +16 -3
  137. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/report-write-contracts.json +59 -26
  138. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/rule-domain.json +1 -1
  139. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/report-write.schema.json +75 -18
  140. package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/scripts/pdm_auto.py +39 -0
  141. package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/scripts/pdm_client.py +97 -10
  142. package/skills/cosmic-build/skills/cosmic-meta-api/modules/verify/SKILL.md +10 -12
  143. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_apps.py +3 -1
  144. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_formactions.py +38 -29
  145. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_listui.py +400 -233
  146. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_metaops.py +87 -45
  147. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_properties.py +42 -15
  148. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_rules.py +135 -5
  149. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/config.py +1 -1
  150. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/execution_errors.py +1 -1
  151. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/formatters.py +17 -11
  152. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/property_reroute.py +15 -5
  153. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/report_ops.py +1429 -238
  154. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/validators.py +56 -28
  155. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/cosmic_api.py +380 -134
  156. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/field_decorator.py +1 -1
  157. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/meta_export.py +12 -11
  158. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/meta_verifier.py +42 -0
  159. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_add_field_placement_closure.py +8 -8
  160. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_build_configuration_readback.py +94 -0
  161. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_build_receipt_resume.py +47 -1
  162. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_metadata_unchanged_fail_closed.py +87 -0
  163. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_dym_evidence.py +23 -23
  164. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_entity_integrity.py +279 -4
  165. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_field_guard.py +1 -1
  166. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_plugin_contract.py +509 -32
  167. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_readback_derivation.py +178 -1
  168. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_recreate_plan.py +125 -10
  169. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_serve_contract.py +208 -0
  170. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_typed_filters.py +259 -50
  171. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_rule_inventory_perf.py +29 -0
  172. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_rule_write_closure.py +20 -0
  173. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_post_build_recovery.py +18 -0
  174. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_verification_evidence.py +35 -0
  175. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_identity_guard.py +25 -0
  176. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_time_range_rule.py +98 -0
  177. package/skills/cosmic-build/skills/cosmic-meta-knowledge/domain-model/report-model.md +20 -9
  178. package/skills/cosmic-build/skills/cosmic-meta-knowledge/generation/report-modeling-guide.md +55 -25
  179. package/skills/cosmic-build/skills/cosmic-meta-knowledge/property-guides/report-column-properties.md +15 -39
  180. package/skills/cosmic-build/skills/cosmic-meta-modeling/SKILL.md +19 -17
  181. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/SKILL.md +82 -38
  182. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/examples/golden-example-report-batch.md +64 -19
  183. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/examples/golden-example-report-plugin.md +32 -20
  184. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/examples/golden-example-report-tree.md +78 -31
  185. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/report-artifact-schema.json +2 -1
  186. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-companion-fields.md +3 -0
  187. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-list-configuration.md +2 -0
  188. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_contract.py +3 -1
  189. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_emit.py +27 -4
  190. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/report_validator.py +99 -44
  191. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/test_report_examples.py +31 -4
  192. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/test_report_validator.py +129 -29
  193. package/skills/cosmic-build/skills/cosmic-meta-modifier/SKILL.md +6 -2
  194. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/validation.md +2 -0
  195. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/SKILL.md +1 -1
  196. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/report-op/SKILL.md +104 -25
  197. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/SKILL.md +9 -0
  198. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/verify/usage-guide.md +2 -2
  199. package/skills/cosmic-build/skills/cosmic-meta-modifier/references/list-filter-modification.md +39 -12
  200. package/skills/cosmic-build/skills/mcp-server/SKILL.md +39 -24
  201. package/skills/cosmic-build/skills/mcp-server/scripts/mcp_cli.py +20 -6
  202. package/skills/cosmic-dev-best-practices/SKILL.md +1 -1
  203. package/skills/cosmic-dev-best-practices/references/README.md +2 -2
  204. package/skills/cosmic-dev-best-practices/references/basedata-dev-convention.md +2 -2
  205. package/skills/cosmic-dev-best-practices/references/bill-dev-convention.md +4 -4
  206. package/skills/cosmic-dev-best-practices/references/design-document-convention.md +2 -2
  207. package/skills/cosmic-dev-best-practices/references/design-examples/basedata-design-example.md +4 -4
  208. package/skills/cosmic-dev-best-practices/references/design-examples/bill-design-example.md +13 -13
  209. package/skills/cosmic-dev-best-practices/references/elements/CustomerField.md +1 -1
  210. package/skills/cosmic-dev-best-practices/references/elements/README.md +1 -1
  211. package/skills/cosmic-dev-best-practices/references/elements/SupplierField.md +1 -1
  212. package/skills/cosmic-dev-best-practices/references/elements/common-field-property-conventions.md +109 -13
  213. package/skills/cosmic-dev-best-practices/references/layout-control-convention.md +1 -1
  214. package/skills/erp-analysis/references/delivery-contract.md +2 -1
  215. package/skills/erp-analysis/templates/AGENTS.template.md +3 -1
  216. package/skills/cosmic-build/assets/platform-report-filters/TypedReportFilterFields.java +0 -169
  217. package/skills/cosmic-build/assets/platform-report-filters/platform.patch +0 -98
  218. package/skills/cosmic-build/scripts/apply_report_filter_extension.py +0 -39
@@ -11,7 +11,7 @@ AbstractReportFormPlugin (kd.bos.report.plugin.AbstractReportFormPlugin)
11
11
  └── AbstractDataModelPlugin (kd.bos.entity.plugin.AbstractDataModelPlugin)
12
12
  ```
13
13
 
14
- 报表表单插件继承自 AbstractFormPlugin,具备完整的表单插件生命周期和视图操作能力。其核心职责是控制报表界面行为,包括查询参数初始化、查询前后处理、行数据加工、列控制、过滤容器控制、导出数据加工等。
14
+ 报表表单插件继承自 AbstractFormPlugin,具备完整的表单插件生命周期和视图操作能力。其核心职责是控制报表界面行为,包括查询参数初始化、查询前后处理、行数据加工、列控制、过滤容器控制、钻取联查、图表和导出数据加工等。它从不取报表的数据行:数据行来自 `reportlist` 取数插件,二者之间唯一的约定是 DataSet 的列名。
15
15
 
16
16
  ## reportform 插件事件
17
17
 
@@ -20,27 +20,31 @@ AbstractReportFormPlugin (kd.bos.report.plugin.AbstractReportFormPlugin)
20
20
  | 方法名 | 触发时机 | 典型用途 |
21
21
  |--------|---------|---------|
22
22
  | `initialize()` | 初始化时 | 插件初始化 |
23
- | `registerListener(EventObject)` | 页面请求开始时 | 注册监听 |
23
+ | `registerListener(EventObject)` | 页面请求开始时 | 注册工具栏、超链接、单元格点击与 F7 监听 |
24
24
  | `initDefaultQueryParam(ReportQueryParam)` | 报表打开时 | 设置过滤面板默认值 |
25
- | `filterContainerInit(FilterContainerInitEvent, ReportQueryParam)` | 过滤面板初始化 | 动态修改过滤条件控件 |
25
+ | `filterContainerInit(FilterContainerInitEvent, ReportQueryParam)` | 过滤面板初始化 | 动态修改过滤条件控件;被钻取打开的报表在这里锁定过滤 |
26
26
  | `filterContainerSearchClick(FilterContainerSearchClickArgs)` | 查询按钮点击 | 自定义搜索逻辑 |
27
27
  | `filterContainerBeforeF7Select(BeforeFilterF7SelectEvent)` | 基础资料弹出前 | 添加过滤条件 |
28
28
  | `verifyQuery(ReportQueryParam)` | 查询前 | 条件验证,返回 false 阻止查询 |
29
- | `beforeQuery(ReportQueryParam)` | 查询取数前 | 修改查询参数 |
30
- | `afterQuery(ReportQueryParam)` | 查询取数后 | 后续处理 |
31
- | `afterCreateColumn(CreateColumnEvent)` | 列创建完成后 | 修改列属性 |
29
+ | `beforeQuery(ReportQueryParam)` | 查询取数前 | 追加查询条件、切换列表开关 |
30
+ | `afterQuery(ReportQueryParam)` | 查询取数后 | 后续处理、绘制图表 |
31
+ | `afterCreateColumn(CreateColumnEvent)` | 列创建完成后 | 修改、隐藏或删除列 |
32
32
  | `resetColumns(List<AbstractReportColumn>)` | 列创建后 | 调整列显示顺序 |
33
33
  | `processRowData(String, DynamicObjectCollection, ReportQueryParam)` | 数据返回后 | 行数据加工 |
34
- | `packageData(PackageDataEvent)` | 发送前端前 | 最终数据加工 |
34
+ | `packageData(PackageDataEvent)` | 发送前端前,每个单元格一次 | 最终数据加工、合计行标签、融合排除 |
35
+ | `itemClick(ItemClickEvent)` | 工具栏按钮点击 | 自定义按钮 |
36
+ | `hyperLinkClick(HyperLinkClickEvent)` | 超链接单元格点击(`HyperLinkClickListener`) | 钻取联查 |
35
37
  | `setTreeReportList(TreeReportListEvent)` | 树形报表设置 | 配置折叠树形展示 |
36
38
  | `setFlexProperty(FlexEvent)` | 弹性域设置 | 设置弹性域维度 |
37
39
  | `preProcessExportData(...)` | 导出前 | 导出数据加工 |
40
+ | `exportInitialize(ReportExportInitializeEvent)` | 导出开始时 | 导出文件的合并单元格规则 |
38
41
  | `setFloatButtomData(List<SummaryEvent>)` | 合计行设置 | 设置合计行数据 |
39
42
  | `setCellStyleRules(List<CellStyleRule>)` | 样式设置 | 自定义单元格规则 |
40
43
  | `setMergeColums(List<String>)` | 融合列设置 | 指定融合列 |
41
44
  | `setExcelName(List<String>)` | 导出名称设置 | 自定义导出名称 |
42
45
  | `getComboItems(String, List<ValueMapItem>)` | 下拉值获取 | 提供下拉选项 |
43
46
  | `setSortAndFilter(List<SortAndFilterEvent>)` | 排序过滤设置 | 配置列排序过滤 |
47
+ | `beforeCreateFilterInfo(CreateFilterInfoEvent)` | 构建表头过滤前 | 替换某列的表头过滤选项 |
44
48
  | `resetDataCount()` | 数据总数重设 | 修正前端展示总记录数 |
45
49
 
46
50
  ### reportform 插件事件执行顺序
@@ -50,15 +54,38 @@ initialize → registerListener → initDefaultQueryParam → filterContainerIni
50
54
  → [用户点击查询] → filterContainerSearchClick → verifyQuery → beforeQuery
51
55
  → [数据插件 query] → afterQuery → afterCreateColumn → resetColumns
52
56
  → processRowData → packageData → [前端展示]
57
+ → [用户点击] itemClick / hyperLinkClick
53
58
  ```
54
59
 
60
+ ## 注册
61
+
62
+ `reportform` 插件是报表页面自己的表单插件,所以它属于报表表单的插件列表。它不是 `reportPlugins` 条目 ——
63
+ 那个槽位是报表列表的取数插件(`ReportQueryPlugin`),运行的是 `AbstractReportListDataPlugin` —— 也不是左树的
64
+ `ReportTreeAp.ReportPlugin`。报表流水线只写前一个槽位,后一个只在用户新增「报表树」控件后才存在;
65
+ 这个插件像任何 Java 表单插件一样交付和注册
66
+ (`{ROOT_DIR}/references/java-plugin-delivery.md`):
67
+
68
+ 1. 用 `prepare_plugin_handoff.py` 以类型 `reportform`、报表的表单编码准备它,再用 `compile_plugin_source.py` 编译,
69
+ 编译会把它登记进 `archive.json`。
70
+ 2. 注册并回读:
71
+ `{python} "{ROOT_DIR}/scripts/register_plugins.py" --app-root "{appRoot}" --class-name "{fqcn}" --verify`。
72
+ 类型注册表把 `reportform` 映射到 `targetType` `BILL_FORM`,平台把类加到报表表单的根插件列表 ——
73
+ `queryEditablePlugins` 回读报表时把这个列表返回为 `location` `BILL_FORM`,与取数插件的
74
+ `REPORT_QUERY_PLUGIN` 行并列。结果的 `verification.status` 为 `pass` 才算已注册。
75
+ 3. 它的监听是它自己的代码:由 `registerListener` 添加;缺少对应 `add*` 调用的 `itemClick`、`cellClick` 或
76
+ `hyperLinkClick` 覆写会被编译边界拒绝(`PLUGIN_SOURCE_LISTENER_UNREGISTERED`)。
77
+
78
+ 重建报表会连同表单删掉这些注册:`planReportRecreate` 把它们列在 `current.formPlugins` 下,并用单独一步
79
+ 重新注册。
80
+
55
81
  ## 插件内上下文方法
56
82
 
57
83
  以下更适合作为界面插件中的上下文能力,不建议当成“自动触发事件”:
58
84
 
59
85
  - `getView()`:获取报表视图。
60
- - `getModel()`:获取报表数据模型。
86
+ - `getModel()`:获取报表数据模型;过滤面板的字段就是它的属性,所以 `getModel().getValue(key)` / `setValue(key, value)` 读取和设置过滤值。
61
87
  - `getQueryParam()`:获取当前查询参数。
88
+ - `getPageCache()`:页面级缓存,翻页不丢;同一页面不同事件之间传值用它。
62
89
  - `getControl("reportlistap")`:获取报表控件,返回 `Control` 基类或具体控件对象。
63
90
 
64
91
  ```java
@@ -69,7 +96,135 @@ reportList.setSelectedAll(true);
69
96
 
70
97
  说明:`this.getControl("reportlistap")` 的返回类型是 `<T extends kd.bos.form.control.Control>`,所有控件都继承自 `kd.bos.form.control.Control`,实际拿到的是具体控件对象,例如 `ReportList`、`BasedataEdit`、`EntryGrid` 等。
71
98
 
72
-
99
+ 用户可见文案一律经过 `ResManager.loadKDString(text, resourceKey, module)`,以便多语言翻译。
100
+
101
+ ## 工具栏、监听与行数据
102
+
103
+ 在 `registerListener` 里注册监听:`addItemClickListeners("toolbarap")` 把工具栏按钮路由到 `itemClick`,
104
+ `ReportList.addHyperClickListener(this)` 把超链接单元格路由到 `implements HyperLinkClickListener` 的插件的
105
+ `hyperLinkClick`。工具栏按钮本身是元数据 —— 报表工具栏上的一个按钮项,通常绑定一个 donothing 操作 ——
106
+ `evt.getItemKey()` 就是它的标识。
107
+
108
+ `itemClick` 拿不到当前行。在单元格点击时缓存行号(`ReportList.addCellClickListener`,把 `e.getRow()` 存进
109
+ `getPageCache()`),按钮点击时再用 `reportList.getReportModel().getRowData(rowIndex)` 取回:取到的行是一个
110
+ `DynamicObject`,按取数插件 DataSet 的列名取值,基础资料列取出来是 `DynamicObject`,它的 `getPkValue()` 就是 id。
111
+
112
+ 要取全部选中行,先在 `beforeQuery` 里用 `reportList.setSelectedAll(true)` 开启全选,再读
113
+ `getRowData(0, reportList.getTotalRecords(), true)` —— 起始行、行数、是否仅取选中行。在 8.0 SDK 中,三参数重载是
114
+ `IReportListModel` 的 default 方法,所以直接在 `getReportModel()` 返回的模型上调用,无需强转。
115
+ 作用于行的按钮必须用提示处理没有选中行的情况。见
116
+ `{ROOT_DIR}/knowledge/cosmic/platform/scenes/report/report-row-data-toolbar.md`。
117
+
118
+ ## 过滤面板:默认值、F7 范围与校验
119
+
120
+ - 默认值:在 `initDefaultQueryParam` 里,对仍为空的过滤字段用 `getModel().setValue(key, value)` 赋值 ——
121
+ 用户有权使用当前组织时取当前组织,否则取第一个有权限的组织;日期范围取本月 1 日到今天。
122
+ `filterContainerInit` 是设默认值的另一个位置。
123
+ - F7 范围:收窄用户能选的候选,而不只是查询能接受的值。在 `registerListener` 里,
124
+ `BasedataEdit.addBeforeF7SelectListener` 能拿到选择器的 `ListShowParameter`,其
125
+ `getListFilterParameter().setFilter(new QFilter("id", QCP.in, ids))` 限定候选;过滤容器自己的选择器用
126
+ `filterContainerBeforeF7Select` 配 `addCustomQFilter` 达到同样效果。
127
+ - 校验:`verifyQuery` 从 `queryParam.getFilter()` 读取条件 —— 多选基础资料过滤用
128
+ `getDynamicObjectCollection(key)`,日期用 `getDate(key)` —— 不满足时
129
+ `getView().showTipNotification(message, 3000)` 并返回 `false` 阻断查询,否则返回 `super.verifyQuery(queryParam)`。
130
+ 取数插件需要的结构化取值在这里放进 `queryParam.setCustomParam(map)`。
131
+ - 按钮上的跨字段检查:`filterContainerSearchClick` 读取并调整 `args.getFilterValues()`,例如拒绝超过一年的
132
+ 日期范围。
133
+
134
+ ## 运行时的列
135
+
136
+ `afterCreateColumn` 在 `event.getColumns()` 里拿到列树:`ReportColumn` 用 `getFieldKey()` 识别,
137
+ `ReportColumnGroup` 的列在它的 `getChildren()` 里。`setHide(...)` 显示或隐藏某列。删除列时倒序遍历,避免下标
138
+ 位移,并且要连同每个分组的子列一起遍历,否则会留下空的分组表头。按字段 key 匹配列,绝不按标题:标题随语言
139
+ 变化。列结构取决于查询出的数据而不是过滤选项时,应改在取数插件的 `getColumns` 里处理。
140
+
141
+ ## 单元格格式化、融合与合计行
142
+
143
+ - `packageData(PackageDataEvent)` 每个单元格触发一次。`getSource()` 是当前列 —— 强转前先判断
144
+ `instanceof ReportColumn` —— `getRowData()` 是当前行,`setFormatValue(value)` 替换显示值。取数插件构造的合计行
145
+ 带 `sumlevel` 标记(1 小计、2 总计):在这里给它们打标签,并对合计行上无意义的列(例如比率)
146
+ `setFormatValue(null)`。
147
+ - 行融合:`setMergeColums(List<String>)` 添加相邻值相同就融合的字段 key;在 `packageData` 里用
148
+ `getNoMergeKey().add(fieldKey)` 让某个单元格(例如小计行的)不参与融合。
149
+ - 导出合并:`exportInitialize(ReportExportInitializeEvent)` 用 `setMergeColumnRules(rules)` 设置由
150
+ `new MergeColumnRule(groupColumns, mergeColumns)` 组成的规则。一个合并字段只能出现在一条规则里,合并跟随分组
151
+ 字段:只要分组字段的值相同,合并字段就合并,不看合并字段自身相邻行的值是否相同。
152
+ - `processRowData` 拿到的是一页数据行,导出时也会触发;不要在这里或 `preProcessExportData` 里逐行查库。
153
+
154
+ 见 `{ROOT_DIR}/knowledge/cosmic/platform/scenes/report/report-subtotal-total.md` 与
155
+ `{ROOT_DIR}/knowledge/cosmic/platform/scenes/report/report-merge-column.md`。
156
+
157
+ ## 表头过滤与排序
158
+
159
+ `setSortAndFilter(List<SortAndFilterEvent>)` 逐列开启表头排序与过滤:`event.getColumnName()` 是列名,
160
+ `setSort(true)` 与 `setFilter(true)` 开启它们。`beforeCreateFilterInfo(CreateFilterInfoEvent)` 替换某一列的
161
+ 过滤选项 —— `event.getFieldKey()` 是该列,`event.getFilterInfo().put("comboItems", items)` 设置选项,每个选项是
162
+ 包含 `id`、`name`(`LocaleString`)和 `value` 的 map。这只是功能的一半:取数插件的 `query()` 必须应用
163
+ `getTableHeadFilterItems()`,否则表头过滤不起任何作用。见
164
+ `{ROOT_DIR}/knowledge/cosmic/platform/scenes/report/report-head-filter.md`。
165
+
166
+ ## 钻取联查
167
+
168
+ 超链接单元格需要该列在报表元数据里配置为超链接列,并注册上文的监听。在
169
+ `hyperLinkClick(HyperLinkClickEvent)` 里,`evt.getFieldName()` 是被点击的列 —— 每个超链接列分发到一个方法 ——
170
+ `reportList.getReportModel().getRowData(evt.getRowIndex())` 返回该行。三种目标:
171
+
172
+ | 目标 | 打开参数 |
173
+ |---|---|
174
+ | 单据 | `BillShowParameter`:`setFormId(单据)`、`setPkId(id)`、`setStatus(OperationStatus.VIEW)`、`getOpenStyle().setShowType(ShowType.MainNewTabPage)` |
175
+ | 列表 | `ListShowParameter`:`setFormId("bos_list")`、`setBillFormId(单据)`,以及带 `QFilter.of("company=? and bizdate>=?", ...)` 的 `ListFilterParameter` |
176
+ | 另一张报表 | `ReportShowParameter`:`setFormId(报表)` 配 `setCustomParams(map)`,或 `setQueryParam(param)` 带一份克隆的 `FilterInfo` |
177
+
178
+ 被钻取打开的报表在 `filterContainerInit` 里读取打开参数:`(ReportShowParameter) getView().getFormShowParameter()`
179
+ 及其 `getCustomParams()`。要把某个过滤锁定为钻取值,从 `event.getCommonFilterColumns()` 取出
180
+ `CommonFilterColumn`,清空其选项,把钻取值设为唯一选项并 `setDefaultValue(...)`,再 `setMustInput(true)`。见
181
+ `{ROOT_DIR}/knowledge/cosmic/platform/scenes/report/report-hyperlink-drill.md`。
182
+
183
+ ## 树形报表列表
184
+
185
+ `setTreeReportList(TreeReportListEvent)` 里调 `event.setTreeReportList(true)` 把报表列表渲染成可折叠的树,
186
+ `event.setTreeExpandColId(column)` 指定承载展开控件的列;取数插件的数据行带 `rowid` / `pid` / `isgroupnode`。
187
+ 工具栏按钮可以用 `reportList.expandAllNode()` / `reportList.collapseAllNode()` 一键展开或收起全部节点(7.0.1 及
188
+ 以后);工具栏监听在 `registerListener` 里注册。报表示例还在 `initialize` 里再注册一次,这不起作用 ——
189
+ `Toolbar.addItemClickListener` 会忽略已持有的监听 —— 而且会被编译边界拒绝。报表示例还用
190
+ `event.setCol2ndResultMode(TreeDataMode.FLAT)` 把树形列表的表头过滤结果改为平铺;8.0 SDK 里这两个名字都不存在,
191
+ 所以在 8.0 上不要写,目标是更新的版本时,只有 `{ROOT_DIR}/references/sdk-inspection.md` 在其 SDK 上找到它后才使用。见
192
+ `{ROOT_DIR}/knowledge/cosmic/platform/scenes/report/report-tree-list.md`。
193
+
194
+ ## 查询开关
195
+
196
+ 在 `beforeQuery` 里,`ReportList.setAsyncTotal(true)` 异步计算合计行,不让合计拖住数据行的展示;
197
+ `setSelectedAll(true)` 允许用户全选全部行。报表示例还加了 `setAsyncDataCount(true)`,异步查询总行数,首页先展示
198
+ 再取总数;8.0 SDK 没有这个方法,所以在 8.0 上不要写,目标是更新的版本时,只有
199
+ `{ROOT_DIR}/references/sdk-inspection.md` 在其 SDK 上找到它后才使用。这些开关默认都关闭,大数据量报表建议开启。
200
+
201
+ `beforeQuery` 是追加查询条件,绝不替换:在这里 `queryParam.setFilter(new FilterInfo())` 或
202
+ `setCustomFilter(new ArrayList<>())` 会丢掉用户输入的全部条件。见
203
+ `{ROOT_DIR}/knowledge/cosmic/platform/scenes/report/report-async-query.md`。
204
+
205
+ ## 查询后的图表
206
+
207
+ 报表表单上布局的图表控件在 `afterQuery` 里驱动:用 `getControl(key)` 取得它,`clearData()`,添加一个序列
208
+ (`PieChart` 上的 `createPieSeries(title)`),给它 `ItemValue` 条目,再 `refresh()`。图表需要与列表相同的数据行:
209
+ 要么根据 `queryParam` 重新计算,要么取取数插件共享出来的 DataSet —— 两个图表都要消费时,在第一次遍历前先
210
+ `copy()`,因为每次遍历都会消费 DataSet。见
211
+ `{ROOT_DIR}/knowledge/cosmic/platform/scenes/report/report-chart.md`。
212
+
213
+ ## 选用场景
214
+
215
+ 把适用的场景作为 intent 的 `scenes` 条目传给 `prepare_plugin_handoff.py`,它会把场景的 SDK 引用展开成 import:
216
+
217
+ | 需求 | 场景 |
218
+ |---|---|
219
+ | 工具栏按钮、当前行、全部选中行 | `report/report-row-data-toolbar` |
220
+ | 钻取到单据、列表或报表,以及被钻取的报表 | `report/report-hyperlink-drill` |
221
+ | 表头过滤与排序、自定义表头过滤选项 | `report/report-head-filter` |
222
+ | 小计与合计行的标签和置空 | `report/report-subtotal-total` |
223
+ | 界面与导出中的单元格融合 | `report/report-merge-column` |
224
+ | 可折叠树形列表、一键展开与收起 | `report/report-tree-list` |
225
+ | 异步合计、总数与全选 | `report/report-async-query` |
226
+ | 查询后的图表 | `report/report-chart` |
227
+ | 查询校验 | `report/report-verify-query` |
73
228
 
74
229
  ## 实践建议
75
230
 
@@ -77,6 +232,7 @@ reportList.setSelectedAll(true);
77
232
  2. 过滤容器初始化与默认参数初始化要配合使用。
78
233
  3. `processRowData(...)` 避免逐行查库,导出时会放大性能问题。
79
234
  4. 导出相关逻辑放在 `preProcessExportData(...)` 和 `setExcelName(...)`。
235
+ 5. 一族报表共享同一套交互规范时,把它放进抽象基类插件 —— 有权限的组织做成抽象方法,F7 范围、默认值、校验和删列放在基类 —— 各报表只覆写不同的部分。
80
236
 
81
237
  ## 常见坑位
82
238
 
@@ -84,43 +240,51 @@ reportList.setSelectedAll(true);
84
240
  - 在 `packageData(...)` 中实现导出逻辑。
85
241
  - `verifyQuery(...)` 不校验空条件导致全表扫描。
86
242
  - 把大量专项扩展点和核心查询事件混在一起,模板难以聚焦。
87
-
88
-
243
+ - 在 `beforeQuery(...)` 里替换查询参数,而不是追加。
244
+ - 没有 `instanceof` 判断就把 `packageData` 的来源强转成 `ReportColumn`。
245
+ - 按标题匹配列,而标题随语言不同。
246
+ - 漏注册监听:没有 `addItemClickListeners` 或 `addHyperClickListener` 时,按钮或超链接点了没反应。编译边界会拒绝没有注册的覆写(`PLUGIN_SOURCE_LISTENER_UNREGISTERED`)。
247
+ - 开启了表头过滤,取数插件却没有应用它。两个插件中后编译的那个会给出警告(`PLUGIN_REPORT_HEAD_FILTER_UNAPPLIED`)。
248
+ - 写了 8.0 SDK 没有的名字 —— `setAsyncDataCount`、`setCol2ndResultMode`、`TreeDataMode`、`FilterInfo.getCustomFilter` —— 编译时会报告 `PLUGIN_SOURCE_ABSENT_FROM_8_0_SDK`。
89
249
 
90
250
  ## 骨架模板
91
251
 
92
- > 适用:`reportform`。继承 `AbstractReportFormPlugin`(`kd.bos.report.plugin.AbstractReportFormPlugin`),具备完整表单插件生命周期。所有重写方法必须第一行调用 `super.xxx()`。类名后缀按 `{PluginSuffix}` 命名。注册方式:在苍穹报表模板配置中注册插件类全限定名。
252
+ > 适用:`reportform`。继承 `AbstractReportFormPlugin`(`kd.bos.report.plugin.AbstractReportFormPlugin`),具备完整表单插件生命周期。所有重写方法必须第一行调用 `super.xxx()`。类名后缀按 `{PluginSuffix}` 命名。注册方式:`register_plugins.py --verify` 把插件类全限定名加到报表表单的插件列表(`targetType` `BILL_FORM`)—— 不要放进 `reportPlugins`,那是报表列表的取数槽位。
93
253
 
94
254
  ```java
95
255
  package kd.cd.common;
96
256
 
257
+ import kd.bos.bill.BillShowParameter;
258
+ import kd.bos.bill.OperationStatus;
97
259
  import kd.bos.context.RequestContext;
98
260
  import kd.bos.dataentity.entity.DynamicObject;
99
261
  import kd.bos.dataentity.entity.DynamicObjectCollection;
100
262
  import kd.bos.entity.NumberFormatProvider;
101
263
  import kd.bos.entity.datamodel.events.PackageDataEvent;
264
+ import kd.bos.entity.report.AbstractReportColumn;
102
265
  import kd.bos.entity.report.FilterInfo;
103
266
  import kd.bos.entity.report.ReportColumn;
104
267
  import kd.bos.entity.report.ReportQueryParam;
105
- import kd.bos.entity.report.queryds.ReportFilterFieldConfig;
268
+ import kd.bos.form.ShowType;
106
269
  import kd.bos.form.control.events.FilterContainerInitEvent;
270
+ import kd.bos.form.control.events.ItemClickEvent;
107
271
  import kd.bos.form.events.FilterContainerSearchClickArgs;
272
+ import kd.bos.form.events.HyperLinkClickEvent;
273
+ import kd.bos.form.events.HyperLinkClickListener;
108
274
  import kd.bos.form.field.events.BeforeFilterF7SelectEvent;
109
- import kd.bos.lang.Lang;
110
- import kd.bos.list.column.ListOperationColumnDesc;
111
275
  import kd.bos.report.ReportList;
112
276
  import kd.bos.report.events.CreateColumnEvent;
277
+ import kd.bos.report.events.SortAndFilterEvent;
113
278
  import kd.bos.report.plugin.AbstractReportFormPlugin;
114
279
 
115
- import java.util.ArrayList;
116
- import java.util.HashMap;
280
+ import java.util.EventObject;
117
281
  import java.util.List;
118
282
 
119
283
  /**
120
284
  * 报表界面插件骨架模板(原生 AbstractReportFormPlugin)。
121
285
  * 该类仅用于示例写法,生成后请按实际业务删除无用事件并替换占位常量。
122
286
  */
123
- public class ReportFormPluginTemplate extends AbstractReportFormPlugin {
287
+ public class ReportFormPluginTemplate extends AbstractReportFormPlugin implements HyperLinkClickListener {
124
288
 
125
289
  /**
126
290
  * 触发时机: 在需要了解当前插件可访问上下文能力时调用。
@@ -136,9 +300,61 @@ public class ReportFormPluginTemplate extends AbstractReportFormPlugin {
136
300
  }
137
301
 
138
302
  private static final String GRID_KEY = "reportlistap";
303
+ private static final String TOOLBAR_KEY = "toolbarap";
139
304
  private static final String FILTER_ORG = "org";
140
305
  private static final String FILTER_BILL_STATUS = "billstatus";
141
306
 
307
+ // ===== 监听 =====
308
+
309
+ /**
310
+ * 触发时机: 页面请求开始时。
311
+ * 参数要点: e 为本次请求事件。
312
+ * 典型用途: 把工具栏点击路由到 itemClick,把超链接单元格路由到 hyperLinkClick。
313
+ */
314
+ @Override
315
+ public void registerListener(EventObject e) {
316
+ super.registerListener(e);
317
+ this.addItemClickListeners(TOOLBAR_KEY);
318
+ ReportList reportList = this.getControl(GRID_KEY);
319
+ reportList.addHyperClickListener(this);
320
+ }
321
+
322
+ /**
323
+ * 触发时机: 工具栏按钮点击时。
324
+ * 参数要点: evt.getItemKey() 是报表元数据里工具栏按钮的标识。
325
+ * 典型用途: 执行自定义按钮逻辑;处理没有选中行的情况。
326
+ */
327
+ @Override
328
+ public void itemClick(ItemClickEvent evt) {
329
+ super.itemClick(evt);
330
+ if ("btn_refresh_hint".equals(evt.getItemKey())) {
331
+ this.getView().showTipNotification("修改过滤条件后请重新查询。");
332
+ }
333
+ }
334
+
335
+ /**
336
+ * 触发时机: 超链接单元格点击时(HyperLinkClickListener 接口方法,不调 super)。
337
+ * 参数要点: getFieldName() 是被点击的列,getRowIndex() 是所在行。
338
+ * 典型用途: 钻取到被点击行的源单。
339
+ */
340
+ @Override
341
+ public void hyperLinkClick(HyperLinkClickEvent evt) {
342
+ if (!"billno".equals(evt.getFieldName())) {
343
+ return;
344
+ }
345
+ ReportList reportList = this.getControl(GRID_KEY);
346
+ DynamicObject row = reportList.getReportModel().getRowData(evt.getRowIndex());
347
+ if (row == null) {
348
+ return;
349
+ }
350
+ BillShowParameter parameter = new BillShowParameter();
351
+ parameter.setFormId(row.getString("billformid"));
352
+ parameter.setPkId(row.getLong("billid"));
353
+ parameter.setStatus(OperationStatus.VIEW);
354
+ parameter.getOpenStyle().setShowType(ShowType.MainNewTabPage);
355
+ this.getView().showForm(parameter);
356
+ }
357
+
142
358
  // ===== 核心事件 =====
143
359
 
144
360
  /**
@@ -154,7 +370,7 @@ public class ReportFormPluginTemplate extends AbstractReportFormPlugin {
154
370
  filter = new FilterInfo();
155
371
  queryParam.setFilter(filter);
156
372
  }
157
- filter.addFilterItem("fieldKey", RequestContext.get().getOrgId());
373
+ filter.addFilterItem(FILTER_ORG, RequestContext.get().getOrgId());
158
374
  }
159
375
 
160
376
  /**
@@ -200,34 +416,26 @@ public class ReportFormPluginTemplate extends AbstractReportFormPlugin {
200
416
  */
201
417
  @Override
202
418
  public boolean verifyQuery(ReportQueryParam queryParam) {
203
- super.verifyQuery(queryParam);
204
- return queryParam.getFilter() != null;
419
+ FilterInfo filter = queryParam.getFilter();
420
+ if (filter == null || filter.getValue(FILTER_ORG) == null) {
421
+ this.getView().showTipNotification("请先选择组织再查询。");
422
+ return false;
423
+ }
424
+ return super.verifyQuery(queryParam);
205
425
  }
206
426
 
207
427
  /**
208
428
  * 触发时机: 报表查询执行前。
209
429
  * 参数要点: queryParam 含过滤、分页、排序等上下文。
210
- * 典型用途: 追加查询过滤条件、设置报表控件状态或修正参数。
430
+ * 典型用途: 追加查询条件或切换列表开关;绝不替换用户的条件。
211
431
  */
212
432
  @Override
213
433
  public void beforeQuery(ReportQueryParam queryParam) {
214
434
  super.beforeQuery(queryParam);
215
- // 设置取数排序规则
216
- queryParam.setSortInfo("xxx");
217
- // 设置自定义参数到取数插件
218
- queryParam.setCustomParam(new HashMap<>());
219
- // 设置是否树形报表
220
- queryParam.setTreeReportList(false);
221
- // 设置报表过滤条件配置
222
- queryParam.setReportFilterFieldConfig(new ReportFilterFieldConfig());
223
- // 设置通用过滤条件
224
- queryParam.setFilter(new FilterInfo());
225
- // 设置多语言
226
- queryParam.setMulLang(Lang.zh_CN);
227
- // 设置报表自定义过滤条件
228
- queryParam.setCustomFilter(new ArrayList<>());
229
- // 设置提示信息
230
- queryParam.setMessage("查询完成");
435
+ // 只追加,不替换:在这里 setFilter(new FilterInfo()) 或 setCustomFilter(new ArrayList<>())
436
+ // 会丢掉用户输入的全部条件。
437
+ ReportList reportList = this.getControl(GRID_KEY);
438
+ reportList.setAsyncTotal(true);
231
439
  }
232
440
 
233
441
  /**
@@ -243,33 +451,34 @@ public class ReportFormPluginTemplate extends AbstractReportFormPlugin {
243
451
 
244
452
  /**
245
453
  * 触发时机: 报表列创建后。
246
- * 参数要点: event 可调整列标题、宽度、隐藏状态等。
247
- * 典型用途: 动态调整列显示方式或列元数据。
454
+ * 参数要点: event.getColumns() 是列树;ReportColumnGroup 的列在它的 getChildren() 里。
455
+ * 典型用途: 按字段 key 显示、隐藏或删除列。
248
456
  */
249
457
  @Override
250
458
  public void afterCreateColumn(CreateColumnEvent event) {
251
459
  super.afterCreateColumn(event);
252
- this.getView().showTipNotification("报表列初始化完成");
460
+ for (AbstractReportColumn column : event.getColumns()) {
461
+ if (column instanceof ReportColumn && "textareafield1".equals(((ReportColumn) column).getFieldKey())) {
462
+ ((ReportColumn) column).setHide(false);
463
+ }
464
+ }
253
465
  }
254
466
 
255
467
  /**
256
- * 触发时机: 打包单元格数据时。
468
+ * 触发时机: 打包单元格数据时,每个单元格一次。
257
469
  * 参数要点: packageDataEvent 含当前行列数据上下文。
258
470
  * 典型用途: 对界面展示值做格式化;该事件通常不用于导出逻辑。
259
471
  */
260
472
  @Override
261
473
  public void packageData(PackageDataEvent packageDataEvent) {
262
474
  super.packageData(packageDataEvent);
263
- if (packageDataEvent.getSource() instanceof ReportColumn) {
264
- DynamicObject dObject = packageDataEvent.getRowData();
265
- String applyType = dObject.getString("kdec_applytype");
266
- if(applyType.equals("A")) {
267
- ReportColumn column = (ReportColumn) packageDataEvent.getSource();
268
- System.out.println(column.getFieldKey());
269
- if ("kdec_totalday".equals(column.getFieldKey())) {
270
- packageDataEvent.setFormatValue(100);
271
- }
272
- }
475
+ if (!(packageDataEvent.getSource() instanceof ReportColumn)) {
476
+ return;
477
+ }
478
+ ReportColumn column = (ReportColumn) packageDataEvent.getSource();
479
+ DynamicObject row = packageDataEvent.getRowData();
480
+ if ("kdec_totalday".equals(column.getFieldKey()) && "A".equals(row.getString("kdec_applytype"))) {
481
+ packageDataEvent.setFormatValue(100);
273
482
  }
274
483
  }
275
484
 
@@ -313,7 +522,7 @@ public class ReportFormPluginTemplate extends AbstractReportFormPlugin {
313
522
 
314
523
  /**
315
524
  * 触发时机: 设置导出 Excel 文件名时。
316
- * 参数要点: list 为导出文件名片段集合。
525
+ * 参数要点: list 为导出文件名片段集合;只使用第一个元素。
317
526
  * 典型用途: 自定义导出文件名,便于区分组织、期间或报表类型。
318
527
  */
319
528
  @Override
@@ -324,13 +533,16 @@ public class ReportFormPluginTemplate extends AbstractReportFormPlugin {
324
533
 
325
534
  /**
326
535
  * 触发时机: 初始化列排序和过滤能力时。
327
- * 参数要点: allColumns 为全部列定义。
328
- * 典型用途: 控制列是否支持排序、列头过滤等交互行为。
536
+ * 参数要点: allColumns 每列一个事件;getColumnName() 是列名。
537
+ * 典型用途: 开启表头排序与过滤;取数插件必须应用表头过滤条件。
329
538
  */
330
539
  @Override
331
- public void setSortAndFilter(List allColumns) {
540
+ public void setSortAndFilter(List<SortAndFilterEvent> allColumns) {
332
541
  super.setSortAndFilter(allColumns);
333
- this.getView().showTipNotification("初始化排序与过滤能力");
542
+ for (SortAndFilterEvent column : allColumns) {
543
+ column.setSort(true);
544
+ column.setFilter(true);
545
+ }
334
546
  }
335
547
  }
336
548