Exemple #1
0
        /// <summary>
        /// 获取某一个站点最近几天借车和还车的相互联系的租赁点
        /// </summary>
        /// <param name="db"></param>
        /// <param name="stationID"></param>
        /// <param name="days"></param>
        /// <returns></returns>
        public static async Task <object> GetStationRoutesAsync(PublicBicyclesContext db, int stationID, int days)
        {
            //起始时间
            DateTime    earliest = DateTime.Now.AddDays(-days);
            List <Hire> ins      = await db.Hires
                                   .Where(p => p.ReturnTime > earliest)
                                   .Where(p => p.ReturnStation.ID == stationID)
                                   .Include(p => p.HireStation)
                                   .ToListAsync();

            List <Hire> outs = await db.Hires
                               .Where(p => p.HireTime > earliest)
                               .Where(p => p.HireStation.ID == stationID)
                               .Where(p => p.ReturnStation != null)
                               .Include(p => p.ReturnStation)
                               .ToListAsync();

            //<int,int>的前一个int是StationID,后一个int是来自/前往该租赁点的自行车数量
            Dictionary <int, int> outCount = outs.GroupBy(p => p.ReturnStation.ID).ToDictionary(p => p.Key, p => p.Count());
            Dictionary <int, int> intCount = ins.GroupBy(p => p.HireStation.ID).ToDictionary(p => p.Key, p => p.Count());

            return(new
            {
                In = intCount,
                Out = outCount,
            });
        }
Exemple #2
0
        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="db"></param>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        public async static Task <LoginOrRegisterResult> LoginAsync(PublicBicyclesContext db, string username, string password)
        {
            //判断参数是否为空
            if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
            {
                return(new LoginOrRegisterResult()
                {
                    Type = LoginOrRegisterResultType.Empty
                });
            }
            //寻找用户名与密码都匹配的用户
            User user = await db.Users
                        .FirstOrDefaultAsync(p => p.Username == username && p.Password == CreateMD5(username + password));

            if (user == null)
            {
                //返回用户名或密码错误
                return(new LoginOrRegisterResult()
                {
                    Type = LoginOrRegisterResultType.Wrong
                });
            }
            db.Entry(user).State = EntityState.Modified;
            //修改并保存用户信息
            await db.SaveChangesAsync();

            return(new LoginOrRegisterResult()
            {
                User = user
            });
        }
Exemple #3
0
        public static async Task <object> GetLeaderboardAsync(PublicBicyclesContext db, int days)
        {
            //起始时间
            DateTime earliest = DateTime.Now.AddDays(-days);
            var      hires    = await db.Hires
                                .Where(p => p.ReturnTime > earliest)
                                .Include(p => p.HireStation)
                                .ToListAsync();

            var hireStations = hires
                               .GroupBy(p => p.HireStation)
                               .OrderByDescending(p => p.Count())
                               .Take(10)
                               .Select(p => new { p.Key.Name, Count = p.Count() })
                               .ToList();
            var returnStations = hires
                                 .Where(p => p.ReturnStation != null)
                                 .GroupBy(p => p.ReturnStation)
                                 .OrderByDescending(p => p.Count())
                                 .Take(10)
                                 .Select(p => new { p.Key.Name, Count = p.Count() })
                                 .ToList();

            return(new { hireStations, returnStations });
        }
Exemple #4
0
 /// <summary>
 /// 获取最后一条没有还车的借车记录
 /// </summary>
 /// <param name="db"></param>
 /// <param name="userID"></param>
 /// <returns></returns>
 public static async Task <Hire> GetHiringAsync(PublicBicyclesContext db, int userID)
 {
     return(await db.Hires
            .OrderByDescending(p => p.HireTime.Value)
            .Where(p => p.Hirer.ID == userID && p.ReturnStation == null)
            .Include(p => p.Bicycle)
            .Include(p => p.HireStation)
            .FirstOrDefaultAsync());
 }
