Przeglądaj źródła

bug 1954 code sync

TonyKang 6 lat temu
rodzic
commit
42ecd73d5f

+ 32 - 0
modules/reports/rpt_component/jpc_event.js

@@ -0,0 +1,32 @@
+/**
+ * Created by Tony on 2019/5/17.
+ */
+let JV = require('./jpc_value_define');
+let JpcEvent = {
+    createNew: function (rptTpl) {
+        let rst = {};
+        if (rptTpl[JV.NODE_EVENTS]) {
+            for (let i = 0; i < rptTpl[JV.NODE_EVENTS].length; i++) {
+                let item = {};
+                let propArr = Object.getOwnPropertyNames(rptTpl[JV.NODE_EVENTS][i]);
+                for (let key of propArr) {
+                    item[key] = rptTpl[JV.NODE_EVENTS][i][key];
+                }
+                switch (JV.EVENT_TYPE.indexOf(item.type)) {
+                    case JV.EVENT_IDX_GRP_ON_CREATE:
+                        rst[JV.EVENT_TYPE[JV.EVENT_IDX_GRP_ON_CREATE]] = item;
+                        break;
+                    case JV.EVENT_IDX_FLOW_CONTENT_ON_CREATE:
+                        rst[JV.EVENT_TYPE[JV.EVENT_IDX_FLOW_CONTENT_ON_CREATE]] = item;
+                        break;
+                    default :
+                        break;
+                }
+                //rst.push(item);
+            }
+        }
+        return rst;
+    }
+};
+
+module.exports = JpcEvent;

+ 2 - 0
modules/reports/rpt_component/jpc_ex.js

@@ -6,6 +6,7 @@ let JpcCrossTab = require('./jpc_cross_tab');
 let JpcField = require('./jpc_field');
 let JpcParam = require('./jpc_param');
 let JpcFunc = require('./jpc_function');
+let JpcEvent = require('./jpc_event');
 let JpcData = require('./jpc_data');
 let JpcCommonHelper = require('./helper/jpc_helper_common');
 let $JE = require('./jpc_rte'); //Important: for self-define function execution purpose
@@ -162,6 +163,7 @@ JpcExSrv.prototype.createNew = function(){
         me.fields = JpcField.createNew(rptTpl);
         me.params = JpcParam.createNew(rptTpl);
         me.formulas = JpcFunc.createNew(rptTpl);
+        me.events = JpcEvent.createNew(rptTpl);
     };
 
     JpcResult.analyzeData = function(rptTpl, dataObj, defProperties, option, outputType) {

+ 20 - 4
modules/reports/rpt_component/jpc_flow_tab.js

@@ -1115,6 +1115,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 }
                 me.pageSumValLst.push(rowGrandTotal);
                 //grouping content
+                let grpVal_Idx = 0;
                 for (let rowIdx = 0; rowIdx < contentValuesIdx.length; rowIdx++) {
                     if (contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_GROUP) {
                         for (let grpIdx = 0; grpIdx < rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES].length; grpIdx++) {
@@ -1130,7 +1131,8 @@ JpcFlowTabSrv.prototype.createNew = function(){
                                         }
                                     }
                                 }
-                                let lineRst = me.outputTabGrpLine(band, grp_line, page, contentValuesIdx[rowIdx], contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx);
+                                let lineRst = me.outputTabGrpLine(band, grp_line, page, contentValuesIdx[rowIdx], contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx, grpVal_Idx, $CURRENT_RPT);
+                                grpVal_Idx++;
                                 rst = rst.concat(lineRst);
                             }
                         }
@@ -1276,7 +1278,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             return rst;
         }
     };
