Exemplo n.º 1
0
    /// <summary>
    /// 这个不单单是合并,在合并时还会判断是否可以合并,而是否可以合并的条件又包含需要向上和向下判断是否Compare成功,所以还需要
    /// DReport detailRoot, ref CompareDetailParam param, int groupIdx, int rowIdx, ref HashSet<DRow> crossJugeRowList这一坨参数
    /// </summary>
    /// <param name="resultType"></param>
    /// <param name="drow"></param>
    /// <param name="detailRoot"></param>
    /// <param name="param"></param>
    /// <param name="groupIdx"></param>
    /// <param name="rowIdx"></param>
    /// <param name="crossJugeRowList"></param>
    void MergeRow(ERowCompareResultType resultType, DRow drow, DReport detailRoot, ref CompareDetailParam param, int groupIdx, int rowIdx, ref HashSet <DRow> crossJugeRowList)
    {
        switch (resultType)
        {
        case ERowCompareResultType.FAILED:
        case ERowCompareResultType.FAILED_CROSSJUGE:
        {
            param.CurrentNotDirtyUpRowNum = 0;
            string fileName = detailRoot.metaData.fileDetails[0].location + "\\" + detailRoot.metaData.fileDetails[0].name;
            int    line     = param.GetRealHandleLineNum();
            Dictionary <int, List <int> > lineResult;
            if (!FaildFileResult.TryGetValue(fileName, out lineResult))
            {
                lineResult = new Dictionary <int, List <int> >();
                FaildFileResult.Add(fileName, lineResult);
            }

            List <int> lineData;
            if (!lineResult.TryGetValue(line, out lineData))
            {
                bool isNew = true;
                if (lineResult.Count > 0)
                {
                    if ((lineResult.Last().Value.Last() + 1) == line)
                    {
                        lineResult.Last().Value.Add(line);
                        isNew = false;
                    }
                }
                if (isNew)
                {
                    lineData = new List <int> {
                        line
                    };
                    lineResult.Add(line, lineData);
                }
            }

            break;
        }

        case ERowCompareResultType.SUCCEED:
        {
            if (param.CheckCanMergeByDirtyRow() == false)
            {
                param.CurrentNotDirtyUpRowNum = 0;
                break;
            }
            int  iGroupIdx   = groupIdx;
            int  iRowIdx     = rowIdx;
            bool isDownDirty = false;
            for (int i = 0; i < param.NeedNotDirtyDownRowNum; ++i)
            {
                var nRow = param.GetNextRow(detailRoot, ref iGroupIdx, ref iRowIdx, 1);
                if (nRow != null)
                {
                    var cResult = CompareRow(detailRoot, nRow, iGroupIdx, iRowIdx, ref crossJugeRowList);
                    if (cResult == ERowCompareResultType.FAILED || cResult == ERowCompareResultType.FAILED_CROSSJUGE)
                    {
                        isDownDirty = true;
                        break;
                    }
                }
            }
            if (isDownDirty == true)
            {
                param.CurrentNotDirtyUpRowNum = 0;
                break;
            }

            param.CurrentNotDirtyUpRowNum++;
            if (drow.lines.Length >= 2)
            {
                if (drow.lines[0].file == 1 && drow.lines[1].file == 2)
                {
                    //可以合并,修改
                    ReplaceLine(ref param.LineList1, param.GetRealHandleLineNum(), param.GetRealLineText(drow.lines[1].file, drow.lines[1].number));
                }
                else if (drow.lines[0].file == 1 && drow.lines[1].file == 3)
                {
                    //可以合并,删除
                    RemoveLine(ref param.LineList1, param.GetRealHandleLineNum());
                    param.OffsetLineNum--;
                }
                else if (drow.lines[0].file == 2 && drow.lines[1].file == 3)
                {
                    //可以合并,新增
                    InsertLine(ref param.LineList1, param.GetRealHandleLineNum(), param.GetRealLineText(drow.lines[0].file, drow.lines[0].number));
                    param.OffsetLineNum++;
                }
            }
            else
            {
                if (drow.lines[0].file == 1)
                {
                    //可以合并,删除
                    RemoveLine(ref param.LineList1, param.GetRealHandleLineNum());
                    param.OffsetLineNum--;
                }
                else if (drow.lines[0].file == 2)
                {
                    //可以合并,新增
                    InsertLine(ref param.LineList1, param.GetRealHandleLineNum(), param.GetRealLineText(drow.lines[0].file, drow.lines[0].number));
                    param.OffsetLineNum++;
                }
                else if (drow.lines[0].file == 3)
                {
                    //不用管
                }
            }
            break;
        }

        case ERowCompareResultType.SUCCEED_CROSSJUGE:
        {
            MergeRow(ERowCompareResultType.SUCCEED, drow, detailRoot, ref param, groupIdx, rowIdx, ref crossJugeRowList);
            break;
        }

        default:
        {
            param.CurrentNotDirtyUpRowNum = 0;
            break;
        }
        }
    }
