From 6ad695f52d2949c46446d6d3f0dcabdd6cc01b3f Mon Sep 17 00:00:00 2001 From: sh Date: Thu, 18 Jun 2026 19:33:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=9D=A2=E8=AF=95=E9=82=80?= =?UTF-8?q?=E7=BA=A6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cms/InterviewInviteController.java | 90 ++++++++++++++++ .../com/ruoyi/cms/domain/InterviewInvite.java | 55 ++++++++++ .../cms/mapper/InterviewInviteMapper.java | 21 ++++ .../cms/service/InterviewInviteService.java | 49 +++++++++ .../impl/InterviewInviteServiceImpl.java | 101 ++++++++++++++++++ .../ruoyi/cms/util/notice/NoticeUtils.java | 31 ++++++ .../mapper/app/InterviewInviteMapper.xml | 51 +++++++++ 7 files changed, 398 insertions(+) create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/InterviewInviteController.java create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/InterviewInvite.java create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/InterviewInviteMapper.java create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/InterviewInviteService.java create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/InterviewInviteServiceImpl.java create mode 100644 ruoyi-bussiness/src/main/resources/mapper/app/InterviewInviteMapper.xml diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/InterviewInviteController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/InterviewInviteController.java new file mode 100644 index 0000000..19ac5a7 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/InterviewInviteController.java @@ -0,0 +1,90 @@ +package com.ruoyi.cms.controller.cms; + +import com.ruoyi.cms.domain.InterviewInvite; +import com.ruoyi.cms.service.InterviewInviteService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 面试邀约Controller + * + * @author ruoyi + */ +@RestController +@RequestMapping("/cms/interviewInvite") +@Api(tags = "后台:面试邀约") +public class InterviewInviteController extends BaseController +{ + @Autowired + private InterviewInviteService interviewInviteService; + + /** + * 查询面试邀约列表(分页) + */ + @ApiOperation("查询面试邀约列表") + @PreAuthorize("@ss.hasPermi('cms:interviewInvite:list')") + @GetMapping("/list") + public TableDataInfo list(InterviewInvite interviewInvite) + { + startPage(); + List list = interviewInviteService.selectInterviewInviteList(interviewInvite); + return getDataTable(list); + } + + /** + * 获取面试邀约详情 + */ + @ApiOperation("获取面试邀约详情") + @PreAuthorize("@ss.hasPermi('cms:interviewInvite:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return AjaxResult.success(interviewInviteService.selectInterviewInviteById(id)); + } + + /** + * 新增面试邀约(弹窗保存接口) + */ + @ApiOperation("新增面试邀约") + @PreAuthorize("@ss.hasPermi('cms:interviewInvite:add')") + @Log(title = "面试邀约", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody InterviewInvite interviewInvite) + { + return toAjax(interviewInviteService.insertInterviewInvite(interviewInvite)); + } + + /** + * 修改面试邀约 + */ + @ApiOperation("修改面试邀约") + @PreAuthorize("@ss.hasPermi('cms:interviewInvite:edit')") + @Log(title = "面试邀约", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody InterviewInvite interviewInvite) + { + return toAjax(interviewInviteService.updateInterviewInvite(interviewInvite)); + } + + /** + * 删除面试邀约(逻辑删除) + */ + @ApiOperation("面试邀约删除") + @PreAuthorize("@ss.hasPermi('cms:interviewInvite:remove')") + @Log(title = "面试邀约", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(interviewInviteService.deleteInterviewInviteByIds(ids)); + } +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/InterviewInvite.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/InterviewInvite.java new file mode 100644 index 0000000..6071616 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/InterviewInvite.java @@ -0,0 +1,55 @@ +package com.ruoyi.cms.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * + * @author + */ +@Data +@ApiModel("面试邀约") +@TableName(value = "interview_invite") +public class InterviewInvite extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID bigint自增 */ + @TableId(value = "id",type = IdType.AUTO) + @ApiModelProperty("id") + private Long id; + + /** 岗位申请ID 关联job_apply */ + @Excel(name = "投递记录ID") + private Long jobApplyId; + + /** 面试时间 */ + @Excel(name = "面试时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date interviewTime; + + /** 面试方式 1线上 2线下 */ + @Excel(name = "面试方式", readConverterExp = "1=线上,2=线下") + private Integer interviewType; + + /** 会议链接/线下手机号 */ + @Excel(name = "联系方式/会议链接") + private String contactInfo; + + /** 邀约状态:1待发送 2已发送 3候选人确认 4候选人拒绝 5面试完成 */ + @Excel(name = "邀约状态", readConverterExp = "1=待发送,2=已发送,3=候选人确认,4=候选人拒绝,5=面试完成") + private Integer inviteStatus; + + /** 面试轮次 1一面 2二面 3复试 */ + @Excel(name = "面试轮次") + private Integer interviewRound; +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/InterviewInviteMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/InterviewInviteMapper.java new file mode 100644 index 0000000..5ea3b23 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/InterviewInviteMapper.java @@ -0,0 +1,21 @@ +package com.ruoyi.cms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.cms.domain.InterviewInvite; +import org.apache.ibatis.annotations.Param; +import java.util.List; + +/** + * 面试邀约Mapper + * + * @author ruoyi + */ +public interface InterviewInviteMapper extends BaseMapper +{ + /** + * 查询面试邀约列表 + * @param interviewInvite 查询条件 + * @return 集合 + */ + List selectInterviewInviteList(@Param("entity") InterviewInvite interviewInvite); +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/InterviewInviteService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/InterviewInviteService.java new file mode 100644 index 0000000..98e8ff6 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/InterviewInviteService.java @@ -0,0 +1,49 @@ +package com.ruoyi.cms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.cms.domain.InterviewInvite; + +import java.util.List; + +/** + * 面试邀约Service接口 + * + * @author ruoyi + */ +public interface InterviewInviteService extends IService +{ + /** + * 查询面试邀约 + * @param id 主键 + * @return 实体 + */ + InterviewInvite selectInterviewInviteById(Long id); + + /** + * 查询面试邀约列表 + * @param interviewInvite 条件 + * @return 集合 + */ + List selectInterviewInviteList(InterviewInvite interviewInvite); + + /** + * 新增面试邀约 + * @param interviewInvite 实体 + * @return 行数 + */ + int insertInterviewInvite(InterviewInvite interviewInvite); + + /** + * 修改面试邀约 + * @param interviewInvite 实体 + * @return 行数 + */ + int updateInterviewInvite(InterviewInvite interviewInvite); + + /** + * 批量逻辑删除面试邀约 + * @param ids 主键数组 + * @return 行数 + */ + int deleteInterviewInviteByIds(Long[] ids); +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/InterviewInviteServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/InterviewInviteServiceImpl.java new file mode 100644 index 0000000..5137720 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/InterviewInviteServiceImpl.java @@ -0,0 +1,101 @@ +package com.ruoyi.cms.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.cms.domain.InterviewInvite; +import com.ruoyi.cms.domain.Job; +import com.ruoyi.cms.domain.JobApply; +import com.ruoyi.cms.domain.Notice; +import com.ruoyi.cms.mapper.InterviewInviteMapper; +import com.ruoyi.cms.mapper.JobApplyMapper; +import com.ruoyi.cms.mapper.JobMapper; +import com.ruoyi.cms.mapper.NoticeMapper; +import com.ruoyi.cms.service.InterviewInviteService; +import com.ruoyi.cms.util.notice.NoticeUtils; +import com.ruoyi.common.constant.Constants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; + +/** + * 面试邀约业务层实现 + * + * @author ruoyi + */ +@Service +public class InterviewInviteServiceImpl extends ServiceImpl + implements InterviewInviteService +{ + + @Autowired + private InterviewInviteMapper interviewInviteMapper; + @Autowired + private NoticeMapper noticeMapper; + @Autowired + private JobApplyMapper jobApplyMapper; + @Autowired + private JobMapper jobMapper; + + @Override + public InterviewInvite selectInterviewInviteById(Long id) + { + return interviewInviteMapper.selectById(id); + } + + @Override + public List selectInterviewInviteList(InterviewInvite interviewInvite) + { + return interviewInviteMapper.selectInterviewInviteList(interviewInvite); + } + + @Override + public int insertInterviewInvite(InterviewInvite interviewInvite) + { + int i=interviewInviteMapper.insert(interviewInvite); + createNotice(interviewInvite); + return i; + } + + @Override + public int updateInterviewInvite(InterviewInvite interviewInvite) + { + createNotice(interviewInvite); + return interviewInviteMapper.updateById(interviewInvite); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteInterviewInviteByIds(Long[] ids) + { + List upIds=Arrays.asList(ids); + int i=interviewInviteMapper.deleteBatchIds(upIds); + //删除通知 + noticeMapper.update(null, Wrappers.lambdaUpdate() + .in(Notice::getBussinessId, upIds) + .set(Notice::getDelFlag, Constants.Del_FLAG_DELETE)); + return i; + } + + /** + * 保存通知信息 + * @param interviewInvite + */ + public void createNotice(InterviewInvite interviewInvite){ + JobApply jobApply=jobApplyMapper.selectById(interviewInvite.getJobApplyId()); + Job job=jobMapper.selectById(jobApply.getJobId()); + Notice notice = new Notice(); + notice.setUserId(jobApply.getUserId()); + notice.setBussinessId(interviewInvite.getId()); + notice.setIsRead(NoticeUtils.NOTICE_WD); + notice.setTitle(NoticeUtils.NOTICE_TYPE_MS); + notice.setSubTitle(NoticeUtils.NOTICE_TYPE_MS); + notice.setNoticeType(NoticeUtils.NOTICE_TYPE_XTLX); + notice.setRemark(NoticeUtils.NOTICE_REMARK); + String content = NoticeUtils.mstzMsg(job.getCompanyName(), job.getJobTitle(),interviewInvite.getInterviewType(),interviewInvite.getContactInfo()); + notice.setNoticeContent(content); + noticeMapper.insert(notice); + } +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/notice/NoticeUtils.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/notice/NoticeUtils.java index 7692a89..45d1dd2 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/notice/NoticeUtils.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/notice/NoticeUtils.java @@ -7,6 +7,7 @@ import com.ruoyi.common.core.domain.entity.AppUser; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class NoticeUtils { /** @@ -34,6 +35,17 @@ public class NoticeUtils { public static final String NOTICE_TYPE_SXLX="2"; + /*************面试start*************/ + public static final String NOTICE_TYPE_MS="面试通知"; + + public static final String NOTICE_COMENT_MS="诚挚邀请您参加【"; + + public static final String INTERVIEW_NOTICE_TPL = "%s%s%s"; + + public static final Integer INTERVIEW_TYPE_ONLINE = 1;//线上 + + /*************面试end*************/ + /** * 拼装岗位 */ @@ -102,4 +114,23 @@ public class NoticeUtils { }); return add; } + + /** + * 面试通知 + * @param companyName + * @param jobName + * @return + */ + public static String mstzMsg(String companyName,String jobName,Integer lx,String message){ + String compName = Optional.ofNullable(companyName).orElse(""); + String jbName = Optional.ofNullable(jobName).orElse(""); + String msgExtra = Optional.ofNullable(message).orElse(""); + String typeText = INTERVIEW_TYPE_ONLINE.equals(lx) ? "线上面试" : "线下面试"; + + return String.format(INTERVIEW_NOTICE_TPL, + compName+",", + NoticeUtils.NOTICE_COMENT_MS, + jbName +NoticeUtils.NOTICE_COMENT_FF + typeText +","+ msgExtra + ); + } } diff --git a/ruoyi-bussiness/src/main/resources/mapper/app/InterviewInviteMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/app/InterviewInviteMapper.xml new file mode 100644 index 0000000..f400414 --- /dev/null +++ b/ruoyi-bussiness/src/main/resources/mapper/app/InterviewInviteMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + select id, job_apply_id, interview_time, interview_type, contact_info, + invite_status, interview_round, del_flag, create_by, create_time, + update_by, update_time, remark + from interview_invite + + + + + \ No newline at end of file