@steedos-labs/plugin-workflow 3.0.85 → 3.0.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -1
- package/designer/dist/amis-renderer/amis-renderer.css +1 -1
- package/designer/dist/amis-renderer/amis-renderer.js +1 -1
- package/designer/dist/assets/index-ClEul34C.css +1 -0
- package/designer/dist/assets/index-DWcq4xcG.js +1006 -0
- package/designer/dist/index.html +2 -2
- package/main/default/client/flow2_render.client.js +1 -1
- package/main/default/manager/instance_number_rules.js +246 -2
- package/main/default/manager/uuflow_manager.js +26 -4
- package/main/default/pages/page_instance_print.page.amis.json +2 -2
- package/main/default/routes/api_auto_number.router.js +11 -178
- package/main/default/routes/api_workflow_chart.router.js +16 -3
- package/main/default/routes/api_workflow_instance_forward.router.js +13 -1
- package/main/default/routes/api_workflow_next_step_users.router.js +4 -3
- package/main/default/routes/buildFormDesignSystemPrompt.js +4 -3
- package/main/default/server/ejs/export_instances.ejs +87 -211
- package/package.json +1 -1
- package/public/amis-renderer/amis-renderer.css +1 -1
- package/public/amis-renderer/amis-renderer.js +1 -1
- package/designer/dist/assets/index-B56yvQDB.css +0 -1
- package/designer/dist/assets/index-DpFVuLlI.js +0 -1004
|
@@ -291,9 +291,10 @@ router.post('/api/workflow/v2/nextStepUsersValue', requireAuthentication, async
|
|
|
291
291
|
for (let i = traces.length - 1; i >= 0; i--) {
|
|
292
292
|
const trace = traces[i];
|
|
293
293
|
if (trace.step === nextStepId && trace.approves && trace.approves.length > 0) {
|
|
294
|
-
//
|
|
294
|
+
// 排除非实际处理人的 approve
|
|
295
|
+
const excludedApproveJudges = ['returned', 'relocated', 'terminated', 'retrieved'];
|
|
295
296
|
newNextUsers = trace.approves
|
|
296
|
-
.filter(approve => !
|
|
297
|
+
.filter(approve => !excludedApproveJudges.includes(approve.judge))
|
|
297
298
|
.map(approve => approve.handler);
|
|
298
299
|
break;
|
|
299
300
|
}
|
|
@@ -327,4 +328,4 @@ router.post('/api/workflow/v2/nextStepUsersValue', requireAuthentication, async
|
|
|
327
328
|
}
|
|
328
329
|
});
|
|
329
330
|
|
|
330
|
-
exports.default = router;
|
|
331
|
+
exports.default = router;
|
|
@@ -208,13 +208,14 @@ function buildFormDesignSystemPrompt({ chineseFieldNames = false, isUpgrade = fa
|
|
|
208
208
|
|
|
209
209
|
- autoNumber 类型(自动编号):
|
|
210
210
|
- 自动编号字段始终为只读(readonly: true),运行时由系统自动生成唯一编号
|
|
211
|
+
- auto_number_name: 字符串,可选,编号规则名称;留空时系统按表单和字段自动生成
|
|
211
212
|
- autoNumberPrefix: 字符串,编号前缀,如 "SN-"、"HT-",默认 ""
|
|
212
213
|
- autoNumberSuffix: 字符串,编号后缀,默认 ""
|
|
213
214
|
- autoNumberPadding: 数字,序号位数(补零),默认 4,如 4 → 0001
|
|
214
215
|
- autoNumberDateFormat: 字符串,日期片段格式,可选值:"none"(无日期) | "YYYY"(年) | "YYYYMM"(年月,默认) | "YYYYMMDD"(年月日)
|
|
215
216
|
- autoNumberResetCycle: 字符串,序号重置周期,可选值:"none"(不重置) | "yearly"(每年) | "monthly"(每月,默认) | "daily"(每天)
|
|
216
217
|
- 生成的编号格式示例:前缀 + 日期 + 序号 + 后缀,如 "SN-202603-0001"
|
|
217
|
-
- 示例:{ "type": "autoNumber", "label": "合同编号", "name": "contract_no", "readonly": true, "autoNumberPrefix": "HT-", "autoNumberDateFormat": "YYYYMM", "autoNumberPadding": 4, "autoNumberResetCycle": "monthly" }
|
|
218
|
+
- 示例:{ "type": "autoNumber", "label": "合同编号", "name": "contract_no", "readonly": true, "auto_number_name": "合同编号", "autoNumberPrefix": "HT-", "autoNumberDateFormat": "YYYYMM", "autoNumberPadding": 4, "autoNumberResetCycle": "monthly" }
|
|
218
219
|
|
|
219
220
|
- 动态显隐条件(任何字段都可设置):${chineseFieldNames ? `
|
|
220
221
|
- visibilityExpression: 字符串,条件表达式,控制字段显示/隐藏。当表达式结果为 true 时字段可见,否则隐藏。
|
|
@@ -438,11 +439,11 @@ ${formulaRule}
|
|
|
438
439
|
- 迁移规则:
|
|
439
440
|
- 遇到字段的 default_value 包含 \`auto_number(...)\` 时,将该字段的 type 改为 "autoNumber",设置 readonly: true
|
|
440
441
|
- 删除原有的 default_value 属性
|
|
441
|
-
- 如果旧版编号规则名称中能推断出前缀、日期格式等信息,相应设置 autoNumberPrefix、autoNumberDateFormat 等属性;否则使用默认值
|
|
442
|
+
- 如果旧版编号规则名称中能推断出前缀、日期格式等信息,相应设置 auto_number_name、autoNumberPrefix、autoNumberDateFormat 等属性;否则使用默认值
|
|
442
443
|
- 默认配置:autoNumberPrefix: ""、autoNumberPadding: 4、autoNumberDateFormat: "YYYYMM"、autoNumberResetCycle: "monthly"
|
|
443
444
|
- 迁移示例:
|
|
444
445
|
旧版字段:{ "name": "合同编号", "type": "text", "default_value": "auto_number('contract_no')" }
|
|
445
|
-
新版字段:{ "name": "contract_no", "label": "合同编号", "type": "autoNumber", "readonly": true, "autoNumberPrefix": "", "autoNumberPadding": 4, "autoNumberDateFormat": "YYYYMM", "autoNumberResetCycle": "monthly" }
|
|
446
|
+
新版字段:{ "name": "contract_no", "label": "合同编号", "type": "autoNumber", "readonly": true, "auto_number_name": "contract_no", "autoNumberPrefix": "", "autoNumberPadding": 4, "autoNumberDateFormat": "YYYYMM", "autoNumberResetCycle": "monthly" }
|
|
446
447
|
- migrationLog 记录格式:"字段 <name>: default_value auto_number(...) 转换为 autoNumber 类型"
|
|
447
448
|
|
|
448
449
|
### 旧版 HTML 字段类型迁移
|
|
@@ -14,6 +14,89 @@
|
|
|
14
14
|
}
|
|
15
15
|
return field.label || field.title || field.name || field.code || '';
|
|
16
16
|
};
|
|
17
|
+
var escapeXml = function(value) {
|
|
18
|
+
if (value === undefined || value === null) {
|
|
19
|
+
return '';
|
|
20
|
+
}
|
|
21
|
+
return String(value).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
|
|
22
|
+
};
|
|
23
|
+
var isMultiValueField = function(field, value) {
|
|
24
|
+
return field && (field.is_multiselect == true || ['memberMulti', 'orgMulti'].includes(field.type) || Array.isArray(value));
|
|
25
|
+
};
|
|
26
|
+
var getObjectDisplayValue = function(value, fieldType) {
|
|
27
|
+
if (value === undefined || value === null) {
|
|
28
|
+
return '';
|
|
29
|
+
}
|
|
30
|
+
if (typeof(value) != 'object') {
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
if (['group', 'org', 'orgMulti'].includes(fieldType)) {
|
|
34
|
+
return value.fullname || value.name || value.label || value.title || value.id || value._id || '';
|
|
35
|
+
}
|
|
36
|
+
return value.name || value.fullname || value.username || value.label || value.title || value.id || value.user || value._id || '';
|
|
37
|
+
};
|
|
38
|
+
var formatPickerValue = function(field, value) {
|
|
39
|
+
if (isMultiValueField(field, value)) {
|
|
40
|
+
return _.map(Array.isArray(value) ? value : [value], function(item) {
|
|
41
|
+
return getObjectDisplayValue(item, field.type);
|
|
42
|
+
}).filter(function(item) {
|
|
43
|
+
return item !== undefined && item !== null && item !== '';
|
|
44
|
+
}).join(',');
|
|
45
|
+
}
|
|
46
|
+
return getObjectDisplayValue(value, field.type);
|
|
47
|
+
};
|
|
48
|
+
var renderDataCell = function(field, value) {
|
|
49
|
+
if (value === undefined || value === null || value === '') {
|
|
50
|
+
return '<Cell><Data ss:Type="String"></Data></Cell>';
|
|
51
|
+
}
|
|
52
|
+
if (['user', 'group', 'member', 'memberMulti', 'org', 'orgMulti'].includes(field.type)) {
|
|
53
|
+
return '<Cell><Data ss:Type="String">' + escapeXml(formatPickerValue(field, value)) + '</Data></Cell>';
|
|
54
|
+
}
|
|
55
|
+
if (field.type == 'checkbox') {
|
|
56
|
+
return '<Cell><Data ss:Type="String">' + escapeXml(value == 'true' ? t('instance.formatter.checkbox.checked',{},lang) : t('instance.formatter.checkbox.unchecked',{},lang)) + '</Data></Cell>';
|
|
57
|
+
}
|
|
58
|
+
if (field.type == 'password') {
|
|
59
|
+
return '<Cell><Data ss:Type="String">******</Data></Cell>';
|
|
60
|
+
}
|
|
61
|
+
if (field.type == 'number') {
|
|
62
|
+
return '<Cell><Data ss:Type="Number">' + (Number(value) ? Number(Number(value).toFixed(field.digits)) : 0) + '</Data></Cell>';
|
|
63
|
+
}
|
|
64
|
+
if (field.type == 'date') {
|
|
65
|
+
var v = value;
|
|
66
|
+
if (typeof(v) == 'string' && v) {
|
|
67
|
+
try {
|
|
68
|
+
v = formatDate(v, t('instance.formatter.date.export_date',{},lang));
|
|
69
|
+
} catch (e) {
|
|
70
|
+
console.error(e);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (v instanceof Date) {
|
|
74
|
+
v = formatDate(v, t('instance.formatter.date.export_date',{},lang));
|
|
75
|
+
}
|
|
76
|
+
return '<Cell><Data ss:Type="String">' + escapeXml(v || '') + '</Data></Cell>';
|
|
77
|
+
}
|
|
78
|
+
if (['dateTime', 'datetime'].includes(field.type)) {
|
|
79
|
+
var v = value;
|
|
80
|
+
if (typeof(v) == 'string' && v) {
|
|
81
|
+
try {
|
|
82
|
+
v = formatDate(v, t('instance.formatter.date.export_datetime',{},lang));
|
|
83
|
+
} catch (e) {
|
|
84
|
+
console.error(e);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (v instanceof Date) {
|
|
88
|
+
v = formatDate(v, t('instance.formatter.date.export_datetime',{},lang));
|
|
89
|
+
}
|
|
90
|
+
return '<Cell><Data ss:Type="String">' + escapeXml(v || '') + '</Data></Cell>';
|
|
91
|
+
}
|
|
92
|
+
if (field.type == 'odata') {
|
|
93
|
+
return '<Cell><Data ss:Type="String">' + escapeXml((value && value['@label']) ? value['@label'] : '') + '</Data></Cell>';
|
|
94
|
+
}
|
|
95
|
+
if (typeof(value) == 'object') {
|
|
96
|
+
value = getObjectDisplayValue(value, field.type);
|
|
97
|
+
}
|
|
98
|
+
return '<Cell><Data ss:Type="String">' + escapeXml(value) + '</Data></Cell>';
|
|
99
|
+
};
|
|
17
100
|
%>
|
|
18
101
|
<!-- 编号 -->
|
|
19
102
|
<Column ss:Width="35"/>
|
|
@@ -115,149 +198,11 @@
|
|
|
115
198
|
<Cell><Data ss:Type="String"><%= formatDate(current_trace["start_date"], t('instance.formatter.date.export_datetime',{},lang)) %></Data></Cell>
|
|
116
199
|
<% _.each(fields, function(field){ %>
|
|
117
200
|
<% if (field.type != "table" && field.type != "section") { %>
|
|
118
|
-
|
|
119
|
-
<Cell><Data ss:Type="String"><%= "" %></Data></Cell>
|
|
120
|
-
<% } else { %>
|
|
121
|
-
<% if (['user','group'].includes(field.type) && field.is_multiselect != true) { %>
|
|
122
|
-
<Cell><Data ss:Type="String"><%= field.type=="user" ? ins["values"][field.code]["name"] : ins["values"][field.code]["fullname"]%></Data></Cell>
|
|
123
|
-
<% } else if (['user','group'].includes(field.type) && field.is_multiselect == true) {
|
|
124
|
-
var tem_ary = new Array;
|
|
125
|
-
_.each(ins["values"][field.code], function(s){
|
|
126
|
-
tem_ary.push(field.type=="user" ? s["name"] : s["fullname"])
|
|
127
|
-
})
|
|
128
|
-
%>
|
|
129
|
-
<Cell><Data ss:Type="String"><%= tem_ary.join(",") %></Data></Cell>
|
|
130
|
-
<% } else if (field.type == "checkbox") { %>
|
|
131
|
-
<Cell><Data ss:Type="String"><%= ins["values"][field.code]=="true" ? t('instance.formatter.checkbox.checked',{},lang) : t('instance.formatter.checkbox.unchecked',{},lang) %></Data></Cell>
|
|
132
|
-
<% } else if (field.type == "password") { %>
|
|
133
|
-
<Cell><Data ss:Type="String">******</Data></Cell>
|
|
134
|
-
<% } else if (field.type == "number") { %>
|
|
135
|
-
<Cell><Data ss:Type="Number"><%= Number(ins["values"][field.code]) ? Number(Number(ins["values"][field.code]).toFixed(field.digits)) : 0 %></Data></Cell>
|
|
136
|
-
<% } else if (field.type == "date") { %>
|
|
137
|
-
<%
|
|
138
|
-
var v = ins["values"][field.code];
|
|
139
|
-
if (typeof(v) == "string" && v) {
|
|
140
|
-
try {
|
|
141
|
-
v = formatDate(v, t('instance.formatter.date.export_date',{},lang));
|
|
142
|
-
} catch (e) {
|
|
143
|
-
console.error(e);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
if (v instanceof Date) {
|
|
147
|
-
v = formatDate(v, t('instance.formatter.date.export_date',{},lang));
|
|
148
|
-
}
|
|
149
|
-
if (!v) {
|
|
150
|
-
v = "";
|
|
151
|
-
}
|
|
152
|
-
%>
|
|
153
|
-
<Cell><Data ss:Type="String"><%= v %></Data></Cell>
|
|
154
|
-
<% } else if (field.type == "dateTime") { %>
|
|
155
|
-
<%
|
|
156
|
-
var v = ins["values"][field.code];
|
|
157
|
-
if (typeof(v) == "string" && v) {
|
|
158
|
-
try {
|
|
159
|
-
v = formatDate(v, t('instance.formatter.date.export_datetime',{},lang));
|
|
160
|
-
} catch (e) {
|
|
161
|
-
console.error(e);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
if (v instanceof Date) {
|
|
165
|
-
v = formatDate(v, t('instance.formatter.date.export_datetime',{},lang));
|
|
166
|
-
}
|
|
167
|
-
if (!v) {
|
|
168
|
-
v = "";
|
|
169
|
-
}
|
|
170
|
-
%>
|
|
171
|
-
<Cell><Data ss:Type="String"><%= v %></Data></Cell>
|
|
172
|
-
<% } else if (field.type == "odata") { %>
|
|
173
|
-
<%
|
|
174
|
-
var odataValue = ins["values"][field.code];
|
|
175
|
-
var v = (odataValue && odataValue["@label"]) ? odataValue["@label"] : "";
|
|
176
|
-
%>
|
|
177
|
-
<Cell><Data ss:Type="String"><%= v %></Data></Cell>
|
|
178
|
-
<% } else { %>
|
|
179
|
-
<%
|
|
180
|
-
tem_v = ins["values"][field.code];
|
|
181
|
-
if (typeof(tem_v) == "string") {
|
|
182
|
-
tem_v = tem_v.replace(/</g, "<").replace(/>/g, ">");
|
|
183
|
-
}
|
|
184
|
-
%>
|
|
185
|
-
<Cell><Data ss:Type="String"><%= tem_v %></Data></Cell>
|
|
186
|
-
<% } %>
|
|
187
|
-
<% } %>
|
|
201
|
+
<%- renderDataCell(field, ins["values"] && ins["values"][field.code]) %>
|
|
188
202
|
<% } %>
|
|
189
203
|
<% if (field.type == "section" && field.fields) { %>
|
|
190
204
|
<% _.each(field.fields, function(sec){ %>
|
|
191
|
-
|
|
192
|
-
<Cell><Data ss:Type="String"><%= "" %></Data></Cell>
|
|
193
|
-
<% } else { %>
|
|
194
|
-
<% if (['user','group'].includes(sec.type) && sec.is_multiselect != true) { %>
|
|
195
|
-
<Cell><Data ss:Type="String"><%= sec.type=="user" ? ins["values"][sec.code]["name"] : ins["values"][sec.code]["fullname"]%></Data></Cell>
|
|
196
|
-
<% } else if (['user','group'].includes(sec.type) && sec.is_multiselect == true) {
|
|
197
|
-
var tem_ary = new Array;
|
|
198
|
-
_.each(ins["values"][sec.code], function(s){
|
|
199
|
-
tem_ary.push(sec.type=="user" ? s["name"] : s["fullname"])
|
|
200
|
-
})
|
|
201
|
-
%>
|
|
202
|
-
<Cell><Data ss:Type="String"><%= tem_ary.join(",") %></Data></Cell>
|
|
203
|
-
<% } else if (sec.type == "checkbox") { %>
|
|
204
|
-
<Cell><Data ss:Type="String"><%= ins["values"][sec.code]=="true" ? t('instance.formatter.checkbox.checked',{},lang) : t('instance.formatter.checkbox.unchecked',{},lang) %></Data></Cell>
|
|
205
|
-
<% } else if (sec.type == "password") { %>
|
|
206
|
-
<Cell><Data ss:Type="String">******</Data></Cell>
|
|
207
|
-
<% } else if (sec.type == "number") { %>
|
|
208
|
-
<Cell><Data ss:Type="Number"><%= Number(ins["values"][sec.code]) ? Number(Number(ins["values"][sec.code]).toFixed(sec.digits)) : 0 %></Data></Cell>
|
|
209
|
-
<% } else if (sec.type == "date") { %>
|
|
210
|
-
<%
|
|
211
|
-
var v = ins["values"][sec.code];
|
|
212
|
-
if (typeof(v) == "string" && v) {
|
|
213
|
-
try {
|
|
214
|
-
v = new Date(v);
|
|
215
|
-
} catch (e) {
|
|
216
|
-
console.error(e);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
if (v instanceof Date) {
|
|
220
|
-
v = moment(v).format(t('instance.formatter.date.export_date',{},lang));
|
|
221
|
-
}
|
|
222
|
-
if (!v) {
|
|
223
|
-
v = "";
|
|
224
|
-
}
|
|
225
|
-
%>
|
|
226
|
-
<Cell><Data ss:Type="String"><%= v %></Data></Cell>
|
|
227
|
-
<% } else if (sec.type == "dateTime") { %>
|
|
228
|
-
<%
|
|
229
|
-
var v = ins["values"][sec.code];
|
|
230
|
-
if (typeof(v) == "string" && v) {
|
|
231
|
-
try {
|
|
232
|
-
v = new Date(v);
|
|
233
|
-
} catch (e) {
|
|
234
|
-
console.error(e);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
if (v instanceof Date) {
|
|
238
|
-
v = moment(v).format(t('instance.formatter.date.export_datetime',{},lang));
|
|
239
|
-
}
|
|
240
|
-
if (!v) {
|
|
241
|
-
v = "";
|
|
242
|
-
}
|
|
243
|
-
%>
|
|
244
|
-
<Cell><Data ss:Type="String"><%= v %></Data></Cell>
|
|
245
|
-
<% } else if (sec.type == "odata") { %>
|
|
246
|
-
<%
|
|
247
|
-
var odataValue = ins["values"][sec.code];
|
|
248
|
-
var v = (odataValue && odataValue["@label"]) ? odataValue["@label"] : "";
|
|
249
|
-
%>
|
|
250
|
-
<Cell><Data ss:Type="String"><%= v %></Data></Cell>
|
|
251
|
-
<% } else { %>
|
|
252
|
-
<%
|
|
253
|
-
tem_v = ins["values"][sec.code];
|
|
254
|
-
if (typeof(tem_v) == "string") {
|
|
255
|
-
tem_v = tem_v.replace(/</g, "<").replace(/>/g, ">");
|
|
256
|
-
}
|
|
257
|
-
%>
|
|
258
|
-
<Cell><Data ss:Type="String"><%= tem_v %></Data></Cell>
|
|
259
|
-
<% } %>
|
|
260
|
-
<% } %>
|
|
205
|
+
<%- renderDataCell(sec, ins["values"] && ins["values"][sec.code]) %>
|
|
261
206
|
<% }) %>
|
|
262
207
|
<% } %>
|
|
263
208
|
<% }) %>
|
|
@@ -351,76 +296,7 @@
|
|
|
351
296
|
<Cell><Data ss:Type="String"><%= current_trace.name %></Data></Cell>
|
|
352
297
|
<Cell><Data ss:Type="String"><%= formatDate(current_trace["start_date"], t('instance.formatter.date.export_datetime',{},lang)) %></Data></Cell>
|
|
353
298
|
<% _.each(table_field.fields, function(field) { %>
|
|
354
|
-
|
|
355
|
-
<Cell><Data ss:Type="String"><%= "" %></Data></Cell>
|
|
356
|
-
<% } else { %>
|
|
357
|
-
<% if (['user','group'].includes(field.type) && field.is_multiselect != true) { %>
|
|
358
|
-
<Cell><Data ss:Type="String"><%= field.type=="user" ? f_obj[field.code]["name"] : f_obj[field.code]["fullname"]%></Data></Cell>
|
|
359
|
-
<% } else if (['user','group'].includes(field.type) && field.is_multiselect == true) {
|
|
360
|
-
var tem_ary = new Array;
|
|
361
|
-
_.each(f_obj[field.code], function(s){
|
|
362
|
-
tem_ary.push(field.type=="user" ? s["name"] : s["fullname"])
|
|
363
|
-
})
|
|
364
|
-
%>
|
|
365
|
-
<Cell><Data ss:Type="String"><%= tem_ary.join(",") %></Data></Cell>
|
|
366
|
-
<% } else if (field.type == "checkbox") { %>
|
|
367
|
-
<Cell><Data ss:Type="String"><%= f_obj[field.code]=="true" ? t('instance.formatter.checkbox.checked',{},lang) : t('instance.formatter.checkbox.unchecked',{},lang) %></Data></Cell>
|
|
368
|
-
<% } else if (field.type == "password") { %>
|
|
369
|
-
<Cell><Data ss:Type="String">******</Data></Cell>
|
|
370
|
-
<% } else if (field.type == "number") { %>
|
|
371
|
-
<Cell><Data ss:Type="Number"><%= Number(f_obj[field.code]) ? Number(Number(f_obj[field.code]).toFixed(field.digits)) : 0 %></Data></Cell>
|
|
372
|
-
<% } else if (field.type == "date") { %>
|
|
373
|
-
<%
|
|
374
|
-
var v = f_obj[field.code];
|
|
375
|
-
if (typeof(v) == "string" && v) {
|
|
376
|
-
try {
|
|
377
|
-
v = formatDate(v, t('instance.formatter.date.export_date',{},lang));
|
|
378
|
-
} catch (e) {
|
|
379
|
-
console.error(e);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
if (v instanceof Date) {
|
|
383
|
-
v = formatDate(v, t('instance.formatter.date.export_date',{},lang));
|
|
384
|
-
}
|
|
385
|
-
if (!v) {
|
|
386
|
-
v = "";
|
|
387
|
-
}
|
|
388
|
-
%>
|
|
389
|
-
<Cell><Data ss:Type="String"><%= v %></Data></Cell>
|
|
390
|
-
<% } else if (field.type == "dateTime") { %>
|
|
391
|
-
<%
|
|
392
|
-
var v = f_obj[field.code];
|
|
393
|
-
if (typeof(v) == "string" && v) {
|
|
394
|
-
try {
|
|
395
|
-
v = formatDate(v, t('instance.formatter.date.export_datetime',{},lang));
|
|
396
|
-
} catch (e) {
|
|
397
|
-
console.error(e);
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
if (v instanceof Date) {
|
|
401
|
-
v = formatDate(v, t('instance.formatter.date.export_datetime',{},lang));
|
|
402
|
-
}
|
|
403
|
-
if (!v) {
|
|
404
|
-
v = "";
|
|
405
|
-
}
|
|
406
|
-
%>
|
|
407
|
-
<Cell><Data ss:Type="String"><%= v %></Data></Cell>
|
|
408
|
-
<% } else if (field.type == "odata") { %>
|
|
409
|
-
<%
|
|
410
|
-
var odataValue = f_obj[field.code];
|
|
411
|
-
var v = (odataValue && odataValue["@label"]) ? odataValue["@label"] : "";
|
|
412
|
-
%>
|
|
413
|
-
<Cell><Data ss:Type="String"><%= v %></Data></Cell>
|
|
414
|
-
<% } else { %>
|
|
415
|
-
<%
|
|
416
|
-
tem_v = f_obj[field.code];
|
|
417
|
-
if (typeof(tem_v) == "string") {
|
|
418
|
-
tem_v = tem_v.replace(/</g, "<").replace(/>/g, ">");
|
|
419
|
-
}
|
|
420
|
-
%>
|
|
421
|
-
<Cell><Data ss:Type="String"><%= tem_v %></Data></Cell>
|
|
422
|
-
<% } %>
|
|
423
|
-
<% } %>
|
|
299
|
+
<%- renderDataCell(field, f_obj[field.code]) %>
|
|
424
300
|
<% }) %>
|
|
425
301
|
</Row>
|
|
426
302
|
<% }) %>
|
|
@@ -429,4 +305,4 @@
|
|
|
429
305
|
</Table>
|
|
430
306
|
</Worksheet>
|
|
431
307
|
<% }) %>
|
|
432
|
-
</Workbook>
|
|
308
|
+
</Workbook>
|