From 5d8a5addb80d0f1663862963b76a1a4a7d9295fd Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期二, 03 十一月 2026 10:11:12 +0800
Subject: [PATCH] feat(hrm): 薪酬核算确认后自动给员工发送工资条通知(站内信)

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java |   42 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java
index 9f9e1e4..08218c8 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java
@@ -32,6 +32,9 @@
 import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmSalaryStructureMapper;
 import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
+import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
+import lombok.extern.slf4j.Slf4j;
 import cn.iocoder.yudao.module.hrm.enums.HrmOvertimeTypeEnum;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
@@ -44,6 +47,7 @@
 import java.time.LocalDateTime;
 import java.time.YearMonth;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -60,6 +64,7 @@
  */
 @Service
 @Validated
+@Slf4j
 public class HrmSalaryCalculationServiceImpl implements HrmSalaryCalculationService {
 
     /**
@@ -89,6 +94,8 @@
     private HrmNoRedisDAO noRedisDAO;
     @Resource
     private DeptApi deptApi;
+    @Resource
+    private NotifyMessageSendApi notifyMessageSendApi;
     @Resource
     private HrmDeductionService deductionService;
     @Resource
@@ -491,6 +498,8 @@
             salaryCalculationMapper.updateById(salaryCalculation);
             // 璁板綍鍛ㄦ湡
             period = salaryCalculation.getPeriod();
+            // 纭鍚庣粰璇ュ憳宸ュ彂閫佸伐璧勬潯閫氱煡锛堝け璐ヤ笉褰卞搷纭涓绘祦绋嬶級
+            sendPayslipNotice(salaryCalculation);
         }
 
         // 妫�鏌ヨ鍛ㄦ湡鏄惁鎵�鏈夋牳绠楄褰曢兘宸茬‘璁わ紝鑷姩鐢熸垚鍙戞斁鍙拌处
@@ -502,6 +511,39 @@
     /**
      * 妫�鏌ヨ鍛ㄦ湡鏄惁鎵�鏈夋牳绠楄褰曢兘宸茬‘璁わ紝濡傛灉鍏ㄩ儴纭鍒欒嚜鍔ㄧ敓鎴愬彂鏀惧彴璐�
      */
+    /**
+     * 宸ヨ祫鏉¢�氱煡鐨勭珯鍐呬俊妯℃澘缂栫爜
+     *
+     * 瀵瑰簲 system_notify_template.code = salary_payslip_notice
+     */
+    private static final String TEMPLATE_CODE_PAYSLIP = "salary_payslip_notice";
+
+    /**
+     * 缁欏憳宸ュ彂閫佸伐璧勬潯閫氱煡锛圓PP 绔欏唴淇★級
+     *
+     * 閫氱煡澶辫触鍙鏃ュ織锛屼笉褰卞搷鏍哥畻纭涓绘祦绋�
+     */
+    private void sendPayslipNotice(HrmSalaryCalculationDO calculation) {
+        if (calculation == null || calculation.getUserId() == null) {
+            return;
+        }
+        try {
+            NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO();
+            reqDTO.setUserId(calculation.getUserId());
+            reqDTO.setTemplateCode(TEMPLATE_CODE_PAYSLIP);
+            Map<String, Object> params = new HashMap<>();
+            params.put("period", calculation.getPeriod());
+            params.put("actualSalary", calculation.getActualSalary());
+            reqDTO.setTemplateParams(params);
+            notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO);
+            log.info("[sendPayslipNotice] 宸ヨ祫鏉¢�氱煡宸插彂閫侊紝userId={}, period={}",
+                    calculation.getUserId(), calculation.getPeriod());
+        } catch (Exception e) {
+            log.warn("[sendPayslipNotice] 宸ヨ祫鏉¢�氱煡鍙戦�佸け璐ワ紝userId={}, period={}",
+                    calculation.getUserId(), calculation.getPeriod(), e);
+        }
+    }
+
     private void autoGeneratePaymentIfAllConfirmed(String period) {
         // 鏌ヨ璇ュ懆鏈熸墍鏈夋牳绠楄褰�
         List<HrmSalaryCalculationDO> allCalculations = salaryCalculationMapper.selectListByPeriod(period);

--
Gitblit v1.9.3