建立不同雇员对应的类后,下面实现不同雇员的工资结算和发送。
提取抽象
抽象一:雇员都要计算工资
抽象二:雇员都要在一定的时间点发工资
2.建立抽象基类
/**
* 抽象:发放薪水,在一定的时间发放
* @author
* @param <T>
*
*/
public abstract class PaymentMethod {
public abstract boolean execute(EmployeeBase employeeBase);//发放薪水
public abstract boolean isPayDay(Date date);//判断是否是发薪日
}
3.实现钟点工的薪水计算与发放
public class HourlyPaymentMethod extends PaymentMethod{
/**
* 计算小时工的工资
* @param hourlyEmployee
* @return
*/
private float pay(HourlyEmployee hourlyEmployee){
try {
float salary = 0;
List<TimeCard> timeCard = hourlyEmployee.getTimeCard();
if(SalaryUtils.isEmpty(timeCard)) return 0;
for(TimeCard tCard:timeCard){
Float hours = TimeCard.getWorkHourly(tCard.getStartTime(), tCard.getEndTime());
Float rate = hourlyEmployee.getHourlyRate();
if(hours<=8){
salary += hourlyEmployee.getHourlyRate()*hours;
}else{
salary += (float) ((hours-8)*rate*1.5+rate*8);
}
}
return salary;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
//按照工作小时计算,如果当日工作超过八小时则超过部分按照时薪的1.5倍支付,每周五发放
@Override
public boolean isPayDay(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int weekDay = calendar.get(Calendar.DAY_OF_WEEK);
if(weekDay-1==5) return true;
return false;
}
@Override
public boolean execute(EmployeeBase employeeBase) {
try {
Date date = new Date();
if(isPayDay(date)){
pay((HourlyEmployee) employeeBase);
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
4.实现销售人员的薪水发放
public class CommissionedPaymentMethod extends PaymentMethod{
@Override
public boolean execute(EmployeeBase employeeBase) {
CommissionedEmployee e = (CommissionedEmployee) employeeBase;
if(isPayDay(e.getLastPayday())){
pay(e);
}
return false;
}
/**
* param:date 上一次发薪时间
* 是否是发薪日
*/
@Override
public boolean isPayDay(Date date){
//当前日期
Date currentDate = new Date();
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(currentDate);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date);
long mils = calendar1.getTimeInMillis()-calendar2.getTimeInMillis();
int days = (int) (mils/(1000*60*60*24));
if(days==14) return true;
return false;
}
//计算销售人员的工资
private float pay(CommissionedEmployee commissionedEmployee){
//根据销售单据计算奖金
SaleReceipt saleReceipt = commissionedEmployee.getSaleReceipt();
float reward = getSaleReward(saleReceipt);
float salary = 0;
salary = commissionedEmployee.getMonthlSalary()+reward;
return salary;
}
//计算奖金
private float getSaleReward(SaleReceipt saleReceipt){
return 0;
}
}
5.实现完全领月薪的雇员工资结算
public class SalaryEmPaymentMethod extends PaymentMethod{
@Override
public boolean execute(EmployeeBase employeeBase) {
Date date = new Date();
if(isPayDay(date)){
pay((SalaryEmployee) employeeBase);
return true;
}
return false;
}
//发薪日
@Override
public boolean isPayDay(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int today = calendar.get(Calendar.DAY_OF_MONTH);
if(lastDay==today)
return true;
return false;
}
//计算工资
private float pay(SalaryEmployee salaryEmployee){
float salary = 0;
salary = salaryEmployee.getSalary();
return salary;
}
}
至此,三种雇员的工资计算方法实现完毕
6.总结
工资的结算与发放核心部分就是要找出公共部分,提取抽象。