internal async static Task <EnterResult> EnterAsync(ParkContext db, string licensePlate, ParkArea parkArea, DateTime time) { //检查是否有空位 bool hasEmpty = await db.ParkingSpaces.AnyAsync(p => p.ParkArea == parkArea && !p.HasCar); //select from parkingspace join parkarea on parkingspace.parkareaid=parkarea.id and not parkingspace.hascar if (!hasEmpty) { return(new EnterResult(false, "停车场已满")); } //获取汽车 Car car = await GetCarAsync(db, licensePlate, true); if (car != null && !car.Enabled)//是否被禁止进入 { return(new EnterResult(false, "该车辆禁止进入")); } //新增进出记录 ParkRecord parkRecord = new ParkRecord() { Car = car, EnterTime = time, ParkArea = parkArea }; db.ParkRecords.Add(parkRecord); await db.SaveChangesAsync(); return(new EnterResult(true));; }
internal async static Task <LeaveResult> LeaveAsync(ParkContext db, string licensePlate, ParkArea parkArea, DateTime time) { ParkRecord parkRecord = null; try { LeaveResult leave = new LeaveResult() { CanLeave = true }; Car car = await GetCarAsync(db, licensePlate, false); if (car == null) { //找不到车,就直接放行,省得麻烦 return(leave); } //获取停车记录 parkRecord = await db.ParkRecords .OrderByDescending(p => p.EnterTime) .FirstOrDefaultAsync(p => p.Car == car); if (parkRecord == null) { //找不到记录,就直接放行,省得麻烦 return(leave); } leave.ParkRecord = parkRecord; //补全进出记录 parkRecord.LeaveTime = time; db.Entry(parkRecord).State = EntityState.Modified; CarOwner owner = car.CarOwner; //获取价格策略 var priceStrategy = parkArea.PriceStrategy; if (priceStrategy == null) { //免费停车场 return(leave); } switch (owner) { case CarOwner _ when owner.IsFree: //免费用户 break; case CarOwner _: if (await IsMonthlyCardValidAsync(db, owner.ID)) { //月租用户,放行 break; } else { goto needPay; } case null: //没有注册 needPay: //非会员或普通用户 double price = GetPrice(priceStrategy, parkRecord.EnterTime, time); double balance = owner == null ? 0 : await GetBalanceAsync(db, owner.ID); //计算价格 if (balance - price < 0) { //拒绝驶离,要求付费 leave.CanLeave = false; leave.NeedToPay = balance - price; return(leave); } //新增扣费记录 TransactionRecord transaction = new TransactionRecord() { Time = time, Type = TransactionType.Park, Balance = balance - price, Value = -price, CarOwner = owner, }; db.TransactionRecords.Add(transaction); parkRecord.TransactionRecord = transaction; //停车记录绑定交易记录 break; } return(leave); } finally { await db.SaveChangesAsync(); } }