diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/dao/AttSourceDataDao.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/dao/AttSourceDataDao.java index 5a3ad6c..ffef936 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/dao/AttSourceDataDao.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/dao/AttSourceDataDao.java @@ -72,7 +72,7 @@ public interface AttSourceDataDao { * 查询一个月的节假日 * @return list bean */ - List selectHolidayByMonth(@Param("pushDate")String pushDate, @Param("pushType")int pushType); + List selectHolidayByMonth(@Param("pushDate")String pushDate); /** * 查询人员的请假数据 @@ -156,4 +156,73 @@ public interface AttSourceDataDao { int getFirstAttendanceData(String date); void deleteAttMonthReport(String pushDate); + + /** + * 查询指定时间内存在考勤人员列表的日期 + * @param startDate + * @param days + * @return + */ + List getAttSettingDate(@Param("startDate") String startDate,@Param("days") int days); + + /** + * 查询历史某天应考勤人员 + * @param currentDay + * @return + */ + List getAttSettingHistoryDate(String currentDay); + + /** + * 将历史某天应考勤人员插入到考勤人员列表 + * @param attList + */ + void insertAttSettingHistoryData(List attList); + + /** + * 查询当天应考勤人员 + * @param pushDate + * @return + */ + List getAttPerson(String pushDate); + + void insertAttDataList(List listPerson); + + /** + * 查询当天考勤模版人员 + * @param pushDate + * @return + */ + List getAttDataPerson(String pushDate); + + /*** + * 查询当天考勤状态为未打卡人员(att_data) + * @param pushDate + * @return + */ + List getAttDataByStatus(@Param("pushDate") String pushDate,@Param("attType") String attType); + + /*** + * 查询当天考勤状态为未打卡人员(att_data_update) + * @param pushDate + * @return + */ + List getAttDataUpdateByStatus(@Param("pushDate") String pushDate,@Param("attType") String attType); + + /** + * 超过时间未打卡的补为旷工(att_data) + * @param list + */ + void updateAttDataList(List list); + /** + * 超过时间未打卡的补为旷工(att_data_update) + * @param list + */ + void updateAttDataUpdateList(List list); + + /** + * 当日是否为法假 + * @param pushDate + * @return + */ + List selectHolidayByDay(String pushDate); } diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttGroupBean.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttGroupBean.java index 57239db..5612dca 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttGroupBean.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttGroupBean.java @@ -115,6 +115,11 @@ public class AttGroupBean { */ private List treeList; + /** + * 是否有法定节假日 + */ + private Integer isHaveHoliday; + /** * 创建用户编号 */ diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttSourceDataBean.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttSourceDataBean.java index af4b1b1..65630ee 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttSourceDataBean.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttSourceDataBean.java @@ -52,6 +52,10 @@ public class AttSourceDataBean { * 打卡地址 */ private String attAddress; + /** + * 打卡省份 + */ + private String province; /** * 打卡经度 diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttendanceDetailsServiceImpl.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttendanceDetailsServiceImpl.java index 10fc9f4..c7dc696 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttendanceDetailsServiceImpl.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttendanceDetailsServiceImpl.java @@ -119,7 +119,7 @@ public class AttendanceDetailsServiceImpl implements AttendanceDetailsService { } // 使用增强的 for 循环遍历 Set for (String item : keys) { - List groupList = attTasks.getGroupData(item, 2); + List groupList = attTasks.getGroupData(item); attTasks.createReportData(groupList, item, 2); } } diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/tasks/AttTasks.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/tasks/AttTasks.java index d5eaa0d..3b5ae56 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/tasks/AttTasks.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/tasks/AttTasks.java @@ -73,7 +73,8 @@ public class AttTasks { /** * 历史考勤数据 */ - @Scheduled(initialDelay = 6000,fixedDelay = 60000 * 30) +// @Scheduled(initialDelay = 6000,fixedDelay = 60000 * 30) + @Scheduled(cron = "0 50 19 * * ?") @Async public void getHisAttTasks() { log.info("--------考勤定时器开启------"); @@ -81,7 +82,7 @@ public class AttTasks { return; // 如果任务已经执行过,直接返回 } executed = true; // 设置标志位,表示任务已经执行过 - String startDate = "2025-01-03"; + String startDate = "2025-01-01"; String endDate = "2025-01-31"; List dateList = getStrDateListBetween(startDate, endDate); // List dateList = new ArrayList<>(); @@ -140,7 +141,7 @@ public class AttTasks { executorService.submit(() -> { for (String date : batch) { try { -// delHisData(date); + delHisData(date); pushAttData(date, 2); } catch (Exception e) { // 记录异常并继续处理下一个日期 @@ -178,11 +179,11 @@ public class AttTasks { */ private void pushAttData(String pushDate, int pushType) { //获取黔送云的考勤数据 -// getQsyAttendanceData(pushDate, pushType); -// //获取考勤机中的考勤数据 -// getMachineAttendanceData(pushDate, pushType); + getQsyAttendanceData(pushDate, pushType); + //获取考勤机中的考勤数据 + getMachineAttendanceData(pushDate, pushType); // //查出每一个考勤组的应出勤天数以及考勤组的规则 - List groupList = getGroupData(pushDate, pushType); + List groupList = getGroupData(pushDate); // //新增默认考勤数据到考勤数据和修改表 insertAttData(groupList, pushDate, pushType); //更新请假数据 @@ -201,8 +202,14 @@ public class AttTasks { orElseGet(ArrayList::new); if (!attSourceList.isEmpty()) { attSourceList.forEach(c -> { - c.setAttAddress(AddressCoordinateFormatUtil. - coordinateToAddress(c.getAttLon(), c.getAttLat())); + String address; + try { + address = AddressCoordinateFormatUtil. + coordinateToAddress(c.getAttLon(), c.getAttLat()); + }catch (IllegalArgumentException e){ + address = "地址未转化成功"; + } + c.setAttAddress(address); if ("0".equals(c.getAttType())) { int i = checkTime(c.getAttCurrentTime()); c.setAttType(String.valueOf(i)); @@ -358,7 +365,6 @@ public class AttTasks { } else { tf = true; } - if (tf) { replaceHolidayData(toWorkBean, 0); replaceHolidayData(offWorkBean, 0); @@ -394,7 +400,7 @@ public class AttTasks { * * @return 考勤组集合 */ - public List getGroupData(String pushDate, int pushType) { + public List getGroupData(String pushDate) { //查出考勤组的数据 List groupList = Optional.ofNullable(attGroupDao.selectAttGroupList(new AttGroupBean())). orElseGet(ArrayList::new); @@ -402,7 +408,7 @@ public class AttTasks { return new ArrayList<>(); } //查询当月否有节假日或补班 - List holidays = attSourceDataDao.selectHolidayByMonth(pushDate, pushType); + List holidays = attSourceDataDao.selectHolidayByMonth(pushDate); groupList.forEach(c -> { //应考勤天 List attDayList = WorkdayCalculator.getWorkDay(c.getAttDay(), @@ -903,7 +909,7 @@ public class AttTasks { if (items.isEmpty()) { continue; // 如果列表为空,跳过 } -//五点之前的数据属于过来当天的下班打卡,不计入 + //五点之前的数据属于过来当天的下班打卡,不计入 LocalTime noonEnd = LocalTime.of(5, 0); // 获取上班时间并转换为 LocalTime 以便比较 LocalTime toWorkTime = LocalTime.parse(attGroupBean.getToWorkTime(), timeFormatter); @@ -1123,8 +1129,6 @@ public class AttTasks { date1 = DateUtils.parseDate(DateUtils.getAfterDate(DateUtils.getYyyyMmDd(attTime)) + " " + standardTime); } } - - if ("1".equals(attType)) { // 上班打卡 // 计算时间差 // 减 1 原因:30上班,30:59不算迟到,类似于默认可以迟到一分钟 diff --git a/bonus-modules/bonus-system/src/main/resources/mapper/att/AttGroupMapper.xml b/bonus-modules/bonus-system/src/main/resources/mapper/att/AttGroupMapper.xml index 3d2f0ce..5cb3251 100644 --- a/bonus-modules/bonus-system/src/main/resources/mapper/att/AttGroupMapper.xml +++ b/bonus-modules/bonus-system/src/main/resources/mapper/att/AttGroupMapper.xml @@ -8,7 +8,6 @@ select ags.*, ag.id as groupId, ag.group_name, ag.att_type from att_group ag left join att_group_setting ags on ags.group_id = ag.id and ags.is_active = 1 - left join att_group_person_relation agpr on agpr.group_id = ag.id and agpr.is_active = 1 where ag.is_active = 1 and ag.group_name = #{groupName} diff --git a/bonus-modules/bonus-system/src/main/resources/mapper/att/AttSourceDataMapper.xml b/bonus-modules/bonus-system/src/main/resources/mapper/att/AttSourceDataMapper.xml index 7639c0b..18b2263 100644 --- a/bonus-modules/bonus-system/src/main/resources/mapper/att/AttSourceDataMapper.xml +++ b/bonus-modules/bonus-system/src/main/resources/mapper/att/AttSourceDataMapper.xml @@ -7,10 +7,11 @@ replace into att_source_data(name, id_number, org_id, org_name, att_current_day, - att_current_time, att_type, att_address, att_lon, att_lat, data_source, remark) + att_current_time, att_type, att_address, province, att_lon, att_lat, data_source, remark) values (#{params.name}, #{params.idNumber}, #{params.orgId}, #{params.orgName}, #{params.attCurrentDay}, #{params.attCurrentTime}, #{params.attType}, - #{params.attAddress}, #{params.attLon}, #{params.attLat}, #{params.dataSource}, #{params.remark}) + #{params.attAddress}, #{province}, #{params.attLon}, #{params.attLat}, #{params.dataSource}, + #{params.remark}) @@ -37,7 +38,8 @@ values (#{params.userId}, #{params.userName}, #{params.orgId}, #{params.orgName}, #{params.attCurrentMonth}, #{params.requiredDays}, #{params.normalNum}, #{params.lateNum}, #{params.earlyNum}, #{params.skippingNum}, #{params.leaveNum}, - #{params.addressErrorNum}, #{params.einErrorNum}, #{params.restNum}, #{params.outNum}, #{params.businessTripNum}) + #{params.addressErrorNum}, #{params.einErrorNum}, #{params.restNum}, #{params.outNum}, + #{params.businessTripNum}) @@ -57,16 +59,33 @@ #{item.attAddress}) + + replace into att_setting_history(user_id, group_id, current_day) values + + (#{item.userId},#{item.groupId},#{item.currentDay}) + + + + + insert into att_data(user_id, att_current_day, att_status, att_type) + values + + (#{item.userId}, #{item.attCurrentDay}, #{item.attStatus}, #{item.attType}) + + ; + insert into att_data_update(user_id, att_current_day, att_status, att_type) + values + + (#{item.userId}, #{item.attCurrentDay}, #{item.attStatus}, #{item.attType}) + + ; + - - - - - update att_data set att_current_time = #{params.attCurrentTime}, - att_address = #{params.attAddress}, att_lon = #{params.attLon}, att_lat = #{params.attLat}, + att_address = #{params.attAddress}, province = #{params.province}, att_lon = #{params.attLon}, att_lat = + #{params.attLat}, data_source = #{params.dataSource}, error_remake = #{params.remark}, att_status = CASE @@ -75,11 +94,12 @@ where dict_type = 'att_status' and (is_leave = '1' or is_leave = '2') ) THEN att_status ELSE #{params.attStatus} END - where user_id = #{params.userId} and org_id = #{params.orgId} + where user_id = #{params.userId} AND att_current_day = #{params.attCurrentDay} and att_type = #{params.attType}; update att_data_update set att_current_time = #{params.attCurrentTime}, - att_address = #{params.attAddress}, att_lon = #{params.attLon}, att_lat = #{params.attLat}, + att_address = #{params.attAddress}, province = #{params.province}, att_lon = #{params.attLon}, att_lat = + #{params.attLat}, data_source = #{params.dataSource}, error_remake = #{params.remark}, att_status = CASE @@ -88,7 +108,7 @@ where dict_type = 'att_status' and (is_leave = '1' or is_leave = '2')) THEN att_status ELSE #{params.attStatus} END - where is_update = 0 and user_id = #{params.userId} and org_id = #{params.orgId} + where is_update = 0 and user_id = #{params.userId} and att_current_day = #{params.attCurrentDay} and att_type = #{params.attType} @@ -110,10 +130,31 @@ + + + update att_data set att_status = #{v.attStatus} + where user_id = #{v.userId} and att_current_day = #{v.attCurrentDay} + + and att_type = #{v.attType} + + + + + + update att_data_update set att_status = #{v.attStatus} + where is_update = 0 and user_id = #{v.userId} + and att_current_day = #{v.attCurrentDay} + + and att_type = #{v.attType} + + + + delete from att_source_data - where att_current_day = #{date} and data_source != 3; + where att_current_day = #{date} + and data_source != 3; update att_data set att_current_time = null, att_status = 0, @@ -133,7 +174,8 @@ delete from att_source_data - where att_current_day = #{date} and data_source != 3; + where att_current_day = #{date} + and data_source != 3; delete from att_data where att_current_day = #{date}; @@ -148,31 +190,34 @@ - + - SELECT - g.org_id, - v.user_id, - su.user_name, - so.org_name, - g.group_id, - DATE_FORMAT( att_current_day, '%Y-%m' ) AS attCurrentMonth, - IFNULL( sum( IF ( toWorkAttStatus = 1, 0.5, 0 )), 0 ) + IFNULL( sum( IF ( offWorkAttStatus = 1, 0.5, 0 )), 0 ) AS normalNum, - IFNULL( sum( IF ( toWorkAttStatus = 2, 0.5, 0 )), 0 ) + IFNULL( sum( IF ( offWorkAttStatus = 2, 0.5, 0 )), 0 ) AS lateNum, - IFNULL( sum( IF ( toWorkAttStatus = 3, 0.5, 0 )), 0 ) + IFNULL( sum( IF ( offWorkAttStatus = 3, 0.5, 0 )), 0 ) AS skippingNum, - IFNULL( sum( IF ( toWorkAttStatus = 4, 0.5, 0 )), 0 ) + IFNULL( sum( IF ( offWorkAttStatus = 4, 0.5, 0 )), 0 ) AS earlyNum, - IFNULL( sum( IF ( toWorkAttStatus = 5, 0.5, 0 )), 0 ) + IFNULL( sum( IF ( offWorkAttStatus = 5, 0.5, 0 )), 0 ) AS restNum, - sum( - IF - ( toWorkAttStatus IN ( SELECT dict_value FROM sys_dict_data WHERE dict_type = 'att_status' AND is_leave = '1' ), 0.5, 0 ))+ sum( - IF - ( offWorkAttStatus IN ( SELECT dict_value FROM sys_dict_data WHERE dict_type = 'att_status' AND is_leave = '1' ), 0.5, 0 )) AS leaveNum, - IFNULL( sum( IF ( toWorkAttStatus = 7, 0.5, 0 )), 0 ) + IFNULL( sum( IF ( offWorkAttStatus = 7, 0.5, 0 )), 0 ) AS outNum, - IFNULL( sum( IF ( toWorkAttStatus = 8, 0.5, 0 )), 0 ) + IFNULL( sum( IF ( offWorkAttStatus = 8, 0.5, 0 )), 0 ) AS einErrorNum, - IFNULL( sum( IF ( toWorkAttStatus = 9, 0.5, 0 )), 0 ) + IFNULL( sum( IF ( offWorkAttStatus = 9, 0.5, 0 )), 0 ) AS addressErrorNum, - IFNULL( sum( IF ( toWorkAttStatus = 10, 0.5, 0 )), 0 ) + IFNULL( sum( IF ( offWorkAttStatus = 10, 0.5, 0 )), 0 ) AS businessTripNum - FROM - v_att_update_data v - LEFT JOIN sys_user su ON su.user_id = v.user_id - LEFT JOIN ( - SELECT - * - FROM - ( SELECT DISTINCT * FROM att_setting_history WHERE DATE_FORMAT( current_day, '%Y-%m' ) = DATE_FORMAT(#{pushDate}, '%Y-%m' ) ORDER BY current_day DESC ) a - GROUP BY - user_id - ) g ON g.user_id = v.user_id - LEFT JOIN sys_organization so ON so.id = g.org_id - WHERE - DATE_FORMAT( att_current_day, '%Y-%m' ) = DATE_FORMAT(#{pushDate}, '%Y-%m' ) + SELECT g.org_id, + v.user_id, + su.user_name, + so.org_name, + g.group_id, + DATE_FORMAT(att_current_day, '%Y-%m') AS attCurrentMonth, + IFNULL(sum(IF(toWorkAttStatus = 1, 0.5, 0)), 0) + + IFNULL(sum(IF(offWorkAttStatus = 1, 0.5, 0)), 0) AS normalNum, + IFNULL(sum(IF(toWorkAttStatus = 2, 0.5, 0)), 0) + + IFNULL(sum(IF(offWorkAttStatus = 2, 0.5, 0)), 0) AS lateNum, + IFNULL(sum(IF(toWorkAttStatus = 3, 0.5, 0)), 0) + + IFNULL(sum(IF(offWorkAttStatus = 3, 0.5, 0)), 0) AS skippingNum, + IFNULL(sum(IF(toWorkAttStatus = 4, 0.5, 0)), 0) + + IFNULL(sum(IF(offWorkAttStatus = 4, 0.5, 0)), 0) AS earlyNum, + IFNULL(sum(IF(toWorkAttStatus = 5, 0.5, 0)), 0) + + IFNULL(sum(IF(offWorkAttStatus = 5, 0.5, 0)), 0) AS restNum, + sum( + IF + (toWorkAttStatus IN + (SELECT dict_value FROM sys_dict_data WHERE dict_type = 'att_status' AND is_leave = '1'), 0.5, + 0)) + sum( + IF + (offWorkAttStatus IN + (SELECT dict_value FROM sys_dict_data WHERE dict_type = 'att_status' AND is_leave = '1'), 0.5, + 0)) AS leaveNum, + IFNULL(sum(IF(toWorkAttStatus = 7, 0.5, 0)), 0) + + IFNULL(sum(IF(offWorkAttStatus = 7, 0.5, 0)), 0) AS outNum, + IFNULL(sum(IF(toWorkAttStatus = 8, 0.5, 0)), 0) + + IFNULL(sum(IF(offWorkAttStatus = 8, 0.5, 0)), 0) AS einErrorNum, + IFNULL(sum(IF(toWorkAttStatus = 9, 0.5, 0)), 0) + + IFNULL(sum(IF(offWorkAttStatus = 9, 0.5, 0)), 0) AS addressErrorNum, + IFNULL(sum(IF(toWorkAttStatus = 10, 0.5, 0)), 0) + + IFNULL(sum(IF(offWorkAttStatus = 10, 0.5, 0)), 0) AS businessTripNum + FROM v_att_update_data v + LEFT JOIN sys_user su ON su.user_id = v.user_id + LEFT JOIN (SELECT * + FROM (SELECT DISTINCT * + FROM att_setting_history + WHERE DATE_FORMAT(current_day, '%Y-%m') = DATE_FORMAT(#{pushDate}, '%Y-%m') + ORDER BY current_day DESC) a + GROUP BY user_id) g ON g.user_id = v.user_id + LEFT JOIN sys_organization so ON so.id = g.org_id + WHERE DATE_FORMAT(att_current_day, '%Y-%m') = DATE_FORMAT(#{pushDate}, '%Y-%m') AND g.group_id IS NOT NULL - GROUP BY - DATE_FORMAT( att_current_day, '%Y-%m' ), - v.user_id + GROUP BY DATE_FORMAT(att_current_day, '%Y-%m'), + v.user_id + + + + + + + + + \ No newline at end of file