Exemple #5
0
        public static async Task <object> GetMoveNeededAsync(PublicBicyclesContext db)
        {
            var stations = await db.Stations.ToListAsync();

            var full = db.Stations
                       .Where(p => 1.0 * p.BicycleCount / p.Count > 0.75)
                       .Select(p => p.ID);
            var empty = db.Stations
                        .Where(p => 1.0 * p.BicycleCount / p.Count < 0.25)
                        .Select(p => p.ID);

            return(new { full, empty });
        }
        /// <summary>
        /// 新增租赁点
        /// </summary>
        /// <param name="db"></param>
        /// <param name="name"></param>
        /// <param name="address"></param>
        /// <param name="lng"></param>
        /// <param name="lat"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        public async static Task AddStationAsync(PublicBicyclesContext db, string name, string address, double lng, double lat, int count)
        {
            Station station = new Station()
            {
                Name    = name,
                Address = address,
                Lng     = lng,
                Lat     = lat,
                Count   = count
            };

            db.Stations.Add(station);
            await db.SaveChangesAsync();
        }
        /// <summary>
        /// 删除租赁点
        /// </summary>
        /// <param name="db"></param>
        /// <param name="stationID"></param>
        /// <returns></returns>
        public async static Task <bool> DeleteStationAsync(PublicBicyclesContext db, int stationID)
        {
            Station station = await db.Stations.FindAsync(stationID);

            if (station == null)
            {
                return(false);
            }
            station.Deleted = true;
            db.Update(station);
            await db.SaveChangesAsync();

            return(true);
        }
        public async static Task <bool> ModifyBicycleAsync(PublicBicyclesContext db, int id, int bicycleID, bool canHire)
        {
            Bicycle bicycle = await db.Bicycles.FindAsync(id);

            if (bicycle == null)
            {
                return(false);
            }
            bicycle.CanHire   = canHire;
            bicycle.BicycleID = bicycleID;
            db.Bicycles.Update(bicycle);
            await db.SaveChangesAsync();

            return(true);
        }
        /// <summary>
        /// 删除自行车
        /// </summary>
        /// <param name="db"></param>
        /// <param name="bicycleID"></param>
        /// <returns></returns>
        public async static Task <bool> DeleteBicycleAsync(PublicBicyclesContext db, int bicycleID)
        {
            Bicycle bicycle = await db.Bicycles.Where(p => p.ID == bicycleID).Include(p => p.Station).FirstOrDefaultAsync();

            if (bicycle == null)
            {
                return(false);
            }
            bicycle.Deleted = true;
            db.Update(bicycle);
            bicycle.Station.BicycleCount--;
            db.Update(bicycle.Station);
            await db.SaveChangesAsync();

            return(true);
        }
Exemple #10
0
        /// <summary>
        /// 还车
        /// </summary>
        /// <param name="db"></param>
        /// <param name="userID"></param>
        /// <param name="bicycleID"></param>
        /// <param name="stationID"></param>
        /// <returns></returns>
        public static async Task <ReturnResult> ReturnAsync(PublicBicyclesContext db, int userID, int bicycleID, int stationID)
        {
            User    user    = db.Users.Find(userID);
            Station station = db.Stations.Find(stationID);
            Bicycle bicycle = db.Bicycles.Find(bicycleID);
            Hire    hire    = await GetHiringAsync(db, userID);

            //if (hire == null && Hires != null && Hires.Any(p => p.Hirer.ID == userID))
            //{
            //    hire = Hires.First(p => p.Hirer.ID == userID);
            //}
            if (user == null || station == null || bicycle == null || hire == null)
            {
                return(new ReturnResult(null, ReturnResultType.DatabaseError));
            }
            if (hire == null)
            {
                //找不到借车记录,联系客服
                return(new ReturnResult(null, ReturnResultType.RecordNotFound));
            }
            if (!station.CanReturn || !station.Online)
            {
                //表示租赁点不可还车或没有在线
                return(new ReturnResult(hire, ReturnResultType.StationCannotReturn));
            }
            if (station.BicycleCount >= station.Count)
            {
                //表示租赁点已满
                return(new ReturnResult(hire, ReturnResultType.StationIsFull));
            }
            hire.ReturnStation = station;
            hire.ReturnTime    = Now();
            db.Hires.Update(hire);
            //更新信息,包括车站自行车+1,设置自行车的被借状态,设置自行车的新租赁点为
            station.BicycleCount++;
            db.Stations.Update(station);

            bicycle.Hiring  = false;
            bicycle.Station = station;
            db.Update(bicycle);
            if (SaveChanges)
            {
                await db.SaveChangesAsync();
            }
            return(new ReturnResult(hire, ReturnResultType.Succeed));
        }
        /// <summary>
        /// 新增自行车
        /// </summary>
        /// <param name="db"></param>
        /// <param name="bicycleID"></param>
        /// <param name="stationID"></param>
        /// <returns></returns>
        public async static Task <bool> AddBicycleAsync(PublicBicyclesContext db, int bicycleID, int stationID)
        {
            var station = await db.Stations.FindAsync(stationID);

            if (station == null || station.BicycleCount >= station.Count)//无法停放更多车辆
            {
                return(false);
            }
            Bicycle bicycle = new Bicycle()
            {
                BicycleID = bicycleID,
                Station   = station
            };

            db.Bicycles.Add(bicycle);
            station.BicycleCount++;
            db.Update(station);
            await db.SaveChangesAsync();

            return(true);
        }
        /// <summary>
        /// 修改租赁点信息
        /// </summary>
        /// <param name="db"></param>
        /// <param name="id"></param>
        /// <param name="name"></param>
        /// <param name="address"></param>
        /// <param name="lng"></param>
        /// <param name="lat"></param>
        /// <param name="count"></param>
        /// <returns></returns>
        public async static Task <bool> ModifyStationAsync(PublicBicyclesContext db, int id, string name, string address, double lng, double lat, int count)
        {
            Station station = await db.Stations.FindAsync(id);

            if (station == null)
            {
                return(false);
            }
            if (count < station.BicycleCount)//租赁点新的容量小于当前车辆数
            {
                return(false);
            }
            station.Name    = name;
            station.Address = address;
            station.Lng     = lng;
            station.Lat     = lat;
            station.Count   = count;
            db.Stations.Update(station);
            await db.SaveChangesAsync();

            return(true);
        }
