Преглед на файлове

Merge remote-tracking branch 'origin/feature/dev' into feature/dev

wangxx преди 1 месец
родител
ревизия
47fa6dd16f
променени са 13 файла, в които са добавени 492 реда и са изтрити 15 реда
  1. 9 0
      airport-admin/src/main/java/com/sundot/airport/web/controller/personnel/PersonnelNonCadreMonthlyAssessmentController.java
  2. 10 0
      airport-admin/src/main/java/com/sundot/airport/web/controller/system/SysUserController.java
  3. 43 0
      airport-common/src/main/java/com/sundot/airport/common/config/PersonnelAsyncConfig.java
  4. 52 0
      airport-common/src/main/java/com/sundot/airport/common/dto/SysPersonnelUserConditionDto.java
  5. 26 0
      airport-common/src/main/java/com/sundot/airport/common/event/PersonnelEvent.java
  6. 83 0
      airport-common/src/main/java/com/sundot/airport/common/utils/MonthUtils.java
  7. 53 0
      airport-personnel/src/main/java/com/sundot/airport/personnel/listener/PersonnelEventListener.java
  8. 24 0
      airport-personnel/src/main/java/com/sundot/airport/personnel/service/IPersonnelNonCadreMonthlyAssessmentService.java
  9. 99 7
      airport-personnel/src/main/java/com/sundot/airport/personnel/service/impl/PersonnelNonCadreMonthlyAssessmentServiceImpl.java
  10. 14 0
      airport-system/src/main/java/com/sundot/airport/system/mapper/SysUserMapper.java
  11. 9 0
      airport-system/src/main/java/com/sundot/airport/system/service/ISysUserService.java
  12. 36 0
      airport-system/src/main/java/com/sundot/airport/system/service/impl/SysUserServiceImpl.java
  13. 34 8
      airport-system/src/main/resources/mapper/system/SysUserMapper.xml

+ 9 - 0
airport-admin/src/main/java/com/sundot/airport/web/controller/personnel/PersonnelNonCadreMonthlyAssessmentController.java

@@ -97,4 +97,13 @@ public class PersonnelNonCadreMonthlyAssessmentController extends BaseController
97 97
     public AjaxResult remove(@PathVariable Long[] ids) {
98 98
         return toAjax(personnelNonCadreMonthlyAssessmentService.deletePersonnelNonCadreMonthlyAssessmentByIds(ids));
99 99
     }
100
+
101
+    /**
102
+     * 自动生成指定月份非干部月度考核
103
+     */
104
+    @PreAuthorize("@ss.hasPermi('personnel:assessment:add')")
105
+    @GetMapping(value = "/autoGenerate/{month}")
106
+    public AjaxResult autoGenerate(@PathVariable("month") String month) {
107
+        return success(personnelNonCadreMonthlyAssessmentService.autoGenerate(month));
108
+    }
100 109
 }

+ 10 - 0
airport-admin/src/main/java/com/sundot/airport/web/controller/system/SysUserController.java

@@ -20,6 +20,7 @@ import com.sundot.airport.check.domain.CheckLargeScreenCorrectionQueryParamDto;
20 20
 import com.sundot.airport.common.core.domain.ResetUserPostDto;
21 21
 import com.sundot.airport.common.core.domain.ResetUserRoleDto;
22 22
 import com.sundot.airport.common.core.domain.SysLargeScreenWorkingPortraitDto;
23
+import com.sundot.airport.common.dto.SysPersonnelUserConditionDto;
23 24
 import com.sundot.airport.common.dto.SysUserConditionDto;
24 25
 import com.sundot.airport.common.dto.SysUserLeaderConditionDto;
25 26
 import com.sundot.airport.common.enums.RoleTypeEnum;
@@ -161,6 +162,15 @@ public class SysUserController extends BaseController {
161 162
     }
162 163
 
163 164
     /**
165
+     * 查询人事绩效用户列表
166
+     */
167
+    @PostMapping("/selectPersonnelUserList")
168
+    public AjaxResult selectPersonnelUserList(@RequestBody SysPersonnelUserConditionDto dto) {
169
+        List<SysUser> result = userService.selectPersonnelUserList(dto);
170
+        return success(result);
171
+    }
172
+
173
+    /**
164 174
      * 能力画像-协同配合
165 175
      */
