From fa4a310bb94f41bdc7af068bd380fdfeafb881c7 Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期一, 26 十月 2026 14:14:20 +0800
Subject: [PATCH] feat(hrm): 薪酬核算新增「岗位工资」「工龄工资」

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeSaveReqVO.java     |   10 +++
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeRespVO.java        |   10 +++
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/salary/HrmEmployeeSalaryDO.java             |   10 +++
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/salary/HrmSalaryCalculationDO.java          |   10 +++
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/employee/HrmEmployeeDO.java                 |   10 +++
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/salary/vo/HrmSalaryCalculationRespVO.java |    8 ++
 sql/mysql/hrm_salary_add_post_seniority.sql                                                                           |   68 ++++++++++++++++++++++
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java        |   11 +++
 8 files changed, 135 insertions(+), 2 deletions(-)

diff --git a/sql/mysql/hrm_salary_add_post_seniority.sql b/sql/mysql/hrm_salary_add_post_seniority.sql
new file mode 100644
index 0000000..0cea201
--- /dev/null
+++ b/sql/mysql/hrm_salary_add_post_seniority.sql
@@ -0,0 +1,68 @@
+-- =============================================
+-- 钖叕鏍哥畻锛氭柊澧炪�屽矖浣嶅伐璧勩�嶃�屽伐榫勫伐璧勩��
+--
+-- 涓氬姟璇存槑锛�
+--   1) 宀椾綅宸ヨ祫銆佸伐榫勫伐璧勪笌銆屽熀鏈伐璧勩�嶅悓婧愶紝鍦ㄣ�愬憳宸ョ鐞嗐�戠殑鍛樺伐淇℃伅涓淮鎶�
+--   2) 鎵ц钖叕鏍哥畻鏃跺甫鍏ユ牳绠楀崟锛屽苟璁″叆搴斿彂宸ヨ祫涓庡疄鍙戝伐璧�
+--   3) 钖叕妗f(hrm_employee_salary)鍚屾鍔犲垪锛屼究浜庡悗缁墿灞曪紱褰撳墠鏍哥畻浠ュ憳宸ヤ俊鎭负鍑�
+--
+-- 鑴氭湰鍙噸澶嶆墽琛岋紙骞傜瓑锛�
+-- =============================================
+SET NAMES utf8mb4;
+
+SET @sch := DATABASE();
+
+-- ---------- 1. 鍛樺伐淇℃伅锛氬矖浣嶅伐璧� / 宸ラ緞宸ヨ祫 ----------
+SET @exists := (SELECT COUNT(*) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = @sch AND TABLE_NAME = 'hrm_employee' AND COLUMN_NAME = 'post_salary');
+SET @sql := IF(@exists = 0,
+    'ALTER TABLE `hrm_employee` ADD COLUMN `post_salary` decimal(10,2) DEFAULT ''0.00'' COMMENT ''宀椾綅宸ヨ祫'' AFTER `base_salary`',
+    'SELECT ''hrm_employee.post_salary 宸插瓨鍦�'' AS msg');
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+SET @exists := (SELECT COUNT(*) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = @sch AND TABLE_NAME = 'hrm_employee' AND COLUMN_NAME = 'seniority_salary');
+SET @sql := IF(@exists = 0,
+    'ALTER TABLE `hrm_employee` ADD COLUMN `seniority_salary` decimal(10,2) DEFAULT ''0.00'' COMMENT ''宸ラ緞宸ヨ祫'' AFTER `post_salary`',
+    'SELECT ''hrm_employee.seniority_salary 宸插瓨鍦�'' AS msg');
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+-- ---------- 2. 钖叕鏍哥畻鍗曪細宀椾綅宸ヨ祫 / 宸ラ緞宸ヨ祫 ----------
+SET @exists := (SELECT COUNT(*) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = @sch AND TABLE_NAME = 'hrm_salary_calculation' AND COLUMN_NAME = 'post_salary');
+SET @sql := IF(@exists = 0,
+    'ALTER TABLE `hrm_salary_calculation` ADD COLUMN `post_salary` decimal(10,2) DEFAULT ''0.00'' COMMENT ''宀椾綅宸ヨ祫'' AFTER `performance_salary`',
+    'SELECT ''hrm_salary_calculation.post_salary 宸插瓨鍦�'' AS msg');
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+SET @exists := (SELECT COUNT(*) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = @sch AND TABLE_NAME = 'hrm_salary_calculation' AND COLUMN_NAME = 'seniority_salary');
+SET @sql := IF(@exists = 0,
+    'ALTER TABLE `hrm_salary_calculation` ADD COLUMN `seniority_salary` decimal(10,2) DEFAULT ''0.00'' COMMENT ''宸ラ緞宸ヨ祫'' AFTER `post_salary`',
+    'SELECT ''hrm_salary_calculation.seniority_salary 宸插瓨鍦�'' AS msg');
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+-- ---------- 3. 钖叕妗f锛堝彲閫夛紝褰撳墠鏍哥畻涓嶅彇姝よ〃鐨勫熀鏈�/宀椾綅/宸ラ緞宸ヨ祫锛� ----------
+SET @exists := (SELECT COUNT(*) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = @sch AND TABLE_NAME = 'hrm_employee_salary' AND COLUMN_NAME = 'post_salary');
+SET @sql := IF(@exists = 0,
+    'ALTER TABLE `hrm_employee_salary` ADD COLUMN `post_salary` decimal(10,2) DEFAULT ''0.00'' COMMENT ''宀椾綅宸ヨ祫'' AFTER `base_salary`',
+    'SELECT ''hrm_employee_salary.post_salary 宸插瓨鍦�'' AS msg');
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+SET @exists := (SELECT COUNT(*) FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = @sch AND TABLE_NAME = 'hrm_employee_salary' AND COLUMN_NAME = 'seniority_salary');
+SET @sql := IF(@exists = 0,
+    'ALTER TABLE `hrm_employee_salary` ADD COLUMN `seniority_salary` decimal(10,2) DEFAULT ''0.00'' COMMENT ''宸ラ緞宸ヨ祫'' AFTER `post_salary`',
+    'SELECT ''hrm_employee_salary.seniority_salary 宸插瓨鍦�'' AS msg');
+PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
+
+-- ---------- 4. 鏍稿 ----------
+SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, COLUMN_DEFAULT, COLUMN_COMMENT
+FROM information_schema.COLUMNS
+WHERE TABLE_SCHEMA = @sch
+  AND TABLE_NAME IN ('hrm_employee', 'hrm_salary_calculation', 'hrm_employee_salary')
+  AND COLUMN_NAME IN ('post_salary', 'seniority_salary')
+ORDER BY TABLE_NAME, COLUMN_NAME;
+
+SELECT '宀椾綅宸ヨ祫 / 宸ラ緞宸ヨ祫瀛楁鍒濆鍖栧畬鎴�' AS result;
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeRespVO.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeRespVO.java
index 687c923..8518054 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeRespVO.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeRespVO.java
@@ -122,6 +122,16 @@
     @ExcelProperty("鍩烘湰宸ヨ祫")
     private BigDecimal baseSalary;
 
