weaver-e10-builder 1.6.9 → 1.6.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/form-data.d.ts.map +1 -1
- package/dist/commands/form-data.js +4 -1
- package/dist/commands/form-data.js.map +1 -1
- package/dist/commands/report-admin.d.ts.map +1 -1
- package/dist/commands/report-admin.js +378 -2
- package/dist/commands/report-admin.js.map +1 -1
- package/dist/commands/report-validate.d.ts.map +1 -1
- package/dist/commands/report-validate.js +1066 -3
- package/dist/commands/report-validate.js.map +1 -1
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +341 -3
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/workflow-after-submit-comment.d.ts +3 -0
- package/dist/commands/workflow-after-submit-comment.d.ts.map +1 -0
- package/dist/commands/workflow-after-submit-comment.js +56 -0
- package/dist/commands/workflow-after-submit-comment.js.map +1 -0
- package/dist/commands/workflow-setting.d.ts.map +1 -1
- package/dist/commands/workflow-setting.js +2 -67
- package/dist/commands/workflow-setting.js.map +1 -1
- package/dist/services/action-detail.d.ts.map +1 -1
- package/dist/services/action-detail.js +1 -17
- package/dist/services/action-detail.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.js +6 -2
- package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
- package/dist/services/actionflow/components/custom_trigger.js +1 -1
- package/dist/services/actionflow/components/custom_trigger.js.map +1 -1
- package/dist/services/actionflow/components/dml_execute.js +1 -1
- package/dist/services/actionflow/components/dml_execute.js.map +1 -1
- package/dist/services/actionflow/components/document_actions.js +1 -2
- package/dist/services/actionflow/components/document_actions.js.map +1 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.d.ts.map +1 -1
- package/dist/services/actionflow/components/eb_get_data_by_id.js +2 -2
- package/dist/services/actionflow/components/eb_get_data_by_id.js.map +1 -1
- package/dist/services/actionflow/components/form_data_builder.d.ts.map +1 -1
- package/dist/services/actionflow/components/form_data_builder.js +18 -10
- package/dist/services/actionflow/components/form_data_builder.js.map +1 -1
- package/dist/services/actionflow/components/hrm_actions.js +0 -1
- package/dist/services/actionflow/components/hrm_actions.js.map +1 -1
- package/dist/services/actionflow/components/webhook_trigger.js +3 -3
- package/dist/services/actionflow/components/webhook_trigger.js.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.js +3 -2
- package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
- package/dist/services/actionflow/filter_rules.d.ts.map +1 -1
- package/dist/services/actionflow/filter_rules.js +15 -13
- package/dist/services/actionflow/filter_rules.js.map +1 -1
- package/dist/services/actionflow/form_source.d.ts.map +1 -1
- package/dist/services/actionflow/form_source.js +59 -11
- package/dist/services/actionflow/form_source.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +4 -1
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/option_field_types.d.ts +5 -0
- package/dist/services/actionflow/option_field_types.d.ts.map +1 -0
- package/dist/services/actionflow/option_field_types.js +20 -0
- package/dist/services/actionflow/option_field_types.js.map +1 -0
- package/dist/services/actionflow/param_group_dto.d.ts.map +1 -1
- package/dist/services/actionflow/param_group_dto.js +7 -3
- package/dist/services/actionflow/param_group_dto.js.map +1 -1
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +42 -18
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/webhook_source.d.ts.map +1 -1
- package/dist/services/actionflow/webhook_source.js +9 -4
- package/dist/services/actionflow/webhook_source.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +11 -8
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/report/blueprint.d.ts +109 -0
- package/dist/services/report/blueprint.d.ts.map +1 -0
- package/dist/services/report/blueprint.js +322 -0
- package/dist/services/report/blueprint.js.map +1 -0
- package/dist/services/report/build.d.ts.map +1 -1
- package/dist/services/report/build.js +8 -3
- package/dist/services/report/build.js.map +1 -1
- package/dist/services/report/card.d.ts +65 -0
- package/dist/services/report/card.d.ts.map +1 -0
- package/dist/services/report/card.js +151 -0
- package/dist/services/report/card.js.map +1 -0
- package/dist/services/report/copy-health.d.ts +31 -0
- package/dist/services/report/copy-health.d.ts.map +1 -0
- package/dist/services/report/copy-health.js +87 -0
- package/dist/services/report/copy-health.js.map +1 -0
- package/dist/services/report/dataset-heal.d.ts +64 -0
- package/dist/services/report/dataset-heal.d.ts.map +1 -0
- package/dist/services/report/dataset-heal.js +89 -0
- package/dist/services/report/dataset-heal.js.map +1 -0
- package/dist/services/report/dataset-ids.d.ts +70 -0
- package/dist/services/report/dataset-ids.d.ts.map +1 -0
- package/dist/services/report/dataset-ids.js +149 -0
- package/dist/services/report/dataset-ids.js.map +1 -0
- package/dist/services/report/dataset.d.ts.map +1 -1
- package/dist/services/report/dataset.js +3 -1
- package/dist/services/report/dataset.js.map +1 -1
- package/dist/services/report/empty-dataset.d.ts +51 -0
- package/dist/services/report/empty-dataset.d.ts.map +1 -0
- package/dist/services/report/empty-dataset.js +213 -0
- package/dist/services/report/empty-dataset.js.map +1 -0
- package/dist/services/report/field-binding.d.ts +75 -0
- package/dist/services/report/field-binding.d.ts.map +1 -0
- package/dist/services/report/field-binding.js +160 -0
- package/dist/services/report/field-binding.js.map +1 -0
- package/dist/services/report/forms.d.ts +32 -0
- package/dist/services/report/forms.d.ts.map +1 -1
- package/dist/services/report/forms.js +90 -0
- package/dist/services/report/forms.js.map +1 -1
- package/dist/services/report/formula-parent.d.ts +25 -0
- package/dist/services/report/formula-parent.d.ts.map +1 -0
- package/dist/services/report/formula-parent.js +116 -0
- package/dist/services/report/formula-parent.js.map +1 -0
- package/dist/services/report/locate.d.ts +40 -0
- package/dist/services/report/locate.d.ts.map +1 -0
- package/dist/services/report/locate.js +122 -0
- package/dist/services/report/locate.js.map +1 -0
- package/dist/services/report/reports.d.ts +4 -0
- package/dist/services/report/reports.d.ts.map +1 -1
- package/dist/services/report/reports.js +4 -2
- package/dist/services/report/reports.js.map +1 -1
- package/dist/services/report/scene.d.ts +22 -0
- package/dist/services/report/scene.d.ts.map +1 -0
- package/dist/services/report/scene.js +145 -0
- package/dist/services/report/scene.js.map +1 -0
- package/dist/services/report/types.d.ts +28 -0
- package/dist/services/report/types.d.ts.map +1 -1
- package/dist/services/report/verify.d.ts +24 -0
- package/dist/services/report/verify.d.ts.map +1 -1
- package/dist/services/report/verify.js +115 -2
- package/dist/services/report/verify.js.map +1 -1
- package/dist/services/report/workbook.d.ts +12 -1
- package/dist/services/report/workbook.d.ts.map +1 -1
- package/dist/services/report/workbook.js +107 -8
- package/dist/services/report/workbook.js.map +1 -1
- package/dist/services/workflow-after-submit-comment.d.ts +20 -0
- package/dist/services/workflow-after-submit-comment.d.ts.map +1 -0
- package/dist/services/workflow-after-submit-comment.js +81 -0
- package/dist/services/workflow-after-submit-comment.js.map +1 -0
- package/ecodecmd/src/build.js +36 -12
- package/package.json +1 -1
- package/skill-docs/SKILL.md +4 -4
- package/skill-docs/_catalog.md +10 -1
- package/skill-docs/actionflows/SKILL.md +1 -0
- package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +2 -2
- package/skill-docs/actionflows/references/components/trigger/CustomTrigger.md +2 -0
- package/skill-docs/actionflows/references/components/trigger/WebHookTrigger.md +19 -1
- package/skill-docs/references/coding/guide-form-crud.md +2 -0
- package/skill-docs/references/coding/guide-page-code.md +108 -0
- package/skill-docs/references/components/ref-component-common.md +98 -0
- package/skill-docs/references/report/add-dataset-registration-guide.md +44 -22
- package/skill-docs/references/report/advanced-crosstab-tree-guide.md +82 -0
- package/skill-docs/references/report/ai-report-workflow.md +100 -100
- package/skill-docs/references/report/api-auth-headers.md +129 -0
- package/skill-docs/references/report/api-report-build-fast-path.md +274 -275
- package/skill-docs/references/report/app-datasource-lookup-guide.md +230 -230
- package/skill-docs/references/report/branch-scene-guide.md +293 -0
- package/skill-docs/references/report/build-resilience-guide.md +99 -0
- package/skill-docs/references/report/card-report-guide.md +110 -0
- package/skill-docs/references/report/cell-config-echo-guide.md +44 -9
- package/skill-docs/references/report/cell-transform-guide.md +9 -9
- package/skill-docs/references/report/column-split-report-guide.md +96 -0
- package/skill-docs/references/report/condition-format-guide.md +49 -24
- package/skill-docs/references/report/cross-dataset-filter-guide.md +180 -69
- package/skill-docs/references/report/crosstab-raw-workbook-guide.md +265 -0
- package/skill-docs/references/report/dataset-query-filter-guide.md +231 -235
- package/skill-docs/references/report/dataset-sidebar-ops-guide.md +75 -34
- package/skill-docs/references/report/dataset-table-field-contract-guide.md +196 -46
- package/skill-docs/references/report/datasource-metadata-guide.md +128 -119
- package/skill-docs/references/report/datasource-selection-and-parent-filter-guide.md +183 -148
- package/skill-docs/references/report/date-range-query-reference.md +97 -102
- package/skill-docs/references/report/default-header-style-guide.md +8 -8
- package/skill-docs/references/report/designer-blank-prevention-guide.md +8 -8
- package/skill-docs/references/report/dossier-report-guide.md +69 -0
- package/skill-docs/references/report/drilldown-report-guide.md +59 -0
- package/skill-docs/references/report/event-hreflink-guide.md +53 -47
- package/skill-docs/references/report/expansion-block-parent-config-guide.md +208 -0
- package/skill-docs/references/report/failure-cleanup-and-nonblocking-guide.md +183 -0
- package/skill-docs/references/report/field-bind-exact-match-guide.md +208 -208
- package/skill-docs/references/report/financial-stats-report-guide.md +89 -0
- package/skill-docs/references/report/formula-cell-api-guide.md +325 -258
- package/skill-docs/references/report/golden-case-summary-sheet.md +200 -0
- package/skill-docs/references/report/guide-report-build.md +6 -1
- package/skill-docs/references/report/hidden-row-and-header-merge-guide.md +10 -10
- package/skill-docs/references/report/layout-showlocation-freeze-guide.md +39 -10
- package/skill-docs/references/report/multi-report-crosstab-casebook.md +263 -0
- package/skill-docs/references/report/paged-group-report-guide.md +68 -0
- package/skill-docs/references/report/preaggregate-auto-disable-guide.md +24 -13
- package/skill-docs/references/report/query-condition-api-guide.md +145 -125
- package/skill-docs/references/report/ref-report-commands.md +41 -3
- package/skill-docs/references/report/report-baseinfo-defaults-guide.md +117 -117
- package/skill-docs/references/report/report-building-guide.md +52 -52
- package/skill-docs/references/report/report-case-prompts.md +104 -0
- package/skill-docs/references/report/report-config-schema.md +281 -281
- package/skill-docs/references/report/report-create-modes-guide.md +73 -35
- package/skill-docs/references/report/report-data-model.md +131 -131
- package/skill-docs/references/report/report-delivery-contract.md +23 -3
- package/skill-docs/references/report/report-designer-feature-map.md +30 -35
- package/skill-docs/references/report/report-help-guide.md +304 -0
- package/skill-docs/references/report/report-internal-error-guide.md +71 -0
- package/skill-docs/references/report/report-knowledge-base.md +27 -27
- package/skill-docs/references/report/report-lifecycle-api-guide.md +126 -94
- package/skill-docs/references/report/report-list-page-ops-guide.md +54 -8
- package/skill-docs/references/report/report-permission-guide.md +99 -102
- package/skill-docs/references/report/report-requirement-analysis-template.md +93 -29
- package/skill-docs/references/report/report-self-check-guide.md +164 -164
- package/skill-docs/references/report/report-verification-discipline-guide.md +203 -0
- package/skill-docs/references/report/safe-partial-save-guide.md +151 -151
- package/skill-docs/references/report/shard-freeze-report-guide.md +97 -0
- package/skill-docs/references/report/snowflake-id-precision-guide.md +84 -84
- package/skill-docs/references/report/spec-build-schema.md +71 -71
- package/skill-docs/references/report/targeted-fix-guide.md +155 -97
- package/skill-docs/references/report/user-request-scope-only-guide.md +23 -4
- package/skill-docs/references/workflow/guide-after-submit-comment.md +58 -0
- package/skill-docs/references/workflow/guide-workflow.md +6 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { SignFileSettings } from './workflow-sign-file-settings.js';
|
|
2
|
+
import { formOf, normalized, wire, verify, keys, P } from './workflow-base-settings.js';
|
|
3
|
+
import { booleanValue } from './workflow-opinion-settings.js';
|
|
4
|
+
import { id } from './workflow-function-management.js';
|
|
5
|
+
export const displayFields = {
|
|
6
|
+
'after-submit-display': ['customOpen', 'pcForwardType', 'mobileForwardType', 'pcStopInChart', 'mobileStopInChart', 'customPcUrl', 'customMobileUrl'],
|
|
7
|
+
'comment-set': ['commentSetTypeDTO', 'enableComment', 'allowCommentRelate', 'relateRangeSelect', 'relateRangeBrowser', 'allowUpload', 'uploadCatalogBrowser', 'commentdisplayTypeDTO', 'displayReplyDTO', 'defaultDisplayComment'],
|
|
8
|
+
};
|
|
9
|
+
const routes = {
|
|
10
|
+
'after-submit-display': ['pathSet/afterSubmitDisplay/getAfterSubmitDisplayFormData', 'pathSet/afterSubmitDisplay/saveAfterSubmitConfig'],
|
|
11
|
+
'comment-set': ['commentset/getCommentSet', 'commentset/saveCommentSet'],
|
|
12
|
+
};
|
|
13
|
+
export class AfterSubmitCommentSettings extends SignFileSettings {
|
|
14
|
+
async readDisplay(kind, w) {
|
|
15
|
+
const raw = await this.get(`${P}/${routes[kind][0]}`, { workflowId: id(w), ...(kind === 'after-submit-display' ? { global: false } : {}) });
|
|
16
|
+
const f = formOf(kind === 'comment-set' ? raw.commentSet : raw);
|
|
17
|
+
for (const k of ['pcStopInChart', 'mobileStopInChart', 'displayReplyDTO'])
|
|
18
|
+
if (Array.isArray(f.data[k]))
|
|
19
|
+
f.data[k] = f.data[k].filter((v) => v !== '');
|
|
20
|
+
return f;
|
|
21
|
+
}
|
|
22
|
+
async displayCandidates(w, k) {
|
|
23
|
+
const f = await this.readDisplay('comment-set', w), b = f.items[k]?.browserBean;
|
|
24
|
+
const expected = k === 'uploadCatalogBrowser' ? ['doc', 'folder'] : ['bcw', 'relevanceScopeItemBrowser'];
|
|
25
|
+
if (!b || b.module !== expected[0] || b.type !== expected[1])
|
|
26
|
+
throw Error('当前环境未开放支持的候选浏览器');
|
|
27
|
+
return this.post(`/api/${b.module}/common/browser/data/${b.type}`, { ...b.commonParams, ...b.dataParams, current: 1, pageNo: 1, pageSize: 100 });
|
|
28
|
+
}
|
|
29
|
+
async saveDisplay(kind, w, p) {
|
|
30
|
+
const allowed = displayFields[kind];
|
|
31
|
+
keys(p, allowed);
|
|
32
|
+
if (!Object.keys(p).length)
|
|
33
|
+
throw Error('请指定修改项');
|
|
34
|
+
const f = await this.readDisplay(kind, w), before = normalized(f), flag = kind === 'comment-set' ? 'commentSetTypeDTO' : 'customOpen';
|
|
35
|
+
let next = normalized(f);
|
|
36
|
+
for (const [k, v] of Object.entries(p)) {
|
|
37
|
+
const item = f.items[k];
|
|
38
|
+
if (!item || item.disabled || item.disable || item.readOnly)
|
|
39
|
+
throw Error(`${k} 当前环境不可编辑`);
|
|
40
|
+
if (['relateRangeBrowser', 'uploadCatalogBrowser'].includes(k)) {
|
|
41
|
+
const alias = k === 'relateRangeBrowser' ? 'relateMatterRangeBrowser' : k;
|
|
42
|
+
next[k] = await this.selection({ ...f, items: { ...f.items, [alias]: item } }, alias, v);
|
|
43
|
+
}
|
|
44
|
+
else if (item.itemType === 'INPUT') {
|
|
45
|
+
if (typeof v !== 'string')
|
|
46
|
+
throw Error(`${k} 必须为字符串`);
|
|
47
|
+
next[k] = v;
|
|
48
|
+
}
|
|
49
|
+
else
|
|
50
|
+
next[k] = (await this.patch(f, { [k]: v }, allowed))[k];
|
|
51
|
+
}
|
|
52
|
+
if (!booleanValue(next[flag]) && Object.keys(p).some(k => k !== flag))
|
|
53
|
+
throw Error('修改具体配置须先或同时 --custom 1;关闭自定义时只修改自定义开关');
|
|
54
|
+
if (kind === 'after-submit-display' && booleanValue(next.customOpen)) {
|
|
55
|
+
for (const [type, url] of [['pcForwardType', 'customPcUrl'], ['mobileForwardType', 'customMobileUrl']])
|
|
56
|
+
if (next[type] === '3') {
|
|
57
|
+
const value = next[url];
|
|
58
|
+
if (typeof value !== 'string' || !value.trim() || value !== value.trim() || !(/^(\/(?!\/)|https?:\/\/[^/\s]+)/i.test(value)) || /[\r\n]/.test(value))
|
|
59
|
+
throw Error(`${url} 必须是 / 开头内部地址或 http(s) 地址`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (kind === 'comment-set' && booleanValue(next[flag]) && booleanValue(next.enableComment) && booleanValue(next.allowCommentRelate) && next.relateRangeSelect === '1' && !next.relateRangeBrowser?.length)
|
|
63
|
+
throw Error('选择关联范围须指定非空 --relate-items');
|
|
64
|
+
const payload = { ...wire(f, next), workflowId: id(w) };
|
|
65
|
+
if (kind === 'after-submit-display')
|
|
66
|
+
payload.global = false;
|
|
67
|
+
else {
|
|
68
|
+
payload.commentSetTypeDTO = booleanValue(next.commentSetTypeDTO);
|
|
69
|
+
if ('uploadCatalogBrowser' in next)
|
|
70
|
+
payload.uploadCatalog = next.uploadCatalogBrowser?.[0]?.id ?? '0';
|
|
71
|
+
}
|
|
72
|
+
const result = await this.post(`${P}/${routes[kind][1]}`, payload);
|
|
73
|
+
if (kind === 'after-submit-display' ? !(typeof result === 'number' && result > 0) : !result || typeof result !== 'object' || !result.id)
|
|
74
|
+
throw Error('保存未返回有效成功结果');
|
|
75
|
+
const after = normalized(await this.readDisplay(kind, w));
|
|
76
|
+
const inherited = kind === 'comment-set' && !booleanValue(next[flag]);
|
|
77
|
+
verify(next, after, inherited ? [flag] : allowed);
|
|
78
|
+
return { workflowId: w, before, after, verified: true, ...(inherited ? { effectiveScope: 'application', verificationScope: '自定义已关闭;after为全局生效配置' } : {}) };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=workflow-after-submit-comment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-after-submit-comment.js","sourceRoot":"","sources":["../../src/services/workflow-after-submit-comment.ts"],"names":[],"mappings":"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"}
|
package/ecodecmd/src/build.js
CHANGED
|
@@ -141,6 +141,15 @@ function scannerResources(path_name, rootFolder, resFolder, temp_dir) {
|
|
|
141
141
|
return resources;
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
+
/**
|
|
145
|
+
* pidMap 的键归一化:统一分隔符与盘符大小写。
|
|
146
|
+
* Windows 下 parse_path 可能来自命令行(正斜杠),而 path.join 产出反斜杠,
|
|
147
|
+
* 直接用原串当键会导致根目录下的子文件夹取不到 parentId,导入后整棵子树丢失。
|
|
148
|
+
*/
|
|
149
|
+
function pkey(p) {
|
|
150
|
+
return String(p || '').replace(/\\/g, '/').replace(/\/+$/, '').toLowerCase();
|
|
151
|
+
}
|
|
152
|
+
|
|
144
153
|
/**
|
|
145
154
|
* 获取pids
|
|
146
155
|
* @param pidMap id映射关系
|
|
@@ -159,7 +168,7 @@ function getPids(pidMap, rootFolder, tmp_path, parse_path) {
|
|
|
159
168
|
if (t++ > 10) {
|
|
160
169
|
throw new Error("文件层级超过10");
|
|
161
170
|
}
|
|
162
|
-
path.push(pidMap[itemObj.parentDir]);
|
|
171
|
+
path.push(pidMap[pkey(itemObj.parentDir)]);
|
|
163
172
|
itemObj = utils.parseFileObj(itemObj.parentDir);
|
|
164
173
|
// console.log('111itemObj', itemObj.path);
|
|
165
174
|
}
|
|
@@ -174,7 +183,7 @@ function getPids(pidMap, rootFolder, tmp_path, parse_path) {
|
|
|
174
183
|
* @param parse_path
|
|
175
184
|
*/
|
|
176
185
|
function checkAddConfig(cfgName, rootFolder, pidMap, parse_path, ecodeJson, state) {
|
|
177
|
-
let fincCfg = ecodeJson.codes.find(c => c.name === cfgName && c.parentId === pidMap[path.join(parse_path, 'config')]);
|
|
186
|
+
let fincCfg = ecodeJson.codes.find(c => c.name === cfgName && c.parentId === pidMap[pkey(path.join(parse_path, 'config'))]);
|
|
178
187
|
if (!fincCfg) {
|
|
179
188
|
// 添加文件
|
|
180
189
|
ecodeJson.codes.push({
|
|
@@ -186,8 +195,8 @@ function checkAddConfig(cfgName, rootFolder, pidMap, parse_path, ecodeJson, stat
|
|
|
186
195
|
flowNum: 0,
|
|
187
196
|
id: createSnowFlakeId(),
|
|
188
197
|
name: cfgName,
|
|
189
|
-
parentId: pidMap[path.join(parse_path, 'config')],
|
|
190
|
-
parentIds: `,${rootFolder.id},${pidMap[path.join(parse_path, 'config')]},`,
|
|
198
|
+
parentId: pidMap[pkey(path.join(parse_path, 'config'))],
|
|
199
|
+
parentIds: `,${rootFolder.id},${pidMap[pkey(path.join(parse_path, 'config'))]},`,
|
|
191
200
|
rootFolderId: rootFolder.id,
|
|
192
201
|
sourceId: 0,
|
|
193
202
|
state,
|
|
@@ -197,7 +206,13 @@ function checkAddConfig(cfgName, rootFolder, pidMap, parse_path, ecodeJson, stat
|
|
|
197
206
|
}
|
|
198
207
|
|
|
199
208
|
function pretreatmentCode(content, tmpObj, parse_path) {
|
|
200
|
-
|
|
209
|
+
// 模块名必须是相对项目根的路径。Windows 下 parse_path 与文件路径的分隔符可能不一致,
|
|
210
|
+
// 直接 replace 会剥不掉前缀,模块名变成 ":/盘符/绝对路径",运行时 require 失败(白屏)
|
|
211
|
+
const normFile = String(tmpObj.path).replace(/\\/g, '/');
|
|
212
|
+
const normRoot = String(parse_path).replace(/\\/g, '/').replace(/\/+$/, '');
|
|
213
|
+
const refPath = normFile.startsWith(normRoot)
|
|
214
|
+
? normFile.slice(normRoot.length).replace(/^\//, '')
|
|
215
|
+
: normFile.split('/').pop();
|
|
201
216
|
let res = content
|
|
202
217
|
.replace(/"use strict";\n\n/, "")
|
|
203
218
|
.replace(/(\n)+/g, (v) => `${v} `)
|
|
@@ -311,6 +326,9 @@ async function buildWithE10(path_name) {
|
|
|
311
326
|
}
|
|
312
327
|
// 查询是否存在配置文件
|
|
313
328
|
const buildJson = JSON.parse(fs.readFileSync(path.join(path_name, 'build.json')));
|
|
329
|
+
// build.json 的键由本机路径拼成(Windows 下是反斜杠),查 state 时统一归一化
|
|
330
|
+
const buildCodesNorm = {};
|
|
331
|
+
Object.keys(buildJson.codes || {}).forEach((k) => { buildCodesNorm[pkey(k)] = buildJson.codes[k]; });
|
|
314
332
|
// 创建临时目录
|
|
315
333
|
const temp_dir = path.join(parse_path, ".temp");
|
|
316
334
|
if (!utils.mkdirs(temp_dir, true)) {
|
|
@@ -351,7 +369,7 @@ async function buildWithE10(path_name) {
|
|
|
351
369
|
const resources = scannerResources(path_name, rootFolder, resFolder, temp_dir);
|
|
352
370
|
ecodeJson.resources = resources;
|
|
353
371
|
const pidMap = {};
|
|
354
|
-
pidMap[parse_path] = rootFolder.id;
|
|
372
|
+
pidMap[pkey(parse_path)] = rootFolder.id;
|
|
355
373
|
const path_dp = [];
|
|
356
374
|
path_dp.push(parse_path);
|
|
357
375
|
// 遍历当前目录
|
|
@@ -382,7 +400,13 @@ async function buildWithE10(path_name) {
|
|
|
382
400
|
compileContent = pretreatmentCode(compileJsE10(compileContent, tmpObj.path) || '', tmpObj, parse_path);
|
|
383
401
|
}
|
|
384
402
|
// 需要兼容window 处理路径
|
|
385
|
-
|
|
403
|
+
// 相对路径同样要归一化:Windows 下 parse_path 与 path.join 产出的分隔符可能不同,
|
|
404
|
+
// 直接 replace 会剥不掉前缀,导致 build.json 里的 state 查不到(entry.js 退化成非前置加载)
|
|
405
|
+
const normFile = String(tmpObj.path).replace(/\\/g, '/');
|
|
406
|
+
const normRoot = String(parse_path).replace(/\\/g, '/').replace(/\/+$/, '');
|
|
407
|
+
let codeKeyPath = normFile.startsWith(normRoot)
|
|
408
|
+
? normFile.slice(normRoot.length).replace(/^\//, '')
|
|
409
|
+
: normFile.split('/').pop();
|
|
386
410
|
// if (codeKeyPath && codeKeyPath.includes("\\")) {
|
|
387
411
|
// codeKeyPath = codeKeyPath.replace(/\\/g, '/');
|
|
388
412
|
// }
|
|
@@ -401,8 +425,8 @@ async function buildWithE10(path_name) {
|
|
|
401
425
|
rootFolderId: rootFolder.id,
|
|
402
426
|
sourceId: 0,
|
|
403
427
|
systemFlag: rootFolder.systemFlag,
|
|
404
|
-
state: (
|
|
405
|
-
parentId: pidMap[tmpObj.parentDir],
|
|
428
|
+
state: (buildCodesNorm[pkey(codeKeyPath)] || buildCodesNorm[pkey('/' + codeKeyPath)])?.state || 'n', // 是否前置加载,
|
|
429
|
+
parentId: pidMap[pkey(tmpObj.parentDir)],
|
|
406
430
|
parentIds: getPids(pidMap, rootFolder, tmp_path, parse_path)
|
|
407
431
|
};
|
|
408
432
|
// console.info('file tmpObj.name => ', tmpObj.name, tmpObj.path, tmpObj.isDir)
|
|
@@ -435,12 +459,12 @@ async function buildWithE10(path_name) {
|
|
|
435
459
|
officialFlag: rootFolder.officialFlag,
|
|
436
460
|
systemFlag: rootFolder.systemFlag,
|
|
437
461
|
treeType: 'R',
|
|
438
|
-
parentId: pidMap[utils.parsePath(tmpObj.parentDir)],
|
|
462
|
+
parentId: pidMap[pkey(utils.parsePath(tmpObj.parentDir))],
|
|
439
463
|
parentIds: getPids(pidMap, rootFolder, tmp_path, parse_path),
|
|
440
464
|
attribute,
|
|
441
465
|
}
|
|
442
466
|
// console.info('tmpObj.name => ', tmpObj.name, tmpObj.path, tmpObj.isDir)
|
|
443
|
-
pidMap[tmp_path] = folderObj.id;
|
|
467
|
+
pidMap[pkey(tmp_path)] = folderObj.id;
|
|
444
468
|
ecodeJson.folders.push(folderObj);
|
|
445
469
|
}
|
|
446
470
|
|
|
@@ -459,7 +483,7 @@ async function buildWithE10(path_name) {
|
|
|
459
483
|
});
|
|
460
484
|
if (!findConfigFolder) {
|
|
461
485
|
const configId = createSnowFlakeId();
|
|
462
|
-
pidMap[path.join(parse_path, 'config')] = configId;
|
|
486
|
+
pidMap[pkey(path.join(parse_path, 'config'))] = configId;
|
|
463
487
|
ecodeJson.folders.push({
|
|
464
488
|
appUUID: rootFolder.appUUID,
|
|
465
489
|
attribute: 'G',
|
package/package.json
CHANGED
package/skill-docs/SKILL.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
name: weaver-e10-builder
|
|
3
3
|
display_name: 泛微E10智能搭建Skill
|
|
4
4
|
display_name_en: E10 Builder
|
|
5
|
-
description: 泛微E10智能搭建skill v2(通用版),辅助编写泛微Ebuilder自定义应用,对应CLI版本1.6.
|
|
6
|
-
description_zh: 泛微Ebuilder低代码应用智能搭建工具 v2(通用版),辅助编写自定义应用(表单/流程/列表/动作流/权限/分组/编号等),与 e10-cli 配套使用,当前对应 CLI 版本 1.6.
|
|
7
|
-
description_en: E10 Ebuilder low-code app builder skill v2 (general) — helps build Weaver E10 custom apps (forms/workflows/lists/actionflows/permissions/groups/numbering) via e10-cli, currently paired with CLI 1.6.
|
|
5
|
+
description: 泛微E10智能搭建skill v2(通用版),辅助编写泛微Ebuilder自定义应用,对应CLI版本1.6.11
|
|
6
|
+
description_zh: 泛微Ebuilder低代码应用智能搭建工具 v2(通用版),辅助编写自定义应用(表单/流程/列表/动作流/权限/分组/编号等),与 e10-cli 配套使用,当前对应 CLI 版本 1.6.11。
|
|
7
|
+
description_en: E10 Ebuilder low-code app builder skill v2 (general) — helps build Weaver E10 custom apps (forms/workflows/lists/actionflows/permissions/groups/numbering) via e10-cli, currently paired with CLI 1.6.11.
|
|
8
8
|
category: coding
|
|
9
|
-
version: 1.6.
|
|
9
|
+
version: 1.6.11
|
|
10
10
|
author: 泛微网络科技股份有限公司
|
|
11
11
|
auto: true
|
|
12
12
|
---
|
package/skill-docs/_catalog.md
CHANGED
|
@@ -58,8 +58,16 @@
|
|
|
58
58
|
| 报表权限、共享范围、viewRight、权责矩阵 | `references/report/report-permission-guide.md` |
|
|
59
59
|
| 报表版本、快照、生命周期、回收站、复制挂菜单 | `references/report/report-lifecycle-api-guide.md` |
|
|
60
60
|
| 报表条件格式、数据条、图标集 | `references/report/condition-format-guide.md` |
|
|
61
|
+
| 汇总格、合计行、合计列、分组汇总、子表 1:N 收敛成一行、汇总锚点、汇总格父格、扩展块父格、合计行父格、自增序号、Sheet 跳转 | `references/report/cross-dataset-filter-guide.md`(§2.3.2 汇总格三件套)· `references/report/expansion-block-parent-config-guide.md` · `references/report/branch-scene-guide.md` |
|
|
62
|
+
| 卡片式报表、一条记录一张卡片、发票卡片、设备卡、工单卡、段落明细表、档案报表、人物档案、钻取、下钻、分页分组、每页固定行数、分片冻结、宽表不分页、行分栏、列分栏、分栏报表、折叠树、树形展开、多级列组、同比环比、财务统计表、多报表交叉案例 | `references/report/card-report-guide.md` · `dossier-report-guide.md` · `drilldown-report-guide.md` · `paged-group-report-guide.md` · `shard-freeze-report-guide.md` · `column-split-report-guide.md` · `advanced-crosstab-tree-guide.md` · `crosstab-raw-workbook-guide.md` · `financial-stats-report-guide.md` · `multi-report-crosstab-casebook.md`(同目录) |
|
|
63
|
+
| 报表验证纪律、回读清单、diff 键、字节安全、克隆纪律、服务端与浏览器端差异 | `references/report/report-verification-discipline-guide.md` |
|
|
64
|
+
| 报表案例提示语、可粘贴需求描述、需求分析模板、需求拆解 | `references/report/report-case-prompts.md` · `references/report/report-requirement-analysis-template.md` |
|
|
65
|
+
| 报表设计器功能说明、帮助手册、打印导出、主题样式、页面布局 | `references/report/report-help-guide.md` · `references/report/report-designer-feature-map.md` |
|
|
66
|
+
| 报表搭建失败收尾、空壳清理、失败不阻塞、部分保存 | `references/report/build-resilience-guide.md` · `references/report/safe-partial-save-guide.md` · `references/report/failure-cleanup-and-nonblocking-guide.md` |
|
|
67
|
+
| 报表搭建顺序、建壳流程、保存判定、公式四件套、克隆纪律、字段绑定、雪花 id 精度 | `references/report/report-building-guide.md` · `references/report/api-report-build-fast-path.md` · `references/report/snowflake-id-precision-guide.md` · `references/report/field-bind-exact-match-guide.md` |
|
|
68
|
+
| 报表定位、只改点名项、改动范围、修复顺序 | `references/report/targeted-fix-guide.md` · `references/report/user-request-scope-only-guide.md` |
|
|
61
69
|
| 新页面、导出、路由、entry.js、regOvProps、regReactChildren、asyncImport、publicUrl、Suspense、${appId} 固定写法、appId 填数字 | `references/coding/guide-page-export.md`(前端代码) |
|
|
62
|
-
| 写页面、页面代码、React编码、组件、entry.js模板、formClient
|
|
70
|
+
| 写页面、页面代码、React编码、组件、entry.js模板、formClient、字段常量、当前用户、currentUser、window.TEAMS、租户、tenantKey、主题色、语言、权限码、authorityList、部门树、组织架构、getOrgTree、人员搜索、getEmployeeByKeyWords、页面发起流程、flowpage、预填跳转 | `references/coding/guide-page-code.md`(前端代码) |
|
|
63
71
|
| HTML 原型还原、HTML 转 React、原型 CSS、复用样式、不写 CSS、class/className、内联 style、浮层、Portal、CSS 作用域 | `references/coding/guide-html-to-react.md`(前端代码) |
|
|
64
72
|
| 页面设计器、配置式页面、仪表盘、看板页、designer、page create、comp-add、工厂模板、factory、组件模板、页面布局、designer layout/save、页面版本、version revert、发布页面菜单、publish-menu、自定义CSS、组件样式、选择器、DOM结构、样式不生效 | `references/ebuilder-designer/guide-designer.md`(布局层主干)· `guide-designer-components.md`(组件 config)· `guide-designer-factory.md`(工厂模板)· `guide-designer-version.md`(版本)· `guide-designer-css.md`(自定义 CSS 与 DOM 结构索引) |
|
|
65
73
|
|
|
@@ -80,6 +88,7 @@
|
|
|
80
88
|
|
|
81
89
|
| 用户意图关键词 | 加载文档 |
|
|
82
90
|
|---------------|---------|
|
|
91
|
+
| 组件通用属性、components 通用、className、style、customRender、overlayClassName、prefixCls、CSS 变量、组件主题、弹层样式、表单组件通用属性、readOnly/required/disabled | `references/components/ref-component-common.md` |
|
|
83
92
|
| Button、按钮 | `references/components/@weapp-Button.md` |
|
|
84
93
|
| Table、表格 | `references/components/display-Table.md` |
|
|
85
94
|
| List、列表 | `references/components/display-List.md` |
|
|
@@ -34,6 +34,7 @@ description: "将业务需求编译为 Weaver ESB 动作流,或读取已有动
|
|
|
34
34
|
- 流程:`e10-cli actionflow workflow-browser-list` / `workflow-search` / `workflow-nodes`。
|
|
35
35
|
- 流程动态字段:`e10-cli actionflow workflow-context-fields`。默认每页 20 条;按需求字段名先传 `query`(例如 `{"workflowId":"<id>","query":"数据ID"}`),只使用本次返回的 `fields[].paramKey`。完整响应过大时用 `--out context.json` 落盘,禁止依赖终端截断后的片段。
|
|
36
36
|
- 其他组件动态字段:`e10-cli actionflow component-context-fields '{"componentType":"<组件类型>","currentApplication":"<当前动作流ID;新建传0>","eventNodeId":"<上游节点ID>","params":{...},"query":"<字段名或关键词>"}'`。该命令会先解析数据源 Browser,再查询 `showDataSourceFields` 匹配实际可选输出字段,随后编译组件上下文并调用 `getComponentContext`。`EnquiryForm`、`TimeBatchTrigger`、`DateTrigger` 都适用。**必须在写入任何动态赋值前查询来源组件**;只允许从本次 `getComponentContext` 结果选择 `fields[].paramKey`,接口未返回的字段必须先查明该组件是否有受支持的依据值/循环语义,否则停止该映射,不得凭字段名、约定根节点或历史经验补造。
|
|
37
|
+
- 数据源名称通过 Browser 模糊搜索:只有一个候选时使用该候选;多个候选时展示名称、所属应用和 ID,让用户选择。拿到选择的 ID 后重新解析;数据源 ID 和 `type/sourceType` 均使用接口返回值。
|
|
37
38
|
- 计划按执行顺序构造时,先查询触发器,再逐个查询会提供动态数据的上游动作;每一步都用该组件本次真实参数(尤其数据源、目标表和选中的字段)查询。下游映射只能选择已查询来源返回的字段。`generate` 的预检是最后一道校验,不可代替生成前的字段发现。
|
|
38
39
|
- e-builder(**已知表名时首选**):`e10-cli actionflow form-search '{"keyword":"<表名>"}'` 一次拿到表单 `objId` 与它所属的业务应用 `appId`。服务端是**子串模糊匹配**,同名表跨多个应用很常见(返回体里的 `完全同名` 即同名条数)—— **多于一条时必须按 `appName` 收窄再取**,不得自行挑一个:`'{"keyword":"<表名>","appName":"<应用名>"}'`。`keyword` 传 `objId` 则是精确命中,可用来由 id 反查所属应用。
|
|
39
40
|
- **`appName` 走服务端过滤**(不是本地二次筛):应用名精确唯一才用;**同名多命中或查无此名会直接报错并列出候选**,此时改用 `appId` 指定,不要换个近似名重试。
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
关键结构(与旧结论不同,已修正):
|
|
56
56
|
|
|
57
57
|
1. **EnquiryForm 节点(首动作)**:
|
|
58
|
-
- `dataSource.type
|
|
58
|
+
- 此历史样本的 `dataSource.type` 是 `LOGIC`;生成时必须使用当前 Browser 返回的真实 `type/sourceType`,不能据样本推断。查询服务组是 `weaver-ebuilder-form-service`。
|
|
59
59
|
- `queryFields[].id = "id"`(简写,不是 `{表id}[].id`);`fieldGroup = { name: 表名, id: 表id }`
|
|
60
60
|
- 筛选:`filterInput.datas[].conditions.value` 用流程上下文 type=3(`ApprovalData.{wfId}.requestId`)
|
|
61
61
|
- 首动作 **不需要 sources**(undefined),ActionEbAdd 的 sources 指向 EnquiryForm 节点 wId
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
|
|
69
69
|
3. 其余明细字段仍用依据值下级 type=10 直连(paramKey `{wfId}.{明细表id}[].{子字段id}`,source=event 节点 id)。
|
|
70
70
|
|
|
71
|
-
4. 挂接注意:EnquiryForm
|
|
71
|
+
4. 挂接注意:EnquiryForm 作为**流程首动作**保存成功,首动作不要补 sources。数据源类型以当前接口实际返回为准。
|
|
72
72
|
|
|
73
73
|
计划中引用该结果时,必须显式写 `kind:"query_result"`,不能把它写成普通流程字段。例如:
|
|
74
74
|
|
|
@@ -43,6 +43,8 @@
|
|
|
43
43
|
|
|
44
44
|
自定义参数的字段定义是业务特定的。根据需求新建时可以直接提供 `tableList` 和字段;`tableList` 或其中的 `fields` 为空时,设计器“输入参数设置”就是空白。已有组件的更新场景如需保留平台生成的 `customId`,应使用平台回读 DTO,不要把更新 DTO 当作新建 DTO。
|
|
45
45
|
|
|
46
|
+
需求中的每张明细表都在 `tableList` 中单独配置一个 `isMain: false` 的表,并将该表的明细字段放入它自己的 `fields`。多张明细表分别配置;不要把它们的字段合并到一张表或主表。明细表在运行时表示可重复的对象列表,后续新增目标明细时先查询 `getComponentContext`,再从返回结果选择对应明细表作为依据值,选择该表的下级字段进行映射。
|
|
47
|
+
|
|
46
48
|
根触发器图标不是 `Icon-custom-trigger`,编译器统一保存为 `Icon-N-Triggerrul`。
|
|
47
49
|
|
|
48
50
|
## 上下文
|
|
@@ -60,7 +60,25 @@
|
|
|
60
60
|
|
|
61
61
|
Webhook 请求运行时由平台解析为三个上下文分组:`Params`、`Header`、`Body`。动作参数中的上下文引用使用完整路径,例如 `Params.orderId`、`Header.Authorization`、`Body.customer.name`;不要把它们写成 `FormData.*`。
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
### 请求中的明细表
|
|
64
|
+
|
|
65
|
+
需求中有明细表时,每张明细表对应 Body 中一个 JSON 对象数组。参数设置里,数组父参数使用 `paramType: "json"`、`arrs: true`;每个明细字段作为子参数,通过 `parentId` 指向所属数组。多张明细表分别配置,允许不同数组包含同名子字段。例如:
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"name": "Body",
|
|
70
|
+
"tableData": [
|
|
71
|
+
{ "id": "devices", "paramName": "devices", "showName": "设备明细", "paramType": "json", "arrs": true },
|
|
72
|
+
{ "id": "deviceName", "parentId": "devices", "paramName": "name", "showName": "设备名称", "paramType": "string" },
|
|
73
|
+
{ "id": "materials", "paramName": "materials", "showName": "材料明细", "paramType": "json", "arrs": true },
|
|
74
|
+
{ "id": "materialName", "parentId": "materials", "paramName": "name", "showName": "材料名称", "paramType": "string" }
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
上例对应请求 `{"devices":[{"name":"设备A"}],"materials":[{"name":"材料A"}]}`。配置新增明细时,先调用 `getComponentContext`,使用返回的数组字段作为对应目标明细的依据值,使用该数组下级字段映射目标明细字段;参数路径、字段 ID 和上下文根以接口返回值为准。不得混用不同数组的子字段。
|
|
80
|
+
|
|
81
|
+
`authAppIds` 是 WebHook 触发器的认证应用列表,必须明确指定一个应用。可传应用 ID 或 `authAppNames: ["普通应用-wull"]`;生成前 CLI 调用 `openApplicationBrowser` 匹配并回填 `{ "id": <应用ID>, "content": "<应用名称>" }`。未指定或匹配不到时停止生成。
|
|
64
82
|
|
|
65
83
|
## 终止节点响应
|
|
66
84
|
|
|
@@ -4,6 +4,8 @@ Ebuilder 项目没有后端,页面通过读写 Ebuilder 表单完成增删改
|
|
|
4
4
|
|
|
5
5
|
> 表单元数据用 `e10-cli form read <objId> --app-id <appId> --out fields.json` 导出。字段 ID 以导出结果为准,不要自己编。
|
|
6
6
|
|
|
7
|
+
> `formClient` 只管**表单和明细表**的数据。人员、部门、组织、文档这些平台域数据不在这里,也不要用它去查:选人和上传用 `@weapp/ui` 的 `Browser` / `Upload`,它们自带数据层。组件选中的值在写进表单字段时才交给 `formClient`,见 `guide-page-code.md` 第六节。
|
|
8
|
+
|
|
7
9
|
---
|
|
8
10
|
|
|
9
11
|
## 一、先准备字段常量
|
|
@@ -189,6 +189,68 @@ export default function Items() {
|
|
|
189
189
|
|
|
190
190
|
---
|
|
191
191
|
|
|
192
|
+
### 页面上还能拿到什么:`window.TEAMS`
|
|
193
|
+
|
|
194
|
+
页面运行在平台壳里,当前用户、租户、主题、语言都挂在全局 `window.TEAMS` 上,**不要硬编码**。模块顶层取一次:
|
|
195
|
+
|
|
196
|
+
```js
|
|
197
|
+
function readTeams() {
|
|
198
|
+
if (typeof window !== 'undefined' && window.TEAMS) return window.TEAMS;
|
|
199
|
+
return {};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
var TEAMS = readTeams();
|
|
203
|
+
var ME = TEAMS.currentUser || {};
|
|
204
|
+
var TENANT = TEAMS.currentTenant || {};
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
| 用途 | 取值 |
|
|
208
|
+
|---|---|
|
|
209
|
+
| 当前用户 ID(写入创建人、参与人) | `ME.id` |
|
|
210
|
+
| 姓名 / 工号 / 账号 | `ME.name` / `ME.jobNum` / `ME.username` |
|
|
211
|
+
| 所属部门 | `ME.department.id` / `ME.department.name`(另有 `datarank` / `rank`) |
|
|
212
|
+
| 系统角色与管理员标记 | `ME.authorityList`(如 `["ROLE_ADMIN"]`)、`ME.admin` / `ME.sysAdmin` / `ME.moduleAdmin` |
|
|
213
|
+
| 租户 | `TENANT.tenantKey` / `TENANT.tenantName` |
|
|
214
|
+
| 跟随平台主题 | `TEAMS.theme.primaryColor` / `TEAMS.theme.fontDensity` |
|
|
215
|
+
| 语言 | `TEAMS.locale.lang` |
|
|
216
|
+
| 已开通模块 | `TEAMS.displayModules` |
|
|
217
|
+
|
|
218
|
+
**边界**:
|
|
219
|
+
|
|
220
|
+
- 这些字段随平台版本增减,只取用到的,不要整个对象透传或落库;
|
|
221
|
+
- `authorityList` 是**系统级**角色码,不等于业务角色;业务上的"谁能审批、谁能看这个页面",以服务端权限和数据为准;
|
|
222
|
+
- 前端按这些字段隐藏按钮只是体验优化,**不能当权限校验**;
|
|
223
|
+
- 拿不到时(本地调试、非平台环境)按空对象降级,不要直接抛错。
|
|
224
|
+
|
|
225
|
+
### 组织架构:部门树与人员
|
|
226
|
+
|
|
227
|
+
**默认用组件**:选人、选部门、人员列表都用 `Browser`(`module="hrm"`,`type="resource"` / `"department"`),它自带数据、分页与权限口径。不要把组件能做的事改成自己拉接口。
|
|
228
|
+
|
|
229
|
+
只有页面要**自己画出部门树**(组件只提供选择弹窗,给不了树)或**自己写人员搜索框**时,才用下面两个平台接口。同源请求自动带 cookie:
|
|
230
|
+
|
|
231
|
+
```js
|
|
232
|
+
// 部门树
|
|
233
|
+
var res = await fetch('/api/hrm/common/getOrgTree?menuCode=eBuilder&onlySubcompany=false'
|
|
234
|
+
+ '&containDisableDept=false&moduleCode=EBUILDER&virtualId=1&loadCount=false&isMobile=false');
|
|
235
|
+
var tree = (await res.json()).data; // 节点:{ id, content, parentId, children, isLeaf, nodeType: 'department' }
|
|
236
|
+
|
|
237
|
+
// 人员搜索
|
|
238
|
+
var r2 = await fetch('/api/hrm/common/getEmployeeByKeyWords', {
|
|
239
|
+
method: 'POST',
|
|
240
|
+
headers: { 'Content-Type': 'application/json' },
|
|
241
|
+
body: JSON.stringify({ keyword: '张', searchType: 1, searchCount: 20, pageNo: 1, pageSize: 20,
|
|
242
|
+
appDetachModule: 'EM', disableAppDetach: 0 })
|
|
243
|
+
});
|
|
244
|
+
var users = (await r2.json()).data.userList; // { id, name, department, departmentId, avatar, status }
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
| 接口 | 返回 |
|
|
248
|
+
|---|---|
|
|
249
|
+
| `GET /api/hrm/common/getOrgTree` | `data[]` 部门树,`content` 是部门名,`parentId` 串成树 |
|
|
250
|
+
| `POST /api/hrm/common/getEmployeeByKeyWords` | `data.userList[]`,`id` 是人员 ID,`department` / `departmentId` 是所属部门 |
|
|
251
|
+
|
|
252
|
+
**边界**:这两个是平台前端内部接口,随版本可能变;能用 `Browser` 的地方不要用接口。人员 ID 写进表单字段时按 `values` 的规则处理(多值逗号串)。
|
|
253
|
+
|
|
192
254
|
## 五、HTML 原型还原
|
|
193
255
|
|
|
194
256
|
用户提供 HTML / 设计稿并要求还原时,读 `guide-html-to-react.md`。核心规则:
|
|
@@ -223,6 +285,21 @@ export default function Items() {
|
|
|
223
285
|
|
|
224
286
|
文本框、数字、日期、下拉框用原生 HTML,不要为了用组件而用组件。原型还原优先用原生 HTML + 原型 CSS,平台组件只用于人员/部门选择、上传、文件预览等必须能力。
|
|
225
287
|
|
|
288
|
+
组件的通用属性(`className` / `style` / `customRender` / 表单类通用属性)与改样式的四层钩子见 `references/components/ref-component-common.md`。
|
|
289
|
+
|
|
290
|
+
### 组件自带的数据,不要再自己查
|
|
291
|
+
|
|
292
|
+
`Browser`(人员 / 部门 / 组织)、`Upload`、`FilePreview` 自带数据层:搜索、选择、回显都由组件去请求平台对应的组织、人员、文档接口。页面不要再自己调这些接口,也不要用 `formClient` 去查 —— 组织、人员、文档不属于表单数据,换了通道也拿不到同一份权限口径。
|
|
293
|
+
|
|
294
|
+
分工是单向的:
|
|
295
|
+
|
|
296
|
+
| 环节 | 归谁 |
|
|
297
|
+
|---|---|
|
|
298
|
+
| 选人 / 选部门 / 选组织、上传、预览 | 组件 |
|
|
299
|
+
| 把选中的值写进表单字段、再读回来 | `formClient` |
|
|
300
|
+
|
|
301
|
+
组件的 `value` 与 `onChange` 都是 `[{ id, name }]`。`onChange` 拿到后只把 `id` 写进 `values`(多值逗号串);回显用行里的 `items[字段ID]`,见 `guide-edit-backfill.md`。
|
|
302
|
+
|
|
226
303
|
---
|
|
227
304
|
|
|
228
305
|
## 七、平台硬规则
|
|
@@ -271,3 +348,34 @@ export default function Items() {
|
|
|
271
348
|
| 列表没传 `page/size` | 默认可能只回 10 条,显式传 |
|
|
272
349
|
| 样式拆成独立 `.css` | 放回原型 CSS 字符串 |
|
|
273
350
|
| 把 `const appId = '${appId}'` 当变量用 | 不需要这个变量,直接写在 `asyncImport` 里 |
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
## 十、页面与流程协作
|
|
355
|
+
|
|
356
|
+
**发起流程走平台页面,不要自己调接口创建流程。** 页面里只负责拼链接:
|
|
357
|
+
|
|
358
|
+
```js
|
|
359
|
+
// 流程 ID 放 app/config.js;具体值用 e10-cli workflow list <appId> 查
|
|
360
|
+
var WORKFLOW_ID = '流程ID';
|
|
361
|
+
|
|
362
|
+
function startFlow(workflowId, prefill) {
|
|
363
|
+
var url = '/sp/workflow/flowpage/create/' + workflowId;
|
|
364
|
+
var params = Object.keys(prefill || {}).map(function (k) {
|
|
365
|
+
return k + '=' + encodeURIComponent(prefill[k]);
|
|
366
|
+
});
|
|
367
|
+
if (params.length) url += '?' + params.join('&');
|
|
368
|
+
window.open(url, '_blank');
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
| 规则 | 说明 |
|
|
373
|
+
|---|---|
|
|
374
|
+
| 预填参数名 | 表单**字段 ID**(纯数字字符串),不是字段名 |
|
|
375
|
+
| 预填参数值 | `encodeURIComponent` 包裹 |
|
|
376
|
+
| Select 字段 | 传**选项 ID**(`valueKey`),不能传显示名 |
|
|
377
|
+
| 多值字段 | 按表单写入规则用逗号串 |
|
|
378
|
+
|
|
379
|
+
预填规则详见 `references/workflow/guide-workflow.md` 的「URL 传参预填」;参数值的来源可以先 `formClient` 读出来,再拼进 URL。
|
|
380
|
+
|
|
381
|
+
**待办、已办、流程状态不在页面里自己拉。** 平台有待办页(菜单系统页 `todo` → `/sp/ebdfpage/workflow/{appId}_todo`),需要给用户看待办时跳转过去;页面不自行调用任务列表接口。
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# 组件通用属性与样式
|
|
2
|
+
|
|
3
|
+
> 适用 `@weapp/ui` 全部组件:属性与样式这部分是共通的,单看这一份即可。组件各自的专有属性见同目录下的组件文档。
|
|
4
|
+
|
|
5
|
+
## 一、每个组件都有的属性(BaseProps)
|
|
6
|
+
|
|
7
|
+
| 属性 | 类型 | 说明 |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| `className` | string | 挂到组件根节点,用来加自己的样式作用域 |
|
|
10
|
+
| `style` | CSSProperties | 合并到组件根节点的行内样式 |
|
|
11
|
+
| `customRender` | `(ctx, element) => ReactNode` | 包一层或整体替换组件的渲染结果 |
|
|
12
|
+
| `overlayClassName` | string | 浮层样式名。**只有部分组件实现**(Radio / Checkbox / Menu / At / BreadCrumb 等),用前确认该组件是否支持 |
|
|
13
|
+
| `prefixCls` | string | class 前缀。**不要用来改样式**:less 里的前缀是编译期写死的,改它只会换类名,样式表仍指向 `.ui-*` |
|
|
14
|
+
| `weaComId` | string | 组件标识,一般不用 |
|
|
15
|
+
| `children` | ReactNode | 子节点 |
|
|
16
|
+
|
|
17
|
+
`customRender` 的第一个参数是组件实例,用来读取组件状态;返回的节点会**直接替代**原渲染结果,所以包裹时记得把 `element` 放回去:
|
|
18
|
+
|
|
19
|
+
```jsx
|
|
20
|
+
<Browser
|
|
21
|
+
module="hrm"
|
|
22
|
+
type="resource"
|
|
23
|
+
customRender={function (ctx, element) {
|
|
24
|
+
return <div className="my-browser-wrap">{element}</div>;
|
|
25
|
+
}}
|
|
26
|
+
/>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 二、表单类组件的通用属性(FormProps)
|
|
30
|
+
|
|
31
|
+
表单类组件(Input / Select / Checkbox / Radio / Switch / Upload / Browser 等)在 BaseProps 之外还有:
|
|
32
|
+
|
|
33
|
+
| 属性 | 类型 | 说明 |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `readOnly` | boolean | 只读,只显示值、不加载输入工具 |
|
|
36
|
+
| `disabled` | boolean | 禁用 |
|
|
37
|
+
| `required` | boolean | 必填 |
|
|
38
|
+
| `passport` | boolean | 加密显示为 `********` |
|
|
39
|
+
| `placeholder` | string | 占位提示 |
|
|
40
|
+
| `rule` | string \| function | 校验规则 |
|
|
41
|
+
| `showRequiredMark` | boolean | 是否显示必填标记 |
|
|
42
|
+
| `fieldId` / `fieldName` | string \| number | 隐藏域标识 |
|
|
43
|
+
|
|
44
|
+
## 三、样式:四层钩子
|
|
45
|
+
|
|
46
|
+
按可靠性从高到低,优先用上面的:
|
|
47
|
+
|
|
48
|
+
| 层 | 手段 | 作用范围 |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| 变量层 | 在**页面根节点**重声明 CSS 变量(`--primary` 等) | 整个页面子树 |
|
|
51
|
+
| 组件根层 | `className` / `style` | 组件根节点 |
|
|
52
|
+
| 内容层 | `customRender` / 组件的 `bodyRender`、`customRenderItem` | 组件内部指定位置 |
|
|
53
|
+
| 浮层专用 | `overlayClassName`、组件的弹层属性(如 `browserDialogProps`) | 该组件的弹层 |
|
|
54
|
+
|
|
55
|
+
```jsx
|
|
56
|
+
// 页面根节点声明变量,只影响这个页面
|
|
57
|
+
<div className="my-page" style={{ '--primary': '#2f6fed', '--border-radius-md': '8px' }}>
|
|
58
|
+
...
|
|
59
|
+
</div>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**不要把变量写在 `:root` 上** —— 那会改掉整个平台的样式。
|
|
63
|
+
|
|
64
|
+
## 四、浮层不在页面 DOM 里
|
|
65
|
+
|
|
66
|
+
弹窗、下拉这类浮层通过 Portal 挂到 `body` 下的 `.ui-dialog-portal`:
|
|
67
|
+
|
|
68
|
+
- 页面根节点上声明的 CSS 变量和后代选择器**都够不到浮层**;
|
|
69
|
+
- 部分组件的弹层会继承组件上的 `className`(例如 Browser 把属性透传给内部 Dialog),所以同一个 className 有时会同时命中根节点和弹层;
|
|
70
|
+
- 需要单独控制弹层时,用该组件的弹层属性或 `overlayClassName`,不要靠 DOM 层级猜;
|
|
71
|
+
- 层级由变量控制:`--dialog-zindex`、`--popover-zindex`、`--modal-zindex`、`--toast-zindex`、`--picker-zindex` 等。
|
|
72
|
+
|
|
73
|
+
## 五、常用 CSS 变量
|
|
74
|
+
|
|
75
|
+
| 类别 | 变量 |
|
|
76
|
+
|---|---|
|
|
77
|
+
| 主色与状态色 | `--primary`、`--success`、`--warning`、`--danger`、`--info` |
|
|
78
|
+
| 文字色 | `--main-fc`、`--regular-fc`、`--secondary-fc`、`--placeholder-fc`、`--link-fc` |
|
|
79
|
+
| 背景 | `--bg-white`、`--bg-base`、`--bg-weak`、`--bg-gray` |
|
|
80
|
+
| 边框与圆角 | `--border-color`、`--diviling-line-color`、`--border-solid`、`--border-radius-xs/sm/md/lg` |
|
|
81
|
+
| 间距 | `--h-spacing-xs/sm/md/lg/xl`、`--v-spacing-xs/sm/md/lg/xl` |
|
|
82
|
+
| 字号与行高 | `--font-size-sm/md/lg/base/heading`、`--line-height-base`、`--line-height-sm` |
|
|
83
|
+
| 密度 | `--hd`(1px 换算单位,组件按它缩放) |
|
|
84
|
+
|
|
85
|
+
## 六、不要做的事
|
|
86
|
+
|
|
87
|
+
- 不用 `.ui-browser__xxx` 这类**内部 class** 覆盖样式,也不读 `weId`、不依赖 DOM 层级 —— 平台升级就会断;
|
|
88
|
+
- 不改 `prefixCls` 指望换一套样式;
|
|
89
|
+
- 不把 CSS 变量写到 `:root` 或 `body`;
|
|
90
|
+
- 不编造组件或 props,列表见 `guide-page-code.md` 第六节。
|
|
91
|
+
|
|
92
|
+
## 七、自检
|
|
93
|
+
|
|
94
|
+
- [ ] 组件根节点上的样式走 `className` / `style`,没有去写内部 class
|
|
95
|
+
- [ ] CSS 变量声明在页面根节点,没有写到 `:root`
|
|
96
|
+
- [ ] 需要改弹层时用了组件的弹层属性,没有去猜 DOM 结构
|
|
97
|
+
- [ ] `customRender` 包裹时把 `element` 渲染回去了
|
|
98
|
+
- [ ] 没有依赖 `prefixCls` 改样式
|