cloudcc-cli 2.3.7 → 2.3.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/.cursor/skills/{cloudcc-cli-dev → dev-guide}/SKILL.md +5 -1
- package/README.md +65 -1
- package/cloudcc-dev-skill/SKILL.md +78 -0
- package/cloudcc-dev-skill/config.json +4 -0
- package/mcp/index.js +25 -2
- package/mcp/tools/Object Fields Creator/handler.js +149 -3
- package/package.json +1 -1
- package/src/classes/create.js +10 -0
- package/src/fields/buildFieldData.js +692 -0
- package/src/fields/create.js +10 -170
- package/src/fields/detail.js +37 -0
- package/src/fields/docs/devguide.md +168 -44
- package/src/fields/docs/introduction.md +2 -0
- package/src/fields/fields/A.js +3 -2
- package/src/fields/fields/AD.js +4 -2
- package/src/fields/fields/B.js +8 -5
- package/src/fields/fields/C.js +13 -5
- package/src/fields/fields/D.js +4 -4
- package/src/fields/fields/E.js +10 -5
- package/src/fields/fields/ENC.js +27 -8
- package/src/fields/fields/ENCD.js +27 -8
- package/src/fields/fields/F.js +4 -4
- package/src/fields/fields/FL.js +8 -4
- package/src/fields/fields/H.js +4 -4
- package/src/fields/fields/IMG.js +23 -5
- package/src/fields/fields/J.js +21 -6
- package/src/fields/fields/L.js +32 -8
- package/src/fields/fields/LT.js +23 -6
- package/src/fields/fields/M.js +2 -2
- package/src/fields/fields/MR.js +2 -2
- package/src/fields/fields/N.js +31 -8
- package/src/fields/fields/P.js +13 -5
- package/src/fields/fields/Q.js +42 -12
- package/src/fields/fields/S.js +19 -7
- package/src/fields/fields/SCORE.js +9 -4
- package/src/fields/fields/T.js +4 -4
- package/src/fields/fields/U.js +18 -5
- package/src/fields/fields/X.js +20 -6
- package/src/fields/fields/Y.js +17 -4
- package/src/fields/index.js +2 -0
- package/src/fields/update.js +148 -0
- package/test/fields.cli.test.js +3 -1
- package/utils/config.js +9 -0
- package/utils/utils.js +12 -5
- package/.cursor/skills/cloudcc-dev-skill/SKILL.md +0 -71
- package/target/classes/com/cloudcc/core/BaseException.class +0 -0
- package/target/classes/com/cloudcc/core/BusiException.class +0 -0
- package/target/classes/com/cloudcc/core/CCObject.class +0 -0
- package/target/classes/com/cloudcc/core/CCSchedule.class +0 -0
- package/target/classes/com/cloudcc/core/CCService.class +0 -0
- package/target/classes/com/cloudcc/core/CCTrigger.class +0 -0
- package/target/classes/com/cloudcc/core/CCTriggerHandler.class +0 -0
- package/target/classes/com/cloudcc/core/DevLogger.class +0 -0
- package/target/classes/com/cloudcc/core/OperatationEnum.class +0 -0
- package/target/classes/com/cloudcc/core/PeakInterf.class +0 -0
- package/target/classes/com/cloudcc/core/SendEmail.class +0 -0
- package/target/classes/com/cloudcc/core/ServiceResult.class +0 -0
- package/target/classes/com/cloudcc/core/StringUtils.class +0 -0
- package/target/classes/com/cloudcc/core/TimeUtil.class +0 -0
- package/target/classes/com/cloudcc/core/Tool$1.class +0 -0
- package/target/classes/com/cloudcc/core/Tool.class +0 -0
- package/target/classes/com/cloudcc/core/TriggerInvoker.class +0 -0
- package/target/classes/com/cloudcc/core/TriggerMethod.class +0 -0
- package/target/classes/com/cloudcc/core/TriggerTimeEnum.class +0 -0
- package/target/classes/com/cloudcc/core/UserInfo.class +0 -0
package/src/fields/create.js
CHANGED
|
@@ -1,34 +1,7 @@
|
|
|
1
1
|
const { postClass } = require("../../utils/http")
|
|
2
2
|
const { getPackageJson } = require("../../utils/config");
|
|
3
3
|
const chalk = require('chalk')
|
|
4
|
-
const
|
|
5
|
-
const { labelToSlug } = require("../../utils/utils");
|
|
6
|
-
const S = require("./fields/S");
|
|
7
|
-
const U = require("./fields/U");
|
|
8
|
-
const SCORE = require("./fields/SCORE");
|
|
9
|
-
const IMG = require("./fields/IMG");
|
|
10
|
-
const P = require("./fields/P");
|
|
11
|
-
const C = require("./fields/C");
|
|
12
|
-
const J = require("./fields/J");
|
|
13
|
-
const H = require("./fields/H");
|
|
14
|
-
const E = require("./fields/E");
|
|
15
|
-
const B = require("./fields/B");
|
|
16
|
-
const A = require("./fields/A");
|
|
17
|
-
const D = require("./fields/D");
|
|
18
|
-
const F = require("./fields/F");
|
|
19
|
-
const T = require("./fields/T");
|
|
20
|
-
const N = require("./fields/N");
|
|
21
|
-
const ENC = require("./fields/ENC");
|
|
22
|
-
const ENCD = require("./fields/ENCD");
|
|
23
|
-
const X = require("./fields/X");
|
|
24
|
-
const L = require("./fields/L");
|
|
25
|
-
const Q = require("./fields/Q");
|
|
26
|
-
const AD = require("./fields/AD");
|
|
27
|
-
const LT = require("./fields/LT");
|
|
28
|
-
const FL = require("./fields/FL");
|
|
29
|
-
const Y = require("./fields/Y");
|
|
30
|
-
const MR = require("./fields/MR");
|
|
31
|
-
const M = require("./fields/M");
|
|
4
|
+
const { buildFieldData } = require("./buildFieldData");
|
|
32
5
|
|
|
33
6
|
/**
|
|
34
7
|
* 创建字段
|
|
@@ -37,161 +10,28 @@ const M = require("./fields/M");
|
|
|
37
10
|
*/
|
|
38
11
|
async function create(argvs) {
|
|
39
12
|
try {
|
|
40
|
-
let fieldData = null;
|
|
41
13
|
let projectPath = argvs[2];
|
|
42
14
|
const config = await getPackageJson(projectPath);
|
|
43
|
-
let fieldType = argvs[3];
|
|
44
|
-
let objid = argvs[4];
|
|
45
15
|
let nameLabel = argvs[5];
|
|
16
|
+
// 统一规则:所有字段创建中 argvs[6] 作为 remark(字段业务功能描述)
|
|
17
|
+
let remarkText = argvs[6];
|
|
18
|
+
if (!remarkText) remarkText = "auto created by cloudcc-cli ai agent";
|
|
46
19
|
console.error(chalk.blue('\nCreating field ' + nameLabel + '...'));
|
|
47
|
-
|
|
48
|
-
const slug = labelToSlug(nameLabel);
|
|
49
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
50
|
-
let briefData = await briefGet(argvs);
|
|
51
|
-
fieldData = S(objid, nameLabel, apiname, briefData.data);
|
|
52
|
-
} else if (fieldType == "U") {
|
|
53
|
-
const slug = labelToSlug(nameLabel);
|
|
54
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
55
|
-
let briefData = await briefGet(argvs);
|
|
56
|
-
fieldData = U(objid, nameLabel, apiname, briefData.data);
|
|
57
|
-
} else if (fieldType == "SCORE") {
|
|
58
|
-
const slug = labelToSlug(nameLabel);
|
|
59
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
60
|
-
let briefData = await briefGet(argvs);
|
|
61
|
-
fieldData = SCORE(objid, nameLabel, apiname, briefData.data);
|
|
62
|
-
} else if (fieldType == "IMG") {
|
|
63
|
-
const slug = labelToSlug(nameLabel);
|
|
64
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
65
|
-
let briefData = await briefGet(argvs);
|
|
66
|
-
fieldData = IMG(objid, nameLabel, apiname, briefData.data);
|
|
67
|
-
} else if (fieldType == "P") {
|
|
68
|
-
const slug = labelToSlug(nameLabel);
|
|
69
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
70
|
-
let briefData = await briefGet(argvs);
|
|
71
|
-
fieldData = P(objid, nameLabel, apiname, briefData.data);
|
|
72
|
-
} else if (fieldType == "C") {
|
|
73
|
-
const slug = labelToSlug(nameLabel);
|
|
74
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
75
|
-
let briefData = await briefGet(argvs);
|
|
76
|
-
fieldData = C(objid, nameLabel, apiname, briefData.data);
|
|
77
|
-
} else if (fieldType == "J") {
|
|
78
|
-
const slug = labelToSlug(nameLabel);
|
|
79
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
80
|
-
let briefData = await briefGet(argvs);
|
|
81
|
-
fieldData = J(objid, nameLabel, apiname, briefData.data);
|
|
82
|
-
} else if (fieldType == "H") {
|
|
83
|
-
const slug = labelToSlug(nameLabel);
|
|
84
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
85
|
-
let briefData = await briefGet(argvs);
|
|
86
|
-
fieldData = H(objid, nameLabel, apiname, briefData.data);
|
|
87
|
-
} else if (fieldType == "E") {
|
|
88
|
-
const slug = labelToSlug(nameLabel);
|
|
89
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
90
|
-
let briefData = await briefGet(argvs);
|
|
91
|
-
fieldData = E(objid, nameLabel, apiname, briefData.data);
|
|
92
|
-
} else if (fieldType == "B") {
|
|
93
|
-
const slug = labelToSlug(nameLabel);
|
|
94
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
95
|
-
let briefData = await briefGet(argvs);
|
|
96
|
-
fieldData = B(objid, nameLabel, apiname, briefData.data);
|
|
97
|
-
} else if (fieldType == "A") {
|
|
98
|
-
const slug = labelToSlug(nameLabel);
|
|
99
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
100
|
-
let briefData = await briefGet(argvs);
|
|
101
|
-
fieldData = A(objid, nameLabel, apiname, briefData.data);
|
|
102
|
-
} else if (fieldType == "D") {
|
|
103
|
-
const slug = labelToSlug(nameLabel);
|
|
104
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
105
|
-
let briefData = await briefGet(argvs);
|
|
106
|
-
fieldData = D(objid, nameLabel, apiname, briefData.data);
|
|
107
|
-
} else if (fieldType == "F") {
|
|
108
|
-
const slug = labelToSlug(nameLabel);
|
|
109
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
110
|
-
let briefData = await briefGet(argvs);
|
|
111
|
-
fieldData = F(objid, nameLabel, apiname, briefData.data);
|
|
112
|
-
} else if (fieldType == "T") {
|
|
113
|
-
const slug = labelToSlug(nameLabel);
|
|
114
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
115
|
-
let briefData = await briefGet(argvs);
|
|
116
|
-
fieldData = T(objid, nameLabel, apiname, briefData.data);
|
|
117
|
-
} else if (fieldType == "N") {
|
|
118
|
-
const slug = labelToSlug(nameLabel);
|
|
119
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
120
|
-
let briefData = await briefGet(argvs);
|
|
121
|
-
fieldData = N(objid, nameLabel, apiname, briefData.data);
|
|
122
|
-
} else if (fieldType == "ENC") {
|
|
123
|
-
const slug = labelToSlug(nameLabel);
|
|
124
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
125
|
-
let briefData = await briefGet(argvs);
|
|
126
|
-
fieldData = ENC(objid, nameLabel, apiname, briefData.data);
|
|
127
|
-
} else if (fieldType == "ENCD") {
|
|
128
|
-
const slug = labelToSlug(nameLabel);
|
|
129
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
130
|
-
let briefData = await briefGet(argvs);
|
|
131
|
-
fieldData = ENCD(objid, nameLabel, apiname, briefData.data);
|
|
132
|
-
} else if (fieldType == "X") {
|
|
133
|
-
const slug = labelToSlug(nameLabel);
|
|
134
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
135
|
-
let briefData = await briefGet(argvs);
|
|
136
|
-
fieldData = X(objid, nameLabel, apiname, briefData.data);
|
|
137
|
-
} else if (fieldType == "L") {
|
|
138
|
-
const slug = labelToSlug(nameLabel);
|
|
139
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
140
|
-
let briefData = await briefGet(argvs);
|
|
141
|
-
let ptext = argvs[6];
|
|
142
|
-
fieldData = L(objid, nameLabel, apiname, ptext, briefData.data);
|
|
143
|
-
} else if (fieldType == "Q") {
|
|
144
|
-
const slug = labelToSlug(nameLabel);
|
|
145
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
146
|
-
let briefData = await briefGet(argvs);
|
|
147
|
-
let ptext = argvs[6];
|
|
148
|
-
fieldData = Q(objid, nameLabel, apiname, ptext, briefData.data);
|
|
149
|
-
} else if (fieldType == "AD") {
|
|
150
|
-
const slug = labelToSlug(nameLabel);
|
|
151
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
152
|
-
let briefData = await briefGet(argvs);
|
|
153
|
-
fieldData = AD(objid, nameLabel, apiname, briefData.data);
|
|
154
|
-
} else if (fieldType == "LT") {
|
|
155
|
-
const slug = labelToSlug(nameLabel);
|
|
156
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
157
|
-
let briefData = await briefGet(argvs);
|
|
158
|
-
fieldData = LT(objid, nameLabel, apiname, briefData.data);
|
|
159
|
-
} else if (fieldType == "FL") {
|
|
160
|
-
const slug = labelToSlug(nameLabel);
|
|
161
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
162
|
-
let briefData = await briefGet(argvs);
|
|
163
|
-
fieldData = FL(objid, nameLabel, apiname, briefData.data);
|
|
164
|
-
} else if (fieldType == "Y") {
|
|
165
|
-
const slug = labelToSlug(nameLabel);
|
|
166
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
167
|
-
let briefData = await briefGet(argvs);
|
|
168
|
-
let lookupObj = argvs[6];
|
|
169
|
-
fieldData = Y(objid, nameLabel, apiname, lookupObj, briefData.data);
|
|
170
|
-
} else if (fieldType == "MR") {
|
|
171
|
-
const slug = labelToSlug(nameLabel);
|
|
172
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
173
|
-
let briefData = await briefGet(argvs);
|
|
174
|
-
let lookupObj = argvs[6];
|
|
175
|
-
fieldData = MR(objid, nameLabel, apiname, lookupObj, briefData.data);
|
|
176
|
-
} else if (fieldType == "M") {
|
|
177
|
-
const slug = labelToSlug(nameLabel);
|
|
178
|
-
let apiname = `${slug}_custom_${fieldType}_field`.toLowerCase();
|
|
179
|
-
let briefData = await briefGet(argvs);
|
|
180
|
-
let lookupObj = argvs[6];
|
|
181
|
-
fieldData = M(objid, nameLabel, apiname, lookupObj, briefData.data);
|
|
182
|
-
}
|
|
20
|
+
let fieldData = await buildFieldData(argvs, { shift: 0 });
|
|
183
21
|
// 查询页面布局列表,取第一个绑定到字段
|
|
184
22
|
if (fieldData) {
|
|
185
23
|
const layoutRes = await postClass(
|
|
186
24
|
config.setupSvc + "/api/layout/newpage",
|
|
187
|
-
{ objid: objid },
|
|
25
|
+
{ objid: fieldData.objid },
|
|
188
26
|
config.accessToken
|
|
189
27
|
);
|
|
190
28
|
if (layoutRes && layoutRes.result && Array.isArray(layoutRes.data) && layoutRes.data.length > 0) {
|
|
191
29
|
fieldData.layoutIds = layoutRes.data[0].id;
|
|
192
30
|
}
|
|
193
31
|
}
|
|
194
|
-
fieldData.remark
|
|
32
|
+
// 统一写入 remark:模板一般在 fieldData.obj.remark,保留顶层 remark 做兼容
|
|
33
|
+
if (fieldData && fieldData.obj) fieldData.obj.remark = remarkText;
|
|
34
|
+
if (fieldData) fieldData.remark = remarkText;
|
|
195
35
|
// 发送请求到服务器
|
|
196
36
|
const result = await postClass(
|
|
197
37
|
config.setupSvc + "/api/fieldSetup/save",
|
|
@@ -213,4 +53,4 @@ async function create(argvs) {
|
|
|
213
53
|
}
|
|
214
54
|
}
|
|
215
55
|
|
|
216
|
-
module.exports = create;
|
|
56
|
+
module.exports = create;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const { postClass } = require("../../utils/http")
|
|
2
|
+
const { getPackageJson } = require("../../utils/config");
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 查询字段详情(平台字段编辑页数据),对应接口 fieldSetup/editField
|
|
6
|
+
* @param {string[]} argvs
|
|
7
|
+
* @param {boolean} [isMcp]
|
|
8
|
+
* @returns {Promise<object>}
|
|
9
|
+
*/
|
|
10
|
+
async function detail(argvs, isMcp = false) {
|
|
11
|
+
const projectPath = argvs[2];
|
|
12
|
+
const fieldId = argvs[3];
|
|
13
|
+
const fdtype = argvs[4];
|
|
14
|
+
const objid = argvs[5];
|
|
15
|
+
if (!projectPath || !fieldId || !fdtype || !objid) {
|
|
16
|
+
throw new Error(
|
|
17
|
+
"Missing arguments: cloudcc detail fields <projectPath> <fieldId> <fdtype> <objid>"
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
const config = await getPackageJson(projectPath);
|
|
21
|
+
const body = {
|
|
22
|
+
fieldId: String(fieldId).trim(),
|
|
23
|
+
fdtype: String(fdtype).trim(),
|
|
24
|
+
objid: String(objid).trim(),
|
|
25
|
+
};
|
|
26
|
+
const res = await postClass(
|
|
27
|
+
config.setupSvc + "/api/fieldSetup/editField",
|
|
28
|
+
body,
|
|
29
|
+
config.accessToken
|
|
30
|
+
);
|
|
31
|
+
if (!isMcp) {
|
|
32
|
+
console.log(JSON.stringify(res));
|
|
33
|
+
}
|
|
34
|
+
return res;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
module.exports = detail;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## 1. 模块定位
|
|
4
4
|
|
|
5
|
-
`fields` 模块用于管理 CloudCC
|
|
5
|
+
`fields` 模块用于管理 CloudCC 对象字段,当前提供字段列表查询、字段详情、创建、更新、删除能力。
|
|
6
6
|
|
|
7
7
|
可通过以下命令读取文档:
|
|
8
8
|
|
|
@@ -17,7 +17,9 @@ cloudcc doc fields devguide
|
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
19
|
cloudcc get fields <projectPath> <objPrefix>
|
|
20
|
-
cloudcc
|
|
20
|
+
cloudcc detail fields <projectPath> <fieldId> <fdtype> <objid>
|
|
21
|
+
cloudcc create fields <projectPath> <fieldType> <objid> <fieldLabel> <remark> [extraArg]
|
|
22
|
+
cloudcc update fields <projectPath> <fieldId> <fieldType> <objid> <fieldLabel> <remark> [extraArg]
|
|
21
23
|
cloudcc delete fields <projectPath> <fieldId> <objid>
|
|
22
24
|
```
|
|
23
25
|
|
|
@@ -29,19 +31,48 @@ cloudcc delete fields <projectPath> <fieldId> <objid>
|
|
|
29
31
|
- `objid`:对象 ID
|
|
30
32
|
- `fieldLabel`:字段显示名称
|
|
31
33
|
- `extraArg`:部分字段类型需要的额外参数,如 `ptext` 或 `lookupObj`
|
|
32
|
-
- `
|
|
34
|
+
- `remark`:用于描述字段的业务功能(写入字段模板的 `obj.remark`,位置固定为 `argvs[6]`)
|
|
35
|
+
- `fieldId`:字段 ID(`update` / `delete` 必填;可通过 `get fields` 返回的 `id` 获取)
|
|
33
36
|
|
|
34
37
|
说明:
|
|
35
38
|
|
|
36
|
-
- 当前 CLI 参数以 `src/fields/create.js`、`src/fields/get.js`、`src/fields/delete.js` 的实际实现为准
|
|
39
|
+
- 当前 CLI 参数以 `src/fields/buildFieldData.js`、`src/fields/create.js`、`src/fields/update.js`、`src/fields/get.js`、`src/fields/delete.js` 的实际实现为准
|
|
37
40
|
- 字段 API 名称在当前创建逻辑中默认由 CLI 自动生成,不要求单独传入
|
|
38
41
|
|
|
39
42
|
---
|
|
40
43
|
|
|
41
|
-
## 3.
|
|
44
|
+
## 3. 查询字段详情(detail)
|
|
45
|
+
|
|
46
|
+
用于拉取与平台「字段编辑」页一致的数据(简档列表、对象列表、`fieldObj` 等),对应接口 **`POST /api/fieldSetup/editField`**。
|
|
42
47
|
|
|
43
48
|
### 3.1 基本命令
|
|
44
49
|
|
|
50
|
+
```bash
|
|
51
|
+
cloudcc detail fields <projectPath> <fieldId> <fdtype> <objid>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
- `fieldId`:字段 ID(与 `get fields` 返回的 `id` 一致)
|
|
55
|
+
- `fdtype`:字段类型编码(例如 `P`、`S`、`U`,与 `fdtype` / `schemefieldType` 一致)
|
|
56
|
+
- `objid`:所属对象 ID
|
|
57
|
+
|
|
58
|
+
请求体示例:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"fieldId": "ffe2026A3B035C748w95",
|
|
63
|
+
"fdtype": "P",
|
|
64
|
+
"objid": "2026BEECB242636G72cD"
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
成功时 CLI 将打印接口返回的 JSON(含 `result`、`data` 等,具体结构以平台为准)。
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 4. 查询字段列表(get)
|
|
73
|
+
|
|
74
|
+
### 4.1 基本命令
|
|
75
|
+
|
|
45
76
|
```bash
|
|
46
77
|
cloudcc get fields <projectPath> <objPrefix>
|
|
47
78
|
```
|
|
@@ -61,69 +92,162 @@ cloudcc get fields <projectPath> <objPrefix>
|
|
|
61
92
|
|
|
62
93
|
---
|
|
63
94
|
|
|
64
|
-
##
|
|
95
|
+
## 5. 创建字段
|
|
65
96
|
|
|
66
|
-
###
|
|
97
|
+
### 5.1 基本命令
|
|
67
98
|
|
|
68
99
|
```bash
|
|
69
|
-
cloudcc create fields <projectPath> <fieldType> <objid> <fieldLabel> [extraArg]
|
|
100
|
+
cloudcc create fields <projectPath> <fieldType> <objid> <fieldLabel> <remark> [extraArg]
|
|
70
101
|
```
|
|
71
102
|
|
|
72
|
-
|
|
103
|
+
#### 公用参数(所有字段类型通用)
|
|
104
|
+
|
|
105
|
+
- `projectPath`:本地项目路径
|
|
106
|
+
- `fieldType`:字段类型编码(例如 `S`、`U`、`L`、`Y` 等)
|
|
107
|
+
- `objid`:对象 ID
|
|
108
|
+
- `fieldLabel`:字段显示名称
|
|
109
|
+
- `remark`:字段业务功能描述(写入字段模板的 `obj.remark`;参数位置固定为 `argvs[6]`)
|
|
110
|
+
- `helps`:帮助说明,固定`argvs[7]`
|
|
111
|
+
- `defaultValue`:默认值,固定`argvs[8]`
|
|
112
|
+
- `extraArg`:仅部分字段类型需要的额外入参;其含义与参数位置随 `fieldType` 变化(通常从 `argvs[9]` 开始)
|
|
113
|
+
|
|
114
|
+
#### 字段特殊入参(按 `fieldType`)
|
|
115
|
+
|
|
116
|
+
以下均假定 **`create fields`** 的 argv 下标(**`update fields`** 因多一个 `fieldId`,`remark` 及之后的参数整体 **`+1`**,见 [5.2](#52-更新字段))。
|
|
117
|
+
|
|
118
|
+
**约定**:**`helps`**、**`defaultValue`** 见上文公用参数(**`argvs[7]`**、**`argvs[8]`**);本节只写各类型在 **`argvs[9]`** 起的**专属参数**。若不需要默认值,**`argvs[8]`** 仍请传 **`''`** 占位,避免与专属参数错位。
|
|
119
|
+
|
|
120
|
+
- `S`(文本)
|
|
121
|
+
- `schemefieldLength`(可选):字段长度;**`argvs[9]`**;不传默认 `255`
|
|
122
|
+
- `isrepeat`(可选):是否允许重复值;**`argvs[10]`**;`true` / `false`;不传默认 `true`
|
|
123
|
+
- `placeholder`(可选):输入框提示文案(`obj.placeholder`);**`argvs[11]`**(与「空字符串占位」含义不同)
|
|
124
|
+
- `casesensitive`(可选):是否区分大小写;**`argvs[12]`**;仅当 `isrepeat=false` 时生效;空则默认 `false`
|
|
125
|
+
- **空字符串占位**:**`argvs[9]`~`argvs[12]`** 顺序固定;若要向更后面的槽位传值,中间未用槽位须 **`''`**
|
|
126
|
+
- `U`(URL)
|
|
127
|
+
- `edittype`(可选):链接打开方式,`_blank` 或 `_self`;**`argvs[9]`**;不传默认 `_blank`;非 `_self` 按实现回退为 `_blank`
|
|
128
|
+
- `P`(百分比)
|
|
129
|
+
- `schemefieldLength`(可选):小数点**左侧**(整数部分)位数;**`argvs[9]`**;不传默认 `10`
|
|
130
|
+
- `decimalPlaces`(可选):小数点**右侧**位数;**`argvs[10]`**;不传默认 `2`
|
|
131
|
+
- **约束**:两者须为非负整数,且**之和不能大于 18**
|
|
132
|
+
- `C`(币种)
|
|
133
|
+
- 专属参数与 **`P`** 相同(**`argvs[9]`**、**`argvs[10]`**),约束相同
|
|
134
|
+
- `N`(数字)
|
|
135
|
+
- `schemefieldLength`(可选):小数点**左侧**(整数部分)位数;**`argvs[9]`**;不传默认 `10`
|
|
136
|
+
- `decimalPlaces`(可选):小数点**右侧**位数;**`argvs[10]`**;不传默认 `0`
|
|
137
|
+
- `isrepeat`(可选):是否允许重复值;**`argvs[11]`**;`true` / `false`;不传默认 `true`(允许重复)
|
|
138
|
+
- `displayThousands`(可选):平台字段 **`obj.displayThousands`**;**`argvs[12]`**;**`"1"`** 表示不允许重复,**`"0"`** 表示允许重复;不传默认 **`"0"`**
|
|
139
|
+
- **约束**:`schemefieldLength` 与 `decimalPlaces` 须为非负整数,且**之和不能大于 18**(与 `P`/`C` 精度规则一致)
|
|
140
|
+
- `IMG`(图片)
|
|
141
|
+
- **`defaultValue`**(**`argvs[8]`**):**可上传图片数量**(写入 `obj.defaultValue`);须为 **1~100** 的整数;空则默认 **`3`**
|
|
142
|
+
- **`formulaType`**(可选):录入方式 **`url`** 或 **`input`**(顶层 `formulaType`);**`argvs[9]`**;不传默认 **`input`**
|
|
143
|
+
- **`watermarkstatus`**(可选):是否支持水印拍照;**`argvs[10]`**;**`"0"`** 不支持,**`"1"`** 支持;不传默认 **`"0"`**
|
|
144
|
+
- `FL`(文件)
|
|
145
|
+
- **`defaultValue`**(**`argvs[8]`**):**可上传文件数量**(须为 **1~100** 的整数;写入 **`obj.defaultValue`**,并与 **`obj.isrepeat`** 设为**同一数值**);空则默认 **`1`**
|
|
146
|
+
- `ENC`(加密文本-存储加密)、`ENCD`(加密文本-显示加密)
|
|
147
|
+
- 二者共用下列参数(**`argvs[9]`**~**`argvs[12]`**):
|
|
148
|
+
- **`schemefieldLength`**(可选):文本最大长度,写入 **`obj.schemefieldLength`**;**`argvs[9]`**;须为 **1~255** 的整数;不传默认 **`255`**
|
|
149
|
+
- **`masktype`**(可选):掩码类型;**`argvs[10]`**;**`all`** 掩码全部;**`4`** 掩码后四位;**`card`** 卡号格式;**`custom`** 自定义;不传默认 **`all`**
|
|
150
|
+
- **`encrypttype`**(可选):**`masktype`=`custom`** 时生效,自定义掩码规则;**`argvs[11]`**;参考 **`"{AAAA}{****}{AAAA}"`**;空则使用默认示例串
|
|
151
|
+
- **`maskcharacter`**(可选):掩码字符;**`argvs[12]`**;**`*`** 或 **`X`**;不传默认 **`*`**
|
|
152
|
+
- `LT`(地理定位)
|
|
153
|
+
- **`schemefieldLength`**(可选):小数点**左侧**位数,写入 **`obj.schemefieldLength`**;**`argvs[9]`**;须为非负整数;不传默认 **`8`**(与默认 **`decimalPlaces`** 之和为 **18**,满足平台总位数上限)
|
|
154
|
+
- **`decimalPlaces`**(可选):小数点**右侧**位数,写入 **`obj.decimalPlaces`**;**`argvs[10]`**;须为非负整数;不传默认 **`10`**
|
|
155
|
+
- **约束**:两者须为非负整数,且**之和不能大于 18**(与 **`P`** / **`C`** / **`N`** 精度规则一致)
|
|
156
|
+
- **`displayType`**(可选):纬度与经度显示方式;**`argvs[11]`**;**`"1"`** 数字展示,**`"2"`** 度、分、秒;不传默认 **`"1"`**(写入顶层 **`displayType`**)
|
|
157
|
+
- **仅公用 `helps` / `defaultValue`、无 `argvs[9]` 起专属参数的类型**:`D`、`F`、`T`、`H`、`A`、`AD` 等(**不含** **`IMG`** / **`FL`** / **`ENC`** / **`ENCD`** / **`LT`** 等已单列的类型;见上文各节)
|
|
158
|
+
- `J`(文本区-长)
|
|
159
|
+
- 与 **`X`** 类似:多行文本;**`schemefieldLength`**(可选)为**最大字符数**;**`argvs[9]`**;须为 **1~32000** 的整数;不传默认 **`32000`**
|
|
160
|
+
- **`placeholder`**(可选):输入区**提示信息**;**`argvs[10]`**
|
|
161
|
+
- **平台说明**:每个对象**最多 10 个** **`J`** 类型字段;条数由平台校验,**CLI 创建时不统计**,请在对象上自行控制数量
|
|
162
|
+
- `X`(文本区)
|
|
163
|
+
- `schemefieldLength`(可选):多行文本**最大字符数**;**`argvs[9]`**;须为 **1~4000** 的整数;不传默认 **`4000`**(与平台常见上限一致)
|
|
164
|
+
- `placeholder`(可选):输入区**提示信息**;**`argvs[10]`**
|
|
165
|
+
- `SCORE`(评分)
|
|
166
|
+
- `schemefieldLength`(可选):**最大评分**,决定**星星图标显示个数**;**`argvs[9]`**;须为 **1~100** 的整数;不传默认 **`10`**
|
|
167
|
+
- `E`(电子邮件)
|
|
168
|
+
- `isrepeat`(可选):是否允许重复;**`argvs[9]`**;**`"true"`** 允许重复,**`"false"`** 不允许重复;不传默认 **`"true"`**
|
|
169
|
+
- `B`(复选框)
|
|
170
|
+
- **`defaultValue`**(**`argvs[8]`**):**仅** **`"0"`** 或 **`"1"`** —— **`"0"`** 表示默认**未选中**,**`"1"`** 表示默认**选中**;空或其它值按 **`"0"`** 处理
|
|
171
|
+
- `L`(选项列表-单选)
|
|
172
|
+
- `ptext`(**`useGlobalSelect`=`"0"` 时必填**):选项内容;**`argvs[9]`**;**格式**:多个选项用 **`\r\n`** 连接(勿用仅 `\n` 作为分隔)。**`useGlobalSelect`=`"1"`**(全局列表)时可为空字符串
|
|
173
|
+
- **`useGlobalSelect`**(可选):是否使用全局选项列表;**`argvs[10]`**;**`"0"`** 不使用,**`"1"`** 使用;不传默认 **`"0"`**
|
|
174
|
+
- **`edittype`**(可选):选择样式,写入 **`obj.edittype`**;**`argvs[11]`**;**`radio`** 单选框列表,**`select`** 单选下拉;不传默认 **`select`**
|
|
175
|
+
- **`isPicklistSorted`**(可选):按字母顺序而非输入顺序排序;**`argvs[12]`**;**`"0"`** 否,**`"1"`** 是;不传默认 **`"0"`**
|
|
176
|
+
- **`defPl`**(可选):将第一个值作为默认值;**`argvs[13]`**;**`"0"`** 否,**`"1"`** 是;不传默认 **`"0"`**
|
|
177
|
+
- **`globalSelectId`**:全局选项列表 id;**`argvs[14]`**。**`useGlobalSelect`=`"1"`** 时必填;为 **`"0"`** 时传 **`''`** 占位即可
|
|
178
|
+
- `Q`(选项列表-多选)
|
|
179
|
+
- 与 **`L`** 相同的前缀参数:**`ptext`**、**`useGlobalSelect`**、**`edittype`**、**`isPicklistSorted`**、**`defPl`**、**`globalSelectId`**(**`argvs[9]`**~**`argvs[14]`**),含义与取值规则见上文 **「L(选项列表-单选)」**(**`useGlobalSelect`=`"0"`** 时 **`ptext`** 必填;**`"1"`** 时 **`globalSelectId`** 必填)
|
|
180
|
+
- **`visibleLines`**(可选):下拉最多展示几行选项,写入 **`obj.visibleLines`**;**`argvs[15]`**;须为 **1~100** 的整数;不传默认 **`4`**
|
|
181
|
+
- **`showalloptions`**(可选):是否显示所有选项,写入 **`obj.showalloptions`**;**`argvs[16]`**;**`"0"`** 否,**`"1"`** 是;不传默认 **`"0"`**
|
|
182
|
+
- `Y`(查找关系)
|
|
183
|
+
- `lookupObj`(必填):关联对象;**`argvs[9]`**
|
|
184
|
+
- **`lookupObjDefaultField`**(可选):搜索辅助字段,写入 **`obj.lookupObjDefaultField`**;搜索时用于展示(如关联对象上用于显示的字段 API 名);**`argvs[10]`**;不传或空字符串表示不指定
|
|
185
|
+
- `MR`(查找多选)
|
|
186
|
+
- `lookupObj`(必填):关联对象;**`argvs[9]`**
|
|
187
|
+
- `M`(主详信息关系)
|
|
188
|
+
- `lookupObj`(必填):关联对象;**`argvs[9]`**
|
|
189
|
+
|
|
190
|
+
### 5.2 更新字段
|
|
191
|
+
|
|
192
|
+
与 **创建** 共用同一套类型模板与请求体结构;**更新** 调用 **`/api/fieldSetup/saveField`**,**创建** 调用 **`/api/fieldSetup/save`**。更新时必须在请求体中设置 **`obj.id`** 为平台上的字段 ID,且 **不会** 自动绑定页面布局(不写入 `layoutIds`)。
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
cloudcc update fields <projectPath> <fieldId> <fieldType> <objid> <fieldLabel> <remark> [extraArg]
|
|
196
|
+
```
|
|
73
197
|
|
|
74
|
-
-
|
|
75
|
-
-
|
|
76
|
-
- 当前 CLI 会根据字段标签自动生成字段 API 名称
|
|
77
|
-
- 如果字段依赖选项值或关联对象,创建前先准备好 `extraArg`
|
|
198
|
+
- `fieldId`:平台字段 ID(`argvs[3]`),对应保存时的 `fieldData.obj.id`
|
|
199
|
+
- 其余参数与 `create fields` 含义相同,但整体下标相对 **create** 后移一位:`fieldType` 为 `argvs[4]`,`objid` 为 `argvs[5]`,`fieldLabel` 为 `argvs[6]`,`remark` 为 `argvs[7]`;**`helps`** 为 **`argvs[8]`**、**`defaultValue`** 为 **`argvs[9]`**;各类型专属参数在 **create** 中为 **`argvs[9]`** 起,在 **update** 中为 **`argvs[10]`** 起(相对 **create** 一律 **`+1`**)
|
|
78
200
|
|
|
79
|
-
###
|
|
201
|
+
### 5.3 支持的字段类型说明
|
|
80
202
|
|
|
81
|
-
根据 CloudCC 官方关于“对象-字段”的说明,平台层面支持文本、URL、百分比、币种、数字、文本区、长文本、富文本、电话、电子邮件、日期、日期/时间、评分、选项列表、图片、查找关系、主详信息关系、公式、自动编号、累计汇总、查找多选、复选框等类型。
|
|
203
|
+
根据 CloudCC 官方关于“对象-字段”的说明,平台层面支持文本、URL、百分比、币种、数字、文本区、长文本、富文本、电话、电子邮件、日期、日期/时间、评分、选项列表、图片、查找关系、主详信息关系、公式、自动编号、累计汇总、查找多选、复选框等类型。
|
|
82
204
|
|
|
83
205
|
当前 `src/fields/fields` 中已实现的 CLI 字段类型如下。
|
|
84
206
|
|
|
207
|
+
**说明**:下列类型在模板 **`obj`** 中带有固定的 **`schemefieldLength`** 默认值(与平台「最大长度」类属性对齐;未通过 CLI 覆盖时使用):**`U`** `2000`,**`D`** / **`T`** `20`,**`F`** `30`,**`B`** `10`,**`H`** `15`,**`E`** `254`,**`IMG`** `255`,**`AD`** `500`;**`S`**、**`N`**、**`P`**、**`C`**、**`X`**、**`J`**、**`SCORE`** 等仍由各自字段逻辑或上文「字段特殊入参」定义。
|
|
208
|
+
|
|
85
209
|
#### 基础输入类
|
|
86
210
|
|
|
87
211
|
| CLI 类型编码 | 类型名称 | 说明 |
|
|
88
212
|
| --- | --- | --- |
|
|
89
|
-
| `S` | 文本 | 单行文本,默认长度 255 |
|
|
213
|
+
| `S` | 文本 | 单行文本,默认长度 255(可通过 `schemefieldLength` 调整) |
|
|
90
214
|
| `U` | URL | 输入有效网址,点击后可打开链接 |
|
|
91
|
-
| `P` | 百分比 |
|
|
92
|
-
| `C` | 币种 | 金额/币种场景,模板内部 `fdtype` 为 `c` |
|
|
215
|
+
| `P` | 百分比 | 输入百分比数字;可通过 `schemefieldLength` / `decimalPlaces` 配置整数位与小数位 |
|
|
216
|
+
| `C` | 币种 | 金额/币种场景,模板内部 `fdtype` 为 `c`;可通过 `schemefieldLength` / `decimalPlaces` 配置整数位与小数位(与 `P` 参数位一致) |
|
|
93
217
|
| `N` | 数字 | 输入数值,适用于数量、金额基数等 |
|
|
94
218
|
| `D` | 日期 | 仅日期 |
|
|
95
219
|
| `T` | 时间 | 仅时间 |
|
|
96
220
|
| `F` | 日期/时间 | 日期和时间组合 |
|
|
97
|
-
| `B` | 复选框 |
|
|
221
|
+
| `B` | 复选框 | 默认值仅 `"0"` / `"1"`(未选中 / 选中),见上文 **「B(复选框)」** 专属说明 |
|
|
98
222
|
| `H` | 电话 | 电话号码 |
|
|
99
|
-
| `E` | 电子邮件 |
|
|
100
|
-
| `SCORE` | 评分 |
|
|
223
|
+
| `E` | 电子邮件 | 邮箱地址;可选 `isrepeat`(`argvs[9]`),见上文 **「E(电子邮件)」** |
|
|
224
|
+
| `SCORE` | 评分 | 最大评分 1~100(`schemefieldLength`,星星个数),见 **「SCORE(评分)」** |
|
|
101
225
|
|
|
102
226
|
#### 文本区与内容类
|
|
103
227
|
|
|
104
228
|
| CLI 类型编码 | 类型名称 | 说明 |
|
|
105
229
|
| --- | --- | --- |
|
|
106
|
-
| `X` | 文本区 |
|
|
107
|
-
| `J` | 文本区(长) |
|
|
230
|
+
| `X` | 文本区 | 多行文本,最多 4000 字符(`schemefieldLength`),见 **「X(文本区)」** |
|
|
231
|
+
| `J` | 文本区(长) | 多行长文本,最多 32000 字符;每对象最多 10 个 `J` 字段(平台限制),见 **「J(文本区-长)」** |
|
|
108
232
|
| `A` | 文本区(富文本) | 支持富文本内容、图文描述 |
|
|
109
|
-
| `IMG` | 图片 |
|
|
110
|
-
| `FL` | 文件 |
|
|
233
|
+
| `IMG` | 图片 | 上传数量见 **`defaultValue`**(`argvs[8]`),可选 **`formulaType`** / **`watermarkstatus`**(`argvs[9]` / `argvs[10]`),见上文 **「IMG(图片)」** |
|
|
234
|
+
| `FL` | 文件 | 可上传文件数量见 **`defaultValue`**(`argvs[8]`),与 **`isrepeat`** 同步为同一数值,见上文 **「FL(文件)」** |
|
|
111
235
|
|
|
112
236
|
#### 选择类
|
|
113
237
|
|
|
114
238
|
| CLI 类型编码 | 类型名称 | 说明 |
|
|
115
239
|
| --- | --- | --- |
|
|
116
|
-
| `L` | 选项列表 |
|
|
117
|
-
| `Q` | 选项列表(多选) |
|
|
240
|
+
| `L` | 选项列表 | 单选;**`ptext`** / **`useGlobalSelect`** / **`edittype`**(radio·select)等见上文 **「L(选项列表-单选)」** |
|
|
241
|
+
| `Q` | 选项列表(多选) | 与 **`L`** 类似的全局/排序等 + **`visibleLines`** / **`showalloptions`**,见 **「Q(选项列表-多选)」** |
|
|
118
242
|
|
|
119
|
-
|
|
243
|
+
**`L`**、**`Q`** 在 **`ptext`** 之后还可带可选参数:**`L`** 为 **`argvs[10..14]`**;**`Q`** 为 **`argvs[10..16]`**(在 **`L`** 的基础上多 **`visibleLines`**、**`showalloptions`**),详见上文 **「L」** / **「Q」** 小节。
|
|
120
244
|
|
|
121
245
|
```bash
|
|
122
|
-
cloudcc create fields <projectPath> L <objid> <fieldLabel> <ptext>
|
|
123
|
-
cloudcc create fields <projectPath> Q <objid> <fieldLabel> <ptext>
|
|
246
|
+
cloudcc create fields <projectPath> L <objid> <fieldLabel> <remark> [helps] [defaultValue] <ptext> [useGlobalSelect] [edittype] [isPicklistSorted] [defPl] [globalSelectId]
|
|
247
|
+
cloudcc create fields <projectPath> Q <objid> <fieldLabel> <remark> [helps] [defaultValue] <ptext> [useGlobalSelect] [edittype] [isPicklistSorted] [defPl] [globalSelectId] [visibleLines] [showalloptions]
|
|
124
248
|
```
|
|
125
249
|
|
|
126
|
-
其中 `ptext`
|
|
250
|
+
其中 **`helps`**、**`defaultValue`** 在 **`argvs[7]`**、**`argvs[8]`**,**`ptext`** 在 **`argvs[9]`**(若不需要帮助或默认值,可用 **`''`** 占位)。**`L` / `Q`** 在 **`useGlobalSelect`=`"0"`** 时 **`ptext`** 必填;**`useGlobalSelect`=`"1"`** 时 **`ptext`** 可为 **`''`**,但 **`globalSelectId`**(**`argvs[14]`**)必填。**`L` / `Q` 的 `ptext` 格式要求**(本地列表):多个选项之间必须使用 **`\r\n`(CRLF)** 换行连接,逻辑上等价于字符串 `"a\r\nb\r\nc"`(一行一个选项)。在 Shell 中可用 `$'a\r\nb\r\nc'` 等形式传入真实回车换行序列。若要向 **`argvs[10]`**(**`L`/`Q`** 专属参数)及之后某槽位传值而保留更前面槽位的默认,中间未用的槽位须用 **`''`** 占位(与 **`S`** 等类型相同约定)。
|
|
127
251
|
|
|
128
252
|
平台层面的选项列表能力常用于:
|
|
129
253
|
|
|
@@ -137,19 +261,19 @@ cloudcc create fields <projectPath> Q <objid> <fieldLabel> <ptext>
|
|
|
137
261
|
|
|
138
262
|
| CLI 类型编码 | 类型名称 | 说明 |
|
|
139
263
|
| --- | --- | --- |
|
|
140
|
-
| `Y` | 查找关系 |
|
|
264
|
+
| `Y` | 查找关系 | 关联另一个对象;可选 **`lookupObjDefaultField`**(`argvs[10]`),见 **「Y(查找关系)」** |
|
|
141
265
|
| `MR` | 查找多选 | 多选关联对象 |
|
|
142
266
|
| `M` | 主详信息关系 | 主从/主详关系字段 |
|
|
143
267
|
|
|
144
268
|
这三类字段创建时都需要额外传入目标对象参数:
|
|
145
269
|
|
|
146
270
|
```bash
|
|
147
|
-
cloudcc create fields <projectPath> Y <objid> <fieldLabel> <lookupObj>
|
|
148
|
-
cloudcc create fields <projectPath> MR <objid> <fieldLabel> <lookupObj>
|
|
149
|
-
cloudcc create fields <projectPath> M <objid> <fieldLabel> <lookupObj>
|
|
271
|
+
cloudcc create fields <projectPath> Y <objid> <fieldLabel> <remark> [helps] [defaultValue] <lookupObj> [lookupObjDefaultField]
|
|
272
|
+
cloudcc create fields <projectPath> MR <objid> <fieldLabel> <remark> [helps] [defaultValue] <lookupObj>
|
|
273
|
+
cloudcc create fields <projectPath> M <objid> <fieldLabel> <remark> [helps] [defaultValue] <lookupObj>
|
|
150
274
|
```
|
|
151
275
|
|
|
152
|
-
其中
|
|
276
|
+
其中 **`helps`**、**`defaultValue`** 在 **`argvs[7]`**、**`argvs[8]`**,**`lookupObj`** 在 **`argvs[9]`**。`lookupObj` 表示被关联对象。**仅 `Y`** 还可选 **`lookupObjDefaultField`**(**`argvs[10]`**;不需要时可传 **`''`**)。
|
|
153
277
|
|
|
154
278
|
这类字段常用于:
|
|
155
279
|
|
|
@@ -163,14 +287,14 @@ cloudcc create fields <projectPath> M <objid> <fieldLabel> <lookupObj>
|
|
|
163
287
|
| CLI 类型编码 | 类型名称 | 说明 |
|
|
164
288
|
| --- | --- | --- |
|
|
165
289
|
| `AD` | 地址 | 地址复合字段 |
|
|
166
|
-
| `LT` | 地理定位 |
|
|
290
|
+
| `LT` | 地理定位 | **`schemefieldLength`** / **`decimalPlaces`** / **`displayType`**(`argvs[9..11]`),见 **「LT」** |
|
|
167
291
|
|
|
168
292
|
#### 安全与加密类
|
|
169
293
|
|
|
170
294
|
| CLI 类型编码 | 类型名称 | 说明 |
|
|
171
295
|
| --- | --- | --- |
|
|
172
|
-
| `ENC` | 加密文本(存储加密) |
|
|
173
|
-
| `ENCD` | 加密文本(显示加密) |
|
|
296
|
+
| `ENC` | 加密文本(存储加密) | 与 **`ENCD`** 相同的 **`argvs[9..12]`**(长度·掩码),见 **「ENC / ENCD」** |
|
|
297
|
+
| `ENCD` | 加密文本(显示加密) | 与 **`ENC`** 相同的 **`argvs[9..12]`**,见 **「ENC / ENCD」** |
|
|
174
298
|
|
|
175
299
|
说明:
|
|
176
300
|
|
|
@@ -179,7 +303,7 @@ cloudcc create fields <projectPath> M <objid> <fieldLabel> <lookupObj>
|
|
|
179
303
|
- `C` 在模板内部对应的 `fdtype` 为小写 `c`
|
|
180
304
|
- 这两类字段更适合身份证号、银行卡号、敏感联系方式等场景
|
|
181
305
|
|
|
182
|
-
### 4
|
|
306
|
+
### 5.4 当前 CLI 未覆盖但平台支持的字段能力
|
|
183
307
|
|
|
184
308
|
根据官方文档,平台层面还支持以下字段能力,但当前 `src/fields/fields` 目录下尚未看到对应 CLI 创建模板:
|
|
185
309
|
|
|
@@ -191,9 +315,9 @@ cloudcc create fields <projectPath> M <objid> <fieldLabel> <lookupObj>
|
|
|
191
315
|
|
|
192
316
|
---
|
|
193
317
|
|
|
194
|
-
##
|
|
318
|
+
## 6. 删除字段
|
|
195
319
|
|
|
196
|
-
###
|
|
320
|
+
### 6.1 基本命令
|
|
197
321
|
|
|
198
322
|
```bash
|
|
199
323
|
cloudcc delete fields <projectPath> <fieldId> <objid>
|
|
@@ -207,7 +331,7 @@ cloudcc delete fields <projectPath> <fieldId> <objid>
|
|
|
207
331
|
|
|
208
332
|
---
|
|
209
333
|
|
|
210
|
-
##
|
|
334
|
+
## 7. 开发前检查
|
|
211
335
|
|
|
212
336
|
- 已完成 `cloudcc doc project devguide` 中的环境准备
|
|
213
337
|
- 项目根目录存在可用的 `cloudcc-cli.config.js`
|
|
@@ -216,7 +340,7 @@ cloudcc delete fields <projectPath> <fieldId> <objid>
|
|
|
216
340
|
|
|
217
341
|
---
|
|
218
342
|
|
|
219
|
-
##
|
|
343
|
+
## 8. 常见实践建议
|
|
220
344
|
|
|
221
345
|
- 优先先做对象建模,再补字段明细,避免频繁返工
|
|
222
346
|
- 字段命名规范化(显示名称清晰、API 名称可维护)
|
package/src/fields/fields/A.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 文本区(富文本)字段(A)配置模板
|
|
3
3
|
*/
|
|
4
|
-
module.exports = function (objid, nameLabel, apiname, profileList) {
|
|
4
|
+
module.exports = function (objid, nameLabel, apiname, helps = "", defaultValue = "", profileList) {
|
|
5
5
|
return {
|
|
6
6
|
"objid": objid,
|
|
7
7
|
"obj": {
|
|
@@ -10,7 +10,8 @@ module.exports = function (objid, nameLabel, apiname, profileList) {
|
|
|
10
10
|
"apiname": apiname,
|
|
11
11
|
"schemefieldLength": "255",
|
|
12
12
|
"remark": "",
|
|
13
|
-
"helps": ""
|
|
13
|
+
"helps": helps !== undefined && helps !== null ? String(helps) : "",
|
|
14
|
+
"defaultValue": defaultValue !== undefined && defaultValue !== null ? String(defaultValue) : ""
|
|
14
15
|
},
|
|
15
16
|
"dtype": "A:文本区(富文本)",
|
|
16
17
|
"fdtype": "A",
|
package/src/fields/fields/AD.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 地址字段(AD)配置模板
|
|
3
3
|
*/
|
|
4
|
-
module.exports = function (objid, nameLabel, apiname, profileList) {
|
|
4
|
+
module.exports = function (objid, nameLabel, apiname, helps = "", defaultValue = "", profileList) {
|
|
5
5
|
return {
|
|
6
6
|
"objid": objid,
|
|
7
7
|
"obj": {
|
|
@@ -9,7 +9,9 @@ module.exports = function (objid, nameLabel, apiname, profileList) {
|
|
|
9
9
|
"nameLabel": nameLabel,
|
|
10
10
|
"apiname": apiname,
|
|
11
11
|
"remark": "",
|
|
12
|
-
"helps": ""
|
|
12
|
+
"helps": helps !== undefined && helps !== null ? String(helps) : "",
|
|
13
|
+
"schemefieldLength": "500",
|
|
14
|
+
"defaultValue": defaultValue !== undefined && defaultValue !== null ? String(defaultValue) : ""
|
|
13
15
|
},
|
|
14
16
|
"dtype": "AD:地址",
|
|
15
17
|
"fdtype": "AD",
|