Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
2026-02-03 21:41:55 +08:00
53 changed files with 3638 additions and 2 deletions

View File

@@ -0,0 +1,70 @@
package com.vetti.hotake.domain;
import com.vetti.common.annotation.Excel;
import com.vetti.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 用户无障碍设置对象 hotake_accessibility
*
* @author vetti
* @date 2026-02-01
*/
@Data
@Accessors(chain = true)
public class HotakeAccessibility extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键ID */
@ApiModelProperty("主键ID")
private Integer id;
/** 颜色模式: light(明亮), dark(暗黑), system(系统) */
@ApiModelProperty("颜色模式: light(明亮), dark(暗黑), system(系统)")
@Excel(name = "颜色模式")
private String colorMode;
/** 高对比度模式: 0-关闭, 1-开启 */
@ApiModelProperty("高对比度模式: 0-关闭, 1-开启")
@Excel(name = "高对比度模式")
private Integer highContrastMode;
/** 减少动画: 0-关闭, 1-开启 */
@ApiModelProperty("减少动画: 0-关闭, 1-开启")
@Excel(name = "减少动画")
private Integer reduceMotion;
/** 字体大小: small(小), medium(中), large(大), extra_large(特大) */
@ApiModelProperty("字体大小: small(小), medium(中), large(大), extra_large(特大)")
@Excel(name = "字体大小")
private String fontSize;
/** 屏幕阅读器支持: 0-关闭, 1-开启 */
@ApiModelProperty("屏幕阅读器支持: 0-关闭, 1-开启")
@Excel(name = "屏幕阅读器支持")
private Integer screenReaderSupport;
/** 音频描述: 0-关闭, 1-开启 */
@ApiModelProperty("音频描述: 0-关闭, 1-开启")
@Excel(name = "音频描述")
private Integer audioDescriptions;
/** 增强键盘导航: 0-关闭, 1-开启 */
@ApiModelProperty("增强键盘导航: 0-关闭, 1-开启")
@Excel(name = "增强键盘导航")
private Integer enhancedKeyboardNavigation;
/** 焦点指示器: 0-关闭, 1-开启 */
@ApiModelProperty("焦点指示器: 0-关闭, 1-开启")
@Excel(name = "焦点指示器")
private Integer focusIndicators;
/** 语言设置: en(英语), zh(中文)等 */
@ApiModelProperty("语言设置: en(英语), zh(中文)等")
@Excel(name = "语言设置")
private String language;
}

View File

@@ -0,0 +1,65 @@
package com.vetti.hotake.domain;
import com.vetti.common.annotation.Excel;
import com.vetti.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 用户通知偏好设置对象 hotake_notification_preferences
*
* @author vetti
* @date 2026-02-01
*/
@Data
@Accessors(chain = true)
public class HotakeNotificationPreferences extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键ID */
@ApiModelProperty("主键ID")
private Long id;
/** 职位提醒:新职位机会通知 (0-关闭, 1-开启) */
@ApiModelProperty("职位提醒:新职位机会通知 (0-关闭, 1-开启)")
@Excel(name = "职位提醒")
private Integer emailJobAlerts;
/** 申请更新:职位申请状态更新 (0-关闭, 1-开启) */
@ApiModelProperty("申请更新:职位申请状态更新 (0-关闭, 1-开启)")
@Excel(name = "申请更新")
private Integer emailApplicationUpdates;
/** AI匹配建议基于个人资料的强匹配职位推荐 (0-关闭, 1-开启) */
@ApiModelProperty("AI匹配建议基于个人资料的强匹配职位推荐 (0-关闭, 1-开启)")
@Excel(name = "AI匹配建议")
private Integer emailAiMatchSuggestions;
/** 新闻简报:每周职业技巧和行业新闻 (0-关闭, 1-开启) */
@ApiModelProperty("新闻简报:每周职业技巧和行业新闻 (0-关闭, 1-开启)")
@Excel(name = "新闻简报")
private Integer emailNewsletter;
/** 新消息:收到新消息时通知 (0-关闭, 1-开启) */
@ApiModelProperty("新消息:收到新消息时通知 (0-关闭, 1-开启)")
@Excel(name = "新消息")
private Integer pushNewMessages;
/** 面试提醒:即将到来的面试提醒 (0-关闭, 1-开启) */
@ApiModelProperty("面试提醒:即将到来的面试提醒 (0-关闭, 1-开启)")
@Excel(name = "面试提醒")
private Integer pushInterviewReminders;
/** 营销邮件:促销内容和特别优惠 (0-关闭, 1-开启) */
@ApiModelProperty("营销邮件:促销内容和特别优惠 (0-关闭, 1-开启)")
@Excel(name = "营销邮件")
private Integer mailMarketingEmails;
/** 合作伙伴优惠:来自可信合作伙伴的机会 (0-关闭, 1-开启) */
@ApiModelProperty("合作伙伴优惠:来自可信合作伙伴的机会 (0-关闭, 1-开启)")
@Excel(name = "合作伙伴优惠")
private Integer mailPartnerOffers;
}

View File

@@ -0,0 +1,55 @@
package com.vetti.hotake.domain;
import com.vetti.common.annotation.Excel;
import com.vetti.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 参考检查对象 hotake_reference_check
*
* @author vetti
* @date 2026-01-29
*/
@Data
@Accessors(chain = true)
public class HotakeReferenceCheck extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键ID */
@ApiModelProperty("主键ID")
private Integer id;
/** 公司名称 */
@ApiModelProperty("公司名称")
@Excel(name = "公司名称")
private String company;
/** 推荐人全名 */
@ApiModelProperty("推荐人全名")
@Excel(name = "推荐人全名")
private String fullName;
/** 推荐人职位 */
@ApiModelProperty("推荐人职位")
@Excel(name = "推荐人职位")
private String position;
/** 与候选人的关系 */
@ApiModelProperty("与候选人的关系")
@Excel(name = "与候选人的关系")
private String relationship;
/** 推荐人邮箱 */
@ApiModelProperty("推荐人邮箱")
@Excel(name = "推荐人邮箱")
private String email;
/** 是否为该工作经历保存此推荐人 */
@ApiModelProperty("是否为该工作经历保存此推荐人")
@Excel(name = "是否为该工作经历保存此推荐人")
private Boolean saveJobExperience;
}

View File

@@ -0,0 +1,55 @@
package com.vetti.hotake.domain;
import com.vetti.common.annotation.Excel;
import com.vetti.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
/**
* 用户首选工作设置对象 hotake_settings_job
*
* @author wangxiangshun
* @date 2025-11-02
*/
@Data
@Accessors(chain = true)
public class HotakeSettingsJob extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键ID */
@ApiModelProperty("主键ID")
private Long id;
/** 过滤器名称 */
@ApiModelProperty("过滤器名称")
@Excel(name = "过滤器名称")
private String name;
/** 地点 */
@ApiModelProperty("地点")
@Excel(name = "地点")
private String location;
/** 纬度 */
@ApiModelProperty("纬度")
private BigDecimal latitude;
/** 经度 */
@ApiModelProperty("经度")
private BigDecimal longitude;
/** 薪资范围(如"80K" */
@ApiModelProperty("薪资范围")
@Excel(name = "薪资范围")
private String salary;
/** 标签数组({"dict_type":["dict_value","dict_value"]} */
@ApiModelProperty("标签数组")
private String tagsJson;
}

