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.List; @AllArgsConstructor @Service public class AnalyticsServiceImpl extends ServiceImpl implements AnalyticsService { @Autowired private StaffLeaveMapper staffLeaveMapper; @Autowired private StaffOnJobMapper staffOnJobMapper; @Override public List staffLeaveReasonAnalytics() { List result = staffLeaveMapper.staffLeaveReasonAnalytics(); result.forEach(dto -> { String reasonCode = dto.getReason(); StaffLeaveReason reasonEnum = StaffLeaveReason.getByCode(reasonCode); if (reasonEnum != null) { dto.setReasonText(reasonEnum.getInfo()); } else { dto.setReasonText("未知原因"); } }); 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; } }