166 176
     @Cacheable(

+ 43 - 0
airport-common/src/main/java/com/sundot/airport/common/config/PersonnelAsyncConfig.java

@@ -0,0 +1,43 @@
1
+package com.sundot.airport.common.config;
2
+
3
+import org.springframework.context.annotation.Bean;
4
+import org.springframework.context.annotation.Configuration;
5
+import org.springframework.scheduling.annotation.EnableAsync;
6
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
7
+
8
+import java.util.concurrent.Executor;
9
+import java.util.concurrent.ThreadPoolExecutor;
10
+
11
+/**
12
+ * 非干部月度考核异步配置
13
+ *
14
+ * @author ruoyi
15
+ */
16
+@Configuration
17
+@EnableAsync
18
+public class PersonnelAsyncConfig {
19
+
20
+    // 核心线程池大小
21
+    private int corePoolSize = 50;
22
+    // 最大可创建的线程数
23
+    private int maxPoolSize = 200;
24
+    // 队列最大长度
25
+    private int queueCapacity = 1000;
26
+    // 线程池维护线程所允许的空闲时间
27
+    private int keepAliveSeconds = 300;
28
+
29
+    @Bean(name = "personnelAsyncExecutor")
30
+    public Executor personnelAsyncExecutor() {
31
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
32
+        executor.setMaxPoolSize(maxPoolSize);
33
+        executor.setCorePoolSize(corePoolSize);
34
+        executor.setQueueCapacity(queueCapacity);
35
+        executor.setKeepAliveSeconds(keepAliveSeconds);
36
+        executor.setThreadNamePrefix("personnel-event-async-"); // 线程名前缀
37
+        // 线程池对拒绝任务(无线程可用)的处理策略
38
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
39
+        executor.initialize();
40
+        return executor;
41
+    }
42
+
43
+}

+ 52 - 0
airport-common/src/main/java/com/sundot/airport/common/dto/SysPersonnelUserConditionDto.java

@@ -0,0 +1,52 @@
1
+package com.sundot.airport.common.dto;
2
+
3
+import lombok.Data;
4
+
5
+import java.util.Date;
6
+import java.util.List;
7
+
8
+/**
9
+ * 查询用户列表参数
10
+ *
11
+ * @Author: wangchong
12
+ * @Date: 2025/7/15 16:12
13
+ **/
14
+@Data
15
+public class SysPersonnelUserConditionDto {
16
+
17
+    /**
18
+     * 部门id
19
+     */
20
+    private Long deptId;
21
+
22
+    /**
23
+     * 角色编码列表
24
+     */
25
+    private List<String> roleKeyList;
26
+
27
+    /**
28
+     * 用工形式列表
29
+     */
30
+    private List<String> employmentTypeList;
31
+
32
+    /**
33
+     * 用户昵称
34
+     */
35
+    private String nickName;
36
+
37
+    /**
38
+     * 月份值(yyyyMM)
39
+     */
40
+    private String month;
41
+
42
+    /**
43
+     * 月份开始时间
44
+     */
45
+    private Date monthStartTime;
46
+
47
+    /**
48
+     * 月份结束时间
49
+     */
50
+    private Date monthEndTime;
51
+
52
+}

+ 26 - 0
airport-common/src/main/java/com/sundot/airport/common/event/PersonnelEvent.java

@@ -0,0 +1,26 @@
1
+package com.sundot.airport.common.event;
2
+
3
+import org.springframework.context.ApplicationEvent;
4
+
5
+/**
6
+ * 非干部月度考核事件
7
+ *
8
+ * @author ruoyi
9
+ */
10
+public class PersonnelEvent extends ApplicationEvent {
11
+
12
+    /**
13
+     * 非干部月度考核月份
14
+     */
15
+    private String month;
16
+
17
+    public PersonnelEvent(Object source, String month) {
18
+        super(source);
19
+        this.month = month;
20
+    }
21
+
22
+    public String getMonth() {
23
+        return month;
24
+    }
25
+
26
+}

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

@@ -1,8 +1,12 @@
1 1
 package com.sundot.airport.common.utils;
2 2
 
3
+import java.text.ParseException;
4
+import java.text.SimpleDateFormat;
3 5
 import java.time.YearMonth;
4 6
 import java.time.format.DateTimeFormatter;
5 7
 import java.util.ArrayList;
8
+import java.util.Calendar;
9
+import java.util.Date;
6 10
 import java.util.List;
7 11
 
8 12
 /**
@@ -236,4 +240,83 @@ public class MonthUtils {
236 240
         }
237 241
     }
238 242
 
243
+
244
+    /**
245
+     * 获取指定月份的第一天开始时间(yyyy-MM-dd 00:00:00)
246
+     * @param yearMonth 月份字符串,格式 yyyyMM
247
+     * @return 开始时间的 Date 对象
248
+     */
249
+    public static Date getMonthStartTime(String yearMonth) {
250
+        try {
251
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
252
+            Date date = sdf.parse(yearMonth);
253
+
254
+            Calendar calendar = Calendar.getInstance();
255
+            calendar.setTime(date);
256
+            calendar.set(Calendar.DAY_OF_MONTH, 1);
257
+            calendar.set(Calendar.HOUR_OF_DAY, 0);
258
+            calendar.set(Calendar.MINUTE, 0);
259
+            calendar.set(Calendar.SECOND, 0);
260
+            calendar.set(Calendar.MILLISECOND, 0);
261
+
262
+            return calendar.getTime();
263
+        } catch (ParseException e) {
264
+            throw new IllegalArgumentException("月份格式无效,请使用【yyyyMM】格式");
265
+        }
266
+    }
267
+
268
+    /**
269
+     * 获取指定月份的最后一天开始时间(yyyy-MM-dd 00:00:00)
270
+     * @param yearMonth 月份字符串,格式 yyyyMM
271
+     * @return 最后一天开始时间的 Date 对象
272
+     */
273
+    public static Date getMonthLastDayStartTime(String yearMonth) {
274
+        try {
275
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
276
+            Date date = sdf.parse(yearMonth);
277
+
278
+            Calendar calendar = Calendar.getInstance();
279
+            calendar.setTime(date);
280
+            // 获取该月的最大天数
281
+            int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
282
+            calendar.set(Calendar.DAY_OF_MONTH, lastDay);
283
+            calendar.set(Calendar.HOUR_OF_DAY, 0);
284
+            calendar.set(Calendar.MINUTE, 0);
285
+            calendar.set(Calendar.SECOND, 0);
286
+            calendar.set(Calendar.MILLISECOND, 0);
287
+
288
+            return calendar.getTime();
289
+        } catch (ParseException e) {
290
+            throw new IllegalArgumentException("Invalid month format. Please use yyyyMM.");
291
+        }
292
+    }
293
+
294
+    /**
295
+     * 获取指定月份的最后一天结束时间(yyyy-MM-dd 23:59:59)
296
+     * @param yearMonth 月份字符串,格式 yyyyMM
297
+     * @return 结束时间的 Date 对象
298
+     */
299
+    public static Date getMonthEndTime(String yearMonth) {
300
+        try {
301
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
302
+            Date date = sdf.parse(yearMonth);
303
+
304
+            Calendar calendar = Calendar.getInstance();
305
+            calendar.setTime(date);
306
+            // 设置为下个月第一天
307
+            calendar.add(Calendar.MONTH, 1);
308
+            calendar.set(Calendar.DAY_OF_MONTH, 1);
309
+            calendar.set(Calendar.HOUR_OF_DAY, 0);
310
+            calendar.set(Calendar.MINUTE, 0);
311
+            calendar.set(Calendar.SECOND, 0);
312
+            calendar.set(Calendar.MILLISECOND, 0);
313
+            // 减去一秒得到当月最后一秒
314
+            calendar.add(Calendar.SECOND, -1);
315
+
316
+            return calendar.getTime();
317
+        } catch (ParseException e) {
318
+            throw new IllegalArgumentException("月份格式无效,请使用【yyyyMM】格式");
319
+        }
320
+    }
321
+
239 322
 }

