Merge remote-tracking branch 'xfsg/cc_partner_init' into cc_partner_init

This commit is contained in:
苏竹红
2024-03-20 15:01:45 +08:00
18 changed files with 256 additions and 88 deletions

View File

@@ -1,7 +1,6 @@
package com.cool.store.enums; package com.cool.store.enums;
import com.cool.store.constants.CommonConstants; import com.cool.store.constants.CommonConstants;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import java.time.LocalDate; import java.time.LocalDate;
@@ -9,7 +8,6 @@ import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* @author zhangchenbiao * @author zhangchenbiao
@@ -93,8 +91,4 @@ public enum InterviewTypeEnum {
return result; return result;
} }
public static void main(String[] args) {
System.out.println(getTimeSlots(LocalDate.now(), InterviewTypeEnum.INTERVIEW));
}
} }

View File

@@ -0,0 +1,23 @@
package com.cool.store.enums;
/**
* @author zhangchenbiao
* @FileName: InterviewUserTypeEnum
* @Description:
* @date 2024-03-20 9:53
*/
public enum InterviewUserTypeEnum {
LINE("加盟商线索"),
INTERVIEWER("面试官"),;
private String message;
InterviewUserTypeEnum(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,45 @@
package com.cool.store.enums;
/**
* @author zhangchenbiao
* @FileName: JoinInterviewStatusEnum
* @Description:
* @date 2024-03-20 11:05
*/
public enum JoinInterviewStatusEnum {
NO_JOIN(0, "未参加"),
LINE_JOIN(1,"加盟商先进入"),
INTERVIEW_JOIN(2,"面试官先进入"),
JOIN(3,"双方都参加");
private Integer code;
private String message;
JoinInterviewStatusEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
public static Integer getJoinInterviewStatus(Integer joinInterviewStatus, InterviewUserTypeEnum userType){
if(NO_JOIN.getCode().equals(joinInterviewStatus)){
return InterviewUserTypeEnum.LINE.equals(userType) ? LINE_JOIN.getCode() : INTERVIEW_JOIN.getCode();
}
if(LINE_JOIN.getCode().equals(joinInterviewStatus)){
return InterviewUserTypeEnum.LINE.equals(userType) ? LINE_JOIN.getCode() : JOIN.getCode();
}
if(INTERVIEW_JOIN.getCode().equals(joinInterviewStatus)){
return InterviewUserTypeEnum.LINE.equals(userType) ? JOIN.getCode() : INTERVIEW_JOIN.getCode();
}
return JOIN.getCode();
}
}

View File

@@ -1,51 +0,0 @@
package com.cool.store.enums;
/**
* @Author suzhuhong
* @Date 2023/6/9 16:35
* @Version 1.0
*/
public enum WorkflowStatusEnum {
//意向申请阶段
INTENT_0("0","待提交"),
INTENT_1("1","待审核"),
INTENT_2("2","已通过"),
INTENT_3("3","未通过"),
//预约面试阶段
RESERVATION_0("0","待预约"),
RESERVATION_1("1","待审核"),
RESERVATION_7("7","拒绝"),
RESERVATION_8("8","超时"),//超时未预约或未参加
//合格资格面试
INTERVIEW_2("2","待面试"),
INTERVIEW_3("3","已开始"),
INTERVIEW_4("4","待审核"),
INTERVIEW_5("5","审核中"),
INTERVIEW_6("6","审核通过"),
INTERVIEW_7("7","拒绝"),
;
private String code;
private String message;
WorkflowStatusEnum(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
public String getMessage() {
return message;
}
}

View File

@@ -16,10 +16,10 @@ public class TRTCUtils {
*/ */
private static final Long expired = 60 * 60 * 24L; private static final Long expired = 60 * 60 * 24L;
@Value("${trtc.sdkAppId:null}") @Value("${trtc.sdkAppId}")
private Long sdkAppId; private Long sdkAppId;
@Value("${trtc.secretKey:null}") @Value("${trtc.secretKey}")
private String key; private String key;
/** /**

View File

@@ -23,7 +23,11 @@ public class LineInfoDAO {
public LineInfoDO getLineInfo(Long lineId) { public LineInfoDO getLineInfo(Long lineId) {
return lineInfoMapper.selectByPrimaryKey(lineId); LineInfoDO lineInfo = lineInfoMapper.selectByPrimaryKey(lineId);
if(Objects.nonNull(lineInfo) && !lineInfo.getDeleted()){
return lineInfo;
}
return null;
} }
public Integer updateLineInfo(LineInfoDO param){ public Integer updateLineInfo(LineInfoDO param){

View File

@@ -51,4 +51,13 @@ public class LineInterviewDAO {
return lineInterviewMapper.getInterviewerPage(request); return lineInterviewMapper.getInterviewerPage(request);
} }
/**
* 获取面试信息
* @param interviewId
* @return
*/
public LineInterviewDO getInterviewInfoById(Long interviewId){
return lineInterviewMapper.selectByPrimaryKey(interviewId);
}
} }

View File

@@ -9,7 +9,7 @@
<result column="interview_date" jdbcType="DATE" property="interviewDate" /> <result column="interview_date" jdbcType="DATE" property="interviewDate" />
<result column="start_time" jdbcType="TIMESTAMP" property="startTime" /> <result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
<result column="end_time" jdbcType="TIMESTAMP" property="endTime" /> <result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
<result column="is_partner_interview" jdbcType="TINYINT" property="isPartnerInterview" /> <result column="join_interview_status" jdbcType="TINYINT" property="joinInterviewStatus" />
<result column="actual_start_time" jdbcType="TIMESTAMP" property="actualStartTime" /> <result column="actual_start_time" jdbcType="TIMESTAMP" property="actualStartTime" />
<result column="actual_end_time" jdbcType="TIMESTAMP" property="actualEndTime" /> <result column="actual_end_time" jdbcType="TIMESTAMP" property="actualEndTime" />
<result column="room_id" jdbcType="VARCHAR" property="roomId" /> <result column="room_id" jdbcType="VARCHAR" property="roomId" />
@@ -32,6 +32,7 @@
<select id="getInterviewerPage" resultType="com.cool.store.dto.interview.LineInterviewPageDTO"> <select id="getInterviewerPage" resultType="com.cool.store.dto.interview.LineInterviewPageDTO">
select select
a.id as interviewId,
a.line_id as lineId, a.line_id as lineId,
a.start_time as startTime, a.start_time as startTime,
a.end_time as endTime, a.end_time as endTime,

View File

@@ -12,6 +12,9 @@ import lombok.Data;
@Data @Data
public class LineInterviewPageDTO { public class LineInterviewPageDTO {
@ApiModelProperty("面试id")
private Long interviewId;
@ApiModelProperty("线索id") @ApiModelProperty("线索id")
private Long lineId; private Long lineId;
@@ -51,4 +54,7 @@ public class LineInterviewPageDTO {
@ApiModelProperty("面审人") @ApiModelProperty("面审人")
private String interviewer; private String interviewer;
@ApiModelProperty("房间id")
private String roomId;
} }

View File

@@ -49,10 +49,10 @@ public class LineInterviewDO {
private Date endTime; private Date endTime;
/** /**
* 0未参加1参加 * 0未参加1加盟商先进入 2面试官先进入 3双方都参加
*/ */
@Column(name = "is_partner_interview") @Column(name = "join_interview_status")
private Integer isPartnerInterview; private Integer joinInterviewStatus;
/** /**
* 实际开始时间 * 实际开始时间

View File

@@ -0,0 +1,27 @@
package com.cool.store.vo.interview;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class EnterInterviewVO {
@ApiModelProperty("userSig 进入会议需要的用户签名")
private String userSign;
@ApiModelProperty("面试官id")
private String interviewerId;
@ApiModelProperty("面试官姓名")
private String interviewerName;
@ApiModelProperty("加盟商姓名")
private String partnerName;
public EnterInterviewVO(String userSign, String interviewerId, String interviewerName, String partnerName) {
this.userSign = userSign;
this.interviewerId = interviewerId;
this.interviewerName = interviewerName;
this.partnerName = partnerName;
}
}

View File

@@ -21,6 +21,9 @@ import java.util.Map;
@Data @Data
public class LineInterviewPageVO { public class LineInterviewPageVO {
@ApiModelProperty("面试id")
private Long interviewId;
@ApiModelProperty("线索id") @ApiModelProperty("线索id")
private Long lineId; private Long lineId;
@@ -60,6 +63,9 @@ public class LineInterviewPageVO {
@ApiModelProperty("面审人") @ApiModelProperty("面审人")
private String interviewerUsername; private String interviewerUsername;
@ApiModelProperty("房间id")
private String roomId;
public static List<LineInterviewPageVO> convertList(List<LineInterviewPageDTO> list, Map<Long, String> userPortraitMap, Map<String, String> userNameMap, Map<Long, String> cityNameMap){ public static List<LineInterviewPageVO> convertList(List<LineInterviewPageDTO> list, Map<Long, String> userPortraitMap, Map<String, String> userNameMap, Map<Long, String> cityNameMap){
if(CollectionUtils.isEmpty(list)){ if(CollectionUtils.isEmpty(list)){
return Lists.newArrayList(); return Lists.newArrayList();
@@ -93,6 +99,7 @@ public class LineInterviewPageVO {
} }
result.setUserPortraitList(userPortraitList); result.setUserPortraitList(userPortraitList);
} }
result.setRoomId(lineInterviewPage.getRoomId());
resultList.add(result); resultList.add(result);
} }
return resultList; return resultList;

View File

@@ -1,9 +1,11 @@
package com.cool.store.service; package com.cool.store.service;
import com.cool.store.enums.InterviewUserTypeEnum;
import com.cool.store.request.AppointmentTimeRequest; import com.cool.store.request.AppointmentTimeRequest;
import com.cool.store.request.LineInterviewPageRequest; import com.cool.store.request.LineInterviewPageRequest;
import com.cool.store.request.ModifyInterviewerRequest; import com.cool.store.request.ModifyInterviewerRequest;
import com.cool.store.vo.interview.AppointmentTimeVO; import com.cool.store.vo.interview.AppointmentTimeVO;
import com.cool.store.vo.interview.EnterInterviewVO;
import com.cool.store.vo.interview.LineInterviewPageVO; import com.cool.store.vo.interview.LineInterviewPageVO;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
@@ -54,4 +56,13 @@ public interface LineInterviewService {
* @return * @return
*/ */
PageInfo<LineInterviewPageVO> getInterviewerPage(LineInterviewPageRequest request); PageInfo<LineInterviewPageVO> getInterviewerPage(LineInterviewPageRequest request);
/**
* 进入面试间
* @param interviewId
* @param interviewUserId
* @param userType
* @return
*/
EnterInterviewVO enterInterviewRoom(Long interviewId, String interviewUserId, InterviewUserTypeEnum userType);
} }

View File

@@ -6,22 +6,25 @@ import com.cool.store.entity.HyOpenAreaInfoDO;
import com.cool.store.entity.LineCalendarsEventDO; import com.cool.store.entity.LineCalendarsEventDO;
import com.cool.store.entity.LineInfoDO; import com.cool.store.entity.LineInfoDO;
import com.cool.store.entity.LineInterviewDO; import com.cool.store.entity.LineInterviewDO;
import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.enums.*;
import com.cool.store.enums.InterviewTypeEnum; import com.cool.store.exception.ApiException;
import com.cool.store.exception.ServiceException; import com.cool.store.exception.ServiceException;
import com.cool.store.request.AppointmentTimeRequest; import com.cool.store.request.AppointmentTimeRequest;
import com.cool.store.request.LineInterviewPageRequest; import com.cool.store.request.LineInterviewPageRequest;
import com.cool.store.request.ModifyInterviewerRequest; import com.cool.store.request.ModifyInterviewerRequest;
import com.cool.store.service.LabelService; import com.cool.store.service.LabelService;
import com.cool.store.service.LineInterviewService; import com.cool.store.service.LineInterviewService;
import com.cool.store.utils.TRTCUtils;
import com.cool.store.utils.UUIDUtils; import com.cool.store.utils.UUIDUtils;
import com.cool.store.utils.poi.DateUtils; import com.cool.store.utils.poi.DateUtils;
import com.cool.store.vo.interview.AppointmentTimeVO; import com.cool.store.vo.interview.AppointmentTimeVO;
import com.cool.store.vo.interview.EnterInterviewVO;
import com.cool.store.vo.interview.LineInterviewPageVO; import com.cool.store.vo.interview.LineInterviewPageVO;
import com.github.pagehelper.Page; import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -42,6 +45,10 @@ import java.util.stream.Stream;
@Service @Service
public class LineInterviewServiceImpl implements LineInterviewService { public class LineInterviewServiceImpl implements LineInterviewService {
@Value("${trtc.sdkAppId}")
private Long sdkAppId;
@Value("${trtc.secretKey}")
private String key;
@Resource @Resource
private LineInfoDAO lineInfoDAO; private LineInfoDAO lineInfoDAO;
@Resource @Resource
@@ -190,4 +197,31 @@ public class LineInterviewServiceImpl implements LineInterviewService {
resultPage.setList(resultList); resultPage.setList(resultList);
return resultPage; return resultPage;
} }
@Override
public EnterInterviewVO enterInterviewRoom(Long interviewId, String interviewUserId, InterviewUserTypeEnum userType) {
LineInterviewDO interviewInfo = lineInterviewDAO.getInterviewInfoById(interviewId);
if(Objects.isNull(interviewInfo)){
throw new ServiceException(ErrorCodeEnum.INTERVIEW_NOT_EXIST);
}
//已关闭就禁止进入房间了
if (interviewInfo.getRoomStatus().equals(RoomStatus.CLOSED.getCode())) {
throw new ServiceException(ErrorCodeEnum.ROOM_STATUS_ERROR);
}
String userName = enterpriseUserDAO.getUserName(interviewInfo.getInterviewer());
Long lineId = interviewInfo.getLineId();
LineInfoDO lineInfo = lineInfoDAO.getLineInfo(lineId);
if(Objects.isNull(lineInfo)){
throw new ServiceException(ErrorCodeEnum.LINE_ID_IS_NOT_EXIST);
}
Integer joinInterviewStatus = JoinInterviewStatusEnum.getJoinInterviewStatus(interviewInfo.getJoinInterviewStatus(), userType);
if(!joinInterviewStatus.equals(interviewInfo.getJoinInterviewStatus()) && JoinInterviewStatusEnum.JOIN.getCode().equals(joinInterviewStatus)){
interviewInfo.setActualStartTime(new Date());
interviewInfo.setRoomStatus(RoomStatus.OPEN.getCode());
}
interviewInfo.setJoinInterviewStatus(joinInterviewStatus);
lineInterviewDAO.updateInterviewInfo(interviewInfo);
String userSig = TRTCUtils.genUserSig(sdkAppId, key, interviewUserId);
return new EnterInterviewVO(userSig, interviewInfo.getInterviewer(), userName, lineInfo.getUsername());
}
} }

View File

@@ -126,7 +126,7 @@ public class TokenValidateFilter implements Filter {
// CurrentUserHolder.removeUser(); // CurrentUserHolder.removeUser();
// MDC.clear(); // MDC.clear();
// } // }
filterChain.doFilter(servletRequest, servletResponse); //filterChain.doFilter(servletRequest, servletResponse);
} }
@Override @Override

