《CSDN实训》工时统计(未完)

导读:本篇文章讲解 《CSDN实训》工时统计(未完),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

首先说一下思路,一开始我们有一个表格,我们需要学会使用poi导入表格查看数据,我们还是使用分层思想,要分成起码的dao,service和controller三层:

请添加图片描述

然后我们的dao层同样是去获取数据,只不过之前是从数据库中获取数据返回,这里是从Excel中获取数据返回

这里在dao层写一个双层for循环,外面的循环是用来先循环行,然后第二个循环开始循环列,取第一列到最后一列的数据然后通过一个switch case去一个一个给User对象赋值最后返回

po层:

package com.ftz.demo.po;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;

/**
 * @author ${范涛之}
 * @Description
 * @create 2021-12-11 14:00
 */

@Getter
@Setter
public class User {
    /**
     * 用户信息
     */
    String username;
    String post;

    /**
     * 早中晚工作时间
     */
    Date mortimebegin;
    Date mortimeoff;

    Date afttimebegin;
    Date afttimeoff;

    Date nigtimebegin;
    Date nigtimeoff;

    /**
     * 早中晚有效工时
     */
    double morrealtime;
    double aftrealtime;
    double nigrealtime;

    double totalEffectiveWorkTime;

    /**
     * 薪资
     */
    double wage;

    /**
     * 薪资排名
     */
    String rank;

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("User{");
        sb.append("username='").append(username).append('\'');
        sb.append(", post='").append(post).append('\'');
        sb.append(", mortimebegin=").append(mortimebegin);
        sb.append(", mortimeoff=").append(mortimeoff);
        sb.append(", afttimebegin=").append(afttimebegin);
        sb.append(", afttimeoff=").append(afttimeoff);
        sb.append(", nigtimebegin=").append(nigtimebegin);
        sb.append(", nigtimeoff=").append(nigtimeoff);
        sb.append(", morrealtime=").append(morrealtime);
        sb.append(", aftrealtime=").append(aftrealtime);
        sb.append(", nigrealtime=").append(nigrealtime);
        sb.append(", totalEffectiveWorkTime=").append(totalEffectiveWorkTime);
        sb.append(", wage=").append(wage);
        sb.append(", rank='").append(rank).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

这里插入一个出现的bug,那就是在实体类中如果涉及到Data类型最好不要用Lombok插件,更不要导入Lombok插件的Data,否则会在后续报错:

在这里插入图片描述

dao层获取数据方法的代码:

  /**
     * 方法 1:
     * readExcel 方法,其功能为接受一个传入的字符串(路径),并将其数据存储到 User 数组中,然后将这个数组返回。
     */
    public List<User> readExcel(String path) throws  Exception{
        List<User> users = new ArrayList<User>();
        // 获取工作普
        XSSFWorkbook workbook = new XSSFWorkbook(path);
        // 获取工作表
        XSSFSheet sheet = workbook.getSheetAt(0);
        // 获取总行
        int rowNumber = sheet.getLastRowNum();
        System.out.println("总行数是"+rowNumber);

        // 获取单元格
        for (int i = 2; i <rowNumber; i++) {
            XSSFRow row = sheet.getRow(i);
            int cellNum = row.getLastCellNum(); //获取总共列
            // 获取单元格内容
            User user = new User();
            for (int j = 0; j <cellNum; j++) {
                Cell cell = row.getCell(j);
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
                switch (j) {
                    //姓名
                    case 0:
                        String name = cell.getStringCellValue();
                        user.setUsername(name);
                        break;
                    //岗位
                    case 1:
                        String post = cell.getStringCellValue();
                        user.setPost(post);
                        break;

                    //上午
                    case 2:
                        String m1 = cell.getStringCellValue();
                        Date dateM1 = sdf.parse(m1);
                        user.setMortimebegin(dateM1);
                        break;
                    case 3:
                        String m2 = cell.getStringCellValue();
                        Date dateM2 = sdf.parse(m2);
                        user.setMortimeoff(dateM2);
                        break;

                    //下午
                    case 4:
                        String a1 = cell.getStringCellValue();
                        Date dateA1 = sdf.parse(a1);
                        user.setAfttimebegin(dateA1);
                        break;
                    case 5:
                        String a2 = cell.getStringCellValue();
                        Date dateA2 = sdf.parse(a2);
                        user.setAfttimeoff(dateA2);
                        break;

                    //晚上
                    case 6:
                        String n1 = cell.getStringCellValue();
                        Date dateN1 = sdf.parse(n1);
                        user.setNigtimebegin(dateN1);
                        break;
                    case 7:
                        String n2 = cell.getStringCellValue();
                        Date dateN2 = sdf.parse(n2);
                        user.setNigtimeoff(dateN2);
                        break;
                    default:
                        break;
                }
            }
            users.add(user);
        }
        System.out.println(users);

        return users;
    }

立马在controller层写一个测试:遍历输出:

package com.ftz.demo.controller;

import com.ftz.demo.dao.UserDao;
import com.ftz.demo.po.User;

import java.util.List;

/**
 * @author ${范涛之}
 * @Description
 * @create 2021-12-11 23:14
 */
public class UserController {

