TonyKang 6 lat temu
rodzic
commit
251181f23e

+ 4 - 4
test/unit/reports/test_rpt_test_template.js

@@ -104,10 +104,10 @@ test('测试 - 测试模板啦: ', function (t) {
                     let customizeCfg = {"fillZero": true};
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
                     if (pageRst) {
-                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
-                        rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
-                            console.log("excel uuid: " + uuidName);
-                        });
+                        fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
+                        // rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
+                        //     console.log("excel uuid: " + uuidName);
+                        // });
                         // rpt_pdf_util.export_pdf_file(pageRst, pagesize, 'local_test_rpt_pdf', function(uuidName){
                         //     console.log("pdf uuid: " + uuidName);
                         // });

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

@@ -47,7 +47,8 @@
                     $(document).attr("title", pageData[JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
                 }
                 let svgArr = rptPrintHelper.buildSvgArr(pageData, -30, -30);
-                let orientation = (pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][0] < pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1])?"纵向":"横向";
+                //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);
             }
             window.print();
@@ -56,12 +57,14 @@
             let scaleFactor = parseInt(sessionStorage.scaleFactor);
             let svgArr = rptPrintHelper.buildSvgArr(pageData, -30, -30);
             $(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, sessionStorage.orientation);
+            showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, "纵向");
             window.print();
         } else if (sessionStorage.currentPageSvgData) {
             let svgArr = JSON.parse(sessionStorage.currentPageSvgData);
             let scaleFactor = 1;
-            showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, sessionStorage.orientation);
+            //showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, sessionStorage.orientation);
+            showPreviewData(svgArr, scaleFactor, sessionStorage.pageSize, "纵向");
             window.print();
         } else {
             //alert("没有报表数据!");

+ 159 - 6
web/building_saas/report/js/rpt_print.js

@@ -56,14 +56,20 @@ let rptPrintHelper = {
         ;
         let rst = [];
         let canvas = document.getElementById("chkCanvas");
+        let pixelSize = getPixelSize(pagesData);
+        let isHtoV = false;
+        if (pixelSize[0] > pixelSize[1]) {
+            // changeHtoV(pagesData, pixelSize);
+            // isHtoV = true;
+        }
         for (let idx = 0; idx < pagesData.items.length; idx++) {
             let page = pagesData.items[idx];
-            let svgPageArr = [], pixelSize = getPixelSize(pagesData);
+            let svgPageArr = [];
             svgPageArr.push("<svg width='" + pixelSize[0] + "' height='" + pixelSize[1] + "'>");
             // 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));
+                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("</svg>");
             rst.push(svgPageArr);
@@ -72,6 +78,36 @@ 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) {
@@ -92,7 +128,7 @@ function getActualBorderStyle(cell, styles, mergeBorderStyle, pageBorderArea, bo
     return rst;
 }
 
-function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas) {
+function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas, isHtoV) {
     let rst = [];
     let style = styles[cell[JV.PROP_STYLE]];
     let mergeBandStyle = null;
@@ -142,12 +178,129 @@ function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBo
     if (typeof control === 'string') {
         control = controls[cell[JV.PROP_CONTROL]];
     }
-    buildText(rst, cell, font, control, offsetX, offsetY, adjustY, canvas);
+    buildText(rst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV);
 
     return rst.join("");
 }
 
-function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas) {
+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) {
     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";
@@ -169,7 +322,7 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
     } else {
         values = [value];
     }
-    let stepHeight = (parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) - parseInt(cell[JV.PROP_AREA][JV.PROP_TOP])) / values.length;
+    // 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";