package homework.taxibilling.service.impl;
import static homework.taxibilling.exceptions.TaxiBillingException.*;
import static homework.taxibilling.contants.TaxiRegionTypeEnum.*;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import homework.taxibilling.dao.SimulateDao;
import homework.taxibilling.po.FeeRule;
import homework.taxibilling.po.Taxi;
import homework.taxibilling.service.Billing;
import homework.taxibilling.util.TimeOperatUtil;
public class TaxiBilling implements Billing {
private Date nowTime ;
private Logger logger = LoggerFactory.getLogger(this.getClass());
//模拟去数据库读计费规则
private SimulateDao dao = new SimulateDao();
private Taxi taxi;
public Date getNowTime() {
return nowTime;
}
//该方法用于测试白天黑夜用
public void setNowTime(Date nowTime) {
this.nowTime = nowTime;
}
public TaxiBilling(Taxi taxi) {
this.taxi = taxi;
init();
}
/**
* 计费算法
* 入参:出租车实例、行驶总距离
* 出参:计费结果
*/
public double billing(Taxi taxi,double totalDistance) {
// logger.info("---------------------------------------开始计费-----------------------------");
System.out.println("---------------------------------------开始计费-----------------------------");
/*
* 异常检查
*/
if(null == taxi){
throw TAXI_ISNULL_ERROR;
}
if(0.0d > totalDistance){
throw FEEDISTANCE_ISNEGATIVE_ERROR;
}
if(0.0d == totalDistance){
return 0.0d;
}
//判断计费开始时间
boolean isDaylight ;
if(null==nowTime){
isDaylight = TimeOperatUtil.isBelong();
}
else {
isDaylight = TimeOperatUtil.isBelong(nowTime);
}
// logger.info("---------------------------------------开始计费时间是否在白天: "+isDaylight);
System.out.println("---------------------------------------开始计费时间是否在白天: "+isDaylight);
//如果是白天
if(isDaylight){
//白天上车
return billingInDaylight(taxi,totalDistance);
}
else {
//夜间上车
return billingInNight(taxi,totalDistance);
}
}
private double billingInDaylight(Taxi taxi,double totalDistance){
FeeRule rule = taxi.getRule();
if(null == rule){
throw FEERULE_ISNULL_ERROR;
}
//计费总路程
int billingDistance = (int) Math.ceil(totalDistance);
//taxi是内环出租车
if(INNER_RING.equals(taxi.getRegion())){
// 起步价到终点
if(rule.getInitialMaxDistanceDaylight() >= billingDistance){
return rule.getInitialPriceDaylight();
}
//起步价距离至临界距离之间 到终点
else if ( (rule.getInitialMaxDistanceDaylight() < billingDistance) && (rule.getCriticalDistance() >= billingDistance) ) {
// 超出起步距离的费用
double exceedInitialFee = rule.getUnitPriceDaylight() * (billingDistance - rule.getInitialMaxDistanceDaylight());
System.out.println("超出起步距离的费用: "+exceedInitialFee);
//返回起步距离费用+超出费用
return rule.getInitialPriceDaylight()+exceedInitialFee;
}
//超出临界距离 才到终点
else {
//超出部分:起步距离至临界距离之间 的费用
double exceedBetweenInitialAndCriticalFee = rule.getUnitPriceDaylight() * (rule.getCriticalDistance()-rule.getInitialMaxDistanceDaylight());
System.out.println("超出起步距离的费用: "+exceedBetweenInitialAndCriticalFee);
//超出部分:超出临界距离 的费用
double exceedCriticalFee = rule.getUnitPriceCriticalDaylight() * (billingDistance - rule.getCriticalDistance());
System.out.println("超出临界距离 的费用: "+exceedCriticalFee);
//返回各部分之和
return rule.getInitialPriceDaylight()+exceedBetweenInitialAndCriticalFee+exceedCriticalFee;
}
}
//外环出租车
else {
// 起步价到终点
if (rule.getInitialMaxDistanceDaylight() >= billingDistance) {
return rule.getInitialPriceDaylight();
}
//外环的出租车10公里之外的价格与10公里之内相同
else{
// 超出起步距离的费用
double exceedInitialFee = rule.getUnitPriceDaylight() * (billingDistance - rule.getInitialMaxDistanceDaylight());
System.out.println("超出起步距离的费用: "+exceedInitialFee);
//返回起步距离费用+超出费用
return rule.getInitialPriceDaylight()+exceedInitialFee;
}
}
}
private double billingInNight(Taxi taxi,double totalDistance){
FeeRule rule = taxi.getRule();
if(null == rule){
throw FEERULE_ISNULL_ERROR;
}
//计费总路程
int billingDistance = (int) Math.ceil(totalDistance);
// taxi是内环出租车
if (INNER_RING.equals(taxi.getRegion())) {
// 起步价到终点
if(rule.getInitialMaxDistanceNight() >= billingDistance){
return rule.getInitialPriceNight();
}
//起步价距离至临界距离之间 到终点
else if ( (rule.getInitialMaxDistanceNight() < billingDistance) && (rule.getCriticalDistance() >= billingDistance) ) {
// 超出起步距离的费用
double exceedInitialFee = rule.getUnitPriceNight() * (billingDistance - rule.getInitialMaxDistanceNight());
System.out.println("超出起步距离的费用: "+exceedInitialFee);
//返回起步距离费用+超出费用
return rule.getInitialPriceNight()+exceedInitialFee;
}
//超出临界距离 才到终点
else {
//超出部分:起步距离至临界距离之间 的费用
double exceedBetweenInitialAndCriticalFee = rule.getUnitPriceNight() * (rule.getCriticalDistance()-rule.getInitialMaxDistanceNight());
System.out.println("超出起步距离的费用: "+exceedBetweenInitialAndCriticalFee);
//超出部分:超出临界距离 的费用
double exceedCriticalFee = rule.getUnitPriceCriticalNight() * (billingDistance - rule.getCriticalDistance());
System.out.println("超出临界距离 的费用: "+exceedCriticalFee);
//返回各部分之和
return rule.getInitialPriceNight()+exceedBetweenInitialAndCriticalFee+exceedCriticalFee;
}
}
// 外环出租车
else {
// 起步价到终点
if (rule.getInitialMaxDistanceNight() >= billingDistance) {
return rule.getInitialPriceNight();
}
// 外环的出租车10公里之外的价格与10公里之内相同
else {
// 超出起步距离的费用
double exceedInitialFee = rule.getUnitPriceNight() * (billingDistance - rule.getInitialMaxDistanceNight());
System.out.println("超出起步距离的费用: "+exceedInitialFee);
// 返回起步距离费用+超出费用
return rule.getInitialPriceNight() + exceedInitialFee;
}
}
}
/*
* taxi和rule的初始化
*/
private void init() {
/*
* 异常检查
*/
if(null == taxi){
throw TAXI_ISNULL_ERROR;
}
if (null == taxi.getRegion()) {
throw TAXI_REGION_VALUE_ERROR;
}
// logger.info("----------------------------根据taxi内外环属性,初始化计费规则------------------------");
System.out.println("----------------------------根据taxi内外环属性: "+taxi.getRegion().getDesc() +",初始化计费规则------------------------");
FeeRule rules = new FeeRule();
rules = dao.getContentFromDatabase(taxi.getRegion().getValue());
checkRules(rules);
// logger.info("----------------------------计费规则为: "+rules);
System.out.println("----------------------------计费规则为: "+rules);
if (null == rules) {
throw FEERULE_ISNULL_ERROR;
}
taxi.setRule(rules);
}
private void checkRules(FeeRule rule){
/*
* 数据异常检查
*/
if((rule.getCriticalDistance() <= rule.getInitialMaxDistanceDaylight()) ||(rule.getCriticalDistance() <= rule.getInitialMaxDistanceNight()) ){
throw CRITICALE_DISTANCE_ERROR;
}
if( (rule.getCriticalDistance() < 0) ||
(rule.getInitialMaxDistanceDaylight() < 0) ||
(rule.getInitialMaxDistanceNight() < 0) ||
(rule.getInitialPriceDaylight() < 0.0d) ||
(rule.getInitialPriceNight() < 0.0d) ||
(rule.getUnitPriceCri
没有合适的资源?快使用搜索试试~ 我知道了~
出租车计费功能(java版解决方法)某大型互联网公司面试题,还附送测试代码哦
共43个文件
class:14个
java:11个
prefs:6个
5星 · 超过95%的资源 需积分: 47 67 下载量 24 浏览量
2017-09-14
13:45:54
上传
评论 2
收藏 47KB ZIP 举报
温馨提示
出租车起步价14元,含3公里 起步价之后,每公里2.5元 晚上11点之后(含),次日6点前(不含)起步价18元,含3公里。计价以上车时间为准,不考虑乘坐期间从白天到晚上的情况。 晚上起步价之后,每公里3元 10公里之后,白天每公里3.5元,晚上每公里4.7元 外环的出租车10公里之外的价格与10公里之内相同。外环与内环是出租车的属性,也就是说一辆外环的出租车在内环拉了客人,并行使到了外环,整段旅程都是外环的计费策略。
资源推荐
资源详情
资源评论
收起资源包目录
taxi-billing.zip (43个子文件)
taxi-billing
.project 541B
src
test
java
homework
taxibilling
test
TestTaxiBilling.java 3KB
main
java
homework
taxibilling
service
Billing.java 159B
impl
TaxiBilling.java 8KB
contants
TaxiRegionTypeEnum.java 2KB
TaxiBillRuleConstants.java 2KB
exceptions
TaxiBillingException.java 2KB
dao
SimulateDao.java 2KB
util
TraceThreadPoolExecutor.java 1KB
TimeOperatUtil.java 2KB
po
FeeRule.java 3KB
Taxi.java 774B
target
classes
homework
taxibilling
service
impl
TaxiBilling.class 5KB
Billing.class 179B
contants
TaxiRegionTypeEnum.class 3KB
TaxiBillRuleConstants.class 1KB
exceptions
TaxiBillingException.class 2KB
dao
SimulateDao.class 1KB
util
TimeOperatUtil.class 2KB
TraceThreadPoolExecutor.class 2KB
TraceThreadPoolExecutor$1.class 1KB
po
FeeRule.class 3KB
Taxi.class 1KB
META-INF
MANIFEST.MF 2KB
maven
homework.taxibilling
taxi-billing
pom.properties 241B
pom.xml 3KB
test-classes
homework
taxibilling
test
TestTaxiBilling.class 3KB
.settings
org.eclipse.m2e.core.prefs 86B
org.eclipse.jdt.core.prefs 652B
org.eclipse.core.resources.prefs 115B
pom.xml 3KB
.classpath 827B
homework-parent
.project 544B
target
classes
homework
parent
App.class 545B
META-INF
MANIFEST.MF 104B
maven
homework.parent
homework-parent
pom.properties 245B
pom.xml 769B
test-classes
homework
parent
AppTest.class 617B
.settings
org.eclipse.m2e.core.prefs 86B
org.eclipse.jdt.core.prefs 652B
org.eclipse.core.resources.prefs 55B
pom.xml 11KB
.classpath 378B
共 43 条
- 1
资源评论
- wangpengbo902019-11-19学习范本逻辑清晰,不过不适合大型互联网公司面试回答
- 狸超2017-09-21还可以吧,值得学习
- afish丶2021-01-14功能实现无误,逻辑清晰。但是不合适作为面试答案,已经重构一版本基于策略模式https://download.csdn.net/download/HmmmRain/14026470
j75678452
- 粉丝: 2
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 数据库课程设计-基于的个性化购物平台的建表语句.sql
- 数据库课程设计-基于的图书智能一体化管理系统的建表语句.sql
- Java 代码覆盖率库.zip
- Java 代码和算法的存储库 也为该存储库加注星标 .zip
- 免安装Windows10/Windows11系统截图工具,无需安装第三方截图工具 双击直接使用截图即可 是一款免费可靠的截图小工具哦~
- Libero Soc v11.9的安装以及证书的获取(2021新版).zip
- BouncyCastle.Cryptography.dll
- 5.1 孤立奇点(JD).ppt
- 基于51单片机的智能交通灯控制系统的设计与实现源码+报告(高分项目)
- 什么是 SQL 注入.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功