任务F:工时统计
这家传统的贸易公司采取的是时薪制,也就是按小时计算工资,普通员工的每小时薪资按 50 来算;管理者的时薪按 80 来算。目前公司的考勤规则是这样的:
考勤规则说明:
-
提前打卡:可以计入有效工时,例如:8:40 打卡,那么 8:40 至 9:00 之间的 20 分钟可以计入有效工时。但提前打卡最多只能提前 30 分钟,例如 8:20 打卡,计入有效工时的部分只能是 8:30~9:00 之间的半小时;
-
滞后打卡:可以计入有效工时,例如:12:20 打卡,那么 12:00 至 12:20 之间的20 分钟可以计入有效工时。但滞后打卡最多只能滞后 30 分钟,例如 12:40 打卡,计入有效工时的部分只能是 12:00~12:30 之间的半小时;
-
迟到遵从下列规则:
a) 5 分钟内不算迟到;
b) 5~10 分钟:扣除 1 小时的时薪;
c) 10~30 分钟:扣除 2 小时时薪;
d) 30 分钟以上:扣除 4 小时时薪(封顶)。 -
早退遵从下列规则:
a) 5 分钟内不算早退;
b) 5~10 分钟:扣除 1 小时的时薪;
c) 10~30 分钟:扣除 2 小时时薪;
d) 30 分钟以上:扣除 4 小时时薪(封顶)。 -
加班规则:仅计入 20:00~22:00 之间的有效工时,无论提前或滞后都无效。例如 19:30~22:30,那么只计算 20:00~22:00 之间的工时;例如 20:10~21:50,
那么也仅计入这段时间内的有效工时。
上班 | 扣钱 | 下班 | 扣钱 |
---|---|---|---|
8.30前 | 30分钟加班 | 11.30前 | -4 |
8.30-9.00 | 加班 | 11.30-11.50 | -2 |
9.00-9.05 | 0 | 11.50-11.55 | -1 |
9.05-9.10 | -1 | 11.55-12.00 | 0 |
9.10-9.30 | -2 | 12.00-12.30 | 加班 |
9.30后 | -4 | 12.30 以后 | 30分钟加班 |
————————— | ————————— | ————————— | ————————— |
13.00前 | 30加班 | 18.前 | -4 |
13.00-13.30 | 加班 | 18.00-18.20 | -2 |
13.30-13.35 | 0 | 18.20-18.25 | -1 |
13.35-13.40 | -1 | 18.25-18.30 | 0 |
13.40-14.00 | -2 | 18.30-19. | 加班 |
14.后 | -4 | 19.以后 | 30分钟加班 |
————————— | ————————— | ————————— | ————————— |
20.00-22.00 | 这段时间内才算有效 | ||
请依据提供的《C4 基础-工时统计-原始数据.xlsx》,统计出当日每位员工应发放的薪资及当日薪资总计,并将数据保存到数据库中,并且能通过浏览器显示和分析。展示出来的数据格式如下图所示(仅示例,非真实结果):
功能要求:
将 Excel 表格上传到后台并使用 Servlet/JSP/JSTL 展示结果;
使用 Maven 完成依赖管理和编译构建;
每日薪资数据及统计需保存到 MySQL 数据库;
统计结果需要排序后显示(同时标识出前三名)。
实现思路:
使用第三方库(如 POI)读入 Excel 数据;
将日期计算封装成工具类。
答:
解答思路:
- 定义一个
User
类,里面存储了用户的各种信息,包括姓名、岗位、原始工作时间、有效工时、应得薪资,以及对应的getter
和setter
;- 创建一个
UserDAO
类,类中实现对所得数据进行操作的方法,包括排序展示、增、查;- 用 POI 读入 Excel 数据;
- 调用
UserDAO
里的各种方法,计算出各个员工的有效工时、应得薪资,并赋值给对象里的相应变量;- 将读取到的数据用
UserDAO
数据库中add
方法添加至数据库;- 访问 list.jsp 时,调用
UserDAO
类的list
方法,展示用户数据至浏览器。
关于各个类的具体功能,就写在类前的注释里。这里暂时先不写了。
1. User 类
import java.util.Date;
/**
* @author: xxm
* @Date: 2021/11/26 20:11
* Employer 类,里面储存了的各种信息
* 包括:
* 员工个人信息:姓名、岗位
* 员工的原始数据:早中晚的上下班打卡时间,共 6 个,命名方式为: 时间段 + 上/下班时间
* 员工的有效工时:分早中晚 3 个时间端,一共 6 个,命名方式为: 时间段 + 有效时间
* 员工的总有效工时
* 员工的应得薪水
*/
public class User {
/**
* 个人信息部分
*/
String name;
String post;
/**
* 上下班时间部分
*/
Date morningToWorkTime;
Date morningOffWorkTime;
Date afternoonToWorkTime;
Date afternoonOffWorkTime;
Date nightToWorkTime;
Date nightOffWorkTime;
/**
* 有效工时部分
*/
long morningEffectiveWorkTime;
long afternoonEffectiveWorkTime;
long nightEffectiveWorkTime;
long totalEffectiveWorkTime;
/**
* 应得薪酬
*/
int wage;
}
2. 添加 POI 依赖
在 pom.xml
文件中添加以下代码
<!--POI 依赖-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
3. User 类
import java.math.BigDecimal;
import java.util.Date;
/**
* @author: xxm
* @Date: 2021/11/26 20:11
* Employer 类,里面储存了的各种信息
* 包括:
* 员工个人信息:姓名、岗位
* 员工的原始数据:早中晚的上下班打卡时间,共 6 个,命名方式为: 时间段 + 上/下班时间
* 员工的有效工时:分早中晚 3 个时间端,一共 6 个,命名方式为: 时间段 + 有效时间
* 员工的总有效工时
* 员工的应得薪水
* 各个字段的 getter 和 setter
*/
public class User {
/**
* 个人信息部分
*/
String name;
String post;
/**
* 上下班时间部分
*/
Date morningToWorkTime;
Date morningOffWorkTime;
Date afternoonToWorkTime;
Date afternoonOffWorkTime;
Date nightToWorkTime;
Date nightOffWorkTime;
/**
* 有效工时部分
*/
double morningEffectiveWorkTime;
double afternoonEffectiveWorkTime;
double nightEffectiveWorkTime;
double totalEffectiveWorkTime;
/**
* 应得薪酬
*/
double wage;
/**
* 薪资排名
*/
String rank;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPost() {
return post;
}
public void setPost(String post) {
this.post = post;
}
public Date getMorningToWorkTime() {
return morningToWorkTime;
}
public void setMorningToWorkTime(Date morningToWorkTime) {
this.morningToWorkTime = morningToWorkTime;
}
public Date getMorningOffWorkTime() {
return morningOffWorkTime;
}
public void setMorningOffWorkTime(Date morningOffWorkTime) {
this.morningOffWorkTime = morningOffWorkTime;
}
public Date getAfternoonToWorkTime() {
return afternoonToWorkTime;
}
public void setAfternoonToWorkTime(Date afternoonToWorkTime) {
this.afternoonToWorkTime = afternoonToWorkTime;
}
public Date getAfternoonOffWorkTime() {
return afternoonOffWorkTime;
}
public void setAfternoonOffWorkTime(Date afternoonOffWorkTime) {
this.afternoonOffWorkTime = afternoonOffWorkTime;
}
public Date getNightToWorkTime() {
return nightToWorkTime;
}
public void setNightToWorkTime(Date nightToWorkTime) {
this.nightToWorkTime = nightToWorkTime;
}
public Date getNightOffWorkTime() {
return nightOffWorkTime;
}
public void setNightOffWorkTime(Date nightOffWorkTime) {
this.nightOffWorkTime = nightOffWorkTime;
}
public double getMorningEffectiveWorkTime() {
return morningEffectiveWorkTime;
}
public void setMorningEffectiveWorkTime(double morningEffectiveWorkTime) {
this.morningEffectiveWorkTime = morningEffectiveWorkTime;
}
public double getAfternoonEffectiveWorkTime() {
return afternoonEffectiveWorkTime;
}
public void setAfternoonEffectiveWorkTime(double afternoonEffectiveWorkTime) {
this.afternoonEffectiveWorkTime = afternoonEffectiveWorkTime;
}
public double getNightEffectiveWorkTime() {
return nightEffectiveWorkTime;
}
public void setNightEffectiveWorkTime(double nightEffectiveWorkTime) {
this.nightEffectiveWorkTime = nightEffectiveWorkTime;
}
public double getTotalEffectiveWorkTime() {
return totalEffectiveWorkTime;
}
public void setTotalEffectiveWorkTime(double totalEffectiveWorkTime) {
this.totalEffectiveWorkTime = totalEffectiveWorkTime;
}
public double getWage() {
return wage;
}
public void setWage(double wage) {
this.wage = wage;
}
public String getRank() {
return rank;
}
public void setRank(String rank) {
this.rank = rank;
}
}
4. UserDAO 类
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi