diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/controller/RecruitInterviewController.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/controller/RecruitInterviewController.java index e4c07ea..3e25daa 100644 --- a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/controller/RecruitInterviewController.java +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/controller/RecruitInterviewController.java @@ -18,10 +18,13 @@ import cn.zeroerr.common.utils.file.FileUtils; import cn.zeroerr.common.utils.file.MimeTypeUtils; import cn.zeroerr.common.utils.poi.ExcelUtil; import cn.zeroerr.domain.dto.ToppingDTO; +import cn.zeroerr.domain.entity.InterviewTag; import cn.zeroerr.domain.entity.PostPlanFollow; import cn.zeroerr.domain.entity.RecruitPost; import cn.zeroerr.domain.entity.ResumeFollowRecord; +import cn.zeroerr.domain.vo.InterViewTagVO; import cn.zeroerr.domain.vo.UserVO; +import cn.zeroerr.service.InterviewTagService; import cn.zeroerr.service.RecruitPostService; import cn.zeroerr.service.ResumeFollowRecordService; import cn.zeroerr.system.mapper.RecruitStructureMapper; @@ -45,8 +48,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; +import java.util.*; @RestController @RequestMapping("/recruit/process") @@ -70,6 +72,10 @@ public class RecruitInterviewController extends BaseController { @Autowired private ISysDictDataService iSysDictDataService; + @Autowired + private InterviewTagService interviewTagService; + + @PreAuthorize("@ss.hasAnyPermi('recruit:interview:list')") @GetMapping("/interview/getAllUser") @ApiOperation(value = "查询所有的用户(领导+hr)") @@ -110,8 +116,65 @@ public class RecruitInterviewController extends BaseController { } startPage(); //找出所有置顶后的排序数据 - List resumeFollowRecordListTopping = resumeFollowRecordService.listByQuery(req); - return getDataTable(resumeFollowRecordListTopping); + List resumeFollowRecordList = resumeFollowRecordService.listByQuery(req); + if(!CollectionUtils.isEmpty(resumeFollowRecordList)){ + //将每个tags,拿出来,分类 + resumeFollowRecordList.forEach( + record -> { + if(record.getTags() != null && !record.getTags().trim().isEmpty()){ + String tags = record.getTags(); + String[] tagGroups = tags.split(";"); + Map> groupedTags = new HashMap<>(); + // 将每个tags,拿出来,分类 + for (String tag : tagGroups) { + String[] tagArray = tag.split(","); + String key = tagArray[0]; // 第一个数字作为分组的键 + List tagsList = Arrays.asList(tagArray); + groupedTags.computeIfAbsent(key, k -> new ArrayList<>()).add(tag); + } + List pending=new ArrayList<>(); + List pass=new ArrayList<>(); + List fail=new ArrayList<>(); + + for (Map.Entry> entry : groupedTags.entrySet()) { + // 根据key进行分类 (1:待定 2:通过 3:未通过) + if(entry.getKey().equals("1")){ + //将每个string的以逗号分割,取出最后的元素 + for (String value : entry.getValue()) { + String[] elements = value.split(","); + String lastElement = elements[elements.length - 1]; + //根据这个元素,找到对应的名字 + InterviewTag tag = interviewTagService.getById(lastElement); + pending.add(tag.getTagName()); + } + }else if(entry.getKey().equals("2")){ + //将每个string的以逗号分割,取出最后的元素 + for (String value : entry.getValue()) { + String[] elements = value.split(","); + String lastElement = elements[elements.length - 1]; + //根据这个元素,找到对应的名字 + InterviewTag tag = interviewTagService.getById(lastElement); + pass.add(tag.getTagName()); + } + }else if(entry.getKey().equals("3")){ + //将每个string的以逗号分割,取出最后的元素 + for (String value : entry.getValue()) { + String[] elements = value.split(","); + String lastElement = elements[elements.length - 1]; + //根据这个元素,找到对应的名字 + InterviewTag tag = interviewTagService.getById(lastElement); + fail.add(tag.getTagName()); + } + } + } + record.setPending(pending); + record.setPass(pass); + record.setFail(fail); + } + } + ); + } + return getDataTable(resumeFollowRecordList); } @PreAuthorize("@ss.hasAnyPermi('recruit:interview:add')") @@ -258,6 +321,36 @@ public class RecruitInterviewController extends BaseController { } return nameList.toString(); } + + + @PreAuthorize("@ss.hasAnyPermi('recruit:interview:add')") + @GetMapping("/interview/tag") + @ApiOperation(value = "返回面试标签的树状列表") + public AjaxResult InterviewTag() { + List allTags = interviewTagService.list(); + List interViewTagVOList = buildTree(allTags, null); + return AjaxResult.success(interViewTagVOList); + } + + private List buildTree(List allTags, Long parentId) { + List result = new ArrayList<>(); + for (InterviewTag tag : allTags) { + if ((parentId == null && tag.getParentId() == null) || (parentId != null && parentId.equals(tag.getParentId()))) { + InterViewTagVO vo = new InterViewTagVO(); + vo.setValue(tag.getTagId()); + vo.setLabel(tag.getTagName()); + + List children = buildTree(allTags, tag.getTagId()); + if (!children.isEmpty()) { + vo.setChildren(children); + } + result.add(vo); + } + } + return result; + } + + } diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/entity/InterviewTag.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/entity/InterviewTag.java new file mode 100644 index 0000000..6167fbb --- /dev/null +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/entity/InterviewTag.java @@ -0,0 +1,37 @@ +package cn.zeroerr.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import lombok.Data; + +/** + * + * @TableName interview_tag + */ +@TableName(value ="interview_tag") +@Data +public class InterviewTag implements Serializable { + /** + * + */ + @TableId(value = "tag_id", type = IdType.AUTO) + private Long tagId; + + /** + * 父节点id + */ + @TableField(value = "parent_id") + private Long parentId; + + /** + * 标签名 + */ + @TableField(value = "tag_name") + private String tagName; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/entity/ResumeFollowRecord.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/entity/ResumeFollowRecord.java index 2f11cb5..84b578f 100644 --- a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/entity/ResumeFollowRecord.java +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/entity/ResumeFollowRecord.java @@ -7,6 +7,7 @@ import java.io.Serializable; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; +import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; @@ -291,6 +292,12 @@ public class ResumeFollowRecord implements Serializable { @TableField(value = "topping") private Boolean topping; + + /** + * 标签是否置顶 + */ + @TableField(value = "tags") + private String tags; /** * 置顶时间 */ @@ -299,6 +306,24 @@ public class ResumeFollowRecord implements Serializable { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime toppingTime; + /** + * 待定 + */ + @TableField(exist = false) + private List pending; + + + /** + * 通过 + */ + @TableField(exist = false) + private List pass; + + /** + * 未通过 + */ + @TableField(exist = false) + private List fail; @TableField(exist = false) private static final long serialVersionUID = 1L; diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/vo/InterViewTagVO.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/vo/InterViewTagVO.java new file mode 100644 index 0000000..951dd22 --- /dev/null +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/domain/vo/InterViewTagVO.java @@ -0,0 +1,21 @@ +package cn.zeroerr.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@ApiModel +@Data +public class InterViewTagVO { + @ApiModelProperty("标签值") + private Long value; + + @ApiModelProperty("标签名") + private String label; + + @ApiModelProperty("子节点") + private List children; + +} diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/mapper/InterviewTagMapper.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/mapper/InterviewTagMapper.java new file mode 100644 index 0000000..b8ef14d --- /dev/null +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/mapper/InterviewTagMapper.java @@ -0,0 +1,20 @@ +package cn.zeroerr.mapper; + +import cn.zeroerr.domain.entity.InterviewTag; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.springframework.stereotype.Repository; + +/** +* @author Ze-java +* @description 针对表【interview_tag】的数据库操作Mapper +* @createDate 2024-06-29 10:01:59 +* @Entity cn.zeroerr.domain.entity.InterviewTag +*/ +@Repository +public interface InterviewTagMapper extends BaseMapper { + +} + + + + diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/InterviewTagService.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/InterviewTagService.java new file mode 100644 index 0000000..0e91a00 --- /dev/null +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/InterviewTagService.java @@ -0,0 +1,13 @@ +package cn.zeroerr.service; + +import cn.zeroerr.domain.entity.InterviewTag; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author Ze-java +* @description 针对表【interview_tag】的数据库操作Service +* @createDate 2024-06-29 10:01:59 +*/ +public interface InterviewTagService extends IService { + +} diff --git a/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/impl/InterviewTagServiceImpl.java b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/impl/InterviewTagServiceImpl.java new file mode 100644 index 0000000..134fe08 --- /dev/null +++ b/zeroerr_oa-recruit/src/main/java/cn/zeroerr/service/impl/InterviewTagServiceImpl.java @@ -0,0 +1,22 @@ +package cn.zeroerr.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import cn.zeroerr.domain.entity.InterviewTag; +import cn.zeroerr.service.InterviewTagService; +import cn.zeroerr.mapper.InterviewTagMapper; +import org.springframework.stereotype.Service; + +/** +* @author Ze-java +* @description 针对表【interview_tag】的数据库操作Service实现 +* @createDate 2024-06-29 10:01:59 +*/ +@Service +public class InterviewTagServiceImpl extends ServiceImpl + implements InterviewTagService{ + +} + + + + diff --git a/zeroerr_oa-recruit/src/main/resources/mapper/EntryManageMapper.xml b/zeroerr_oa-recruit/src/main/resources/mapper/EntryManageMapper.xml index 747a930..a4ef935 100644 --- a/zeroerr_oa-recruit/src/main/resources/mapper/EntryManageMapper.xml +++ b/zeroerr_oa-recruit/src/main/resources/mapper/EntryManageMapper.xml @@ -44,6 +44,6 @@ and entry_id = #{req.entryId} and hr_id = #{req.hrId} and is_entry = #{req.isEntry} - order by final_pass_date desc + order by join_date desc diff --git a/zeroerr_oa-recruit/src/main/resources/mapper/InterviewTagMapper.xml b/zeroerr_oa-recruit/src/main/resources/mapper/InterviewTagMapper.xml new file mode 100644 index 0000000..00d8d9d --- /dev/null +++ b/zeroerr_oa-recruit/src/main/resources/mapper/InterviewTagMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + tag_id,parent_id,tag_name + + diff --git a/zeroerr_oa-recruit/src/main/resources/mapper/ResumeFollowRecordMapper.xml b/zeroerr_oa-recruit/src/main/resources/mapper/ResumeFollowRecordMapper.xml index 63ec3a5..8331975 100644 --- a/zeroerr_oa-recruit/src/main/resources/mapper/ResumeFollowRecordMapper.xml +++ b/zeroerr_oa-recruit/src/main/resources/mapper/ResumeFollowRecordMapper.xml @@ -40,6 +40,7 @@ + @@ -57,7 +58,7 @@ second_reach,second_interviewer_ids,second_pass, final_date,final_reach,final_interviewer_ids, final_pass,accept_offer,join_date,create_date,update_date,actual_join_date, - fail_reason,special_reason,file,topping,topping_time + fail_reason,special_reason,file,topping,topping_time,tags