chenshudong 1 mēnesi atpakaļ
vecāks
revīzija
2ecd4efd0b

+ 24 - 0
airport-common/src/main/java/com/sundot/airport/common/enums/BasePerformanceIndicatorApplicationMethodRuleEnum.java

@@ -0,0 +1,24 @@
1
+package com.sundot.airport.common.enums;
2
+
3
+import lombok.AllArgsConstructor;
4
+import lombok.Getter;
5
+
6
+/**
7
+ * 考核指标表应用方式规则枚举
8
+ */
9
+@Getter
10
+@AllArgsConstructor
11
+public enum BasePerformanceIndicatorApplicationMethodRuleEnum {
12
+
13
+    APPLICATION_METHOD_RULE_ONE("面谈督导", "当月评价为待改进"),
14
+    APPLICATION_METHOD_RULE_TWO("停岗并脱产培训1周", "当月评价为不称职或当年连续2次出现待改进"),
15
+    APPLICATION_METHOD_RULE_THREE("降职降薪", "考核组为安检员兼X光机操作员(旅检、员工),连续3个月待改进或当年累计4次待改进或近12个月累计2次评价不称职"),
16
+    APPLICATION_METHOD_RULE_FOUR("解除合同", "培训返岗后,当年再次出现待改进或不称职,则评价不胜任,上报公司解除合同"),
17
+    APPLICATION_METHOD_RULE_FIVE("岗位重新竞聘", "面谈后近12个月累计出现3次待改进"),
18
+    APPLICATION_METHOD_RULE_SIX("降职降薪", "面谈后当年再次出现不称职"),
19
+    APPLICATION_METHOD_RULE_OTHER("其他", "其他");
20
+
21
+    private final String name;
22
+    private final String desc;
23
+
24
+}

+ 25 - 0
airport-common/src/main/java/com/sundot/airport/common/enums/BasePerformanceIndicatorAssessmentResultRuleEnum.java

@@ -0,0 +1,25 @@
1
+package com.sundot.airport.common.enums;
2
+
3
+import lombok.AllArgsConstructor;
4
+import lombok.Getter;
5
+
6
+/**
7
+ * 考核指标表考核结果规则枚举
8
+ */
9
+@Getter
10
+@AllArgsConstructor
11
+public enum BasePerformanceIndicatorAssessmentResultRuleEnum {
12
+
13
+    ASSESSMENT_RESULT_RULE_ONE("待改进", "评价分数排名后5%,考核组内"),
14
+    ASSESSMENT_RESULT_RULE_TWO("不称职", "评价分数低于75分(不含75分)"),
15
+    ASSESSMENT_RESULT_RULE_THREE("不称职", "当月非核心安全+核心扣分字段扣分达10分"),
16
+    ASSESSMENT_RESULT_RULE_FOUR("不称职", "当月触发任一红线行为(=当月评价分不超过70分)"),
17
+    ASSESSMENT_RESULT_RULE_FIVE("取消班组长资格", "管理范围内有2名及以上组员当月评价为不称职"),
18
+    ASSESSMENT_RESULT_RULE_SIX("取消班组长资格", "本人近12月累计两次评价为不称职"),
19
+    ASSESSMENT_RESULT_RULE_SEVEN("待改进", "管理评价得分在本评价组内排名最后1名(不可豁免)"),
20
+    ASSESSMENT_RESULT_RULE_OTHER("其他", "其他");
21
+
22
+    private final String name;
23
+    private final String desc;
24
+
25
+}

+ 20 - 0
airport-common/src/main/java/com/sundot/airport/common/enums/BasePerformanceIndicatorExemptionRuleEnum.java

@@ -0,0 +1,20 @@
1
+package com.sundot.airport.common.enums;
2
+
3
+import lombok.AllArgsConstructor;
4
+import lombok.Getter;
5
+
6
+/**
7
+ * 考核指标表是否豁免规则枚举
8
+ */
9
+@Getter
10
+@AllArgsConstructor
11
+public enum BasePerformanceIndicatorExemptionRuleEnum {
12
+
13
+    EXEMPTION_RULE_ONE("豁免", "没有扣分项"),
14
+    EXEMPTION_RULE_TWO("豁免", "仅因病假、事假等扣分导致排名/分数进入待改进、不称职区域的"),
15
+    EXEMPTION_RULE_OTHER("其他", "其他");
16
+
17
+    private final String name;
18
+    private final String desc;
19
+
20
+}

+ 239 - 0
airport-common/src/main/java/com/sundot/airport/common/utils/MonthUtils.java

@@ -0,0 +1,239 @@
1
+package com.sundot.airport.common.utils;
2
+
3
+import java.time.YearMonth;
4
+import java.time.format.DateTimeFormatter;
5
+import java.util.ArrayList;
6
+import java.util.List;
7
+
8
+/**
9
+ * 月份工具类-人事绩效模块
10
+ */
11
+public class MonthUtils {
12
+
13
+    /**
14
+     * 月份范围对象
15
+     */
16
+    public static class MonthRange {
17
+        private String startMonth;
18
+        private String endMonth;
19
+
20
+        public MonthRange(String startMonth, String endMonth) {
21
+            this.startMonth = startMonth;
22
+            this.endMonth = endMonth;
23
+        }
24
+
25
+        public String getStartMonth() {
26
+            return startMonth;
27
+        }
28
+
29
+        public String getEndMonth() {
30
+            return endMonth;
31
+        }
32
+
33
+        @Override
34
+        public String toString() {
35
+            return "MonthRange{startMonth='" + startMonth + "', endMonth='" + endMonth + "'}";
36
+        }
37
+    }
38
+
39
+    private static final DateTimeFormatter MONTH_FORMATTER = DateTimeFormatter.ofPattern("yyyyMM");
40
+
41
+    /**
42
+     * 根据月份值查询上个月月份值
43
+     * @param month 月份值,格式:yyyyMM
44
+     * @return 上个月月份值,格式:yyyyMM
45
+     */
46
+    public static String getPreviousMonth(String month) {
47
+        if (month == null || month.length() != 6) {
48
+            throw new IllegalArgumentException("月份格式错误,应为yyyyMM");
49
+        }
50
+
51
+        try {
52
+            YearMonth yearMonth = YearMonth.parse(month, MONTH_FORMATTER);
53
+            YearMonth previousMonth = yearMonth.minusMonths(1);
54
+            return previousMonth.format(MONTH_FORMATTER);
55
+        } catch (Exception e) {
56
+            throw new IllegalArgumentException("月份解析失败: " + month);
57
+        }
58
+    }
59
+
60
+    /**
61
+     * 根据月份值查询下个月月份值
62
+     * @param month 月份值,格式:yyyyMM
63
+     * @return 下个月月份值,格式:yyyyMM
64
+     */
65
+    public static String getNextMonth(String month) {
66
+        if (month == null || month.length() != 6) {
67
+            throw new IllegalArgumentException("月份格式错误,应为yyyyMM");
68
+        }
69
+
70
+        try {
71
+            YearMonth yearMonth = YearMonth.parse(month, MONTH_FORMATTER);
72
+            YearMonth nextMonth = yearMonth.plusMonths(1);
73
+            return nextMonth.format(MONTH_FORMATTER);
74
+        } catch (Exception e) {
75
+            throw new IllegalArgumentException("月份解析失败: " + month);
76
+        }
77
+    }
78
+
79
+    /**
80
+     * 查询近3个月月份值(不包含当月)
81
+     * @param month 月份值,格式:yyyyMM
82
+     * @return 开始月份和结束月份
83
+     */
84
+    public static MonthRange getLast3Months(String month) {
85
+        return getLastNMonths(month, 3);
86
+    }
87
+
88
+    /**
89
+     * 查询近12个月月份值(不包含当月)
90
+     * @param month 月份值,格式:yyyyMM
91
+     * @return 开始月份和结束月份
92
+     */
93
+    public static MonthRange getLast12Months(String month) {
94
+        return getLastNMonths(month, 12);
95
+    }
96
+
97
+    /**
98
+     * 查询近N个月月份值(不包含当月)
99
+     * @param month 月份值,格式:yyyyMM
100
+     * @param n 月数
101
+     * @return 开始月份和结束月份
102
+     */
103
+    private static MonthRange getLastNMonths(String month, int n) {
104
+        if (month == null || month.length() != 6) {
105
+            throw new IllegalArgumentException("月份格式错误,应为yyyyMM");
106
+        }
107
+
108
+        try {
109
+            YearMonth currentMonth = YearMonth.parse(month, MONTH_FORMATTER);
110
+            YearMonth startMonth = currentMonth.minusMonths(n);
111
+            YearMonth endMonth = currentMonth.minusMonths(1);
112
+
113
+            return new MonthRange(
114
+                    startMonth.format(MONTH_FORMATTER),
115
+                    endMonth.format(MONTH_FORMATTER)
116
+            );
117
+        } catch (Exception e) {
118
+            throw new IllegalArgumentException("月份解析失败: " + month);
119
+        }
120
+    }
121
+
122
+    /**
123
+     * 查询此年度12个月月份值
124
+     * @param month 月份值,格式:yyyyMM
125
+     * @return 开始月份(当年1月)和结束月份(当年12月)
126
+     */
127
+    public static MonthRange getCurrentYearMonths(String month) {
128
+        if (month == null || month.length() != 6) {
129
+            throw new IllegalArgumentException("月份格式错误,应为yyyyMM");
130
+        }
131
+
132
+        try {
133
+            YearMonth currentMonth = YearMonth.parse(month, MONTH_FORMATTER);
134
+            int year = currentMonth.getYear();
135
+
136
+            YearMonth startMonth = YearMonth.of(year, 1);
137
+            YearMonth endMonth = YearMonth.of(year, 12);
138
+
139
+            return new MonthRange(
140
+                    startMonth.format(MONTH_FORMATTER),
141
+                    endMonth.format(MONTH_FORMATTER)
142
+            );
143
+        } catch (Exception e) {
144
+            throw new IllegalArgumentException("月份解析失败: " + month);
145
+        }
146
+    }
147
+
148
+    /**
149
+     * 查询近3个月月份值(包含当月)
150
+     * @param month 月份值,格式:yyyyMM
151
+     * @return 开始月份和结束月份
152
+     */
153
+    public static MonthRange getLast3MonthsIncludeCurrent(String month) {
154
+        return getLastNMonthsIncludeCurrent(month, 3);
155
+    }
156
+
157
+    /**
158
+     * 查询近12个月月份值(包含当月)
159
+     * @param month 月份值,格式:yyyyMM
160
+     * @return 开始月份和结束月份
161
+     */
162
+    public static MonthRange getLast12MonthsIncludeCurrent(String month) {
163
+        return getLastNMonthsIncludeCurrent(month, 12);
164
+    }
165
+
166
+    /**
167
+     * 查询近N个月月份值(包含当月)
168
+     * @param month 月份值,格式:yyyyMM
169
+     * @param n 月数
170
+     * @return 开始月份和结束月份
171
+     */
172
+    private static MonthRange getLastNMonthsIncludeCurrent(String month, int n) {
173
+        if (month == null || month.length() != 6) {
174
+            throw new IllegalArgumentException("月份格式错误,应为yyyyMM");
175
+        }
176
+
177
+        try {
178
+            YearMonth currentMonth = YearMonth.parse(month, MONTH_FORMATTER);
179
+            YearMonth startMonth = currentMonth.minusMonths(n - 1);
180
+
181
+            return new MonthRange(
182
+                    startMonth.format(MONTH_FORMATTER),
183
+                    month  // 结束月份就是传入的月份(包含当月)
184
+            );
185
+        } catch (Exception e) {
186
+            throw new IllegalArgumentException("月份解析失败: " + month);
187
+        }
188
+    }
189
+
190
+    /**
191
+     * 查询此年度12个月月份值(1月份到输入的月份)
192
+     * @param month 月份值,格式:yyyyMM
193
+     * @return 开始月份(当年1月)和结束月份(输入的月份)
194
+     */
195
+    public static MonthRange getCurrentYearToMonth(String month) {
196
+        if (month == null || month.length() != 6) {
197
+            throw new IllegalArgumentException("月份格式错误,应为yyyyMM");
198
+        }
199
+
200
+        try {
201
+            YearMonth currentMonth = YearMonth.parse(month, MONTH_FORMATTER);
202
+            int year = currentMonth.getYear();
203
+
204
+            YearMonth startMonth = YearMonth.of(year, 1);
205
+
206
+            return new MonthRange(
207
+                    startMonth.format(MONTH_FORMATTER),
208
+                    month  // 结束月份就是传入的月份
209
+            );
210
+        } catch (Exception e) {
211
+            throw new IllegalArgumentException("月份解析失败: " + month);
212
+        }
213
+    }
214
+
215
+    /**
216
+     * 获取指定月份范围内的所有月份列表
217
+     * @param startMonth 开始月份,格式:yyyyMM
218
+     * @param endMonth 结束月份,格式:yyyyMM
219
+     * @return 月份列表
220
+     */
221
+    public static List<String> getMonthList(String startMonth, String endMonth) {
222
+        List<String> monthList = new ArrayList<>();
223
+
224
+        try {
225
+            YearMonth start = YearMonth.parse(startMonth, MONTH_FORMATTER);
226
+            YearMonth end = YearMonth.parse(endMonth, MONTH_FORMATTER);
227
+
228
+            while (!start.isAfter(end)) {
229
+                monthList.add(start.format(MONTH_FORMATTER));
230
+                start = start.plusMonths(1);
231
+            }
232
+
233
+            return monthList;
234
+        } catch (Exception e) {
235
+            throw new IllegalArgumentException("月份解析失败");
236
+        }
237
+    }
238
+
239
+}

