diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmLeaveReqController.java b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmLeaveReqController.java index 895d52e..7f7d165 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmLeaveReqController.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/controller/HrmLeaveReqController.java @@ -9,6 +9,7 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.hrm.domain.HrmLeaveReq; import com.ruoyi.hrm.domain.bo.HrmLeaveReqBo; import com.ruoyi.hrm.domain.vo.HrmLeaveReqVo; +import com.ruoyi.hrm.domain.vo.HrmLeaveStatsVo; import com.ruoyi.hrm.service.IHrmLeaveReqService; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; @@ -59,4 +60,9 @@ public class HrmLeaveReqController extends BaseController { public R> all(HrmLeaveReqBo bo) { return R.ok(service.queryList(bo)); } + + @GetMapping("/stats") + public R stats() { + return R.ok(service.getLeaveStats()); + } } diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/domain/vo/HrmLeaveStatsVo.java b/fad-hrm/src/main/java/com/ruoyi/hrm/domain/vo/HrmLeaveStatsVo.java new file mode 100644 index 0000000..28d3c0e --- /dev/null +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/domain/vo/HrmLeaveStatsVo.java @@ -0,0 +1,69 @@ +package com.ruoyi.hrm.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +@Data +public class HrmLeaveStatsVo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 总请假申请数 + */ + private Integer totalLeaveRequests; + + /** + * 总请假时长(小时) + */ + private BigDecimal totalLeaveHours; + + /** + * 按请假类型统计 + */ + private List leaveByType; + + /** + * 按部门统计 + */ + private List leaveByDept; + + /** + * 按月份统计(本年) + */ + private List leaveByMonth; + + /** + * 总员工数 + */ + private Integer totalEmployees; + + /** + * 请假中员工数 + */ + private Integer leavingEmployees; + + @Data + public static class LeaveTypeStats { + private String leaveType; + private Integer count; + private BigDecimal totalHours; + } + + @Data + public static class DeptStats { + private Long deptId; + private String deptName; + private Integer count; + private BigDecimal totalHours; + } + + @Data + public static class MonthStats { + private String month; // YYYY-MM + private Integer count; + private BigDecimal totalHours; + } +} diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/mapper/HrmLeaveReqMapper.java b/fad-hrm/src/main/java/com/ruoyi/hrm/mapper/HrmLeaveReqMapper.java index b2359d5..7c6dff1 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/mapper/HrmLeaveReqMapper.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/mapper/HrmLeaveReqMapper.java @@ -5,10 +5,13 @@ import com.ruoyi.common.core.mapper.BaseMapperPlus; import com.ruoyi.hrm.domain.HrmLeaveReq; import com.ruoyi.hrm.domain.bo.HrmLeaveReqBo; import com.ruoyi.hrm.domain.vo.HrmLeaveReqVo; +import com.ruoyi.hrm.domain.vo.HrmLeaveStatsVo; +import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.session.RowBounds; import java.util.List; +import java.util.Map; public interface HrmLeaveReqMapper extends BaseMapperPlus { @@ -17,4 +20,17 @@ public interface HrmLeaveReqMapper extends BaseMapperPlus selectVoWithProjectByPage(IPage page, @Param("bo") HrmLeaveReqBo bo); List selectVoWithProjectList(@Param("bo") HrmLeaveReqBo bo); + + // 统计相关方法 + Map selectLeaveSummary(); + + List> selectLeaveByType(); + + List> selectLeaveByDept(); + + List> selectLeaveByMonth(@Param("year") Integer year); + + Integer selectTotalEmployees(); + + Integer selectLeavingEmployees(); } diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmLeaveReqService.java b/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmLeaveReqService.java index e7e8373..a49fc7b 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmLeaveReqService.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/service/IHrmLeaveReqService.java @@ -5,6 +5,7 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.hrm.domain.HrmLeaveReq; import com.ruoyi.hrm.domain.bo.HrmLeaveReqBo; import com.ruoyi.hrm.domain.vo.HrmLeaveReqVo; +import com.ruoyi.hrm.domain.vo.HrmLeaveStatsVo; import java.util.Collection; import java.util.List; @@ -24,4 +25,7 @@ public interface IHrmLeaveReqService { Boolean updateByBo(HrmLeaveReqBo bo); Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + // 统计方法 + HrmLeaveStatsVo getLeaveStats(); } diff --git a/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmLeaveReqServiceImpl.java b/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmLeaveReqServiceImpl.java index bbd68db..0cb8921 100644 --- a/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmLeaveReqServiceImpl.java +++ b/fad-hrm/src/main/java/com/ruoyi/hrm/service/impl/HrmLeaveReqServiceImpl.java @@ -13,6 +13,13 @@ import com.ruoyi.hrm.domain.HrmLeaveReq; import com.ruoyi.hrm.domain.bo.HrmFlowStartBo; import com.ruoyi.hrm.domain.bo.HrmLeaveReqBo; import com.ruoyi.hrm.domain.vo.HrmLeaveReqVo; +import com.ruoyi.hrm.domain.vo.HrmLeaveStatsVo; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import com.ruoyi.hrm.mapper.HrmFlowTemplateMapper; import com.ruoyi.hrm.mapper.HrmLeaveReqMapper; import com.ruoyi.hrm.service.IHrmFlowInstanceService; @@ -117,6 +124,55 @@ public class HrmLeaveReqServiceImpl implements IHrmLeaveReqService { return baseMapper.deleteBatchIds(ids) > 0; } + @Override + public HrmLeaveStatsVo getLeaveStats() { + HrmLeaveStatsVo stats = new HrmLeaveStatsVo(); + + // 获取汇总数据 + Map summary = baseMapper.selectLeaveSummary(); + stats.setTotalLeaveRequests(((Long) summary.get("totalRequests")).intValue()); + stats.setTotalLeaveHours((BigDecimal) summary.get("totalHours")); + + // 按类型统计 + List> leaveByType = baseMapper.selectLeaveByType(); + stats.setLeaveByType(leaveByType.stream().map(map -> { + HrmLeaveStatsVo.LeaveTypeStats s = new HrmLeaveStatsVo.LeaveTypeStats(); + s.setLeaveType((String) map.get("leaveType")); + s.setCount(((Long) map.get("count")).intValue()); + s.setTotalHours((BigDecimal) map.get("totalHours")); + return s; + }).collect(Collectors.toList())); + + // 按部门统计 + List> leaveByDept = baseMapper.selectLeaveByDept(); + stats.setLeaveByDept(leaveByDept.stream().map(map -> { + HrmLeaveStatsVo.DeptStats s = new HrmLeaveStatsVo.DeptStats(); + s.setDeptName((String) map.get("deptName")); + s.setCount(((Long) map.get("count")).intValue()); + s.setTotalHours((BigDecimal) map.get("totalHours")); + return s; + }).collect(Collectors.toList())); + + // 按月份统计(当前年) + int currentYear = LocalDate.now().getYear(); + List> leaveByMonth = baseMapper.selectLeaveByMonth(currentYear); + stats.setLeaveByMonth(leaveByMonth.stream().map(map -> { + HrmLeaveStatsVo.MonthStats s = new HrmLeaveStatsVo.MonthStats(); + s.setMonth((String) map.get("month")); + s.setCount(((Long) map.get("count")).intValue()); + s.setTotalHours((BigDecimal) map.get("totalHours")); + return s; + }).collect(Collectors.toList())); + + // 总员工数 + stats.setTotalEmployees(baseMapper.selectTotalEmployees()); + + // 请假中员工数 + stats.setLeavingEmployees(baseMapper.selectLeavingEmployees()); + + return stats; + } + private LambdaQueryWrapper buildQueryWrapper(HrmLeaveReqBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getBizId() != null, HrmLeaveReq::getBizId, bo.getBizId()); diff --git a/fad-hrm/src/main/resources/mapper/HrmLeaveReqMapper.xml b/fad-hrm/src/main/resources/mapper/HrmLeaveReqMapper.xml index 82412d2..50044fc 100644 --- a/fad-hrm/src/main/resources/mapper/HrmLeaveReqMapper.xml +++ b/fad-hrm/src/main/resources/mapper/HrmLeaveReqMapper.xml @@ -149,4 +149,64 @@ ORDER BY l.create_time DESC + + + + + + + + + + + +