let JV = require("../jpc_value_define"); let JE = require("../jpc_rte"); let JpcCommonHelper = require("./jpc_helper_common"); let JpcCrossTabHelper = { getColIDX: function (cl, val) { let rst = -1; for (let i = 0; i < cl.length; i++) { let ca = cl[i]; for (let j = 0; j < ca.length; j++) { if (ca[j] == val) { rst = i; break; } } if (rst != -1) { break; } } return rst; }, pushToSeg: function (segArr, dataSeq, segIdx, sIdx, eIdx) { let arrIdx = []; for (let k = sIdx; k < eIdx; k++) { arrIdx.push(dataSeq[segIdx][k]); } segArr.push(arrIdx); }, sortFieldValue: function (sIDX, eIDX, sortOrder, dataField, dataValSeq) { let tmpSeq = []; if (sortOrder && sortOrder !== JV.TAB_FIELD_PROP_SORT_VAL_NOSORT) { if (sIDX >= 0 && eIDX >= sIDX && dataValSeq.length > eIDX) { let reversed = 1; if (sortOrder === JV.TAB_FIELD_PROP_SORT_VAL_DESC) { reversed = -1; } for (let i = sIDX; i <= eIDX; i++) { tmpSeq.push(dataValSeq[i]); } tmpSeq.sort(function (idx1, idx2) { let rst = 0; // if (isNaN(parseFloat(dataField[idx1])) || isNaN(parseFloat(dataField[idx1]))) { if ( typeof dataField[idx1] === "string" || typeof dataField[idx1] === "string" ) { if (dataField[idx1] > dataField[idx2]) { rst = reversed; } else if (dataField[idx1] < dataField[idx2]) { rst = -reversed; } } else { if (1.0 * dataField[idx1] > 1.0 * dataField[idx2]) { rst = reversed; } else if (1.0 * dataField[idx1] < 1.0 * dataField[idx2]) { rst = -reversed; } } return rst; }); } } if (tmpSeq.length > 0) { for (let i = sIDX; i <= eIDX; i++) { dataValSeq[i] = tmpSeq[i - sIDX]; } } return tmpSeq; }, checkIfEqual: function (dataFields, seq1, seq2) { let rst = true; for (let i = 0; i < dataFields.length; i++) { if (dataFields[i][seq1] !== dataFields[i][seq2]) { rst = false; break; } } return rst; }, sortTabFields: function ( tabFields, fieldSeqs, data_details, dataSeq, $CURRENT_RPT ) { let me = this; let sIDX = 0, eIDX = -1, isFirstSort = true; for (let i = 0; i < tabFields.length; i++) { let tabField = tabFields[i]; if ( tabField[JV.TAB_FIELD_PROP_SORT] !== JV.TAB_FIELD_PROP_SORT_VAL_NOSORT ) { if (isFirstSort) { isFirstSort = false; //first field, should sort all data items for (let j = 0; j < dataSeq.length; j++) { sIDX = 0; eIDX = dataSeq[j].length - 1; //sort the field value here if (typeof fieldSeqs[i] === "object") { let exFirstField = JE.F(fieldSeqs[i][JV.PROP_ID], $CURRENT_RPT); if (exFirstField) { me.sortFieldValue( sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT], exFirstField[JV.PROP_AD_HOC_DATA], dataSeq[j] ); } else { //不排序(健壮性) } } else { me.sortFieldValue( sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT], data_details[fieldSeqs[i]], dataSeq[j] ); } // me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT],data_details[fieldSeqs[i]], dataSeq[j]); } } else { //then sort the rest fields one by one for (let j = 0; j < dataSeq.length; j++) { let chkFields = []; for (let k = 0; k < i; k++) { if (typeof fieldSeqs[k] === "object") { let exField = JE.F(fieldSeqs[k][JV.PROP_ID], $CURRENT_RPT); if (exField) { chkFields.push(exField[JV.PROP_AD_HOC_DATA]); } else { chkFields.push(null); } } else { chkFields.push(data_details[fieldSeqs[k]]); } // chkFields.push(data_details[fieldSeqs[k]]); } (sIDX = 0), (eIDX = -1); for (let m = 1; m < dataSeq[j].length; m++) { if ( !me.checkIfEqual(chkFields, dataSeq[j][m - 1], dataSeq[j][m]) ) { eIDX = m - 1; } else if (m == dataSeq[j].length - 1) { eIDX = m; } if (eIDX >= sIDX) { if (eIDX != sIDX) { if (typeof fieldSeqs[i] === "object") { let exOtherField = JE.F( fieldSeqs[i][JV.PROP_ID], $CURRENT_RPT ); if (exOtherField) { me.sortFieldValue( sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT], exOtherField[JV.PROP_AD_HOC_DATA], dataSeq[j] ); } else { //不排序(健壮性) } } else { me.sortFieldValue( sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT], data_details[fieldSeqs[i]], dataSeq[j] ); } // me.sortFieldValue(sIDX, eIDX, tabField[JV.TAB_FIELD_PROP_SORT],data_details[fieldSeqs[i]], dataSeq[j]); } sIDX = m; eIDX = m - 1; //for protection purpose } } } } } } }, getMaxRowsPerPage: function (bands, rptTpl) { let rst = 1; let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]]; if (band) { rst = getMaxTabCntPerPage( rptTpl, JV.NODE_CROSS_ROW, JV.PROP_CMN_HEIGHT, band.Bottom - band.Top ); } return rst; }, getMaxColsPerPage: function (bands, rptTpl) { let rst = 1; let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_BAND_NAME]]; if (band) { rst = getMaxTabCntPerPage( rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left ); } return rst; }, getActualRowsHeight: function (bands, rptTpl, segments, page) { let rst = 1; let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]]; if (band) { rst = getActualContentAreaMeasurement( rptTpl, JV.NODE_CROSS_ROW, JV.PROP_CMN_HEIGHT, band.Bottom - band.Top, segments, page ); } return rst; }, getActualColsWidth: function (bands, rptTpl, segments, page) { let rst = 1; let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_BAND_NAME]]; if (band) { rst = getActualContentAreaMeasurement( rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left, segments, page ); } return rst; }, chkTabEnd: function ( tabType, rptTpl, bands, sortedSequence, segIdx, preRec, nextRec ) { let me = this, rst = true; let remainAmt = preRec + nextRec - sortedSequence[segIdx].length; rst = me.hasEnoughSpace(tabType, rptTpl, bands, remainAmt); return rst; }, hasEnoughSpace: function (tabType, rptTpl, bands, remainAmt) { if (remainAmt < 0) return false; let rst = true, measurement = 1.0, douDiffForCompare = 0.00001; let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl); let band = null; if (rptTpl[JV.NODE_CROSS_INFO][tabType]) { band = bands[rptTpl[JV.NODE_CROSS_INFO][tabType][JV.PROP_BAND_NAME]]; } if (band != null && band != undefined) { if ( tabType === JV.NODE_CROSS_ROW_SUM || tabType === JV.NODE_CROSS_ROW_EXT ) { measurement = 1.0 * rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_CMN_HEIGHT] * unitFactor; let spareHeight = measurement * remainAmt; let douH = 1.0 * (band.Bottom - band.Top); rst = spareHeight >= douH || spareHeight - douH <= douDiffForCompare; } else if (tabType === JV.NODE_CROSS_COL_SUM) { measurement = 1.0 * rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_CMN_WIDTH] * unitFactor; let spareWidth = measurement * remainAmt; let douW = 1.0 * (band.Right - band.Left); rst = spareWidth >= douW || spareWidth - douW <= douDiffForCompare; } } return rst; }, initialPageStatus: function (pageStatus) { pageStatus[JV.STATUS_NORMAL] = true; pageStatus[JV.STATUS_REPORT_START] = false; pageStatus[JV.STATUS_REPORT_END] = false; pageStatus[JV.STATUS_SEGMENT_START] = false; pageStatus[JV.STATUS_SEGMENT_END] = false; pageStatus[JV.STATUS_GROUP] = false; pageStatus[JV.STATUS_CROSS_ROW_END] = false; pageStatus[JV.STATUS_CROSS_COL_END] = false; }, }; function getMaxTabCntPerPage( rptTpl, tabNodeName, tabMeasurePropName, measureForCal ) { let rst = 1; if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) { let tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName]; let maxFieldMeasure = 1.0; if ( JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION]) ) { let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl); maxFieldMeasure = 1.0 * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] * unitFactor; } else { maxFieldMeasure = (measureForCal * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName]) / JV.HUNDRED_PERCENT; } rst = Math.floor(measureForCal / maxFieldMeasure); } if (rst <= 0) rst = 1; return rst; } function getActualContentAreaMeasurement( rptTpl, tabNodeName, tabMeasurePropName, measureForCal, segments, page ) { let rst = 1; if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) { let tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName]; let maxFieldMeasure = 1.0; if ( JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION]) ) { let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl); maxFieldMeasure = 1.0 * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] * unitFactor; } else { maxFieldMeasure = (measureForCal * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName]) / JV.HUNDRED_PERCENT; } if (segments.length >= page) { rst = segments[page - 1].length * maxFieldMeasure; } } return rst; } module.exports = JpcCrossTabHelper;