liyong
6 天以前 516a98353f103b44b87a36251cffaf5df8a8f7bc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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;
    }
}