Browse Source

报表预览横向改纵向

TonyKang 6 years ago
parent
commit
c06fca865f

File diff suppressed because it is too large
+ 11 - 0
config/config.js


+ 3 - 2
web/building_saas/report/html/rpt_print.html

@@ -37,6 +37,7 @@
 <script type="text/javascript" src="/web/building_saas/report/js/jpc_output.js"></script>
 <script type="text/javascript" src="/web/building_saas/report/js/rpt_print.js"></script>
 <SCRIPT type="text/javascript">
+    let G_OFFSET_X = 0, G_OFFSET_Y = 0;
     function loading() {
         if (sessionStorage.multiRptsData) {
             let multiRptData = JSON.parse(sessionStorage.multiRptsData);
@@ -46,7 +47,7 @@
                 if (idx === 0) {
                     $(document).attr("title", pageData[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
                 }
-                let svgArr = rptPrintHelper.buildSvgArr(pageData, -30, -30);
+                let svgArr = rptPrintHelper.buildSvgArr(pageData, G_OFFSET_X, G_OFFSET_Y);
                 //let orientation = (pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][0] < pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1])?"纵向":"横向";
                 let orientation = "纵向";
                 showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, orientation);
@@ -55,7 +56,7 @@
         } else if (sessionStorage.currentPageData) {
             let pageData = JSON.parse(sessionStorage.currentPageData);
             let scaleFactor = parseInt(sessionStorage.scaleFactor);
-            let svgArr = rptPrintHelper.buildSvgArr(pageData, -30, -30);
+            let svgArr = rptPrintHelper.buildSvgArr(pageData, G_OFFSET_X, G_OFFSET_Y);
             $(document).attr("title", pageData[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
             //showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, sessionStorage.orientation);
             showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, "纵向");

+ 14 - 157
web/building_saas/report/js/rpt_print.js

@@ -60,7 +60,7 @@ let rptPrintHelper = {
         let isHtoV = false;
         if (pixelSize[0] > pixelSize[1]) {
             // changeHtoV(pagesData, pixelSize);
-            // isHtoV = true;
+            isHtoV = true;
         }
         for (let idx = 0; idx < pagesData.items.length; idx++) {
             let page = pagesData.items[idx];
@@ -69,7 +69,7 @@ let rptPrintHelper = {
             // let adjustY = 0.5 * ((idx + 1) % 2);
             let adjustY = 0.5;
             for (let cell of page.cells) {
-                svgPageArr.push(buildCellSvg(cell, fonts, styles, controls, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND], offsetX, offsetY, adjustY, canvas, isHtoV));
+                svgPageArr.push(buildCellSvg(cell, fonts, styles, controls, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND], offsetX, offsetY, adjustY, canvas, isHtoV, pixelSize));
             }
             svgPageArr.push("</svg>");
             rst.push(svgPageArr);
@@ -78,36 +78,6 @@ let rptPrintHelper = {
     }
 };
 
-function changeHtoV(pagesData, pixelSize) {
-    //坐标从横向变纵向
-    if (pixelSize[0] > pixelSize[1]) {
-        let tmpP = pixelSize[0];
-        pixelSize[0] = pixelSize[1];
-        pixelSize[1] = tmpP;
-    }
-    let offsetX = pixelSize[0];
-    // let RotAngF = (90 * Math.PI / 180); //这里默认就是90度旋转
-    let sinVal = 1; //sin 90度 = 1 不用算了
-    let cosVal = 0; //cos 90度 = 0 不用算了
-    for (let page of pagesData.items) {
-        for (let cell of page.cells) {
-            rotateCellArea(cell[JV.PROP_AREA], sinVal, cosVal, offsetX);
-        }
-    }
-}
-
-function rotateCellArea(area, sinVal, cosVal, offsetX) {
-    let Nx, Ny;
-    Nx = (area[JV.PROP_LEFT] * cosVal - area[JV.PROP_TOP] * sinVal);
-    Ny = (area[JV.PROP_TOP] * cosVal + area[JV.PROP_LEFT] * sinVal);
-    area[JV.PROP_LEFT] = Nx + offsetX;
-    area[JV.PROP_TOP] = Ny;
-    Nx = (area[JV.PROP_RIGHT] * cosVal - area[JV.PROP_BOTTOM] * sinVal);
-    Ny = (area[JV.PROP_BOTTOM] * cosVal + area[JV.PROP_RIGHT] * sinVal);
-    area[JV.PROP_RIGHT] = Nx + offsetX;
-    area[JV.PROP_BOTTOM] = Ny;
-}
-
 function getActualBorderStyle(cell, styles, mergeBorderStyle, pageBorderArea, borderStr) {
     let rst = styles[cell[JV.PROP_STYLE]][borderStr];
     if (mergeBorderStyle) {
@@ -128,7 +98,7 @@ function getActualBorderStyle(cell, styles, mergeBorderStyle, pageBorderArea, bo
     return rst;
 }
 
-function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas, isHtoV) {
+function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas, isHtoV, pixelSize) {
     let rst = [];
     let style = styles[cell[JV.PROP_STYLE]];
     let mergeBandStyle = null;
@@ -144,163 +114,50 @@ function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBo
         top = parseInt(cell[JV.PROP_AREA][JV.PROP_TOP]) + offsetY + adjustY,
         bottom = parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) + offsetY + adjustY
     ;
+    let HtoVStr = "";
+    if (isHtoV) {
+        HtoVStr = ` transform="translate(`+ pixelSize[1] + `,0) rotate(90)"`;
+    }
     if (style) {
         let leftBS = getActualBorderStyle(cell, styles, mergeBandStyle, (pageMergeBorder)?pageMergeBorder:rptMergeBorder[JV.PROP_AREA], JV.PROP_LEFT);
         // if (style[JV.PROP_LEFT] && parseFloat(style[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]) > 0) {
         if (leftBS && parseFloat(leftBS[JV.PROP_LINE_WEIGHT]) > 0) {
             rst.push("<line x1='" + left + "' y1='" + top +
                 "' x2='" + left + "' y2='" + bottom +
-                "' style='stroke:rgb(0,0,0);stroke-width:" + leftBS[JV.PROP_LINE_WEIGHT] +"'/>")
+                "' style='stroke:rgb(0,0,0);stroke-width:" + leftBS[JV.PROP_LINE_WEIGHT] + "'" + HtoVStr + "/>")
         }
         let rightBS = getActualBorderStyle(cell, styles, mergeBandStyle, (pageMergeBorder)?pageMergeBorder:rptMergeBorder[JV.PROP_AREA], JV.PROP_RIGHT);
         // if (style[JV.PROP_RIGHT] && parseFloat(style[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]) > 0) {
         if (rightBS && parseFloat(rightBS[JV.PROP_LINE_WEIGHT]) > 0) {
             rst.push("<line x1='" + right + "' y1='" + top +
                 "' x2='" + right + "' y2='" + bottom +
-                "' style='stroke:rgb(0,0,0);stroke-width:" + rightBS[JV.PROP_LINE_WEIGHT] +"'/>")
+                "' style='stroke:rgb(0,0,0);stroke-width:" + rightBS[JV.PROP_LINE_WEIGHT] +"'" + HtoVStr + "/>")
         }
         let topBS = getActualBorderStyle(cell, styles, mergeBandStyle, (pageMergeBorder)?pageMergeBorder:rptMergeBorder[JV.PROP_AREA], JV.PROP_TOP);
         // if (style[JV.PROP_TOP] && parseFloat(style[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]) > 0) {
         if (topBS && parseFloat(topBS[JV.PROP_LINE_WEIGHT]) > 0) {
             rst.push("<line x1='" + left + "' y1='" + top +
                 "' x2='" + right + "' y2='" + top +
-                "' style='stroke:rgb(0,0,0);stroke-width:" + topBS[JV.PROP_LINE_WEIGHT] +"'/>")
+                "' style='stroke:rgb(0,0,0);stroke-width:" + topBS[JV.PROP_LINE_WEIGHT] +"'" + HtoVStr + "/>")
         }
         let bottomBS = getActualBorderStyle(cell, styles, mergeBandStyle, (pageMergeBorder)?pageMergeBorder:rptMergeBorder[JV.PROP_AREA], JV.PROP_BOTTOM);
         // if (style[JV.PROP_BOTTOM] && parseFloat(style[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]) > 0) {
         if (bottomBS && parseFloat(bottomBS[JV.PROP_LINE_WEIGHT]) > 0) {
             rst.push("<line x1='" + left + "' y1='" + bottom +
                 "' x2='" + right + "' y2='" + bottom +
-                "' style='stroke:rgb(0,0,0);stroke-width:" + bottomBS[JV.PROP_LINE_WEIGHT] +"'/>")
+                "' style='stroke:rgb(0,0,0);stroke-width:" + bottomBS[JV.PROP_LINE_WEIGHT] +"'" + HtoVStr + "/>")
         }
     }
     let control = cell[JV.PROP_CONTROL];
     if (typeof control === 'string') {
         control = controls[cell[JV.PROP_CONTROL]];
     }
-    buildText(rst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV);
+    buildText(rst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV, HtoVStr);
 
     return rst.join("");
 }
 