-    JpcFlowTabResult.outputTabGrpLine = function (band, grp_line, page, grpValueIdx, rows, rowIdx, cols, colIdx, unitFactor, isRow, controls, multiColIdx) {
+    JpcFlowTabResult.outputTabGrpLine = function (band, grp_line, page, grpValueIdx, rows, rowIdx, cols, colIdx, unitFactor, isRow, controls, multiColIdx, grpVal_Idx, $CURRENT_RPT) {
         let me = this, rst = [];
         if (grp_line[JV.PROP_GROUP_SUM_KEYS]) {
             let segIdx = JpcCommonHelper.getSegIdxByPageIdx(page, me.page_seg_map);
@@ -1289,8 +1291,13 @@ JpcFlowTabSrv.prototype.createNew = function(){
             }
         }
         if (grp_line[JV.PROP_TEXTS]) {
-            for (let txt of grp_line[JV.PROP_TEXTS]) {
-                rst.push(JpcTextHelper.outputText(txt, band, unitFactor, rows, rowIdx, cols, colIdx, me.multiCols, multiColIdx));
+            for (let grpIdx = 0; grpIdx < grp_line[JV.PROP_TEXTS].length; grpIdx++) {
+                let txt = grp_line[JV.PROP_TEXTS][grpIdx];
+                let rstCell = JpcTextHelper.outputText(txt, band, unitFactor, rows, rowIdx, cols, colIdx, me.multiCols, multiColIdx);
+                if ($CURRENT_RPT.events[JV.EVENT_TYPE[JV.EVENT_IDX_GRP_ON_CREATE]]) {
+                    me.eventGrpOnCreate(rstCell, JV.EVENT_TYPE[JV.EVENT_IDX_GRP_ON_CREATE], grpIdx, grpVal_Idx, $CURRENT_RPT);
+                }
+                rst.push(rstCell);
             }
         }
         if (grp_line[JV.PROP_DISCRETE_FIELDS]) {
@@ -1302,6 +1309,15 @@ JpcFlowTabSrv.prototype.createNew = function(){
         // console.log(rst);
         return rst;
     };
+    JpcFlowTabResult.eventGrpOnCreate = function (_$CELL, _$GRP_TYPE, _$GRP_OBJ_IDX, _$GRP_VAL_IDX, $CURRENT_RPT) {
+        if ($CURRENT_RPT.events && $CURRENT_RPT.events[JV.EVENT_TYPE[JV.EVENT_IDX_GRP_ON_CREATE]]) {
+            try {
+                eval($CURRENT_RPT.events[JV.EVENT_TYPE[JV.EVENT_IDX_GRP_ON_CREATE]]);
+            } catch (ex) {
+                console.log(ex);
+            }
+        }
+    };
     JpcFlowTabResult.commonTabRestOutput = function(dataObj, page, segIdx, bands, band, unitFactor, tab, multiColIdx){
         let me = this, rst = [];
         if (tab[JV.PROP_TEXT]) {

+ 38 - 25
modules/reports/util/rpt_pdf_util.js

@@ -184,34 +184,39 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
             }
         };
         inner_setupControl(area, dftFontHeight, output);
-        let w = area[JV.IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - area[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
+        let validAreaTxtWidth = area[JV.IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - area[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
+        let validTxtLines = Math.floor((area[JV.IDX_BOTTOM] - area[JV.IDX_TOP]) / (dftFontHeight + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + 4));
         if (parseInt(font.FontAngle) !== 0) {
-            w = area[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM] - area[JV.IDX_TOP] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
+            validAreaTxtWidth = area[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM] - area[JV.IDX_TOP] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
+            validTxtLines = Math.floor((area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]) / (dftFontHeight + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT] + 4));
         }
 
-        function private_drawUnderline() {
+        function private_drawUnderline(underLineVal, underLineArea) {
             //A. 暂不支持角度; B. PDF输出时,坐标没有translate
             let ctx = doc;
             //1. 计算下划线的相关坐标
-            let width = ctx.widthOfString(val);
+            let width = ctx.widthOfString(underLineVal);
+            if (width > underLineArea[JV.IDX_RIGHT] - underLineArea[JV.IDX_LEFT]) {
+                width = underLineArea[JV.IDX_RIGHT] - underLineArea[JV.IDX_LEFT];
+            }
             let height = dftFontHeight;
-            let startX = area[JV.IDX_LEFT], startY = area[JV.IDX_TOP], endX = area[JV.IDX_RIGHT], endY = area[JV.IDX_BOTTOM];
+            let startX = underLineArea[JV.IDX_LEFT], startY = underLineArea[JV.IDX_TOP], endX = underLineArea[JV.IDX_RIGHT], endY = underLineArea[JV.IDX_BOTTOM];
             // let startX = 0, startY = 0, endX = width, endY = startY;
             if (control.Horizon === "left") {
-                startX = Math.round(area[JV.IDX_LEFT] + JV.OUTPUT_OFFSET[JV.IDX_LEFT]);
+                startX = Math.round(underLineArea[JV.IDX_LEFT] + JV.OUTPUT_OFFSET[JV.IDX_LEFT]);
             } else if (control.Horizon === "right") {
-                startX = Math.round(area[JV.IDX_RIGHT] - width - JV.OUTPUT_OFFSET[JV.IDX_RIGHT]);
+                startX = Math.round(underLineArea[JV.IDX_RIGHT] - width - JV.OUTPUT_OFFSET[JV.IDX_RIGHT]);
             } else {
-                startX = Math.round( area[JV.IDX_LEFT] + (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT] - width) / 2);
+                startX = Math.round( underLineArea[JV.IDX_LEFT] + (underLineArea[JV.IDX_RIGHT] - underLineArea[JV.IDX_LEFT] - width) / 2);
             }
             endX = Math.round(startX + width);
 
             if (control.Vertical === "top") {
-                startY = Math.round(area[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM] + height);
+                startY = Math.round(underLineArea[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM] + height);
             } else if (control.Vertical === "bottom") {
-                startY = Math.round(area[JV.IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM]);
+                startY = Math.round(underLineArea[JV.IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM]);
             } else {
-                startY = Math.round( area[JV.IDX_TOP] + (area[JV.IDX_BOTTOM] - area[JV.IDX_TOP] + height) / 2) + JV.OUTPUT_OFFSET[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM];
+                startY = Math.round( underLineArea[JV.IDX_TOP] + (underLineArea[JV.IDX_BOTTOM] - underLineArea[JV.IDX_TOP] + height) / 2) + JV.OUTPUT_OFFSET[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM];
             }
             endY = Math.round(startY);
             //2. 画线
@@ -231,20 +236,25 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
         }
 
         let rotateOptions;
-        if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
-            private_drawUnderline();
-        }
+        // if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+        //     private_drawUnderline(val);
+        // }
         if (parseInt(font.FontAngle) !== 0) {
             if (control){
-                rotateOptions = private_setupAreaRotateOption(area,w,control.Vertical,dftFontHeight, output);
+                rotateOptions = private_setupAreaRotateOption(area,validAreaTxtWidth,control.Vertical,dftFontHeight, output);
             } else {
-                rotateOptions = private_setupAreaRotateOption(area,w,"bottom",dftFontHeight, output);
+                rotateOptions = private_setupAreaRotateOption(area,validAreaTxtWidth,"bottom",dftFontHeight, output);
             }
             doc.rotate(font.FontAngle,rotateOptions);
         }
-        if (w >= doc.widthOfString(val) || (control && control.Shrink !== 'T')) {
-            options.width = w * PDF_SCALE;
+        if (validAreaTxtWidth >= doc.widthOfString(val) ||
+            (control && control.Shrink !== 'T' && validTxtLines < private_splitString(val, validAreaTxtWidth, doc)) ) {
+            options.width = validAreaTxtWidth * PDF_SCALE;
             options.height = dftFontHeight * PDF_SCALE;
+            doc.fontSize(dftFontHeight);
+            if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+                private_drawUnderline(val, area);
+            }
             doc.fontSize(dftFontHeight * PDF_SCALE);
             doc.text(val,output[0] * PDF_SCALE, output[1] * PDF_SCALE, options);
             doc.font(__dirname + '/pdf_base_files/simhei_bold_italic.ttf');
@@ -253,12 +263,12 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
                 //*/
                 let lines = Math.floor((area[JV.IDX_BOTTOM] - area[JV.IDX_TOP]) / (dftFontHeight + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + 4));
                 lines = (lines === 0 || (control.Shrink === 'T' && control.ShrinkFirst === 'T'))?1:lines;
-                let actLines = private_splitString(val, w, doc);
+                let actLines = private_splitString(val, validAreaTxtWidth, doc);
                 if (actLines.length > lines && dftFontHeight >= 6) {
                     dftFontHeight--;
                     doc.fontSize(dftFontHeight);
-                    options.width = w;
-                    options.height = dftFontHeight;
+                    options.width = validAreaTxtWidth * PDF_SCALE;
+                    options.height = dftFontHeight * PDF_SCALE;
                     // doc.text(val,output[0], output[1], options);
                 } else {
                     let aH = dftFontHeight + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + 4;
@@ -274,14 +284,17 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
                     for (let ai = 0; ai < area.length; ai++) {
                         newArea[ai] = area[ai];
                     }
-                    options.width = w * PDF_SCALE;
+                    options.width = validAreaTxtWidth * PDF_SCALE;
                     options.height = dftFontHeight * PDF_SCALE;
                     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_setupControl(newArea, dftFontHeight, output);
+                        doc.fontSize(dftFontHeight);
+                        if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+                            private_drawUnderline(actLines[lIdx], newArea);
+                        }
                         doc.fontSize(dftFontHeight * PDF_SCALE);
-                        // doc.text(actLines[lIdx], output[0], output[1], options);
                         doc.text(actLines[lIdx], output[0] * PDF_SCALE, output[1] * PDF_SCALE, options);
                     }
                     break;
@@ -289,8 +302,8 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
                 /*/
                 dftFontHeight--;
                 doc.fontSize(dftFontHeight);
-                if (w >= doc.widthOfString(val) || dftFontHeight < 6) {
-                    options.width = w;
+                if (validAreaTxtWidth >= doc.widthOfString(val) || dftFontHeight < 6) {
+                    options.width = validAreaTxtWidth;
                     options.height = dftFontHeight;
                     doc.text(val,output[0], output[1], options);
                     doc.font(__dirname + '/pdf_base_files/simhei_bold_italic.ttf');

+ 5 - 0
public/web/rpt_value_define.js

@@ -21,6 +21,7 @@ const JV = {
     NODE_DETAIL_FIELDS_EX: "从数据指标_拓展集合",
     NODE_BAND_COLLECTION: "布局框_集合",
     NODE_FORMULAS: "计算式_集合",
+    NODE_EVENTS: "事件_集合",
     NODE_DISCRETE_INFO: "离散信息",
     NODE_BILL_INFO: "账单式表_信息",
     NODE_BILL_CONTENT : "账单式表_数据",
@@ -261,6 +262,10 @@ const JV = {
     CAL_TYPE_PERCENTAGE: 0,
     CAL_TYPE_ABSTRACT: 1,
 
+    EVENT_TYPE: ["GRP_ON_CREATE", "FLOW_CONTENT_ON_CREATE"],
+    EVENT_IDX_GRP_ON_CREATE: 0,
+    EVENT_IDX_FLOW_CONTENT_ON_CREATE: 1,
+
     PAGE_ORIENTATION_V_FIRST: 0,
     PAGE_ORIENTATION_H_FIRST: 1,
 

+ 14 - 5
web/building_saas/report/js/jpc_output.js

@@ -147,10 +147,13 @@ let JpcCanvasOutput = {
                 validTxtLines = Math.floor((area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]) / (dftFontHeight + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT] + 4));
             }
 
-            function private_drawUnderline() {
+            function private_drawUnderline(underLineVal) {
                 //A. 暂不支持角度; B. 坐标已经translate
                 //1. 计算下划线的相关坐标
-                let width = ctx.measureText(val).width;
+                let width = ctx.measureText(underLineVal).width;
+                if (width > area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]) {
+                    width = area[JV.IDX_RIGHT] - area[JV.IDX_LEFT];
+                }
                 let height = dftFontHeight;
                 // let startX = area[JV.IDX_LEFT], startY = area[JV.IDX_TOP], endX = area[JV.IDX_RIGHT], endY = area[JV.IDX_BOTTOM];
                 let startX = 0, startY = 0, endX = width, endY = startY;
@@ -189,9 +192,9 @@ let JpcCanvasOutput = {
 
             ctx.save();
             ctx.translate(output[0], output[1]);
-            if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
-                private_drawUnderline();
-            }
+            // if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+            //     private_drawUnderline(val);
+            // }
             if (font.FontAngle === JV.VERTICAL_ANGLE) {
                 ctx.rotate(Math.PI/2);
             } else if (font.FontAngle === JV.ANTI_VERTICAL_ANGLE) {
@@ -199,6 +202,9 @@ let JpcCanvasOutput = {
             }
             if (validAreaTxtWidth >= ctx.measureText(val).width ||
                 (control && control.Shrink !== 'T' && validTxtLines < private_splitString(val, validAreaTxtWidth, ctx)) ) {
+                if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+                    private_drawUnderline(val);
+                }
                 ctx.fillText(val, 0, 0);
             } else {
                 while (true) {
@@ -228,6 +234,9 @@ let JpcCanvasOutput = {
                             ctx.translate(-output[0], -output[1]);
                             inner_setupControl(newArea, dftFontHeight, output);
                             ctx.translate(output[0], output[1]);
+                            if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+                                private_drawUnderline(actLines[lIdx]);
+                            }
                             ctx.fillText(actLines[lIdx], 0, 0);
                         }
                         break;

+ 2 - 1
web/building_saas/report/js/rpt_print.js

@@ -244,7 +244,8 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
                 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] - JV.OUTPUT_OFFSET[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.IDX_RIGHT]), ctx);
-        if (actLines.length === 1 || (control && control.Shrink !== 'T')) {
+        let validTxtLines = Math.floor((area[JV.IDX_BOTTOM] - area[JV.IDX_TOP]) / (dftFontHeight + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + 4));
+        if (actLines.length === 1  || (control && control.Shrink !== 'T' && validTxtLines < actLines)) {
             inner_build_text(textValue, area);
         } else {
             while (true) {