Jelajahi Sumber

当日部门考勤数据

HMY 1 tahun lalu
induk
melakukan
e664cf719c

+ 10 - 0
src/main/java/cn/com/oa/controller/AttendanceRecordResultController.java

@@ -1,6 +1,7 @@
 package cn.com.oa.controller;
 
 import cn.com.oa.model.vo.AttendanceRecordResultVo;
+import cn.com.oa.model.vo.DeptAttendanceRecordVo;
 import cn.com.oa.service.IAttendanceRecordResultService;
 import cn.com.v2.common.base.BaseController;
 import cn.com.v2.common.domain.AjaxResult;
@@ -11,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
 import java.util.Map;
 
 @RestController
@@ -39,4 +41,12 @@ public class AttendanceRecordResultController extends BaseController {
         return AjaxResult.successData(200, map).put("msg","获取成功");
     }
 
+    @ApiOperation(value = "获取当天部门考勤统计结果", notes = "获取当天部门考勤统计结果")
+    @GetMapping("/getResultDayGroupByDept")
+    @ResponseBody
+    public AjaxResult getResultDayGroupByDept(){
+        List<DeptAttendanceRecordVo> list = attendanceRecordResultService.getResultDayGroupByDept();
+        return AjaxResult.successData(200,list).put("msg","获取成功");
+    }
+
 }

+ 2 - 0
src/main/java/cn/com/oa/mapper/AttendanceRecordMapper.java

@@ -15,6 +15,8 @@ import java.util.List;
 public interface AttendanceRecordMapper extends BaseMapper<AttendanceRecord> {
 
     List<AttendanceRecordDTO> getRecordList(AttendanceRecord attendanceRecord);
+
+    List<AttendanceRecordDTO> getResultListDay(AttendanceRecord attendanceRecord);
 }
 
 

+ 3 - 0
src/main/java/cn/com/oa/mapper/AttendanceRecordResultMapper.java

@@ -5,6 +5,7 @@ import cn.com.oa.model.vo.AttendanceRecordResultVo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -16,4 +17,6 @@ import java.util.Map;
 public interface AttendanceRecordResultMapper extends BaseMapper<AttendanceRecordResult> {
 
     Map<String, Object> getResultMonth(@Param("attendanceRecordResult") AttendanceRecordResultVo attendanceRecordResult);
+
+    List<Map<String, Object>> getResultDayAndDept(AttendanceRecordResultVo attendanceRecordResult);
 }

+ 4 - 0
src/main/java/cn/com/oa/mapper/UserMapper.java

@@ -3,6 +3,9 @@ package cn.com.oa.mapper;
 import cn.com.oa.model.User;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
+import java.util.List;
+import java.util.Map;
+
 /**
 * @author wangpx
 * @description 针对表【t_user】的数据库操作Mapper
@@ -11,6 +14,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 */
 public interface UserMapper extends BaseMapper<User> {
 
+    List<Map<String,Object>> getDeptCount(User user);
 }
 
 

+ 4 - 0
src/main/java/cn/com/oa/model/DTO/AttendanceRecordDTO.java

@@ -23,4 +23,8 @@ public class AttendanceRecordDTO extends AttendanceRecord {
      * 打卡结束时间
      */
     private Date lastAttTime;
+    /**
+     * 部门名称
+     */
+    private String deptName;
 }

+ 16 - 0
src/main/java/cn/com/oa/model/User.java

@@ -280,4 +280,20 @@ public class User implements Serializable {
         sb.append("]");
         return sb.toString();
     }
+
+    public Long getUnitid() {
+        return unitid;
+    }
+
+    public void setUnitid(Long unitid) {
+        this.unitid = unitid;
+    }
+
+    public Integer getUserState() {
+        return userState;
+    }
+
+    public void setUserState(Integer userState) {
+        this.userState = userState;
+    }
 }

+ 2 - 2
src/main/java/cn/com/oa/model/vo/AttendanceRecordResultVo.java