+    /**
+     * 宀椾綅宸ヨ祫
+     */
+    private BigDecimal postSalary;
+
+    /**
+     * 宸ラ緞宸ヨ祫
+     */
+    private BigDecimal senioritySalary;
+
     @Schema(description = "瑙掕壊ID鍒楄〃")
     private List<Long> roleIds;
 
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeSaveReqVO.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeSaveReqVO.java
index f642f86..c7e8a83 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeSaveReqVO.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/employee/vo/HrmEmployeeSaveReqVO.java
@@ -93,6 +93,16 @@
     @Schema(description = "鍩烘湰宸ヨ祫", example = "10000.00")
     private BigDecimal baseSalary;
 
+    /**
+     * 宀椾綅宸ヨ祫
+     */
+    private BigDecimal postSalary;
+
+    /**
+     * 宸ラ緞宸ヨ祫
+     */
+    private BigDecimal senioritySalary;
+
     @Schema(description = "瑙掕壊ID鍒楄〃", example = "[1, 2]")
     private List<Long> roleIds;
 
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/salary/vo/HrmSalaryCalculationRespVO.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/salary/vo/HrmSalaryCalculationRespVO.java
index 16836b7..1383e02 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/salary/vo/HrmSalaryCalculationRespVO.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/salary/vo/HrmSalaryCalculationRespVO.java
@@ -45,6 +45,14 @@
     @ExcelProperty("鍩烘湰宸ヨ祫")
     private BigDecimal baseSalary;
 
