lambo-design-bi 0.0.1

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.
Files changed (39) hide show
  1. package/bi/widget/README.md +18 -0
  2. package/bi/widget/api/data.js +48 -0
  3. package/bi/widget/atom/index.vue +36 -0
  4. package/bi/widget/atom/test.vue +36 -0
  5. package/bi/widget/config/config.js +7 -0
  6. package/bi/widget/container/card/card-widget.vue +46 -0
  7. package/bi/widget/container/card/comps/indicator-card/index.js +7 -0
  8. package/bi/widget/container/card/comps/indicator-card/src/indicator-card-bi-search.vue +132 -0
  9. package/bi/widget/container/card/comps/indicator-card/src/indicator-card-bi.vue +129 -0
  10. package/bi/widget/container/card/comps/indicator-card/src/indicator-card-item-bi.vue +97 -0
  11. package/bi/widget/container/card/comps/indicator-card/src/styles/css/card-search.less +108 -0
  12. package/bi/widget/container/card/comps/indicator-card/src/styles/css/card.less +114 -0
  13. package/bi/widget/layout/col.vue +35 -0
  14. package/bi/widget/layout/row.vue +40 -0
  15. package/bi/widget/num/index.vue +101 -0
  16. package/bi/widget/page/index.vue +38 -0
  17. package/bi/widget/search/search-form.vue +85 -0
  18. package/bi/widget/search/search-item.vue +205 -0
  19. package/bi/widget/table/detail-table.vue +65 -0
  20. package/bi/widget/table/paging-table.vue +188 -0
  21. package/bi/widget/util/widget-map.js +41 -0
  22. package/package.json +39 -0
  23. package/pub/charts/echarts.vue +57 -0
  24. package/pub/charts/factory/charts-factory.vue +58 -0
  25. package/pub/charts/factory/options.js +2351 -0
  26. package/pub/empty/index.vue +33 -0
  27. package/pub/helpbox/README.md +6 -0
  28. package/pub/helpbox/index.vue +363 -0
  29. package/pub/num-index/num-index.vue +120 -0
  30. package/pub/table/detail-table/index.vue +41 -0
  31. package/pub/table/paging-table/README.md +4 -0
  32. package/pub/table/paging-table/comps/export-data.vue +390 -0
  33. package/pub/table/paging-table/comps/export-drawer.vue +429 -0
  34. package/pub/table/paging-table/index.js +3 -0
  35. package/pub/table/paging-table/index.vue +1577 -0
  36. package/pub/table/paging-table/styles/css/index.less +190 -0
  37. package/pub/theme/color.js +3 -0
  38. package/util/math-util.js +71 -0
  39. package/util/num-util.js +16 -0