@@ -8,11 +8,11 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 public class AttendanceRecordResultVo extends AttendanceRecordResult {
     /**
-     * 打卡人数
+     * 实际出勤人数
      */
     private int recordCount;
     /**
-     * 实际出勤人数
+     * 正常出勤人数
      */
     private int actualCount;
     /**

+ 37 - 0
src/main/java/cn/com/oa/model/vo/DeptAttendanceRecordVo.java

@@ -0,0 +1,37 @@
+package cn.com.oa.model.vo;
+
+import lombok.Data;
+
+/**
+ * DeptAttendanceRecordVo
+ *
+ * @author: hmy
+ * @date: 2025/2/11 15:25
+ */
+@Data
+public class DeptAttendanceRecordVo {
+    /**
+     * 实际出勤人数
+     */
+    private int recordCount;
+    /**
+     * 正常出勤人数
+     */
+    private int actualCount;
+    /**
+     * 迟到人数
+     */
+    private int lateCount;
+    /**
+     * 早退人数
+     */
+    private int leaveEarlyCount;
+    /**
+     * 缺勤人数
+     */
+    private int absenceCount;
+    /**
+     * 部门名称
+     */
+    private String deptName;
+}

+ 2 - 0
src/main/java/cn/com/oa/service/AttendanceRecordService.java

@@ -14,4 +14,6 @@ import java.util.List;
 public interface AttendanceRecordService extends IService<AttendanceRecord> {
 
     List<AttendanceRecordDTO> getRecordList(AttendanceRecord attendanceRecord);
+
+    List<AttendanceRecordDTO> getResultListDay(AttendanceRecord attendanceRecord);
 }

+ 4 - 0
src/main/java/cn/com/oa/service/IAttendanceRecordResultService.java

@@ -2,8 +2,10 @@ package cn.com.oa.service;
 
 import cn.com.oa.model.AttendanceRecordResult;
 import cn.com.oa.model.vo.AttendanceRecordResultVo;
+import cn.com.oa.model.vo.DeptAttendanceRecordVo;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -15,5 +17,7 @@ public interface IAttendanceRecordResultService extends IService<AttendanceRecor
 
     Map<String, Object> getResultMonth();
 
+    List<DeptAttendanceRecordVo> getResultDayGroupByDept();
+
     AttendanceRecordResultVo getResultDay();
 }

+ 5 - 0
src/main/java/cn/com/oa/service/UserService.java

@@ -3,6 +3,9 @@ package cn.com.oa.service;
 import cn.com.oa.model.User;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+import java.util.Map;
