|
@@ -123,16 +123,19 @@ JpcCrossTabSrv.prototype.createNew = function(){
|
|
|
for (let j = 1; j < dataSeq[i].length; j++) {
|
|
|
b1 = false;
|
|
|
for (let k = 0; k < rstFieldsIdx.length; k++) {
|
|
|
- if (typeof(rstFieldsIdx[k]) === 'object') {
|
|
|
- let map_data_field = JE.F(rstFieldsIdx[k][JV.PROP_ID], $CURRENT_RPT);
|
|
|
- if (map_data_field[JV.PROP_AD_HOC_DATA][dataSeq[i][j - 1]] !== map_data_field[JV.PROP_AD_HOC_DATA][dataSeq[i][j]]) {
|
|
|
- b1 = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (data_details[rstFieldsIdx[k]][dataSeq[i][j - 1]] !== data_details[rstFieldsIdx[k]][dataSeq[i][j]]) {
|
|
|
- b1 = true;
|
|
|
- break;
|
|
|
+ if (fields[k].hasOwnProperty(JV.TAB_FIELD_PROP_SORT)) {
|
|
|
+ //只有被选择了作为排序字段的才进入排序及优化
|
|
|
+ if (typeof(rstFieldsIdx[k]) === 'object') {
|
|
|
+ let map_data_field = JE.F(rstFieldsIdx[k][JV.PROP_ID], $CURRENT_RPT);
|
|
|
+ if (map_data_field[JV.PROP_AD_HOC_DATA][dataSeq[i][j - 1]] !== map_data_field[JV.PROP_AD_HOC_DATA][dataSeq[i][j]]) {
|
|
|
+ b1 = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (data_details[rstFieldsIdx[k]][dataSeq[i][j - 1]] !== data_details[rstFieldsIdx[k]][dataSeq[i][j]]) {
|
|
|
+ b1 = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -195,6 +198,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
|
|
|
me.dispSumValueLst_Col = [];
|
|
|
me.page_seg_map = [];
|
|
|
me.row_fields_idx = [];
|
|
|
+ me.row_fields_adhoc_idx = [];
|
|
|
me.col_fields_idx = [];
|
|
|
me.content_fields_idx = [];
|
|
|
me.row_extension_fields_idx = [];
|
|
@@ -207,6 +211,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
|
|
|
let me = this;
|
|
|
//IMPORTANT: the data should be sorted in SQL/NoSQL level!
|
|
|
me.sortedRowSequence = private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_ROW, me.row_fields_idx, $CURRENT_RPT);
|
|
|
+ private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_ROW_AD_HOC, me.row_fields_adhoc_idx, $CURRENT_RPT);
|
|
|
me.sortedColSequence = private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_COL, me.col_fields_idx, $CURRENT_RPT);
|
|
|
me.sortedContentSequence = private_SortForDisplayContent(rptTpl, me.sortedRowSequence, me.sortedColSequence, me.content_fields_idx);
|
|
|
JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM][JV.PROP_CROSS_FIELDS], null, me.col_sum_fields_idx);
|
|
@@ -452,8 +457,8 @@ JpcCrossTabSrv.prototype.createNew = function(){
|
|
|
//2. start to output detail-part
|
|
|
//2.1 Row-Tab
|
|
|
//tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
|
|
|
- tabRstLst.push(me.outputRowTabCommon(rptTpl, dataObj, page, bands, JV.NODE_CROSS_ROW, unitFactor, controls, $CURRENT_RPT, customizeCfg));
|
|
|
- tabRstLst.push(me.outputRowTabCommon(rptTpl, dataObj, page, bands, JV.NODE_CROSS_ROW_AD_HOC, unitFactor, controls, $CURRENT_RPT, customizeCfg));
|
|
|
+ tabRstLst.push(me.outputRowTabCommon(rptTpl, dataObj, page, bands, JV.NODE_CROSS_ROW, me.row_fields_idx, unitFactor, controls, $CURRENT_RPT, customizeCfg));
|
|
|
+ tabRstLst.push(me.outputRowTabCommon(rptTpl, dataObj, page, bands, JV.NODE_CROSS_ROW_AD_HOC, me.row_fields_adhoc_idx, unitFactor, controls, $CURRENT_RPT, customizeCfg));
|
|
|
//2.2 Col-Tab
|
|
|
tabRstLst.push(me.outputColTab(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
|
|
|
//2.3 Content-Tab
|
|
@@ -473,7 +478,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
|
|
|
}
|
|
|
return rst;
|
|
|
};
|
|
|
- JpcCrossTabResult.outputRowTabCommon = function(rptTpl, dataObj, page, bands, tabStr, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
|
|
|
+ JpcCrossTabResult.outputRowTabCommon = function(rptTpl, dataObj, page, bands, tabStr, rowFieldsIdxArr, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
|
|
|
let me = this, rst = [];
|
|
|
let tab = rptTpl[JV.NODE_CROSS_INFO][tabStr];
|
|
|
let band = (tab)?bands[tab[JV.PROP_BAND_NAME]]:null;
|
|
@@ -485,13 +490,13 @@ JpcCrossTabSrv.prototype.createNew = function(){
|
|
|
let valuesIdx = me.dispValueIdxLst_Row[page - 1];
|
|
|
let serialsIdx = me.dispSerialIdxLst_Row[page - 1];
|
|
|
let flexiblePrecisionRefObj = null, flexibleRefField = null, precision_ref_data = null;
|
|
|
- for (let i = 0; i < me.row_fields_idx.length; i++) {
|
|
|
+ for (let i = 0; i < rowFieldsIdxArr.length; i++) {
|
|
|
let tab_field = tab_fields[i];
|
|
|
if (!(tab_field[JV.PROP_HIDDEN])) {
|
|
|
let data_field = null;
|
|
|
let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
|
|
|
- if (typeof me.row_fields_idx[i] !== 'object') {
|
|
|
- data_field = data_details[me.row_fields_idx[i]];
|
|
|
+ if (typeof rowFieldsIdxArr[i] !== 'object') {
|
|
|
+ data_field = data_details[rowFieldsIdxArr[i]];
|
|
|
} else {
|
|
|
if (map_data_field) {
|
|
|
data_field = map_data_field[JV.PROP_AD_HOC_DATA];
|
|
@@ -534,6 +539,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
|
|
|
for (let i = 0; i < me.col_fields_idx.length; i++) {
|
|
|
let tab_field = tab_fields[i];
|
|
|
if (!(tab_field[JV.PROP_HIDDEN])) {
|
|
|
+ let mergedRst = [];
|
|
|
let data_field = null;
|
|
|
let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
|
|
|
if (typeof me.col_fields_idx[i] !== 'object') {
|
|
@@ -558,20 +564,35 @@ JpcCrossTabSrv.prototype.createNew = function(){
|
|
|
} else {
|
|
|
if (colIdx === 0) JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
|
|
|
}
|
|
|
- rst.push(me.outputTabField(band, tab_field, data_field, valuesIdx[colIdx], -1, 1, 0, cols, colIdx, unitFactor, false, controls));
|
|
|
+ mergedRst.push(me.outputTabField(band, tab_field, data_field, valuesIdx[colIdx], -1, 1, 0, cols, colIdx, unitFactor, false, controls));
|
|
|
+ //rst.push(me.outputTabField(band, tab_field, data_field, valuesIdx[colIdx], -1, 1, 0, cols, colIdx, unitFactor, false, controls));
|
|
|
//2. output texts
|
|
|
if (firstTextOutput) {
|
|
|
if (tab[JV.PROP_TEXT]) {
|
|
|
+ // mergedRst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
|
|
|
rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
|
|
|
}
|
|
|
if (tab[JV.PROP_TEXTS]) {
|
|
|
for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
|
|
|
+ // mergedRst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
|
|
|
rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, cols, colIdx, 1, 0));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
firstTextOutput = false;
|
|
|
+ //判断是否需要合并
|
|
|
+ if (tab_field[JV.PROP_IS_MERGE] && mergedRst.length > 1) {
|
|
|
+ let lastCell = mergedRst[mergedRst.length - 1];
|
|
|
+ for (let mergeIdx = mergedRst.length - 2; mergeIdx >= 0; mergeIdx--) {
|
|
|
+ if (lastCell[JV.PROP_VALUE] === mergedRst[mergeIdx][JV.PROP_VALUE]) {
|
|
|
+ mergedRst[mergeIdx][JV.PROP_AREA][JV.PROP_RIGHT] = lastCell[JV.PROP_AREA][JV.PROP_RIGHT];
|
|
|
+ mergedRst.splice(mergeIdx + 1, 1);
|
|
|
+ }
|
|
|
+ lastCell = mergedRst[mergeIdx];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ rst = rst.concat(mergedRst);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -591,8 +612,15 @@ JpcCrossTabSrv.prototype.createNew = function(){
|
|
|
let flexiblePrecisionRefObj = null, flexibleRefField = null, precision_ref_data = null;
|
|
|
for (let i = 0; i < tab_fields.length; i++) {
|
|
|
let tab_field = tab_fields[i];
|
|
|
- let data_field = data_details[me.content_fields_idx[i]];
|
|
|
+ let data_field = null;
|
|
|
let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
|
|
|
+ if (typeof me.content_fields_idx[i] !== 'object') {
|
|
|
+ data_field = data_details[me.content_fields_idx[i]];
|
|
|
+ } else {
|
|
|
+ if (map_data_field) {
|
|
|
+ data_field = map_data_field[JV.PROP_AD_HOC_DATA];
|
|
|
+ }
|
|
|
+ }
|
|
|
if (!(tab_field[JV.PROP_HIDDEN])) {
|
|
|
let rows = contentValuesIdx.length;
|
|
|
for (let rowIdx = 0; rowIdx < rows; rowIdx++) {
|