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