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