public static async Task <List <ParkArea> > ImportFromJsonAsync(ParkContext db, string json) { List <ParkArea> parkAreas = JsonConvert.DeserializeObject <List <ParkArea> >(json); var existedParks = db.ParkAreas.Where(p => parkAreas.Select(q => q.Name).Contains(p.Name)); (await existedParks.ToListAsync()).ForEach(p => db.ParkAreas.Remove(p)); foreach (var parkArea in parkAreas) { foreach (var ps in parkArea.ParkingSpaces) { ps.ParkArea = parkArea; ps.Class ??= ""; ps.ID = 0; } foreach (var a in parkArea.Aisles) { a.ParkArea = parkArea; a.Class ??= ""; a.ID = 0; } foreach (var w in parkArea.Walls) { w.ParkArea = parkArea; w.Class ??= ""; w.ID = 0; } db.Add(parkArea); } await db.SaveChangesAsync(); return(parkAreas); }
/// <summary> /// 登录 /// </summary> /// <param name="db"></param> /// <param name="username"></param> /// <param name="password"></param> /// <returns></returns> public async static Task <LoginOrRegisterResult> Login(ParkContext db, string username, string password) { //判断参数是否为空 if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password)) { return(new LoginOrRegisterResult() { Type = LoginOrRegisterResultType.Empty }); } //寻找用户名与密码都匹配的用户 CarOwner carOwner = await db.CarOwners .FirstOrDefaultAsync(p => p.Username == username && p.Password == CreateMD5(password)); if (carOwner == null) { //返回用户名或密码错误 return(new LoginOrRegisterResult() { Type = LoginOrRegisterResultType.Wrong }); } carOwner.LastLoginTime = DateTime.Now; db.Entry(carOwner).State = EntityState.Modified; //修改并保存用户信息 await db.SaveChangesAsync(); return(new LoginOrRegisterResult() { CarOwner = carOwner }); }
/// <summary> /// 获取停车区地图 /// </summary> /// <param name="db"></param> /// <param name="parkArea"></param> /// <returns></returns> public static Bitmap GetMap(ParkContext db, ParkArea parkArea) { double scale = 10;//设置倍率为10,即每0.5米用10个像素来表示 Bitmap bitmap = new Bitmap((int)(parkArea.Length * scale), (int)(parkArea.Width * scale)); using Graphics g = Graphics.FromImage(bitmap); //画板 using Pen aislePan = new Pen(Brushes.Gray, (float)(2 * scale)); //通道笔 using Pen wallPan = new Pen(Brushes.Red, (float)(2 * scale)); //墙的笔 foreach (var ps in parkArea.ParkingSpaces) { //对停车位应用旋转变换 using Matrix m = new Matrix(); Rectangle r = new Rectangle((int)(scale * ps.X), (int)(scale * ps.Y), (int)(scale * ps.Width), (int)(scale * ps.Height)); m.RotateAt((float)ps.RotateAngle, new PointF(r.Left + (r.Width / 2), r.Top + (r.Height / 2))); g.Transform = m; //根据停车位是否有车的状态设置不同的颜色 g.FillRectangle(ps.HasCar ? Brushes.Orange : Brushes.Green, r); g.ResetTransform(); } //画通道 foreach (var a in parkArea.Aisles) { g.DrawLine(aislePan, (float)(scale * a.X1), (float)(scale * a.Y1), (float)(scale * a.X2), (float)(scale * a.Y2)); } //画墙 foreach (var w in parkArea.Walls) { g.DrawLine(wallPan, (float)(scale * w.X1), (float)(scale * w.Y1), (float)(scale * w.X2), (float)(scale * w.Y2)); } return(bitmap); }
/// <summary> /// 获取用户余额 /// </summary> /// <param name="db"></param> /// <param name="ownerID"></param> /// <returns></returns> public async static Task <double> GetBalanceAsync(ParkContext db, int ownerID) { //获取该用户的最后一条交易记录,来获得余额 double?balance = (await db.TransactionRecords .LastOrDefaultRecordAsync(p => p.Time, p => p.CarOwnerID == ownerID))?.Balance; return(balance ?? 0);//如果没有交易记录,那么就是0元 }
/// <summary> /// 获取月租到期时间 /// </summary> /// <param name="db"></param> /// <param name="ownerID"></param> /// <returns></returns> private async static Task <DateTime?> GetExpireTimeAsync(ParkContext db, int ownerID) { //获取最后一条月租续费的交易记录 var record = await db.TransactionRecords .Where(p => p.Type == TransactionType.RechargeTime)//充时记录 .LastOrDefaultRecordAsync(p => p.Time, p => p.CarOwnerID == ownerID); if (record == null)//没有充时长记录 { return(null); } return(record.ExpireTime); }
/// <summary> /// 获取最近几天每一天的停车数量 /// </summary> /// <param name="db"></param> /// <param name="days"></param> /// <returns></returns> public static async Task <IDictionary <DateTime, int> > GetRecentParkCount(ParkContext db, int days) { //起始时间 DateTime earliest = DateTime.Now.AddDays(-days); var records = (await db.ParkRecords .Where(p => p.EnterTime > earliest).ToListAsync()) .GroupBy(p => p.EnterTime.Date); SortedDictionary <DateTime, int> result = new SortedDictionary <DateTime, int>(); foreach (var day in records) { result.Add(day.Key, day.Count()); } return(result); }
/// <summary> /// 充值 /// </summary> /// <param name="db"></param> /// <param name="ownerID"></param> /// <param name="amount"></param> /// <param name="time"></param> /// <returns></returns> internal async static Task <TransactionRecord> RechargeMoneyAsync(ParkContext db, int ownerID, double amount, DateTime time) { Debug.Assert(amount > 0); double balance = await GetBalanceAsync(db, ownerID);//余额 TransactionRecord transactionRecord = new TransactionRecord() { Balance = balance + amount,//重新计算余额 CarOwnerID = ownerID, Time = time, Type = TransactionType.RechargeMoney, Value = amount }; db.TransactionRecords.Add(transactionRecord); await db.SaveChangesAsync(); return(transactionRecord); }
/// <summary> /// 充时长(月租续费) /// </summary> /// <param name="db"></param> /// <param name="owner"></param> /// <param name="parkArea"></param> /// <param name="month"></param> /// <returns>返回交易记录,如果余额不足,则返回null</returns> public async static Task <TransactionRecord> RechargeTimeAsync(ParkContext db, int ownerID, int month) { int price = int.Parse(await Config.GetAsync(db, "MonthlyPrice", "120")); Debug.Assert(month > 0); double balance = await GetBalanceAsync(db, ownerID); //用户余额 if (balance < price * month) //如果余额不足,充值随便 { return(null); } DateTime?time = await GetExpireTimeAsync(db, ownerID); //获取到期时间 DateTime target; if (time.HasValue && time.Value > DateTime.Now)//如果到期时间在当前时间之后 { //那么直接到期时间加上几个月 target = time.Value.AddMonths(month); } else { //否则从现在开始算,加上几个月 target = DateTime.Now.AddMonths(month); } //生成交易信息 TransactionRecord transactionRecord = new TransactionRecord() { Balance = balance - price * month, CarOwnerID = ownerID, Time = DateTime.Now, Type = TransactionType.RechargeTime, Value = -price * month, ExpireTime = target }; db.TransactionRecords.Add(transactionRecord); await db.SaveChangesAsync(); return(transactionRecord); }