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<StaffLeaveMapper, StaffLeave> implements AnalyticsService {
|
@Autowired
|
private StaffLeaveMapper staffLeaveMapper;
|
|
@Autowired
|
private StaffOnJobMapper staffOnJobMapper;
|
|
@Override
|
public List<StaffLeaveDto> staffLeaveReasonAnalytics() {
|
List<StaffLeaveDto> dbResult = staffLeaveMapper.staffLeaveReasonAnalytics();
|
|
// 创建一个Map用于存储所有枚举原因的数量,默认值为0
|
Map<String, Integer> 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<StaffLeaveDto>
|
List<StaffLeaveDto> 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<MonthlyTurnoverRateVo> getMonthlyTurnoverRateFor12Months() {
|
List<MonthlyTurnoverRateVo> 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;
|
}
|
}
|