+ 53 - 0
airport-personnel/src/main/java/com/sundot/airport/personnel/listener/PersonnelEventListener.java

@@ -0,0 +1,53 @@
1
+package com.sundot.airport.personnel.listener;
2
+
3
+import com.sundot.airport.common.event.PersonnelEvent;
4
+import com.sundot.airport.personnel.domain.PersonnelNonCadreMonthlyAssessment;
5
+import com.sundot.airport.personnel.service.IPersonnelNonCadreMonthlyAssessmentService;
6
+import lombok.extern.slf4j.Slf4j;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.context.event.EventListener;
9
+import org.springframework.scheduling.annotation.Async;
10
+import org.springframework.stereotype.Component;
11
+
12
+import java.util.Comparator;
13
+import java.util.List;
14
+import java.util.stream.Collectors;
15
+
16
+/**
17
+ * 非干部月度考核事件监听器
18
+ *
19
+ * @author sundot
20
+ */
21
+@Slf4j
22
+@Component
23
+public class PersonnelEventListener {
24
+
25
+    @Autowired
26
+    private IPersonnelNonCadreMonthlyAssessmentService personnelNonCadreMonthlyAssessmentService;
27
+
28
+    /**
29
+     * 异步处理事件
30
+     */
31
+    @Async("personnelAsyncExecutor")  // 关键:标记为异步方法
32
+    @EventListener  // 监听PersonnelEvent事件
33
+    public void handlePersonnel(PersonnelEvent event) {
34
+        long start = System.currentTimeMillis();
35
+        String month = event.getMonth();
36
+        log.info("【异步处理】开始非干部月度考核【month={}】", month);
37
+        PersonnelNonCadreMonthlyAssessment query = new PersonnelNonCadreMonthlyAssessment();
38
+        query.setAssessmentMonthStart(month);
39
+        List<PersonnelNonCadreMonthlyAssessment> list = personnelNonCadreMonthlyAssessmentService.selectPersonnelNonCadreMonthlyAssessmentList(query);
40
+        list = list.stream()
41
+                .sorted(Comparator.comparing(PersonnelNonCadreMonthlyAssessment::getAssessmentMonth))
42
+                .collect(Collectors.toList());
43
+        list.forEach(item -> {
44
+            PersonnelNonCadreMonthlyAssessment data = personnelNonCadreMonthlyAssessmentService.selectPersonnelNonCadreMonthlyAssessmentById(item.getId());
45
+            // 完善数据
46
+            personnelNonCadreMonthlyAssessmentService.doImprove(data);
47
+            // 修改非干部月度考核-仅更新主表数据
48
+            personnelNonCadreMonthlyAssessmentService.updatePersonnelNonCadreMonthlyAssessmentOnly(data);
49
+        });
50
+        long end = System.currentTimeMillis();
51
+        log.info("【异步处理】完成非干部月度考核【month={}】,耗时【{}】", month, end - start);
52
+    }
53
+}

+ 24 - 0
airport-personnel/src/main/java/com/sundot/airport/personnel/service/IPersonnelNonCadreMonthlyAssessmentService.java

@@ -59,4 +59,28 @@ public interface IPersonnelNonCadreMonthlyAssessmentService extends IService<Per
59 59
      * @return 结果
60 60
      */
61 61
     public int deletePersonnelNonCadreMonthlyAssessmentById(Long id);