+    @Schema(description = "宀椾綅宸ヨ祫")
+    @ExcelProperty("宀椾綅宸ヨ祫")
+    private BigDecimal postSalary;
+
+    @Schema(description = "宸ラ緞宸ヨ祫")
+    @ExcelProperty("宸ラ緞宸ヨ祫")
+    private BigDecimal senioritySalary;
+
     @Schema(description = "缁╂晥宸ヨ祫")
     @ExcelProperty("缁╂晥宸ヨ祫")
     private BigDecimal performanceSalary;
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/employee/HrmEmployeeDO.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/employee/HrmEmployeeDO.java
index dd4b92c..c392349 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/employee/HrmEmployeeDO.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/employee/HrmEmployeeDO.java
@@ -167,6 +167,16 @@
     private BigDecimal baseSalary;
 
     /**
+     * 宀椾綅宸ヨ祫
+     */
+    private BigDecimal postSalary;
+
+    /**
+     * 宸ラ緞宸ヨ祫
+     */
+    private BigDecimal senioritySalary;
+
+    /**
      * 瑙掕壊ID鍒楄〃
      *
      * 鐢ㄤ簬鍒嗛厤绯荤粺鐢ㄦ埛瑙掕壊锛孞SON 鏍煎紡瀛樺偍
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/salary/HrmEmployeeSalaryDO.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/salary/HrmEmployeeSalaryDO.java
index 50ef31f..c454061 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/salary/HrmEmployeeSalaryDO.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/salary/HrmEmployeeSalaryDO.java
@@ -48,6 +48,16 @@
     private BigDecimal baseSalary;
 
     /**
+     * 宀椾綅宸ヨ祫
+     */
+    private BigDecimal postSalary;
+
+    /**
+     * 宸ラ緞宸ヨ祫
+     */
+    private BigDecimal senioritySalary;
+
+    /**
      * 缁╂晥宸ヨ祫
      */
     private BigDecimal performanceSalary;
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/salary/HrmSalaryCalculationDO.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/salary/HrmSalaryCalculationDO.java
index 2f19cc4..4b08d9b 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/salary/HrmSalaryCalculationDO.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/dataobject/salary/HrmSalaryCalculationDO.java
@@ -58,6 +58,16 @@
     private BigDecimal baseSalary;
 
     /**
+     * 宀椾綅宸ヨ祫
+     */
+    private BigDecimal postSalary;
+
+    /**
+     * 宸ラ緞宸ヨ祫
+     */
+    private BigDecimal senioritySalary;
+
+    /**
      * 缁╂晥宸ヨ祫
      */
     private BigDecimal performanceSalary;
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 2d8be45..ed13d18 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
@@ -239,6 +239,9 @@
         // 閬垮厤鍛樺伐淇℃伅涓庤柂閰。妗堜笉涓�鑷存椂锛屾牳绠楃粨鏋滀笌鍛樺伐妗f瀵逛笉涓婏級
         BigDecimal baseSalary = employee.getBaseSalary() != null ? employee.getBaseSalary() : BigDecimal.ZERO;
         BigDecimal performanceSalary = employeeSalary.getPerformanceSalary() != null ? employeeSalary.getPerformanceSalary() : BigDecimal.ZERO;
+        // 宀椾綅宸ヨ祫 / 宸ラ緞宸ヨ祫锛氫笌鍩烘湰宸ヨ祫鍚屾簮锛屽彇鍛樺伐淇℃伅涓淮鎶ょ殑閲戦
+        BigDecimal postSalary = employee.getPostSalary() != null ? employee.getPostSalary() : BigDecimal.ZERO;
+        BigDecimal senioritySalary = employee.getSenioritySalary() != null ? employee.getSenioritySalary() : BigDecimal.ZERO;
         BigDecimal mealAllowance = employeeSalary.getMealAllowance() != null ? employeeSalary.getMealAllowance() : BigDecimal.ZERO;
         BigDecimal transportAllowance = employeeSalary.getTransportAllowance() != null ? employeeSalary.getTransportAllowance() : BigDecimal.ZERO;
         BigDecimal otherAllowance = employeeSalary.getOtherAllowance() != null ? employeeSalary.getOtherAllowance() : BigDecimal.ZERO;
@@ -251,8 +254,8 @@
         BigDecimal totalWorkHours = scheduleStat.totalWorkHours();
 
         // 搴斿彂宸ヨ祫鎬婚
-        BigDecimal totalIncome = baseSalary.add(performanceSalary).add(mealAllowance)
-                .add(transportAllowance).add(otherAllowance).add(overtimePay);
+        BigDecimal totalIncome = baseSalary.add(performanceSalary).add(postSalary).add(senioritySalary)
+                .add(mealAllowance).add(transportAllowance).add(otherAllowance).add(overtimePay);
 
         // 鑾峰彇绀句繚鍩烘暟锛氬憳宸ョぞ淇濇。妗� > 鍛樺伐鍩烘湰宸ヨ祫
         BigDecimal socialSecurityBase = (socialSecurity != null && socialSecurity.getSocialSecurityBase() != null)
@@ -310,6 +313,8 @@
                 .deptId(employee.getDeptId())
                 .baseSalary(baseSalary)
                 .performanceSalary(performanceSalary)
+                .postSalary(postSalary)
+                .senioritySalary(senioritySalary)
                 .overtimePay(overtimePay)
                 .mealAllowance(mealAllowance)
                 .transportAllowance(transportAllowance)
@@ -689,6 +694,8 @@
         // 鍚﹀垯浼氬嚭鐜般�屽疄鍙戝伐璧勬寜 0 璁$畻銆佷絾鏄庣粏浠嶄繚鐣欐棫鍊笺�嶇殑涓嶄竴鑷�
         calculation.setBaseSalary(nvl(calculation.getBaseSalary()));
         calculation.setPerformanceSalary(nvl(calculation.getPerformanceSalary()));
+        calculation.setPostSalary(nvl(calculation.getPostSalary()));
+        calculation.setSenioritySalary(nvl(calculation.getSenioritySalary()));
         calculation.setOvertimePay(nvl(calculation.getOvertimePay()));
         calculation.setMealAllowance(nvl(calculation.getMealAllowance()));
         calculation.setTransportAllowance(nvl(calculation.getTransportAllowance()));

--
Gitblit v1.9.3