@@ -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