在读《敏捷软件开发:原则,模式与实践》一书,针对其中的一个案例:雇员工资支付系统,书中是用c++实现的,现在根据自己的技术特点尝试使用java实现部分需求。
1.需求分析:
雇员分为:钟点工,销售人员和完全按照月薪结算的雇员。
钟点工的工资计算为:按照工作小时计算,如果当日工作超过八小时则超过部分按照时薪的1.5倍支付,每周五发放。
销售人员的工资是基本月薪+根据销售单据计算的奖金,工资=奖金+基本工资,每隔一周的周五发放。
完全按月计算工资的雇员:工资完全按月结算,每月最后一天发放。
2.实现:
-
雇员分类:钟点工(HourlyEmployee),销售人员(CommisedEmployee),完全按月发薪水雇员(SalaryEmployee)
提取公共信息,建立雇员基本信息类。
公共信息:雇员编号,地址,姓名
建立雇员基本信息类:
public class EmployeeBase { private Integer empId; private String empName; private String empAddress; //get set method }
建立不同雇员对应的类:
/** * 钟点工个 * @author * */ public class HourlyEmployee extends EmployeeBase{ private Integer workHours;//工作时间 private List<TimeCard> timeCard;//钟点工对应的打卡记录 private Float hourlyRate;//每小时对应的工资 }
import java.util.Calendar; import java.util.Date; public class TimeCard { private Date startTime;//上班时间 private Date endTime;//下班时间 public Date getStartTime() { return startTime; } public void setStartTime(Date startTime) { this.startTime = startTime; } public Date getEndTime() { return endTime; } public void setEndTime(Date endTime) { this.endTime = endTime; } //计算钟点工的工作时间 public static float getWorkHourly(Date startTime,Date endTime){ Calendar c1 = Calendar.getInstance(); c1.setTime(startTime); Calendar c2 = Calendar.getInstance(); c2.setTime(endTime); Long millis = c2.getTimeInMillis() - c1.getTimeInMillis(); float dayMillis = 1000*60*60; float hours = millis/dayMillis; DecimalFormat decimalFormat=new DecimalFormat(".0"); return Float.valueOf(decimalFormat.format(hours)); }
/** * 销售人员 * @author archermind * */ public class CommissionedEmployee extends EmployeeBase{ private Float monthlSalary;//基本工资 //销售人员需要根据销售凭条计算奖金,所以还需要建立一个SaleReceipt类计算奖金 private SaleReceipt saleReceipt;//销售凭条 private Date lastPayday; public Date getLastPayday() { return lastPayday; } public void setLastPayday(Date lastPayday) { this.lastPayday = lastPayday; } public Float getMonthlSalary() { return monthlSalary; } public void setMonthlSalary(Float monthlSalary) { this.monthlSalary = monthlSalary; } public SaleReceipt getSaleReceipt() { return saleReceipt; } public void setSaleReceipt(SaleReceipt saleReceipt) { this.saleReceipt = saleReceipt; }
/** * 完全领月薪雇员 * @author * */ public class SalaryEmployee extends EmployeeBase{ private Float salary; public Float getSalary() { return salary; } public void setSalary(Float salary) { this.salary = salary; } }
3.不同的雇员信息类建立完毕,后面继续实现雇员工资的计算。