任务 F :工时统计

任务F:工时统计

这家传统的贸易公司采取的是时薪制,也就是按小时计算工资,普通员工的每小时薪资按 50 来算;管理者的时薪按 80 来算。目前公司的考勤规则是这样的:

image-20211126182516253

考勤规则说明:

  1. 提前打卡:可以计入有效工时,例如:8:40 打卡,那么 8:40 至 9:00 之间的 20 分钟可以计入有效工时。但提前打卡最多只能提前 30 分钟,例如 8:20 打卡,计入有效工时的部分只能是 8:30~9:00 之间的半小时;

  2. 滞后打卡:可以计入有效工时,例如:12:20 打卡,那么 12:00 至 12:20 之间的20 分钟可以计入有效工时。但滞后打卡最多只能滞后 30 分钟,例如 12:40 打卡,计入有效工时的部分只能是 12:00~12:30 之间的半小时;

  3. 迟到遵从下列规则:

    a) 5 分钟内不算迟到;

    b) 5~10 分钟:扣除 1 小时的时薪;
    c) 10~30 分钟:扣除 2 小时时薪;
    d) 30 分钟以上:扣除 4 小时时薪(封顶)。

  4. 早退遵从下列规则:
    a) 5 分钟内不算早退;
    b) 5~10 分钟:扣除 1 小时的时薪;
    c) 10~30 分钟:扣除 2 小时时薪;
    d) 30 分钟以上:扣除 4 小时时薪(封顶)。

  5. 加班规则:仅计入 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》,统计出当日每位员工应发放的薪资及当日薪资总计,并将数据保存到数据库中,并且能通过浏览器显示和分析。展示出来的数据格式如下图所示(仅示例,非真实结果):

image-20211126203324002

功能要求:
将 Excel 表格上传到后台并使用 Servlet/JSP/JSTL 展示结果;
使用 Maven 完成依赖管理和编译构建;
每日薪资数据及统计需保存到 MySQL 数据库;
统计结果需要排序后显示(同时标识出前三名)。

实现思路:

使用第三方库(如 POI)读入 Excel 数据;
将日期计算封装成工具类。

答:

解答思路:

  1. 定义一个 User 类,里面存储了用户的各种信息,包括姓名、岗位、原始工作时间、有效工时、应得薪资,以及对应的 gettersetter
  2. 创建一个 UserDAO 类,类中实现对所得数据进行操作的方法,包括排序展示、增、查;
  3. 用 POI 读入 Excel 数据;
  4. 调用 UserDAO 里的各种方法,计算出各个员工的有效工时、应得薪资,并赋值给对象里的相应变量;
  5. 将读取到的数据用 UserDAO 数据库中add方法添加至数据库;
  6. 访问 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值