Browse Source

报表合计栏

zhuth 7 years ago
parent
commit
770895786c

+ 48 - 8
frontend/saas-web/app/view/core/report/ReportPanel.js

@@ -138,7 +138,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     enableGroupingMenu: false,
                     collapsible: false
                 }, {
-                    ftype: 'summary',
+                    ftype: 'mysummary',
                     dock: 'bottom'
                 }],
                 store: store,
@@ -186,13 +186,34 @@ Ext.define('saas.view.core.report.ReportPanel', {
             proxy: {
                 type: 'ajax',
                 url: me.listUrl,
+                // url: 'http://192.168.253.58:8560/api/sale/report/saleDetail',
                 timeout: 8000,
                 actionMethods: {
                     read: 'GET'
                 },
                 reader: {
                     type: 'json',
-                    rootProperty: 'data.list',
+                    // rootProperty: 'data.list',
+                    rootProperty: function(data) {
+                        var grid = me.items.items[1],
+                        columns = grid.columns,
+                        summaryData = data.data.calculate || [];
+
+                        Ext.Array.each(columns, function(c) {
+                            var type = c.summaryType,
+                            name = c.dataIndex;
+
+                            var d = Ext.Array.findBy(summaryData, function(s) {
+                                return s.hasOwnProperty(name);
+                            })
+                            if(type && d) {
+                                c.summaryValue = Ext.util.Format.number(d[name], c.format || '0.00');
+                            }else {
+                                c.summaryValue = 0;
+                            }
+                        });
+                        return data.data.list.list;
+                    },
                     totalProperty: 'data.total',
                 },
                 listeners: {
@@ -202,16 +223,24 @@ Ext.define('saas.view.core.report.ReportPanel', {
                                 saas.util.BaseUtil.showErrorToast('请求超时');
                             }
                         }else {
-                            console.error('exception: ', response.responseJson);
-                            saas.util.BaseUtil.showErrorToast('请求错误:' + response.responseJson);
+                            if(response.timedout) {
+                                saas.util.BaseUtil.showErrorToast('请求超时');
+                            }else{
+                                saas.util.BaseUtil.showErrorToast('查询失败:' + response.responseJson.message);
+                            }
                         }
                     }
                 }
             },
             listeners: {
+                load: function() {
+                    var grid = me.items.items[1];
+                    grid.fireEvent('mysummarychange', grid);
+                },
                 beforeload: function (store, op) {
-                    condition = me.getConditions(),
-                    defaultCondition = me.defaultCondition;
+                    var condition = me.getConditions(),
+                    defaultCondition = me.defaultCondition,
+                    summarys = me.summarys;
     
                     if(defaultCondition) {
                         condition.push({
@@ -223,7 +252,8 @@ Ext.define('saas.view.core.report.ReportPanel', {
                         number: store.exportNumber?store.exportNumber:op._page,
                         size: store.exportPageSize?store.exportPageSize:store.pageSize,
                         mode: 'DETAIL',
-                        condition: JSON.stringify(condition)
+                        condition: JSON.stringify(condition),
+                        calculateFields: JSON.stringify(summarys)
                     });
     
                 }
@@ -250,7 +280,8 @@ Ext.define('saas.view.core.report.ReportPanel', {
 
     initColumns: function() {
         var me = this,
-        columns = me.reportColumns;
+        columns = me.reportColumns,
+        summarys = [];
 
         Ext.Array.each(columns, function(c) {
             c.columns || Ext.applyIf(c, {
@@ -279,8 +310,17 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     }
                 });
             }
+
+            if(c.summaryType) {
+                summarys.push({
+                    field: c.dataIndex,
+                    operation: c.summaryType,
+                });
+            }
         })
 
+        me.summarys = summarys;
+
         return columns;
     },
 

+ 180 - 0
frontend/saas-web/ext/packages/ux/src/feature/MySummary.js

@@ -0,0 +1,180 @@
+Ext.define('Ext.ux.feature.MySummary', {
+
+    /* Begin Definitions */
+
+    extend: 'Ext.grid.feature.AbstractSummary',
+
+    alias: 'feature.mysummary',
+
+    /**
+     * @cfg {String} dock
+     * Configure `'top'` or `'bottom'` top create a fixed summary row either above or below the scrollable table.
+     *
+     */
+    dock: undefined,
+
+    summaryItemCls: Ext.baseCSSPrefix + 'grid-row-mysummary-item',
+    dockedSummaryCls: Ext.baseCSSPrefix + 'docked-mysummary',
+
+    summaryRowCls: Ext.baseCSSPrefix + 'grid-row-summary ' + Ext.baseCSSPrefix + 'grid-row-total',
+    summaryRowSelector: '.' + Ext.baseCSSPrefix + 'grid-row-summary.' + Ext.baseCSSPrefix + 'grid-row-total',
+
+    // turn off feature events.
+    hasFeatureEvent: false,
+
+    init: function(grid) {
+        var me = this,
+            view = me.view,
+            dock = me.dock,
+            summarys = me.getSummarys(grid);
+
+        me.callParent([grid]);
+
+        // var mySummaryStore = grid.mySummaryStore = Ext.create('Ext.data.Store', {
+        //     fields: ['name', 'label', 'typeLabel', 'type', 'value'],
+        //     data: [{
+        //         name: 'xxx',
+        //         label: '111',
+        //         type: 'sum',
+        //         value: 0
+        //     }]
+        // });
+
+        grid.on({
+            mysummarychange: me.refreshData,
+            scope: me
+        });
+
+        grid.on({
+            beforerender: function() {
+                var tableCls = [me.summaryTableCls];
+                if (view.columnLines) {
+                    tableCls[tableCls.length] = view.ownerCt.colLinesCls;
+                }
+                me.summaryBar = grid.addDocked({
+                    childEls: ['innerCt', 'item'],
+                    renderTpl: [
+                        '<div id="{id}-innerCt" data-ref="innerCt" role="presentation">',
+                            '{%this.renderContent(out,values)%}',
+                        '</div>'
+                    ],
+                    tpl: [
+                        '<table class="x-grid-row-mysummary">',
+                            '<tbody>',
+                                '<tr>',
+                                    '<tpl for=".">',
+                                    '<td class="x-grid-cell x-grid-td x-grid-cell-numbercolumn-1526 x-unselectable x-mysummary-item">' +
+                                        '<div class="x-grid-cell-inner x-mysummary-item-cell">{label}({typeLabel}): {value}</div>' +
+                                    '</td>',
+                                    '</tpl>',
+                                '</tr>',
+                            '</tbody>',
+                        '</table>',
+                    ],
+                    data: summarys,
+                    scrollable: {
+                        x: false,
+                        y: false
+                    },
+                    hidden: !me.showSummaryRow,
+                    itemId: 'mysummaryBar',
+                    cls: [ me.dockedSummaryCls, me.dockedSummaryCls + '-' + dock ],
+                    xtype: 'component',
+                    dock: dock,
+                    weight: 10000000
+                })[0];
+            },
+            single: true
+        });
+    },
+
+    getSummarys: function(grid) {
+        var me = this,
+        summarys = [],
+        columns = grid.columns;
+
+        var typeLabels = {
+            sum: '合计',
+            count: '计数',
+            avg: '平均值',
+            max: '最大值',
+            min: '最小值'
+        };
+
+        Ext.Array.each(columns, function(c) {
+            if(c.summaryType) {
+                summarys.push({
+                    name: c.dataIndex,
+                    label: c.text,
+                    type: c.summaryType,
+                    typeLabel: typeLabels[c.summaryType],
+                    value: c.summaryValue || 0
+                });
+            } 
+        });
+
+        grid.summarys = summarys;
+
+        return summarys;
+    },
+
+    refreshData: function(grid) {
+        var me = this,
+        summaryBar = me.summaryBar,
+        newSummarys = me.getSummarys(grid);
+
+        summaryBar.update(newSummarys);
+ 
+        // if (!view.rendered) {
+        //     return;
+        // }
+ 
+        // record = me.createSummaryRecord(view);
+        // newRowDom = Ext.fly(view.createRowElement(record, -1)).down(selector, true);
+ 
+        // if (!newRowDom) {
+        //     return;
+        // }
+ 
+        // // Summary row is inside the docked summaryBar Component 
+        // if (dock) {
+        //     p = me.summaryBar.item.dom.firstChild;
+        //     oldRowDom = p.firstChild;
+            
+        //     p.insertBefore(newRowDom, oldRowDom);
+        //     p.removeChild(oldRowDom);
+        // }
+        // // Summary row is a regular row in a THEAD inside the View. 
+        // // Downlinked through the summary record's ID 
+        // else {
+        //     oldRowDom = view.el.down(selector, true);
+        //     p = oldRowDom && oldRowDom.parentNode;
+            
+        //     if (p) {
+        //         p.removeChild(oldRowDom);
+        //     }
+            
+        //     // We're always inserting the new summary row into the last rendered row, 
+        //     // unless no rows exist. In that case we will be appending to the special 
+        //     // placeholder in the node container. 
+        //     p = view.getRow(view.all.last());
+            
+        //     if (p) {
+        //         p = p.parentElement;
+        //     }
+        //     // View might not have nodeContainer yet. 
+        //     else {
+        //         p = me.getSummaryRowPlaceholder(view);
+        //         p = p && p.tBodies && p.tBodies[0];
+        //     }
+            
+        //     if (p) {
+        //         p.appendChild(newRowDom);
+        //     }
+        // }
+    },
+
+    getSummaryBar: function() {
+        return this.summaryBar;
+    },
+});

+ 13 - 0
frontend/saas-web/ext/packages/ux/src/feature/MySummary.scss

@@ -0,0 +1,13 @@
+.x-docked-mysummary {
+    border-color: #d0d0d0;
+    border-style: solid;
+    background: #fff!important;
+
+    .x-grid-row-mysummary {
+        height: 32px;
+        
+        .x-mysummary-item {
+            min-width: 100px;
+        }
+    }
+}