本文目录导读:

我将帮助你开发一个Java薪资计算案例,这个案例将涵盖基本的薪资计算逻辑,包括基本工资、加班费、扣除项等。
完整的Java薪资计算系统
员工类(基础模型)
// Employee.java
public class Employee {
private int id;
private String name;
private String department;
private double basicSalary; // 基本工资
private double hourlyRate; // 时薪
private double overtimeHours; // 加班小时数
private double absentDays; // 缺勤天数
private double bonus; // 奖金
private double insurance; // 保险扣款
private double tax; // 税额
public Employee() {}
public Employee(int id, String name, String department, double basicSalary) {
this.id = id;
this.name = name;
this.department = department;
this.basicSalary = basicSalary;
this.hourlyRate = basicSalary / 21.75 / 8; // 按标准工作日计算时薪
}
// Getters and Setters
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getDepartment() { return department; }
public void setDepartment(String department) { this.department = department; }
public double getBasicSalary() { return basicSalary; }
public void setBasicSalary(double basicSalary) {
this.basicSalary = basicSalary;
this.hourlyRate = basicSalary / 21.75 / 8;
}
public double getHourlyRate() { return hourlyRate; }
public double getOvertimeHours() { return overtimeHours; }
public void setOvertimeHours(double overtimeHours) {
this.overtimeHours = overtimeHours;
}
public double getAbsentDays() { return absentDays; }
public void setAbsentDays(double absentDays) { this.absentDays = absentDays; }
public double getBonus() { return bonus; }
public void setBonus(double bonus) { this.bonus = bonus; }
public double getInsurance() { return insurance; }
public void setInsurance(double insurance) { this.insurance = insurance; }
public double getTax() { return tax; }
public void setTax(double tax) { this.tax = tax; }
@Override
public String toString() {
return String.format("员工ID: %d, 姓名: %s, 部门: %s, 基本工资: %.2f",
id, name, department, basicSalary);
}
}
薪资计算器类
// SalaryCalculator.java
import java.time.LocalDate;
public class SalaryCalculator {
// 税率等级
private static final double TAX_THRESHOLD = 5000; // 起征点
private static final double SOCIAL_SECURITY_RATE = 0.105; // 社保比例
/**
* 计算最终薪资
*/
public SalaryResult calculateSalary(Employee employee) {
SalaryResult result = new SalaryResult();
result.setEmployee(employee);
// 1. 计算应发工资
double grossSalary = calculateGrossSalary(employee);
result.setGrossSalary(grossSalary);
// 2. 计算加班费
double overtimePay = calculateOvertimePay(employee);
result.setOvertimePay(overtimePay);
// 3. 计算缺勤扣款
double absentDeduction = calculateAbsentDeduction(employee);
result.setAbsentDeduction(absentDeduction);
// 4. 计算社保扣款
double socialSecurity = calculateSocialSecurity(employee, grossSalary);
result.setSocialSecurity(socialSecurity);
// 5. 计算个人所得税
double tax = calculateTax(grossSalary - socialSecurity);
result.setTax(tax);
// 6. 计算实发工资
double netSalary = grossSalary + overtimePay - absentDeduction - socialSecurity - tax;
result.setNetSalary(netSalary);
return result;
}
/**
* 计算应发工资(基本工资 + 奖金)
*/
private double calculateGrossSalary(Employee employee) {
return employee.getBasicSalary() + employee.getBonus();
}
/**
* 计算加班费
* 工作日加班1.5倍,周末加班2倍,节假日加班3倍
*/
private double calculateOvertimePay(Employee employee) {
double overtimeHours = employee.getOvertimeHours();
double hourlyRate = employee.getHourlyRate();
// 简化计算:假设所有加班都是工作日1.5倍
return overtimeHours * hourlyRate * 1.5;
}
/**
* 计算缺勤扣款
*/
private double calculateAbsentDeduction(Employee employee) {
double dailyRate = employee.getBasicSalary() / 21.75; // 日工资
return employee.getAbsentDays() * dailyRate;
}
/**
* 计算社保扣款(养老、医疗、失业等)
*/
private double calculateSocialSecurity(Employee employee, double grossSalary) {
double socialSecurity = grossSalary * SOCIAL_SECURITY_RATE;
// 社保基数上下限(简化处理)
double minBase = 3000;
double maxBase = 20000;
if (socialSecurity < minBase * SOCIAL_SECURITY_RATE) {
socialSecurity = minBase * SOCIAL_SECURITY_RATE;
} else if (socialSecurity > maxBase * SOCIAL_SECURITY_RATE) {
socialSecurity = maxBase * SOCIAL_SECURITY_RATE;
}
return Math.round(socialSecurity * 100.0) / 100.0;
}
/**
* 计算个人所得税(使用累进税率)
*/
private double calculateTax(double taxableIncome) {
double tax = 0;
double taxableAmount = taxableIncome - TAX_THRESHOLD;
if (taxableAmount <= 0) {
return 0;
}
// 累进税率计算
if (taxableAmount <= 3000) {
tax = taxableAmount * 0.03;
} else if (taxableAmount <= 12000) {
tax = taxableAmount * 0.1 - 210;
} else if (taxableAmount <= 25000) {
tax = taxableAmount * 0.2 - 1410;
} else if (taxableAmount <= 35000) {
tax = taxableAmount * 0.25 - 2660;
} else if (taxableAmount <= 55000) {
tax = taxableAmount * 0.3 - 4410;
} else if (taxableAmount <= 80000) {
tax = taxableAmount * 0.35 - 7160;
} else {
tax = taxableAmount * 0.45 - 15160;
}
return Math.round(tax * 100.0) / 100.0;
}
}
薪资结果类
// SalaryResult.java
public class SalaryResult {
private Employee employee;
private double grossSalary; // 应发工资
private double overtimePay; // 加班费
private double absentDeduction; // 缺勤扣款
private double socialSecurity; // 社保扣款
private double tax; // 个人所得税
private double netSalary; // 实发工资
// Getters and Setters
public Employee getEmployee() { return employee; }
public void setEmployee(Employee employee) { this.employee = employee; }
public double getGrossSalary() { return grossSalary; }
public void setGrossSalary(double grossSalary) { this.grossSalary = grossSalary; }
public double getOvertimePay() { return overtimePay; }
public void setOvertimePay(double overtimePay) { this.overtimePay = overtimePay; }
public double getAbsentDeduction() { return absentDeduction; }
public void setAbsentDeduction(double absentDeduction) { this.absentDeduction = absentDeduction; }
public double getSocialSecurity() { return socialSecurity; }
public void setSocialSecurity(double socialSecurity) { this.socialSecurity = socialSecurity; }
public double getTax() { return tax; }
public void setTax(double tax) { this.tax = tax; }
public double getNetSalary() { return netSalary; }
public void setNetSalary(double netSalary) { this.netSalary = netSalary; }
public void printSalarySlip() {
System.out.println("=================================");
System.out.println(" 工资单");
System.out.println("=================================");
System.out.println("员工: " + employee.getName());
System.out.println("部门: " + employee.getDepartment());
System.out.println("---------------------------------");
System.out.printf("基本工资: %.2f\n", employee.getBasicSalary());
System.out.printf("奖金: %.2f\n", employee.getBonus());
System.out.printf("加班费: %.2f\n", overtimePay);
System.out.printf("缺勤扣款: -%.2f\n", absentDeduction);
System.out.println("---------------------------------");
System.out.printf("社保扣款: -%.2f\n", socialSecurity);
System.out.printf("个人所得税: -%.2f\n", tax);
System.out.println("---------------------------------");
System.out.printf("实发工资: %.2f\n", netSalary);
System.out.println("=================================");
}
}
计算器UI界面(可选)
// SalaryCalculatorUI.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SalaryCalculatorUI extends JFrame {
private JTextField nameField, departmentField, basicField;
private JTextField overtimeField, absentField, bonusField;
private JTextArea resultArea;
private SalaryCalculator calculator;
public SalaryCalculatorUI() {
calculator = new SalaryCalculator();
initializeUI();
}
private void initializeUI() {
setTitle("薪资计算系统");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout(10, 10));
// 输入面板
JPanel inputPanel = new JPanel(new GridLayout(7, 2, 5, 5));
inputPanel.setBorder(BorderFactory.createTitledBorder("员工信息输入"));
inputPanel.add(new JLabel("姓名:"));
nameField = new JTextField();
inputPanel.add(nameField);
inputPanel.add(new JLabel("部门:"));
departmentField = new JTextField();
inputPanel.add(departmentField);
inputPanel.add(new JLabel("基本工资:"));
basicField = new JTextField();
inputPanel.add(basicField);
inputPanel.add(new JLabel("加班小时数:"));
overtimeField = new JTextField("0");
inputPanel.add(overtimeField);
inputPanel.add(new JLabel("缺勤天数:"));
absentField = new JTextField("0");
inputPanel.add(absentField);
inputPanel.add(new JLabel("奖金:"));
bonusField = new JTextField("0");
inputPanel.add(bonusField);
JButton calculateBtn = new JButton("计算薪资");
JButton clearBtn = new JButton("清空");
JPanel buttonPanel = new JPanel();
buttonPanel.add(calculateBtn);
buttonPanel.add(clearBtn);
// 结果显示
resultArea = new JTextArea(15, 40);
resultArea.setEditable(false);
resultArea.setFont(new Font("Monospaced", Font.PLAIN, 12));
JScrollPane scrollPane = new JScrollPane(resultArea);
scrollPane.setBorder(BorderFactory.createTitledBorder("薪资明细"));
// 添加事件
calculateBtn.addActionListener(e -> calculate());
clearBtn.addActionListener(e -> clearFields());
// 布局
add(inputPanel, BorderLayout.NORTH);
add(buttonPanel, BorderLayout.CENTER);
add(scrollPane, BorderLayout.SOUTH);
pack();
setLocationRelativeTo(null);
}
private void calculate() {
try {
Employee emp = new Employee();
emp.setName(nameField.getText());
emp.setDepartment(departmentField.getText());
emp.setBasicSalary(Double.parseDouble(basicField.getText()));
emp.setOvertimeHours(Double.parseDouble(overtimeField.getText()));
emp.setAbsentDays(Double.parseDouble(absentField.getText()));
emp.setBonus(Double.parseDouble(bonusField.getText()));
SalaryResult result = calculator.calculateSalary(emp);
// 显示结果
StringBuilder sb = new StringBuilder();
sb.append("=================================\n");
sb.append(" 工资单\n");
sb.append("=================================\n");
sb.append(String.format("员工: %s\n", emp.getName()));
sb.append(String.format("部门: %s\n", emp.getDepartment()));
sb.append("---------------------------------\n");
sb.append(String.format("基本工资: %.2f\n", emp.getBasicSalary()));
sb.append(String.format("奖金: %.2f\n", emp.getBonus()));
sb.append(String.format("加班费: %.2f\n", result.getOvertimePay()));
sb.append(String.format("缺勤扣款: -%.2f\n", result.getAbsentDeduction()));
sb.append("---------------------------------\n");
sb.append(String.format("社保扣款: -%.2f\n", result.getSocialSecurity()));
sb.append(String.format("个人所得税: -%.2f\n", result.getTax()));
sb.append("---------------------------------\n");
sb.append(String.format("实发工资: %.2f\n", result.getNetSalary()));
sb.append("=================================");
resultArea.setText(sb.toString());
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, "请输入有效的数字!", "错误", JOptionPane.ERROR_MESSAGE);
}
}
private void clearFields() {
nameField.setText("");
departmentField.setText("");
basicField.setText("");
overtimeField.setText("0");
absentField.setText("0");
bonusField.setText("0");
resultArea.setText("");
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new SalaryCalculatorUI().setVisible(true);
});
}
}
主程序入口
// Main.java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
SalaryCalculator calculator = new SalaryCalculator();
System.out.println("=== 薪资计算系统 ===");
System.out.println("请选择模式:");
System.out.println("1. 命令行模式");
System.out.println("2. 图形界面模式");
System.out.print("请输入选择 (1或2): ");
int choice = scanner.nextInt();
if (choice == 1) {
runCommandLine(scanner);
} else if (choice == 2) {
runGUI();
} else {
System.out.println("无效选择!");
}
scanner.close();
}
private static void runCommandLine(Scanner scanner) {
System.out.print("请输入员工姓名: ");
String name = scanner.next();
System.out.print("请输入部门: ");
String department = scanner.next();
System.out.print("请输入基本工资: ");
double basicSalary = scanner.nextDouble();
Employee emp = new Employee(1, name, department, basicSalary);
System.out.print("请输入加班小时数: ");
emp.setOvertimeHours(scanner.nextDouble());
System.out.print("请输入缺勤天数: ");
emp.setAbsentDays(scanner.nextDouble());
System.out.print("请输入奖金: ");
emp.setBonus(scanner.nextDouble());
SalaryCalculator calculator = new SalaryCalculator();
SalaryResult result = calculator.calculateSalary(emp);
result.printSalarySlip();
}
private static void runGUI() {
SalaryCalculatorUI.main(null);
}
}
项目结构建议
salary-calculator/
├── src/
│ ├── Employee.java
│ ├── SalaryCalculator.java
│ ├── SalaryResult.java
│ ├── SalaryCalculatorUI.java
│ └── Main.java
├── lib/
└── README.md
扩展功能建议
- 数据库存储:使用JDBC连接数据库,存储员工信息和薪资记录
- 批量计算:支持多员工批量计算
- 报表导出:导出为Excel或PDF格式
- 公司配置:支持自定义税率、社保比例等参数
- 年度汇总:统计年度薪资总和
这个案例涵盖了面向对象设计、算法实现和基本的UI开发,适合作为学习Java开发的项目,你可以根据需要添加更多功能。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播