-function buildTextHtoV(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV) {
-    let orgFontHeight = parseInt(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]);
-    let fontWeight = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold":"normal";
-    let fontStyle = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"normal";
-    let fontUnderline = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_UNDERLINE]] === 'T')?"underline":"normal";
-    let left = parseInt(cell[JV.PROP_AREA][JV.PROP_LEFT]) + offsetX + 0.5,
-        right = parseInt(cell[JV.PROP_AREA][JV.PROP_RIGHT]) + offsetX + 0.5,
-        top = parseInt(cell[JV.PROP_AREA][JV.PROP_TOP]) + offsetY + adjustY,
-        bottom = parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) + offsetY + adjustY,
-        x = left, y = top,
-        text_anchor = "start"
-    ;
-    let value = cell[JV.PROP_VALUE];
-    if (!(value)) {
-        value = "";
-    }
-    let values = null;
-    if (typeof value === "string") {
-        values = value.split("|");
-    } else {
-        values = [value];
-    }
-    // let stepHeight = (parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) - parseInt(cell[JV.PROP_AREA][JV.PROP_TOP])) / values.length;
-    if (control) {
-        if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "left") {
-            text_anchor = "start";
-            x = left + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
-        } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "right") {
-            text_anchor = "end";
-            x = right - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
-        } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "center") {
-            text_anchor = "middle";
-            x = Math.round((left + right) / 2);
-        }
-    }
-
-    let area = [0,0,0,0];
-    area[JV.IDX_TOP] = top;
-    area[JV.IDX_BOTTOM] = bottom;
-    area[JV.IDX_LEFT] = left;
-    area[JV.IDX_RIGHT] = right;
-    let height = bottom - top;
-    let ctx = canvas.getContext("2d");
-    let inner_draw_text = function (textValue) {
-        let dftFontHeight = orgFontHeight;
-        ctx.font = ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold ":"") + ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"") + dftFontHeight + "px " + font[JV.PROP_NAME];
-        function inner_build_text(innerTxt, innerArea) {
-            let innerDftFontHeight = (dftFontHeight * 3 / 4); //SVG的字体与canvas的字体大小的切换, 不用考虑取整
-            if (control) {
-                if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "top") {
-                    y = innerArea[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP];
-                } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "bottom") {
-                    y = innerArea[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.IDX_BOTTOM];
-                } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "center") {
-                    y = Math.round((innerArea[JV.IDX_TOP] + innerArea[JV.IDX_BOTTOM] + innerDftFontHeight) / 2 );
-                }
-            } else {
-                y = innerArea[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP];
-            }
-            if (font[JV.PROP_NAME] === "宋体") {
-                y--;
-            }
-            destRst.push("<text style='fill:black;font-family:" + font[JV.PROP_NAME] +
-                ";font-weight:" + fontWeight +
-                ";font-style:" + fontStyle +
-                ";text-decoration:" + fontUnderline +
-                // ";text-decoration:normal" +
-                ";font-size:" + innerDftFontHeight + "pt' x='" +
-                x +"' y='" + y + "' text-anchor='" + text_anchor + "' xml:space='preserve'>" + innerTxt + "</text>");
-        }
-        let actLines = private_splitString(textValue, (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]), ctx);
-        if (actLines.length === 1 || (control && control.Shrink !== 'T')) {
-            inner_build_text(textValue, area);
-        } else {
-            while (true) {
-                if (dftFontHeight > 6) {
-                    let lines = Math.floor((area[JV.IDX_BOTTOM] - area[JV.IDX_TOP]) / (dftFontHeight + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.IDX_TOP] + 4));
-                    lines = (lines === 0)?1:lines;
-                    actLines = private_splitString(textValue, (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.IDX_RIGHT]), ctx);
-                    if (lines >= actLines.length) {
-                        let aH = dftFontHeight + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.IDX_TOP] + 4;
-                        if ((aH * actLines.length) < (area[JV.IDX_BOTTOM] - area[JV.IDX_TOP]) && (control && control.Vertical !== 'top')) {
-                            if (control.Vertical === 'bottom') {
-                                area[JV.IDX_TOP] = area[JV.IDX_BOTTOM] - (aH * actLines.length);
-                            } else {
-                                area[JV.IDX_TOP] = (area[JV.IDX_TOP] + area[JV.IDX_BOTTOM]) / 2 - (aH * actLines.length) / 2
-                                area[JV.IDX_BOTTOM] = area[JV.IDX_TOP] + (aH * actLines.length);
-                            }
-                        }
-                        let newArea = [], baseTop = area[JV.IDX_TOP];
-                        for (let ai = 0; ai < area.length; ai++) {
-                            newArea[ai] = area[ai];
-                        }
-                        for (let lIdx = 0; lIdx < actLines.length; lIdx++) {
-                            newArea[JV.IDX_TOP] = Math.round(aH * lIdx + baseTop);
-                            newArea[JV.IDX_BOTTOM] = Math.round(aH * (lIdx + 1) + baseTop);
-                            inner_build_text(actLines[lIdx], newArea);
-                        }
-                        break;
-                    } else {
-                        dftFontHeight--;
-                        ctx.font = ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold ":"") + ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"") + dftFontHeight + "px " + font[JV.PROP_NAME];
-                    }
-                } else {
-                    inner_build_text(textValue, area);
-                    break;
-                }
-            }
-        }
-    };
-    for (let vidx = 0; vidx < values.length; vidx++) {
-        area[JV.IDX_TOP] = top + vidx * (height / values.length);
-        area[JV.IDX_BOTTOM] = top + (vidx + 1) * (height / values.length);
-        inner_draw_text(values[vidx]);
-    }
-}
-
-function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV) {
+function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV, HtoVStr) {
     let orgFontHeight = parseInt(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]);
     let fontWeight = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold":"normal";
     let fontStyle = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"normal";
@@ -368,7 +225,7 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
                 ";text-decoration:" + fontUnderline +
                 // ";text-decoration:normal" +
                 ";font-size:" + innerDftFontHeight + "pt' x='" +
-                x +"' y='" + y + "' text-anchor='" + text_anchor + "' xml:space='preserve'>" + innerTxt + "</text>");
+                x +"' y='" + y + "' text-anchor='" + text_anchor + "' xml:space='preserve'" + HtoVStr + ">" + innerTxt + "</text>");
         }
         let actLines = private_splitString(textValue, (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]), ctx);
         if (actLines.length === 1 || (control && control.Shrink !== 'T')) {