+
 /**
 * @author wangpx
 * @description 针对表【t_user】的数据库操作Service
@@ -11,4 +14,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
 public interface UserService extends IService<User> {
 
     int getCount(User user);
+
+    List<Map<String,Object>> getDeptCount(User user);
 }

+ 80 - 0
src/main/java/cn/com/oa/service/impl/AttendanceRecordResultServiceImpl.java

@@ -8,6 +8,7 @@ import cn.com.oa.model.DTO.AttendanceRecordDTO;
 import cn.com.oa.model.Group;
 import cn.com.oa.model.User;
 import cn.com.oa.model.vo.AttendanceRecordResultVo;
+import cn.com.oa.model.vo.DeptAttendanceRecordVo;
 import cn.com.oa.service.AttendanceRecordService;
 import cn.com.oa.service.IAttendanceRecordResultService;
 import cn.com.oa.service.UserService;
@@ -15,10 +16,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.time.LocalTime;
 import java.time.ZoneId;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -32,6 +36,8 @@ public class AttendanceRecordResultServiceImpl extends ServiceImpl<AttendanceRec
     private UserService userService;
     @Autowired
     private AttendanceRecordService attendanceRecordService;
+    @Resource
+    private AttendanceRecordResultMapper attendanceRecordResultMapper;
 
     @Override
     public Map<String, Object> getResultMonth() {
@@ -102,4 +108,78 @@ public class AttendanceRecordResultServiceImpl extends ServiceImpl<AttendanceRec
         attendanceRecordResultVo.setAbsenceCount(absenceCount);
         return attendanceRecordResultVo;
     }
+
+    @Override
+    public List<DeptAttendanceRecordVo> getResultDayGroupByDept() {
+        Map constantData = DataService.getConstantData();
+        Group group = (Group)constantData.get("defaultGroup");
+        User user = new User();
+        user.setUnitid(group.getUNIVERSALID());
+        user.setUserState(1);
+        // 各部门应到人数
+        List<Map<String, Object>> deptCountList = userService.getDeptCount(user);
+        AttendanceRecord attendanceRecord = new AttendanceRecord();
+        attendanceRecord.setUnitId(group.getUNIVERSALID());
+        // 当日打卡数据
+        List<AttendanceRecordDTO> recordList = attendanceRecordService.getResultListDay(attendanceRecord);
+        LocalTime lateThreshold = LocalTime.of(9, 0, 0);
+        LocalTime leaveEarlyThreshold = LocalTime.of(17, 30, 0);
+        List<DeptAttendanceRecordVo> deptAttendanceRecordVos = new ArrayList<>();
+        //遍历deptCount
+        for (Map<String, Object> dept : deptCountList) {
+            //当前部门应道人数
+            int deptCountNum = ((Long) dept.get("deptCount")).intValue();
+            //打卡人数
+            int recordCount = 0;
+            //当前部门实际到人数
+            int actualCount = 0;
+            //当前部门迟到人数
+            int lateCount = 0;
+            //当前部门早退人数
+            int leaveEarlyCount = 0;
+            //当前部门缺勤人数
+            int absenceCount = 0;
+            //从recordList遍历出deptName为当前部门的数据
+            for (AttendanceRecordDTO record : recordList) {
+                if (record.getDeptName().equals(dept.get("deptName"))) {
+                    actualCount++;
+                    recordCount++;
+                    // 将 Date 转换为 LocalTime
+                    LocalTime firstTime = record.getFirstAttTime().toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
+                    LocalTime lastTime = record.getLastAttTime().toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
+                    // 标记是否已经减少 actualCount
+                    boolean flag = false;
+                    // 迟到处理
+                    if (firstTime.isAfter(lateThreshold)) {
+                        lateCount++;
+                        if (!flag) {
+                            actualCount--;
+                            flag = true;
+                        }
+                    }
+                    // 只打卡一次的跳过
+                    if (firstTime.equals(lastTime)) continue;
+                    // 早退处理
+                    if (lastTime.isBefore(leaveEarlyThreshold)) {
+                        leaveEarlyCount++;
+                        if (!flag) {
+                            actualCount--;
+                        }
+                    }
+                }
+            }
+            //计算缺勤人数
+            absenceCount=deptCountNum-recordCount;
+            DeptAttendanceRecordVo deptAttendanceRecordVo=new DeptAttendanceRecordVo();
+            deptAttendanceRecordVo.setDeptName((String) dept.get("deptName"));
+            deptAttendanceRecordVo.setActualCount(actualCount);
+            deptAttendanceRecordVo.setLateCount(lateCount);
+            deptAttendanceRecordVo.setLeaveEarlyCount(leaveEarlyCount);
+            deptAttendanceRecordVo.setAbsenceCount(absenceCount);
+            deptAttendanceRecordVo.setRecordCount(recordCount);
+            deptAttendanceRecordVos.add(deptAttendanceRecordVo);
+        }
+        return deptAttendanceRecordVos;
+    }
+
 }

+ 5 - 0
src/main/java/cn/com/oa/service/impl/AttendanceRecordServiceImpl.java

@@ -21,6 +21,11 @@ public class AttendanceRecordServiceImpl extends ServiceImpl<AttendanceRecordMap
     public List<AttendanceRecordDTO> getRecordList(AttendanceRecord attendanceRecord) {
         return baseMapper.getRecordList(attendanceRecord);
     }
+
+    @Override
+    public List<AttendanceRecordDTO> getResultListDay(AttendanceRecord attendanceRecord) {
+        return baseMapper.getResultListDay(attendanceRecord);
+    }
 }
 
 

+ 11 - 0
src/main/java/cn/com/oa/service/impl/UserServiceImpl.java

@@ -7,6 +7,10 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
 /**
 * @author wangpx
 * @description 针对表【t_user】的数据库操作Service实现
@@ -15,6 +19,8 @@ import org.springframework.stereotype.Service;
 @Service
 public class UserServiceImpl extends ServiceImpl<UserMapper, User>
     implements UserService {
+    @Resource
+    private UserMapper userMapper;
     @Override
     public int getCount(User user) {
         return this.baseMapper.selectCount(new QueryWrapper<User>()
@@ -27,6 +33,11 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User>
                         "284381384120700" // 林明东
                 }));
     }
+
+    @Override
+    public List<Map<String, Object>> getDeptCount(User user) {
+        return userMapper.getDeptCount(user);
+    }
 }
 
 

+ 29 - 0
src/main/resources/mapper/oa/AttendanceRecordMapper.xml

@@ -47,4 +47,33 @@
         GROUP BY t.att_user_name
         ORDER BY first_att_time DESC
     </select>
+    <select id="getResultListDay" resultType="cn.com.oa.model.DTO.AttendanceRecordDTO">
+        SELECT
+            har.att_user_name,
+            tg.GROUPNAME as dept_name,
+            MIN( har.att_time ) AS first_att_time,
+            MAX( har.att_time ) AS last_att_time
+        FROM
+            hr_attendance_record har
+                JOIN t_user tu ON har.sys_user_id = tu.UNIVERSALID
+                JOIN t_group tg ON tg.UNIVERSALID =(
+                SELECT
+                    gu.GROUPID
+                FROM
+                    t_groupxuser gu
+                WHERE
+                    gu.USERNAME = tu.UNIVERSALID
+                  AND gu.state != 0
+            AND gu.postype = 1
+            )
+        WHERE
+            har.special_type = '1'
+          AND har.unit_id = #{unitId}
+          AND har.att_date = CURDATE()
+          AND tu.UNIVERSALID NOT IN ('347517210967865','284381380647600','284381382211000','284381384120700')
+        GROUP BY
+            har.att_user_name
+        ORDER BY
+            first_att_time DESC
+    </select>
 </mapper>

+ 23 - 0
src/main/resources/mapper/oa/AttendanceRecordResultMapper.xml

@@ -109,4 +109,27 @@
                   AND segment_name IS NOT NULL
         ) AS qqCount
     </select>
+
+    <select id="getResultDayAndDept" resultType="java.util.Map">
+        SELECT
+            tg.GROUPNAME,
+            SUM(CASE WHEN harr.late1_num = 0 AND harr.late2_num = 0 AND harr.late3_num = 0 AND harr.late4_num = 0 AND harr.late5_num = 0 AND harr.leave_early1_num = 0 AND harr.absenteeism_num = 0 THEN 1 ELSE 0 END) AS zcCount,
+            SUM(CASE WHEN harr.general_holiday_num > 0 THEN 1 ELSE 0 END) AS gxCount,
+            SUM(CASE WHEN harr.out_num > 0 THEN 1 ELSE 0 END) AS wcCount,
+            SUM(CASE WHEN harr.segment_name IS NULL AND harr.general_holiday_num = 0 THEN 1 ELSE 0 END) AS wpbCount,
+            SUM(CASE WHEN harr.late1_num > 0 OR harr.late2_num > 0 OR harr.late3_num > 0 OR harr.late4_num > 0 OR harr.late5_num > 0 THEN 1 ELSE 0 END) AS cdCount,
+            SUM(CASE WHEN harr.leave_early1_num > 0 THEN 1 ELSE 0 END) AS ztCount,
+            SUM(CASE WHEN harr.absenteeism_num > 0 THEN 1 ELSE 0 END) AS qqCount
+        FROM
+            hr_attendance_record_result harr
+                JOIN
+            t_user tu ON harr.sys_user_id = tu.UNIVERSALID
+                JOIN
+            t_group tg ON tu.groupid=tg.UNIVERSALID
+        WHERE
+            harr.special_type = '1'
+          AND harr.att_date = DATE_FORMAT(CURDATE(), '%Y-%m-01')
+        GROUP BY
+            tu.groupid
+    </select>
 </mapper>

+ 24 - 0
src/main/resources/mapper/oa/UserMapper.xml

@@ -48,4 +48,28 @@
         createTime,unitId,phone_code,
         intro,clientid
     </sql>
+
+    <select id="getDeptCount" resultType="java.util.Map">
+        SELECT
+            COUNT(*) AS deptCount,
+            tg.GROUPNAME AS deptName
+        FROM
+            t_user u
+                LEFT JOIN t_group tg ON tg.UNIVERSALID =(
+                SELECT
+                    gu.GROUPID
+                FROM
+                    t_groupxuser gu
+                WHERE
+                    gu.USERNAME = u.UNIVERSALID
+                  AND gu.state != 0
+            AND gu.postype = 1
+            )
+        WHERE
+            u.unitId = #{unitid}
+          AND u.USER_STATE = #{userState}
+          AND u.UNIVERSALID NOT IN ('347517210967865','284381380647600','284381382211000','284381384120700')
+        GROUP BY
+            tg.GROUPNAME
+    </select>
 </mapper>