Exemplo n.º 2
0
    public void CompareDetail(string xmlPath)
    {
        if (OnlyFoderCompare)
        {
            return;
        }
        if (File.Exists(xmlPath) == false)
        {
            return;
        }
        HashSet <DRow> crossJugeRowList = new HashSet <DRow>();
        //以下详细文件的合并,为了以防万一,必须满足以下的所有条件才会合并,否则跳过,人工自己合并
        DReport detailRoot = Deserialize <DReport>(xmlPath);

        if (detailRoot.type != "FileComparison")
        {
            return;
        }

        string file1 = detailRoot.metaData.fileDetails[0].location + "\\" + detailRoot.metaData.fileDetails[0].name;
        string file2 = detailRoot.metaData.fileDetails[1].location + "\\" + detailRoot.metaData.fileDetails[1].name;
        string file3 = detailRoot.metaData.fileDetails[2].location + "\\" + detailRoot.metaData.fileDetails[2].name;

        CompareDetailParam param = new CompareDetailParam();

        param.NeedNotDirtyUpRowNum   = UpNeedNotDirtyRow;
        param.NeedNotDirtyDownRowNum = DownNeedNotDirtyRow;
        GetFileLine(ref param.LineList1, file1);
        GetFileLine(ref param.LineList2, file2);
        GetFileLine(ref param.LineList3, file3);
        DebugLog("CompareDetail: FileName:" + detailRoot.metaData.fileDetails[0].name);
        int groupNum = detailRoot.rowData.rowGroups.Length;

        for (int groupIdx = 0; groupIdx < groupNum; ++groupIdx)
        {
            var dgroup = detailRoot.rowData.rowGroups[groupIdx];
            if (CompareDetailCallBack != null)
            {
                CompareDetailCallBack(groupNum, groupIdx, "");
            }
            for (int rowIdx = 0; rowIdx < dgroup.rows.Length; ++rowIdx)
            {
                param.RealRowIdx++;
                var drow = dgroup.rows[rowIdx];
                //如果3路里有其中一路有变化才做对比
                bool needHandl = false;
                foreach (var dline in drow.lines)
                {
                    if (dline.modifyClass != "U" && dline.modifyClass != "UU")
                    {
                        needHandl = true;
                        break;
                    }
                }

                //记录最左边路上一次能获取的行数
                if (drow.lines[0].file == 1)
                {
                    param.HandleLineNum = drow.lines[0].number;
                }

                if (needHandl == false)
                {
                    param.CurrentNotDirtyUpRowNum++;
                    continue;
                }

                var result = CompareRow(detailRoot, drow, groupIdx, rowIdx, ref crossJugeRowList);
                MergeRow(result, drow, detailRoot, ref param, groupIdx, rowIdx, ref crossJugeRowList);
            }
        }

        SaveFileLine(ref param.LineList1, file1);
    }