Esempio n. 1
0
        /// <summary>
        /// 为列车时刻表中的车站Id、车次线路表Id赋值,并写入数据库
        /// </summary>
        private static void WriteTrainMoments(TimeTable table)
        {
            for (var i = 0; i < table.Moments.Count; i++)
            {
                table.Moments[i].Sort           = i;
                table.Moments[i].TrainStationId = table.Stations[i].Id;
                table.Moments[i].TrainNoLineId  = table.TrainNoLineRelation.Id;
            }

            var bll = new TrainMomentBll();

            var maxId = (int)bll.GetMaxId();

            bll.BulkInsert(table.Moments);
            DataUpdateLog.BulkUpdate(nameof(TrainMoment), maxId);
        }
Esempio n. 2
0
        /// <summary>
        /// 构造线路-车站关系并写入数据库
        /// </summary>
        /// <param name="table"></param>
        private static void WriteLineStaionRelation(TimeTable table)
        {
            // 构造线路-车站关系并写入数据库
            var lineStationRelation = new List <LineStations>();

            for (var i = 0; i < table.Stations.Count; i++)
            {
                lineStationRelation.Add(new LineStations
                {
                    LineId      = table.Line.Id,
                    Sort        = i,
                    StationId   = table.Stations[i].Id,
                    StationName = table.Stations[i].StationName
                });
            }
            var lineStationsBll = new LineStationsBll();

            var startId = (int)lineStationsBll.GetMaxId(); // 记录插入之前的最大ID

            lineStationsBll.BulkInsert(lineStationRelation);
            DataUpdateLog.BulkUpdate(nameof(LineStations), startId); // 将数据更新记录同步到DbUpdataLog表中
        }
Esempio n. 3
0
        /// <summary>
        /// 按照"格式二"从指定的<see cref="ISheet"/>对象中提取信息
        /// 并创建<see cref="TimeTable"/>对象集合返回
        /// </summary>
        /// <param name="sheet">将作为数据源的<see cref="ISheet"/>对象</param>
        /// <returns><see cref="TimeTable"/>对象集合</returns>
        private static List <TimeTable> GetTimeTableOfStyleTwo(ISheet sheet)
        {
            // 从第二行中获取列车运行方向
            var row   = sheet.GetRow(1);
            var title = row.Cells[0].ToString();
            // 从字符串"古店-集宁间上行列车时刻表"中提取"上行"
            var direction = title.Substring(title.IndexOf("行列车时刻表") - 1, 2);

            // 从第八行和第九行中提取所有车次
            row = sheet.GetRow(7);
            var row9          = sheet.GetRow(8);
            var stationColNum = Regex.Replace(row.Cells[0].ToString(), @"\s", "") == "区间公里" ? 2 : 0; // 车站所在列的索引
            var trainNos      = new List <string>();

            for (var i = stationColNum + 1; i < row.Cells.Count; i++)
            {
                // 车次列索引从车站后一列开始
                var value  = row.Cells[i].ToString().Trim();
                var value1 = row9.Cells[i].ToString().Trim(); // 有的车次占了第八和第九两行
                if (!string.IsNullOrEmpty(value))
                {
                    trainNos.Add(value + value1);
                }
            }

            // 从第一或者第三列中提取所有车站(有的表格车站在第三列,而有的在第一列)
            // 从第十行开始循环
            var stations = new List <BaseStation>();

            for (var i = 9; i < sheet.LastRowNum; i++)
            {
                row = sheet.GetRow(i);
                var txt = row.Cells[stationColNum].ToString();
                if (!string.IsNullOrEmpty(txt))
                {
                    var name   = txt.Trim();
                    var pinyin = PinyinHelper.GetInitials(name).ToLower();
                    stations.Add(new BaseStation {
                        Spell = pinyin, StationName = name
                    });
                }
            }

            // 循环车次列表,生成列车时刻表集合
            var startColNum = stationColNum + 1;
            var timeTables  = new List <TimeTable>();

            for (var trainNoIndex = 0; trainNoIndex < trainNos.Count; trainNoIndex++)
            {
                var timeTable = new TimeTable();

                // 从第二或者第四列开始,逐列获取列车时刻表
                var sort         = 1;
                var stationIndex = 0;                          // 通过此索引从车站列表中获取与时刻表对应的车站
                var colIndex     = startColNum + trainNoIndex; // 随着车次索引的增加,相应的改变获取时刻表的单元格索引
                for (var rowIndex = 9; rowIndex < sheet.LastRowNum; rowIndex++)
                {
                    row = sheet.GetRow(rowIndex);
                    var arrive = row.Cells[colIndex].ToString().Trim().Replace("...", "");

                    rowIndex++;
                    row = sheet.GetRow(rowIndex);
                    var start = row.Cells[colIndex].ToString().Trim().Replace("...", "");

                    // 出发或者到达时间任意一个不为空
                    // 则表明本车次将经过stationIndex所对应的车站
                    // 否则表示本车次不经过此车站,则不将此车站添加到
                    // 本车次对应的车站列表中
                    if (!string.IsNullOrEmpty(arrive) || !string.IsNullOrEmpty(start))
                    {
                        arrive = TimeFormatter(arrive);
                        start  = TimeFormatter(start);
                        timeTable.Stations.Add(stations[stationIndex]);
                        timeTable.Moments.Add(new TrainMoment {
                            ArriveTime = arrive, DepartTime = start, Sort = sort++
                        });
                    }

                    stationIndex++;
                    // 如果stationIndex已经超出了车站数量,则结束循环
                    if (stationIndex >= stations.Count)
                    {
                        break;
                    }
                }

                // 重置索引和排序
                stationIndex = 0;
                sort         = 1;

                // 如果是上行车次,需要将车站及列车时刻反转
                if (direction == "上行")
                {
                    timeTable.Stations.Reverse();
                    timeTable.Moments.Reverse();

                    // 改变序号,并将出发及到达时间互换
                    sort = 1;
                    timeTable.Moments.ForEach(item =>
                    {
                        var temp        = item.ArriveTime;
                        item.ArriveTime = item.DepartTime;
                        item.DepartTime = temp;
                        item.Sort       = sort++;
                    });
                }

                // 创建车次及线路对象
                var firstStation = timeTable.Stations.First().StationName;
                var lastStation  = timeTable.Stations.Last().StationName;
                timeTable.TrainNo = new TrainNo {
                    Direction = direction, FullName = trainNos[trainNoIndex], FirstStation = firstStation, LastStation = lastStation, RunType = 2
                };
                timeTable.Line = new BaseLine {
                    FirstStation = firstStation, LastStation = lastStation, LineName = $"{firstStation}-{lastStation}"
                };

                timeTables.Add(timeTable);
            }

            return(timeTables);
        }