@@ -0,0 +1,429 @@
1
+ <template>
2
+ <Drawer title="导出列表" width="400" v-if="value" :mask-closable="false">
3
+ <LamboFileList class="demo-drawer-body" v-if="value" :files="fileList" @on-file-remove="handleRemove" @on-file-preview="exportFile"></LamboFileList>
4
+ <div class="demo-drawer-footer">
5
+ <Button style="margin-right: 8px" @click="onCancel">关闭</Button>
6
+ <Button type="primary" :loading="exportLoading" @click="exportIndex(0)">开始导出</Button>
7
+ </div>
8
+ </Drawer>
9
+ </template>
10
+
11
+ <script>
12
+ import ajax from '@lambo-design/shared/utils/ajax';
13
+ import excel from '@lambo-design/shared/utils/excel'
14
+ import { deepCopy, isJson } from "@lambo-design/shared/utils/assist";
15
+ import LamboFileList from '@lambo-design/file-list'
16
+
17
+ export default {
18
+ name: 'export-drawer',
19
+ components: {
20
+ LamboFileList
21
+ },
22
+ props: {
23
+ value: {
24
+ type: Boolean,
25
+ default() {
26
+ return false;
27
+ }
28
+ },
29
+ fileList: {
30
+ type: Array,
31
+ default() {
32
+ return []
33
+ }
34
+ },
35
+ exportMode: {
36
+ type: String,
37
+ default() {
38
+ return "front";
39
+ }
40
+ },
41
+ requestUrl: {
42
+ type: String,
43
+ default() {
44
+ return ''
45
+ }
46
+ },
47
+ requestLimit: {
48
+ type: Number,
49
+ default: -1
50
+ },
51
+ requestMethod: {
52
+ type: String,
53
+ default: 'GET',
54
+ },
55
+ requestSuccessCodes: {
56
+ type: Array,
57
+ default: function () {
58
+ return [1, "000"]
59
+ },
60
+ validator(value) {
61
+ if (value != null && [...value].sort().toString() !== [1, "1", "000"].sort().toString()) {
62
+ console.warn("不推荐单独设置请求成功返回码");
63
+ }
64
+ return value instanceof Array;
65
+ }
66
+ },
67
+ searchParams: {
68
+ type: Object,
69
+ default() {
70
+ return {};
71
+ }
72
+ },
73
+ sortParams: {
74
+ type: Object,
75
+ default() {
76
+ return {};
77
+ }
78
+ },
79
+ tableColumns: {
80
+ type: Array,
81
+ default() {
82
+ return [];
83
+ }
84
+ },
85
+ parsedColumns: {
86
+ type: Array,
87
+ default() {
88
+ return [];
89
+ }
90
+ },
91
+ showSummary: {
92
+ type: Boolean,
93
+ default: false
94
+ },
95
+ summaryMethod: {
96
+ type: Function,
97
+ default: () => {
98
+ }
99
+ },
100
+ },
101
+ data() {
102
+ return {
103
+ timer: null,
104
+ exportLoading: false,
105
+ tableParsedColumns: []
106
+ }
107
+ },
108
+ computed: {
109
+ showFileList: function () {
110
+ return this.value;
111
+ },
112
+ reqMethod: function () {
113
+ return this.requestMethod
114
+ },
115
+ },
116
+ created() {
117
+ this.tableParsedColumns = this.parsedColumns;
118
+ },
119
+ methods: {
120
+ onCancel() {
121
+ this.$emit("input", false);
122
+ },
123
+ getFile(index) {
124
+ let self = this;
125
+ let file = self.fileList[index];
126
+ if (file.status === 'finished') {
127
+ ++index;
128
+ return self.getFile(index)
129
+ } else {
130
+ return file
131
+ }
132
+ },
133
+ exportIndex(index) {
134
+ let self = this;
135
+ let file = self.getFile(index);
136
+ self.exportFile(file).then(() => {
137
+ if (index < self.fileList.length && self.showFileList) {
138
+ self.exportIndex(++index);
139
+ }
140
+ }).catch((e) => {
141
+ console.error(e);
142
+ });
143
+ },
144
+ exportFile(file) {
145
+ let self = this;
146
+ self.exportLoading = true;
147
+ file.percentage = 0;
148
+ file.showProgress = true;
149
+ file.status = 'active';
150
+ file.timer = setInterval(() => {
151
+ file.percentage += Math.floor(Math.random() * 2);
152
+ if (file.percentage > 95) {
153
+ if (file.timer) {
154
+ clearInterval(file.timer);
155
+ }
156
+ }
157
+ }, 300);
158
+
159
+ return new Promise((resolve, reject) => {
160
+ self.getData(file).then(() => {
161
+ if (file.timer) {
162
+ clearInterval(file.timer);
163
+ file.timer = null;
164
+ file.percentage = 100;
165
+ file.status = "finished"
166
+ }
167
+
168
+ self.exportLoading = false;
169
+ setTimeout(() => {
170
+ // file.percentage = 0;
171
+ // file.showProgress = false;
172
+ resolve();
173
+ }, 200);
174
+ }).catch((e) => {
175
+ self.exportLoading = false;
176
+ if (file.timer) {
177
+ clearInterval(file.timer);
178
+ file.timer = null;
179
+ file.percentage = 100;
180
+ file.status = "wrong"
181
+ }
182
+ reject(e);
183
+ })
184
+ })
185
+ },
186
+ getData(file) {
187
+ let self = this;
188
+ if (self.exportMode == 'front') {
189
+ return self.dealWithJson(file)
190
+ } else if (self.exportMode == 'back') {
191
+ return self.dealWithStream(file)
192
+ }
193
+ },
194
+ dealWithStream(file) {
195
+ let self = this;
196
+ let paginationParams = { offset: file.offset || 0, limit: file.limit }
197
+ let params = Object.assign({}, paginationParams, self.sortParams, self.searchParams)
198
+ let exportParams = {
199
+ fileFormat: file.format,
200
+ fileName: file.filename,
201
+ exportType: 'current',
202
+ tableColumns: self.tableParsedColumns
203
+ }
204
+ return new Promise((resolve, reject) => {
205
+ ajax.request({
206
+ url: self.requestUrl,
207
+ method: self.reqMethod,
208
+ params: Object.assign({}, params, { exportParams: JSON.stringify(exportParams) }),
209
+ responseType: 'blob'
210
+ }).then((resp) => {
211
+ let blob = new Blob([resp.data], {
212
+ type: "application/vnd.ms-excel"
213
+ });
214
+ excel.saveAs(blob, file.filename + '.' + file.format);
215
+ resolve();
216
+ }).catch((e) => {
217
+ reject(e);
218
+ })
219
+ })
220
+ },
221
+ dealWithJson(file) {
222
+ let self = this;
223
+ if (self.requestLimit === -1) {
224
+ return self.noLimitRequest(file);
225
+ } else {
226
+ return self.limitRequest(file);
227
+ }
228
+ },
229
+ limitRequest(file) {
230
+ let self = this;
231
+ return new Promise((resolve, reject) => {
232
+ let reqArr = [];
233
+ let iterations = file.limit / self.requestLimit;
234
+ for (let i = 0; i < iterations; i++) {
235
+ let remain = file.limit - i * this.requestLimit
236
+ let limit = remain > this.requestLimit ? this.requestLimit : remain;
237
+ let paginationParams = { offset: file.offset + i * self.requestLimit || 0, limit: limit }
238
+ let params = Object.assign({}, paginationParams, self.sortParams, self.searchParams)
239
+ let options = {
240
+ url: self.requestUrl,
241
+ method: self.reqMethod
242
+ }
243
+ if (self.reqMethod === 'GET') {
244
+ options = Object.assign({}, options,
245
+ {
246
+ params: params
247
+ }
248
+ )
249
+ } else if (self.reqMethod === 'POST') {
250
+ options = Object.assign({}, options,
251
+ {
252
+ data: params
253
+ }
254
+ )
255
+ }
256
+ reqArr.push(ajax.request(options))
257
+ }
258
+ // ajax.get(self.requestUrl, {params: params})
259
+ Promise.all(reqArr).then(function (resps) {
260
+ let resultData = [];
261
+ let success = true;
262
+ resps.forEach((resp) => {
263
+ //这里是为了做IE11兼容
264
+ if (!isJson(resp.data)) {
265
+ resp.data = JSON.parse(resp.data);
266
+ }
267
+ if (self.requestSuccessCodes.includes(resp.data.code)) {
268
+ let resultDataItem = deepCopy(resp.data.data.rows)
269
+ resultData.push(...resultDataItem);
270
+ } else {
271
+ success = false;
272
+ }
273
+ })
274
+ if (self.showSummary && resultData) {
275
+ let sum = self.summaryData(resultData)
276
+ resultData.push(sum)
277
+ }
278
+ // console.log(resultData)
279
+ if (success) {
280
+ self.exportData(resultData, file)
281
+ resolve();
282
+ } else {
283
+ reject(resps)
284
+ }
285
+ }).catch((e) => {
286
+ reject(e)
287
+ })
288
+ })
289
+ },
290
+ noLimitRequest(file) {
291
+ let self = this;
292
+ let paginationParams = { offset: file.offset || 0, limit: file.limit }
293
+ let params = Object.assign({}, paginationParams, self.sortParams, self.searchParams)
294
+ let options = {
295
+ url: self.requestUrl,
296
+ method: self.reqMethod
297
+ }
298
+ if (self.reqMethod === 'GET') {
299
+ options = Object.assign({}, options,
300
+ {
301
+ params: params
302
+ }
303
+ )
304
+ } else if (self.reqMethod === 'POST') {
305
+ options = Object.assign({}, options,
306
+ {
307
+ data: params
308
+ }
309
+ )
310
+ }
311
+ return new Promise((resolve, reject) => {
312
+ ajax.request(options).then(function (resp) {
313
+ //这里是为了做IE11兼容
314
+ if (!isJson(resp.data)) {
315
+ resp.data = JSON.parse(resp.data);
316
+ }
317
+ if (self.requestSuccessCodes.includes(resp.data.code)) {
318
+ let resultData = deepCopy(resp.data.data.rows)
319
+ if (self.showSummary && resultData) {
320
+ let sum = self.summaryData(resultData)
321
+ resultData.push(sum)
322
+ }
323
+ self.exportData(resultData, file)
324
+ resolve();
325
+ } else {
326
+ reject(resp.data.data)
327
+ }
328
+ }).catch((e) => {
329
+ reject(e)
330
+ })
331
+ })
332
+ },
333
+ handleRemove(file) {
334
+ const fileList = this.fileList;
335
+ fileList.splice(fileList.indexOf(file), 1);
336
+ },
337
+ summaryData(data) {
338
+ let sums = {};
339
+ if (this.summaryMethod) {
340
+ sums = this.summaryMethod({ columns: this.tableParsedColumns, data: data });
341
+ } else {
342
+ this.cloneColumns.forEach((column, index) => {
343
+ const key = column.key;
344
+ if (index === 0) {
345
+ sums[key] = {
346
+ key: column.key,
347
+ value: '合计'
348
+ };
349
+ return;
350
+ }
351
+ const values = data.map(item => Number(item[column.key]));
352
+ const precisions = [];
353
+ let notNumber = true;
354
+ values.forEach(value => {
355
+ if (!isNaN(value)) {
356
+ notNumber = false;
357
+ let decimal = ('' + value).split('.')[1];
358
+ precisions.push(decimal ? decimal.length : 0);
359
+ }
360
+ });
361
+ const precision = Math.max.apply(null, precisions);
362
+ if (!notNumber) {
363
+ const currentValue = values.reduce((prev, curr) => {
364
+ const value = Number(curr);
365
+ if (!isNaN(value)) {
366
+ return parseFloat((prev + curr).toFixed(Math.min(precision, 20)));
367
+ } else {
368
+ return prev;
369
+ }
370
+ }, 0);
371
+ sums[key] = {
372
+ key: column.key,
373
+ value: currentValue
374
+ };
375
+ } else {
376
+ sums[key] = {
377
+ key: column.key,
378
+ value: ''
379
+ };
380
+ }
381
+ });
382
+ }
383
+ let total = {}
384
+ Object.keys(sums).forEach(item => {
385
+ if (item) {
386
+ total[item] = sums[item].value
387
+ }
388
+ })
389
+ return total;
390
+ },
391
+ exportData(tableDatas, file) {
392
+ let self = this;
393
+ if (tableDatas.length) {
394
+ let titles = excel.title_transform(self.tableColumns)
395
+ let keys = excel.key_transform(self.tableColumns)
396
+ let data = deepCopy(tableDatas)
397
+ const params = {
398
+ title: titles,
399
+ key: keys,
400
+ data: data,
401
+ autoWidth: true,
402
+ filename: file.filename,
403
+ format: file.format,
404
+ }
405
+ excel.export_array_to_excel(params)
406
+ } else {
407
+ self.$Message.info('数据不能为空!')
408
+ }
409
+ },
410
+ }
411
+ };
412
+ </script>
413
+ <style lang="less" scoped>
414
+ .demo-drawer-body {
415
+ height: calc(100% - 53px);
416
+ overflow: auto;
417
+ }
418
+
419
+ .demo-drawer-footer {
420
+ width: 100%;
421
+ position: absolute;
422
+ bottom: 0;
423
+ left: 0;
424
+ border-top: 1px solid #e8e8e8;
425
+ padding: 10px 16px;
426
+ text-align: right;
427
+ background: #fff;
428
+ }
429
+ </style>
@@ -0,0 +1,3 @@
1
+ import LamboPagingTableBi from './index.vue'
2
+ export default LamboPagingTableBi
3
+ export { LamboPagingTableBi }