View File

@@ -0,0 +1,66 @@
package com.cool.store.controller.webb;
import com.cool.store.context.CurrentUserHolder;
import com.cool.store.enums.InterviewUserTypeEnum;
import com.cool.store.request.AppointmentTimeRequest;
import com.cool.store.request.LineInterviewPageRequest;
import com.cool.store.request.ModifyInterviewerRequest;
import com.cool.store.response.ResponseResult;
import com.cool.store.service.LineInterviewService;
import com.cool.store.vo.interview.AppointmentTimeVO;
import com.cool.store.vo.interview.EnterInterviewVO;
import com.cool.store.vo.interview.LineInterviewPageVO;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.List;
/**
* @author zhangchenbiao
* @FileName: LineInterviewController
* @Description:
* @date 2024-03-15 16:04
*/
@RestController
@RequestMapping("/pc/interview/")
@Api(tags = "PC端面试&面谈")
@Slf4j
public class PCLineInterviewController {
@Resource
private LineInterviewService lineInterviewService;
@ApiOperation("修改面审时间")
@PostMapping("/appointment/time/modify")
public ResponseResult<Boolean> modifyAppointmentTime(@RequestBody @Validated AppointmentTimeRequest request) {
return ResponseResult.success(lineInterviewService.modifyAppointmentTime(request));
}
@ApiOperation("修改面试官")
@PostMapping("/interviewer/modify")
public ResponseResult<Boolean> modifyInterviewer(@RequestBody @Validated ModifyInterviewerRequest request) {
return ResponseResult.success(lineInterviewService.modifyInterviewer(request));
}
@ApiOperation("面试列表")
@PostMapping("/interviewer/page")
public ResponseResult<PageInfo<LineInterviewPageVO>> getInterviewerPage(@RequestBody LineInterviewPageRequest request) {
return ResponseResult.success(lineInterviewService.getInterviewerPage(request));
}
@ApiOperation("进入房间")
@GetMapping("/interviewer/room/enter")
public ResponseResult<EnterInterviewVO> enterInterviewRoom(@RequestParam("interviewId")Long interviewId) {
String userId = CurrentUserHolder.getUserId();
return ResponseResult.success(lineInterviewService.enterInterviewRoom(interviewId, userId, InterviewUserTypeEnum.INTERVIEWER));
}
}