+ 619 - 128
airport-personnel/src/main/java/com/sundot/airport/personnel/service/impl/PersonnelNonCadreMonthlyAssessmentServiceImpl.java

@@ -3,6 +3,7 @@ package com.sundot.airport.personnel.service.impl;
3 3
 import java.math.BigDecimal;
4 4
 import java.math.RoundingMode;
5 5
 import java.util.ArrayList;
6
+import java.util.Collections;
6 7
 import java.util.List;
7 8
 import java.util.Map;
8 9
 import java.util.stream.Collectors;
@@ -12,17 +13,25 @@ import cn.hutool.core.util.ObjUtil;
12 13
 import cn.hutool.core.util.StrUtil;
13 14
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
14 15
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
16
+import com.sundot.airport.common.core.domain.entity.SysUser;
17
+import com.sundot.airport.common.enums.AssessmentTeamEnum;
18
+import com.sundot.airport.common.enums.BasePerformanceIndicatorApplicationMethodRuleEnum;
19
+import com.sundot.airport.common.enums.BasePerformanceIndicatorAssessmentResultRuleEnum;
20
+import com.sundot.airport.common.enums.BasePerformanceIndicatorExemptionRuleEnum;
21
+import com.sundot.airport.common.enums.BasePerformanceIndicatorLeaveTypeEnum;
15 22
 import com.sundot.airport.common.enums.BasePerformanceIndicatorQcDeptTypeEnum;
16 23
 import com.sundot.airport.common.enums.BasePerformanceIndicatorRewardPunishmentTypeTypeEnum;
17 24
 import com.sundot.airport.common.enums.RoleTypeEnum;
18 25
 import com.sundot.airport.common.exception.ServiceException;
19 26
 import com.sundot.airport.common.utils.DateUtils;
27
+import com.sundot.airport.common.utils.MonthUtils;
20 28
 import com.sundot.airport.personnel.domain.PersonnelMonthlyAssessmentIndicatorDetail;
21 29
 import com.sundot.airport.personnel.domain.PersonnelMonthlyAssessmentIndicatorRewardPunishmentDetail;
22 30
 import com.sundot.airport.personnel.service.IPersonnelMonthlyAssessmentIndicatorDetailService;
23 31
 import com.sundot.airport.personnel.service.IPersonnelMonthlyAssessmentIndicatorRewardPunishmentDetailService;
24 32
 import com.sundot.airport.system.domain.BasePerformanceIndicatorCategory;
25 33
 import com.sundot.airport.system.service.IBasePerformanceIndicatorCategoryService;
34
+import com.sundot.airport.system.service.ISysUserService;
26 35
 import org.springframework.beans.factory.annotation.Autowired;
27 36
 import org.springframework.stereotype.Service;
28 37
 import com.sundot.airport.personnel.mapper.PersonnelNonCadreMonthlyAssessmentMapper;
@@ -51,6 +60,8 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
51 60
     private IPersonnelMonthlyAssessmentIndicatorRewardPunishmentDetailService personnelMonthlyAssessmentIndicatorRewardPunishmentDetailService;
52 61
     @Autowired
53 62
     private IBasePerformanceIndicatorCategoryService basePerformanceIndicatorCategoryService;
63
+    @Autowired
64
+    private ISysUserService sysUserService;
54 65
 
