浏览代码

code sync from back end

TonyKang 7 年之前
父节点
当前提交
8d7cd67537
共有 3 个文件被更改,包括 144 次插入112 次删除
  1. 14 8
      modules/reports/routes/report_router.js
  2. 18 9
      modules/reports/routes/rpt_tpl_router.js
  3. 112 95
      modules/reports/util/rpt_excel_util.js

+ 14 - 8
modules/reports/routes/report_router.js

@@ -3,15 +3,21 @@
  */
 
 let express = require('express');
+let rptRouter = express.Router();
+let reportController = require('./../controllers/rpt_controller');
 
-module.exports = function (app) {
-    let rptRouter = express.Router();
-    let reportController = require('./../controllers/rpt_controller');
-
+module.exports =function (app) {
+    app.get('/report',  function(req, res) {
+        if (!req.session.managerData.username) {
+            res.redirect('/login');
+        }
+        else {
+            res.render('maintain/report/rpt_test.html',
+                {userAccount: req.session.userAccount,
+                    userID: req.session.managerData.userID});
+        }
+    });
     rptRouter.post('/getReport', reportController.getReportAllPages);
     rptRouter.get('/getExcel/:id/:size/:rptName/:isOneSheet', reportController.getExcel);
-
     app.use("/report_api", rptRouter);
-};
-
-
+}

+ 18 - 9
modules/reports/routes/rpt_tpl_router.js

@@ -1,9 +1,19 @@
 let express = require("express");
