weaver-e10-builder 1.5.7 → 1.5.9
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/app.d.ts.map +1 -1
- package/dist/commands/app.js +259 -0
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/form-add-detail-table.d.ts.map +1 -1
- package/dist/commands/form-add-detail-table.js +13 -2
- package/dist/commands/form-add-detail-table.js.map +1 -1
- package/dist/commands/form-button.d.ts.map +1 -1
- package/dist/commands/form-button.js +6 -4
- package/dist/commands/form-button.js.map +1 -1
- package/dist/commands/form-formula-linkage.d.ts.map +1 -1
- package/dist/commands/form-formula-linkage.js +4 -4
- package/dist/commands/form-formula-linkage.js.map +1 -1
- package/dist/commands/form-list-filter.d.ts +3 -0
- package/dist/commands/form-list-filter.d.ts.map +1 -1
- package/dist/commands/form-list-filter.js +88 -24
- package/dist/commands/form-list-filter.js.map +1 -1
- package/dist/commands/form-list-search-group.d.ts.map +1 -1
- package/dist/commands/form-list-search-group.js +54 -64
- package/dist/commands/form-list-search-group.js.map +1 -1
- package/dist/commands/form-list-stats.d.ts.map +1 -1
- package/dist/commands/form-list-stats.js +29 -4
- package/dist/commands/form-list-stats.js.map +1 -1
- package/dist/commands/form-list-utils.d.ts +46 -1
- package/dist/commands/form-list-utils.d.ts.map +1 -1
- package/dist/commands/form-list-utils.js +140 -47
- package/dist/commands/form-list-utils.js.map +1 -1
- package/dist/commands/form-list.d.ts.map +1 -1
- package/dist/commands/form-list.js +141 -71
- package/dist/commands/form-list.js.map +1 -1
- package/dist/commands/form-message.d.ts +3 -0
- package/dist/commands/form-message.d.ts.map +1 -0
- package/dist/commands/form-message.js +341 -0
- package/dist/commands/form-message.js.map +1 -0
- package/dist/commands/form-view.d.ts.map +1 -1
- package/dist/commands/form-view.js +31 -4
- package/dist/commands/form-view.js.map +1 -1
- package/dist/commands/matrix.d.ts.map +1 -1
- package/dist/commands/matrix.js +80 -42
- package/dist/commands/matrix.js.map +1 -1
- package/dist/commands/org.d.ts.map +1 -1
- package/dist/commands/org.js +61 -0
- package/dist/commands/org.js.map +1 -1
- package/dist/commands/role.d.ts.map +1 -1
- package/dist/commands/role.js +69 -9
- package/dist/commands/role.js.map +1 -1
- package/dist/commands/wf-form.d.ts.map +1 -1
- package/dist/commands/wf-form.js +5 -5
- package/dist/commands/wf-form.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/services/actionflow/context_preflight.d.ts +3 -3
- package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
- package/dist/services/actionflow/context_preflight.js +45 -24
- package/dist/services/actionflow/context_preflight.js.map +1 -1
- package/dist/services/actionflow/context_provider.d.ts +7 -0
- package/dist/services/actionflow/context_provider.d.ts.map +1 -1
- package/dist/services/actionflow/context_provider.js +13 -1
- package/dist/services/actionflow/context_provider.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts +15 -0
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +401 -57
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/param_group_dto.d.ts.map +1 -1
- package/dist/services/actionflow/param_group_dto.js +17 -3
- package/dist/services/actionflow/param_group_dto.js.map +1 -1
- package/dist/services/actionflow/param_type.d.ts +14 -0
- package/dist/services/actionflow/param_type.d.ts.map +1 -0
- package/dist/services/actionflow/param_type.js +69 -0
- package/dist/services/actionflow/param_type.js.map +1 -0
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +59 -41
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +65 -29
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/app-publish.d.ts +227 -0
- package/dist/services/app-publish.d.ts.map +1 -0
- package/dist/services/app-publish.js +403 -0
- package/dist/services/app-publish.js.map +1 -0
- package/dist/services/form-button-position.d.ts.map +1 -1
- package/dist/services/form-button-position.js +7 -1
- package/dist/services/form-button-position.js.map +1 -1
- package/dist/services/form-field-drop.d.ts.map +1 -1
- package/dist/services/form-field-drop.js +7 -0
- package/dist/services/form-field-drop.js.map +1 -1
- package/dist/services/form-formula-linkage.d.ts +24 -3
- package/dist/services/form-formula-linkage.d.ts.map +1 -1
- package/dist/services/form-formula-linkage.js +24 -5
- package/dist/services/form-formula-linkage.js.map +1 -1
- package/dist/services/form-list-search-group.d.ts +89 -0
- package/dist/services/form-list-search-group.d.ts.map +1 -0
- package/dist/services/form-list-search-group.js +260 -0
- package/dist/services/form-list-search-group.js.map +1 -0
- package/dist/services/form-list-search.d.ts +110 -0
- package/dist/services/form-list-search.d.ts.map +1 -0
- package/dist/services/form-list-search.js +231 -0
- package/dist/services/form-list-search.js.map +1 -0
- package/dist/services/form-list-stats.d.ts +21 -1
- package/dist/services/form-list-stats.d.ts.map +1 -1
- package/dist/services/form-list-stats.js +86 -12
- package/dist/services/form-list-stats.js.map +1 -1
- package/dist/services/form-message.d.ts +273 -0
- package/dist/services/form-message.d.ts.map +1 -0
- package/dist/services/form-message.js +575 -0
- package/dist/services/form-message.js.map +1 -0
- package/dist/services/form-sub-detail.d.ts.map +1 -1
- package/dist/services/form-sub-detail.js +5 -1
- package/dist/services/form-sub-detail.js.map +1 -1
- package/dist/services/form-view.d.ts +34 -2
- package/dist/services/form-view.d.ts.map +1 -1
- package/dist/services/form-view.js +74 -8
- package/dist/services/form-view.js.map +1 -1
- package/dist/services/matrix-fields.d.ts +42 -0
- package/dist/services/matrix-fields.d.ts.map +1 -0
- package/dist/services/matrix-fields.js +102 -0
- package/dist/services/matrix-fields.js.map +1 -0
- package/dist/services/org-browser.d.ts +60 -0
- package/dist/services/org-browser.d.ts.map +1 -0
- package/dist/services/org-browser.js +62 -0
- package/dist/services/org-browser.js.map +1 -0
- package/dist/services/quick-date-range.d.ts +22 -0
- package/dist/services/quick-date-range.d.ts.map +1 -0
- package/dist/services/quick-date-range.js +134 -0
- package/dist/services/quick-date-range.js.map +1 -0
- package/dist/services/role-member.d.ts +73 -2
- package/dist/services/role-member.d.ts.map +1 -1
- package/dist/services/role-member.js +141 -9
- package/dist/services/role-member.js.map +1 -1
- package/package.json +1 -1
- package/skill-docs/SKILL.md +281 -278
- package/skill-docs/_catalog.md +3 -0
- package/skill-docs/actionflows/SKILL.md +2 -1
- package/skill-docs/actionflows/references/components/message/InnerMQSend.md +6 -0
- package/skill-docs/references/app/guide-app-publish.md +92 -0
- package/skill-docs/references/common/guide-plan-template.md +148 -252
- package/skill-docs/references/common/map.md +2 -1
- package/skill-docs/references/common/ref-cli-commands.md +27 -8
- package/skill-docs/references/form/guide-form-message.md +57 -0
- package/skill-docs/references/form/guide-form-view.md +7 -2
- package/skill-docs/references/form/guide-formula-linkage.md +1 -1
- package/skill-docs/references/form/guide-list-stats.md +55 -2
- package/skill-docs/references/hrm/guide-matrix.md +30 -2
|
@@ -1,50 +1,26 @@
|
|
|
1
1
|
import { AuthSession } from '../core/auth.js';
|
|
2
2
|
import { ApiClient } from '../core/client.js';
|
|
3
3
|
import { loadMobileConfig } from './form-list-utils.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
* config{formId(=tableField.browserParams.formId), hideScore:true, groupId:"-1", dataType:["dataOptionObj"],
|
|
11
|
-
* title, type, dataCount:0, selectedNum:"", dataKey(=physicalField), columnName(=physicalField),
|
|
12
|
-
* systemField:true, labelObj:{}, columnTypeSwitch:false, showOrder, placeholder:"", componentKey, fieldId},
|
|
13
|
-
* listFilterDefaultSets{listGroupSets:[], multiSelect:true, enableShowCountNum:1, showCountNumType:"notUpdate",
|
|
14
|
-
* enableShowCountNumLimit:0, enableBrowserFilter:0, showArchiveOption:"1"}
|
|
15
|
-
* **产品边界**:分类搜索**不支持明细字段**(条目无 subTableId,仅主表字段)。传入明细字段 fieldId 会报错。
|
|
16
|
-
* listGroupSets 留空数组(平台运行时据字段 options 生成,CLI 不造)。
|
|
17
|
-
* 仅支持选项类字段(Select/RadioBox/CheckBox,dataType:["dataOptionObj"]);其他类型需抓包确认 dataType。
|
|
18
|
-
*/
|
|
19
|
-
const OPTION_COMP = new Set(['Select', 'RadioBox', 'CheckBox']);
|
|
20
|
-
function buildGroupFilter(t, objId, showPosition = '1') {
|
|
21
|
-
const id = String(t.id);
|
|
22
|
-
return {
|
|
23
|
-
id, fieldId: id,
|
|
24
|
-
name: `field_${id}`, fieldName: `field_${id}`,
|
|
25
|
-
compType: t.compType, componentKey: t.compType,
|
|
26
|
-
showName: t.text, fieldShowName: t.text, text: t.text,
|
|
27
|
-
objId: t.objId || objId,
|
|
28
|
-
fieldType: t.type, type: t.type,
|
|
29
|
-
expandMethod: '0', showPosition, tabStyle: 'select',
|
|
30
|
-
config: {
|
|
31
|
-
formId: t.browserParams?.formId, hideScore: true, groupId: '-1',
|
|
32
|
-
dataType: ['dataOptionObj'], title: t.text, type: t.type,
|
|
33
|
-
dataCount: 0, selectedNum: '', dataKey: t.physicalField, columnName: t.physicalField,
|
|
34
|
-
systemField: true, labelObj: {}, columnTypeSwitch: false, showOrder: t.showOrder || 0, placeholder: '',
|
|
35
|
-
componentKey: t.compType, fieldId: id,
|
|
36
|
-
},
|
|
37
|
-
listFilterDefaultSets: { listGroupSets: [], multiSelect: true, enableShowCountNum: 1, showCountNumType: 'notUpdate', enableShowCountNumLimit: 0, enableBrowserFilter: 0, showArchiveOption: '1' },
|
|
38
|
-
};
|
|
4
|
+
import { DATE_GRANULARITIES, KIND_LABEL, buildGroupFilterEntry, extractCandidateColumns, listGroupFilters, parseDateGranularity, parseOptionOrder, parseShowPosition, resolveCandidateColumn, resolveGroupFilterKind, resolveOptionKeys, } from '../services/form-list-search-group.js';
|
|
5
|
+
/** 逗号分隔的名字列表(`--options 选项1,选项2`)。 */
|
|
6
|
+
function nameList(v, acc) {
|
|
7
|
+
for (const part of String(v).split(/[,,]/).map((s) => s.trim()).filter(Boolean))
|
|
8
|
+
acc.push(part);
|
|
9
|
+
return acc;
|
|
39
10
|
}
|
|
40
11
|
export function registerListSearchGroupCommand(form, program) {
|
|
41
12
|
form.command('list-search-group')
|
|
42
|
-
.description('
|
|
13
|
+
.description('查看/配置台账分类搜索(选项 / 浏览框 / 日期 / 系统字段;仅主表字段,不支持明细)')
|
|
43
14
|
.argument('<objId>', '表单 objId')
|
|
44
15
|
.argument('<appId>', '应用 ID')
|
|
45
16
|
.argument('<listId>', '台账列表 ID')
|
|
46
|
-
.option('--add
|
|
47
|
-
.option('--position <0|1>', '显示位置:1
|
|
17
|
+
.option('--add <字段名或fieldId>', '加入分类搜索(已在里面则按本次参数重建那条)')
|
|
18
|
+
.option('--position <0|1>', '显示位置:1=顶部(缺省)/ 0=下拉样式', '1')
|
|
19
|
+
.option('--option-order <default|field>', '选项排序:default=默认排序(缺省)/ field=按字段属性设置(浏览框专有)')
|
|
20
|
+
.option('--no-show-count', '不显示统计数字(缺省显示)')
|
|
21
|
+
.option('--date-granularity <列表>', `日期粒度,逗号分隔:${DATE_GRANULARITIES.map((g) => g.name).join('/')}(缺省全要)`)
|
|
22
|
+
.option('--options <列表>', '只让这些选项出现,逗号分隔(选项类专有;缺省全部出现)', nameList, [])
|
|
23
|
+
.option('--default-options <列表>', '这些选项默认选中,逗号分隔', nameList, [])
|
|
48
24
|
.option('--remove <fieldId>', '按字段 ID 移除一条分类搜索')
|
|
49
25
|
.option('--clear', '清空所有分类搜索')
|
|
50
26
|
.option('--pc-only', '目标明确只使用 PC;移动端配置不存在时允许继续')
|
|
@@ -64,7 +40,7 @@ export function registerListSearchGroupCommand(form, program) {
|
|
|
64
40
|
}
|
|
65
41
|
const cfg = getRes?.data || {};
|
|
66
42
|
const sc = cfg.searchConditions || {};
|
|
67
|
-
const groupFilters =
|
|
43
|
+
const groupFilters = listGroupFilters(cfg);
|
|
68
44
|
if (!cmdOpts.add && !cmdOpts.remove && !cmdOpts.clear) {
|
|
69
45
|
if (isJson) {
|
|
70
46
|
console.log(JSON.stringify(groupFilters, null, 2));
|
|
@@ -75,8 +51,10 @@ export function registerListSearchGroupCommand(form, program) {
|
|
|
75
51
|
return;
|
|
76
52
|
}
|
|
77
53
|
console.log(`分类搜索 (${groupFilters.length}):`);
|
|
78
|
-
for (const g of groupFilters)
|
|
79
|
-
|
|
54
|
+
for (const g of groupFilters) {
|
|
55
|
+
const kind = kindOfEntry(g);
|
|
56
|
+
console.log(` - ${g.showName || g.text} (fieldId=${g.fieldId}, ${g.fieldType || g.type}, ${KIND_LABEL[kind]}${kind === 'browser' ? `, 位置=${g.showPosition}` : ''})`);
|
|
57
|
+
}
|
|
80
58
|
return;
|
|
81
59
|
}
|
|
82
60
|
if (cmdOpts.clear) {
|
|
@@ -91,34 +69,34 @@ export function registerListSearchGroupCommand(form, program) {
|
|
|
91
69
|
}
|
|
92
70
|
}
|
|
93
71
|
else if (cmdOpts.add) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
if (!t) {
|
|
98
|
-
console.error(`字段 ${cmdOpts.add} 不在显示列中(分类搜索需先加入显示列:form list-columns --add)`);
|
|
99
|
-
process.exit(1);
|
|
100
|
-
}
|
|
101
|
-
if (t.subTableId && String(t.subTableId) !== '') {
|
|
102
|
-
console.error(`字段「${t.text}」是明细字段,分类搜索不支持明细字段(产品边界,仅主表)`);
|
|
103
|
-
process.exit(1);
|
|
104
|
-
}
|
|
105
|
-
if (!OPTION_COMP.has(t.compType || t.type)) {
|
|
106
|
-
console.error(`字段「${t.text}」类型 ${t.compType || t.type} 不支持分类搜索(仅选项类:Select/RadioBox/CheckBox)`);
|
|
107
|
-
process.exit(1);
|
|
108
|
-
}
|
|
109
|
-
if (groupFilters.find((g) => String(g.fieldId) === String(cmdOpts.add))) {
|
|
110
|
-
console.error(`字段 ${cmdOpts.add} 已在分类搜索中`);
|
|
72
|
+
const columns = extractCandidateColumns(cfg);
|
|
73
|
+
if (columns.length === 0) {
|
|
74
|
+
console.error('台账配置里没有候选字段(fieldUsage[0].fields 为空),无法解析字段');
|
|
111
75
|
process.exit(1);
|
|
112
76
|
}
|
|
113
|
-
const
|
|
114
|
-
if (
|
|
115
|
-
console.error(`字段「${
|
|
77
|
+
const col = resolveCandidateColumn(columns, cmdOpts.add);
|
|
78
|
+
if (col.subTableId && String(col.subTableId) !== '') {
|
|
79
|
+
console.error(`字段「${col.text}」是明细字段,分类搜索不支持明细字段(产品边界,仅主表)`);
|
|
116
80
|
process.exit(1);
|
|
117
81
|
}
|
|
118
|
-
|
|
119
|
-
|
|
82
|
+
const kind = resolveGroupFilterKind(col); // 类型不认会在这里报错
|
|
83
|
+
const buildOpts = {
|
|
84
|
+
position: parseShowPosition(cmdOpts.position),
|
|
85
|
+
optionOrder: parseOptionOrder(cmdOpts.optionOrder),
|
|
86
|
+
showCount: cmdOpts.showCount !== false,
|
|
87
|
+
granularity: parseDateGranularity(cmdOpts.dateGranularity),
|
|
88
|
+
optionShow: resolveOptionKeys(col?.config?.options, cmdOpts.options, '--options'),
|
|
89
|
+
optionDefault: resolveOptionKeys(col?.config?.options, cmdOpts.defaultOptions, '--default-options'),
|
|
90
|
+
};
|
|
91
|
+
const entry = buildGroupFilterEntry(col, buildOpts);
|
|
92
|
+
// 已在里面 → 就地替换那条(改配置走这里);否则追加
|
|
93
|
+
const idx = groupFilters.findIndex((g) => String(g.fieldId) === String(entry.fieldId));
|
|
94
|
+
sc.groupFilters = idx >= 0
|
|
95
|
+
? groupFilters.map((g, i) => (i === idx ? entry : g))
|
|
96
|
+
: [...groupFilters, entry];
|
|
97
|
+
const verb = idx >= 0 ? '已更新' : '已加入';
|
|
98
|
+
console.error(` ${verb}分类搜索: ${col.text} (${KIND_LABEL[kind]}${kind === 'browser' ? `, 位置=${buildOpts.position}` : ''})`);
|
|
120
99
|
}
|
|
121
|
-
// 保存前读回真实移动端 mConfig 原样回传(仅改 PC config.searchConditions,移动端保持原样)
|
|
122
100
|
const { mobileConfig, mobilePreserved } = await loadMobileConfig(client, baseUrl, appId, listId, cmdOpts.pcOnly);
|
|
123
101
|
const saveRes = await client.post(`${baseUrl}/api/bs/ebuilder/form/list/saveNListConfig?apid=${appId}`, {
|
|
124
102
|
listId, appId, terminalType: 'PC', config: { ...cfg, searchConditions: sc }, mConfig: mobileConfig,
|
|
@@ -136,4 +114,16 @@ export function registerListSearchGroupCommand(form, program) {
|
|
|
136
114
|
}
|
|
137
115
|
});
|
|
138
116
|
}
|
|
117
|
+
/** 回读条目判类型:条目上没有 `fieldClassification`,只能按 `fieldType`/`type` 反推。 */
|
|
118
|
+
function kindOfEntry(g) {
|
|
119
|
+
const t = String(g?.fieldType || g?.type || '');
|
|
120
|
+
if (['Select', 'RadioBox', 'CheckBox'].includes(t))
|
|
121
|
+
return 'option';
|
|
122
|
+
if (['DateComponent', 'Date', 'DateTime'].includes(t))
|
|
123
|
+
return 'date';
|
|
124
|
+
// 系统字段的 id 是语义键("2"/"5" 这种),雪花 id 都很长
|
|
125
|
+
if (String(g?.fieldId ?? '').length < 15)
|
|
126
|
+
return 'system';
|
|
127
|
+
return 'browser';
|
|
128
|
+
}
|
|
139
129
|
//# sourceMappingURL=form-list-search-group.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-list-search-group.js","sourceRoot":"","sources":["../../src/commands/form-list-search-group.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"form-list-search-group.js","sourceRoot":"","sources":["../../src/commands/form-list-search-group.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-list-stats.d.ts","sourceRoot":"","sources":["../../src/commands/form-list-stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"form-list-stats.d.ts","sourceRoot":"","sources":["../../src/commands/form-list-stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAiD9E"}
|
|
@@ -2,6 +2,18 @@ import { readFileSync } from 'node:fs';
|
|
|
2
2
|
import { AuthSession } from '../core/auth.js';
|
|
3
3
|
import { ApiClient } from '../core/client.js';
|
|
4
4
|
import { ListStatsService } from '../services/form-list-stats.js';
|
|
5
|
+
/** `on|off` 三态:不传 = 不动该项。 */
|
|
6
|
+
function parseOnOff(value, label) {
|
|
7
|
+
if (value === undefined)
|
|
8
|
+
return undefined;
|
|
9
|
+
const v = String(value).trim().toLowerCase();
|
|
10
|
+
if (['on', 'true', '1', 'yes'].includes(v))
|
|
11
|
+
return true;
|
|
12
|
+
if (['off', 'false', '0', 'no'].includes(v))
|
|
13
|
+
return false;
|
|
14
|
+
throw new Error(`${label} 只接受 on|off(收到「${value}」)`);
|
|
15
|
+
}
|
|
16
|
+
const splitIds = (value) => (value === undefined ? [] : String(value).split(',').map(s => s.trim()).filter(Boolean));
|
|
5
17
|
export function registerListStatsCommand(form, program) {
|
|
6
18
|
async function run(objId, appId, listId, work) {
|
|
7
19
|
try {
|
|
@@ -18,16 +30,29 @@ export function registerListStatsCommand(form, program) {
|
|
|
18
30
|
process.exitCode = 1;
|
|
19
31
|
}
|
|
20
32
|
}
|
|
21
|
-
const command = form.command('list-stats').description('
|
|
33
|
+
const command = form.command('list-stats').description('查看/配置主表及明细统计(统计项、启用状态、显示位置、加载方式、点击过滤),保存后回读并校验移动端')
|
|
22
34
|
.argument('[objId]', '表单 objId').argument('[appId]', '应用 ID').argument('[listId]', '台账视图 ID')
|
|
23
|
-
.option('--add <json|@file>', '统计对象:{fieldId,type,name?,subFormId?,conditions?};明细 count 可只填 type/subFormId')
|
|
35
|
+
.option('--add <json|@file>', '统计对象:{fieldId,type,name?,subFormId?,conditions?,enable?};明细 count 可只填 type/subFormId;enable:false 建出来即停用')
|
|
24
36
|
.option('--remove <statId>', '移除统计项 ID(operation:DELETE)')
|
|
37
|
+
.option('--enable <statIds>', '启用统计项(逗号分隔)')
|
|
38
|
+
.option('--disable <statIds>', '停用统计项(逗号分隔)')
|
|
39
|
+
.option('--position <code>', '显示位置:top 顶部显示 / topSimple 顶部简约显示 / topRight 右上角显示(也收中文标签)')
|
|
40
|
+
.option('--manual-load <on|off>', '手动加载统计值(开了就不进视图自动跑)')
|
|
41
|
+
.option('--filter-data <on|off>', '点击统计结果过滤列表数据')
|
|
25
42
|
.option('--pc-only', '明确仅 PC 使用;移动端读取失败时允许继续')
|
|
26
43
|
.option('--json', 'JSON 输出')
|
|
27
44
|
.action((objId, appId, listId, raw) => run(objId, appId, listId, async (service) => {
|
|
28
45
|
if (raw.add && raw.remove)
|
|
29
46
|
throw new Error('--add 与 --remove 不能同时使用');
|
|
30
|
-
|
|
47
|
+
const panel = {
|
|
48
|
+
position: raw.position,
|
|
49
|
+
manualLoad: parseOnOff(raw.manualLoad, '--manual-load'),
|
|
50
|
+
filterData: parseOnOff(raw.filterData, '--filter-data'),
|
|
51
|
+
};
|
|
52
|
+
const enable = splitIds(raw.enable), disable = splitIds(raw.disable);
|
|
53
|
+
const editing = raw.add || raw.remove || raw.position !== undefined
|
|
54
|
+
|| panel.manualLoad !== undefined || panel.filterData !== undefined || enable.length || disable.length;
|
|
55
|
+
if (!editing)
|
|
31
56
|
return (await service.config()).listStatistics || {};
|
|
32
57
|
const rules = [];
|
|
33
58
|
if (raw.add) {
|
|
@@ -36,7 +61,7 @@ export function registerListStatsCommand(form, program) {
|
|
|
36
61
|
throw new Error('--add 必须为统计对象');
|
|
37
62
|
rules.push(value);
|
|
38
63
|
}
|
|
39
|
-
return service.save(rules, raw.remove ? [raw.remove] : [], raw.pcOnly);
|
|
64
|
+
return service.save(rules, raw.remove ? [raw.remove] : [], raw.pcOnly, { enable, disable, panel });
|
|
40
65
|
}));
|
|
41
66
|
command.command('detail').description('为指定明细子表批量配置选定数值字段求和及一项记录计数,重复运行复用同配置')
|
|
42
67
|
.argument('<objId>', '来源表单 ID').argument('<appId>', '应用 ID').argument('<listId>', '视图 ID').argument('<subFormId>', '明细子表 ID')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-list-stats.js","sourceRoot":"","sources":["../../src/commands/form-list-stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"form-list-stats.js","sourceRoot":"","sources":["../../src/commands/form-list-stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,12 @@ export interface CondInput {
|
|
|
20
20
|
text?: string;
|
|
21
21
|
/** 值引用另一字段(field vs field,"当前变量"):填目标字段名或 fieldId。设置后 value 自动构造为 compareFormField 对象 */
|
|
22
22
|
valueField?: string;
|
|
23
|
+
/**
|
|
24
|
+
* 日期区间的**快捷档**(设计器「区间」旁边那排:今天 / 本周 / 今年 …,共 16 档)。
|
|
25
|
+
* 给了它就等价于 `func: "range"` + 当场算好的起止日期(见 `services/quick-date-range.ts`)——
|
|
26
|
+
* 设计器也是这么干的,存进去的是**死日期**,不是动态标记。可与 `func`/`value` 二选一,不能同时给。
|
|
27
|
+
*/
|
|
28
|
+
quick?: string;
|
|
23
29
|
}
|
|
24
30
|
/**
|
|
25
31
|
* 解析条件里的 valueField(值引用另一字段)→ 构造 compareFormField 对象。
|
|
@@ -41,7 +47,46 @@ export declare function resolveValueFieldRefs(client: {
|
|
|
41
47
|
* @param fields fetchFields 返回的字段表,用于补 fieldType/text/compType
|
|
42
48
|
* @param objId 表单 objId
|
|
43
49
|
* @param filterIsNull 统计 rootdata 用 false、视图数据条件 filter 用 true
|
|
50
|
+
* @param now 快捷档(`quick`)的基准时刻,默认当下;仅供测试注入
|
|
44
51
|
* @returns JSON 字符串(空条件返回 '')
|
|
45
52
|
*/
|
|
46
|
-
|
|
53
|
+
/** 条件组:组内关系 + 子节点(子节点本身也可以是组,与顶层同构)。 */
|
|
54
|
+
export interface CondGroup {
|
|
55
|
+
/** 组内关系:`and` / `or`(或码 `1` / `0`)。缺省 AND。 */
|
|
56
|
+
relation?: string;
|
|
57
|
+
conditions: CondNode[];
|
|
58
|
+
}
|
|
59
|
+
/** 条件树的节点:叶子条件,或一个条件组。**有 `conditions` 数组就是组**,否则按条件(认 `fieldId`)。 */
|
|
60
|
+
export type CondNode = CondInput | CondGroup;
|
|
61
|
+
export declare const isCondGroup: (n: any) => n is CondGroup;
|
|
62
|
+
export declare function relationCode(raw: any, fallback: string): string;
|
|
63
|
+
/**
|
|
64
|
+
* 渲染 `rootStr`。实测规则:**≥2 个孩子才套一层括号**,单个孩子直接用它的渲染结果
|
|
65
|
+
* (所以单条件条件是 `( 创建时间 区间 '…' )` 而不是双括号),组内按自己的关系码连接。
|
|
66
|
+
*/
|
|
67
|
+
export declare function renderCond(n: any): string;
|
|
68
|
+
/** 树里(已构建的)所有叶子条件(供展示、后处理用)。 */
|
|
69
|
+
export declare function condLeaves(node: any): any[];
|
|
70
|
+
/** 入参节点数组 → 所有叶子条件(递归进组;供字段校验、值引用解析用)。 */
|
|
71
|
+
export declare function inputLeaves(nodes: CondNode[]): CondInput[];
|
|
72
|
+
export declare function buildConditionTree(conditions: CondNode[], fields: any[], objId: string, filterIsNull: boolean, opts?: {
|
|
73
|
+
now?: Date;
|
|
74
|
+
relation?: string;
|
|
75
|
+
}): string;
|
|
76
|
+
/**
|
|
77
|
+
* 把新条件**叠加**到已有条件树上(这是 `--add` 的语义:原地加,不整体覆盖)。
|
|
78
|
+
* 已有树为空/不存在时等价于新建。不给 `relation` 就沿用现有顶层关系。
|
|
79
|
+
*/
|
|
80
|
+
export declare function appendConditions(existing: any, nodes: CondNode[], fields: any[], objId: string, opts?: {
|
|
81
|
+
now?: Date;
|
|
82
|
+
relation?: string;
|
|
83
|
+
}): any;
|
|
84
|
+
/**
|
|
85
|
+
* 按字段 ID 摘条件(**该字段的所有条件都摘**;组被摘空就整组拿掉)。
|
|
86
|
+
* 同一个字段有多条条件时想只摘一条 —— 用 `--replace` 传整棵树。
|
|
87
|
+
*/
|
|
88
|
+
export declare function removeConditions(existing: any, targets: string[]): {
|
|
89
|
+
filter: any;
|
|
90
|
+
removed: number;
|
|
91
|
+
};
|
|
47
92
|
//# sourceMappingURL=form-list-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-list-utils.d.ts","sourceRoot":"","sources":["../../src/commands/form-list-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"form-list-utils.d.ts","sourceRoot":"","sources":["../../src/commands/form-list-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resolveQuickDateRange } from '../services/quick-date-range.js';
|
|
1
2
|
/**
|
|
2
3
|
* 通过 multipart/form-data 的 ds/fields 接口拉取表单字段元数据。
|
|
3
4
|
* 供 list-columns / list-search / list-stats / list-filter 等命令共用。
|
|
@@ -133,59 +134,151 @@ export async function resolveValueFieldRefs(client, baseUrl, appId, objId, condi
|
|
|
133
134
|
delete c.valueField;
|
|
134
135
|
}
|
|
135
136
|
}
|
|
137
|
+
export const isCondGroup = (n) => Array.isArray(n?.conditions);
|
|
138
|
+
/** 关系码:实测 `1` = AND、`0` = OR(设计器把顶层切成 OR 时发的是 `"0"`)。 */
|
|
139
|
+
const REL_CODES = { and: '1', '1': '1', or: '0', '0': '0' };
|
|
140
|
+
export function relationCode(raw, fallback) {
|
|
141
|
+
if (raw === undefined || raw === null || raw === '')
|
|
142
|
+
return fallback;
|
|
143
|
+
const code = REL_CODES[String(raw).trim().toLowerCase()];
|
|
144
|
+
if (!code)
|
|
145
|
+
throw new Error(`未知的条件关系「${raw}」,只支持 and / or(或 1 / 0)`);
|
|
146
|
+
return code;
|
|
147
|
+
}
|
|
148
|
+
const relLabel = (code) => (String(code) === '0' ? 'OR' : 'AND');
|
|
149
|
+
/** 叶子条件 → 树节点。 */
|
|
150
|
+
function conditionNode(c, parentKey, key, fields, objId, now) {
|
|
151
|
+
const cf = fields.find((x) => String(x.id) === String(c.fieldId));
|
|
152
|
+
const fieldType = cf?.type || 'String';
|
|
153
|
+
const compType = cf?.compType || fieldType;
|
|
154
|
+
if (c.quick && (c.value !== undefined || c.valueField !== undefined || c.func !== undefined)) {
|
|
155
|
+
throw new Error(`条件 ${c.fieldId} 的 quick 不能与 func/value/valueField 同时使用:快捷档本身已经决定了区间`);
|
|
156
|
+
}
|
|
157
|
+
// 快捷档 → 当场算好的起止日期(设计器同样存死日期,见 services/quick-date-range.ts)
|
|
158
|
+
const quick = c.quick ? resolveQuickDateRange(c.quick, now) : null;
|
|
159
|
+
const func = quick ? 'range' : FUNC_NORMALIZE[c.func || 'eq'] || c.func || 'eq';
|
|
160
|
+
const isRange = func === 'range';
|
|
161
|
+
const isUnaggregate = func === 'unaggregate'; // 不属于:value 为逗号分隔字符串(抓包 "v1,v2,v3")
|
|
162
|
+
const isSelect = ['Select', 'SelectMultiple'].includes(compType) || ['Select', 'SelectMultiple'].includes(fieldType);
|
|
163
|
+
const isDateNum = fieldType === 'Date' || fieldType === 'Number';
|
|
164
|
+
return {
|
|
165
|
+
isParent: false, parentNode: parentKey, key,
|
|
166
|
+
id: c.fieldId, fieldName: 'field_' + c.fieldId,
|
|
167
|
+
fieldType, text: cf?.text || c.fieldId,
|
|
168
|
+
optionType: '',
|
|
169
|
+
originBrowserType: isSelect ? 'browser' : '',
|
|
170
|
+
objId, compType, type: 'condition',
|
|
171
|
+
conditions: {
|
|
172
|
+
func,
|
|
173
|
+
// 快捷档直接落算好的区间;否则:对象 value(字段引用 {compareFormField,...})原样保留;
|
|
174
|
+
// unaggregate 数组 join 成逗号串;range 保数组;其余转字符串
|
|
175
|
+
value: quick ?? (isRange ? c.value
|
|
176
|
+
: (isUnaggregate && Array.isArray(c.value) ? c.value.map(String).join(',')
|
|
177
|
+
: (c.value && typeof c.value === 'object' ? c.value : String(c.value ?? '')))),
|
|
178
|
+
type: '',
|
|
179
|
+
text: isRange ? '' : (c.text || ''),
|
|
180
|
+
isEsb: false,
|
|
181
|
+
},
|
|
182
|
+
multiSelect: 'false', formInfo: { fieldId: c.fieldId },
|
|
183
|
+
module: 'ebuilderform', mainField: true, subTableId: '',
|
|
184
|
+
dbFieldType: 'String', isEdit: '0',
|
|
185
|
+
...(isDateNum ? { formatType: '4' } : {}),
|
|
186
|
+
config: { fieldId: c.fieldId },
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/** 把一组入参节点铺成 `datas` 数组:子节点的 `parentNode` 指向 `parentKey`。 */
|
|
190
|
+
function childrenOf(nodes, parentKey, prefix, fields, objId, now) {
|
|
191
|
+
if (!Array.isArray(nodes) || nodes.length === 0)
|
|
192
|
+
throw new Error('条件组至少要有一个条件');
|
|
193
|
+
return nodes.map((n, i) => isCondGroup(n)
|
|
194
|
+
? groupNode(n.conditions, parentKey, `${prefix}_${i + 1}`, relationCode(n.relation, '1'), fields, objId, now)
|
|
195
|
+
: conditionNode(n, parentKey, `${prefix}_${i + 1}`, fields, objId, now));
|
|
196
|
+
}
|
|
197
|
+
/** 一组节点 → 父节点(顶层与嵌套组同构:`isParent:true` + 自己的 `relationship` + `datas`)。 */
|
|
198
|
+
function groupNode(nodes, parentKey, key, relation, fields, objId, now) {
|
|
199
|
+
return {
|
|
200
|
+
key, relationship: relation, isParent: true, parentNode: parentKey,
|
|
201
|
+
datas: childrenOf(nodes, key, key, fields, objId, now),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
136
204
|
/**
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* func 用设计师 code(neq/range,非 notEq/between);dbFieldType 抓包恒为 "String";
|
|
140
|
-
* Select 条件 originBrowserType="browser";Date/Number 条件带 formatType="4"。
|
|
141
|
-
* @param conditions 条件数组(多条件默认 AND,relationship:'1')
|
|
142
|
-
* @param fields fetchFields 返回的字段表,用于补 fieldType/text/compType
|
|
143
|
-
* @param objId 表单 objId
|
|
144
|
-
* @param filterIsNull 统计 rootdata 用 false、视图数据条件 filter 用 true
|
|
145
|
-
* @returns JSON 字符串(空条件返回 '')
|
|
205
|
+
* 渲染 `rootStr`。实测规则:**≥2 个孩子才套一层括号**,单个孩子直接用它的渲染结果
|
|
206
|
+
* (所以单条件条件是 `( 创建时间 区间 '…' )` 而不是双括号),组内按自己的关系码连接。
|
|
146
207
|
*/
|
|
147
|
-
export function
|
|
208
|
+
export function renderCond(n) {
|
|
209
|
+
if (!n?.isParent)
|
|
210
|
+
return `( ${condRootStr(n)} )`;
|
|
211
|
+
const children = (n.datas || []).map(renderCond);
|
|
212
|
+
if (children.length <= 1)
|
|
213
|
+
return children[0] ?? '';
|
|
214
|
+
return `(${children.join(` ${relLabel(n.relationship)} `)})`;
|
|
215
|
+
}
|
|
216
|
+
/** 树里(已构建的)所有叶子条件(供展示、后处理用)。 */
|
|
217
|
+
export function condLeaves(node) {
|
|
218
|
+
if (!node)
|
|
219
|
+
return [];
|
|
220
|
+
if (!node.isParent)
|
|
221
|
+
return [node];
|
|
222
|
+
return (node.datas || []).flatMap((d) => condLeaves(d));
|
|
223
|
+
}
|
|
224
|
+
/** 入参节点数组 → 所有叶子条件(递归进组;供字段校验、值引用解析用)。 */
|
|
225
|
+
export function inputLeaves(nodes) {
|
|
226
|
+
return (nodes || []).flatMap((n) => (isCondGroup(n) ? inputLeaves(n.conditions) : [n]));
|
|
227
|
+
}
|
|
228
|
+
export function buildConditionTree(conditions, fields, objId, filterIsNull, opts = {}) {
|
|
148
229
|
if (!Array.isArray(conditions) || conditions.length === 0)
|
|
149
230
|
return '';
|
|
150
231
|
const topKey = String(Date.now());
|
|
151
|
-
const
|
|
152
|
-
const cf = fields.find((x) => String(x.id) === String(c.fieldId));
|
|
153
|
-
const fieldType = cf?.type || 'String';
|
|
154
|
-
const compType = cf?.compType || fieldType;
|
|
155
|
-
const func = FUNC_NORMALIZE[c.func || 'eq'] || c.func || 'eq';
|
|
156
|
-
const isRange = func === 'range';
|
|
157
|
-
const isUnaggregate = func === 'unaggregate'; // 不属于:value 为逗号分隔字符串(抓包 "v1,v2,v3")
|
|
158
|
-
const isSelect = ['Select', 'SelectMultiple'].includes(compType) || ['Select', 'SelectMultiple'].includes(fieldType);
|
|
159
|
-
const isDateNum = fieldType === 'Date' || fieldType === 'Number';
|
|
160
|
-
return {
|
|
161
|
-
isParent: false, parentNode: topKey, key: topKey + (i + 1),
|
|
162
|
-
id: c.fieldId, fieldName: 'field_' + c.fieldId,
|
|
163
|
-
fieldType, text: cf?.text || c.fieldId,
|
|
164
|
-
optionType: '',
|
|
165
|
-
originBrowserType: isSelect ? 'browser' : '',
|
|
166
|
-
objId, compType, type: 'condition',
|
|
167
|
-
conditions: {
|
|
168
|
-
func,
|
|
169
|
-
// 对象 value(字段引用 {compareFormField,...})原样保留;unaggregate 数组 join 成逗号串;range 保数组;其余转字符串
|
|
170
|
-
value: isRange ? c.value
|
|
171
|
-
: (isUnaggregate && Array.isArray(c.value) ? c.value.map(String).join(',')
|
|
172
|
-
: (c.value && typeof c.value === 'object' ? c.value : String(c.value ?? ''))),
|
|
173
|
-
type: '',
|
|
174
|
-
text: isRange ? '' : (c.text || ''),
|
|
175
|
-
isEsb: false,
|
|
176
|
-
},
|
|
177
|
-
multiSelect: 'false', formInfo: { fieldId: c.fieldId },
|
|
178
|
-
module: 'ebuilderform', mainField: true, subTableId: '',
|
|
179
|
-
dbFieldType: 'String', isEdit: '0',
|
|
180
|
-
...(isDateNum ? { formatType: '4' } : {}),
|
|
181
|
-
config: { fieldId: c.fieldId },
|
|
182
|
-
};
|
|
183
|
-
});
|
|
184
|
-
const parts = datas.map((d) => `( ${condRootStr(d)} )`);
|
|
185
|
-
const rootStr = parts.length > 1 ? `(${parts.join(' AND ')})` : parts[0];
|
|
232
|
+
const top = groupNode(conditions, '', topKey, relationCode(opts.relation, '1'), fields, objId, opts.now);
|
|
186
233
|
return JSON.stringify({
|
|
187
|
-
key: topKey, relationship:
|
|
188
|
-
datas, version: 1, filterIsNull, isFilterSub: false, rootStr,
|
|
234
|
+
key: topKey, relationship: top.relationship, isParent: true, isNewFilter: true, parentNode: '',
|
|
235
|
+
datas: top.datas, version: 1, filterIsNull, isFilterSub: false, rootStr: renderCond(top),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* 把新条件**叠加**到已有条件树上(这是 `--add` 的语义:原地加,不整体覆盖)。
|
|
240
|
+
* 已有树为空/不存在时等价于新建。不给 `relation` 就沿用现有顶层关系。
|
|
241
|
+
*/
|
|
242
|
+
export function appendConditions(existing, nodes, fields, objId, opts = {}) {
|
|
243
|
+
const usable = existing && typeof existing === 'object' && !Array.isArray(existing) && Array.isArray(existing.datas);
|
|
244
|
+
if (!usable)
|
|
245
|
+
return JSON.parse(buildConditionTree(nodes, fields, objId, true, opts));
|
|
246
|
+
const topKey = String(existing.key ?? Date.now());
|
|
247
|
+
const relation = relationCode(opts.relation, String(existing.relationship ?? '1'));
|
|
248
|
+
// 新节点直接挂到现有顶层下 —— 用现有顶层 key 当 parent,不能再套一层组,否则 parentNode 悬空
|
|
249
|
+
const added = childrenOf(nodes, topKey, `${topKey}_append`, fields, objId, opts.now);
|
|
250
|
+
const merged = {
|
|
251
|
+
...existing, key: topKey, relationship: relation, isParent: true, parentNode: '',
|
|
252
|
+
datas: [...existing.datas, ...added], version: existing.version ?? 1,
|
|
253
|
+
};
|
|
254
|
+
merged.rootStr = renderCond(merged);
|
|
255
|
+
return merged;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* 按字段 ID 摘条件(**该字段的所有条件都摘**;组被摘空就整组拿掉)。
|
|
259
|
+
* 同一个字段有多条条件时想只摘一条 —— 用 `--replace` 传整棵树。
|
|
260
|
+
*/
|
|
261
|
+
export function removeConditions(existing, targets) {
|
|
262
|
+
const wanted = new Set(targets.map((t) => String(t).trim()).filter(Boolean));
|
|
263
|
+
if (!existing || !Array.isArray(existing.datas) || !wanted.size)
|
|
264
|
+
return { filter: existing, removed: 0 };
|
|
265
|
+
let removed = 0;
|
|
266
|
+
const prune = (nodes) => nodes.filter((n) => {
|
|
267
|
+
if (n?.isParent) {
|
|
268
|
+
const kids = prune(n.datas || []);
|
|
269
|
+
if (!kids.length)
|
|
270
|
+
return false;
|
|
271
|
+
n.datas = kids;
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
if (wanted.has(String(n?.id))) {
|
|
275
|
+
removed += 1;
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
return true;
|
|
189
279
|
});
|
|
280
|
+
const filter = { ...existing, datas: prune(existing.datas) };
|
|
281
|
+
filter.rootStr = renderCond(filter);
|
|
282
|
+
return { filter, removed };
|
|
190
283
|
}
|
|
191
284
|
//# sourceMappingURL=form-list-utils.js.map
|