Esempio n. 4
0
        /// <summary>
        /// 按照"格式一"从指定的<see cref="ISheet"/>对象中提取信息
        /// 并创建<see cref="TimeTable"/>对象返回
        /// </summary>
        /// <param name="sheet">将作为数据源的<see cref="ISheet"/>对象</param>
        /// <returns><see cref="TimeTable"/>对象</returns>
        private static TimeTable GetTimeTableOfStyleOne(ISheet sheet)
        {
            var timeTable = new TimeTable();

            // 从第五行第一个单元格中提取车次、线路信息
            var fifthRow = sheet.GetRow(4);

            timeTable.TrainNo = GetTrainNo(fifthRow);
            timeTable.Line    = GetLine(fifthRow);

            // 判断是否是动车时刻表,若是,则将所有单元格索引+1
            InitialCellIndexs(timeTable.TrainNo.Code);

            // 判断车次方向,若是上行,则将表格从后往前循环
            // 反之,则从前往后循环(从索引6开始)
            var isUpword = IsUpward(timeTable.TrainNo.FullName);
            var start    = isUpword ? sheet.LastRowNum : STARTINDEX;
            var end      = isUpword ? STARTINDEX : sheet.LastRowNum;

            // 循环表格,提取信息到timeTable对象中
            // 每次循环读取两行数据,index相应的加/减2
            // 循环结束条件为:当前读取到的车站名称与区段结束车站名称相同
            Func <int, int> getNextIndex = i => isUpword ? i - 1 : i + 1; // 此方法用于处理索引的递增或者递减
            var             loopIsEnd    = false;
            var             index        = start;

            while (!loopIsEnd)
            {
                var stationRow = sheet.GetRow(index);
                index = getNextIndex(index);

                // 若读取到的是空行,则跳过继续读取下一行
                if (!IsEmptyRow(stationRow))
                {
                    var speedRow = sheet.GetRow(index);
                    index = getNextIndex(index);

                    // 将读取两行数据:
                    //  第一行数据中包含车站名称、发车时间以及到达时间
                    //  第二行数据中包含区间运行时间, 区间平均速度以及区间停车时间
                    var moment = GetTrainMoment(stationRow, speedRow);
                    if (moment != null)
                    {
                        var station = GetStation(stationRow);
                        timeTable.Stations.Add(station);
                        timeTable.Moments.Add(moment);

                        if (station.StationName == timeTable.TrainNo.LastStation)
                        {
                            loopIsEnd = true; // 循环结束
                        }
                    }
                }

                // 防止死循环的情况发生
                if (stationRow == null)
                {
                    loopIsEnd = true; // 循环结束
                }
            }

            return(timeTable);
        }