-module.exports = function (app) {
-    let rptTplRouter = express.Router();
-    let reportTplController = require('./../controllers/rpt_tpl_controller');
+let rptTplRouter = express.Router();
+let reportTplController = require('./../controllers/rpt_tpl_controller');
+let reportCfgController = require('./../controllers/rpt_cfg_controller');
 
-//let reportCfgController = require('./../controllers/rpt_controller');
+module.exports = function (app) {
+    app.get('/rpt_tpl',  function(req, res) {
+        if (!req.session.managerData.username) {
+            res.redirect('/login');
+        }
+        else {
+            res.render('maintain/report/rpt_tpl_main.html',
+                {userAccount: req.session.managerData.username,
+                    userID: req.session.managerData.userID});
+        }
+    });
 
     rptTplRouter.post('/createTplTreeNode', reportTplController.createTplTreeNode);
     rptTplRouter.post('/getRptTplTree', reportTplController.getRptTplTree);
@@ -13,8 +23,7 @@ module.exports = function (app) {
     rptTplRouter.post('/getRefRptTpl', reportTplController.getRefRptTpl);
     rptTplRouter.post('/updateRptTpl', reportTplController.updateRptTpl);
 
-//rptTplRouter.post('/getUserRptCfg', reportCfgController.getReportUserCfg);
-//rptTplRouter.post('/getMappingFields', reportCfgController.getAllMappingFields);
-};
-
-
+    rptTplRouter.post('/getUserRptCfg', reportCfgController.getReportUserCfg);
+    rptTplRouter.post('/getMappingFields', reportCfgController.getAllMappingFields);
+    app.use("/report_tpl_api", rptTplRouter);
+}

+ 112 - 95
modules/reports/util/rpt_excel_util.js

@@ -79,7 +79,7 @@ function writeApp(sheets, isSinglePage) {
 }
 function writeCore() {
     let rst = [];
-    p_fillZero = function(val){
+    let p_fillZero = function(val){
         let rst = val;
         if (val < 10) {
             rst = '0' + val;
@@ -168,7 +168,7 @@ function writeStyles(stylesObj){
     rst.push('<fills count="2"><fill><patternFill patternType="none" /></fill><fill><patternFill patternType="gray125" /></fill></fills>');
     //3. push borders
     rst.push('<borders count="' + stylesObj.borders.length + '">')
-    private_setBorder = function(border, borderDirection) {
+    let private_setBorder = function(border, borderDirection) {
         if (border[borderDirection][JV.PROP_LINE_WEIGHT] == 0) {
             rst.push('<' + borderDirection.toLowerCase() + '/>');
         } else {
@@ -234,7 +234,7 @@ function writeSharedString(sharedStrList){
 }
 function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage){
     let rst = [];
-    private_pushDftFont = function(){
+    let private_pushDftFont = function(){
         let font = {};
         if (!(stylesObj.fonts)) {
             stylesObj.fonts = [];
@@ -245,7 +245,33 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
         font.colorIdx = "8";
         stylesObj.fonts.push(font);
     };
+    let private_buildFirstDftStyle = function () {
+        stylesObj.cellXfs = [];
+        stylesObj.borders = [];
+        let fontId = 0;
+        let borderId = 0;
+        let border = {};
+        border[JV.PROP_LEFT] = {};
+        border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = 0;
+        border[JV.PROP_RIGHT] = {};
+        border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT] = 0;
+        border[JV.PROP_TOP] = {};
+        border[JV.PROP_TOP][JV.PROP_LINE_WEIGHT] = 0;
+        border[JV.PROP_BOTTOM] = {};
+        border[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = 0;
+        stylesObj.borders.push(border);
+
+        let cellControl = pageData[JV.NODE_CONTROL_COLLECTION].Default;
+        let sheetControl = {};
+        sheetControl.fontId = fontId;
+        sheetControl.borderId = borderId;
+        for (let i = 0; i < JV.CONTROL_PROPS.length; i++) {
+            sheetControl[JV.CONTROL_PROPS[i]] = cellControl[JV.CONTROL_PROPS[i]];
+        }
+        stylesObj.cellXfs.push(sheetControl);
+    }
     private_pushDftFont();
+    private_buildFirstDftStyle();
     if (isSinglePage) {
         rst.push(writeSheet(pageData, null, paperSize, sharedStrList, stylesObj));
     } else {
@@ -258,9 +284,9 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
 function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
     let rst = [], xPos = [], yPos = [], yMultiPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     let cacheBorderCell = {};
-    private_pre_analyze_pos = function(){
+    let private_pre_analyze_pos = function(){
         let cell, pos;
-        self_analyze_sheet_pos = function (theShtData, theXPos, theYPos) {
+        let self_analyze_sheet_pos = function (theShtData, theXPos, theYPos) {
             theShtData.cells.sort(function(cell1, cell2) {
                 let rst = 0;
                 if (cell1[JV.PROP_AREA][JV.PROP_TOP] > cell2[JV.PROP_AREA][JV.PROP_TOP]) {
@@ -308,13 +334,13 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
             yPos = yMultiPos[0];
         }
     };
-    private_array_sort = function(i1, i2){
+    let private_array_sort = function(i1, i2){
         let rst = 0;
         if (i1 > i2) {rst = 1} else
         if (i1 < i2) rst = -1;
         return rst;
     };
-    private_getCellIdxStr = function(idx){
+    let private_getCellIdxStr = function(idx){
         let rst = 'A';
         if (idx < 26) {
             rst = headerStr[idx];
@@ -327,7 +353,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_getSharedStrIdx = function(val) {
+    let private_getSharedStrIdx = function(val) {
         let rst = sharedStrList.indexOf(val);
         if (rst < 0) {
             sharedStrList.push(val);
@@ -335,7 +361,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_getFontId = function(cell) {
+    let private_getFontId = function(cell) {
         let rst = 0, hasFont = false;
         if (!(stylesObj.fonts)) {
             stylesObj.fonts = [];
@@ -366,7 +392,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_checkBorder = function(cell, border, sheetBorder) {
+    let private_checkBorder = function(cell, border, sheetBorder) {
         let rst = true, borderLineWidths = [], sheetBorderLineWidths = [];
         borderLineWidths.push(border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]);
         borderLineWidths.push(border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]);
@@ -400,7 +426,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_chkAndGetMergeLine = function(cell, sheetBorder, borderStr) {
+    let private_chkAndGetMergeLine = function(cell, sheetBorder, borderStr) {
         let rst = sheetBorder[borderStr][JV.PROP_LINE_WEIGHT], mergeBorder = pageData[JV.BAND_PROP_MERGE_BAND];
         if (cell[JV.PROP_AREA][borderStr] == mergeBorder[borderStr]) {
             let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
@@ -408,7 +434,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return parseInt(rst);
     };
-    private_getIniBorder = function() {
+    let private_getIniBorder = function() {
         let rst = {};
         rst[JV.PROP_LEFT] = {};
         rst[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = 0;
@@ -420,7 +446,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         rst[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = 0;
         return rst;
     };
-    private_getBorderId = function(cell) {
+    let private_getBorderId = function(cell) {
         let rst = 0, hasBorder = false;
         if (!(stylesObj.borders)) {
             stylesObj.borders = [];
@@ -453,7 +479,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_checkControl = function(cellControl, sheetControl) {
+    let private_checkControl = function(cellControl, sheetControl) {
         let rst = true;
         for (let i = 0; i < JV.CONTROL_PROPS.length; i++) {
             if (cellControl[JV.CONTROL_PROPS[i]] != sheetControl[JV.CONTROL_PROPS[i]]) {
@@ -463,7 +489,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_getStyleId = function(cell) {
+    let private_getStyleId = function(cell) {
         let rst = 1, hasStyle = false;
         if (!(stylesObj.cellXfs)) stylesObj.cellXfs = [];
         let fontId = private_getFontId(cell);
@@ -491,7 +517,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_setCols = function(){
+    let private_setCols = function(){
         //remark: 1 excel width = 2.117 mm
         rst.push('<cols>');
         let w = 0;
@@ -502,11 +528,11 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         rst.push('</cols>');
     };
-    private_setMergedCells = function() {
+    let private_setMergedCells = function() {
         let cell, idxR, idxL, idxT, idxB, cnt = 0;
         rst.push('<mergeCells count="?">');
         let startIdx = rst.length - 1;
-        self_setMergedCells = function (theData, theYPos, offsetY) {
+        let self_setMergedCells = function (theData, theYPos, offsetY) {
             for (let i = 0; i < theData.cells.length; i++) {
                 cell = theData.cells[i];
                 idxR = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_RIGHT]);
@@ -527,13 +553,13 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
                 let shtItemData = pageData.items[i];
                 let tmpPos = yMultiPos[i];
                 self_setMergedCells(shtItemData, tmpPos, osY);
-                osY += tmpPos.length;
+                osY += tmpPos.length - 2;
             }
         }
         rst[startIdx] = '<mergeCells count="' + cnt + '">';
         rst.push('</mergeCells>');
     };
-    private_chkIfNeedCacheCell = function(cell){
+    let private_chkIfNeedCacheCell = function(cell){
         let rst = false;
         if (cell[JV.PROP_AREA][JV.PROP_LEFT] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_LEFT] ||
             cell[JV.PROP_AREA][JV.PROP_RIGHT] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT] ||
@@ -548,9 +574,9 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
         }
         return rst;
     };
-    private_cacheMergeBandBorderIdxs = function() {
+    let private_cacheMergeBandBorderIdxs = function() {
         let cell, idxR, idxL, idxT, idxB;
-        self_cachMergeIdxs = function (theData, theYPos, offsetY) {
+        let self_cachMergeIdxs = function (theData, theYPos, offsetY) {
             for (let i = 0; i < theData.cells.length; i++) {
                 cell = theData.cells[i];
                 idxR = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_RIGHT]);
@@ -576,91 +602,84 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
                 let shtItemData = pageData.items[i];
                 let tmpPos = yMultiPos[i];
                 self_cachMergeIdxs(shtItemData, tmpPos, osY);
-                osY += tmpPos.length;
+                osY += tmpPos.length - 2;
             }
         }
     };
-    private_getMergedCellStyleId = function(preStyleId, colIdxStr) {
-        let rst = preStyleId;
-        if (cacheBorderCell[colIdxStr]) {
-            rst = private_getStyleId(cacheBorderCell[colIdxStr]);
-        }
-        return rst;
-    };
-    private_setSheetData = function(){
+    let private_setSheetData = function(){
         //remark: 1 excel height = 0.3612 mm
         rst.push('<sheetData>');
-        let spanX = xPos.length - 2, cellIdx = 0, h = 0,
-            hasMoreCols = true, nextColIdx = -1,
-            nextRowIdx = 0
+        let spanX = xPos.length - 2, cellIdx = 0, h = 0
             ;
-        self_setData = function (theShtData, theYPos, offsetY) {
+        let self_setDataEx = function (theShtData, theYPos, offsetY) {
+            let rows = [];
+            //1. build full set of blank rows/cells
             for (let i = 1; i < theYPos.length - 1; i++) {
+                let rowObj = {};
                 h = (theYPos[i+1] - theYPos[i]) / DPI * 25.4 / 0.3612;
                 h = Math.round(h * 1000) / 1000;
-                rst.push('<row r="' + (i + offsetY) + '" spans="1:' + spanX + '" ht="' + h + '" customHeight="1">');
-                let colIdxStr = '';
-                hasMoreCols = true;
-                while (nextRowIdx < i) {
-                    if (cellIdx >= theShtData.cells.length || nextRowIdx > i) {
-                        break;
-                    } else {
-                        cellIdx++;
-                        nextRowIdx = theYPos.indexOf(theShtData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
-                    }
+                rowObj.height = h;
+                rowObj.r = i + offsetY;
+                rowObj.items = [];
+                rows.push(rowObj);
+                for (let j = 1; j < xPos.length - 1; j++) {
+                    let colIdxStr = private_getCellIdxStr(j - 1);
+                    let cellObj = {};
+                    cellObj.r = colIdxStr + (i + offsetY);
+                    cellObj.s = 0;
+                    cellObj.isBlank = true;
+                    rows[i - 1].items.push(cellObj);
                 }
-                if (nextRowIdx > i) {
-                    hasMoreCols = false;
+            }
+            //2. then fill up the cell style-ids and values
+            let rowIdx1 = 0, colIdx1 = 0, rowIdx2 = 0, colIdx2 = 0, colIdxStr = '';
+            for (let cIdx = 0; cIdx < theShtData.cells.length; cIdx++) {
+                let styleIdx = private_getStyleId(theShtData.cells[cIdx]);
+                //colIdxStr = private_getCellIdxStr(j - 1);
+                rowIdx1 = theYPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_TOP]);
+                colIdx1 = xPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_LEFT]);
+                let cellObj = rows[rowIdx1 - 1].items[colIdx1 - 1];
+                cellObj.s = styleIdx;
+                cellObj.isBlank = false;
+                if (!(strUtil.isEmptyString(theShtData.cells[cIdx][JV.PROP_VALUE]))) {
+                    let valIdx = private_getSharedStrIdx(theShtData.cells[cIdx][JV.PROP_VALUE]);
+                    cellObj.v = valIdx;
                 }
-                nextColIdx = xPos.indexOf(theShtData.cells[cellIdx][JV.PROP_AREA][JV.PROP_LEFT]);
-                let preStyleIdx = 1;
-                for (let j = 1; j < xPos.length - 1; j++) {
-                    colIdxStr = private_getCellIdxStr(j - 1);
-                    if (hasMoreCols) {
-                        if (nextColIdx == j) {
-                            let styleIdx = private_getStyleId(theShtData.cells[cellIdx]);
-                            preStyleIdx = styleIdx;
-                            if (strUtil.isEmptyString(theShtData.cells[cellIdx][JV.PROP_VALUE])) {
-                                rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + styleIdx + '"/>');
-                                //should setup the right style instead!
-                            } else {
-                                let valIdx = private_getSharedStrIdx(theShtData.cells[cellIdx][JV.PROP_VALUE]);
-                                rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + styleIdx + '" t="s">');
-                                rst.push('<v>' + valIdx + '</v>');
-                                rst.push('</c>');
-                            }
-                            cellIdx++;
-                            if (cellIdx < theShtData.cells.length) {
-                                nextRowIdx = theYPos.indexOf(theShtData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
-                                if (nextRowIdx > i) {
-                                    hasMoreCols = false;
-                                } else {
-                                    nextColIdx = xPos.indexOf(theShtData.cells[cellIdx][JV.PROP_AREA][JV.PROP_LEFT]);
-                                }
-                            } else {
-                                hasMoreCols = false;
-                            }
-                        } else if (nextColIdx < 0) {
-                            //impossible!
-                            console.log('has abnormal case!');
-                            hasMoreCols = false;
-                        } else {
-                            //rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + preStyleIdx + '"/>');
-                            rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + private_getMergedCellStyleId(preStyleIdx, colIdxStr + i + offsetY) + '"/>');
+                rowIdx2 = theYPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_BOTTOM]);
+                colIdx2 = xPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_RIGHT]);
+                if ((rowIdx2 - rowIdx1 > 1) || (colIdx2 - colIdx1 > 1)) {
+                    for (let i = 0; i < rowIdx2 - rowIdx1; i++) {
+                        for (let j = 0; j < colIdx2 - colIdx1; j++) {
+                            if (i === 0 && j === 0) continue;
+                            cellObj = rows[rowIdx1 - 1 + i].items[colIdx1 - 1 + j];
+                            cellObj.s = styleIdx;
+                            cellObj.isBlank = true;
                         }
+                    }
+                }
+            }
+            //3. then fill up rst
+            for (let i = 0; i < rows.length; i++) {
+                rst.push('<row r="' + (i + 1 + offsetY) + '" spans="1:' + spanX + '" ht="' + rows[i].height + '" customHeight="1">');
+                for (let j = 0; j < rows[i].items.length; j++) {
+                    let cellObj = rows[i].items[j];
+                    if (cellObj.v === undefined) {
+                        rst.push('<c r="' + cellObj.r + '" s="' + cellObj.s + '"/>');
                     } else {
-                        //rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + preStyleIdx + '"/>');
-                        rst.push('<c r="' + colIdxStr + (i + offsetY) + '" s="' + private_getMergedCellStyleId(preStyleIdx, colIdxStr + i + offsetY) + '"/>');
+                        rst.push('<c r="' + cellObj.r + '" s="' + cellObj.s + '" t="s">');
+                        rst.push('<v>' + cellObj.v + '</v>');
+                        rst.push('</c>');
                     }
                 }
                 rst.push('</row>');
             }
-        }
+            //4. maybe need to dispose the memory
+            //...
+        };
         private_cacheMergeBandBorderIdxs();
         if (sheetData) {
             //current sheet data
-            nextRowIdx = yPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
-            self_setData(sheetData, yPos, 0);
+            self_setDataEx(sheetData, yPos, 0);
         } else {
             //total data in one sheet
             let cnt = 0;
@@ -668,9 +687,8 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
                 let shtItemData = pageData.items[i];
                 let tmpPos = yMultiPos[i];
                 cellIdx = 0;
-                nextRowIdx = tmpPos.indexOf(shtItemData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
-                self_setData(shtItemData, tmpPos, cnt);
-                cnt += tmpPos.length;
+                self_setDataEx(shtItemData, tmpPos, cnt);
+                cnt += tmpPos.length - 2;
             }
         }
         rst.push('</sheetData>');
@@ -712,12 +730,11 @@ module.exports = {
         let isSinglePage = rptOptions.singlePage;
         let sheets = [];
         if (isSinglePage) {
-            //
+            sheets.push({sheetName: '全部页'});
         } else {
-            //
-        }
-        for (let i = 0; i < pageData.items.length; i++) {
-            sheets.push({sheetName: '第' + (i + 1) + '页'});
+            for (let i = 0; i < pageData.items.length; i++) {
+                sheets.push({sheetName: '第' + (i + 1) + '页'});
+            }
         }
         //1.
         let file = '[Content_Types].xml';