فهرست منبع

暂时放开归档 + BUG #3186(部分实现)

TonyKang 4 سال پیش
والد
کامیت
4fc3c87ca7

+ 1 - 1
app/controller/report_controller.js

@@ -77,7 +77,7 @@ module.exports = app => {
                     pageShow = {};
                 }
                 // console.log(pageShow);
-                pageShow.showArchive = 0;
+                pageShow.showArchive = 1;
                 const tender = ctx.tender;
                 const stage = ctx.stage;
                 let stage_id = -1;

+ 37 - 0
app/public/report/js/jpc_output.js

@@ -241,6 +241,26 @@ let JpcCanvasOutput = {
             }
             ctx.restore();
         }
+        function _splitValues(cell, control, orgValues, ctx2D) {
+            //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
+            if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
+                let vals = [];
+                let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+                for (let val of orgValues) {
+                    let actW = ctx2D.measureText(val).width;
+                    if (actW > validAreaTxtWidth) {
+                        vals = vals.concat(private_splitString(val, validAreaTxtWidth, ctx2D));
+                    } else {
+                        vals.push(val);
+                    }
+                }
+                if (vals.length > orgValues.length) {
+                    for (let idx = 0; idx < vals.length; idx++) {
+                        orgValues[idx] = vals[idx];
+                    }
+                }
+            }
+        }
         function private_drawCellText(cell, fonts, controls) {
             if (cell[JV.PROP_VALUE] !== null && cell[JV.PROP_VALUE] !== undefined) {
                 let values = ("" + cell[JV.PROP_VALUE]).split('|');
@@ -266,6 +286,23 @@ let JpcCanvasOutput = {
                         values = [""];
                     }
                 }
+
+                if (font) {
+                    let dftFontHeight = parseFloat(font[JV.FONT_PROPS[1]]);
+                    let dftOthers = "";
+                    let dftFontBold = font[JV.FONT_PROPS[3]];
+                    if (dftFontBold && dftFontBold === 'T') {
+                        dftOthers = "bold " + dftOthers ;
+                    }
+                    let dftFontItalic = font[JV.FONT_PROPS[4]];
+                    if (dftFontItalic && dftFontItalic === 'T') {
+                        dftOthers = dftOthers + "italic ";
+                    }
+                    dftFontHeight = me.scaleFactor * dftFontHeight;
+                    ctx.font = dftOthers + dftFontHeight + "px " + font[JV.PROP_NAME];
+                }
+                _splitValues(cell, control, values, ctx);
+
                 let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + me.offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + me.offsetY];
                 let ah = height;

+ 2 - 0
app/public/report/js/rpt_archive.js

