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