package com.ruoyi.staff.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StaffLeaveReason; import com.ruoyi.staff.dto.StaffLeaveDto; import com.ruoyi.staff.mapper.StaffLeaveMapper; import com.ruoyi.staff.mapper.StaffOnJobMapper; import com.ruoyi.staff.pojo.StaffLeave; import com.ruoyi.staff.service.AnalyticsService; import com.ruoyi.staff.vo.MonthlyTurnoverRateVo; import com.ruoyi.staff.vo.TotalTurnoverRateVo; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @AllArgsConstructor @Service public class AnalyticsServiceImpl extends ServiceImpl implements AnalyticsService { @Autowired private StaffLeaveMapper staffLeaveMapper; @Autowired private StaffOnJobMapper staffOnJobMapper; @Override public List staffLeaveReasonAnalytics() { List dbResult = staffLeaveMapper.staffLeaveReasonAnalytics(); // 创建一个Map用于存储所有枚举原因的数量,默认值为0 Map reasonCountMap = new HashMap<>(); for (StaffLeaveReason reasonEnum : StaffLeaveReason.values()) { reasonCountMap.put(reasonEnum.getCode(), 0); } // 将数据库查询结果合并到Map中 for (StaffLeaveDto dto : dbResult) { String reasonCode = dto.getReason(); if (reasonCountMap.containsKey(reasonCode)) { reasonCountMap.put(reasonCode, dto.getCount()); } } // 将Map转换为List List result = new ArrayList<>(); for (StaffLeaveReason reasonEnum : StaffLeaveReason.values()) { StaffLeaveDto dto = new StaffLeaveDto(); dto.setReason(reasonEnum.getCode()); dto.setCount(reasonCountMap.get(reasonEnum.getCode())); dto.setReasonText(reasonEnum.getInfo()); result.add(dto); } return result; } @Override public List getMonthlyTurnoverRateFor12Months() { List result = new ArrayList<>(); LocalDate now = LocalDate.now(); DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM"); // 计算近12个月的数据 for (int i = 11; i >= 0; i--) { LocalDate currentMonth = now.minusMonths(i); LocalDate monthStart = currentMonth.withDayOfMonth(1); LocalDate monthEnd = currentMonth.withDayOfMonth(currentMonth.lengthOfMonth()); MonthlyTurnoverRateVo vo = new MonthlyTurnoverRateVo(); vo.setMonth(currentMonth.format(monthFormatter)); vo.setMonthStartDate(monthStart); vo.setMonthEndDate(monthEnd); // 月初员工数(上月末在职员工数) LocalDate lastMonthEnd = monthStart.minusDays(1); Integer beginMonthStaffCount = staffOnJobMapper.countOnJobStaffByDate(lastMonthEnd); vo.setBeginMonthStaffCount(beginMonthStaffCount != null ? beginMonthStaffCount : 0); // 月末员工数 Integer endMonthStaffCount = staffOnJobMapper.countOnJobStaffByDate(monthEnd); vo.setEndMonthStaffCount(endMonthStaffCount != null ? endMonthStaffCount : 0); // 月度入职员工数 Integer newHireCount = staffOnJobMapper.countNewHireByMonth(monthStart, monthEnd); vo.setNewHireCount(newHireCount != null ? newHireCount : 0); // 月度离职员工数 Integer leaveCount = staffLeaveMapper.countLeaveByMonth(monthStart, monthEnd); vo.setLeaveCount(leaveCount != null ? leaveCount : 0); // 计算流失率:流失率 = 月度离职员工数 / 月初员工数 * 100% Double turnoverRate = 0.0; if (vo.getBeginMonthStaffCount() > 0) { turnoverRate = (double) vo.getLeaveCount() / vo.getBeginMonthStaffCount() * 100; // 保留两位小数 turnoverRate = Math.round(turnoverRate * 100.0) / 100.0; } vo.setTurnoverRate(turnoverRate); // 计算流动率:流动率 = (月度入职员工数 + 月度离职员工数) / 月初员工数 * 100% Double flowRate = 0.0; if (vo.getBeginMonthStaffCount() > 0) { flowRate = (double) (vo.getNewHireCount() + vo.getLeaveCount()) / vo.getBeginMonthStaffCount() * 100; // 保留两位小数 flowRate = Math.round(flowRate * 100.0) / 100.0; } vo.setFlowRate(flowRate); result.add(vo); } return result; } @Override public TotalTurnoverRateVo getTotalStatistic() { TotalTurnoverRateVo result = new TotalTurnoverRateVo(); LocalDate now = LocalDate.now(); // 获取当前在职员工数 Integer currentOnJobCount = staffOnJobMapper.countOnJobStaffByDate(now); result.setCurrentOnJobCount(currentOnJobCount); // 获取本月的开始和结束日期 LocalDate monthStartDate = now.withDayOfMonth(1); LocalDate monthEndDate = now.withDayOfMonth(now.lengthOfMonth()); // 获取月初员工数(即上月末员工数) Integer beginMonthStaffCount = staffOnJobMapper.countOnJobStaffByDate(monthStartDate.minusDays(1)); // 获取本月新入职员工数 Integer newHireCount = staffOnJobMapper.countNewHireByMonth(monthStartDate, monthEndDate); // 获取本月离职员工数 Integer leaveCount = staffLeaveMapper.countLeaveByMonth(monthStartDate, monthEndDate); // 计算总流动率 = (入职人数 + 离职人数) / 月初员工数 * 100% Double totalFlowRate = 0.0; if (beginMonthStaffCount > 0) { totalFlowRate = (double) (newHireCount + leaveCount) / beginMonthStaffCount * 100; // 保留两位小数 totalFlowRate = Math.round(totalFlowRate * 100.0) / 100.0; } result.setTotalFlowRate(totalFlowRate); // 计算总流失率 = 离职人数 / 月初员工数 * 100% Double totalTurnoverRate = 0.0; if (beginMonthStaffCount > 0) { totalTurnoverRate = (double) leaveCount / beginMonthStaffCount * 100; // 保留两位小数 totalTurnoverRate = Math.round(totalTurnoverRate * 100.0) / 100.0; } result.setTotalTurnoverRate(totalTurnoverRate); return result; } }