View File

@@ -1,11 +1,15 @@
package com.cool.store.controller.webc; package com.cool.store.controller.webc;
import com.cool.store.context.PartnerUserHolder;
import com.cool.store.enums.InterviewUserTypeEnum;
import com.cool.store.request.AppointmentTimeRequest; import com.cool.store.request.AppointmentTimeRequest;
import com.cool.store.request.LineInterviewPageRequest; import com.cool.store.request.LineInterviewPageRequest;
import com.cool.store.request.ModifyInterviewerRequest; import com.cool.store.request.ModifyInterviewerRequest;
import com.cool.store.response.ResponseResult; import com.cool.store.response.ResponseResult;
import com.cool.store.service.LineInterviewService; import com.cool.store.service.LineInterviewService;
import com.cool.store.vo.PartnerUserInfoVO;
import com.cool.store.vo.interview.AppointmentTimeVO; import com.cool.store.vo.interview.AppointmentTimeVO;
import com.cool.store.vo.interview.EnterInterviewVO;
import com.cool.store.vo.interview.LineInterviewPageVO; import com.cool.store.vo.interview.LineInterviewPageVO;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@@ -19,7 +23,6 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@@ -30,7 +33,7 @@ import java.util.List;
*/ */
@RestController @RestController
@RequestMapping("/interview") @RequestMapping("/interview")
@Api(tags = "面试&面谈") @Api(tags = "加盟商端面试&面谈")
@Slf4j @Slf4j
public class LineInterviewController { public class LineInterviewController {
@@ -56,22 +59,11 @@ public class LineInterviewController {
return ResponseResult.success(lineInterviewService.appointmentTime(request)); return ResponseResult.success(lineInterviewService.appointmentTime(request));
} }
@ApiOperation("进入房间")
@ApiOperation("修改面审时间") @GetMapping("/interviewer/room/enter")
@PostMapping("/appointment/time/modify") public ResponseResult<EnterInterviewVO> enterInterviewRoom(@RequestParam("interviewId")Long interviewId) {
public ResponseResult<Boolean> modifyAppointmentTime(@RequestBody @Validated AppointmentTimeRequest request) { PartnerUserInfoVO partnerUser = PartnerUserHolder.getUser();
return ResponseResult.success(lineInterviewService.modifyAppointmentTime(request)); return ResponseResult.success(lineInterviewService.enterInterviewRoom(interviewId, partnerUser.getPartnerId(), InterviewUserTypeEnum.LINE));
} }
@ApiOperation("修改面试官")
@PostMapping("/interviewer/modify")
public ResponseResult<Boolean> modifyInterviewer(@RequestBody @Validated ModifyInterviewerRequest request) {
return ResponseResult.success(lineInterviewService.modifyInterviewer(request));
}
@ApiOperation("面试列表")
@PostMapping("/interviewer/page")
public ResponseResult<PageInfo<LineInterviewPageVO>> getInterviewerPage(@RequestBody LineInterviewPageRequest request) {
return ResponseResult.success(lineInterviewService.getInterviewerPage(request));
}
} }

View File

@@ -1,8 +1,8 @@
#mysql config #mysql config
default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_hy?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true default.datasource.url=jdbc:mysql://dingpushcoolcollege.mysql.rds.aliyuncs.com:3306/coolcollege_intelligent_36?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true
default.datasource.username=hsay default.datasource.username=coolstore
default.datasource.password=Z3J7xBbgouMD default.datasource.password=CSCErYcXniNYm7bT
#redis #redis
spring.redis.host=tstore-coolcollege.redis.rds.aliyuncs.com spring.redis.host=tstore-coolcollege.redis.rds.aliyuncs.com