Skip to content

Commit 20a5ea3

Browse files
authored
Merge pull request #67 from Boyuan-IT-Club/Red_Moon
导出的“姓名”从简历里获取,而非从账号获取
2 parents a5f1521 + f0a09f5 commit 20a5ea3

File tree

1 file changed

+55
-8
lines changed

1 file changed

+55
-8
lines changed

src/main/java/club/boyuan/official/service/impl/InterviewAssignmentServiceImpl.java

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -119,21 +119,25 @@ private InterviewAssignmentResultDTO assignInterviewsWithOptimization(
119119
// 如果用户没有填写期望面试时间,则加入未填写期望面试时间列表
120120
if (preferredTimes.isEmpty()) {
121121
logger.info("用户 {} 没有填写期望面试时间,加入未填写期望面试时间列表", user.getUsername());
122+
// 从简历中获取姓名而不是从用户表中获取
123+
String name = getResumeName(resume);
122124
noPreferenceUsers.add(new InterviewAssignmentResultDTO.NoPreferenceUserDTO(
123-
user.getUserId(), user.getUsername(), user.getName()));
125+
user.getUserId(), user.getUsername(), name));
124126
continue;
125127
}
126128

127129
// 如果用户没有填写期望部门,则加入未填写期望面试时间列表
128130
if (preferredDepartments.isEmpty()) {
129131
logger.info("用户 {} 没有填写期望部门,加入未填写期望面试时间列表", user.getUsername());
132+
// 从简历中获取姓名而不是从用户表中获取
133+
String name = getResumeName(resume);
130134
noPreferenceUsers.add(new InterviewAssignmentResultDTO.NoPreferenceUserDTO(
131-
user.getUserId(), user.getUsername(), user.getName()));
135+
user.getUserId(), user.getUsername(), name));
132136
continue;
133137
}
134138

135139
String firstDepartment = preferredDepartments.get(0);
136-
candidates.add(new CandidateInfo(user, preferredTimes, preferredDepartments, firstDepartment));
140+
candidates.add(new CandidateInfo(user, preferredTimes, preferredDepartments, firstDepartment, resume));
137141
}
138142

139143
// 按照偏好满足度排序候选人(偏好越多的候选人优先级越高)
@@ -152,20 +156,23 @@ private InterviewAssignmentResultDTO assignInterviewsWithOptimization(
152156

153157
for (CandidateInfo candidate : candidates) {
154158
User user = candidate.user;
159+
Resume resume = candidate.resume;
155160
List<String> preferredTimes = candidate.preferredTimes;
156161
String department = candidate.firstDepartment;
157162

158163
// 尝试分配面试时间
159164
boolean assigned = tryAssignInterviewTime(
160-
user, preferredTimes, department, departmentSlotAvailability, assignedInterviews);
165+
user, resume, preferredTimes, department, departmentSlotAvailability, assignedInterviews);
161166

162167
// 如果无法分配(所有时间段都满了),则加入未分配列表
163168
if (!assigned) {
164169
String preferredTimesStr = String.join(", ", preferredTimes);
165170
String preferredDepartmentsStr = String.join(", ", candidate.preferredDepartments);
166171
logger.info("用户 {} 未被分配,期望时间: {},期望部门: {}", user.getUsername(), preferredTimesStr, preferredDepartmentsStr);
172+
// 从简历中获取姓名而不是从用户表中获取
173+
String name = getResumeName(resume);
167174
unassignedUsers.add(new InterviewAssignmentResultDTO.UnassignedUserDTO(
168-
user.getUserId(), user.getUsername(), user.getName(), preferredTimesStr, preferredDepartmentsStr));
175+
user.getUserId(), user.getUsername(), name, preferredTimesStr, preferredDepartmentsStr));
169176
} else {
170177
logger.info("用户 {} 已成功分配面试时间", user.getUsername());
171178
}
@@ -176,6 +183,42 @@ private InterviewAssignmentResultDTO assignInterviewsWithOptimization(
176183
return new InterviewAssignmentResultDTO(assignedInterviews, unassignedUsers, noPreferenceUsers);
177184
}
178185

