问题描述
有一个停车场,有10个停车位,1-5个位是贵宾位,6-10普通位。贵宾位有个默认值:每月的一号和15号的9:00--18:00位5元/小时,其他时间段为3元/小时。普通位有个默认值:每周的工作日(周一到周五)的9:00-22:00为3元/小时,其他时间段为2元/小时。上面的是默认值,是在管理员没有设置的情况下的价格,管理员可以对任何停车位的任何时间段进行价格,设置了的将覆盖默认价格,请教一下实现思路或者表设计。本帖不讨论技术。
解决方案
解决方案二:
管理员设置时段区间,可以细化到什么程度呢?最小计算单位为小时吗?
解决方案三:
如果是最小单位为小时的话,我觉得表结构可以这样:idtype(用来标识是vip还是普通车位)date(日期,如果Type为vip,这个就是每月的几号;如果是普通车位,那就是星期几)hour(小时,如1点、2点、3点等)price(每小时的价格)然后在表里面把每种车位的每个小时的默认单价先存到数据库,在管理员设置了某个小时的价格后,直接覆盖数据库里面的默认的那条记录就行了。这样在计算停车费的时候,就根据停车的车位类型、日期(每月几号或星期几)、hour(停车了好几个小时,就取多条记录进行相加)、price,来计算总金额。上面是我自己的思路,不知道能不能满足楼主需求。
解决方案四:
记录下停车时间车位和管理员制定的价格,然后按照你的逻辑在程序中计算即可。这种逻辑并不复杂,事实上在很多考勤系统中对人员工资计算和它类似。
解决方案五:
引用1楼dokia123的回复:
管理员设置时段区间,可以细化到什么程度呢?最小计算单位为小时吗?
一个小时吧。
解决方案六:
引用3楼caozhy的回复:
记录下停车时间车位和管理员制定的价格,然后按照你的逻辑在程序中计算即可。这种逻辑并不复杂,事实上在很多考勤系统中对人员工资计算和它类似。
请问一下,那个默认的停车价格(管理员没有设置的情况下),怎么持久化到数据库?
解决方案七:
引用2楼dokia123的回复:
如果是最小单位为小时的话,我觉得表结构可以这样:idtype(用来标识是vip还是普通车位)date(日期,如果Type为vip,这个就是每月的几号;如果是普通车位,那就是星期几)hour(小时,如1点、2点、3点等)price(每小时的价格)然后在表里面把每种车位的每个小时的默认单价先存到数据库,在管理员设置了某个小时的价格后,直接覆盖数据库里面的默认的那条记录就行了。这样在计算停车费的时候,就根据停车的车位类型、日期(每月几号或星期几)、hour(停车了好几个小时,就取多条记录进行相加)、price,来计算总金额。上面是我自己的思路,不知道能不能满足楼主需求。
贵宾停车位和普通停车位的需求不同,贵宾是15号1号特殊,普通是上班时间特殊。你怎么区分?
解决方案八:
给车位添加一个标识,是否是贵宾车位停车的默认价格初始化数据库脚本时就初始化到数据库中,这个不用管理员来设置。引用5楼zhengyuechuan的回复:
请问一下,那个默认的停车价格(管理员没有设置的情况下),怎么持久化到数据库?
解决方案九:
想了下,做了些许设计:基础类IdEntity:packageentity;importjava.io.Serializable;importjava.util.Date;/***统一定义id的entity基类.**基类统一定义id的属性名称、数据类型、列名映射及生成策略.子类可重载getId()函数重定义id的列名映射和生成策略.*/publicabstractclassIdEntityimplementsSerializable{protectedstaticfinallongserialVersionUID=Long.MAX_VALUE;privateLongid;protectedDatecreateDate=newDate();publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicvoidsetCreateDate(DatecreateDate){this.createDate=createDate;}publicDategetCreateDate(){returncreateDate;}/***重写equals方法,以id为准判断**@paramobject**@returnboolean*/@Overridepublicbooleanequals(Objectobject){if(this==object){returntrue;}if(object==null){returnfalse;}if(objectinstanceofIdEntity){IdEntityidEntity=(IdEntity)object;//由于IdEntity是hibernate托管的,所以一定要用getUuid方法,而不能直接用uuidif(this.getId()==null||idEntity.getId()==null){returnfalse;}else{returnthis.getId().equals(idEntity.getId());}}returnfalse;}/***重写hashCode方法,直接返回uuid的hashcode**@paramhashCode**@returnint*/@OverridepublicinthashCode(){returngetId()==null?super.hashCode():getId().hashCode();}}
停车位抽象类ParkingSpace:packageentity;publicabstractclassParkingSpaceextendsIdEntity{privatestaticfinallongserialVersionUID=1L;privateStringno;//停车位编号privateTypetype;publicParkingSpace(){}publicstaticParkingSpacegetInstance(Typetype){if(Type.VIP==type){returnnewVipParkingSpace();}else{returnnewGeneralParkingSpace();}}publicStringgetNo(){returnno;}publicvoidsetNo(Stringno){this.no=no;}publicTypegetType(){returntype;}publicvoidsetType(Typetype){this.type=type;}publicstaticenumType{//贵宾、普通VIP,GENERAL}}
贵宾停车位VipParkingSpace:packageentity;publicclassVipParkingSpaceextendsParkingSpace{privatestaticfinallongserialVersionUID=1L;publicVipParkingSpace(){this.setType(ParkingSpace.Type.VIP);}}
普通车位GeneralParkingSpace:packageentity;publicclassGeneralParkingSpaceextendsParkingSpace{privatestaticfinallongserialVersionUID=1L;publicGeneralParkingSpace(){this.setType(ParkingSpace.Type.GENERAL);}}
时间区间基类DateRange:packageentity;importjava.util.Date;publicclassDateRangeextendsIdEntity{privatestaticfinallongserialVersionUID=1L;privateStringalias;//区间别名,如"一号","十五号"privateDatestartDate;privateDateendDate;publicDategetStartDate(){returnstartDate;}publicvoidsetStartDate(DatestartDate){this.startDate=startDate;}publicDategetEndDate(){returnendDate;}publicvoidsetEndDate(DateendDate){this.endDate=endDate;}publicStringgetAlias(){returnalias;}publicvoidsetAlias(Stringalias){this.alias=alias;}}
价格策略抽象类PriceStrategy:packageentity;publicabstractclassPriceStrategyextendsIdEntity{privatestaticfinallongserialVersionUID=1L;privatedoubleprice;publicstaticPriceStrategygetInstance(ParkingSpace.Typetype,DateRangedateRange){if(dateRange!=null){returnnewDateRangePriceStrategy(type,dateRange);}else{returnnewGeneralPriceStrategy(type);}}publicdoublegetPrice(){returnprice;}publicvoidsetPrice(doubleprice){this.price=price;}}
特殊时间区间价格策略DateRangePriceStrategy:packageentity;publicclassDateRangePriceStrategyextendsPriceStrategy{privatestaticfinallongserialVersionUID=1L;privateParkingSpaceparkingSpace;privateDateRangedateRange;publicDateRangePriceStrategy(){}publicDateRangePriceStrategy(ParkingSpace.Typetype,DateRangedateRange){this.parkingSpace=ParkingSpace.getInstance(type);this.dateRange=dateRange;}publicParkingSpacegetParkingSpace(){returnparkingSpace;}publicvoidsetParkingSpace(ParkingSpaceparkingSpace){this.parkingSpace=parkingSpace;}publicDateRangegetDateRange(){returndateRange;}publicvoidsetDateRange(DateRangedateRange){this.dateRange=dateRange;}}
普通时间区间价格策略GeneralPriceStrategy:packageentity;publicclassGeneralPriceStrategyextendsPriceStrategy{privatestaticfinallongserialVersionUID=1L;privateParkingSpaceparkingSpace;publicGeneralPriceStrategy(){}publicGeneralPriceStrategy(ParkingSpace.Typetype){this.parkingSpace=ParkingSpace.getInstance(type);}publicParkingSpacegetParkingSpace(){returnparkingSpace;}publicvoidsetParkingSpace(ParkingSpaceparkingSpace){this.parkingSpace=parkingSpace;}}
大致如此了,楼主感受下。
解决方案十:
引用7楼magi1201的回复:
给车位添加一个标识,是否是贵宾车位停车的默认价格初始化数据库脚本时就初始化到数据库中,这个不用管理员来设置。Quote: 引用5楼zhengyuechuan的回复:
请问一下,那个默认的停车价格(管理员没有设置的情况下),怎么持久化到数据库?
价格肯定是需要从后台配置的,怎么可能是死的!
解决方案十一:
引用9楼jchuang2011的回复:
价格肯定是需要从后台配置的,怎么可能是死的!
楼主说了,这就是个默认的价格。页面上肯定有设置价格的地方,初始化的就是个参考。当然也可以从后台配置文件中配置。
解决方案十二:
引用10楼magi1201的回复:
Quote: 引用9楼jchuang2011的回复:
价格肯定是需要从后台配置的,怎么可能是死的!楼主说了,这就是个默认的价格。页面上肯定有设置价格的地方,初始化的就是个参考。当然也可以从后台配置文件中配置。
嗯,这个是我漏看了
解决方案十三:
引用6楼zhengyuechuan的回复:
Quote: 引用2楼dokia123的回复:
如果是最小单位为小时的话,我觉得表结构可以这样:idtype(用来标识是vip还是普通车位)date(日期,如果Type为vip,这个就是每月的几号;如果是普通车位,那就是星期几)hour(小时,如1点、2点、3点等)price(每小时的价格)然后在表里面把每种车位的每个小时的默认单价先存到数据库,在管理员设置了某个小时的价格后,直接覆盖数据库里面的默认的那条记录就行了。这样在计算停车费的时候,就根据停车的车位类型、日期(每月几号或星期几)、hour(停车了好几个小时,就取多条记录进行相加)、price,来计算总金额。上面是我自己的思路,不知道能不能满足楼主需求。贵宾停车位和普通停车位的需求不同,贵宾是15号1号特殊,普通是上班时间特殊。你怎么区分?
数据里面存的是每一天的每一小时为一条记录,这本身就已经区分开了啊?已经到最小粒度了。
解决方案十四:
引用6楼zhengyuechuan的回复:
Quote: 引用2楼dokia123的回复:
如果是最小单位为小时的话,我觉得表结构可以这样:idtype(用来标识是vip还是普通车位)date(日期,如果Type为vip,这个就是每月的几号;如果是普通车位,那就是星期几)hour(小时,如1点、2点、3点等)price(每小时的价格)然后在表里面把每种车位的每个小时的默认单价先存到数据库,在管理员设置了某个小时的价格后,直接覆盖数据库里面的默认的那条记录就行了。这样在计算停车费的时候,就根据停车的车位类型、日期(每月几号或星期几)、hour(停车了好几个小时,就取多条记录进行相加)、price,来计算总金额。上面是我自己的思路,不知道能不能满足楼主需求。贵宾停车位和普通停车位的需求不同,贵宾是15号1号特殊,普通是上班时间特殊。你怎么区分?
你可以好好理解下我说的表的date字段的意义就好了。