From b852254d90e7d1955db31db154193ec8ee84d8b3 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 09 九月 2026 10:57:59 +0800
Subject: [PATCH] feat(hrm): 新增员工用工性质、班组归属字段及考勤异常处理优化
---
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/performanceappraise/HrmPerformanceAppraiseServiceImpl.java | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 59 insertions(+), 0 deletions(-)
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/performanceappraise/HrmPerformanceAppraiseServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/performanceappraise/HrmPerformanceAppraiseServiceImpl.java
index cf19574..69451fc 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/performanceappraise/HrmPerformanceAppraiseServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/performanceappraise/HrmPerformanceAppraiseServiceImpl.java
@@ -2,6 +2,8 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -11,7 +13,9 @@
import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
import cn.iocoder.yudao.module.hrm.controller.admin.performanceappraise.vo.*;
+import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO;
import cn.iocoder.yudao.module.hrm.dal.dataobject.performanceappraise.*;
+import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeMapper;
import cn.iocoder.yudao.module.hrm.dal.mysql.performanceappraise.*;
import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum;
import cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants;
@@ -67,6 +71,17 @@
private static final Integer SCORER_SUPERIOR = 2;
/**
+ * 鑰冩牳鑼冨洿绫诲瀷锛�1 鍏ㄩ儴鍛樺伐 / 2 鎸囧畾鐝粍
+ */
+ private static final Integer SCOPE_ALL = 1;
+ private static final Integer SCOPE_TEAM = 2;
+
+ /**
+ * 鍦ㄨ亴鍛樺伐鐘舵��
+ */
+ private static final Integer EMPLOYEE_STATUS_ACTIVE = 1;
+
+ /**
* BPM 缁╂晥鑰冩牳瀹℃壒鍒嗙被缂栫爜
*/
private static final String APPRAISE_APPROVE_CATEGORY_CODE = "performance_appraise_approve";
@@ -80,6 +95,8 @@
@Resource
private HrmPerformanceAppraiseResultItemMapper resultItemMapper;
@Resource
+ private HrmEmployeeMapper employeeMapper;
+ @Resource
private BpmProcessInstanceApi bpmProcessInstanceApi;
@Resource
private BpmCategoryService bpmCategoryService;
@@ -92,6 +109,8 @@
HrmPerformanceAppraiseDO appraise = BeanUtils.toBean(createReqVO, HrmPerformanceAppraiseDO.class, req -> req
.setStatus(STATUS_DRAFT)
.setAuditStatus(HrmAuditStatusEnum.DRAFT.getStatus()));
+ appraise.setScopeTeamIds(CollUtil.isEmpty(createReqVO.getScopeTeamIds())
+ ? null : JSONUtil.toJsonStr(createReqVO.getScopeTeamIds()));
appraiseMapper.insert(appraise);
return appraise.getId();
}
@@ -104,6 +123,8 @@
.setStatus(oldAppraise.getStatus())
.setAuditStatus(oldAppraise.getAuditStatus())
.setProcessInstanceId(oldAppraise.getProcessInstanceId()));
+ updateObj.setScopeTeamIds(CollUtil.isEmpty(updateReqVO.getScopeTeamIds())
+ ? null : JSONUtil.toJsonStr(updateReqVO.getScopeTeamIds()));
appraiseMapper.updateById(updateObj);
}
@@ -391,6 +412,44 @@
return resultItemMapper.selectListByResultId(resultId);
}
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Integer generateAppraisees(Long appraiseId) {
+ HrmPerformanceAppraiseDO appraise = validateAppraiseExists(appraiseId);
+ // 1. 鎸夎�冩牳鑼冨洿绛涢�夊憳宸�
+ List<HrmEmployeeDO> employees;
+ if (Objects.equals(appraise.getScopeType(), SCOPE_TEAM)) {
+ List<Long> teamIds = StrUtil.isEmpty(appraise.getScopeTeamIds())
+ ? Collections.emptyList() : JSONUtil.toList(appraise.getScopeTeamIds(), Long.class);
+ if (CollUtil.isEmpty(teamIds)) {
+ throw exception(ErrorCodeConstants.PERFORMANCE_APPRAISE_SCOPE_TEAM_EMPTY);
+ }
+ employees = employeeMapper.selectListByTeamIds(teamIds);
+ } else {
+ employees = employeeMapper.selectListByStatus(EMPLOYEE_STATUS_ACTIVE);
+ }
+ if (CollUtil.isEmpty(employees)) {
+ return 0;
+ }
+ // 2. 宸插瓨鍦ㄧ粨鏋滅殑涓嶅啀鐢熸垚锛堝箓绛夛級
+ List<HrmPerformanceAppraiseResultDO> existing = resultMapper.selectList(
+ new LambdaQueryWrapperX<HrmPerformanceAppraiseResultDO>()
+ .eq(HrmPerformanceAppraiseResultDO::getAppraiseId, appraiseId));
+ Set<Long> existingEmployeeIds = convertSet(existing, HrmPerformanceAppraiseResultDO::getEmployeeId);
+ // 3. 鐢熸垚绌虹櫧缁撴灉琛�
+ int count = 0;
+ for (HrmEmployeeDO employee : employees) {
+ if (existingEmployeeIds.contains(employee.getId())) {
+ continue;
+ }
+ resultMapper.insert(new HrmPerformanceAppraiseResultDO()
+ .setAppraiseId(appraiseId)
+ .setEmployeeId(employee.getId()));
+ count++;
+ }
+ return count;
+ }
+
// ========== 绉佹湁鏂规硶 ==========
private Integer calcGrade(BigDecimal finalScore) {
--
Gitblit v1.9.3