62
+
63
+    /**
64
+     * 完善数据
65
+     *
66
+     * @param personnelNonCadreMonthlyAssessment 完善数据
67
+     * @return 完善数据
68
+     */
69
+    public void doImprove(PersonnelNonCadreMonthlyAssessment personnelNonCadreMonthlyAssessment);
70
+
71
+    /**
72
+     * 修改非干部月度考核-仅更新主表数据
73
+     *
74
+     * @param personnelNonCadreMonthlyAssessment 非干部月度考核
75
+     * @return 结果
76
+     */
77
+    public int updatePersonnelNonCadreMonthlyAssessmentOnly(PersonnelNonCadreMonthlyAssessment personnelNonCadreMonthlyAssessment);
78
+
79
+    /**
80
+     * 自动生成指定月份非干部月度考核
81
+     *
82
+     * @param month 月份值
83
+     * @return 结果
84
+     */
85
+    public List<PersonnelNonCadreMonthlyAssessment> autoGenerate(String month);
62 86
 }

+ 99 - 7
airport-personnel/src/main/java/com/sundot/airport/personnel/service/impl/PersonnelNonCadreMonthlyAssessmentServiceImpl.java

@@ -14,6 +14,8 @@ import cn.hutool.core.util.StrUtil;
14 14
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
15 15
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
16 16
 import com.sundot.airport.common.core.domain.entity.SysUser;
17
+import com.sundot.airport.common.dto.SysPersonnelUserConditionDto;
18
+import com.sundot.airport.common.dto.SysUserLeaderConditionDto;
17 19
 import com.sundot.airport.common.enums.AssessmentTeamEnum;
18 20
 import com.sundot.airport.common.enums.BasePerformanceIndicatorApplicationMethodRuleEnum;
19 21
 import com.sundot.airport.common.enums.BasePerformanceIndicatorAssessmentResultRuleEnum;
@@ -22,9 +24,11 @@ import com.sundot.airport.common.enums.BasePerformanceIndicatorLeaveTypeEnum;
22 24
 import com.sundot.airport.common.enums.BasePerformanceIndicatorQcDeptTypeEnum;
23 25
 import com.sundot.airport.common.enums.BasePerformanceIndicatorRewardPunishmentTypeTypeEnum;
24 26
 import com.sundot.airport.common.enums.RoleTypeEnum;
27
+import com.sundot.airport.common.event.PersonnelEvent;
25 28
 import com.sundot.airport.common.exception.ServiceException;
26 29
 import com.sundot.airport.common.utils.DateUtils;
27 30
 import com.sundot.airport.common.utils.MonthUtils;
31
+import com.sundot.airport.common.utils.SecurityUtils;
28 32
 import com.sundot.airport.personnel.domain.PersonnelMonthlyAssessmentIndicatorDetail;
29 33
 import com.sundot.airport.personnel.domain.PersonnelMonthlyAssessmentIndicatorRewardPunishmentDetail;
30 34
 import com.sundot.airport.personnel.service.IPersonnelMonthlyAssessmentIndicatorDetailService;
@@ -33,6 +37,7 @@ import com.sundot.airport.system.domain.BasePerformanceIndicatorCategory;
33 37
 import com.sundot.airport.system.service.IBasePerformanceIndicatorCategoryService;
34 38
 import com.sundot.airport.system.service.ISysUserService;
35 39
 import org.springframework.beans.factory.annotation.Autowired;
40
+import org.springframework.context.ApplicationEventPublisher;
36 41
 import org.springframework.stereotype.Service;
37 42
 import com.sundot.airport.personnel.mapper.PersonnelNonCadreMonthlyAssessmentMapper;
38 43
 import com.sundot.airport.personnel.domain.PersonnelNonCadreMonthlyAssessment;
@@ -62,6 +67,8 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
62 67
     private IBasePerformanceIndicatorCategoryService basePerformanceIndicatorCategoryService;
63 68
     @Autowired
64 69
     private ISysUserService sysUserService;
70
+    @Autowired
71
+    private ApplicationEventPublisher eventPublisher;
65 72
 
