You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
4.0 KiB
143 lines
4.0 KiB
/**
|
|
* 员工历史记录类
|
|
* 负责记录员工的历史变更信息,如职位变更、薪资调整等
|
|
* 遵循单一职责原则,只负责历史记录的管理
|
|
*/
|
|
package com.employeetraining.history;
|
|
|
|
import com.employeetraining.model.Employee;
|
|
|
|
import java.time.LocalDateTime;
|
|
import java.time.format.DateTimeFormatter;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Optional;
|
|
|
|
public class EmployeeHistory {
|
|
private String employeeId;
|
|
private List<HistoryRecord> historyRecords;
|
|
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
|
public EmployeeHistory(String employeeId) {
|
|
this.employeeId = employeeId;
|
|
this.historyRecords = new ArrayList<>();
|
|
}
|
|
|
|
/**
|
|
* 记录职位变更
|
|
*/
|
|
public void recordPositionChange(String oldPosition, String newPosition) {
|
|
String description = String.format("职位变更: 从 '%s' 变更为 '%s'", oldPosition, newPosition);
|
|
addRecord(HistoryType.POSITION_CHANGE, description);
|
|
}
|
|
|
|
/**
|
|
* 记录薪资调整
|
|
*/
|
|
public void recordSalaryChange(double oldSalary, double newSalary) {
|
|
String description = String.format("薪资调整: 从 %.2f 调整为 %.2f", oldSalary, newSalary);
|
|
addRecord(HistoryType.SALARY_CHANGE, description);
|
|
}
|
|
|
|
/**
|
|
* 记录部门变更
|
|
*/
|
|
public void recordDepartmentChange(String oldDepartment, String newDepartment) {
|
|
String description = String.format("部门变更: 从 '%s' 变更为 '%s'", oldDepartment, newDepartment);
|
|
addRecord(HistoryType.DEPARTMENT_CHANGE, description);
|
|
}
|
|
|
|
/**
|
|
* 添加自定义记录
|
|
*/
|
|
public void addCustomRecord(String description) {
|
|
addRecord(HistoryType.CUSTOM, description);
|
|
}
|
|
|
|
/**
|
|
* 内部方法:添加记录
|
|
*/
|
|
private void addRecord(HistoryType type, String description) {
|
|
HistoryRecord record = new HistoryRecord(LocalDateTime.now(), type, description);
|
|
historyRecords.add(record);
|
|
}
|
|
|
|
/**
|
|
* 获取所有历史记录
|
|
*/
|
|
public List<HistoryRecord> getAllRecords() {
|
|
return new ArrayList<>(historyRecords); // 返回副本,防止外部修改
|
|
}
|
|
|
|
/**
|
|
* 根据类型获取历史记录
|
|
*/
|
|
public List<HistoryRecord> getRecordsByType(HistoryType type) {
|
|
return historyRecords.stream()
|
|
.filter(record -> record.getType() == type)
|
|
.toList();
|
|
}
|
|
|
|
/**
|
|
* 获取最新的历史记录
|
|
*/
|
|
public Optional<HistoryRecord> getLatestRecord() {
|
|
if (historyRecords.isEmpty()) {
|
|
return Optional.empty();
|
|
}
|
|
return Optional.of(historyRecords.get(historyRecords.size() - 1));
|
|
}
|
|
|
|
/**
|
|
* 获取记录总数
|
|
*/
|
|
public int getRecordCount() {
|
|
return historyRecords.size();
|
|
}
|
|
|
|
/**
|
|
* 历史记录类型枚举
|
|
*/
|
|
public enum HistoryType {
|
|
POSITION_CHANGE,
|
|
SALARY_CHANGE,
|
|
DEPARTMENT_CHANGE,
|
|
CUSTOM
|
|
}
|
|
|
|
/**
|
|
* 历史记录内部类
|
|
*/
|
|
public class HistoryRecord {
|
|
private final LocalDateTime timestamp;
|
|
private final HistoryType type;
|
|
private final String description;
|
|
|
|
public HistoryRecord(LocalDateTime timestamp, HistoryType type, String description) {
|
|
this.timestamp = timestamp;
|
|
this.type = type;
|
|
this.description = description;
|
|
}
|
|
|
|
public LocalDateTime getTimestamp() {
|
|
return timestamp;
|
|
}
|
|
|
|
public String getFormattedTimestamp() {
|
|
return timestamp.format(formatter);
|
|
}
|
|
|
|
public HistoryType getType() {
|
|
return type;
|
|
}
|
|
|
|
public String getDescription() {
|
|
return description;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "[" + getFormattedTimestamp() + "] " + type + ": " + description;
|
|
}
|
|
}
|
|
} |