| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | var JV = require('./jpc_value_define');var JpcData = {    createNew: function() {        var JpcDataRst = {};        JpcDataRst.dataSeq = [];        JpcDataRst.analyzeData = function(rptTpl, dataObj) {            var me = this;            if ((rptTpl) && (dataObj)) {                //1. get ID fields                var masterIDs = [];                for (var i = 0; i < rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS].length; i++) {                    var mstFieldObj = rptTpl[JV.NODE_FIELD_MAP][JV.NODE_MASTER_FIELDS][i];                    if ((mstFieldObj[JV.PROP_IS_ID]) && (mstFieldObj[JV.PROP_IS_ID] === 'T')) {                        masterIDs.push({"idx": i, "seq": mstFieldObj[JV.PROP_ID_SEQ]});                    }                }                var detailIDs = [];                for (var i = 0; i < rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS].length; i++) {                    var dtlFieldObj = rptTpl[JV.NODE_FIELD_MAP][JV.NODE_DETAIL_FIELDS][i];                    if ((dtlFieldObj[JV.PROP_IS_ID]) && (dtlFieldObj[JV.PROP_IS_ID] === 'T')) {                        detailIDs.push({"idx": i, "seq": dtlFieldObj[JV.PROP_ID_SEQ]});                    }                }                //2. sort the ID fields                if (masterIDs.length > 1) {                    masterIDs.sort(function(a, b) {                        return 1*a["seq"] - 1*b["seq"];                    })                }                if (detailIDs.length > 1) {                    detailIDs.sort(function(a, b) {                        return 1*a["seq"] - 1*b["seq"];                    })                }                //3. prepare data sequence                if (masterIDs.length > 0) {                    var mst_dt_len = 0, dtl_dt_len = 0, mst_fields = [];                    for (var i = 0; i < masterIDs.length; i++) {                        mst_fields.push(dataObj[JV.DATA_MASTER_DATA][masterIDs[i]["idx"]]);                        mst_dt_len = dataObj[JV.DATA_MASTER_DATA][masterIDs[i]["idx"]].length;                    }                    var dtl_fields = [];                    for (var i = 0; i < detailIDs.length; i++) {                        dtl_fields.push(dataObj[JV.DATA_DETAIL_DATA][detailIDs[i]["idx"]]);                        dtl_dt_len = dataObj[JV.DATA_DETAIL_DATA][detailIDs[i]["idx"]].length;                    }                    var sIdx = 0;                    var isEqual = true;                    for (var i = 0; i < mst_dt_len; i++) {                        me.dataSeq.push([]);                        //then compare the master/detail ID-field value                        for (var j = sIdx; j < dtl_dt_len; j++) {                            isEqual = true;                            for (var k = 0; k < mst_fields.length; k++) {                                if (!(mst_fields[k][i] === dtl_fields[k][j])) {                                    isEqual = false;                                    break;                                }                            }                            if (isEqual) {                                me.dataSeq[i].push(j);                            } else {                                sIdx = j;                                //below logic is for the data robustness purpose, to avoid those strange record(detail level) which could not match even one of the master record!                                if (i < mst_dt_len - 1 && j < dtl_dt_len - 1) {                                    for (var j1 = j; j1 < dtl_dt_len; j1++) {                                        isEqual = true;                                        for (var k = 0; k < mst_fields.length; k++) {                                            if (!(mst_fields[k][i + 1] === dtl_fields[k][j1])) {                                                isEqual = false;                                                break;                                            }                                        }                                        if (isEqual) {                                            sIdx = j1;                                            break;                                        }                                    }                                }                                break;                            }                        }                    }                } else { //if no master data                    var field = dataObj[JV.DATA_DETAIL_DATA][0];                    me.dataSeq = [[]];                    for (var i = 0; i < field.length; i++) {                        me.dataSeq[0].push(i);                    }                }            }            //alert(3);        };        return JpcDataRst;    }}module.exports = JpcData;
 |