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,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 分录行遍历与表头汇总示例。
|
|
3
|
+
* <p>
|
|
4
|
+
* 适用插件:表单插件、单据插件
|
|
5
|
+
* 优先封装:DynamicObjectUtils、AbstractFormPluginExt
|
|
6
|
+
* 原生兜底:PropertyChangedArgs、AfterAddRowEventArgs、AfterDeleteRowEventArgs
|
|
7
|
+
* 相关 lint 规则:SCENE-008、STYLE-014、STYLE-015
|
|
8
|
+
* <p>
|
|
9
|
+
* 使用场景:
|
|
10
|
+
* 1. 数量/单价/税率变化后,回写当前行金额、税额;
|
|
11
|
+
* 2. 分录新增/删除后,刷新表头汇总字段;
|
|
12
|
+
* 3. 避免在 propertyChanged 里做重查询,只处理当前行和表头汇总。
|
|
13
|
+
* 参考写法:优先复用 getModel().getEntryEntity(...) + DynamicObjectUtils.sumOf(...)。
|
|
14
|
+
*/
|
|
15
|
+
package kd.cd.common.snippets.form;
|
|
16
|
+
|
|
17
|
+
import kd.bos.dataentity.entity.DynamicObjectCollection;
|
|
18
|
+
import kd.bos.entity.datamodel.events.AfterAddRowEventArgs;
|
|
19
|
+
import kd.bos.entity.datamodel.events.AfterDeleteRowEventArgs;
|
|
20
|
+
import kd.bos.entity.datamodel.events.PropertyChangedArgs;
|
|
21
|
+
import kd.cd.common.plugin.AbstractFormPluginExt;
|
|
22
|
+
import kd.cd.common.util.DynamicObjectUtils;
|
|
23
|
+
import kd.cd.core.util.BigDecimalUtils;
|
|
24
|
+
|
|
25
|
+
import java.math.BigDecimal;
|
|
26
|
+
import java.math.RoundingMode;
|
|
27
|
+
|
|
28
|
+
public class EntryRowCalculateSample extends AbstractFormPluginExt {
|
|
29
|
+
private static final String ENTRY_KEY = "billentry";
|
|
30
|
+
private static final String FIELD_QTY = "qty";
|
|
31
|
+
private static final String FIELD_PRICE = "price";
|
|
32
|
+
private static final String FIELD_TAX_RATE = "taxrate";
|
|
33
|
+
private static final String FIELD_AMOUNT = "amount";
|
|
34
|
+
private static final String FIELD_TAX_AMOUNT = "taxamount";
|
|
35
|
+
private static final String FIELD_TOTAL_QTY = "totalqty";
|
|
36
|
+
private static final String FIELD_TOTAL_AMOUNT = "totalamount";
|
|
37
|
+
private static final String FIELD_TOTAL_TAX_AMOUNT = "totaltaxamount";
|
|
38
|
+
|
|
39
|
+
// --- 数量/单价/税率变化后,只重算当前行,再刷新表头汇总 ---
|
|
40
|
+
@Override
|
|
41
|
+
public void propertyChanged(PropertyChangedArgs e) {
|
|
42
|
+
super.propertyChanged(e);
|
|
43
|
+
String fieldKey = e.getProperty().getName();
|
|
44
|
+
if (!isCalcField(fieldKey)) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
int rowIndex = getChangedRowIndex(e);
|
|
48
|
+
recalcEntryRow(rowIndex);
|
|
49
|
+
recalcEntrySummary();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// --- 新增分录后初始化默认值,并刷新表头汇总 ---
|
|
53
|
+
@Override
|
|
54
|
+
public void afterAddRow(AfterAddRowEventArgs e) {
|
|
55
|
+
super.afterAddRow(e);
|
|
56
|
+
if (ENTRY_KEY.equals(e.getEntryProp().getName())) {
|
|
57
|
+
int rowIndex = getModel().getEntryCurrentRowIndex(ENTRY_KEY);
|
|
58
|
+
getModel().beginInit();
|
|
59
|
+
getModel().setValue(FIELD_QTY, BigDecimal.ZERO, rowIndex);
|
|
60
|
+
getModel().setValue(FIELD_PRICE, BigDecimal.ZERO, rowIndex);
|
|
61
|
+
getModel().setValue(FIELD_TAX_RATE, BigDecimal.ZERO, rowIndex);
|
|
62
|
+
getModel().setValue(FIELD_AMOUNT, BigDecimal.ZERO, rowIndex);
|
|
63
|
+
getModel().setValue(FIELD_TAX_AMOUNT, BigDecimal.ZERO, rowIndex);
|
|
64
|
+
getModel().endInit();
|
|
65
|
+
recalcEntrySummary();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// --- 删除分录后触发重算 ---
|
|
70
|
+
@Override
|
|
71
|
+
public void afterDeleteRow(AfterDeleteRowEventArgs e) {
|
|
72
|
+
super.afterDeleteRow(e);
|
|
73
|
+
if (ENTRY_KEY.equals(e.getEntryProp().getName())) {
|
|
74
|
+
recalcEntrySummary();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private boolean isCalcField(String fieldKey) {
|
|
79
|
+
return FIELD_QTY.equals(fieldKey)
|
|
80
|
+
|| FIELD_PRICE.equals(fieldKey)
|
|
81
|
+
|| FIELD_TAX_RATE.equals(fieldKey);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// --- 当前行金额、税额联动 ---
|
|
85
|
+
private void recalcEntryRow(int rowIndex) {
|
|
86
|
+
BigDecimal qty = BigDecimalUtils.nullToZero((BigDecimal) getModel().getValue(FIELD_QTY, rowIndex));
|
|
87
|
+
BigDecimal price = BigDecimalUtils.nullToZero((BigDecimal) getModel().getValue(FIELD_PRICE, rowIndex));
|
|
88
|
+
BigDecimal taxRate = BigDecimalUtils.nullToZero((BigDecimal) getModel().getValue(FIELD_TAX_RATE, rowIndex));
|
|
89
|
+
|
|
90
|
+
BigDecimal amount = BigDecimalUtils.multiply(qty, price).setScale(2, RoundingMode.HALF_UP);
|
|
91
|
+
BigDecimal taxAmount = BigDecimalUtils.divide(
|
|
92
|
+
BigDecimalUtils.multiply(amount, taxRate),
|
|
93
|
+
BigDecimalUtils.valueOf(100),
|
|
94
|
+
2,
|
|
95
|
+
RoundingMode.HALF_UP
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
getModel().beginInit();
|
|
99
|
+
getModel().setValue(FIELD_AMOUNT, amount, rowIndex);
|
|
100
|
+
getModel().setValue(FIELD_TAX_AMOUNT, taxAmount, rowIndex);
|
|
101
|
+
getModel().endInit();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// --- 表头汇总 ---
|
|
105
|
+
private void recalcEntrySummary() {
|
|
106
|
+
DynamicObjectCollection entryRows = getModel().getEntryEntity(ENTRY_KEY);
|
|
107
|
+
|
|
108
|
+
BigDecimal totalQty = DynamicObjectUtils.sumOf(entryRows, FIELD_QTY);
|
|
109
|
+
BigDecimal totalAmount = DynamicObjectUtils.sumOf(entryRows, FIELD_AMOUNT);
|
|
110
|
+
BigDecimal totalTaxAmount = DynamicObjectUtils.sumOf(entryRows, FIELD_TAX_AMOUNT);
|
|
111
|
+
|
|
112
|
+
getModel().setValue(FIELD_TOTAL_QTY, totalQty);
|
|
113
|
+
getModel().setValue(FIELD_TOTAL_AMOUNT, totalAmount);
|
|
114
|
+
getModel().setValue(FIELD_TOTAL_TAX_AMOUNT, totalTaxAmount);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F7(基础资料选择控件)过滤条件示例。
|
|
3
|
+
* <p>
|
|
4
|
+
* 适用插件:表单插件、单据插件
|
|
5
|
+
* 优先封装:DynamicObjectUtils、EntityUtils
|
|
6
|
+
* 原生兜底:BeforeF7SelectEvent、ListShowParameter、QFilter
|
|
7
|
+
* 相关 lint 规则:SCENE-005、STYLE-013
|
|
8
|
+
* <p>
|
|
9
|
+
* 使用场景:
|
|
10
|
+
* 1. 打开 F7 前,按当前组织、行物料、启用/审核状态动态过滤可选数据;
|
|
11
|
+
* 2. 按当前体系切换特殊 F7 页面,并注入模型/维度 customParams;
|
|
12
|
+
* 3. 回显当前已选数据、控制是否展示未审核数据、是否开启多选;
|
|
13
|
+
* 4. 个别字段需要关闭系统默认 QFilter;
|
|
14
|
+
* 5. 区分表头字段 F7 与分录字段 F7 的过滤来源。
|
|
15
|
+
*/
|
|
16
|
+
package kd.cd.common.snippets.form;
|
|
17
|
+
|
|
18
|
+
import kd.bos.dataentity.entity.DynamicObject;
|
|
19
|
+
import kd.bos.dataentity.resource.ResManager;
|
|
20
|
+
import kd.bos.form.FormShowParameter;
|
|
21
|
+
import kd.bos.form.field.events.BeforeF7SelectEvent;
|
|
22
|
+
import kd.bos.list.ListShowParameter;
|
|
23
|
+
import kd.bos.orm.query.QCP;
|
|
24
|
+
import kd.bos.orm.query.QFilter;
|
|
25
|
+
import kd.cd.common.entity.EntityUtils;
|
|
26
|
+
import kd.cd.common.plugin.AbstractFormPluginExt;
|
|
27
|
+
import kd.cd.common.util.DynamicObjectUtils;
|
|
28
|
+
|
|
29
|
+
import java.util.EventObject;
|
|
30
|
+
import java.util.List;
|
|
31
|
+
|
|
32
|
+
public class F7FilterSample extends AbstractFormPluginExt {
|
|
33
|
+
private static final String FIELD_ORG = "org";
|
|
34
|
+
private static final String FIELD_MATERIAL = "material";
|
|
35
|
+
private static final String FIELD_SUPPLIER = "supplier";
|
|
36
|
+
private static final String FIELD_MODEL = "kdcd_model";
|
|
37
|
+
private static final String FIELD_YEAR = "kdcd_year";
|
|
38
|
+
private static final String FIELD_PERIOD = "kdcd_period";
|
|
39
|
+
private static final String SPECIAL_MEMBER_F7_FORM_ID = "bcm_mulmemberf7base_tem";
|
|
40
|
+
private static final String FIELD_ENABLE = "enable";
|
|
41
|
+
private static final String FIELD_STATUS = "status";
|
|
42
|
+
private static final String FIELD_CREATE_ORG_ID = "createorg.id";
|
|
43
|
+
private static final String FIELD_MATERIAL_MASTER_ID = "masterid.id";
|
|
44
|
+
private static final String RES_APP_ID = "kd-cd-common-snippets";
|
|
45
|
+
|
|
46
|
+
// --- 在 registerListener 中注册 F7 监听 ---
|
|
47
|
+
@Override
|
|
48
|
+
public void registerListener(EventObject e) {
|
|
49
|
+
super.registerListener(e);
|
|
50
|
+
addBeforeF7SelectListeners(FIELD_MATERIAL, FIELD_SUPPLIER, FIELD_MODEL, FIELD_YEAR, FIELD_PERIOD);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// --- 打开 F7 前按业务条件加过滤 ---
|
|
54
|
+
@Override
|
|
55
|
+
public void beforeF7Select(BeforeF7SelectEvent e) {
|
|
56
|
+
super.beforeF7Select(e);
|
|
57
|
+
String fieldKey = e.getProperty().getName();
|
|
58
|
+
if (FIELD_MATERIAL.equals(fieldKey)) {
|
|
59
|
+
Object orgId = resolveOrgId();
|
|
60
|
+
if (EntityUtils.isEmptyPk(orgId)) {
|
|
61
|
+
e.setCancel(true);
|
|
62
|
+
getView().showTipNotification(ResManager.loadKDString("请先选择组织", "F7FilterSample_0", RES_APP_ID));
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
List<QFilter> filters = e.getCustomQFilters();
|
|
67
|
+
appendEnabledApprovedFilters(filters);
|
|
68
|
+
filters.add(new QFilter(FIELD_CREATE_ORG_ID, QCP.equals, orgId));
|
|
69
|
+
|
|
70
|
+
ListShowParameter showParameter = (ListShowParameter) e.getFormShowParameter();
|
|
71
|
+
configureShowParameter(showParameter, false);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (FIELD_SUPPLIER.equals(fieldKey)) {
|
|
76
|
+
int rowIndex = e.getRow();
|
|
77
|
+
DynamicObject material = (DynamicObject) getModel().getValue(FIELD_MATERIAL, rowIndex);
|
|
78
|
+
Object materialMasterId = DynamicObjectUtils.nullSafeGet(material, FIELD_MATERIAL_MASTER_ID);
|
|
79
|
+
if (EntityUtils.isEmptyPk(materialMasterId)) {
|
|
80
|
+
e.setCancel(true);
|
|
81
|
+
getView().showTipNotification(ResManager.loadKDString("请先选择当前行物料", "F7FilterSample_1", RES_APP_ID));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
Object orgId = resolveOrgId();
|
|
86
|
+
|
|
87
|
+
ListShowParameter showParameter = (ListShowParameter) e.getFormShowParameter();
|
|
88
|
+
List<QFilter> filters = showParameter.getListFilterParameter().getQFilters();
|
|
89
|
+
filters.add(new QFilter(FIELD_ENABLE, QCP.equals, true));
|
|
90
|
+
filters.add(new QFilter("forbidstatus", QCP.not_equals, "B"));
|
|
91
|
+
filters.add(new QFilter("suppliermaterial.material.masterid.id", QCP.equals, materialMasterId));
|
|
92
|
+
if (!EntityUtils.isEmptyPk(orgId)) {
|
|
93
|
+
filters.add(new QFilter(FIELD_CREATE_ORG_ID, QCP.equals, orgId));
|
|
94
|
+
}
|
|
95
|
+
configureShowParameter(showParameter, true);
|
|
96
|
+
|
|
97
|
+
Object supplierId = DynamicObjectUtils.nullSafeGet((DynamicObject) getModel().getValue(FIELD_SUPPLIER, rowIndex), "id");
|
|
98
|
+
if (EntityUtils.isNotEmptyPk(supplierId)) {
|
|
99
|
+
showParameter.setSelectedRow(supplierId);
|
|
100
|
+
showParameter.setSelectedRows(new Object[]{supplierId});
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (FIELD_MODEL.equals(fieldKey)) {
|
|
106
|
+
FormShowParameter formShowParameter = e.getFormShowParameter();
|
|
107
|
+
formShowParameter.setFormId(SPECIAL_MEMBER_F7_FORM_ID);
|
|
108
|
+
formShowParameter.setCustomParam("noNeedDefaultQFilter", true);
|
|
109
|
+
formShowParameter.setCustomParam("mutilentity", "[]");
|
|
110
|
+
formShowParameter.setCustomParam("sign", FIELD_MODEL);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (FIELD_YEAR.equals(fieldKey) || FIELD_PERIOD.equals(fieldKey)) {
|
|
115
|
+
ListShowParameter showParameter = (ListShowParameter) e.getFormShowParameter();
|
|
116
|
+
appendEnabledApprovedFilters(showParameter.getListFilterParameter().getQFilters());
|
|
117
|
+
configureShowParameter(showParameter, false);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private void appendEnabledApprovedFilters(List<QFilter> filters) {
|
|
122
|
+
filters.add(new QFilter(FIELD_ENABLE, QCP.equals, true));
|
|
123
|
+
filters.add(new QFilter(FIELD_STATUS, QCP.equals, "C"));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private Object resolveOrgId() {
|
|
127
|
+
return DynamicObjectUtils.nullSafeGet(getValue(FIELD_ORG), "id");
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
private void configureShowParameter(ListShowParameter showParameter, boolean multiSelect) {
|
|
131
|
+
showParameter.setShowApproved(false);
|
|
132
|
+
showParameter.setMultiSelect(multiSelect);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 表单模型取值/赋值示例。
|
|
3
|
+
* <p>
|
|
4
|
+
* 适用插件:表单插件、单据插件
|
|
5
|
+
* 优先封装:DynamicObjectUtils
|
|
6
|
+
* 原生兜底:IDataModel、BusinessDataServiceHelper
|
|
7
|
+
* 相关 lint 规则:SCENE-008、STYLE-006
|
|
8
|
+
* <p>
|
|
9
|
+
* 使用场景:
|
|
10
|
+
* 1. 表头 / 单据体 / 子单据体按行读取
|
|
11
|
+
* 2. 基础资料属性值、多选基础资料读取
|
|
12
|
+
* 3. 基础资料按对象、按 ID、按编码回写
|
|
13
|
+
* 4. 批量造行、子单据体造行、静默初始化
|
|
14
|
+
*/
|
|
15
|
+
package kd.cd.common.snippets.form;
|
|
16
|
+
|
|
17
|
+
import kd.bos.context.RequestContext;
|
|
18
|
+
import kd.bos.dataentity.entity.DynamicObject;
|
|
19
|
+
import kd.bos.dataentity.entity.DynamicObjectCollection;
|
|
20
|
+
import kd.bos.dataentity.entity.MulBasedataDynamicObjectCollection;
|
|
21
|
+
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
|
22
|
+
import kd.cd.common.entity.EntityUtils;
|
|
23
|
+
import kd.cd.common.plugin.AbstractFormPluginExt;
|
|
24
|
+
import kd.cd.common.util.DynamicObjectUtils;
|
|
25
|
+
import kd.cd.core.util.BigDecimalUtils;
|
|
26
|
+
import kd.cd.core.util.CollectionUtils;
|
|
27
|
+
|
|
28
|
+
import java.math.BigDecimal;
|
|
29
|
+
|
|
30
|
+
public class GetAndSetValueSample extends AbstractFormPluginExt {
|
|
31
|
+
private static final String BOS_USER = "bos_user";
|
|
32
|
+
private static final String FIELD_REMARK = "kdtest_remark";
|
|
33
|
+
private static final String FIELD_REGISTRANT = "kdtest_registrant";
|
|
34
|
+
private static final String FIELD_REGISTRANT_BIRTHDAY = "birthday";
|
|
35
|
+
private static final String FIELD_APPROVERS = "kdtest_approvers";
|
|
36
|
+
private static final String ENTRY_KEY = "kdtest_reqentryentity";
|
|
37
|
+
private static final String FIELD_QTY = "kdtest_qtyfield";
|
|
38
|
+
private static final String FIELD_MATERIAL = "kdtest_materielfield";
|
|
39
|
+
private static final String SUBENTRY_KEY = "kdtest_subentryentity";
|
|
40
|
+
private static final String FIELD_SUB_DESC = "kdtest_subdesc";
|
|
41
|
+
|
|
42
|
+
// ==================== 场景1:表单读值 ====================
|
|
43
|
+
|
|
44
|
+
public void readHeaderEntryAndSubEntryValues() {
|
|
45
|
+
String remark = (String) getModel().getValue(FIELD_REMARK);
|
|
46
|
+
|
|
47
|
+
DynamicObject registrant = (DynamicObject) getModel().getValue(FIELD_REGISTRANT);
|
|
48
|
+
Object registrantId = DynamicObjectUtils.nullSafeGet(registrant, FIELD_REGISTRANT + ".id");
|
|
49
|
+
String registrantName = DynamicObjectUtils.nullSafeGet(registrant, FIELD_REGISTRANT + ".name");
|
|
50
|
+
|
|
51
|
+
int rowCount = getModel().getEntryRowCount(ENTRY_KEY);
|
|
52
|
+
for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) {
|
|
53
|
+
BigDecimal qty = (BigDecimal) getModel().getValue(FIELD_QTY, rowIndex);
|
|
54
|
+
DynamicObject material = (DynamicObject) getModel().getValue(FIELD_MATERIAL, rowIndex);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
DynamicObjectCollection entryRows = getModel().getEntryEntity(ENTRY_KEY);
|
|
58
|
+
for (DynamicObject row : entryRows) {
|
|
59
|
+
BigDecimal qty = row.getBigDecimal(FIELD_QTY);
|
|
60
|
+
DynamicObjectCollection subRows = row.getDynamicObjectCollection(SUBENTRY_KEY);
|
|
61
|
+
for (DynamicObject subRow : subRows) {
|
|
62
|
+
String subDesc = subRow.getString(FIELD_SUB_DESC);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public String loadRegistrantBirthday() {
|
|
68
|
+
DynamicObject registrant = (DynamicObject) getModel().getValue(FIELD_REGISTRANT);
|
|
69
|
+
if (EntityUtils.isEmptyPk(registrant)) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
DynamicObject user = BusinessDataServiceHelper.loadSingleFromCache(
|
|
74
|
+
registrant.getPkValue(),
|
|
75
|
+
BOS_USER,
|
|
76
|
+
FIELD_REGISTRANT_BIRTHDAY
|
|
77
|
+
);
|
|
78
|
+
return DynamicObjectUtils.nullSafeGet(user, FIELD_REGISTRANT_BIRTHDAY);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public int countSelectedApprovers() {
|
|
82
|
+
MulBasedataDynamicObjectCollection approvers =
|
|
83
|
+
(MulBasedataDynamicObjectCollection) getModel().getValue(FIELD_APPROVERS);
|
|
84
|
+
return CollectionUtils.isEmpty(approvers) ? 0 : approvers.size();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// ==================== 场景2:表头 / 基础资料赋值 ====================
|
|
88
|
+
|
|
89
|
+
public void fillDefaultHeaderAndBaseData() {
|
|
90
|
+
getModel().setValue(FIELD_REMARK, "备注字段默认值");
|
|
91
|
+
|
|
92
|
+
DynamicObject currentUser = BusinessDataServiceHelper.loadSingleFromCache(
|
|
93
|
+
RequestContext.get().getCurrUserId(),
|
|
94
|
+
BOS_USER,
|
|
95
|
+
"id,number,name"
|
|
96
|
+
);
|
|
97
|
+
if (currentUser != null) {
|
|
98
|
+
getModel().setValue(FIELD_REGISTRANT, currentUser);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
getModel().setItemValueByID(FIELD_REGISTRANT, RequestContext.get().getCurrUserId());
|
|
102
|
+
getModel().setItemValueByNumber(FIELD_REGISTRANT, "ID-000002");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// ==================== 场景3:批量造行 ====================
|
|
106
|
+
|
|
107
|
+
public void rebuildEntryRowsByTemplate() {
|
|
108
|
+
getModel().deleteEntryData(ENTRY_KEY);
|
|
109
|
+
|
|
110
|
+
DynamicObjectCollection entryRows = getModel().getEntryEntity(ENTRY_KEY);
|
|
111
|
+
DynamicObject template = new DynamicObject(entryRows.getDynamicObjectType());
|
|
112
|
+
template.set(FIELD_QTY, BigDecimal.ZERO);
|
|
113
|
+
int[] rowIndexes = getModel().batchCreateNewEntryRow(ENTRY_KEY, template, 2);
|
|
114
|
+
for (int i = 0; i < rowIndexes.length; i++) {
|
|
115
|
+
int rowIndex = rowIndexes[i];
|
|
116
|
+
getModel().setValue(
|
|
117
|
+
FIELD_QTY,
|
|
118
|
+
BigDecimalUtils.multiply(BigDecimalUtils.valueOf(10), BigDecimalUtils.valueOf(i + 1L)),
|
|
119
|
+
rowIndex
|
|
120
|
+
);
|
|
121
|
+
getModel().setItemValueByNumber(FIELD_MATERIAL, "M000" + (i + 1), rowIndex);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
public void appendEntryRowByObject() {
|
|
126
|
+
DynamicObjectCollection entryRows = getModel().getEntryEntity(ENTRY_KEY);
|
|
127
|
+
DynamicObject row = entryRows.addNew();
|
|
128
|
+
row.set(FIELD_QTY, BigDecimalUtils.valueOf(1));
|
|
129
|
+
// 基础资料赋值方式1:从缓存加载基础资料对象后再 set
|
|
130
|
+
DynamicObject supplier = BusinessDataServiceHelper.loadSingleFromCache(10001L, "bd_supplier", "id");
|
|
131
|
+
if (supplier != null) {
|
|
132
|
+
row.set("kdtest_supplier", supplier);
|
|
133
|
+
}
|
|
134
|
+
// 基础资料赋值方式2:可直接 set "字段标识_id" 进行 ID 赋值
|
|
135
|
+
row.set("kdtest_supplier_id", 10001L);
|
|
136
|
+
int rowIndex = getModel().createNewEntryRow(ENTRY_KEY, row);
|
|
137
|
+
getModel().setItemValueByNumber(FIELD_MATERIAL, "M0001", rowIndex);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public void appendSubEntryRow(int parentRowIndex) {
|
|
141
|
+
getModel().setEntryCurrentRowIndex(ENTRY_KEY, parentRowIndex);
|
|
142
|
+
int rowIndex = getModel().createNewEntryRow(SUBENTRY_KEY);
|
|
143
|
+
getModel().setValue(FIELD_SUB_DESC, "子单据体默认值", rowIndex);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
public void appendApprover(Object userId) {
|
|
147
|
+
MulBasedataDynamicObjectCollection approvers = (MulBasedataDynamicObjectCollection) getModel().getValue(FIELD_APPROVERS);
|
|
148
|
+
if (CollectionUtils.isEmpty(approvers) || EntityUtils.isEmptyPk(userId)) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
DynamicObject row = approvers.addNew();
|
|
153
|
+
DynamicObject user = DynamicObjectUtils.newDynamicObject(BOS_USER);
|
|
154
|
+
user.set("id", userId);
|
|
155
|
+
row.set("fbasedataid", user);
|
|
156
|
+
getModel().setValue(FIELD_APPROVERS, approvers);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ==================== 场景4:静默初始化 / 直接改数据包 ====================
|
|
160
|
+
|
|
161
|
+
public void silentSetRemark(String remark) {
|
|
162
|
+
getModel().beginInit();
|
|
163
|
+
getModel().setValue(FIELD_REMARK, remark);
|
|
164
|
+
getModel().endInit();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* 直接改数据包不会触发 propertyChanged,适合导入回填、批量矫正、静默初始化。
|
|
169
|
+
*/
|
|
170
|
+
public void appendEntryRowSilently() {
|
|
171
|
+
DynamicObjectCollection entryRows = getModel().getDataEntity(true).getDynamicObjectCollection(ENTRY_KEY);
|
|
172
|
+
DynamicObject newRow = entryRows.addNew();
|
|
173
|
+
newRow.set(FIELD_QTY, BigDecimalUtils.valueOf(30));
|
|
174
|
+
getView().updateView(ENTRY_KEY);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 超链接点击跳转示例(分录 + 列表)。
|
|
3
|
+
* <p>
|
|
4
|
+
* 适用插件:表单插件、报表插件
|
|
5
|
+
* 优先封装:ShowParameterUtils
|
|
6
|
+
* 原生兜底:EntryGrid.addHyperClickListener、ReportList.addHyperClickListener、HyperLinkClickListener
|
|
7
|
+
* 相关 lint 规则:STYLE-015
|
|
8
|
+
* <p>
|
|
9
|
+
* 使用场景:
|
|
10
|
+
* 1. 分录字段配置为超链接,点击跳转到关联单据;
|
|
11
|
+
* 2. 报表/列表字段配置为超链接,点击查看详情单据。
|
|
12
|
+
*/
|
|
13
|
+
package kd.cd.common.snippets.form;
|
|
14
|
+
|
|
15
|
+
import kd.bos.bill.BillShowParameter;
|
|
16
|
+
import kd.bos.bill.OperationStatus;
|
|
17
|
+
import kd.bos.dataentity.entity.DynamicObject;
|
|
18
|
+
import kd.bos.report.ReportList;
|
|
19
|
+
import kd.bos.form.ShowType;
|
|
20
|
+
import kd.bos.form.control.EntryGrid;
|
|
21
|
+
import kd.bos.form.events.HyperLinkClickEvent;
|
|
22
|
+
import kd.bos.form.events.HyperLinkClickListener;
|
|
23
|
+
import kd.bos.orm.query.QCP;
|
|
24
|
+
import kd.bos.orm.query.QFilter;
|
|
25
|
+
import kd.bos.report.plugin.AbstractReportFormPlugin;
|
|
26
|
+
import kd.bos.servicehelper.QueryServiceHelper;
|
|
27
|
+
import kd.cd.common.form.ShowParameterUtils;
|
|
28
|
+
import kd.cd.common.plugin.AbstractFormPluginExt;
|
|
29
|
+
|
|
30
|
+
import java.util.EventObject;
|
|
31
|
+
|
|
32
|
+
public class HyperlinkJumpSample {
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 分录超链接点击:在 EntryGrid 上注册超链接事件。
|
|
36
|
+
* 控件/字段 key 请替换为你的实际配置。
|
|
37
|
+
*/
|
|
38
|
+
public static class EntryHyperlinkFormPlugin extends AbstractFormPluginExt implements HyperLinkClickListener {
|
|
39
|
+
private static final String ENTRY_KEY = "entryentity";
|
|
40
|
+
private static final String ENTRY_LINK_FIELD = "billno";
|
|
41
|
+
private static final String ENTRY_BASEDATA_FIELD_ID = "supplier_id";
|
|
42
|
+
private static final String TARGET_FORM_ID = "your_bill_form_id";
|
|
43
|
+
|
|
44
|
+
@Override
|
|
45
|
+
public void registerListener(EventObject e) {
|
|
46
|
+
super.registerListener(e);
|
|
47
|
+
this.addHyperClickListeners(ENTRY_KEY);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@Override
|
|
51
|
+
public void hyperLinkClick(HyperLinkClickEvent event) {
|
|
52
|
+
if (!ENTRY_LINK_FIELD.equals(event.getFieldName())) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
DynamicObject row = this.getModel().getEntryRowEntity(ENTRY_KEY, event.getRowIndex());
|
|
56
|
+
if (row == null) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
String billNo = row.getString(ENTRY_LINK_FIELD);
|
|
60
|
+
DynamicObject target = QueryServiceHelper.queryOne(
|
|
61
|
+
TARGET_FORM_ID,
|
|
62
|
+
"id",
|
|
63
|
+
new QFilter[]{new QFilter("billno", QCP.equals, billNo)}
|
|
64
|
+
);
|
|
65
|
+
if (target == null) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
BillShowParameter showParameter = ShowParameterUtils.getBill(
|
|
69
|
+
TARGET_FORM_ID,
|
|
70
|
+
target.getLong("id"),
|
|
71
|
+
OperationStatus.VIEW,
|
|
72
|
+
ShowType.Modal
|
|
73
|
+
);
|
|
74
|
+
this.getView().showForm(showParameter);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* 报表/列表超链接点击:在 ReportList 上注册超链接事件。
|
|
80
|
+
* 控件/字段 key 请替换为你的实际配置。
|
|
81
|
+
*/
|
|
82
|
+
public static class ReportHyperlinkFormPlugin extends AbstractReportFormPlugin implements HyperLinkClickListener {
|
|
83
|
+
private static final String REPORT_LIST_KEY = "reportlistap";
|
|
84
|
+
private static final String REPORT_LINK_FIELD = "billno";
|
|
85
|
+
private static final String TARGET_FORM_ID = "your_bill_form_id";
|
|
86
|
+
|
|
87
|
+
@Override
|
|
88
|
+
public void registerListener(EventObject e) {
|
|
89
|
+
super.registerListener(e);
|
|
90
|
+
ReportList reportList = this.getView().getControl(REPORT_LIST_KEY);
|
|
91
|
+
if (reportList != null) {
|
|
92
|
+
reportList.addHyperClickListener(this);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
@Override
|
|
97
|
+
public void hyperLinkClick(HyperLinkClickEvent event) {
|
|
98
|
+
if (!REPORT_LINK_FIELD.equals(event.getFieldName())) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
int rowIndex = event.getRowIndex();
|
|
102
|
+
ReportList reportList = this.getView().getControl(REPORT_LIST_KEY);
|
|
103
|
+
Object billNo = reportList.getReportModel().getRowData(rowIndex).get(REPORT_LINK_FIELD);
|
|
104
|
+
if (billNo == null) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
DynamicObject target = QueryServiceHelper.queryOne(
|
|
108
|
+
TARGET_FORM_ID,
|
|
109
|
+
"id",
|
|
110
|
+
new QFilter[]{new QFilter("billno", QCP.equals, billNo)}
|
|
111
|
+
);
|
|
112
|
+
if (target == null) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
BillShowParameter showParameter = ShowParameterUtils.getBill(
|
|
116
|
+
TARGET_FORM_ID,
|
|
117
|
+
target.getLong("id"),
|
|
118
|
+
OperationStatus.VIEW,
|
|
119
|
+
ShowType.MainNewTabPage
|
|
120
|
+
);
|
|
121
|
+
this.getView().showForm(showParameter);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|