From 89071e0c09188d75c3d537f82204ae19713ac7fe Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期一, 12 十月 2026 10:09:33 +0800
Subject: [PATCH] feat(hrm): 合同生成与模板下载、员工转正、导入导出字段对齐

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java |   76 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 76 insertions(+), 0 deletions(-)

diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
index eefe7a7..3864fd3 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/employee/HrmEmployeeServiceImpl.java
@@ -6,6 +6,7 @@
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 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;
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEducationSaveReqVO;
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeEmergencyContactSaveReqVO;
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeImportExcelVO;
@@ -16,10 +17,12 @@
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeSaveReqVO;
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeSimpleRespVO;
 import cn.iocoder.yudao.module.hrm.controller.admin.employee.vo.HrmEmployeeWorkHistorySaveReqVO;
+import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeContractDO;
 import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO;
 import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEducationDO;
 import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeEmergencyContactDO;
 import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeWorkHistoryDO;
+import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeContractMapper;
 import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeEducationMapper;
 import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeEmergencyContactMapper;
 import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeMapper;
@@ -31,6 +34,8 @@
 import cn.iocoder.yudao.module.system.api.dept.dto.PostRespDTO;
 import cn.iocoder.yudao.module.system.api.permission.RoleApi;
 import cn.iocoder.yudao.module.system.api.permission.dto.RoleRespDTO;
+import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
+import cn.iocoder.yudao.module.system.api.storage.dto.StorageBlobRespDTO;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserCreateReqDTO;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserUpdateReqDTO;
@@ -40,6 +45,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -67,6 +73,8 @@
     @Resource
     private HrmEmployeeMapper employeeMapper;
     @Resource
+    private HrmEmployeeContractMapper contractMapper;
+    @Resource
     private HrmEmployeeEducationMapper educationMapper;
     @Resource
     private HrmEmployeeWorkHistoryMapper workHistoryMapper;
@@ -82,6 +90,8 @@
     private AdminUserApi adminUserApi;
     @Resource
     private RoleApi roleApi;
+    @Resource
+    private StorageAttachmentApi storageAttachmentApi;
     @Resource
     @Lazy // 鑷敞鍏ラ渶寤惰繜鍔犺浇锛屽惁鍒� bean 琚唬鐞嗗寘瑁呭悗娉ㄥ叆鍘熷鐗堟湰瀵艰嚧鍚姩澶辫触
     private HrmEmployeeService self;
@@ -129,6 +139,8 @@
         }
         employeeMapper.insert(employee);
         Long employeeId = employee.getId();
+        // 缁戝畾闄勪欢
+        storageAttachmentApi.bindAttachments("file", "hrm_employee", employeeId, createReqVO.getBlobIds());
         // 7. 鍚屾娣诲姞鏁欒偛缁忓巻
         if (CollUtil.isNotEmpty(createReqVO.getEducations())) {
             createReqVO.getEducations().forEach(educationVO -> {
@@ -210,6 +222,8 @@
         syncWorkHistoryList(employeeId, updateReqVO.getWorkHistories());
         // 鍚屾绱ф�ヨ仈绯讳汉
         syncEmergencyContactList(employeeId, updateReqVO.getEmergencyContacts());
+        // 鏇存柊闄勪欢
+        storageAttachmentApi.updateAttachments("file", "hrm_employee", employeeId, updateReqVO.getBlobIds());
     }
 
     private void syncEducationList(Long employeeId, List<HrmEmployeeEducationSaveReqVO> newList) {
@@ -257,6 +271,8 @@
         educationMapper.deleteByEmployeeId(id);
         workHistoryMapper.deleteByEmployeeId(id);
         emergencyContactMapper.deleteByEmployeeId(id);
+        // 鍒犻櫎闄勪欢
+        storageAttachmentApi.deleteAttachmentsByRecord("hrm_employee", id);
         // 鍒犻櫎鍛樺伐
         employeeMapper.deleteById(id);
     }
@@ -311,6 +327,8 @@
                 respVO.setRoleNames(roles.stream().map(RoleRespDTO::getName).collect(Collectors.joining(",")));
             }
         }
+        // 濉厖闄勪欢
+        respVO.setAttachmentList(storageAttachmentApi.listAttachments("hrm_employee", id));
         return respVO;
     }
 
@@ -463,6 +481,11 @@
         reqVO.setEducation(importEmployee.getEducation());
         reqVO.setPoliticalStatus(importEmployee.getPoliticalStatus());
         reqVO.setRemark(importEmployee.getRemark());
+        reqVO.setEmployeeCategory(importEmployee.getEmployeeCategory());
+        reqVO.setBaseSalary(importEmployee.getBaseSalary());
+        reqVO.setBankName(importEmployee.getBankName());
+        reqVO.setBankAccount(importEmployee.getBankAccount());
+        reqVO.setAddress(importEmployee.getAddress());
         return reqVO;
     }
 
@@ -518,4 +541,57 @@
         return roleIds;
     }
 
+    // ========== 杞 ==========
+
+    @Override
+    public void regularizeEmployee(Long id) {
+        validateEmployee(id);
+        HrmEmployeeContractDO contract = findCurrentContract(id);
+        // 浠呫�屽姵鍔ㄥ悎鍚屻�嶅彲杞锛涘姵鍔″悎鍚屼笉杞
+        if (contract == null || !Integer.valueOf(1).equals(contract.getContractType())) {
+            throw exception(EMPLOYEE_REGULARIZE_NEED_LABOR_CONTRACT);
+        }
+        HrmEmployeeDO updateObj = new HrmEmployeeDO();
+        updateObj.setId(id);
+        updateObj.setEmployeeStatus(1); // 1-鍦ㄨ亴
+        updateObj.setRegularDate(LocalDate.now());
+        employeeMapper.updateById(updateObj);
+    }
+
+    @Override
+    public List<HrmEmployeeDO> getRegularizeReminderList(Integer days) {
+        int aheadDays = days == null ? 7 : days;
+        LocalDate limit = LocalDate.now().plusDays(aheadDays);
+        // 璇曠敤涓殑鍛樺伐
+        List<HrmEmployeeDO> trials = employeeMapper.selectList(
+                new LambdaQueryWrapperX<HrmEmployeeDO>().eq(HrmEmployeeDO::getEmployeeStatus, 2));
+        List<HrmEmployeeDO> result = new ArrayList<>();
+        for (HrmEmployeeDO employee : trials) {
+            HrmEmployeeContractDO contract = findCurrentContract(employee.getId());
+            // 浠呭姵鍔ㄥ悎鍚屻�佷笖璇曠敤鏈熷嵆灏嗗埌鏈�
+            if (contract == null || !Integer.valueOf(1).equals(contract.getContractType())) {
+                continue;
+            }
+            LocalDate probationEnd = contract.getProbationEndDate();
+            if (probationEnd != null && !probationEnd.isAfter(limit)) {
+                result.add(employee);
+            }
+        }
+        return result;
+    }
+
+    /** 鏌ヨ鍛樺伐褰撳墠鐢熸晥鍚堝悓 */
+    private HrmEmployeeContractDO findCurrentContract(Long employeeId) {
+        List<HrmEmployeeContractDO> list = contractMapper.selectListByEmployee(employeeId);
+        if (CollUtil.isEmpty(list)) {
+            return null;
+        }
+        for (HrmEmployeeContractDO contract : list) {
+            if (Boolean.TRUE.equals(contract.getIsCurrent())) {
+                return contract;
+            }
+        }
+        return null;
+    }
+
 }
\ No newline at end of file

--
Gitblit v1.9.3