66 73
     /**
67 74
      * 查询非干部月度考核
@@ -92,8 +99,6 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
92 99
                 });
93 100
             }
94 101
         }
95
-        // 完善数据
96
-        doImprove(result);
97 102
         return result;
98 103
     }
99 104
 
@@ -125,6 +130,8 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
125 130
             throw new ServiceException("该用户已存在该考核月份的考核记录");
126 131
         }
127 132
         personnelNonCadreMonthlyAssessment.setCreateTime(DateUtils.getNowDate());
133
+        // 完善数据
134
+        doImprove(personnelNonCadreMonthlyAssessment);
128 135
         int result = personnelNonCadreMonthlyAssessmentMapper.insertPersonnelNonCadreMonthlyAssessment(personnelNonCadreMonthlyAssessment);
129 136
         if (CollUtil.isNotEmpty(personnelNonCadreMonthlyAssessment.getPersonnelMonthlyAssessmentIndicatorDetailList())) {
130 137
             personnelNonCadreMonthlyAssessment.getPersonnelMonthlyAssessmentIndicatorDetailList().forEach(personnelMonthlyAssessmentIndicatorDetail -> {
@@ -142,8 +149,7 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
142 149
                 }
143 150
             });
144 151
         }
145
-        PersonnelNonCadreMonthlyAssessment dto = selectPersonnelNonCadreMonthlyAssessmentById(personnelNonCadreMonthlyAssessment.getId());
146
-        personnelNonCadreMonthlyAssessmentMapper.updatePersonnelNonCadreMonthlyAssessment(dto);
152
+        eventPublisher.publishEvent(new PersonnelEvent(this, personnelNonCadreMonthlyAssessment.getAssessmentMonth()));
147 153
         return result;
148 154
     }
149 155
 
@@ -171,9 +177,12 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
171 177
                 personnelMonthlyAssessmentIndicatorRewardPunishmentDetailService.removeBatchByIds(personnelMonthlyAssessmentIndicatorRewardPunishmentDetailListOld);
172 178
             }
173 179
         }
180
+        // 完善数据
181
+        doImprove(personnelNonCadreMonthlyAssessment);
174 182
         // 新增新数据
175 183
         if (CollUtil.isNotEmpty(personnelNonCadreMonthlyAssessment.getPersonnelMonthlyAssessmentIndicatorDetailList())) {
176 184
             personnelNonCadreMonthlyAssessment.getPersonnelMonthlyAssessmentIndicatorDetailList().forEach(personnelMonthlyAssessmentIndicatorDetail -> {
185
+                personnelMonthlyAssessmentIndicatorDetail.setId(null);
177 186
                 personnelMonthlyAssessmentIndicatorDetail.setSourceId(personnelNonCadreMonthlyAssessment.getId());
178 187
                 personnelMonthlyAssessmentIndicatorDetail.setCreateBy(personnelNonCadreMonthlyAssessment.getCreateBy());
179 188
                 personnelMonthlyAssessmentIndicatorDetail.setCreateTime(DateUtils.getNowDate());
@@ -182,6 +191,7 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
182 191
                 personnelMonthlyAssessmentIndicatorDetailService.insertPersonnelMonthlyAssessmentIndicatorDetail(personnelMonthlyAssessmentIndicatorDetail);
183 192
                 if (CollUtil.isNotEmpty(personnelMonthlyAssessmentIndicatorDetail.getPersonnelMonthlyAssessmentIndicatorRewardPunishmentDetailList())) {
184 193
                     personnelMonthlyAssessmentIndicatorDetail.getPersonnelMonthlyAssessmentIndicatorRewardPunishmentDetailList().forEach(personnelMonthlyAssessmentIndicatorRewardPunishmentDetail -> {
194
+                        personnelMonthlyAssessmentIndicatorRewardPunishmentDetail.setId(null);
185 195
                         personnelMonthlyAssessmentIndicatorRewardPunishmentDetail.setSourceId(personnelMonthlyAssessmentIndicatorDetail.getId());
186 196
                         personnelMonthlyAssessmentIndicatorRewardPunishmentDetail.setCreateBy(personnelMonthlyAssessmentIndicatorDetail.getCreateBy());
187 197
                         personnelMonthlyAssessmentIndicatorRewardPunishmentDetail.setCreateTime(DateUtils.getNowDate());
@@ -192,8 +202,7 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
192 202
                 }
193 203
             });
194 204
         }
195
-        PersonnelNonCadreMonthlyAssessment dto = selectPersonnelNonCadreMonthlyAssessmentById(personnelNonCadreMonthlyAssessment.getId());
196
-        personnelNonCadreMonthlyAssessmentMapper.updatePersonnelNonCadreMonthlyAssessment(dto);
205
+        eventPublisher.publishEvent(new PersonnelEvent(this, personnelNonCadreMonthlyAssessment.getAssessmentMonth()));
197 206
         return result;
198 207
     }
199 208
 
@@ -255,7 +264,8 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
255 264
      * @param result 非干部月度考核
256 265
      * @return 非干部月度考核
257 266
      */