    public static void main(String[] args) throws Exception {
        UserDao userDao = new UserDao();
//   使用增强for循环
        List<User> users = userDao.readExcel("D:\\C桌面\\test\\test.xlsx");
        for(User attribute : users) {
            System.out.println(attribute);
        }

    }
}



// 使用迭代器

    Iterator iterator = users.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }


运行结果:

请添加图片描述

然后就去写第二个dao层的方法:算出每一个成员的有效工作时间:

首先我们要通过 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");将字符转转换为时间:

   /**
         * 上午的有效时间
         */
        //上午上班的几个时间点
        long t0830 = sdf.parse("8:30").getTime();
        long t0900 = sdf.parse("9:00").getTime();
        long t0905 = sdf.parse("9:05").getTime();
        long t0910 = sdf.parse("9:10").getTime();
        long t0930 = sdf.parse("9:30").getTime();
        //上午下班的几个时间点
        long t1130 = sdf.parse("11:30").getTime();
        long t1150 = sdf.parse("11:50").getTime();
        long t1155 = sdf.parse("11:55").getTime();
        long t1200 = sdf.parse("12:00").getTime();
        long t1230 = sdf.parse("12:30").getTime();

        //下午上班的几个时间点
        long t1300 = sdf.parse("13:00").getTime();
        long t1330 = sdf.parse("13:30").getTime();
        long t1335 = sdf.parse("13:35").getTime();
        long t1340 = sdf.parse("13:40").getTime();
        long t1400 = sdf.parse("14:00").getTime();

        //下午下班的几个时间点
        long t1800 = sdf.parse("18:00").getTime();
        long t1820 = sdf.parse("18:20").getTime();
        long t1825 = sdf.parse("18:25").getTime();
        long t1830 = sdf.parse("18:30").getTime();
        long t1900 = sdf.parse("19:00").getTime();

        //晚上加班的几个时间点
        long t2000 = sdf.parse("20:00").getTime();
        long t2200 = sdf.parse("22:00").getTime();

