Пример #1
0
        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
            });
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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元
        }
Пример #5
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);
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
        /// <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);
        }
Пример #8
0
        /// <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);
        }