@@ -270,6 +270,7 @@ let rptArchiveObj = {
                             // console.log(result);
                             ARCHIVE_LIST = result.addedRst;
                             rptArchiveObj.showArchivedItem(currentNode);
+                            zTreeOprObj.refreshNodes();
                         } else {
                             // 有冲突,需要删除
                             CommonAjax.postXsrfEx('/tender/report_api/removeArchive/' + PROJECT_ID + '/' + current_stage_id + '/' + currentNode.refId + result.fileName, '', 3000, true, getCookie('csrfToken'),
@@ -298,6 +299,7 @@ let rptArchiveObj = {
                                 // console.log(result);
                                 ARCHIVE_LIST = result.updatedRst;
                                 rptArchiveObj.showArchivedItem();
+                                zTreeOprObj.refreshNodes();
                             } else {
                                 // 有冲突,需要删除
                                 CommonAjax.postXsrfEx('/tender/report_api/removeArchive/' + PROJECT_ID + '/' + current_stage_id + '/' + currentNode.refId + result.fileName, '', 3000, true, getCookie('csrfToken'),

+ 47 - 1
app/public/report/js/rpt_jspdf.js

@@ -73,7 +73,7 @@ let JpcJsPDFHelper = {
                 if (i > 0) {
                     doc.addPage(paperSize.toLowerCase(), orientation);
                 }
-                let ctx = doc.canvas.getContext();
+                let ctx = doc.canvas.getContext("2d");
                 let page = pageObj.items[i],
                     fonts = pageObj[JV.NODE_FONT_COLLECTION],
                     styles = pageObj[JV.NODE_STYLE_COLLECTION],
@@ -266,6 +266,46 @@ let JpcJsPDFHelper = {
             }
         }
 
+        function _splitValues(cell, control, orgValues, doc) {
+            //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
+            if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
+                let vals = [];
+                let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+                for (let val of orgValues) {
+                    let actW = doc.getTextWidth(val);
+                    if (actW > validAreaTxtWidth) {
+                        let lastIdx = 0;
+                        let hasEnd = false;
+                        while (!hasEnd) {
+                            let sCnt = 0;
+                            while (sCnt < val.length) {
+                                let cnt = 1;
+                                //支持HTML5的浏览器全是unicode数据,无需特别处理
+                                if (doc.getTextWidth(val.substring(lastIdx, sCnt + cnt)) > validAreaTxtWidth) {
+                                    vals.push(val.substring(lastIdx, sCnt));
+                                    lastIdx = sCnt;
+                                    sCnt += cnt;
+                                } else {
+                                    sCnt += cnt;
+                                }
+                                if (sCnt >= val.length) {
+                                    hasEnd = true;
+                                    vals.push(val.substring(lastIdx, val.length));
+                                }
+                            }
+                        }
+                    } else {
+                        vals.push(val);
+                    }
+                }
+                if (vals.length > orgValues.length) {
+                    for (let idx = 0; idx < vals.length; idx++) {
+                        orgValues[idx] = vals[idx];
+                    }
+                }
+            }
+        }
+
         function private_drawCellText(doc, ctx, cell, fonts, controls) {
             if (cell[JV.PROP_VALUE] !== undefined && cell[JV.PROP_VALUE] !== null) {
                 let values = ("" + cell[JV.PROP_VALUE]).split('|');
@@ -293,6 +333,12 @@ let JpcJsPDFHelper = {
                 } else {
                     control = cell[JV.PROP_CONTROL];
                 }
+
+                if (font) {
+                    doc.setFontSize(1 * font[JV.FONT_PROPS[1]]);
+                }
+                _splitValues(cell, control, values, doc);
+
                 let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + offsetY];
                 let ah = height;

+ 23 - 0
app/public/report/js/rpt_print.js

@@ -390,6 +390,27 @@ function strReplaceAll(targetStr, FindText, RepText) {
     return targetStr.replace(regExp, RepText);
 }
 
+function _splitValues(cell, control, orgValues, ctx2D) {
+    //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
+    if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
+        let vals = [];
+        let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+        for (let val of orgValues) {
+            let actW = ctx2D.measureText(val).width;
+            if (actW > validAreaTxtWidth) {
+                vals = vals.concat(private_splitString(val, validAreaTxtWidth, ctx2D));
+            } else {
+                vals.push(val);
+            }
+        }
+        if (vals.length > orgValues.length) {
+            for (let idx = 0; idx < vals.length; idx++) {
+                orgValues[idx] = vals[idx];
+            }
+        }
+    }
+}
+
 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";
@@ -436,6 +457,8 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
     area[JV.IDX_RIGHT] = right;
     let height = bottom - top;
     let ctx = canvas.getContext("2d");
+    ctx.font = ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold ":"") + ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"") + orgFontHeight + "px " + font[JV.PROP_NAME];
+    _splitValues(cell, control, values, ctx);
     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];

+ 30 - 0
app/view/report/index.ejs

@@ -591,4 +591,34 @@
             $(document.body).addClass('modal-open');
         });
     })
+
+    function getStdTxtWidthByFont(ctx) {
+        let rst = {'宋体': {'normal': {}, 'bold': {}, 'italic': {}}, 'SmartSimsun': null, 'Arial Narrow': {'normal': {}, 'bold': {}, 'italic': {}}}
+        const _createStdWidth = function(dftFontHeight, chkFontName) {
+            let dftOthers = '';
+            ctx.font = dftOthers + dftFontHeight + "px 宋体";
+            rst[chkFontName]['normal']['_' + dftFontHeight + '_ascii'] = ctx.measureText('_');
+            rst[chkFontName]['normal']['_' + dftFontHeight + '_chn'] = ctx.measureText('一');
+            dftOthers = 'bold';
+            ctx.font = dftOthers + dftFontHeight + "px 宋体";
+            rst[chkFontName][dftOthers]['_' + dftFontHeight + '_ascii'] = ctx.measureText('_');
+            rst[chkFontName][dftOthers]['_' + dftFontHeight + '_chn'] = ctx.measureText('一');
+            dftOthers = 'italic';
+            ctx.font = dftOthers + dftFontHeight + "px 宋体";
+            rst[chkFontName][dftOthers]['_' + dftFontHeight + '_ascii'] = ctx.measureText('_');
+            rst[chkFontName][dftOthers]['_' + dftFontHeight + '_chn'] = ctx.measureText('一');
+        }
+        try {
+            ctx.save();
+            for (let dftFontHeight = 6; dftFontHeight <= 66; dftFontHeight++) {
+                _createStdWidth(dftFontHeight, '宋体');
+                rst['SmartSimsun'] = rst['宋体'];
+                _createStdWidth(dftFontHeight, 'Arial Narrow');
+            }
+        } finally {
+            ctx.restore();
+        }
+    }
+
 </script>
+

+ 2 - 1
app/view/report/rpt_all_popup.ejs

@@ -506,7 +506,7 @@
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
-                <a href="javascript: void(0);" class="btn btn-sm btn-primary" onclick="rptArchiveObj.archiveCurrentReport(zTreeOprObj.currentRptPageRst, zTreeOprObj.currentNode)">确定归档</a>
+                <a href="javascript: void(0);" class="btn btn-sm btn-primary" data-dismiss="modal" onclick="rptArchiveObj.archiveCurrentReport(zTreeOprObj.currentRptPageRst, zTreeOprObj.currentNode)">确定归档</a>
             </div>
         </div>
     </div>
@@ -961,4 +961,5 @@
             }
         }
     }
+
 </script>