Beispiel #1
0
        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));;
        }
Beispiel #2
0
        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();
            }
        }