View File

@@ -0,0 +1,53 @@
package com.vetti.hotake.domain;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 社交登录日志对象 hotake_social_login_log
*
* @author vetti
*/
@Data
public class HotakeSocialLoginLog implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键ID")
private Long id;
@ApiModelProperty("系统用户ID")
private Long userId;
@ApiModelProperty("第三方平台类型")
private String provider;
@ApiModelProperty("第三方平台用户ID")
private String providerUserId;
@ApiModelProperty("登录类型login/register/bind")
private String loginType;
@ApiModelProperty("登录IP")
private String loginIp;
@ApiModelProperty("登录地点")
private String loginLocation;
@ApiModelProperty("浏览器类型")
private String browser;
@ApiModelProperty("操作系统")
private String os;
@ApiModelProperty("登录状态0成功 1失败")
private String status;
@ApiModelProperty("提示消息")
private String msg;
@ApiModelProperty("登录时间")
private Date loginTime;
}

View File

@@ -0,0 +1,52 @@
package com.vetti.hotake.domain;
import com.vetti.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 用户社交账号绑定对象 hotake_social_user
*
* @author vetti
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class HotakeSocialUser extends BaseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键ID")
private Long id;
@ApiModelProperty("系统用户ID")
private Long userId;
@ApiModelProperty("第三方平台类型google/microsoft/linkedin")
private String provider;
@ApiModelProperty("第三方平台用户唯一标识")
private String providerUserId;
@ApiModelProperty("第三方平台邮箱")
private String email;
@ApiModelProperty("第三方平台用户名")
private String name;
@ApiModelProperty("第三方平台头像URL")
private String avatar;
@ApiModelProperty("访问令牌")
private String accessToken;
@ApiModelProperty("刷新令牌")
private String refreshToken;
@ApiModelProperty("令牌过期时间")
private Date tokenExpireTime;
@ApiModelProperty("第三方平台原始用户信息JSON")
private String rawUserInfo;
}

View File

@@ -48,4 +48,7 @@ public class HotakeRolesInfoDto extends HotakeRolesInfo {
@ApiModelProperty("招聘人详细信息")
private SysUser recruiterUser;
@ApiModelProperty("当前用户是否已申请该岗位")
private Boolean hasApplied;
}

View File

@@ -0,0 +1,98 @@
package com.vetti.hotake.domain.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* 用户首选工作设置字典对照DTO
*
* @author wangxiangshun
* @date 2025-11-02
*/
@Data
public class HotakeSettingsJobDictDto
{
@ApiModelProperty("语言类型")
private List<DictItem> hotakeLanguagesType;
@ApiModelProperty("技能工具类型")
private List<DictItem> hotakeSkillsToolType;
@ApiModelProperty("岗位级别")
private List<DictItem> roleLevel;
@ApiModelProperty("岗位地点类型")
private List<DictItem> roleLocationType;
@ApiModelProperty("岗位选择工作类型")
private List<DictItem> roleSelectJobType;
@ApiModelProperty("岗位类型")
private List<DictItem> roleType;
@ApiModelProperty("所需技能")
private List<DictItem> roleRequiredSkills;
@ApiModelProperty("拥有的好技能")
private List<DictItem> roleNiceToHaveSkills;
@ApiModelProperty("教育要求类型")
private List<DictItem> roleEducationRequirementsType;
@ApiModelProperty("岗位所需证书")
private List<DictItem> roleCertificationLicenses;
@ApiModelProperty("岗位福利")
private List<DictItem> roleBenefits;
@ApiModelProperty("发布渠道")
private List<DictItem> rolePublishingChannels;
@ApiModelProperty("初步筛选问题类型")
private List<DictItem> roleInitialScreeningQuestionsType;
@ApiModelProperty("预期薪酬范围")
private List<DictItem> expectedPayRange;
@ApiModelProperty("愿意经常出差")
private List<DictItem> willingnessToTravel;
@Data
public static class DictItem
{
@ApiModelProperty("字典编码")
private Long dictCode;
@ApiModelProperty("字典标签")
private String dictLabel;
@ApiModelProperty("字典键值")
private String dictValue;
@ApiModelProperty("字典类型")
private String dictType;
@ApiModelProperty("样式属性")
private String cssClass;
@ApiModelProperty("表格字典样式")
private String listClass;
@ApiModelProperty("是否默认")
private String isDefault;
@ApiModelProperty("状态")
private String status;
@ApiModelProperty("数据类型")
private String dataType;
@ApiModelProperty("附件地址")
private String fileUrl;
@ApiModelProperty("头像地址")
private String avatarUrl;
}
}

View File

@@ -0,0 +1,30 @@
package com.vetti.hotake.domain.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 社交登录请求DTO
*
* @author vetti
*/
@Data
public class HotakeSocialLoginRequestDto {
@NotBlank(message = "平台类型不能为空")
@ApiModelProperty(value = "第三方平台类型google/microsoft/linkedin", required = true)
private String provider;
@NotBlank(message = "授权码不能为空")
@ApiModelProperty(value = "OAuth授权码", required = true)
private String code;
@NotBlank(message = "用户类型不能为空")
@ApiModelProperty(value = "用户类型(interviewer:面试官,candidate:候选者)", required = true)
private String sysUserType;
@ApiModelProperty("state参数用于防止CSRF攻击")
private String state;
}

View File

@@ -0,0 +1,38 @@
package com.vetti.hotake.domain.dto;
import com.vetti.common.core.domain.entity.SysUser;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 社交登录返回结果DTO
*
* @author vetti
*/
@Data
public class HotakeSocialLoginResultDto {
@ApiModelProperty("令牌")
private String token;
@ApiModelProperty("用户ID")
private Long userId;
@ApiModelProperty("用户类型(interviewer:面试官,candidate:候选者)")
private String sysUserType;
@ApiModelProperty("是否新注册用户(true:新注册,false:已存在用户登录)")
private Boolean isNewUser;
@ApiModelProperty("第三方平台类型")
private String provider;
@ApiModelProperty("用户信息对象")
private SysUser user;
@ApiModelProperty("是否已创建简历(仅候选者有此字段)")
private Boolean hasCv;
@ApiModelProperty("简历数量(仅候选者有此字段)")
private Integer cvCount;
}

View File