258
-    private void doImprove(PersonnelNonCadreMonthlyAssessment result) {
267
+    @Override
268
+    public void doImprove(PersonnelNonCadreMonthlyAssessment result) {
259 269
         List<BasePerformanceIndicatorCategory> indicatorCategoryyList = basePerformanceIndicatorCategoryService.selectBasePerformanceIndicatorCategoryListTree(new BasePerformanceIndicatorCategory());
260 270
         // 红线指标
261 271
         BasePerformanceIndicatorCategory redLineIndexCategory = indicatorCategoryyList.stream().filter(item -> StrUtil.equals("红线指标", item.getName())).findFirst().orElse(null);
@@ -839,4 +849,86 @@ public class PersonnelNonCadreMonthlyAssessmentServiceImpl extends ServiceImpl<P
839 849
         // 判断当前用户分数是否分数最低(包括并列)
840 850
         return lowerOrEqualCount == 0;
841 851
     }
852
+
853
+    /**
854
+     * 修改非干部月度考核-仅更新主表数据
855
+     *
856
+     * @param personnelNonCadreMonthlyAssessment 非干部月度考核
857
+     * @return 结果
858
+     */
859
+    @Override
860
+    public int updatePersonnelNonCadreMonthlyAssessmentOnly(PersonnelNonCadreMonthlyAssessment personnelNonCadreMonthlyAssessment) {
861
+        personnelNonCadreMonthlyAssessment.setUpdateTime(DateUtils.getNowDate());
862
+        return personnelNonCadreMonthlyAssessmentMapper.updatePersonnelNonCadreMonthlyAssessment(personnelNonCadreMonthlyAssessment);
863
+    }
864
+
865
+    /**
866
+     * 自动生成指定月份非干部月度考核
867
+     *
868
+     * @param month 月份值
869
+     * @return 结果
870
+     */
871
+    @Transactional(rollbackFor = Exception.class)
872
+    @Override
873
+    public List<PersonnelNonCadreMonthlyAssessment> autoGenerate(String month) {
874
+        List<PersonnelNonCadreMonthlyAssessment> result = new ArrayList<>();
875
+        SysPersonnelUserConditionDto sysPersonnelUserConditionDtoQuery = new SysPersonnelUserConditionDto();
876
+        sysPersonnelUserConditionDtoQuery.setMonth(month);
877
+        List<SysUser> sysUserList = sysUserService.selectPersonnelUserList(sysPersonnelUserConditionDtoQuery);
878
+        PersonnelNonCadreMonthlyAssessment personnelNonCadreMonthlyAssessmentQuery = new PersonnelNonCadreMonthlyAssessment();
879
+        personnelNonCadreMonthlyAssessmentQuery.setAssessmentMonth(month);
880
+        List<PersonnelNonCadreMonthlyAssessment> existList = personnelNonCadreMonthlyAssessmentMapper.selectPersonnelNonCadreMonthlyAssessmentList(personnelNonCadreMonthlyAssessmentQuery);
881
+        List<Long> existUserIdList = existList.stream().map(PersonnelNonCadreMonthlyAssessment::getUserId).collect(Collectors.toList());
882
+        sysUserList = sysUserList.stream().filter(sysUser -> !existUserIdList.contains(sysUser.getUserId())).collect(Collectors.toList());
883
+        sysUserList.forEach(sysUser -> {
884
+            PersonnelNonCadreMonthlyAssessment personnelNonCadreMonthlyAssessmentNew = new PersonnelNonCadreMonthlyAssessment();
885
+            personnelNonCadreMonthlyAssessmentNew.setCreateBy(SecurityUtils.getLoginUser().getUsername());
886
+            personnelNonCadreMonthlyAssessmentNew.setCreateTime(DateUtils.getNowDate());
887
+            personnelNonCadreMonthlyAssessmentNew.setAssessmentMonth(month);
888
+            personnelNonCadreMonthlyAssessmentNew.setUserId(sysUser.getUserId());
889
+            personnelNonCadreMonthlyAssessmentNew.setUserName(sysUser.getUserName());
890
+            if (CollUtil.isNotEmpty(sysUser.getRoles())) {
891
+                personnelNonCadreMonthlyAssessmentNew.setRoleId(sysUser.getRoles().get(0).getRoleId());
892
+                personnelNonCadreMonthlyAssessmentNew.setRoleName(sysUser.getRoles().get(0).getRoleName());
893
+                personnelNonCadreMonthlyAssessmentNew.setRoleKey(sysUser.getRoles().get(0).getRoleKey());
894
+            }
895
+            personnelNonCadreMonthlyAssessmentNew.setEmploymentType(sysUser.getEmploymentType());
896
+            personnelNonCadreMonthlyAssessmentNew.setAssessmentTeam(sysUser.getAssessmentTeam());
897
+            personnelNonCadreMonthlyAssessmentNew.setPost(sysUser.getPost());
898
+            SysUserLeaderConditionDto teamLeaderDto = new SysUserLeaderConditionDto();
899
+            teamLeaderDto.setUserId(sysUser.getUserId());
900
+            teamLeaderDto.setRoleKeyList(Collections.singletonList(RoleTypeEnum.banzuzhang.getCode()));
901
+            List<SysUser> teamLeaderList = sysUserService.selectUserLeaderListByCondition(teamLeaderDto);
902
+            if (CollUtil.isNotEmpty(teamLeaderList)) {
903
+                personnelNonCadreMonthlyAssessmentNew.setDeputyTeamLeaderId(teamLeaderList.get(0).getUserId());
904
+                personnelNonCadreMonthlyAssessmentNew.setDeputyTeamLeaderName(teamLeaderList.get(0).getUserName());
905
+            }
906
+            SysUserLeaderConditionDto supervisorDto = new SysUserLeaderConditionDto();
907
+            supervisorDto.setUserId(sysUser.getUserId());
908
+            supervisorDto.setRoleKeyList(Collections.singletonList(RoleTypeEnum.kezhang.getCode()));
909
+            List<SysUser> supervisorList = sysUserService.selectUserLeaderListByCondition(supervisorDto);
910
+            if (CollUtil.isNotEmpty(supervisorList)) {
911
+                personnelNonCadreMonthlyAssessmentNew.setDeputySupervisorId(supervisorList.get(0).getUserId());
912
+                personnelNonCadreMonthlyAssessmentNew.setDeputySupervisorName(supervisorList.get(0).getUserName());
913
+            }
914
+            SysUserLeaderConditionDto managerDto = new SysUserLeaderConditionDto();
915
+            managerDto.setUserId(sysUser.getUserId());
916
+            managerDto.setRoleKeyList(Collections.singletonList(RoleTypeEnum.jingli.getCode()));
917
+            List<SysUser> managerList = sysUserService.selectUserLeaderListByCondition(managerDto);
918
+            if (CollUtil.isNotEmpty(managerList)) {
919
+                if (managerList.size() > 1) {
920
+                    managerList = managerList.stream().filter(item -> StrUtil.equals(item.getWorkArea(), sysUser.getWorkArea())).collect(Collectors.toList());
921
+                }
922
+                if (CollUtil.isNotEmpty(managerList)) {
923
+                    personnelNonCadreMonthlyAssessmentNew.setDeputyManagerId(managerList.get(0).getUserId());
924
+                    personnelNonCadreMonthlyAssessmentNew.setDeputyManagerName(managerList.get(0).getUserName());
925
+                }
926
+            }
927
+            personnelNonCadreMonthlyAssessmentNew.setPersonnelMonthlyAssessmentIndicatorDetailList(new ArrayList<>());
928
+            doImprove(personnelNonCadreMonthlyAssessmentNew);
929
+            personnelNonCadreMonthlyAssessmentMapper.insertPersonnelNonCadreMonthlyAssessment(personnelNonCadreMonthlyAssessmentNew);
930
+            result.add(personnelNonCadreMonthlyAssessmentNew);
931
+        });
932
+        return result;
933
+    }
842 934
 }