55 66
     /**
56 67
      * 查询非干部月度考核
@@ -68,136 +79,21 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
68 79
         LambdaQueryWrapper<PersonnelMonthlyAssessmentIndicatorDetail> detailQueryWrapper = new LambdaQueryWrapper<>();
69 80
         detailQueryWrapper.eq(PersonnelMonthlyAssessmentIndicatorDetail::getSourceId, result.getId());
70 81
         List<PersonnelMonthlyAssessmentIndicatorDetail> personnelMonthlyAssessmentIndicatorDetailList = personnelMonthlyAssessmentIndicatorDetailService.getBaseMapper().selectList(detailQueryWrapper);
71
-        if (CollUtil.isEmpty(personnelMonthlyAssessmentIndicatorDetailList)) {
72
-            return result;
73
-        }
74 82
         result.setPersonnelMonthlyAssessmentIndicatorDetailList(personnelMonthlyAssessmentIndicatorDetailList);
75
-        // 奖罚明细列表
76
-        LambdaQueryWrapper<PersonnelMonthlyAssessmentIndicatorRewardPunishmentDetail> rewardPunishmentDetailQueryWrapper = new LambdaQueryWrapper<>();
77
-        rewardPunishmentDetailQueryWrapper.in(PersonnelMonthlyAssessmentIndicatorRewardPunishmentDetail::getSourceId, personnelMonthlyAssessmentIndicatorDetailList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getId).toArray());
78
-        List<PersonnelMonthlyAssessmentIndicatorRewardPunishmentDetail> personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList = personnelMonthlyAssessmentIndicatorRewardPunishmentDetailService.getBaseMapper().selectList(rewardPunishmentDetailQueryWrapper);
79
-        if (CollUtil.isEmpty(personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList)) {
80
-            return result;
81
-        }
82
-        Map<Long, List<PersonnelMonthlyAssessmentIndicatorRewardPunishmentDetail>> rewardPunishmentDetailMap = personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList.stream().collect(Collectors.groupingBy(PersonnelMonthlyAssessmentIndicatorRewardPunishmentDetail::getSourceId));
83
-        personnelMonthlyAssessmentIndicatorDetailList.forEach(item -> {
84
-            item.setPersonnelMonthlyAssessmentIndicatorRewardPunishmentDetailList(rewardPunishmentDetailMap.get(item.getId()));
85
-        });
86
-
87
-        List<BasePerformanceIndicatorCategory> indicatorCategoryyList = basePerformanceIndicatorCategoryService.selectBasePerformanceIndicatorCategoryListTree(new BasePerformanceIndicatorCategory());
88
-        // 红线指标
89
-        BasePerformanceIndicatorCategory redLineIndexCategory = indicatorCategoryyList.stream().filter(item -> StrUtil.equals("红线指标", item.getName())).findFirst().orElse(null);
90
-        List<BasePerformanceIndicatorCategory> redLineIndexCategoryChildren = (List<BasePerformanceIndicatorCategory>) redLineIndexCategory.getChildren();
91
-        List<String> redLineIndexCategoryCodeList = redLineIndexCategoryChildren.stream().map(BasePerformanceIndicatorCategory::getCode).collect(Collectors.toList());
92
-        List<PersonnelMonthlyAssessmentIndicatorDetail> redLineIndexAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream().filter(item -> redLineIndexCategoryCodeList.contains(item.getIndicatorCode())).collect(Collectors.toList());
93
-        Integer redLineIndexTriggerCount = redLineIndexAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getOccurCount).filter(ObjUtil::isNotNull).reduce(0, Integer::sum);
94
-        result.setRedLineIndexTriggerCount(redLineIndexTriggerCount);
95
-        result.setRedLineIndexAccordList(redLineIndexAccordList);
96
-        // 核心指标
97
-        BasePerformanceIndicatorCategory coreIndexCategory = indicatorCategoryyList.stream().filter(item -> StrUtil.equals("核心指标", item.getName())).findFirst().orElse(null);
98
-        List<BasePerformanceIndicatorCategory> coreIndexCategoryChildren = (List<BasePerformanceIndicatorCategory>) coreIndexCategory.getChildren();
99
-        List<String> coreIndexCategoryCodeList = coreIndexCategoryChildren.stream().map(BasePerformanceIndicatorCategory::getCode).collect(Collectors.toList());
100
-        List<PersonnelMonthlyAssessmentIndicatorDetail> coreIndexAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream().filter(item -> coreIndexCategoryCodeList.contains(item.getIndicatorCode())).collect(Collectors.toList());
101
-        BigDecimal coreIndexScore = coreIndexAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getScoreResult).filter(ObjUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
102
-        result.setCoreIndexScore(coreIndexScore);
103
-        result.setCoreIndexAccordList(coreIndexAccordList);
104
-        // 其他指标
105
-        BasePerformanceIndicatorCategory otherIndexCategory = indicatorCategoryyList.stream().filter(item -> StrUtil.equals("其他指标", item.getName())).findFirst().orElse(null);
106
-        List<BasePerformanceIndicatorCategory> otherIndexCategoryChildren = (List<BasePerformanceIndicatorCategory>) otherIndexCategory.getChildren();
107
-        List<String> otherIndexCategoryCodeList = otherIndexCategoryChildren.stream().map(BasePerformanceIndicatorCategory::getCode).collect(Collectors.toList());
108
-        List<PersonnelMonthlyAssessmentIndicatorDetail> otherIndexAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream().filter(item -> otherIndexCategoryCodeList.contains(item.getIndicatorCode())).collect(Collectors.toList());
109
-        BigDecimal otherIndexScore = otherIndexAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getScoreResult).filter(ObjUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
110
-        result.setOtherIndexScore(otherIndexScore);
111
-        result.setOtherIndexAccordList(otherIndexAccordList);
112
-        // 其他指标-安全
113
-        List<BasePerformanceIndicatorCategory> otherIndexSafetyCategory = otherIndexCategoryChildren.stream().filter(item -> StrUtil.equals("安全", item.getName())).collect(Collectors.toList());
114
-        List<String> otherIndexSafetyCategoryCodeList = otherIndexSafetyCategory.stream().map(BasePerformanceIndicatorCategory::getCode).collect(Collectors.toList());
115
-        // 其他指标-安全-仅含SOC/站品控检查扣分
116
-        List<PersonnelMonthlyAssessmentIndicatorDetail> otherIndexWithSocStationQcAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
117
-                .filter(item -> otherIndexSafetyCategoryCodeList.contains(item.getIndicatorCode()))
118
-                .filter(item -> StrUtil.equals(BasePerformanceIndicatorQcDeptTypeEnum.SOC.getCode(), item.getIndicatorCode()) || StrUtil.equals(BasePerformanceIndicatorQcDeptTypeEnum.STATION_QC.getCode(), item.getIndicatorCode()))
119
-                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.PUNISHMENT.getCode(), item.getRewardPunishmentType()))
120
-                .collect(Collectors.toList());
121
-        BigDecimal otherIndexSafetyScoreWithSocStationQcDeduction = otherIndexWithSocStationQcAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getScoreResult).filter(ObjUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
122
-        result.setOtherIndexSafetyScoreWithSocStationQcDeduction(otherIndexSafetyScoreWithSocStationQcDeduction);
123
-        result.setOtherIndexSafetyScoreWithSocStationQcAccordList(otherIndexWithSocStationQcAccordList);
124
-        // 其他指标-安全-不仅含SOC/站品控检查扣分
125
-        List<PersonnelMonthlyAssessmentIndicatorDetail> otherIndexWithoutSocStationQcAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
126
-                .filter(item -> otherIndexSafetyCategoryCodeList.contains(item.getIndicatorCode()))
127
-                .filter(item -> !(StrUtil.equals(BasePerformanceIndicatorQcDeptTypeEnum.SOC.getCode(), item.getIndicatorCode()) || StrUtil.equals(BasePerformanceIndicatorQcDeptTypeEnum.STATION_QC.getCode(), item.getIndicatorCode())))
128
-                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.PUNISHMENT.getCode(), item.getRewardPunishmentType()))
129
-                .collect(Collectors.toList());
130
-        BigDecimal otherIndexSafetyScoreWithoutSocStationQcDeduction = otherIndexWithoutSocStationQcAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getScoreResult).filter(ObjUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
131
-        result.setOtherIndexSafetyScoreWithoutSocStationQcDeduction(otherIndexSafetyScoreWithoutSocStationQcDeduction);
132
-        result.setOtherIndexSafetyScoreWithoutSocStationQcAccordList(otherIndexWithoutSocStationQcAccordList);
133
-        // 其他指标-非安全
134
-        List<BasePerformanceIndicatorCategory> otherIndexNonSafetyCategory = otherIndexCategoryChildren.stream().filter(item -> !StrUtil.equals("安全", item.getName())).collect(Collectors.toList());
135
-        List<String> otherIndexNonSafetyCategoryCodeList = otherIndexNonSafetyCategory.stream().map(BasePerformanceIndicatorCategory::getCode).collect(Collectors.toList());
136
-        List<PersonnelMonthlyAssessmentIndicatorDetail> otherIndexNonSafetyAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
137
-                .filter(item -> otherIndexNonSafetyCategoryCodeList.contains(item.getIndicatorCode()))
138
-                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.PUNISHMENT.getCode(), item.getRewardPunishmentType()))
139
-                .collect(Collectors.toList());
140
-        BigDecimal otherIndexNonSafetyDeduction = otherIndexNonSafetyAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getScoreResult).filter(ObjUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
141
-        result.setOtherIndexNonSafetyDeduction(otherIndexNonSafetyDeduction);
142
-        result.setOtherIndexNonSafetyAccordList(otherIndexNonSafetyAccordList);
143
-        // 非核心安全+核心扣分
144
-        BigDecimal nonCoreSafetyPlusCoreDeduction = result.getOtherIndexSafetyScoreWithSocStationQcDeduction().add(result.getOtherIndexSafetyScoreWithoutSocStationQcDeduction()).add(result.getOtherIndexNonSafetyDeduction());
145
-        result.setNonCoreSafetyPlusCoreDeduction(nonCoreSafetyPlusCoreDeduction);
146
-        // 核心指标+其他指标-安全
147
-        List<String> socStationQcInvolvedCoreSafetyCodeList = new ArrayList<>();
148
-        socStationQcInvolvedCoreSafetyCodeList.addAll(coreIndexCategoryCodeList);
149
-        socStationQcInvolvedCoreSafetyCodeList.addAll(otherIndexSafetyCategoryCodeList);
150
-        List<PersonnelMonthlyAssessmentIndicatorDetail> socStationQcInvolvedCoreSafetyAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
151
-                .filter(item -> socStationQcInvolvedCoreSafetyCodeList.contains(item.getIndicatorCode()))
152
-                .filter(item -> !(StrUtil.equals(BasePerformanceIndicatorQcDeptTypeEnum.SOC.getCode(), item.getIndicatorCode()) || StrUtil.equals(BasePerformanceIndicatorQcDeptTypeEnum.STATION_QC.getCode(), item.getIndicatorCode())))
153
-                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.PUNISHMENT.getCode(), item.getRewardPunishmentType()))
154
-                .collect(Collectors.toList());
155
-        BigDecimal socStationQcInvolvedCoreSafetyDeduction = socStationQcInvolvedCoreSafetyAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getScoreResult).filter(ObjUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
156
-        result.setSocStationQcInvolvedCoreSafetyDeduction(socStationQcInvolvedCoreSafetyDeduction);
157
-        result.setSocStationQcInvolvedCoreSafetyAccordList(socStationQcInvolvedCoreSafetyAccordList);
158
-        // 分管员工数量+扣分平均值
159
-        if (StrUtil.equals(RoleTypeEnum.kezhang.getCode(), result.getRoleKey())) {
160
-            PersonnelNonCadreMonthlyAssessment queryKeZhang = new PersonnelNonCadreMonthlyAssessment();
161
-            queryKeZhang.setAssessmentMonth(result.getAssessmentMonth());
162
-            queryKeZhang.setDeputySupervisorId(result.getUserId());
163
-            List<PersonnelNonCadreMonthlyAssessment> personnelNonCadreMonthlyAssessmentKeZhangList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(queryKeZhang);
164
-            result.setInChargeEmployeeCount(personnelNonCadreMonthlyAssessmentKeZhangList.size());
165
-            result.setDeductionAverage(CollUtil.isEmpty(personnelNonCadreMonthlyAssessmentKeZhangList) ? BigDecimal.ZERO : result.getSocStationQcInvolvedCoreSafetyDeduction().divide(BigDecimal.valueOf(personnelNonCadreMonthlyAssessmentKeZhangList.size()), 2, RoundingMode.HALF_UP));
166
-        }
167
-        // 总分
168
-        BigDecimal totalScore = BASE_SCORE.add(result.getCoreIndexScore()).add(result.getOtherIndexScore());
169
-        if (result.getRedLineIndexTriggerCount() > 0) {
170
-            totalScore = RED_LINE_SCORE;
83
+        if (CollUtil.isNotEmpty(result.getPersonnelMonthlyAssessmentIndicatorDetailList())) {
84
+            // 奖罚明细列表
85
+            LambdaQueryWrapper<PersonnelMonthlyAssessmentIndicatorRewardPunishmentDetail> rewardPunishmentDetailQueryWrapper = new LambdaQueryWrapper<>();
86
+            rewardPunishmentDetailQueryWrapper.in(PersonnelMonthlyAssessmentIndicatorRewardPunishmentDetail::getSourceId, result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getId).toArray());
87
+            List<PersonnelMonthlyAssessmentIndicatorRewardPunishmentDetail> personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList = personnelMonthlyAssessmentIndicatorRewardPunishmentDetailService.getBaseMapper().selectList(rewardPunishmentDetailQueryWrapper);
88
+            if (CollUtil.isNotEmpty(personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList)) {
89
+                Map<Long, List<PersonnelMonthlyAssessmentIndicatorRewardPunishmentDetail>> rewardPunishmentDetailMap = personnelMonthlyAssessmentIndicatorRewardPunishmentDetailList.stream().collect(Collectors.groupingBy(PersonnelMonthlyAssessmentIndicatorRewardPunishmentDetail::getSourceId));
90
+                result.getPersonnelMonthlyAssessmentIndicatorDetailList().forEach(item -> {
91
+                    item.setPersonnelMonthlyAssessmentIndicatorRewardPunishmentDetailList(rewardPunishmentDetailMap.get(item.getId()));
92
+                });
93
+            }
171 94
         }
172
-        result.setTotalScore(totalScore);
173
-        // 奖励明细+惩罚明细
174
-        List<String> coreAndOtherCategoryCodeList = new ArrayList<>();
175
-        coreAndOtherCategoryCodeList.addAll(coreIndexCategoryCodeList);
176
-        coreAndOtherCategoryCodeList.addAll(otherIndexCategoryCodeList);
177
-        List<PersonnelMonthlyAssessmentIndicatorDetail> rewardAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
178
-                .filter(item -> coreAndOtherCategoryCodeList.contains(item.getIndicatorCode()))
179
-                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.REWARD.getCode(), item.getRewardPunishmentType()))
180
-                .collect(Collectors.toList());
181
-        result.setRewardAccordList(rewardAccordList);
182
-        List<PersonnelMonthlyAssessmentIndicatorDetail> punishmentAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
183
-                .filter(item -> coreAndOtherCategoryCodeList.contains(item.getIndicatorCode()))
184
-                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.PUNISHMENT.getCode(), item.getRewardPunishmentType()))
185
-                .collect(Collectors.toList());
186
-        punishmentAccordList.addAll(result.getRedLineIndexAccordList());
187
-        result.setPunishmentAccordList(punishmentAccordList);
188
-        // 奖励金额+惩罚金额
189
-        BigDecimal rewardAmount = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
190
-                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.REWARD.getCode(), item.getRewardPunishmentType()))
191
-                .map(PersonnelMonthlyAssessmentIndicatorDetail::getAmountResult)
192
-                .filter(ObjUtil::isNotNull)
193
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
194
-        result.setRewardAmount(rewardAmount);
195
-        BigDecimal punishmentAmount = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
196
-                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.PUNISHMENT.getCode(), item.getRewardPunishmentType()))
197
-                .map(PersonnelMonthlyAssessmentIndicatorDetail::getAmountResult)
198
-                .filter(ObjUtil::isNotNull)
199
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
200
-        result.setPunishmentAmount(punishmentAmount);
95
+        // 完善数据
96
+        doImprove(result);
201 97
         return result;
202 98
     }
203 99
 
@@ -246,6 +142,8 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
246 142
                 }
247 143
             });
248 144
         }
145
+        PersonnelNonCadreMonthlyAssessment dto = selectPersonnelNonCadreMonthlyAssessmentById(personnelNonCadreMonthlyAssessment.getId());
146
+        personnelNonCadreMonthlyAssessmentMapper.updatePersonnelNonCadreMonthlyAssessment(dto);
249 147
         return result;
250 148
     }
251 149
 
@@ -294,6 +192,8 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
294 192
                 }
295 193
             });
296 194
         }
195
+        PersonnelNonCadreMonthlyAssessment dto = selectPersonnelNonCadreMonthlyAssessmentById(personnelNonCadreMonthlyAssessment.getId());
196
+        personnelNonCadreMonthlyAssessmentMapper.updatePersonnelNonCadreMonthlyAssessment(dto);
297 197
         return result;
298 198
     }
299 199
 
@@ -348,4 +248,595 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
348 248
         }
349 249
         return result;
350 250
     }
251
+
252
+    /**
253
+     * 完善数据
254
+     *
255
+     * @param result 非干部月度考核
256
+     * @return 非干部月度考核
257
+     */
258
+    private void doImprove(PersonnelNonCadreMonthlyAssessment result) {
259
+        List<BasePerformanceIndicatorCategory> indicatorCategoryyList = basePerformanceIndicatorCategoryService.selectBasePerformanceIndicatorCategoryListTree(new BasePerformanceIndicatorCategory());
260
+        // 红线指标
261
+        BasePerformanceIndicatorCategory redLineIndexCategory = indicatorCategoryyList.stream().filter(item -> StrUtil.equals("红线指标", item.getName())).findFirst().orElse(null);
262
+        List<BasePerformanceIndicatorCategory> redLineIndexCategoryChildren = (List<BasePerformanceIndicatorCategory>) redLineIndexCategory.getChildren();
263
+        List<String> redLineIndexCategoryCodeList = redLineIndexCategoryChildren.stream().map(BasePerformanceIndicatorCategory::getCode).collect(Collectors.toList());
264
+        List<PersonnelMonthlyAssessmentIndicatorDetail> redLineIndexAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream().filter(item -> redLineIndexCategoryCodeList.contains(item.getIndicatorCode())).collect(Collectors.toList());
265
+        Integer redLineIndexTriggerCount = redLineIndexAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getOccurCount).filter(ObjUtil::isNotNull).reduce(0, Integer::sum);
266
+        result.setRedLineIndexTriggerCount(redLineIndexTriggerCount);
267
+        result.setRedLineIndexAccordList(redLineIndexAccordList);
268
+        // 核心指标
269
+        BasePerformanceIndicatorCategory coreIndexCategory = indicatorCategoryyList.stream().filter(item -> StrUtil.equals("核心指标", item.getName())).findFirst().orElse(null);
270
+        List<BasePerformanceIndicatorCategory> coreIndexCategoryChildren = (List<BasePerformanceIndicatorCategory>) coreIndexCategory.getChildren();
271
+        List<String> coreIndexCategoryCodeList = coreIndexCategoryChildren.stream().map(BasePerformanceIndicatorCategory::getCode).collect(Collectors.toList());
272
+        List<PersonnelMonthlyAssessmentIndicatorDetail> coreIndexAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream().filter(item -> coreIndexCategoryCodeList.contains(item.getIndicatorCode())).collect(Collectors.toList());
273
+        BigDecimal coreIndexScore = coreIndexAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getScoreResult).filter(ObjUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
274
+        result.setCoreIndexScore(coreIndexScore);
275
+        result.setCoreIndexAccordList(coreIndexAccordList);
276
+        // 其他指标
277
+        BasePerformanceIndicatorCategory otherIndexCategory = indicatorCategoryyList.stream().filter(item -> StrUtil.equals("其他指标", item.getName())).findFirst().orElse(null);
278
+        List<BasePerformanceIndicatorCategory> otherIndexCategoryChildren = (List<BasePerformanceIndicatorCategory>) otherIndexCategory.getChildren();
279
+        List<String> otherIndexCategoryCodeList = otherIndexCategoryChildren.stream().map(BasePerformanceIndicatorCategory::getCode).collect(Collectors.toList());
280
+        List<PersonnelMonthlyAssessmentIndicatorDetail> otherIndexAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream().filter(item -> otherIndexCategoryCodeList.contains(item.getIndicatorCode())).collect(Collectors.toList());
281
+        BigDecimal otherIndexScore = otherIndexAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getScoreResult).filter(ObjUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
282
+        result.setOtherIndexScore(otherIndexScore);
283
+        result.setOtherIndexAccordList(otherIndexAccordList);
284
+        // 其他指标-安全
285
+        List<BasePerformanceIndicatorCategory> otherIndexSafetyCategory = otherIndexCategoryChildren.stream().filter(item -> StrUtil.equals("安全", item.getName())).collect(Collectors.toList());
286
+        List<String> otherIndexSafetyCategoryCodeList = otherIndexSafetyCategory.stream().map(BasePerformanceIndicatorCategory::getCode).collect(Collectors.toList());
287
+        // 其他指标-安全-仅含SOC/站品控检查扣分
288
+        List<PersonnelMonthlyAssessmentIndicatorDetail> otherIndexWithSocStationQcAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
289
+                .filter(item -> otherIndexSafetyCategoryCodeList.contains(item.getIndicatorCode()))
290
+                .filter(item -> StrUtil.equals(BasePerformanceIndicatorQcDeptTypeEnum.SOC.getCode(), item.getIndicatorCode()) || StrUtil.equals(BasePerformanceIndicatorQcDeptTypeEnum.STATION_QC.getCode(), item.getIndicatorCode()))
291
+                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.PUNISHMENT.getCode(), item.getRewardPunishmentType()))
292
+                .collect(Collectors.toList());
293
+        BigDecimal otherIndexSafetyScoreWithSocStationQcDeduction = otherIndexWithSocStationQcAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getScoreResult).filter(ObjUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
294
+        result.setOtherIndexSafetyScoreWithSocStationQcDeduction(otherIndexSafetyScoreWithSocStationQcDeduction);
295
+        result.setOtherIndexSafetyScoreWithSocStationQcAccordList(otherIndexWithSocStationQcAccordList);
296
+        // 其他指标-安全-不仅含SOC/站品控检查扣分
297
+        List<PersonnelMonthlyAssessmentIndicatorDetail> otherIndexWithoutSocStationQcAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
298
+                .filter(item -> otherIndexSafetyCategoryCodeList.contains(item.getIndicatorCode()))
299
+                .filter(item -> !(StrUtil.equals(BasePerformanceIndicatorQcDeptTypeEnum.SOC.getCode(), item.getIndicatorCode()) || StrUtil.equals(BasePerformanceIndicatorQcDeptTypeEnum.STATION_QC.getCode(), item.getIndicatorCode())))
300
+                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.PUNISHMENT.getCode(), item.getRewardPunishmentType()))
301
+                .collect(Collectors.toList());
302
+        BigDecimal otherIndexSafetyScoreWithoutSocStationQcDeduction = otherIndexWithoutSocStationQcAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getScoreResult).filter(ObjUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
303
+        result.setOtherIndexSafetyScoreWithoutSocStationQcDeduction(otherIndexSafetyScoreWithoutSocStationQcDeduction);
304
+        result.setOtherIndexSafetyScoreWithoutSocStationQcAccordList(otherIndexWithoutSocStationQcAccordList);
305
+        // 其他指标-非安全
306
+        List<BasePerformanceIndicatorCategory> otherIndexNonSafetyCategory = otherIndexCategoryChildren.stream().filter(item -> !StrUtil.equals("安全", item.getName())).collect(Collectors.toList());
307
+        List<String> otherIndexNonSafetyCategoryCodeList = otherIndexNonSafetyCategory.stream().map(BasePerformanceIndicatorCategory::getCode).collect(Collectors.toList());
308
+        List<PersonnelMonthlyAssessmentIndicatorDetail> otherIndexNonSafetyAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
309
+                .filter(item -> otherIndexNonSafetyCategoryCodeList.contains(item.getIndicatorCode()))
310
+                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.PUNISHMENT.getCode(), item.getRewardPunishmentType()))
311
+                .collect(Collectors.toList());
312
+        BigDecimal otherIndexNonSafetyDeduction = otherIndexNonSafetyAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getScoreResult).filter(ObjUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
313
+        result.setOtherIndexNonSafetyDeduction(otherIndexNonSafetyDeduction);
314
+        result.setOtherIndexNonSafetyAccordList(otherIndexNonSafetyAccordList);
315
+        // 非核心安全+核心扣分
316
+        BigDecimal nonCoreSafetyPlusCoreDeduction = result.getOtherIndexSafetyScoreWithSocStationQcDeduction().add(result.getOtherIndexSafetyScoreWithoutSocStationQcDeduction()).add(result.getOtherIndexNonSafetyDeduction());
317
+        result.setNonCoreSafetyPlusCoreDeduction(nonCoreSafetyPlusCoreDeduction);
318
+        // 核心指标+其他指标-安全
319
+        List<String> socStationQcInvolvedCoreSafetyCodeList = new ArrayList<>();
320
+        socStationQcInvolvedCoreSafetyCodeList.addAll(coreIndexCategoryCodeList);
321
+        socStationQcInvolvedCoreSafetyCodeList.addAll(otherIndexSafetyCategoryCodeList);
322
+        List<PersonnelMonthlyAssessmentIndicatorDetail> socStationQcInvolvedCoreSafetyAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
323
+                .filter(item -> socStationQcInvolvedCoreSafetyCodeList.contains(item.getIndicatorCode()))
324
+                .filter(item -> !(StrUtil.equals(BasePerformanceIndicatorQcDeptTypeEnum.SOC.getCode(), item.getIndicatorCode()) || StrUtil.equals(BasePerformanceIndicatorQcDeptTypeEnum.STATION_QC.getCode(), item.getIndicatorCode())))
325
+                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.PUNISHMENT.getCode(), item.getRewardPunishmentType()))
326
+                .collect(Collectors.toList());
327
+        BigDecimal socStationQcInvolvedCoreSafetyDeduction = socStationQcInvolvedCoreSafetyAccordList.stream().map(PersonnelMonthlyAssessmentIndicatorDetail::getScoreResult).filter(ObjUtil::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add);
328
+        result.setSocStationQcInvolvedCoreSafetyDeduction(socStationQcInvolvedCoreSafetyDeduction);
329
+        result.setSocStationQcInvolvedCoreSafetyAccordList(socStationQcInvolvedCoreSafetyAccordList);
330
+        // 分管员工数量+扣分平均值
331
+        if (StrUtil.equals(RoleTypeEnum.kezhang.getCode(), result.getRoleKey())) {
332
+            PersonnelNonCadreMonthlyAssessment queryKeZhang = new PersonnelNonCadreMonthlyAssessment();
333
+            queryKeZhang.setAssessmentMonth(result.getAssessmentMonth());
334
+            queryKeZhang.setDeputySupervisorId(result.getUserId());
335
+            List<PersonnelNonCadreMonthlyAssessment> personnelNonCadreMonthlyAssessmentKeZhangList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(queryKeZhang);
336
+            result.setInChargeEmployeeCount(personnelNonCadreMonthlyAssessmentKeZhangList.size());
337
+            result.setDeductionAverage(CollUtil.isEmpty(personnelNonCadreMonthlyAssessmentKeZhangList) ? BigDecimal.ZERO : result.getSocStationQcInvolvedCoreSafetyDeduction().divide(BigDecimal.valueOf(personnelNonCadreMonthlyAssessmentKeZhangList.size()), 2, RoundingMode.HALF_UP));
338
+        }
339
+        // 总分
340
+        BigDecimal totalScore = BASE_SCORE.add(result.getCoreIndexScore()).add(result.getOtherIndexScore());
341
+        if (result.getRedLineIndexTriggerCount() > 0) {
342
+            totalScore = RED_LINE_SCORE;
343
+        }
344
+        result.setTotalScore(totalScore);
345
+        // 奖励明细+惩罚明细
346
+        List<String> coreAndOtherCategoryCodeList = new ArrayList<>();
347
+        coreAndOtherCategoryCodeList.addAll(coreIndexCategoryCodeList);
348
+        coreAndOtherCategoryCodeList.addAll(otherIndexCategoryCodeList);
349
+        List<PersonnelMonthlyAssessmentIndicatorDetail> rewardAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
350
+                .filter(item -> coreAndOtherCategoryCodeList.contains(item.getIndicatorCode()))
351
+                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.REWARD.getCode(), item.getRewardPunishmentType()))
352
+                .collect(Collectors.toList());
353
+        result.setRewardAccordList(rewardAccordList);
354
+        List<PersonnelMonthlyAssessmentIndicatorDetail> punishmentAccordList = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
355
+                .filter(item -> coreAndOtherCategoryCodeList.contains(item.getIndicatorCode()))
356
+                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.PUNISHMENT.getCode(), item.getRewardPunishmentType()))
357
+                .collect(Collectors.toList());
358
+        punishmentAccordList.addAll(result.getRedLineIndexAccordList());
359
+        result.setPunishmentAccordList(punishmentAccordList);
360
+        // 奖励金额+惩罚金额
361
+        BigDecimal rewardAmount = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
362
+                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.REWARD.getCode(), item.getRewardPunishmentType()))
363
+                .map(PersonnelMonthlyAssessmentIndicatorDetail::getAmountResult)
364
+                .filter(ObjUtil::isNotNull)
365
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
366
+        result.setRewardAmount(rewardAmount);
367
+        BigDecimal punishmentAmount = result.getPersonnelMonthlyAssessmentIndicatorDetailList().stream()
368
+                .filter(item -> StrUtil.equals(BasePerformanceIndicatorRewardPunishmentTypeTypeEnum.PUNISHMENT.getCode(), item.getRewardPunishmentType()))
369
+                .map(PersonnelMonthlyAssessmentIndicatorDetail::getAmountResult)
370
+                .filter(ObjUtil::isNotNull)
371
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
372
+        result.setPunishmentAmount(punishmentAmount);
373
+        // 考核结果+是否豁免+应用方式
374
+        if (StrUtil.equals(RoleTypeEnum.SecurityCheck.getCode(), result.getRoleKey())) {
375
+            doSecurityCheck(result);
376
+        } else if (StrUtil.equals(RoleTypeEnum.banzuzhang.getCode(), result.getRoleKey())) {
377
+            doTeamLeader(result);
378
+        } else if (StrUtil.equals(RoleTypeEnum.kezhang.getCode(), result.getRoleKey())) {
379
+            doSupervisor(result);
380
+        }
381
+    }
382
+
383
+    /**
384
+     * 安检员考核
385
+     *
386
+     * @param result
387
+     */
388
+    private void doSecurityCheck(PersonnelNonCadreMonthlyAssessment result) {
389
+        // 考核结果
390
+        PersonnelNonCadreMonthlyAssessment assessmentTeamQuery = new PersonnelNonCadreMonthlyAssessment();
391
+        assessmentTeamQuery.setAssessmentMonth(result.getAssessmentMonth());
392
+        assessmentTeamQuery.setAssessmentTeam(result.getAssessmentTeam());
393
+        List<PersonnelNonCadreMonthlyAssessment> assessmentTeamList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(assessmentTeamQuery);
394
+        boolean assessmentResultRuleOne = isInBottom5Percent(result, assessmentTeamList, PersonnelNonCadreMonthlyAssessment::getTotalScore);
395
+        boolean assessmentResultRuleTwo = result.getTotalScore().compareTo(BigDecimal.valueOf(75)) < 0;
396
+        boolean assessmentResultRuleThree = result.getNonCoreSafetyPlusCoreDeduction().abs().compareTo(BigDecimal.valueOf(10)) >= 0;
397
+        boolean assessmentResultRuleFour = result.getRedLineIndexTriggerCount() > 0 || result.getTotalScore().compareTo(BigDecimal.valueOf(70)) < 0;
398
+        List<String> assessmentResultRuleList = new ArrayList<>();
399
+        if (assessmentResultRuleOne) {
400
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName());
401
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getDesc());
402
+        }
403
+        if (assessmentResultRuleTwo) {
404
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName());
405
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getDesc());
406
+        }
407
+        if (assessmentResultRuleThree) {
408
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_THREE.getName());
409
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_THREE.getDesc());
410
+        }
411
+        if (assessmentResultRuleFour) {
412
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_FOUR.getName());
413
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_FOUR.getDesc());
414
+        }
415
+        if (CollUtil.isNotEmpty(assessmentResultRuleList)) {
416
+            result.setAssessmentResultRemark(String.join(";", assessmentResultRuleList));
417
+        }
418
+        // 是否豁免
419
+        if (StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName(), result.getAssessmentResult())
420
+                || StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName(), result.getAssessmentResult())
421
+                || StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_THREE.getName(), result.getAssessmentResult())
422
+                || StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_FOUR.getName(), result.getAssessmentResult())) {
423
+            boolean exemptionRuleOne = CollUtil.isEmpty(result.getPunishmentAccordList());
424
+            boolean exemptionRuleTwo = result.getPunishmentAccordList().stream()
425
+                    .filter(item -> !(StrUtil.equals(BasePerformanceIndicatorLeaveTypeEnum.PERSONAL_LEAVE.getCode(), item.getLeaveType())
426
+                            || StrUtil.equals(BasePerformanceIndicatorLeaveTypeEnum.SICK_LEAVE.getCode(), item.getLeaveType())
427
+                            || StrUtil.equals(BasePerformanceIndicatorLeaveTypeEnum.PERSONAL_SICK_LEAVE.getCode(), item.getLeaveType())))
428
+                    .count() == 0;
429
+            if (exemptionRuleOne) {
430
+                result.setExemption(BasePerformanceIndicatorExemptionRuleEnum.EXEMPTION_RULE_ONE.getName());
431
+                result.setExemptionReasonRemark(BasePerformanceIndicatorExemptionRuleEnum.EXEMPTION_RULE_ONE.getDesc());
432
+                result.setAssessmentResult(null);
433
+            } else if (exemptionRuleTwo) {
434
+                result.setExemption(BasePerformanceIndicatorExemptionRuleEnum.EXEMPTION_RULE_TWO.getName());
435
+                result.setExemptionReasonRemark(BasePerformanceIndicatorExemptionRuleEnum.EXEMPTION_RULE_TWO.getDesc());
436
+                result.setAssessmentResult(null);
437
+            }
438
+        }
439
+        // 应用方式
440
+        boolean applicationMethodRuleOne = StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName(), result.getAssessmentResult());
441
+        boolean applicationMethodRuleTwo1 = StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName(), result.getAssessmentResult());
442
+        boolean applicationMethodRuleTwo2_1 = StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName(), result.getAssessmentResult());
443
+        String previousMonth = MonthUtils.getPreviousMonth(result.getAssessmentMonth());
444
+        PersonnelNonCadreMonthlyAssessment previousMonthQuery = new PersonnelNonCadreMonthlyAssessment();
445
+        previousMonthQuery.setUserId(result.getUserId());
446
+        previousMonthQuery.setAssessmentMonth(previousMonth);
447
+        previousMonthQuery.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName());
448
+        List<PersonnelNonCadreMonthlyAssessment> previousMonthList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(previousMonthQuery);
449
+        boolean applicationMethodRuleTwo2_2 = CollUtil.isNotEmpty(previousMonthList);
450
+        boolean applicationMethodRuleTwo2 = applicationMethodRuleTwo2_1 && applicationMethodRuleTwo2_2;
451
+        boolean applicationMethodRuleTwo = applicationMethodRuleTwo1 || applicationMethodRuleTwo2;
452
+        boolean applicationMethodRuleThree = false;
453
+        if (StrUtil.equals(AssessmentTeamEnum.SECURITY_INSPECTOR_AND_X_RAY_PASSENGER_INSPECTION_STAFF.getCode(), result.getAssessmentTeam())) {
454
+            MonthUtils.MonthRange last3Months = MonthUtils.getLast3MonthsIncludeCurrent(result.getAssessmentMonth());
455
+            PersonnelNonCadreMonthlyAssessment last3MonthsQuery = new PersonnelNonCadreMonthlyAssessment();
456
+            last3MonthsQuery.setUserId(result.getUserId());
457
+            last3MonthsQuery.setAssessmentMonthStart(last3Months.getStartMonth());
458
+            last3MonthsQuery.setAssessmentMonthEnd(last3Months.getEndMonth());
459
+            last3MonthsQuery.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName());
460
+            List<PersonnelNonCadreMonthlyAssessment> last3MonthsList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(last3MonthsQuery);
461
+            boolean applicationMethodRuleThree1 = last3MonthsList.size() >= 3;
462
+            MonthUtils.MonthRange currentYearMonths = MonthUtils.getCurrentYearToMonth(result.getAssessmentMonth());
463
+            PersonnelNonCadreMonthlyAssessment currentYearMonthsResultRuleQuery = new PersonnelNonCadreMonthlyAssessment();
464
+            currentYearMonthsResultRuleQuery.setUserId(result.getUserId());
465
+            currentYearMonthsResultRuleQuery.setAssessmentMonthStart(currentYearMonths.getStartMonth());
466
+            currentYearMonthsResultRuleQuery.setAssessmentMonthEnd(currentYearMonths.getEndMonth());
467
+            currentYearMonthsResultRuleQuery.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName());
468
+            List<PersonnelNonCadreMonthlyAssessment> currentYearMonthsResultRuleList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(currentYearMonthsResultRuleQuery);
469
+            boolean applicationMethodRuleThree2 = currentYearMonthsResultRuleList.size() >= 4;
470
+            MonthUtils.MonthRange last12Months = MonthUtils.getLast12MonthsIncludeCurrent(result.getAssessmentMonth());
471
+            PersonnelNonCadreMonthlyAssessment last12MonthsQuery = new PersonnelNonCadreMonthlyAssessment();
472
+            last12MonthsQuery.setUserId(result.getUserId());
473
+            last12MonthsQuery.setAssessmentMonthStart(last12Months.getStartMonth());
474
+            last12MonthsQuery.setAssessmentMonthEnd(last12Months.getEndMonth());
475
+            last12MonthsQuery.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName());
476
+            List<PersonnelNonCadreMonthlyAssessment> last12MonthsList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(last12MonthsQuery);
477
+            boolean applicationMethodRuleThree3 = last12MonthsList.size() >= 2;
478
+            applicationMethodRuleThree = applicationMethodRuleThree1 || applicationMethodRuleThree2 || applicationMethodRuleThree3;
479
+        }
480
+        boolean applicationMethodRuleFour = false;
481
+        MonthUtils.MonthRange currentYearMonthsMethod = MonthUtils.getCurrentYearToMonth(result.getAssessmentMonth());
482
+        PersonnelNonCadreMonthlyAssessment currentYearMonthsMethodQuery = new PersonnelNonCadreMonthlyAssessment();
483
+        currentYearMonthsMethodQuery.setUserId(result.getUserId());
484
+        currentYearMonthsMethodQuery.setAssessmentMonthStart(currentYearMonthsMethod.getStartMonth());
485
+        currentYearMonthsMethodQuery.setAssessmentMonthEnd(currentYearMonthsMethod.getEndMonth());
486
+        currentYearMonthsMethodQuery.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_TWO.getName());
487
+        List<PersonnelNonCadreMonthlyAssessment> currentYearMonthsMethodList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(currentYearMonthsMethodQuery);
488
+        String maxAssessmentMonth = currentYearMonthsMethodList.stream().map(PersonnelNonCadreMonthlyAssessment::getAssessmentMonth).max(String::compareTo).orElse(null);
489
+        if (ObjUtil.isNotNull(maxAssessmentMonth) && !StrUtil.equals(maxAssessmentMonth, result.getAssessmentMonth())) {
490
+            PersonnelNonCadreMonthlyAssessment remainingMonthsOfYearQuery = new PersonnelNonCadreMonthlyAssessment();
491
+            remainingMonthsOfYearQuery.setUserId(result.getUserId());
492
+            remainingMonthsOfYearQuery.setAssessmentMonthStart(MonthUtils.getNextMonth(maxAssessmentMonth));
493
+            remainingMonthsOfYearQuery.setAssessmentMonthEnd(result.getAssessmentMonth());
494
+            List<PersonnelNonCadreMonthlyAssessment> remainingMonthsOfYearQueryList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(remainingMonthsOfYearQuery);
495
+            applicationMethodRuleFour = remainingMonthsOfYearQueryList.stream().filter(item -> StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName(), item.getAssessmentResult()) || StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName(), item.getAssessmentResult())).count() > 0;
496
+        }
497
+        if (applicationMethodRuleOne) {
498
+            result.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_ONE.getName());
499
+            result.setApplicationMethodRemark(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_ONE.getDesc());
500
+        }
501
+        if (applicationMethodRuleTwo) {
502
+            result.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_TWO.getName());
503
+            result.setApplicationMethodRemark(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_TWO.getDesc());
504
+        }
505
+        if (applicationMethodRuleThree) {
506
+            result.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_THREE.getName());
507
+            result.setApplicationMethodRemark(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_THREE.getDesc());
508
+        }
509
+        if (applicationMethodRuleFour) {
510
+            result.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_FOUR.getName());
511
+            result.setApplicationMethodRemark(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_FOUR.getDesc());
512
+        }
513
+    }
514
+
515
+    /**
516
+     * 班组长考核
517
+     *
518
+     * @param result
519
+     */
520
+    private void doTeamLeader(PersonnelNonCadreMonthlyAssessment result) {
521
+        // 考核结果
522
+        PersonnelNonCadreMonthlyAssessment assessmentTeamQuery = new PersonnelNonCadreMonthlyAssessment();
523
+        assessmentTeamQuery.setAssessmentMonth(result.getAssessmentMonth());
524
+        assessmentTeamQuery.setAssessmentTeam(result.getAssessmentTeam());
525
+        List<PersonnelNonCadreMonthlyAssessment> assessmentTeamList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(assessmentTeamQuery);
526
+        boolean assessmentResultRuleOne = isInBottom5Percent(result, assessmentTeamList, PersonnelNonCadreMonthlyAssessment::getTotalScore);
527
+        boolean assessmentResultRuleTwo = result.getTotalScore().compareTo(BigDecimal.valueOf(75)) < 0;
528
+        boolean assessmentResultRuleThree = result.getNonCoreSafetyPlusCoreDeduction().abs().compareTo(BigDecimal.valueOf(10)) >= 0;
529
+        boolean assessmentResultRuleFour = result.getRedLineIndexTriggerCount() > 0 || result.getTotalScore().compareTo(BigDecimal.valueOf(70)) < 0;
530
+        SysUser sysUser = sysUserService.selectUserById(result.getUserId());
531
+        List<String> roleKeyList = Collections.singletonList(RoleTypeEnum.SecurityCheck.getCode());
532
+        List<SysUser> sysUserList = sysUserService.selectUserListByRoleKeyAndDeptId(roleKeyList, sysUser.getDeptId());
533
+        List<Long> userIdList = sysUserList.stream().map(SysUser::getUserId).collect(Collectors.toList());
534
+        PersonnelNonCadreMonthlyAssessment currentMonthQuery = new PersonnelNonCadreMonthlyAssessment();
535
+        currentMonthQuery.setAssessmentMonth(result.getAssessmentMonth());
536
+        currentMonthQuery.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName());
537
+        List<PersonnelNonCadreMonthlyAssessment> currentMonthList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(currentMonthQuery);
538
+        boolean assessmentResultRuleFive = currentMonthList.stream().filter(item -> userIdList.contains(item.getUserId())).count() >= 2;
539
+        MonthUtils.MonthRange last12MonthsCurrent = MonthUtils.getLast12MonthsIncludeCurrent(result.getAssessmentMonth());
540
+        PersonnelNonCadreMonthlyAssessment last12MonthsResultRuleQuery = new PersonnelNonCadreMonthlyAssessment();
541
+        last12MonthsResultRuleQuery.setUserId(result.getUserId());
542
+        last12MonthsResultRuleQuery.setAssessmentMonthStart(last12MonthsCurrent.getStartMonth());
543
+        last12MonthsResultRuleQuery.setAssessmentMonthEnd(last12MonthsCurrent.getEndMonth());
544
+        last12MonthsResultRuleQuery.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName());
545
+        List<PersonnelNonCadreMonthlyAssessment> last12MonthsCurrentList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(last12MonthsResultRuleQuery);
546
+        boolean assessmentResultRuleSix = last12MonthsCurrentList.size() >= 2;
547
+        List<String> assessmentResultRuleList = new ArrayList<>();
548
+        if (assessmentResultRuleOne) {
549
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName());
550
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getDesc());
551
+        }
552
+        if (assessmentResultRuleTwo) {
553
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName());
554
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getDesc());
555
+        }
556
+        if (assessmentResultRuleThree) {
557
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_THREE.getName());
558
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_THREE.getDesc());
559
+        }
560
+        if (assessmentResultRuleFour) {
561
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_FOUR.getName());
562
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_FOUR.getDesc());
563
+        }
564
+        if (assessmentResultRuleFive) {
565
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_FIVE.getName());
566
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_FIVE.getDesc());
567
+        }
568
+        if (assessmentResultRuleSix) {
569
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_SIX.getName());
570
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_SIX.getDesc());
571
+        }
572
+        if (CollUtil.isNotEmpty(assessmentResultRuleList)) {
573
+            result.setAssessmentResultRemark(String.join(";", assessmentResultRuleList));
574
+        }
575
+        // 是否豁免
576
+        if (StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName(), result.getAssessmentResult())
577
+                || StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName(), result.getAssessmentResult())
578
+                || StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_THREE.getName(), result.getAssessmentResult())
579
+                || StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_FOUR.getName(), result.getAssessmentResult())) {
580
+            boolean exemptionRuleOne = CollUtil.isEmpty(result.getPunishmentAccordList());
581
+            boolean exemptionRuleTwo = result.getPunishmentAccordList().stream()
582
+                    .filter(item -> !(StrUtil.equals(BasePerformanceIndicatorLeaveTypeEnum.PERSONAL_LEAVE.getCode(), item.getLeaveType())
583
+                            || StrUtil.equals(BasePerformanceIndicatorLeaveTypeEnum.SICK_LEAVE.getCode(), item.getLeaveType())
584
+                            || StrUtil.equals(BasePerformanceIndicatorLeaveTypeEnum.PERSONAL_SICK_LEAVE.getCode(), item.getLeaveType())))
585
+                    .count() == 0;
586
+            if (exemptionRuleOne) {
587
+                result.setExemption(BasePerformanceIndicatorExemptionRuleEnum.EXEMPTION_RULE_ONE.getName());
588
+                result.setExemptionReasonRemark(BasePerformanceIndicatorExemptionRuleEnum.EXEMPTION_RULE_ONE.getDesc());
589
+                result.setAssessmentResult(null);
590
+            } else if (exemptionRuleTwo) {
591
+                result.setExemption(BasePerformanceIndicatorExemptionRuleEnum.EXEMPTION_RULE_TWO.getName());
592
+                result.setExemptionReasonRemark(BasePerformanceIndicatorExemptionRuleEnum.EXEMPTION_RULE_TWO.getDesc());
593
+                result.setAssessmentResult(null);
594
+            }
595
+        }
596
+        // 应用方式
597
+        boolean applicationMethodRuleOne = StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName(), result.getAssessmentResult());
598
+        boolean applicationMethodRuleTwo1 = StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName(), result.getAssessmentResult());
599
+        boolean applicationMethodRuleTwo2_1 = StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName(), result.getAssessmentResult());
600
+        String previousMonth = MonthUtils.getPreviousMonth(result.getAssessmentMonth());
601
+        PersonnelNonCadreMonthlyAssessment previousMonthQuery = new PersonnelNonCadreMonthlyAssessment();
602
+        previousMonthQuery.setUserId(result.getUserId());
603
+        previousMonthQuery.setAssessmentMonth(previousMonth);
604
+        previousMonthQuery.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName());
605
+        List<PersonnelNonCadreMonthlyAssessment> previousMonthList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(previousMonthQuery);
606
+        boolean applicationMethodRuleTwo2_2 = CollUtil.isNotEmpty(previousMonthList);
607
+        boolean applicationMethodRuleTwo2 = applicationMethodRuleTwo2_1 && applicationMethodRuleTwo2_2;
608
+        boolean applicationMethodRuleTwo = applicationMethodRuleTwo1 || applicationMethodRuleTwo2;
609
+        boolean applicationMethodRuleThree = false;
610
+        if (StrUtil.equals(AssessmentTeamEnum.SECURITY_INSPECTOR_AND_X_RAY_PASSENGER_INSPECTION_STAFF.getCode(), result.getAssessmentTeam())) {
611
+            MonthUtils.MonthRange last3Months = MonthUtils.getLast3MonthsIncludeCurrent(result.getAssessmentMonth());
612
+            PersonnelNonCadreMonthlyAssessment last3MonthsQuery = new PersonnelNonCadreMonthlyAssessment();
613
+            last3MonthsQuery.setUserId(result.getUserId());
614
+            last3MonthsQuery.setAssessmentMonthStart(last3Months.getStartMonth());
615
+            last3MonthsQuery.setAssessmentMonthEnd(last3Months.getEndMonth());
616
+            last3MonthsQuery.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName());
617
+            List<PersonnelNonCadreMonthlyAssessment> last3MonthsList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(last3MonthsQuery);
618
+            boolean applicationMethodRuleThree1 = last3MonthsList.size() >= 3;
619
+            MonthUtils.MonthRange currentYearMonths = MonthUtils.getCurrentYearToMonth(result.getAssessmentMonth());
620
+            PersonnelNonCadreMonthlyAssessment currentYearMonthsQuery = new PersonnelNonCadreMonthlyAssessment();
621
+            currentYearMonthsQuery.setUserId(result.getUserId());
622
+            currentYearMonthsQuery.setAssessmentMonthStart(currentYearMonths.getStartMonth());
623
+            currentYearMonthsQuery.setAssessmentMonthEnd(currentYearMonths.getEndMonth());
624
+            currentYearMonthsQuery.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName());
625
+            List<PersonnelNonCadreMonthlyAssessment> currentYearMonthsList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(currentYearMonthsQuery);
626
+            boolean applicationMethodRuleThree2 = currentYearMonthsList.size() >= 4;
627
+            MonthUtils.MonthRange last12Months = MonthUtils.getLast12MonthsIncludeCurrent(result.getAssessmentMonth());
628
+            PersonnelNonCadreMonthlyAssessment last12MonthsQuery = new PersonnelNonCadreMonthlyAssessment();
629
+            last12MonthsQuery.setUserId(result.getUserId());
630
+            last12MonthsQuery.setAssessmentMonthStart(last12Months.getStartMonth());
631
+            last12MonthsQuery.setAssessmentMonthEnd(last12Months.getEndMonth());
632
+            last12MonthsQuery.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName());
633
+            List<PersonnelNonCadreMonthlyAssessment> last12MonthsList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(last12MonthsQuery);
634
+            boolean applicationMethodRuleThree3 = last12MonthsList.size() >= 2;
635
+            applicationMethodRuleThree = applicationMethodRuleThree1 || applicationMethodRuleThree2 || applicationMethodRuleThree3;
636
+        }
637
+        boolean applicationMethodRuleFour = false;
638
+        MonthUtils.MonthRange currentYearMonthsTraining = MonthUtils.getCurrentYearToMonth(result.getAssessmentMonth());
639
+        PersonnelNonCadreMonthlyAssessment currentYearMonthsTrainingQuery = new PersonnelNonCadreMonthlyAssessment();
640
+        currentYearMonthsTrainingQuery.setUserId(result.getUserId());
641
+        currentYearMonthsTrainingQuery.setAssessmentMonthStart(currentYearMonthsTraining.getStartMonth());
642
+        currentYearMonthsTrainingQuery.setAssessmentMonthEnd(currentYearMonthsTraining.getEndMonth());
643
+        currentYearMonthsTrainingQuery.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_TWO.getName());
644
+        List<PersonnelNonCadreMonthlyAssessment> currentYearMonthsTrainingList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(currentYearMonthsTrainingQuery);
645
+        String maxAssessmentMonth = currentYearMonthsTrainingList.stream().map(PersonnelNonCadreMonthlyAssessment::getAssessmentMonth).max(String::compareTo).orElse(null);
646
+        if (ObjUtil.isNotNull(maxAssessmentMonth) && !StrUtil.equals(maxAssessmentMonth, result.getAssessmentMonth())) {
647
+            PersonnelNonCadreMonthlyAssessment remainingMonthsOfYearQuery = new PersonnelNonCadreMonthlyAssessment();
648
+            remainingMonthsOfYearQuery.setUserId(result.getUserId());
649
+            remainingMonthsOfYearQuery.setAssessmentMonthStart(MonthUtils.getNextMonth(maxAssessmentMonth));
650
+            remainingMonthsOfYearQuery.setAssessmentMonthEnd(result.getAssessmentMonth());
651
+            List<PersonnelNonCadreMonthlyAssessment> remainingMonthsOfYearQueryList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(remainingMonthsOfYearQuery);
652
+            applicationMethodRuleFour = remainingMonthsOfYearQueryList.stream().filter(item -> StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName(), item.getAssessmentResult()) || StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName(), item.getAssessmentResult())).count() > 0;
653
+        }
654
+        if (applicationMethodRuleOne) {
655
+            result.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_ONE.getName());
656
+            result.setApplicationMethodRemark(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_ONE.getDesc());
657
+        }
658
+        if (applicationMethodRuleTwo) {
659
+            result.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_TWO.getName());
660
+            result.setApplicationMethodRemark(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_TWO.getDesc());
661
+        }
662
+        if (applicationMethodRuleThree) {
663
+            result.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_THREE.getName());
664
+            result.setApplicationMethodRemark(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_THREE.getDesc());
665
+        }
666
+        if (applicationMethodRuleFour) {
667
+            result.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_FOUR.getName());
668
+            result.setApplicationMethodRemark(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_FOUR.getDesc());
669
+        }
670
+    }
671
+
672
+    /**
673
+     * 主管考核
674
+     *
675
+     * @param result
676
+     */
677
+    private void doSupervisor(PersonnelNonCadreMonthlyAssessment result) {
678
+        // 考核结果
679
+        PersonnelNonCadreMonthlyAssessment assessmentTeamQuery = new PersonnelNonCadreMonthlyAssessment();
680
+        assessmentTeamQuery.setAssessmentMonth(result.getAssessmentMonth());
681
+        assessmentTeamQuery.setAssessmentTeam(result.getAssessmentTeam());
682
+        List<PersonnelNonCadreMonthlyAssessment> assessmentTeamList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(assessmentTeamQuery);
683
+        boolean assessmentResultRuleOne = isInBottom5Percent(result, assessmentTeamList, PersonnelNonCadreMonthlyAssessment::getTotalScore);
684
+        boolean assessmentResultRuleSeven = isInBottom1Ranking(result, assessmentTeamList, PersonnelNonCadreMonthlyAssessment::getTotalScore);
685
+        boolean assessmentResultRuleTwo = result.getTotalScore().compareTo(BigDecimal.valueOf(75)) < 0;
686
+        boolean assessmentResultRuleThree = result.getNonCoreSafetyPlusCoreDeduction().abs().compareTo(BigDecimal.valueOf(10)) >= 0;
687
+        boolean assessmentResultRuleFour = result.getRedLineIndexTriggerCount() > 0 || result.getTotalScore().compareTo(BigDecimal.valueOf(70)) < 0;
688
+        List<String> assessmentResultRuleList = new ArrayList<>();
689
+        if (assessmentResultRuleOne) {
690
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName());
691
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getDesc());
692
+        }
693
+        if (assessmentResultRuleSeven) {
694
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_SEVEN.getName());
695
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_SEVEN.getDesc());
696
+        }
697
+        if (assessmentResultRuleTwo) {
698
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName());
699
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getDesc());
700
+        }
701
+        if (assessmentResultRuleThree) {
702
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_THREE.getName());
703
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_THREE.getDesc());
704
+        }
705
+        if (assessmentResultRuleFour) {
706
+            result.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_FOUR.getName());
707
+            assessmentResultRuleList.add(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_FOUR.getDesc());
708
+        }
709
+        if (CollUtil.isNotEmpty(assessmentResultRuleList)) {
710
+            result.setAssessmentResultRemark(String.join(";", assessmentResultRuleList));
711
+        }
712
+        // 是否豁免
713
+        if (StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName(), result.getAssessmentResult())
714
+                || StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName(), result.getAssessmentResult())
715
+                || StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_THREE.getName(), result.getAssessmentResult())
716
+                || StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_FOUR.getName(), result.getAssessmentResult())
717
+                || StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_SEVEN.getName(), result.getAssessmentResult())) {
718
+            if (!result.getAssessmentResultRemark().contains(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_SEVEN.getDesc())) {
719
+                boolean exemptionRuleOne = CollUtil.isEmpty(result.getPunishmentAccordList());
720
+                boolean exemptionRuleTwo = result.getPunishmentAccordList().stream()
721
+                        .filter(item -> !(StrUtil.equals(BasePerformanceIndicatorLeaveTypeEnum.PERSONAL_LEAVE.getCode(), item.getLeaveType())
722
+                                || StrUtil.equals(BasePerformanceIndicatorLeaveTypeEnum.SICK_LEAVE.getCode(), item.getLeaveType())
723
+                                || StrUtil.equals(BasePerformanceIndicatorLeaveTypeEnum.PERSONAL_SICK_LEAVE.getCode(), item.getLeaveType())))
724
+                        .count() == 0;
725
+                if (exemptionRuleOne) {
726
+                    result.setExemption(BasePerformanceIndicatorExemptionRuleEnum.EXEMPTION_RULE_ONE.getName());
727
+                    result.setExemptionReasonRemark(BasePerformanceIndicatorExemptionRuleEnum.EXEMPTION_RULE_ONE.getDesc());
728
+                    result.setAssessmentResult(null);
729
+                } else if (exemptionRuleTwo) {
730
+                    result.setExemption(BasePerformanceIndicatorExemptionRuleEnum.EXEMPTION_RULE_TWO.getName());
731
+                    result.setExemptionReasonRemark(BasePerformanceIndicatorExemptionRuleEnum.EXEMPTION_RULE_TWO.getDesc());
732
+                    result.setAssessmentResult(null);
733
+                }
734
+            }
735
+        }
736
+        // 应用方式
737
+        boolean applicationMethodRuleOne = StrUtil.equals(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName(), result.getAssessmentResult());
738
+        boolean applicationMethodRuleFive = false;
739
+        MonthUtils.MonthRange last12Months = MonthUtils.getLast12MonthsIncludeCurrent(result.getAssessmentMonth());
740
+        PersonnelNonCadreMonthlyAssessment last12MonthsQuery = new PersonnelNonCadreMonthlyAssessment();
741
+        last12MonthsQuery.setUserId(result.getUserId());
742
+        last12MonthsQuery.setAssessmentMonthStart(last12Months.getStartMonth());
743
+        last12MonthsQuery.setAssessmentMonthEnd(last12Months.getEndMonth());
744
+        last12MonthsQuery.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_ONE.getName());
745
+        List<PersonnelNonCadreMonthlyAssessment> last12MonthsList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(last12MonthsQuery);
746
+        String last12MonthsMaxAssessmentMonth = last12MonthsList.stream().map(PersonnelNonCadreMonthlyAssessment::getAssessmentMonth).max(String::compareTo).orElse(null);
747
+        if (ObjUtil.isNotNull(last12MonthsMaxAssessmentMonth) && !StrUtil.equals(last12MonthsMaxAssessmentMonth, result.getAssessmentMonth())) {
748
+            PersonnelNonCadreMonthlyAssessment lastMonthsQuery = new PersonnelNonCadreMonthlyAssessment();
749
+            lastMonthsQuery.setUserId(result.getUserId());
750
+            lastMonthsQuery.setAssessmentMonthStart(MonthUtils.getNextMonth(last12MonthsMaxAssessmentMonth));
751
+            lastMonthsQuery.setAssessmentMonthEnd(result.getAssessmentMonth());
752
+            lastMonthsQuery.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_ONE.getName());
753
+            List<PersonnelNonCadreMonthlyAssessment> lastMonthsList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(lastMonthsQuery);
754
+            applicationMethodRuleFive = lastMonthsList.size() >= 3;
755
+        }
756
+        boolean applicationMethodRuleSix = false;
757
+        MonthUtils.MonthRange currentYearMonthsTraining = MonthUtils.getCurrentYearToMonth(result.getAssessmentMonth());
758
+        PersonnelNonCadreMonthlyAssessment currentYearMonthsTrainingQuery = new PersonnelNonCadreMonthlyAssessment();
759
+        currentYearMonthsTrainingQuery.setUserId(result.getUserId());
760
+        currentYearMonthsTrainingQuery.setAssessmentMonthStart(currentYearMonthsTraining.getStartMonth());
761
+        currentYearMonthsTrainingQuery.setAssessmentMonthEnd(currentYearMonthsTraining.getEndMonth());
762
+        currentYearMonthsTrainingQuery.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_ONE.getName());
763
+        List<PersonnelNonCadreMonthlyAssessment> currentYearMonthsTrainingList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(currentYearMonthsTrainingQuery);
764
+        String maxAssessmentMonth = currentYearMonthsTrainingList.stream().map(PersonnelNonCadreMonthlyAssessment::getAssessmentMonth).max(String::compareTo).orElse(null);
765
+        if (ObjUtil.isNotNull(maxAssessmentMonth) && !StrUtil.equals(maxAssessmentMonth, result.getAssessmentMonth())) {
766
+            PersonnelNonCadreMonthlyAssessment remainingMonthsOfYearQuery = new PersonnelNonCadreMonthlyAssessment();
767
+            remainingMonthsOfYearQuery.setUserId(result.getUserId());
768
+            remainingMonthsOfYearQuery.setAssessmentMonthStart(MonthUtils.getNextMonth(maxAssessmentMonth));
769
+            remainingMonthsOfYearQuery.setAssessmentMonthEnd(result.getAssessmentMonth());
770
+            remainingMonthsOfYearQuery.setAssessmentResult(BasePerformanceIndicatorAssessmentResultRuleEnum.ASSESSMENT_RESULT_RULE_TWO.getName());
771
+            List<PersonnelNonCadreMonthlyAssessment> remainingMonthsOfYearQueryList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(remainingMonthsOfYearQuery);
772
+            applicationMethodRuleSix = CollUtil.isNotEmpty(remainingMonthsOfYearQueryList);
773
+        }
774
+        if (applicationMethodRuleOne) {
775
+            result.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_ONE.getName());
776
+            result.setApplicationMethodRemark(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_ONE.getDesc());
777
+        }
778
+        if (applicationMethodRuleFive) {
779
+            result.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_FIVE.getName());
780
+            result.setApplicationMethodRemark(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_FIVE.getDesc());
781
+        }
782
+        if (applicationMethodRuleSix) {
783
+            result.setApplicationMethod(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_SIX.getName());
784
+            result.setApplicationMethodRemark(BasePerformanceIndicatorApplicationMethodRuleEnum.APPLICATION_METHOD_RULE_SIX.getDesc());
785
+        }
786
+    }
787
+
788
+    /**
789
+     * 判断当前用户分数是否处于最低的5%以内(包括并列)
790
+     *
791
+     * @param currentObj 当前用户对象
792
+     * @param list       列表
793
+     * @param scoreExtractor 分数提取器
794
+     * @return true表示处于最低的5%以内,false表示处于最低的5%以外
795
+     */
796
+    private boolean isInBottom5Percent(PersonnelNonCadreMonthlyAssessment currentObj, List<PersonnelNonCadreMonthlyAssessment> list, java.util.function.Function<PersonnelNonCadreMonthlyAssessment, BigDecimal> scoreExtractor) {
797
+        if (CollUtil.isEmpty(list)) {
798
+            return false;
799
+        }
800
+
801
+        // 获取当前用户的分数
802
+        BigDecimal currentScore = scoreExtractor.apply(currentObj);
803
+
804
+        // 统计分数大于当前用户分数的人数(包括并列)
805
+        long higherCount = list.stream()
806
+                .map(scoreExtractor)
807
+                .filter(score -> score.compareTo(currentScore) > 0)
808
+                .count();
809
+
810
+        // 计算百分比
811
+        BigDecimal percentage = BigDecimal.valueOf(higherCount).divide(BigDecimal.valueOf(list.size()), 2, RoundingMode.HALF_UP);
812
+
813
+        // 判断当前用户的分数是否处于最高的95%以外(包括并列)
814
+        return percentage.compareTo(BigDecimal.valueOf(0.95)) > 0;
815
+    }
816
+
817
+    /**
818
+     * 判断当前用户分数是否排名最后1名(包括并列)
819
+     *
820
+     * @param currentObj 当前用户对象
821
+     * @param list       列表
822
+     * @param scoreExtractor 分数提取器
823
+     * @return true表示排名最后1名,false表示排名非最后1名
824
+     */
825
+    private boolean isInBottom1Ranking(PersonnelNonCadreMonthlyAssessment currentObj, List<PersonnelNonCadreMonthlyAssessment> list, java.util.function.Function<PersonnelNonCadreMonthlyAssessment, BigDecimal> scoreExtractor) {
826
+        if (CollUtil.isEmpty(list)) {
827
+            return false;
828
+        }
829
+
830
+        // 获取当前用户的分数
831
+        BigDecimal currentScore = scoreExtractor.apply(currentObj);
832
+
833
+        // 统计分数小于当前用户分数的人数(包括并列)
834
+        long lowerOrEqualCount = list.stream()
835
+                .map(scoreExtractor)
836
+                .filter(score -> score.compareTo(currentScore) < 0)
837
+                .count();
838
+
839
+        // 判断当前用户分数是否分数最低(包括并列)
840
+        return lowerOrEqualCount == 0;
841
+    }
351 842
 }

+ 5 - 3
airport-personnel/src/main/resources/mapper/personnel/PersonnelNonCadreMonthlyAssessmentMapper.xml

@@ -168,9 +168,11 @@
168 168
             <if test="exemptionReasonRemark != null  and exemptionReasonRemark != ''">and exemption_reason_remark =
169 169
                 #{exemptionReasonRemark}
170 170
             </if>
171
-            <if test="assessmentMonthStart != null and assessmentMonthEnd != null">
172
-                and (assessment_month >= #{assessmentMonthStart}
173
-                and assessment_month <![CDATA[ <= ]]> #{assessmentMonthEnd})
171
+            <if test="assessmentMonthStart != null">
172
+                and assessment_month >= #{assessmentMonthStart}
173
+            </if>
174
+            <if test="assessmentMonthEnd != null">
175
+                and assessment_month <![CDATA[ <= ]]> #{assessmentMonthEnd}
174 176
             </if>
175 177
         </where>
176 178
         order by create_time desc