@@ -0,0 +1,40 @@
package com.vetti.hotake.domain.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 第三方平台用户信息DTO统一格式
*
* @author vetti
*/
@Data
public class HotakeSocialUserInfoDto {
@ApiModelProperty("第三方平台类型")
private String provider;
@ApiModelProperty("第三方平台用户唯一标识")
private String providerUserId;
@ApiModelProperty("邮箱")
private String email;
@ApiModelProperty("用户名/昵称")
private String name;
@ApiModelProperty("头像URL")
private String avatar;
@ApiModelProperty("访问令牌")
private String accessToken;
@ApiModelProperty("刷新令牌")
private String refreshToken;
@ApiModelProperty("令牌有效期(秒)")
private Long expiresIn;
@ApiModelProperty("原始用户信息JSON")
private String rawUserInfo;
}

View File

@@ -22,6 +22,9 @@ public class VcExperienceDto {
@ApiModelProperty("公司")
private String company;
@ApiModelProperty("职位")
private String jobPosition;
@ApiModelProperty("地点")
private String location;

View File

@@ -0,0 +1,61 @@
package com.vetti.hotake.mapper;
import java.util.List;
import com.vetti.hotake.domain.HotakeAccessibility;
/**
* 用户无障碍设置Mapper接口
*
* @author vetti
* @date 2026-02-01
*/
public interface HotakeAccessibilityMapper
{
/**
* 查询用户无障碍设置
*
* @param id 用户无障碍设置主键
* @return 用户无障碍设置
*/
public HotakeAccessibility selectHotakeAccessibilityById(Integer id);
/**
* 查询用户无障碍设置列表
*
* @param hotakeAccessibility 用户无障碍设置
* @return 用户无障碍设置集合
*/
public List<HotakeAccessibility> selectHotakeAccessibilityList(HotakeAccessibility hotakeAccessibility);
/**
* 新增用户无障碍设置
*
* @param hotakeAccessibility 用户无障碍设置
* @return 结果
*/
public int insertHotakeAccessibility(HotakeAccessibility hotakeAccessibility);
/**
* 修改用户无障碍设置
*
* @param hotakeAccessibility 用户无障碍设置
* @return 结果
*/
public int updateHotakeAccessibility(HotakeAccessibility hotakeAccessibility);
/**
* 删除用户无障碍设置
*
* @param id 用户无障碍设置主键
* @return 结果
*/
public int deleteHotakeAccessibilityById(Integer id);
/**
* 批量删除用户无障碍设置
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteHotakeAccessibilityByIds(Integer[] ids);
}

View File

@@ -0,0 +1,61 @@
package com.vetti.hotake.mapper;
import java.util.List;
import com.vetti.hotake.domain.HotakeNotificationPreferences;
/**
* 用户通知偏好设置Mapper接口
*
* @author vetti
* @date 2026-02-01
*/
public interface HotakeNotificationPreferencesMapper
{
/**
* 查询用户通知偏好设置
*
* @param id 用户通知偏好设置主键
* @return 用户通知偏好设置
*/
public HotakeNotificationPreferences selectHotakeNotificationPreferencesById(Long id);
/**
* 查询用户通知偏好设置列表
*
* @param hotakeNotificationPreferences 用户通知偏好设置
* @return 用户通知偏好设置集合
*/
public List<HotakeNotificationPreferences> selectHotakeNotificationPreferencesList(HotakeNotificationPreferences hotakeNotificationPreferences);
/**
* 新增用户通知偏好设置
*
* @param hotakeNotificationPreferences 用户通知偏好设置
* @return 结果
*/
public int insertHotakeNotificationPreferences(HotakeNotificationPreferences hotakeNotificationPreferences);
/**
* 修改用户通知偏好设置
*
* @param hotakeNotificationPreferences 用户通知偏好设置
* @return 结果
*/
public int updateHotakeNotificationPreferences(HotakeNotificationPreferences hotakeNotificationPreferences);
/**
* 删除用户通知偏好设置
*
* @param id 用户通知偏好设置主键
* @return 结果
*/
public int deleteHotakeNotificationPreferencesById(Long id);
/**
* 批量删除用户通知偏好设置
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteHotakeNotificationPreferencesByIds(Long[] ids);
}

View File

@@ -0,0 +1,61 @@
package com.vetti.hotake.mapper;
import java.util.List;
import com.vetti.hotake.domain.HotakeReferenceCheck;
/**
* 参考检查Mapper接口
*
* @author sxc
* @date 2026-01-29
*/
public interface HotakeReferenceCheckMapper
{
/**
* 查询参考检查
*
* @param id 参考检查主键
* @return 参考检查
*/
public HotakeReferenceCheck selectHotakeReferenceCheckById(Integer id);
/**
* 查询参考检查列表
*
* @param hotakeReferenceCheck 参考检查
* @return 参考检查集合
*/
public List<HotakeReferenceCheck> selectHotakeReferenceCheckList(HotakeReferenceCheck hotakeReferenceCheck);
/**
* 新增参考检查
*
* @param hotakeReferenceCheck 参考检查
* @return 结果
*/
public int insertHotakeReferenceCheck(HotakeReferenceCheck hotakeReferenceCheck);
/**
* 修改参考检查
*
* @param hotakeReferenceCheck 参考检查
* @return 结果
*/
public int updateHotakeReferenceCheck(HotakeReferenceCheck hotakeReferenceCheck);
/**
* 删除参考检查
*
* @param id 参考检查主键
* @return 结果
*/
public int deleteHotakeReferenceCheckById(Integer id);
/**
* 批量删除参考检查
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteHotakeReferenceCheckByIds(Integer[] ids);
}

View File

@@ -2,6 +2,7 @@ package com.vetti.hotake.mapper;
import java.util.List;
import com.vetti.hotake.domain.HotakeRolesApplyInfo;
import org.apache.ibatis.annotations.Param;
/**
* 候选人岗位申请信息Mapper接口
@@ -90,4 +91,13 @@ public interface HotakeRolesApplyInfoMapper
*/
public int batchInsertHotakeRolesApplyInfo(List<HotakeRolesApplyInfo> hotakeRolesApplyInfoList);
/**
* 根据候选人ID和岗位ID查询申请信息
*
* @param candidateId 候选人ID
* @param roleId 岗位ID
* @return 候选人岗位申请信息
*/
public HotakeRolesApplyInfo selectByCandidateIdAndRoleId(@Param("candidateId") Long candidateId, @Param("roleId") Long roleId);
}

View File

@@ -0,0 +1,61 @@
package com.vetti.hotake.mapper;
import java.util.List;
import com.vetti.hotake.domain.HotakeSettingsJob;
/**
* 用户首选工作设置Mapper接口
*
* @author sxc
* @date 2025-11-02
*/
public interface HotakeSettingsJobMapper
{
/**
* 查询用户首选工作设置
*
* @param id 用户首选工作设置主键
* @return 用户首选工作设置
*/
public HotakeSettingsJob selectHotakeSettingsJobById(Long id);
/**
* 查询用户首选工作设置列表
*
* @param hotakeSettingsJob 用户首选工作设置
* @return 用户首选工作设置集合
*/
public List<HotakeSettingsJob> selectHotakeSettingsJobList(HotakeSettingsJob hotakeSettingsJob);
/**
* 新增用户首选工作设置
*
* @param hotakeSettingsJob 用户首选工作设置
* @return 结果
*/
public int insertHotakeSettingsJob(HotakeSettingsJob hotakeSettingsJob);
/**
* 修改用户首选工作设置
*
* @param hotakeSettingsJob 用户首选工作设置
* @return 结果
*/
public int updateHotakeSettingsJob(HotakeSettingsJob hotakeSettingsJob);
/**
* 删除用户首选工作设置
*
* @param id 用户首选工作设置主键
* @return 结果
*/
public int deleteHotakeSettingsJobById(Long id);
/**
* 批量删除用户首选工作设置
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteHotakeSettingsJobByIds(Long[] ids);
}

View File

@@ -0,0 +1,16 @@
package com.vetti.hotake.mapper;
import com.vetti.hotake.domain.HotakeSocialLoginLog;
/**
* 社交登录日志Mapper接口
*
* @author vetti
*/
public interface HotakeSocialLoginLogMapper {
/**
* 新增社交登录日志
*/
int insert(HotakeSocialLoginLog log);
}

View File

@@ -0,0 +1,45 @@
package com.vetti.hotake.mapper;
import com.vetti.hotake.domain.HotakeSocialUser;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 用户社交账号绑定Mapper接口
*
* @author vetti
*/
public interface HotakeSocialUserMapper {
/**
* 根据provider和providerUserId查询社交用户
*/
HotakeSocialUser selectByProviderAndProviderUserId(@Param("provider") String provider,
@Param("providerUserId") String providerUserId);
/**
* 根据用户ID和provider查询社交绑定
*/
HotakeSocialUser selectByUserIdAndProvider(@Param("userId") Long userId, @Param("provider") String provider);
/**
* 根据用户ID查询所有社交绑定
*/
List<HotakeSocialUser> selectByUserId(@Param("userId") Long userId);
/**
* 新增社交用户绑定
*/
int insert(HotakeSocialUser socialUser);
/**
* 更新社交用户绑定
*/
int update(HotakeSocialUser socialUser);
/**
* 删除社交用户绑定(逻辑删除)
*/
int deleteById(@Param("id") Long id);
}

View File

@@ -0,0 +1,70 @@
package com.vetti.hotake.service;
import java.util.List;
import com.vetti.hotake.domain.HotakeAccessibility;
/**
* 用户无障碍设置Service接口
*
* @author vetti
* @date 2026-02-01
*/
public interface IHotakeAccessibilityService
{
/**
* 查询用户无障碍设置
*
* @param id 用户无障碍设置主键
* @return 用户无障碍设置
*/
public HotakeAccessibility selectHotakeAccessibilityById(Integer id);
/**
* 查询用户无障碍设置列表
*
* @param hotakeAccessibility 用户无障碍设置
* @return 用户无障碍设置集合
*/
public List<HotakeAccessibility> selectHotakeAccessibilityList(HotakeAccessibility hotakeAccessibility);
/**
* 新增用户无障碍设置
*
* @param hotakeAccessibility 用户无障碍设置
* @return 结果
*/
public HotakeAccessibility insertHotakeAccessibility(HotakeAccessibility hotakeAccessibility);
/**
* 修改用户无障碍设置
*
* @param hotakeAccessibility 用户无障碍设置
* @return 结果
*/
public HotakeAccessibility updateHotakeAccessibility(HotakeAccessibility hotakeAccessibility);
/**
* 批量删除用户无障碍设置
*
* @param ids 需要删除的用户无障碍设置主键集合
* @return 结果
*/
public int deleteHotakeAccessibilityByIds(Integer[] ids);
/**
* 删除用户无障碍设置信息
*
* @param id 用户无障碍设置主键
* @return 结果
*/
public int deleteHotakeAccessibilityById(Integer id);
/**
* 获取当前登录用户的无障碍设置
* 如果不存在则自动创建默认设置
*
* @param username 用户名
* @return 用户无障碍设置
*/
public HotakeAccessibility getCurrentUserAccessibility(String username);
}

View File

@@ -0,0 +1,70 @@
package com.vetti.hotake.service;
import java.util.List;
import com.vetti.hotake.domain.HotakeNotificationPreferences;
/**
* 用户通知偏好设置Service接口
*
* @author vetti
* @date 2026-02-01
*/
public interface IHotakeNotificationPreferencesService
{
/**
* 查询用户通知偏好设置
*
* @param id 用户通知偏好设置主键
* @return 用户通知偏好设置
*/
public HotakeNotificationPreferences selectHotakeNotificationPreferencesById(Long id);
/**
* 查询用户通知偏好设置列表
*
* @param hotakeNotificationPreferences 用户通知偏好设置
* @return 用户通知偏好设置集合
*/
public List<HotakeNotificationPreferences> selectHotakeNotificationPreferencesList(HotakeNotificationPreferences hotakeNotificationPreferences);
/**
* 新增用户通知偏好设置
*
* @param hotakeNotificationPreferences 用户通知偏好设置
* @return 结果
*/
public HotakeNotificationPreferences insertHotakeNotificationPreferences(HotakeNotificationPreferences hotakeNotificationPreferences);
/**
* 修改用户通知偏好设置
*
* @param hotakeNotificationPreferences 用户通知偏好设置
* @return 结果
*/
public HotakeNotificationPreferences updateHotakeNotificationPreferences(HotakeNotificationPreferences hotakeNotificationPreferences);
/**
* 批量删除用户通知偏好设置
*
* @param ids 需要删除的用户通知偏好设置主键集合
* @return 结果
*/
public int deleteHotakeNotificationPreferencesByIds(Long[] ids);
/**
* 删除用户通知偏好设置信息
*
* @param id 用户通知偏好设置主键
* @return 结果
*/
public int deleteHotakeNotificationPreferencesById(Long id);
/**
* 获取当前登录用户的通知偏好设置
* 如果不存在则自动创建默认设置
*
* @param username 用户名
* @return 用户通知偏好设置
*/
public HotakeNotificationPreferences getCurrentUserPreferences(String username);
}

View File

@@ -0,0 +1,68 @@
package com.vetti.hotake.service;
import java.util.List;
import com.vetti.hotake.domain.HotakeReferenceCheck;
/**
* 参考检查Service接口
*
* @author vetti
* @date 2026-01-29
*/
public interface IHotakeReferenceCheckService
{
/**
* 查询参考检查
*
* @param id 参考检查主键
* @return 参考检查
*/
public HotakeReferenceCheck selectHotakeReferenceCheckById(Integer id);
/**
* 查询参考检查列表
*
* @param hotakeReferenceCheck 参考检查
* @return 参考检查集合
*/
public List<HotakeReferenceCheck> selectHotakeReferenceCheckList(HotakeReferenceCheck hotakeReferenceCheck);
/**
* 新增参考检查
*
* @param hotakeReferenceCheck 参考检查
* @return 结果
*/
public HotakeReferenceCheck insertHotakeReferenceCheck(HotakeReferenceCheck hotakeReferenceCheck);
/**
* 修改参考检查
*
* @param hotakeReferenceCheck 参考检查
* @return 结果
*/
public HotakeReferenceCheck updateHotakeReferenceCheck(HotakeReferenceCheck hotakeReferenceCheck);
/**
* 批量删除参考检查
*
* @param ids 需要删除的参考检查主键集合
* @return 结果
*/
public int deleteHotakeReferenceCheckByIds(Integer[] ids);
/**
* 删除参考检查信息
*
* @param id 参考检查主键
* @return 结果
*/
public int deleteHotakeReferenceCheckById(Integer id);
/**
* 获取当前登录人的工作经验列表
*
* @return 工作经验列表
*/
public List<com.vetti.hotake.domain.dto.VcDto.VcExperienceDto> getCurrentUserExperienceList();
}

View File

@@ -0,0 +1,69 @@
package com.vetti.hotake.service;
import java.util.List;
import com.vetti.hotake.domain.HotakeSettingsJob;
import com.vetti.hotake.domain.dto.HotakeSettingsJobDictDto;
/**
* 用户首选工作设置Service接口
*
* @author wangxiangshun
* @date 2025-11-02
*/
public interface IHotakeSettingsJobService
{
/**
* 查询用户首选工作设置
*
* @param id 用户首选工作设置主键
* @return 用户首选工作设置
*/
public HotakeSettingsJob selectHotakeSettingsJobById(Long id);
/**
* 查询用户首选工作设置列表
*
* @param hotakeSettingsJob 用户首选工作设置
* @return 用户首选工作设置集合
*/
public List<HotakeSettingsJob> selectHotakeSettingsJobList(HotakeSettingsJob hotakeSettingsJob);
/**
* 新增用户首选工作设置
*
* @param hotakeSettingsJob 用户首选工作设置
* @return 结果
*/
public HotakeSettingsJob insertHotakeSettingsJob(HotakeSettingsJob hotakeSettingsJob);
/**
* 修改用户首选工作设置
*
* @param hotakeSettingsJob 用户首选工作设置
* @return 结果
*/
public HotakeSettingsJob updateHotakeSettingsJob(HotakeSettingsJob hotakeSettingsJob);
/**
* 批量删除用户首选工作设置
*
* @param ids 需要删除的用户首选工作设置主键集合
* @return 结果
*/
public int deleteHotakeSettingsJobByIds(Long[] ids);
/**
* 删除用户首选工作设置信息
*
* @param id 用户首选工作设置主键
* @return 结果
*/
public int deleteHotakeSettingsJobById(Long id);
/**
* 获取用户首选工作设置字典对照内容
*
* @return 字典对照内容
*/
public HotakeSettingsJobDictDto getDictData();
}

View File

@@ -0,0 +1,49 @@
package com.vetti.hotake.service;
import com.vetti.common.core.domain.entity.SysUser;
import com.vetti.hotake.domain.HotakeSocialUser;
import com.vetti.hotake.domain.dto.HotakeSocialLoginRequestDto;
import com.vetti.hotake.domain.dto.HotakeSocialLoginResultDto;
import java.util.List;
/**
* 社交用户服务接口
*
* @author vetti
*/
public interface IHotakeSocialUserService {
/**
* 社交登录(登录或自动注册)
*
* @param requestDto 社交登录请求
* @return 登录结果
*/
HotakeSocialLoginResultDto socialLogin(HotakeSocialLoginRequestDto requestDto);
/**
* 获取OAuth授权URL
*
* @param provider 平台类型
* @param state state参数
* @return 授权URL
*/
String getAuthorizationUrl(String provider, String state);
/**
* 根据用户ID查询绑定的社交账号
*
* @param userId 用户ID
* @return 社交账号列表
*/
List<HotakeSocialUser> listByUserId(Long userId);
/**
* 解绑社交账号
*
* @param userId 用户ID
* @param provider 平台类型
*/
void unbind(Long userId, String provider);
}

View File

@@ -0,0 +1,138 @@
package com.vetti.hotake.service.impl;
import com.vetti.common.core.service.BaseServiceImpl;
import com.vetti.common.enums.FillTypeEnum;
import com.vetti.hotake.domain.HotakeAccessibility;
import com.vetti.hotake.mapper.HotakeAccessibilityMapper;
import com.vetti.hotake.service.IHotakeAccessibilityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 用户无障碍设置Service业务层处理
*
* @author vetti
* @date 2026-02-01
*/
@Service
public class HotakeAccessibilityServiceImpl extends BaseServiceImpl implements IHotakeAccessibilityService {
@Autowired
private HotakeAccessibilityMapper hotakeAccessibilityMapper;
/**
* 查询用户无障碍设置
*
* @param id 用户无障碍设置主键
* @return 用户无障碍设置
*/
@Transactional(readOnly = true)
@Override
public HotakeAccessibility selectHotakeAccessibilityById(Integer id) {
return hotakeAccessibilityMapper.selectHotakeAccessibilityById(id);
}
/**
* 查询用户无障碍设置列表
*
* @param hotakeAccessibility 用户无障碍设置
* @return 用户无障碍设置
*/
@Transactional(readOnly = true)
@Override
public List<HotakeAccessibility> selectHotakeAccessibilityList(HotakeAccessibility hotakeAccessibility) {
return hotakeAccessibilityMapper.selectHotakeAccessibilityList(hotakeAccessibility);
}
/**
* 新增用户无障碍设置
*
* @param hotakeAccessibility 用户无障碍设置
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public HotakeAccessibility insertHotakeAccessibility(HotakeAccessibility hotakeAccessibility) {
fill(FillTypeEnum.INSERT.getCode(), hotakeAccessibility);
hotakeAccessibilityMapper.insertHotakeAccessibility(hotakeAccessibility);
return hotakeAccessibility;
}
/**
* 修改用户无障碍设置
*
* @param hotakeAccessibility 用户无障碍设置
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public HotakeAccessibility updateHotakeAccessibility(HotakeAccessibility hotakeAccessibility) {
fill(FillTypeEnum.UPDATE.getCode(), hotakeAccessibility);
hotakeAccessibilityMapper.updateHotakeAccessibility(hotakeAccessibility);
return hotakeAccessibility;
}
/**
* 批量删除用户无障碍设置
*
* @param ids 需要删除的用户无障碍设置主键
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int deleteHotakeAccessibilityByIds(Integer[] ids) {
return hotakeAccessibilityMapper.deleteHotakeAccessibilityByIds(ids);
}
/**
* 删除用户无障碍设置信息
*
* @param id 用户无障碍设置主键
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int deleteHotakeAccessibilityById(Integer id) {
return hotakeAccessibilityMapper.deleteHotakeAccessibilityById(id);
}
/**
* 获取当前登录用户的无障碍设置
* 如果不存在则自动创建默认设置
*
* @param username 用户名
* @return 用户无障碍设置
*/
@Transactional(rollbackFor = Exception.class)
@Override
public HotakeAccessibility getCurrentUserAccessibility(String username) {
// 查询当前用户的设置
HotakeAccessibility query = new HotakeAccessibility();
query.setCreateBy(username);
List<HotakeAccessibility> list = hotakeAccessibilityMapper.selectHotakeAccessibilityList(query);
// 如果存在,返回第一条
if (list != null && !list.isEmpty()) {
return list.get(0);
}
// 如果不存在,创建默认设置
HotakeAccessibility defaultAccessibility = new HotakeAccessibility();
// 设置默认值(根据数据库表定义)
defaultAccessibility.setColorMode("light"); // 默认明亮模式
defaultAccessibility.setHighContrastMode(0); // 默认关闭
defaultAccessibility.setReduceMotion(0); // 默认关闭
defaultAccessibility.setFontSize("medium"); // 默认中等字体
defaultAccessibility.setScreenReaderSupport(1); // 默认开启
defaultAccessibility.setAudioDescriptions(1); // 默认开启
defaultAccessibility.setEnhancedKeyboardNavigation(0); // 默认关闭
defaultAccessibility.setFocusIndicators(0); // 默认关闭
defaultAccessibility.setLanguage("en"); // 默认英语
// 保存并返回
return insertHotakeAccessibility(defaultAccessibility);
}
}

View File

@@ -0,0 +1,137 @@
package com.vetti.hotake.service.impl;
import com.vetti.common.core.service.BaseServiceImpl;
import com.vetti.common.enums.FillTypeEnum;
import com.vetti.hotake.domain.HotakeNotificationPreferences;
import com.vetti.hotake.mapper.HotakeNotificationPreferencesMapper;
import com.vetti.hotake.service.IHotakeNotificationPreferencesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 用户通知偏好设置Service业务层处理
*
* @author vetti
* @date 2026-02-01
*/
@Service
public class HotakeNotificationPreferencesServiceImpl extends BaseServiceImpl implements IHotakeNotificationPreferencesService {
@Autowired
private HotakeNotificationPreferencesMapper hotakeNotificationPreferencesMapper;
/**
* 查询用户通知偏好设置
*
* @param id 用户通知偏好设置主键
* @return 用户通知偏好设置
*/
@Transactional(readOnly = true)
@Override
public HotakeNotificationPreferences selectHotakeNotificationPreferencesById(Long id) {
return hotakeNotificationPreferencesMapper.selectHotakeNotificationPreferencesById(id);
}
/**
* 查询用户通知偏好设置列表
*
* @param hotakeNotificationPreferences 用户通知偏好设置
* @return 用户通知偏好设置
*/
@Transactional(readOnly = true)
@Override
public List<HotakeNotificationPreferences> selectHotakeNotificationPreferencesList(HotakeNotificationPreferences hotakeNotificationPreferences) {
return hotakeNotificationPreferencesMapper.selectHotakeNotificationPreferencesList(hotakeNotificationPreferences);
}
/**
* 新增用户通知偏好设置
*
* @param hotakeNotificationPreferences 用户通知偏好设置
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public HotakeNotificationPreferences insertHotakeNotificationPreferences(HotakeNotificationPreferences hotakeNotificationPreferences) {
fill(FillTypeEnum.INSERT.getCode(), hotakeNotificationPreferences);
hotakeNotificationPreferencesMapper.insertHotakeNotificationPreferences(hotakeNotificationPreferences);
return hotakeNotificationPreferences;
}
/**
* 修改用户通知偏好设置
*
* @param hotakeNotificationPreferences 用户通知偏好设置
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public HotakeNotificationPreferences updateHotakeNotificationPreferences(HotakeNotificationPreferences hotakeNotificationPreferences) {
fill(FillTypeEnum.UPDATE.getCode(), hotakeNotificationPreferences);
hotakeNotificationPreferencesMapper.updateHotakeNotificationPreferences(hotakeNotificationPreferences);
return hotakeNotificationPreferences;
}
/**
* 批量删除用户通知偏好设置
*
* @param ids 需要删除的用户通知偏好设置主键
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int deleteHotakeNotificationPreferencesByIds(Long[] ids) {
return hotakeNotificationPreferencesMapper.deleteHotakeNotificationPreferencesByIds(ids);
}
/**
* 删除用户通知偏好设置信息
*
* @param id 用户通知偏好设置主键
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int deleteHotakeNotificationPreferencesById(Long id) {
return hotakeNotificationPreferencesMapper.deleteHotakeNotificationPreferencesById(id);
}
/**
* 获取当前登录用户的通知偏好设置
* 如果不存在则自动创建默认设置
*
* @param username 用户名
* @return 用户通知偏好设置
*/
@Transactional(rollbackFor = Exception.class)
@Override
public HotakeNotificationPreferences getCurrentUserPreferences(String username) {
// 查询当前用户的设置
HotakeNotificationPreferences query = new HotakeNotificationPreferences();
query.setCreateBy(username);
List<HotakeNotificationPreferences> list = hotakeNotificationPreferencesMapper.selectHotakeNotificationPreferencesList(query);
// 如果存在,返回第一条
if (list != null && !list.isEmpty()) {
return list.get(0);
}
// 如果不存在,创建默认设置
HotakeNotificationPreferences defaultPreferences = new HotakeNotificationPreferences();
// 设置默认值(根据数据库表定义)
defaultPreferences.setEmailJobAlerts(1); // 默认开启
defaultPreferences.setEmailApplicationUpdates(1); // 默认开启
defaultPreferences.setEmailAiMatchSuggestions(0); // 默认关闭
defaultPreferences.setEmailNewsletter(0); // 默认关闭
defaultPreferences.setPushNewMessages(1); // 默认开启
defaultPreferences.setPushInterviewReminders(1); // 默认开启
defaultPreferences.setMailMarketingEmails(0); // 默认关闭
defaultPreferences.setMailPartnerOffers(0); // 默认关闭
// 保存并返回
return insertHotakeNotificationPreferences(defaultPreferences);
}
}

View File

@@ -0,0 +1,142 @@
package com.vetti.hotake.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.vetti.common.core.service.BaseServiceImpl;
import com.vetti.common.enums.FillTypeEnum;
import com.vetti.common.utils.SecurityUtils;
import com.vetti.hotake.domain.HotakeCvInfo;
import com.vetti.hotake.domain.HotakeReferenceCheck;
import com.vetti.hotake.domain.dto.HotakeCvInfoDto;
import com.vetti.hotake.domain.dto.VcDto.VcExperienceDto;
import com.vetti.hotake.mapper.HotakeCvInfoMapper;
import com.vetti.hotake.mapper.HotakeReferenceCheckMapper;
import com.vetti.hotake.service.IHotakeReferenceCheckService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* 参考检查Service业务层处理
*
* @author vetti
* @date 2026-01-29
*/
@Service
public class HotakeReferenceCheckServiceImpl extends BaseServiceImpl implements IHotakeReferenceCheckService {
@Autowired
private HotakeReferenceCheckMapper hotakeReferenceCheckMapper;
@Autowired
private HotakeCvInfoMapper hotakeCvInfoMapper;
/**
* 查询参考检查
*
* @param id 参考检查主键
* @return 参考检查
*/
@Transactional(readOnly = true)
@Override
public HotakeReferenceCheck selectHotakeReferenceCheckById(Integer id) {
return hotakeReferenceCheckMapper.selectHotakeReferenceCheckById(id);
}
/**
* 查询参考检查列表
*
* @param hotakeReferenceCheck 参考检查
* @return 参考检查
*/
@Transactional(readOnly = true)
@Override
public List<HotakeReferenceCheck> selectHotakeReferenceCheckList(HotakeReferenceCheck hotakeReferenceCheck) {
return hotakeReferenceCheckMapper.selectHotakeReferenceCheckList(hotakeReferenceCheck);
}
/**
* 新增参考检查
*
* @param hotakeReferenceCheck 参考检查
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public HotakeReferenceCheck insertHotakeReferenceCheck(HotakeReferenceCheck hotakeReferenceCheck) {
fill(FillTypeEnum.INSERT.getCode(), hotakeReferenceCheck);
hotakeReferenceCheckMapper.insertHotakeReferenceCheck(hotakeReferenceCheck);
return hotakeReferenceCheck;
}
/**
* 修改参考检查
*
* @param hotakeReferenceCheck 参考检查
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public HotakeReferenceCheck updateHotakeReferenceCheck(HotakeReferenceCheck hotakeReferenceCheck) {
fill(FillTypeEnum.UPDATE.getCode(), hotakeReferenceCheck);
hotakeReferenceCheckMapper.updateHotakeReferenceCheck(hotakeReferenceCheck);
return hotakeReferenceCheck;
}
/**
* 批量删除参考检查
*
* @param ids 需要删除的参考检查主键
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int deleteHotakeReferenceCheckByIds(Integer[] ids) {
return hotakeReferenceCheckMapper.deleteHotakeReferenceCheckByIds(ids);
}
/**
* 删除参考检查信息
*
* @param id 参考检查主键
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int deleteHotakeReferenceCheckById(Integer id) {
return hotakeReferenceCheckMapper.deleteHotakeReferenceCheckById(id);
}
/**
* 获取当前登录人的工作经验列表
*
* @return 工作经验列表
*/
@Transactional(readOnly = true)
@Override
public List<VcExperienceDto> getCurrentUserExperienceList() {
List<VcExperienceDto> experienceList = new ArrayList<>();
// 查询当前用户的简历信息
HotakeCvInfo queryCv = new HotakeCvInfo();
queryCv.setUserId(SecurityUtils.getUserId());
queryCv.setCvFileType("cv");
List<HotakeCvInfo> cvInfoList = hotakeCvInfoMapper.selectHotakeCvInfoList(queryCv);
if (CollectionUtil.isNotEmpty(cvInfoList)) {
HotakeCvInfo cvInfo = cvInfoList.get(0);
if (StrUtil.isNotEmpty(cvInfo.getCvTemplateJson())) {
HotakeCvInfoDto cvInfoDto = JSONUtil.toBean(cvInfo.getCvTemplateJson(), HotakeCvInfoDto.class);
if (cvInfoDto != null && CollectionUtil.isNotEmpty(cvInfoDto.getExperience())) {
experienceList = cvInfoDto.getExperience();
}
}
}
return experienceList;
}
}

View File

@@ -9,6 +9,7 @@ import com.vetti.common.core.service.BaseServiceImpl;
import com.vetti.common.enums.FillTypeEnum;
import com.vetti.common.enums.StageEnum;
import com.vetti.common.exception.ServiceException;
import com.vetti.common.utils.MessageUtils;
import com.vetti.common.utils.SecurityUtils;
import com.vetti.hotake.domain.*;
import com.vetti.hotake.domain.dto.*;
@@ -169,7 +170,17 @@ public class HotakeRolesApplyInfoServiceImpl extends BaseServiceImpl implements
public HotakeRolesApplyInfo insertHotakeRolesApplyInfo(HotakeRolesApplyInfo hotakeRolesApplyInfo)
{
fill(FillTypeEnum.INSERT.getCode(), hotakeRolesApplyInfo);
hotakeRolesApplyInfo.setCandidateId(SecurityUtils.getUserId());
Long candidateId = SecurityUtils.getUserId();
hotakeRolesApplyInfo.setCandidateId(candidateId);
// 校验候选人和岗位的唯一性
if (hotakeRolesApplyInfo.getRoleId() != null) {
HotakeRolesApplyInfo existInfo = hotakeRolesApplyInfoMapper.selectByCandidateIdAndRoleId(candidateId, hotakeRolesApplyInfo.getRoleId());
if (existInfo != null) {
throw new ServiceException(MessageUtils.messageCustomize("HotakeRolesApplyInfoServiceImpl10001"));
}
}
String fileSuffix = FileUtil.getSuffix(hotakeRolesApplyInfo.getCvFile());
if (StrUtil.isNotEmpty(fileSuffix)) {
fileSuffix = fileSuffix.toLowerCase();
@@ -190,7 +201,17 @@ public class HotakeRolesApplyInfoServiceImpl extends BaseServiceImpl implements
public HotakeRolesApplyInfo updateHotakeRolesApplyInfo(HotakeRolesApplyInfo hotakeRolesApplyInfo)
{
fill(FillTypeEnum.UPDATE.getCode(), hotakeRolesApplyInfo);
hotakeRolesApplyInfo.setCandidateId(SecurityUtils.getUserId());
Long candidateId = SecurityUtils.getUserId();
hotakeRolesApplyInfo.setCandidateId(candidateId);
// 校验候选人和岗位的唯一性(排除自身)
if (hotakeRolesApplyInfo.getRoleId() != null && hotakeRolesApplyInfo.getId() != null) {
HotakeRolesApplyInfo existInfo = hotakeRolesApplyInfoMapper.selectByCandidateIdAndRoleId(candidateId, hotakeRolesApplyInfo.getRoleId());
if (existInfo != null && !existInfo.getId().equals(hotakeRolesApplyInfo.getId())) {
throw new ServiceException(MessageUtils.messageCustomize("HotakeRolesApplyInfoServiceImpl10001"));
}
}
String fileSuffix = FileUtil.getSuffix(hotakeRolesApplyInfo.getCvFile());
if (StrUtil.isNotEmpty(fileSuffix)) {
fileSuffix = fileSuffix.toLowerCase();

View File

@@ -134,6 +134,11 @@ public class HotakeRolesInfoServiceImpl extends BaseServiceImpl implements IHota
SysUser user = sysUserMapper.selectUserById(hotakeRolesInfo.getRecruiterId());
dto.setRecruiterUser(user);
// 判断当前用户是否已申请该岗位
Long currentUserId = SecurityUtils.getUserId();
HotakeRolesApplyInfo existApply = hotakeRolesApplyInfoMapper.selectByCandidateIdAndRoleId(currentUserId, id);
dto.setHasApplied(existApply != null);
}
return dto;

View File

@@ -0,0 +1,160 @@
package com.vetti.hotake.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.vetti.common.core.domain.entity.SysDictData;
import com.vetti.common.core.service.BaseServiceImpl;
import com.vetti.common.enums.FillTypeEnum;
import com.vetti.hotake.domain.HotakeSettingsJob;
import com.vetti.hotake.domain.dto.HotakeSettingsJobDictDto;
import com.vetti.hotake.mapper.HotakeSettingsJobMapper;
import com.vetti.hotake.service.IHotakeSettingsJobService;
import com.vetti.system.service.ISysDictTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* 用户首选工作设置Service业务层处理
*
* @author wangxiangshun
* @date 2025-11-02
*/
@Service
public class HotakeSettingsJobServiceImpl extends BaseServiceImpl implements IHotakeSettingsJobService {
@Autowired
private HotakeSettingsJobMapper hotakeSettingsJobMapper;
@Autowired
private ISysDictTypeService dictTypeService;
/**
* 查询用户首选工作设置
*
* @param id 用户首选工作设置主键
* @return 用户首选工作设置
*/
@Transactional(readOnly = true)
@Override
public HotakeSettingsJob selectHotakeSettingsJobById(Long id) {
return hotakeSettingsJobMapper.selectHotakeSettingsJobById(id);
}
/**
* 查询用户首选工作设置列表
*
* @param hotakeSettingsJob 用户首选工作设置
* @return 用户首选工作设置
*/
@Transactional(readOnly = true)
@Override
public List<HotakeSettingsJob> selectHotakeSettingsJobList(HotakeSettingsJob hotakeSettingsJob) {
return hotakeSettingsJobMapper.selectHotakeSettingsJobList(hotakeSettingsJob);
}
/**
* 新增用户首选工作设置
*
* @param hotakeSettingsJob 用户首选工作设置
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public HotakeSettingsJob insertHotakeSettingsJob(HotakeSettingsJob hotakeSettingsJob) {
fill(FillTypeEnum.INSERT.getCode(), hotakeSettingsJob);
hotakeSettingsJobMapper.insertHotakeSettingsJob(hotakeSettingsJob);
return hotakeSettingsJob;
}
/**
* 修改用户首选工作设置
*
* @param hotakeSettingsJob 用户首选工作设置
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public HotakeSettingsJob updateHotakeSettingsJob(HotakeSettingsJob hotakeSettingsJob) {
fill(FillTypeEnum.UPDATE.getCode(), hotakeSettingsJob);
hotakeSettingsJobMapper.updateHotakeSettingsJob(hotakeSettingsJob);
return hotakeSettingsJob;
}
/**
* 批量删除用户首选工作设置
*
* @param ids 需要删除的用户首选工作设置主键
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int deleteHotakeSettingsJobByIds(Long[] ids) {
return hotakeSettingsJobMapper.deleteHotakeSettingsJobByIds(ids);
}
/**
* 删除用户首选工作设置信息
*
* @param id 用户首选工作设置主键
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int deleteHotakeSettingsJobById(Long id) {
return hotakeSettingsJobMapper.deleteHotakeSettingsJobById(id);
}
/**
* 获取用户首选工作设置字典对照内容
*
* @return 字典对照内容
*/
@Transactional(readOnly = true)
@Override
public HotakeSettingsJobDictDto getDictData() {
HotakeSettingsJobDictDto dto = new HotakeSettingsJobDictDto();
dto.setHotakeLanguagesType(convertToDictItems(dictTypeService.selectDictDataByType("hotake_languages_type")));
dto.setHotakeSkillsToolType(convertToDictItems(dictTypeService.selectDictDataByType("hotake_skills_tool_type")));
dto.setRoleLevel(convertToDictItems(dictTypeService.selectDictDataByType("role_level")));
dto.setRoleLocationType(convertToDictItems(dictTypeService.selectDictDataByType("role_location_type")));
dto.setRoleSelectJobType(convertToDictItems(dictTypeService.selectDictDataByType("role_select_job_type")));
dto.setRoleType(convertToDictItems(dictTypeService.selectDictDataByType("role_type")));
dto.setRoleRequiredSkills(convertToDictItems(dictTypeService.selectDictDataByType("role_required_skills")));
dto.setRoleNiceToHaveSkills(convertToDictItems(dictTypeService.selectDictDataByType("role_nice_to_have_skills")));
dto.setRoleEducationRequirementsType(convertToDictItems(dictTypeService.selectDictDataByType("role_education_requirements_type")));
dto.setRoleCertificationLicenses(convertToDictItems(dictTypeService.selectDictDataByType("role_certification_licenses")));
dto.setRoleBenefits(convertToDictItems(dictTypeService.selectDictDataByType("role_benefits")));
dto.setRolePublishingChannels(convertToDictItems(dictTypeService.selectDictDataByType("role_publishing_channels")));
dto.setRoleInitialScreeningQuestionsType(convertToDictItems(dictTypeService.selectDictDataByType("role_initial_screening_questions_type")));
dto.setExpectedPayRange(convertToDictItems(dictTypeService.selectDictDataByType("expected_pay_range")));
dto.setWillingnessToTravel(convertToDictItems(dictTypeService.selectDictDataByType("willingness_to_travel")));
return dto;
}
private List<HotakeSettingsJobDictDto.DictItem> convertToDictItems(List<SysDictData> dictDataList) {
List<HotakeSettingsJobDictDto.DictItem> items = new ArrayList<>();
if (CollectionUtil.isNotEmpty(dictDataList)) {
for (SysDictData dictData : dictDataList) {
HotakeSettingsJobDictDto.DictItem item = new HotakeSettingsJobDictDto.DictItem();
item.setDictCode(dictData.getDictCode());
item.setDictLabel(dictData.getDictLabel());
item.setDictValue(dictData.getDictValue());
item.setDictType(dictData.getDictType());
item.setCssClass(dictData.getCssClass());
item.setListClass(dictData.getListClass());
item.setIsDefault(dictData.getIsDefault());
item.setStatus(dictData.getStatus());
item.setDataType(dictData.getDataType());
item.setFileUrl(dictData.getFileUrl());
item.setAvatarUrl(dictData.getAvatarUrl());
items.add(item);
}
}
return items;
}
}