+ 14 - 0
airport-system/src/main/java/com/sundot/airport/system/mapper/SysUserMapper.java

@@ -1,5 +1,6 @@
1 1
 package com.sundot.airport.system.mapper;
2 2
 
3
+import java.util.Date;
3 4
 import java.util.List;
4 5
 
5 6
 import com.sundot.airport.common.core.domain.LargeScreenHomePageUserInfoSqlDto;
@@ -240,6 +241,19 @@ public interface SysUserMapper {
240 241
     public List<SysUser> selectUserListByDeptIdAndRoleKeyListAndUserName(@Param("deptId") Long deptId, @Param("list") List<String> list, @Param("nickName") String nickName);
241 242
 
242 243
     /**
244
+     * 查询人事绩效用户列表
245
+     *
246
+     * @param nickName 用户昵称
247
+     * @return 用户信息集合
248
+     */
249
+    public List<SysUser> selectPersonnelUserList(@Param("deptId") Long deptId,
250
+                                                 @Param("roleKeyList") List<String> roleKeyList,
251
+                                                 @Param("employmentTypeList") List<String> employmentTypeList,
252
+                                                 @Param("monthStartTime") Date monthStartTime,
253
+                                                 @Param("monthEndTime") Date monthEndTime,
254
+                                                 @Param("nickName") String nickName);
255
+
256
+    /**
243 257
      * 首页 - 用户信息(按大队 ID 筛选)
244 258
      *
245 259
      * @param brigadeId 大队 ID

+ 9 - 0
airport-system/src/main/java/com/sundot/airport/system/service/ISysUserService.java

@@ -7,6 +7,7 @@ import com.sundot.airport.common.core.domain.LargeScreenHomePageUserInfoSqlDto;
7 7
 import com.sundot.airport.common.core.domain.ResetUserPostDto;
8 8
 import com.sundot.airport.common.core.domain.ResetUserRoleDto;
9 9
 import com.sundot.airport.common.core.domain.entity.SysUser;
10
+import com.sundot.airport.common.dto.SysPersonnelUserConditionDto;
10 11
 import com.sundot.airport.common.dto.SysUserConditionDto;
11 12
 import com.sundot.airport.common.dto.SysUserLeaderConditionDto;
12 13
 import com.sundot.airport.system.domain.SysLargeScreenCooperationDto;
@@ -331,6 +332,14 @@ public interface ISysUserService {
331 332
     public List<SysUser> selectUserListByDeptIdAndRoleKeyListAndUserName(SysUserConditionDto dto);
332 333
 
333 334
     /**
335
+     * 查询人事绩效用户列表
336
+     *
337
+     * @param dto 查询用户列表参数
338
+     * @return 用户信息集合
339
+     */
340
+    public List<SysUser> selectPersonnelUserList(SysPersonnelUserConditionDto dto);
341
+
342
+    /**
334 343
      * 首页 - 用户信息(按大队 ID 筛选)
335 344
      *
336 345
      * @param brigadeId 大队 ID

+ 36 - 0
airport-system/src/main/java/com/sundot/airport/system/service/impl/SysUserServiceImpl.java

@@ -23,11 +23,15 @@ import com.sundot.airport.common.core.domain.ResetUserPostDto;
23 23
 import com.sundot.airport.common.core.domain.ResetUserRoleDto;
24 24
 import com.sundot.airport.common.core.domain.entity.SysDept;
25 25
 import com.sundot.airport.common.core.domain.entity.SysDictData;
26
+import com.sundot.airport.common.dto.SysPersonnelUserConditionDto;
26 27
 import com.sundot.airport.common.dto.SysUserConditionDto;
27 28
 import com.sundot.airport.common.dto.SysUserLeaderConditionDto;
28 29
 import com.sundot.airport.common.dto.UserInfo;
29 30
 import com.sundot.airport.common.enums.DeptType;
31
+import com.sundot.airport.common.enums.EmploymentTypeEnum;
30 32
 import com.sundot.airport.common.enums.RoleTypeEnum;
33
+import com.sundot.airport.common.utils.DeptUtils;
34
+import com.sundot.airport.common.utils.MonthUtils;
31 35
 import com.sundot.airport.system.domain.SysLargeScreenCooperationDto;
32 36
 import com.sundot.airport.system.domain.SysLargeScreenCooperationItemDto;
33 37
 import com.sundot.airport.system.domain.SysLargeScreenCooperationQueryParamDto;
@@ -97,6 +101,9 @@ public class SysUserServiceImpl implements ISysUserService {
97 101
     @Autowired
98 102
     private ISysDictDataService sysDictDataService;
99 103
 
104
+    @Autowired
105
+    private ISysDeptService sysDeptService;
106
+
100 107
     /**
101 108
      * 根据条件分页查询用户列表
102 109
      *
@@ -1342,6 +1349,35 @@ public class SysUserServiceImpl implements ISysUserService {
1342 1349
         return userMapper.selectUserListByDeptIdAndRoleKeyListAndUserName(dto.getDeptId(), dto.getRoleKeyList(), dto.getNickName());
1343 1350
     }
1344 1351
 
1352
+    /**
1353
+     * 查询人事绩效用户列表
1354
+     *
1355
+     * @param dto 查询用户列表参数
1356
+     * @return 用户信息集合
1357
+     */
1358
+    @Override
1359
+    public List<SysUser> selectPersonnelUserList(SysPersonnelUserConditionDto dto) {
1360
+        if (ObjUtil.isNull(dto.getMonth())) {
1361
+            throw new ServiceException("请选择月份");
1362
+        }
1363
+        dto.setMonthStartTime(MonthUtils.getMonthStartTime(dto.getMonth()));
1364
+        dto.setMonthEndTime(MonthUtils.getMonthLastDayStartTime(dto.getMonth()));
1365
+        if (ObjUtil.isNull(dto.getDeptId())) {
1366
+            Long topSiteId = DeptUtils.getTopSiteId(sysDeptService.selectDeptById(SecurityUtils.getDeptId()));
1367
+            if (topSiteId == null) {
1368
+                throw new ServiceException("无法找到有效的站点信息");
1369
+            }
1370
+            dto.setDeptId(topSiteId);
1371
+        }
1372
+        if (CollUtil.isEmpty(dto.getRoleKeyList())) {
1373
+            dto.setRoleKeyList(Arrays.asList(RoleTypeEnum.SecurityCheck.getCode(), RoleTypeEnum.banzuzhang.getCode(), RoleTypeEnum.kezhang.getCode()));
1374
+        }
1375
+        if (CollUtil.isEmpty(dto.getEmploymentTypeList())) {
1376
+            dto.setEmploymentTypeList(Arrays.asList(EmploymentTypeEnum.DISPATCHED_WORKER.getCode(), EmploymentTypeEnum.REGULAR_EMPLOYEE.getCode()));
1377
+        }
1378
+        return userMapper.selectPersonnelUserList(dto.getDeptId(), dto.getRoleKeyList(), dto.getEmploymentTypeList(), dto.getMonthStartTime(), dto.getMonthEndTime(), dto.getNickName());
1379
+    }
1380
+
1345 1381
     @Override
1346 1382
     public List<LargeScreenHomePageUserInfoSqlDto> homePageUserInfoByBrigadeId(Long brigadeId) {
1347 1383
         return userMapper.homePageUserInfoByBrigadeId(brigadeId);

+ 34 - 8
airport-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -1111,6 +1111,32 @@
1111 1111
         </if>
1112 1112
     </select>
1113 1113
 
1114
+    <select id="selectPersonnelUserList" resultMap="SysUserResult">
1115
+        <include refid="selectUserVo"/>
1116
+        where (u.dept_id = #{deptId} OR u.dept_id IN (
1117
+        SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors)))
1118
+        and u.del_flag = '0'
1119
+        and (u.take_assessment = 'Y' or
1120
+        (u.take_assessment = 'N' and
1121
+        (u.exempt_take_assessment_start_time <![CDATA[>]]> #{monthStartTime} or
1122
+        u.exempt_take_assessment_end_time <![CDATA[<]]> #{monthEndTime})))
1123
+        <if test="roleKeyList != null and roleKeyList.size() > 0">
1124
+            and r.role_key in
1125
+            <foreach collection="roleKeyList" item="item" open="(" separator="," close=")">
1126
+                #{item}
1127
+            </foreach>
1128
+        </if>
1129
+        <if test="employmentTypeList != null and employmentTypeList.size() > 0">
1130
+            and u.employment_type in
1131
+            <foreach collection="employmentTypeList" item="item" open="(" separator="," close=")">
1132
+                #{item}
1133
+            </foreach>
1134
+        </if>
1135
+        <if test="nickName != null and nickName != ''">
1136
+            and u.nick_name like concat('%', #{nickName}, '%')
1137
+        </if>
1138
+    </select>
1139
+
1114 1140
     <select id="homePageUserInfo" resultType="com.sundot.airport.common.core.domain.LargeScreenHomePageUserInfoSqlDto">
1115 1141
         select su.user_id      userId,
1116 1142
                su.user_name    userName,
@@ -1209,14 +1235,14 @@
1209 1235
         <include refid="selectUserVo"/>
1210 1236
         where u.del_flag = '0'
1211 1237
         and (
1212
-            u.user_name in
1213
-            <foreach collection="names" item="name" open="(" separator="," close=")">
1214
-                #{name}
1215
-            </foreach>
1216
-            or u.nick_name in
1217
-            <foreach collection="names" item="name" open="(" separator="," close=")">
1218
-                #{name}
1219
-            </foreach>
1238
+        u.user_name in
1239
+        <foreach collection="names" item="name" open="(" separator="," close=")">
1240
+            #{name}
1241
+        </foreach>
1242
+        or u.nick_name in
1243
+        <foreach collection="names" item="name" open="(" separator="," close=")">
1244
+            #{name}
1245
+        </foreach>
1220 1246
         )
1221 1247
     </select>
1222 1248
 </mapper>