From f50da3afc73bc458640677c198bb7c99de5b2fe5 Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期一, 09 三月 2026 17:33:45 +0800
Subject: [PATCH] fix(mybatis): 修正createUser和updateUser填充值类型空值处理

---
 src/main/java/com/ruoyi/staff/controller/TaxCalculator.java |  102 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 102 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/staff/controller/TaxCalculator.java b/src/main/java/com/ruoyi/staff/controller/TaxCalculator.java
new file mode 100644
index 0000000..cbe9742
--- /dev/null
+++ b/src/main/java/com/ruoyi/staff/controller/TaxCalculator.java
@@ -0,0 +1,102 @@
+package com.ruoyi.staff.controller;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鏈堝害涓◣璁$畻宸ュ叿绫伙紙浠呴渶鏈堝害鏀跺叆銆佺ぞ淇濅釜浜恒�佸叕绉噾涓汉涓変釜鍙傛暟锛�
+ */
+public class TaxCalculator {
+    // 鏈堝害鍏嶅緛棰濓紙5000鍏冿級
+    private static final BigDecimal MONTHLY_EXEMPTION = new BigDecimal("5000");
+
+    // 鏈堝害涓◣绋庣巼琛細[搴旂撼绋庢墍寰楅涓婇檺, 绋庣巼, 閫熺畻鎵i櫎鏁癩
+    private static final List<TaxBracket> MONTHLY_TAX_BRACKETS = new ArrayList<>();
+
+    // 闈欐�佸垵濮嬪寲绋庣巼琛紙鎸夋湀搴︽崲绠楋紝瀵瑰簲鍏ㄥ勾琛�/12锛�
+    static {
+        MONTHLY_TAX_BRACKETS.add(new TaxBracket(new BigDecimal("3000"),  new BigDecimal("0.03"),  new BigDecimal("0")));
+        MONTHLY_TAX_BRACKETS.add(new TaxBracket(new BigDecimal("12000"), new BigDecimal("0.10"),  new BigDecimal("210")));
+        MONTHLY_TAX_BRACKETS.add(new TaxBracket(new BigDecimal("25000"), new BigDecimal("0.20"),  new BigDecimal("1410")));
+        MONTHLY_TAX_BRACKETS.add(new TaxBracket(new BigDecimal("35000"), new BigDecimal("0.25"),  new BigDecimal("2660")));
+        MONTHLY_TAX_BRACKETS.add(new TaxBracket(new BigDecimal("55000"), new BigDecimal("0.30"),  new BigDecimal("4410")));
+        MONTHLY_TAX_BRACKETS.add(new TaxBracket(new BigDecimal("80000"), new BigDecimal("0.35"),  new BigDecimal("7160")));
+        MONTHLY_TAX_BRACKETS.add(new TaxBracket(new BigDecimal("999999"), new BigDecimal("0.45"), new BigDecimal("15160")));
+    }
+
+    // 绋庣巼琛ㄥ唴閮ㄧ被
+    private static class TaxBracket {
+        final BigDecimal max;       // 璇ユ。浣嶅簲绾崇◣鎵�寰楅涓婇檺
+        final BigDecimal rate;      // 绋庣巼
+        final BigDecimal deduction; // 閫熺畻鎵i櫎鏁�
+
+        TaxBracket(BigDecimal max, BigDecimal rate, BigDecimal deduction) {
+            this.max = max;
+            this.rate = rate;
+            this.deduction = deduction;
+        }
+    }
+
+    /**
+     * 璁$畻鍗曟湀涓汉鎵�寰楃◣锛堜粎闇�涓変釜鍙傛暟锛�
+     * @param monthlyIncome 鏈堝害鏀跺叆锛堢◣鍓嶏級
+     * @param socialSecurity 绀句繚涓汉缂寸撼閲戦
+     * @param fund 鍏Н閲戜釜浜虹即绾抽噾棰�
+     * @return 鏈堝害搴旂即涓◣锛堜繚鐣�2浣嶅皬鏁帮級
+     */
+    public static BigDecimal calculateMonthlyTax(
+            BigDecimal monthlyIncome,
+            BigDecimal socialSecurity,
+            BigDecimal fund
+    ) {
+        // 1. 绌哄��/璐熸暟澶勭悊锛氬弬鏁颁负null鎴栬礋鏁版椂鎸�0璁$畻
+        monthlyIncome = (monthlyIncome == null || monthlyIncome.compareTo(BigDecimal.ZERO) < 0) ? BigDecimal.ZERO : monthlyIncome;
+        socialSecurity = (socialSecurity == null || socialSecurity.compareTo(BigDecimal.ZERO) < 0) ? BigDecimal.ZERO : socialSecurity;
+        fund = (fund == null || fund.compareTo(BigDecimal.ZERO) < 0) ? BigDecimal.ZERO : fund;
+
+        // 2. 璁$畻鏈堝害搴旂撼绋庢墍寰楅 = 鏈堝害鏀跺叆 - 5000鍏嶅緛棰� - 绀句繚涓汉 - 鍏Н閲戜釜浜�
+        BigDecimal taxableIncome = monthlyIncome
+                .subtract(MONTHLY_EXEMPTION)
+                .subtract(socialSecurity)
+                .subtract(fund);
+
+        // 3. 搴旂撼绋庢墍寰楅鈮�0鏃讹紝涓◣涓�0
+        if (taxableIncome.compareTo(BigDecimal.ZERO) <= 0) {
+            return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
+        }
+
+        // 4. 鍖归厤绋庣巼妗d綅璁$畻涓◣
+        for (TaxBracket bracket : MONTHLY_TAX_BRACKETS) {
+            if (taxableIncome.compareTo(bracket.max) <= 0) {
+                return taxableIncome.multiply(bracket.rate)
+                        .subtract(bracket.deduction)
+                        .setScale(2, RoundingMode.HALF_UP);
+            }
+        }
+
+        // 5. 瓒呰繃鏈�楂樻。浣嶏紙80000鍏冿級鐨勬儏鍐�
+        TaxBracket lastBracket = MONTHLY_TAX_BRACKETS.get(MONTHLY_TAX_BRACKETS.size() - 1);
+        return taxableIncome.multiply(lastBracket.rate)
+                .subtract(lastBracket.deduction)
+                .setScale(2, RoundingMode.HALF_UP);
+    }
+
+    // 娴嬭瘯绀轰緥
+    public static void main(String[] args) {
+        // 绀轰緥1锛氭湀鏀跺叆10000锛岀ぞ淇濅釜浜�800锛屽叕绉噾涓汉500
+        BigDecimal income1 = new BigDecimal("10000");
+        BigDecimal social1 = new BigDecimal("800");
+        BigDecimal fund1 = new BigDecimal("500");
+        BigDecimal tax1 = calculateMonthlyTax(income1, social1, fund1);
+        System.out.println("鏈堟敹鍏�10000锛岀ぞ淇�800锛屽叕绉噾500锛屼釜绋庯細" + tax1 + " 鍏�"); // 璁$畻缁撴灉锛�111.00 鍏�
+
+        // 绀轰緥2锛氭湀鏀跺叆5000锛岀ぞ淇�500锛屽叕绉噾200
+        BigDecimal income2 = new BigDecimal("5000");
+        BigDecimal social2 = new BigDecimal("500");
+        BigDecimal fund2 = new BigDecimal("200");
+        BigDecimal tax2 = calculateMonthlyTax(income2, social2, fund2);
+        System.out.println("鏈堟敹鍏�5000锛岀ぞ淇�500锛屽叕绉噾200锛屼釜绋庯細" + tax2 + " 鍏�"); // 璁$畻缁撴灉锛�0.00 鍏�
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3