下面开始写判断语句:


    /**
     * 方法2:判断用户有效工作时长
     * @param users
     * @throws ParseException
     */
    public void  realWorkTime(List<User> users) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        /**
         * 上午的有效时间
         */
        //上午上班的几个时间点
        long t0830 = sdf.parse("8:30").getTime();
        long t0900 = sdf.parse("9:00").getTime();
        long t0905 = sdf.parse("9:05").getTime();
        long t0910 = sdf.parse("9:10").getTime();
        long t0930 = sdf.parse("9:30").getTime();
        //上午下班的几个时间点
        long t1130 = sdf.parse("11:30").getTime();
        long t1150 = sdf.parse("11:50").getTime();
        long t1155 = sdf.parse("11:55").getTime();
        long t1200 = sdf.parse("12:00").getTime();
        long t1230 = sdf.parse("12:30").getTime();

        //下午上班的几个时间点
        long t1300 = sdf.parse("13:00").getTime();
        long t1330 = sdf.parse("13:30").getTime();
        long t1335 = sdf.parse("13:35").getTime();
        long t1340 = sdf.parse("13:40").getTime();
        long t1400 = sdf.parse("14:00").getTime();

        //下午下班的几个时间点
        long t1800 = sdf.parse("18:00").getTime();
        long t1820 = sdf.parse("18:20").getTime();
        long t1825 = sdf.parse("18:25").getTime();
        long t1830 = sdf.parse("18:30").getTime();
        long t1900 = sdf.parse("19:00").getTime();

        //晚上加班的几个时间点
        long t2000 = sdf.parse("20:00").getTime();
        long t2200 = sdf.parse("22:00").getTime();

        for (User user :users){
            long morefftime = 0;   //早上额外工作的时间
            long atfefftime = 0;   //下午额外工作的时间
            long nigefftime = 0;   //晚上额外工作的时间

            long mtime1 = user.getMortimebegin().getTime();    //员工早上到达公司的时间
            long mtime2 = user.getMortimeoff().getTime();      //员工早上离开公司的时间

            long atime1 = user.getAfttimebegin().getTime();    //员工下午到达公司的时间
            long atime2 = user.getAfttimeoff().getTime();      //员工下午离开公司的时间

            long ntime1 = user.getNigtimebegin().getTime();    //员工晚上到达公司的时间
            long ntime2 = user.getNigtimeoff().getTime();     //员工晚上离开公司的时间


            /**
             * 上午打卡时间
             */
            if (t0830 - mtime1>=0){                                                   // 员工在8:30之前来到公司
                morefftime = 30*60*1000;
            }else if (t0900-mtime1>=0 || t0830-mtime1<=0){                             //员工在8:30-9:00之间来到公司
                morefftime = mtime1*60*1000;
            }else if (t0905-mtime1>=0 || t0900-mtime1<=0){                             //员工在9:00-9:05来到公司
                morefftime = 0;
            }else if (t0910-mtime1>=0 || t0905-mtime1<=0){                             //员工在9:05-9:10来到公司
                morefftime = -60*60*1000;
            }else if (t0930-mtime1>=0 || t0910-mtime1<=0){                              //员工在9:10-9:30来到公司
                morefftime = -60*60*1000*2;
            }else if (t0930-mtime1<=0){                                                //员工在9:30以后来到公司
                morefftime = -60*60*1000*4;
            }else if (mtime2-t1130<0){                                                 //员工在11:30之前离开公司
                morefftime = -60*60*1000*4;
            }else if (t1130-mtime2<0 || t1150-mtime2>0){                                //员工在11:30-11:50离开公司
                morefftime = -60*60*1000*4;
            }else if (t1150-mtime2<0 || t1155-mtime2>0){                                //员工在11:50-11:55离开公司
                morefftime = -60*60*1000;
            }else if (t1155-mtime2<0 || t1200-mtime2>0){                                //员工在11:55-12:00离开公司
                morefftime = 0;
            }else if (t1200-mtime2<0 || t1230-mtime2>0){                                //员工在12:00-12:30离开公司
                morefftime = (mtime2-t1200)*60*1000;
            }else if (t1230-mtime2<0){                                                   //员工在12:30以后离开公司
                morefftime = 30*60*1000;
            }
            /**
             * 下午打卡时间
             */
            else if (t1300 - atime1>=0){                                                // 员工在13:00之前来到公司
                morefftime = 30*60*1000;
            }else if (t1300-atime1>=0 || t1330-atime1<=0){                             //员工在13:00-13:30之间来到公司
                morefftime = mtime1*60*1000;
            }else if (t1330-atime1>=0 || t1335-atime1<=0){                             //员工在13:30-13:35来到公司
                morefftime = 0;
            }else if (t1335-atime1>=0 || t1340-atime1<=0){                             //员工在13:35-13:40来到公司
                morefftime = -60*60*1000;
            }else if (t1340-atime1>=0 || t1400-atime1<=0){                              //员工在13:40-14:00来到公司
                morefftime = -60*60*1000*2;
            }else if (t1400-atime1<=0){                                                //员工在14:00以后来到公司
                morefftime = -60*60*1000*4;
            }else if (atime2-t1800<0){                                                 //员工在18:00之前离开公司
                morefftime = -60*60*1000*4;
            }else if (t1800-atime2<0 || t1820-atime2>0){                                //员工在18:00-18:20离开公司
                morefftime = -60*60*1000*4;
            }else if (t1820-atime2<0 || t1825-atime2>0){                                //员工在18:20-18:25离开公司
                morefftime = -60*60*1000;
            }else if (t1825-atime2<0 || t1830-atime2>0){                                //员工在18:25-18:30离开公司
                morefftime = 0;
            }else if (t1830-atime2<0 || t1900-atime2>0){                                //员工在18:30-19:00离开公司
                morefftime = (atime2-t1200)*60*1000;
            }else if (t1900-atime2<0){                                                   //员工在19:00以后离开公司
                morefftime = 30*60*1000;
            }




        }


    }


未完…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81023.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!