不同的乘客类型具有不同的机票折扣,详情请见乘客折扣。
在这三种乘客类型中,成人和儿童占用座位,而婴儿不占用座位,婴儿票不能单独出售,一张婴儿票必须凭一张成人票售出。
飞机机型:
(AirplaneModel):
用来描述执行某个航班计划的飞机的型号,一般来讲,一个航班计划的各次航班都应该采用同种机型的飞机来执行。
不同的飞机型号有不同的航程及各舱座位数。
详情请参见附录II民航飞机型号一览表。
**实际情况中,各种机型的座位数是不一样的,同一机型还分好几个系列,如B737(波音737)
B737-200、B737-300....B737-900等多个系列,每个系列座位数都不一样。
即使是同一型号、有
同一系列的机型,所属的航空公司不同,座位数也会不同,因为航空公司在购买飞机时,会根据自己的需要要求厂家采用不同的布局,不同的布局会有不同的头等舱、公务舱、经济舱座位数。
在本项目中为简化业务模型,我们认为同种型号的飞机各舱座位数是固定的。
基准票价:
(FullPrice):
是指某个航班在没有季节折扣时的一张经济舱成人票的价格,该价格作为该航班计划的基准价格,最终机票价格应该在此基础上乘以季节折扣,舱位折扣和乘客类型折扣。
季节折扣:
(SeasonDiscount):
航空公司根据不同季节的客流状况调整的航班的折扣,只有经济舱的成人票才享受季节折扣。
舱位折扣:
(ClassDiscount):
不同舱位在基准价格基础上的价格系数,头等舱为1.5,公务舱为1.3,经济舱为1.0
乘客类型折扣:
(PassengerDiscount):
不同乘客类型在基准票价基础上的价格系数,成人为1.0,儿童为0.5,婴儿为0.1。
机票订单(TicketOrder):
一张成功出票的机票记录,
机票价格:
(TicketPrice):
一张机票的价格,机票价格由以下公式计算:
经济舱成人票票价=基准价格*季节折扣
其他舱位乘客票价=基准价格*舱位折扣*乘客类型折扣
燃油税:
国家统一征收的,由乘坐民航飞机的乘客负担的一种税收,计算办法:
800KM以内(含)的航程,每人税费为60元,800KM以上的航程每人税费为100元,儿童票减半收取,婴儿票免收燃油税。
燃油税的征收不区分乘客舱位。
该项税费捆绑在机票上由航空公司代收代缴。
机场建设费:
国家统一收取的,由乘坐民航飞机的乘客负担的一种收费项目,用于支援民航机场的建设。
收取办法:
乘坐70座以下(含)的小飞机,每人每次收取10元;乘坐70座以上的大飞机,每人每次收取50元。
儿童和婴儿都不收取机场建设费。
机场建设费的征收不区分乘客舱位。
该项收费捆绑在机票上由航空公司代收代缴。
机票应收款:
一张机票的应收款=机票价格+燃油税+机场建设费。
需求分析:
1,系统功能模块(略):
2,系统活动图(略):
3,用例图(略):
客户端用例:
服务器端用例:
概要设计:
1,业务模型:
2,数据库设计
设计出如下数据库表结构:
机场表(AIRPORT):
机场代码airport_codeCHAR(3)Primary
Key
所在城市cityVARCHAR(20)NOTNULL
机场名若为空,则用城市名表示airport_nameVARCHAR(20)
飞机机型表(AIRPLANE_MODEL):
机型modelVARCHAR(20)PRIMARYKEY
最大航程max_sail_lengthNUMBER(6)NOTNULL
头等舱座位数first_class_seatsNUMBER(3)NOTNULL
公务舱座位数business_class_seatsNUMBER(3)NOTNULL
经济舱座位数economy_class_seatsNUMBER(3)NOTNULL
航班计划表(FLIGHT_SCHEDULER):
航班号flight_numberCHAR(6)PRIMARYKEY
开始日期start_dateDATENOTNULL
结束日期end_dateDATENOTNULL
出发地机场from_cityCHAR(3)REFERENCESairport.airport_code
NOTNULL
目的地机场to_cityCHAR(3)REFERENCESairport.airport_code
NOTNULL
离港时间departure_timDATENOTNULLe
到港时间arrival_timeDATENOTNULL
执行机型airplaneVARCHAR(20REFERENCES
)airplane_model.model
NOTNULL
scheduler班期CHAR(7)NOTNULLsail_lengt航程NUMBER(5)NOTNULLh
航班表(FLIGHT):
航班编号idNUMBER(8)PRIMARYKEY
航班号flight_numberCHAR(6)REFERENCES
flight_scheduler.
flight_number
出发日期departure_dateDATENOTNULL
头等舱剩first_class_remain_seatsNUMBER(3)NOTNULL
余座位数
公务舱剩business_class_remain_seatsNUMBER(3)NOTNULL
余座位数
经济舱剩economy_class_remain_seatsNUMBER(3)NOTNULL
余座位数
季节折扣season_discountNUMBER(4,2)NOTNULL
DEFAULT1.0
营业网点表(BRANCH):
网点编号idNUMBER(4)PRIMARYKEY
网点名称nameVARCHAR(40)NOTNULL
地址addressVARCHAR(50)NOTNULL
电话telephoneVARCHAR(15)
所在省份provinceVARCHAR(10)NOTNULL
所在城市cityVARCHAR(10)NOTNULL
营业员表(SALES):
营业员编号idNUMBER(6)PRIMARYKEY网点编号branch_idNUMBER(4)NOTNULLREFERENCES
BRANCH.id
营业员名称nameVARCHAR(10)NOTNULL登录密码passwordVARCHAR(10)NOTNULL
出票记录表(TICKET_ORDER):
机票编号idNUMBER(10)PRIMARYKEY
航班编号flight_idNUMBER(8)NOTNULL
REFERENCESFLIGHT.id
乘客姓名passenger_nameVARCHAR(40)NOTNULL
证件号码certification_numberVARCHAR(20)NOTNULL
出票日期order_dateDATENOTNULL
舱位等级classCHAR
(1)NOTNULLCHECKIN(F,C,Y)
乘客类型passenger_typeCHAR
(1)NOTNULLCHECKIN(A,C,I)
营业网点编branch_idNUMBER(4)NOTNULL
号REFERENCESBRANCH.id
营业员编号sales_idNUMBER(6)NOTNULL
REFERENCESSALES.id
3,DAO接口设计
1)SalesDAO:
packagecom.xie.abs.dao;
importcom.xie.abs.model.*;
/**
*对营业员数据进行访问的接口。
*
*
*/
publicinterfaceSalesDAO{
/**
*根据给定的姓名和密码在底层数据源中查找营业员的纪录,
*若找到,则返回该营业员对象,若没找到或密码错误则返回null。
*@paramname营业员姓名
*@parampasswd营业员密码
*@return找到的营业员对象或null
*/
publicSalesgetSales(Stringname,Stringpasswd);
/**
*向底层数据中添加一个营业员纪录。
*@paramuser要添加的营业员对象
*@return若添加成功返回true,否则返回false。
*/
publicbooleanaddSales(Salesuser);
/**
*根据指定的营业员的姓名在底层数据源中删除该营业员。
*@paramname营业员姓名
*@return若删除成功返回true,否则返回false。
*/
publicbooleanremoveSales(Stringname);
/**
*修改指定营业员的密码。
*@paramname营业员姓名
*@paramoldPassword旧密码
*@paramnewPassword新密码
*@return若修改成功返回true,否则返回false。
*/
publicbooleanmodifyPassword(Stringname,StringoldPassword,StringnewPassword);
}
2)FlightDAO:
packagecom.xie.abs.dao;importjava.util.Set;
importjava.util.Calendar;importcom.xie.abs.model.*;
/**
*对航班和航班计划数据访问的接口。
*
*/
publicinterfaceFlightDAO{
/**
*根据指定出发地,目的地和出发日期在底层数据源中查找
*得到所有的航班对象的集合。
*@paramfromAddr出发地
*@paramtoAddr目的地
*@paramdate出发日期
*@return航班集合
*/
publicSetgetAllFlights(StringfromAddr,StringtoAddr,Calendardate);
/**
*添加指定的航班计划对象。
*@paramfs要添加的航班计划对象。
*@return添加成功返回true,否则返回false。
*/
publicbooleanaddFlightScheduler(FlightSchedulerfs);
/**
*根据给定的航班编号在底层数据源中删除该航班计划,以及该计划下的所有航班。
*@paramflightNumber要删除的航班计划的航班编号。
*@return删除成功返回true,否则返回false。
*/
publicbooleanremoveFlightScheduler(StringflightNumber);
/**
*该方法更新航班--删除过期航班,创建可以接受预订的航班。
*航班的接受预订期是指从当前日期开始往后60天。
*
*/
publicvoidupdateFlights();
/**
*得到所有航班计划对象
*@return
*/
publicSetgetAllFlightSchedulars();
}
3)BranchDAO:
packagecom.xie.abs.dao;
importcom.xie.abs.model.*;importjava.util.Set;
/**
*对营业网点数据访问的接口*
*/
publicinterfaceBranchDAO{
/**
*根据给定的编号在底层数据源中查找营业网点的纪录,
*若找到,则返回该营业网点对象,若没找到则返回null。
*@paramid营业网点编号
*/
publicBranchgetBranch(intid);
/**
*查找指定的省份和城市的所有营业网点
*@paramprovince省份
*@paramcity城市
*@return满足条件的营业网点的集合
*/
publicSetgetAllBranch(Stringprovince,Stringcity);
/**
*向底层数据中添加一个营业网点。
*@parambranch要添加的营业网点对象
*@return返回该营业网点的编号。
*/
publicintaddBranch(Branchbranch);
/**
*根据指定的营业网点的名称在底层数据源中删除该营业网点。
*@paramname营业网点名称
*@return若删除成功返回true,否则返回false。
*/
publicbooleanremoveBranch(Stringname);
/**
*根据指定的营业网点的编号在底层数据源中删除该营业网点。
*@paramid营业网点编号
*@return若删除成功返回true,否则返回false。
*/
publicbooleanremoveBranch(intid);
}
4)TicketOrderDAO:
packagecom.xie.abs.dao;
importjava.util.Set;
importjava.util.Calendar;
importcom.xie.abs.model.*;
/**
*机票出票记录访问接口
*
*/
publicinterfaceTicketOrderDAO{
/**
*执行出票的操作。
*@paramord订单对象
*@return若出票成功返回true,否则返回false。
*/
publicbooleanorder(TicketOrderord);
/**
*执行退票操作。
*@paramTicketNumber机票编号
*@return退票成功返回true,否则返回false。
*/
publicbooleancancelOrder(intTicketNumber);
/**
*查询指定营业网点在指定时间段内的出票记录
*@parambranch营业网点
*@paramstartDate开始日期
*@paramendDate结束日期
*@return满足条件的出票记录集合
*/
publicSetgetAllTicketOrder(Branchbranch,CalendarstartDate,Calendar
endDate);
/**
*查询指定营业员在指定时间段内的出票记录
*@paramsales营业员
*@paramstartDate开始日期
*@paramendDate结束日期
*@return满足条件的出票记录集合
*/
publicSetgetAllTicketOrder(Salessales,CalendarstartDate,Calendar
endDate);
/**
*得到指定营业网点指定日期内的营业额。
*@parambranch营业网点
*@paramstartDate开始日期
*@paramendDate结束日期
*@return营业额
*/
publicdoublegetAllTicketMoney(Branchbranch,CalendarstartDate,CalendarendDate);
/**
*得到指定营业员指定日期内的营业额。
*@paramsales营业员
*@paramstartDate开始日期
*@paramendDate结束日期
*@return营业额
*/
publicdoublegetAllTicketMoney(Salessales,CalendarstartDate,CalendarendDate);
/**
*得到所有营业网点指定日期内的营业额
*@paramstartDate开始日期
*@paramendDate结束日期
*@return营业额
*/
publicdoublegetAllTicketMoney(CalendarstartDate,CalendarendDate);
}
4,主要工作流程:
客户端启动
出票查询航班营业员登录修改密码
是否已查是否已登是否已登输入用户名/NONONO询出航班录录密码
YESYESYES
输入出发地/输入乘客信输入旧密码/目的地/出发数据有效NO息新密码日期性验证
YES数据有效数据有效NONO数据有效NO性验证性验证性验证
封装RequestYESYESYES
对象
将Request对
象写往服务
器端
登录请求调用分拣请求SalesDao
修改
调用密码分拣请求SalesDao请求
航班查
调用询请求分拣请求FlightDao
出票请求调用分拣请求
FlightDao
解析Response对将Response对象封装Response象,将结果显写往客户端对象示在客户端
详细设计:
1,各功能模块设计
2,系统配置
3,代码框架
4,
代码框架:
,,,,
附录I:
国内通航机场名及代码表
北京北京PEK首都
上海SHA虹桥上海PVG浦东
重庆重庆CKG江北天津天津TSN滨海
石家庄SJW正定河北秦皇岛SHP山海关
太原TYN武宿山西常治CIH
运城YCU
呼和浩特HET白塔
包头BAV包头内蒙古海拉尔HLD东山
锡林浩特XIL
长春CGQ大房身吉林吉林JIL二台子
延吉YNJ
沈阳SHE桃仙
大连DLC周水子辽宁丹东DDG浪头
锦州JNZ锦州
朝阳CHG
哈尔滨HRB阎家岗
齐齐哈尔NDG三家子黑龙江加木斯JMU东郊
牡丹江MDG海浪
郑州CGO新郑河南洛阳LYA洛阳
南阳NNY姜营
杭州HGH萧山
宁波NGB