186+
/**
187+
* 从简历中获取姓名字段值
188+
* @param resume 简历对象
189+
* @return 姓名字段值,如果找不到则返回用户表中的姓名
190+
*/
191+
private String getResumeName(Resume resume) {
192+
// 获取简历中的所有字段值
193+
List<ResumeFieldValue> fieldValues = resumeService.getFieldValuesByResumeId(resume.getResumeId());
194+
195+
// 获取当前周期的字段定义
196+
List<ResumeFieldDefinition> fieldDefinitions = resumeFieldDefinitionService.getFieldDefinitionsByCycleId(resume.getCycleId());
197+
198+
// 查找姓名字段定义
199+
ResumeFieldDefinition nameFieldDefinition = fieldDefinitions.stream()
200+
.filter(field -> "姓名".equals(field.getFieldLabel()))
201+
.findFirst()
202+
.orElse(null);
203+
204+
// 如果找到了姓名字段定义,则查找对应的字段值
205+
if (nameFieldDefinition != null) {
206+
String name = fieldValues.stream()
207+
.filter(value -> nameFieldDefinition.getFieldId().equals(value.getFieldId()))
208+
.map(ResumeFieldValue::getFieldValue)
209+
.findFirst()
210+
.orElse(null);
211+
212+
if (name != null && !name.isEmpty()) {
213+
return name;
214+
}
215+
}
216+
217+
// 如果简历中没有姓名字段或为空,则使用用户表中的姓名
218+
User user = userService.getUserById(resume.getUserId());
219+
return user != null ? user.getName() : "";
220+
}
221+
179222
/**
180223
* 候选人信息类,用于存储分配过程中的相关信息
181224
*/
@@ -184,12 +227,14 @@ private static class CandidateInfo {
184227
private final List<String> preferredTimes;
185228
private final List<String> preferredDepartments;
186229
private final String firstDepartment;
230+
private final Resume resume; // 添加简历字段
187231

188-
public CandidateInfo(User user, List<String> preferredTimes, List<String> preferredDepartments, String firstDepartment) {
232+
public CandidateInfo(User user, List<String> preferredTimes, List<String> preferredDepartments, String firstDepartment, Resume resume) {
189233
this.user = user;
190234
this.preferredTimes = preferredTimes;
191235
this.preferredDepartments = preferredDepartments;
192236
this.firstDepartment = firstDepartment;
237+
this.resume = resume;
193238
}
194239
}
195240

@@ -378,7 +423,7 @@ private Map<String, Map<LocalDateTime, Boolean>> initializeDepartmentSlotAvailab
378423
/**
379424
* 尝试为用户分配面试时间
380425
*/
381-
private boolean tryAssignInterviewTime(User user, List<String> preferredTimes, String department,
426+
private boolean tryAssignInterviewTime(User user, Resume resume, List<String> preferredTimes, String department,
382427
Map<String, Map<LocalDateTime, Boolean>> departmentSlotAvailability,
383428
List<InterviewAssignmentResultDTO.AssignedInterviewDTO> assignedInterviews) {
384429
// 如果用户没有填写期望面试时间,则不分配面试时间
@@ -400,8 +445,10 @@ private boolean tryAssignInterviewTime(User user, List<String> preferredTimes, S
400445
// 成功分配时间
401446
String period = assignedSlot.getHour() < 12 ? "上午" : "下午";
402447
logger.info("成功为用户 {} 分配面试时间: {}", user.getUsername(), assignedSlot);
448+
// 从简历中获取姓名而不是从用户表中获取
449+
String name = getResumeName(resume);
403450
assignedInterviews.add(new InterviewAssignmentResultDTO.AssignedInterviewDTO(
404-
user.getUserId(), user.getUsername(), user.getName(), assignedSlot, period, department));
451+
user.getUserId(), user.getUsername(), name, assignedSlot, period, department));
405452
return true;
406453
}
407454
} else {

0 commit comments

Comments
 (0)