Exemple #13
0
        //internal static System.Collections.Generic.List<Hire> Hires { get; set; }
        public static async Task <HireResult> HireAsync(PublicBicyclesContext db, int userID, int bicycleID, int stationID)
        {
            User    user    = db.Users.Find(userID);
            Station station = db.Stations.Find(stationID);
            Bicycle bicycle = db.Bicycles.Find(bicycleID);

            if (user == null || station == null || bicycle == null)
            {
                return(new HireResult(null, HireResultType.DatabaseError));
            }
            ///获取最后一条没有完成的借车记录
            Hire hire = await db.Hires.LastOrDefaultRecordAsync(p => p.HireTime.Value, p => p.Hirer.ID == userID && p.ReturnStation == null);

            if (hire != null)
            {
                //如果发现用户还没有还车,那么不允许借车
                return(new HireResult(null, HireResultType.AnotherIsHired));
            }
            hire = new Hire()
            {
                HireStation = station,
                HireTime    = Now(),
                Bicycle     = bicycle,
                Hirer       = user,
            };
            db.Hires.Add(hire);
            station.BicycleCount--;
            db.Stations.Update(station);
            //更新信息,包括车站自行车-1,设置自行车的被借状态,设置自行车的租赁点为null
            bicycle.Hiring  = true;
            bicycle.Station = null;
            db.Update(bicycle);
            if (SaveChanges)
            {
                await db.SaveChangesAsync();
            }
            return(new HireResult(hire, HireResultType.Succeed));
        }
Exemple #14
0
        /// <summary>
        /// 注册
        /// </summary>
        /// <param name="db"></param>
        /// <param name="username"></param>
        /// <param name="password"></param>
        /// <returns>如果用户名已存在,返回null,否则返回注册后的用户对象</returns>
        public async static Task <LoginOrRegisterResult> RegistAsync(PublicBicyclesContext db, string username, string password)
        {
            if (await db.Users.AnyAsync(p => p.Username == username))
            {
                return(new LoginOrRegisterResult()
                {
                    Type = LoginOrRegisterResultType.Existed
                });
            }
            User user = new User()
            {
                Username = username,
                Password = CreateMD5(username + password),
            };

            db.Add(user);
            await db.SaveChangesAsync();

            return(new LoginOrRegisterResult()
            {
                User = user
            });
        }
Exemple #15
0
 /// <summary>
 /// 设置密码
 /// </summary>
 /// <param name="db"></param>
 /// <param name="user">车主</param>
 /// <param name="password">新密码</param>
 /// <returns></returns>
 public async static Task SetPasswordAsync(PublicBicyclesContext db, User user, string password)
 {
     user.Password        = CreateMD5(user.Username + password);
     db.Entry(user).State = EntityState.Modified;
     await db.SaveChangesAsync();
 }
Exemple #16
0
        /// <summary>
        /// 无用方法
        /// </summary>
        /// <param name="db"></param>
        /// <param name="days"></param>
        /// <returns></returns>
        public static async Task <IDictionary <DateTime, int> > GetRecentPublicBicyclesCount(PublicBicyclesContext db, int days)
        {
            //起始时间
            DateTime earliest = DateTime.Now.AddDays(-days);
            var      records  = (await db.Hires
                                 .Where(p => p.HireTime > earliest).ToListAsync())
                                .GroupBy(p => p.HireTime.Value.Date);
            SortedDictionary <DateTime, int> result = new SortedDictionary <DateTime, int>();

            foreach (var day in records)
            {
                result.Add(day.Key, day.Count());
            }

            return(result);
        }