|
@@ -361,6 +361,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
|
|
|
};
|
|
|
let private_get_max_lines_of_the_record = function(theRecIdx) {
|
|
|
let rst = 1;
|
|
|
+ let maxAmt = 1;
|
|
|
for (let loop = 0; loop < me.auto_height_fields_idx.length; loop++) {
|
|
|
/*
|
|
|
let data_field = null;
|
|
@@ -384,28 +385,25 @@ JpcFlowTabSrv.prototype.createNew = function(){
|
|
|
let value = JpcFieldHelper.getValue(data_field, theRecIdx);
|
|
|
let area = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, 1, 1, 0, 1, 0, 1, 0, false, false);
|
|
|
if (value !== null && value !== undefined) {
|
|
|
- value = value.replace('\t', '');
|
|
|
- value = value.replace(reg1, '|').replace(reg2, '|').replace(reg3, '|').replace(reg4, '|');
|
|
|
+ if (typeof value === "string") {
|
|
|
+ value = value.replace('\t', '');
|
|
|
+ value = value.replace(reg1, '|').replace(reg2, '|').replace(reg3, '|').replace(reg4, '|');
|
|
|
+ } else {
|
|
|
+ // console.log(`has other value: ${value}`);
|
|
|
+ value = '' + value;
|
|
|
+ }
|
|
|
} else {
|
|
|
value = '';
|
|
|
}
|
|
|
JpcFieldHelper.setValue(data_field, theRecIdx, value);
|
|
|
let values = value.split('|');
|
|
|
- if (values.length > rst) rst = values.length;
|
|
|
+ // if (values.length > rst) rst = values.length; // 考虑到紧凑输出,不能那么快设置rst
|
|
|
let font = private_get_font(tab_field[JV.PROP_FONT]);
|
|
|
- // if (font) {
|
|
|
- // let fontFile = __dirname.slice(0, __dirname.length - 14) + '/util/pdf_base_files/' + fontUtil.getActualFont(font[JV.FONT_PROPS[0]], (font[JV.FONT_PROPS[3]] === 'T'), (font[JV.FONT_PROPS[4]] === 'T')) + '.ttf';
|
|
|
- // doc.font(fontFile);
|
|
|
- // doc.fontSize(parseInt(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]));
|
|
|
- // } else {
|
|
|
- // doc.font(__dirname.slice(0, __dirname.length - 14) + '/util/pdf_base_files/Smart.ttf');
|
|
|
- // doc.fontSize(12);
|
|
|
- // }
|
|
|
let chkFontName = '宋体';
|
|
|
let chkFontHeight = 12;
|
|
|
if (font) {
|
|
|
chkFontName = font[JV.FONT_PROPS[0]];
|
|
|
- chkFontHeight = font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]];
|
|
|
+ chkFontHeight = parseFloat(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]);
|
|
|
}
|
|
|
let hasSplitStr = false, splitStrArr = [];
|
|
|
let accAmt = 0;
|
|
@@ -419,7 +417,18 @@ JpcFlowTabSrv.prototype.createNew = function(){
|
|
|
splitStrArr.push(i);
|
|
|
}
|
|
|
}
|
|
|
- if (accAmt > rst) rst = accAmt;
|
|
|
+ if (accAmt > 3) {
|
|
|
+ // 新优化,计算实际能显示完的真正行数
|
|
|
+ const rowHeight = JpcFlowTabHelper.getRowHeight(bands, rptTpl, me.isEx);
|
|
|
+ let tmpFV = ((chkFontHeight + JV.CLOSE_OUTPUT_ROW_BUFFER) * accAmt) / rowHeight;
|
|
|
+ let tmpAmt = Math.floor(tmpFV);
|
|
|
+ if (Math.ceil(tmpFV) > tmpAmt) {
|
|
|
+ tmpAmt++;
|
|
|
+ }
|
|
|
+ if (maxAmt < tmpAmt) maxAmt = tmpAmt;
|
|
|
+ } else {
|
|
|
+ if (maxAmt < accAmt) maxAmt = accAmt;
|
|
|
+ }
|
|
|
// if (hasSplitStr && outputType !== JV.OUTPUT_TYPE_EXCEL) {
|
|
|
if (hasSplitStr) {
|
|
|
let newValArr = [];
|
|
@@ -438,6 +447,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
|
|
|
// 根据最新需求,暂时不考虑excel类型输出,换回原来逻辑
|
|
|
}
|
|
|
}
|
|
|
+ if (rst < maxAmt) rst = maxAmt; // 最后才设置最大结果
|
|
|
return rst;
|
|
|
};
|
|
|
for (let tabField of tab_fields) {
|
|
@@ -1295,11 +1305,54 @@ JpcFlowTabSrv.prototype.createNew = function(){
|
|
|
if (showText) {
|
|
|
textArr = textArr.concat(showText.split('|'));
|
|
|
}
|
|
|
+ /*
|
|
|
if (contentValInfo[3] < textArr.length && contentValInfo[3] >= 0) {
|
|
|
showText = textArr[contentValInfo[3]];
|
|
|
} else {
|
|
|
showText = '';
|
|
|
}
|
|
|
+ /*/
|
|
|
+ // 因新逻辑要优化自动行高,不再是一个折行占用1row,而是:
|
|
|
+ // a. 根据实际情况,设置了一个实际的行数值(比如共有10行,根据行高情况,可能只设置了6行的高度,在setupAutoHeightData方法里处理)
|
|
|
+ // b. 这里最大的难题在于跨页分配(预估会有来回调整,目前采用按比例分配原则)
|
|
|
+ // c. 还有个问题就是多个自动行高指标的问题
|
|
|
+ const ACT_ROWS = contentValInfo[4]; //经实际计算,能容纳所有数据的实际行数
|
|
|
+ const CURRENT_ROW = contentValInfo[3]; //从0开始
|
|
|
+ const QUOTA_Rate = textArr.length / ACT_ROWS; //每行显示的加权系数(超过2的话,表示给的行高太多了,需要另外一些特殊处理,后期有需要再加)
|
|
|
+ if (textArr.length <= 3 || ACT_ROWS > textArr.length) {
|
|
|
+ //表示这个一定是附属的autoheight指标,或者数据就只有3行(假如数据3行精简成2行,但刚好处于分页状态,那么无论是前一页或后一页,显示上都很纠结(多出来的一行放哪好?),所以新逻辑的起点要3行以上,少了就不折腾了,老老实实地一个萝卜一个坑)
|
|
|
+ if (CURRENT_ROW < textArr.length && CURRENT_ROW >= 0) {
|
|
|
+ showText = textArr[CURRENT_ROW];
|
|
|
+ } else {
|
|
|
+ showText = '';
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //这里不管是不是附属autoheight指标,有足够的条件单独处理
|
|
|
+ // console.log(`ACT_ROWS: ${ACT_ROWS}`);
|
|
|
+ // console.log(`QUOTA_Rate: ${QUOTA_Rate}`);
|
|
|
+ if (QUOTA_Rate >= 2) {
|
|
|
+ //压缩超过一半空间的话,说明给的行高度太高了,需要另外一些特殊处理,后期有需要再加
|
|
|
+ console.log('压缩率异常!!!!!');
|
|
|
+ } else {
|
|
|
+ //正常的压缩比例
|
|
|
+ let startIdx = 0, endIdx = 0;
|
|
|
+ if (CURRENT_ROW > 0) {
|
|
|
+ endIdx = Math.round((CURRENT_ROW + 1) * QUOTA_Rate) - 1;
|
|
|
+ let preEndIdx = 0;
|
|
|
+ if (CURRENT_ROW > 1) {
|
|
|
+ //重定位 preEndIdx
|
|
|
+ preEndIdx = Math.round(CURRENT_ROW * QUOTA_Rate) - 1;
|
|
|
+ }
|
|
|
+ startIdx = preEndIdx + 1;
|
|
|
+ }
|
|
|
+ //按比例分配
|
|
|
+ showText = textArr[startIdx];
|
|
|
+ for (let idx = startIdx + 1; idx <= endIdx; idx++) {
|
|
|
+ showText += `|${textArr[idx]}`;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //*/
|
|
|
let rst = JpcCommonOutputHelper.createCommonOutput(tab_field, showText, controls);
|
|
|
rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, me.multiCols, multiColIdx, true, false);
|
|
|
rst[JV.PROP_IS_AUTO_HEIGHT] = true;
|