Browse Source

去掉多余代码

wangliang 2 years ago
parent
commit
460f979c0b

+ 16 - 321
themis-business/src/main/java/com/qmth/themis/business/dto/response/TEExamActivityWaitDto.java

@@ -6,16 +6,10 @@ import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
-import com.qmth.themis.business.enums.EntryAuthenticationPolicyEnum;
 import com.qmth.themis.business.enums.ExamModeEnum;
 import com.qmth.themis.business.enums.ExamModeEnum;
-import com.qmth.themis.business.enums.HardwareTestEnum;
-import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
 import java.util.Objects;
 import java.util.Objects;
 
 
 /**
 /**
@@ -31,9 +25,6 @@ public class TEExamActivityWaitDto implements Serializable {
     @ApiModelProperty(name = "考试场次id")
     @ApiModelProperty(name = "考试场次id")
     private Long id;//考试id
     private Long id;//考试id
 
 
-//    @ApiModelProperty(name = "考试场次代码")
-//    private String code;//考试场次代码
-
     @JsonSerialize(using = ToStringSerializer.class)
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(name = "考生id")
     @ApiModelProperty(name = "考生id")
     private Long examStudentId;//考生id
     private Long examStudentId;//考生id
@@ -56,87 +47,18 @@ public class TEExamActivityWaitDto implements Serializable {
     @ApiModelProperty(name = "强制交卷时间")
     @ApiModelProperty(name = "强制交卷时间")
     private Long maxFinishTime;
     private Long maxFinishTime;
 
 
-//    @ApiModelProperty(name = "监控源")
-//    private String monitorVideoSourceStr;
-//
-//    @ApiModelProperty(name = "监控源集合")
-//    private List<String> monitorVideoSource;
-
-//    @ApiModelProperty(name = "允许开考开放时长,相当于迟到时间")
-//    private Integer openingSeconds;//允许开考开放时长(分钟),相当于迟到时间
-//
-//    @ApiModelProperty(name = "允许开考开放时长,相当于迟到时间")
-//    private Integer activityOpeningSeconds;//允许开考开放时长(分钟),相当于迟到时间
-
-//    @ApiModelProperty(name = "提前多长时间开始候考")
-//    private Integer prepareSeconds;//提前多长时间开始候考(分钟)
-//
-//    @ApiModelProperty(name = "提前多长时间开始候考")
-//    private Integer activityPrepareSeconds;//提前多长时间开始候考(分钟)
-
     @ApiModelProperty(name = "最短考试时长,相当于考试冻结时间")
     @ApiModelProperty(name = "最短考试时长,相当于考试冻结时间")
     private Integer minDurationSeconds;//最短考试时长,相当于考试冻结时间(分钟)
     private Integer minDurationSeconds;//最短考试时长,相当于考试冻结时间(分钟)
 
 
     @ApiModelProperty(name = "最大考试时长")
     @ApiModelProperty(name = "最大考试时长")
     private Integer maxDurationSeconds;//最大考试时长
     private Integer maxDurationSeconds;//最大考试时长
 
 
-//    @ApiModelProperty(name = "最大考试时长")
-//    private Integer activityMaxDurationSeconds;//最大考试时长
-
-//    @ApiModelProperty(name = "允许考试次数")
-//    private Integer examCount;//允许考试次数
-
-//    @ApiModelProperty(name = "是否在结束时间集中强制收卷,0:不强制,1:强制")
-//    private Integer forceFinish;//是否在结束时间集中强制收卷,0:不强制,1:强制
-
-//    @ApiModelProperty(name = "开考身份验证策略,off:关闭,face_verify_optional:非强制人脸验证,face_verify_force:强制人脸验证,liveness_verify:活体验证")
-//    private String entryAuthenticationPolicy;//开考身份验证策略,off:关闭,face_verify_optional:非强制人脸验证,face_verify_force:强制人脸验证,liveness_verify:活体验证
-
-//    @ApiModelProperty(name = "考试过程中人脸检测是否开启,0:不开启,1:开启")
-//    private Integer inProcessFaceVerify;//考试过程中人脸检测是否开启,0:不开启,1:开启
-//
-//    @ApiModelProperty(name = "考试过程中人脸检测是否忽略陌生人 ,0:不忽略,1:忽略")
-//    private Integer inProcessFaceStrangerIgnore;//考试过程中人脸检测是否忽略陌生人 ,0:不忽略,1:忽略
-//
-//    @ApiModelProperty(name = "考试过程中是否启用活体检测 ,0:不启用,1:启用")
-//    private Integer inProcessLivenessVerify;//考试过程中是否启用活体检测 ,0:不启用,1:启用
-//
-//    @ApiModelProperty(value = "考试过程中是否启用真实性检测,0:不启用,1:启用")
-//    private Integer inProcessRealnessVerify;
-//
-//    @ApiModelProperty(name = "考试过程中活体检测间隔时间")
-//    private String inProcessLivenessFixedRangeStr;
-//
-//    @ApiModelProperty(name = "考试过程中活体检测间隔时间集合")
-//    private List<Integer> inProcessLivenessFixedRange;//考试过程中活体检测间隔时间
-//
-//    @ApiModelProperty(name = "考试过程中活体检测结果判定规则,any:任意一次通过,all:全部都要通过,more:通过次数大于失败次数")
-//    private String inProcessLivenessJudgePolicy;//考试过程中活体检测结果判定规则,any:任意一次通过,all:全部都要通过,more:通过次数大于失败次数
-//
-//    @ApiModelProperty(name = "是否允许使用摄像头拍照答题,0:不允许,1:允许")
-//    private Integer cameraPhotoUpload;//是否允许使用摄像头拍照答题,0:不允许,1:允许
-//
-//    @ApiModelProperty(name = "考场开始时间")
-//    private Long startTime;//考场开始时间
-//
-//    @ApiModelProperty(name = "考场结束时间")
-//    private Long finishTime;//考场结束时间
-
     @ApiModelProperty(name = "剩余考试次数")
     @ApiModelProperty(name = "剩余考试次数")
     private Integer leftExamCount;//剩余考试次数
     private Integer leftExamCount;//剩余考试次数
 
 
-//    @ApiModelProperty(name = "是否允许使用移动端拍照答题,0:不开启,1:开启")
-//    private Integer mobilePhotoUpload;//是否允许使用移动端拍照答题,0:不开启,1:开启
-//
-//    @ApiModelProperty(name = "客户端监控是否启用音频与麦克风")
-//    private Boolean monitorAudioEnable = false;//客户端监控是否启用音频与麦克风
-//
     @JsonSerialize(using = ToStringSerializer.class)
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(name = "考试id")
     @ApiModelProperty(name = "考试id")
     private Long examId;//考试id
     private Long examId;//考试id
-//
-//    @ApiModelProperty(name = "硬件检测集合")
-//    private List<String> hardwareTest;//硬件检测
 
 
     public TEExamActivityWaitDto() {
     public TEExamActivityWaitDto() {
 
 
@@ -145,7 +67,6 @@ public class TEExamActivityWaitDto implements Serializable {
     public TEExamActivityWaitDto(ExamCacheBean ec, ExamActivityCacheBean examActivityCacheBean, ExamStudentCacheBean examStudentCacheBean, Long examStudentId, ExamCourseCacheBean examCourseCacheBean,
     public TEExamActivityWaitDto(ExamCacheBean ec, ExamActivityCacheBean examActivityCacheBean, ExamStudentCacheBean examStudentCacheBean, Long examStudentId, ExamCourseCacheBean examCourseCacheBean,
                                  Long startTime, Long endTime, Integer openingSeconds, Integer minDurationSeconds, Integer maxDurationSeconds, Integer forceFinish) {
                                  Long startTime, Long endTime, Integer openingSeconds, Integer minDurationSeconds, Integer maxDurationSeconds, Integer forceFinish) {
         this.id = examActivityCacheBean.getId();
         this.id = examActivityCacheBean.getId();
-//        this.code = examActivityCacheBean.getCode();
         this.examStudentId = examStudentId;
         this.examStudentId = examStudentId;
         this.courseCode = examStudentCacheBean.getCourseCode();
         this.courseCode = examStudentCacheBean.getCourseCode();
         this.courseName = examStudentCacheBean.getCourseName();
         this.courseName = examStudentCacheBean.getCourseName();
@@ -169,70 +90,11 @@ public class TEExamActivityWaitDto implements Serializable {
         } else {
         } else {
             this.maxFinishTime = Objects.nonNull(endTime) ? endTime : examActivityCacheBean.getFinishTime();
             this.maxFinishTime = Objects.nonNull(endTime) ? endTime : examActivityCacheBean.getFinishTime();
         }
         }
-//        this.cameraPhotoUpload = ec.getCameraPhotoUpload();
-//        this.entryAuthenticationPolicy = ec.getEntryAuthenticationPolicy().name();
-//        if (Objects.nonNull(ec.getMonitorVideoSource()) && !Objects.equals(ec.getMonitorVideoSource().toString().trim().replaceAll(" ", ""), "")) {
-//            this.setMonitorVideoSource(Arrays.asList(ec.getMonitorVideoSource().trim().toUpperCase().split(",")));
-//            //加入monitorAudioEnable逻辑
-//            if (ec.getMonitorVideoSource().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_SCREEN.name()) || ec.getMonitorVideoSource().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name())) {
-//                this.monitorAudioEnable = true;
-//            }
-//            //加入hardwareTest逻辑
-//            if (ec.getMonitorVideoSource().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name()) || (Objects.nonNull(this.getEntryAuthenticationPolicy()) && (Objects.equals(this.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.LIVENESS_VERIFY.name()) || Objects.equals(this.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.FACE_VERIFY_FORCE.name()))) || (Objects.nonNull(this.getCameraPhotoUpload()) && this.getCameraPhotoUpload() == 1)) {
-//                if (Objects.isNull(this.hardwareTest)) {
-//                    this.hardwareTest = new ArrayList<>();
-//                }
-//                this.hardwareTest.add(HardwareTestEnum.CAMERA.name());
-//                //取course缓存
-//                if (Objects.nonNull(examCourseCacheBean) && Objects.nonNull(examCourseCacheBean.getHasAudio()) && examCourseCacheBean.getHasAudio() == 1) {
-//                    this.hardwareTest.add(HardwareTestEnum.AUDIOPLAY.name());
-//                }
-//            }
-//        } else {
-//            this.setMonitorVideoSource(null);
-//        }
-//        this.openingSeconds = Objects.nonNull(openingSeconds) ? openingSeconds : ec.getOpeningSeconds();
-//        this.activityOpeningSeconds = openingSeconds;
-//        this.prepareSeconds = Objects.nonNull(examActivityCacheBean.getPrepareSeconds()) ? examActivityCacheBean.getPrepareSeconds() : ec.getPrepareSeconds();
-//        this.activityPrepareSeconds = examActivityCacheBean.getPrepareSeconds();
         this.minDurationSeconds = minDurationSeconds;
         this.minDurationSeconds = minDurationSeconds;
         this.maxDurationSeconds = Objects.nonNull(maxDurationSeconds) ? maxDurationSeconds : ec.getMaxDurationSeconds();
         this.maxDurationSeconds = Objects.nonNull(maxDurationSeconds) ? maxDurationSeconds : ec.getMaxDurationSeconds();
-//        this.activityMaxDurationSeconds = maxDurationSeconds;
-//        this.examCount = ec.getExamCount();
-//        this.forceFinish = forceFinish;
-//        this.inProcessFaceVerify = ec.getInProcessFaceVerify();
-//        this.inProcessFaceStrangerIgnore = ec.getInProcessFaceStrangerIgnore();
-//        this.inProcessLivenessVerify = ec.getInProcessLivenessVerify();
-//        this.inProcessRealnessVerify = ec.getInProcessRealnessVerify();
-//        if (Objects.nonNull(ec.getInProcessLivenessFixedRange())) {
-//            String[] longs = ec.getInProcessLivenessFixedRange().trim().split(",");
-//            List inProcessLivenessFixedRange = new ArrayList();
-//            for (int i = 0; i < longs.length; i++) {
-//                Integer integer = Integer.valueOf(longs[i].trim());
-//                inProcessLivenessFixedRange.add(integer);
-//            }
-//            if (Objects.equals(inProcessLivenessFixedRange.toString().trim().replaceAll(" ", ""), "")) {
-//                this.setInProcessLivenessFixedRange(null);
-//            } else {
-//                this.setInProcessLivenessFixedRange(inProcessLivenessFixedRange);
-//            }
-//        }
-//        this.inProcessLivenessJudgePolicy = ec.getInProcessLivenessJudgePolicy().name();
-//        this.startTime = startTime;
-//        this.finishTime = endTime;
         this.leftExamCount = (ec.getExamCount().intValue() - examStudentCacheBean.getAlreadyExamCount().intValue()) < 0 ? 0 : ec.getExamCount().intValue() - examStudentCacheBean.getAlreadyExamCount().intValue();
         this.leftExamCount = (ec.getExamCount().intValue() - examStudentCacheBean.getAlreadyExamCount().intValue()) < 0 ? 0 : ec.getExamCount().intValue() - examStudentCacheBean.getAlreadyExamCount().intValue();
-//        this.mobilePhotoUpload = ec.getMobilePhotoUpload();
-//        this.examId = ec.getId();
     }
     }
 
 
-//    public Integer getInProcessRealnessVerify() {
-//        return inProcessRealnessVerify;
-//    }
-//
-//    public void setInProcessRealnessVerify(Integer inProcessRealnessVerify) {
-//        this.inProcessRealnessVerify = inProcessRealnessVerify;
-//    }
-//
     public Long getExamId() {
     public Long getExamId() {
         return examId;
         return examId;
     }
     }
@@ -240,30 +102,6 @@ public class TEExamActivityWaitDto implements Serializable {
     public void setExamId(Long examId) {
     public void setExamId(Long examId) {
         this.examId = examId;
         this.examId = examId;
     }
     }
-//
-//    public Boolean getMonitorAudioEnable() {
-//        return monitorAudioEnable;
-//    }
-//
-//    public void setMonitorAudioEnable(Boolean monitorAudioEnable) {
-//        this.monitorAudioEnable = monitorAudioEnable;
-//    }
-//
-//    public List<String> getHardwareTest() {
-//        return hardwareTest;
-//    }
-//
-//    public void setHardwareTest(List<String> hardwareTest) {
-//        this.hardwareTest = hardwareTest;
-//    }
-//
-//    public Integer getMobilePhotoUpload() {
-//        return mobilePhotoUpload;
-//    }
-//
-//    public void setMobilePhotoUpload(Integer mobilePhotoUpload) {
-//        this.mobilePhotoUpload = mobilePhotoUpload;
-//    }
 
 
     public Integer getLeftExamCount() {
     public Integer getLeftExamCount() {
         return leftExamCount;
         return leftExamCount;
@@ -273,22 +111,6 @@ public class TEExamActivityWaitDto implements Serializable {
         this.leftExamCount = leftExamCount;
         this.leftExamCount = leftExamCount;
     }
     }
 
 
-//    public String getMonitorVideoSourceStr() {
-//        return monitorVideoSourceStr;
-//    }
-//
-//    public void setMonitorVideoSourceStr(String monitorVideoSourceStr) {
-//        this.monitorVideoSourceStr = monitorVideoSourceStr;
-//    }
-//
-//    public String getInProcessLivenessFixedRangeStr() {
-//        return inProcessLivenessFixedRangeStr;
-//    }
-//
-//    public void setInProcessLivenessFixedRangeStr(String inProcessLivenessFixedRangeStr) {
-//        this.inProcessLivenessFixedRangeStr = inProcessLivenessFixedRangeStr;
-//    }
-
     public Long getPrepareTime() {
     public Long getPrepareTime() {
         return prepareTime;
         return prepareTime;
     }
     }
@@ -321,14 +143,6 @@ public class TEExamActivityWaitDto implements Serializable {
         this.maxFinishTime = maxFinishTime;
         this.maxFinishTime = maxFinishTime;
     }
     }
 
 
-//    public List<String> getMonitorVideoSource() {
-//        return monitorVideoSource;
-//    }
-//
-//    public void setMonitorVideoSource(List<String> monitorVideoSource) {
-//        this.monitorVideoSource = monitorVideoSource;
-//    }
-
     public Long getId() {
     public Long getId() {
         return id;
         return id;
     }
     }
@@ -337,14 +151,6 @@ public class TEExamActivityWaitDto implements Serializable {
         this.id = id;
         this.id = id;
     }
     }
 
 
-//    public String getCode() {
-//        return code;
-//    }
-//
-//    public void setCode(String code) {
-//        this.code = code;
-//    }
-
     public Long getExamStudentId() {
     public Long getExamStudentId() {
         return examStudentId;
         return examStudentId;
     }
     }
@@ -369,38 +175,6 @@ public class TEExamActivityWaitDto implements Serializable {
         this.courseName = courseName;
         this.courseName = courseName;
     }
     }
 
 
-//    public Integer getOpeningSeconds() {
-//        return openingSeconds;
-//    }
-//
-//    public void setOpeningSeconds(Integer openingSeconds) {
-//        this.openingSeconds = openingSeconds;
-//    }
-//
-//    public Integer getActivityOpeningSeconds() {
-//        return activityOpeningSeconds;
-//    }
-//
-//    public void setActivityOpeningSeconds(Integer activityOpeningSeconds) {
-//        this.activityOpeningSeconds = activityOpeningSeconds;
-//    }
-//
-//    public Integer getPrepareSeconds() {
-//        return prepareSeconds;
-//    }
-//
-//    public void setPrepareSeconds(Integer prepareSeconds) {
-//        this.prepareSeconds = prepareSeconds;
-//    }
-//
-//    public Integer getActivityPrepareSeconds() {
-//        return activityPrepareSeconds;
-//    }
-//
-//    public void setActivityPrepareSeconds(Integer activityPrepareSeconds) {
-//        this.activityPrepareSeconds = activityPrepareSeconds;
-//    }
-
     public Integer getMinDurationSeconds() {
     public Integer getMinDurationSeconds() {
         return minDurationSeconds;
         return minDurationSeconds;
     }
     }
@@ -417,99 +191,20 @@ public class TEExamActivityWaitDto implements Serializable {
         this.maxDurationSeconds = maxDurationSeconds;
         this.maxDurationSeconds = maxDurationSeconds;
     }
     }
 
 
-//    public Integer getActivityMaxDurationSeconds() {
-//        return activityMaxDurationSeconds;
-//    }
-//
-//    public void setActivityMaxDurationSeconds(Integer activityMaxDurationSeconds) {
-//        this.activityMaxDurationSeconds = activityMaxDurationSeconds;
-//    }
-//
-//    public void setInProcessLivenessFixedRange(List<Integer> inProcessLivenessFixedRange) {
-//        this.inProcessLivenessFixedRange = inProcessLivenessFixedRange;
-//    }
-//
-//    public Integer getExamCount() {
-//        return examCount;
-//    }
-//
-//    public void setExamCount(Integer examCount) {
-//        this.examCount = examCount;
-//    }
-//
-//    public Integer getForceFinish() {
-//        return forceFinish;
-//    }
-//
-//    public void setForceFinish(Integer forceFinish) {
-//        this.forceFinish = forceFinish;
-//    }
-//
-//    public String getEntryAuthenticationPolicy() {
-//        return entryAuthenticationPolicy;
-//    }
-//
-//    public void setEntryAuthenticationPolicy(String entryAuthenticationPolicy) {
-//        this.entryAuthenticationPolicy = entryAuthenticationPolicy;
-//    }
-//
-//    public Integer getInProcessFaceVerify() {
-//        return inProcessFaceVerify;
-//    }
-//
-//    public void setInProcessFaceVerify(Integer inProcessFaceVerify) {
-//        this.inProcessFaceVerify = inProcessFaceVerify;
-//    }
-//
-//    public Integer getInProcessFaceStrangerIgnore() {
-//        return inProcessFaceStrangerIgnore;
-//    }
-//
-//    public void setInProcessFaceStrangerIgnore(Integer inProcessFaceStrangerIgnore) {
-//        this.inProcessFaceStrangerIgnore = inProcessFaceStrangerIgnore;
-//    }
-//
-//    public Integer getInProcessLivenessVerify() {
-//        return inProcessLivenessVerify;
-//    }
-//
-//    public void setInProcessLivenessVerify(Integer inProcessLivenessVerify) {
-//        this.inProcessLivenessVerify = inProcessLivenessVerify;
-//    }
-//
-//    public List<Integer> getInProcessLivenessFixedRange() {
-//        return inProcessLivenessFixedRange;
-//    }
-//
-//    public String getInProcessLivenessJudgePolicy() {
-//        return inProcessLivenessJudgePolicy;
-//    }
-//
-//    public void setInProcessLivenessJudgePolicy(String inProcessLivenessJudgePolicy) {
-//        this.inProcessLivenessJudgePolicy = inProcessLivenessJudgePolicy;
-//    }
-//
-//    public Integer getCameraPhotoUpload() {
-//        return cameraPhotoUpload;
-//    }
-//
-//    public void setCameraPhotoUpload(Integer cameraPhotoUpload) {
-//        this.cameraPhotoUpload = cameraPhotoUpload;
-//    }
-//
-//    public Long getStartTime() {
-//        return startTime;
-//    }
-//
-//    public void setStartTime(Long startTime) {
-//        this.startTime = startTime;
-//    }
-//
-//    public Long getFinishTime() {
-//        return finishTime;
-//    }
-//
-//    public void setFinishTime(Long finishTime) {
-//        this.finishTime = finishTime;
-//    }
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        TEExamActivityWaitDto that = (TEExamActivityWaitDto) o;
+        return id.equals(that.id) && examStudentId.equals(that.examStudentId) && courseCode.equals(that.courseCode) && courseName.equals(that.courseName) && prepareTime.equals(that.prepareTime) && minStartTime.equals(that.minStartTime) && maxStartTime.equals(that.maxStartTime) && maxFinishTime.equals(that.maxFinishTime) && minDurationSeconds.equals(that.minDurationSeconds) && maxDurationSeconds.equals(that.maxDurationSeconds) && leftExamCount.equals(that.leftExamCount) && examId.equals(that.examId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, examStudentId, courseCode, courseName, prepareTime, minStartTime, maxStartTime, maxFinishTime, minDurationSeconds, maxDurationSeconds, leftExamCount, examId);
+    }
 }
 }

+ 18 - 0
themis-business/src/main/java/com/qmth/themis/business/entity/TBUserRole.java

@@ -9,6 +9,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
+import java.util.Objects;
 
 
 /**
 /**
  * @Description: 用户角色
  * @Description: 用户角色
@@ -73,4 +74,21 @@ public class TBUserRole implements Serializable {
     public void setRoleCode(String roleCode) {
     public void setRoleCode(String roleCode) {
         this.roleCode = roleCode;
         this.roleCode = roleCode;
     }
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        TBUserRole that = (TBUserRole) o;
+        return id.equals(that.id) && userId.equals(that.userId) && roleCode.equals(that.roleCode);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, userId, roleCode);
+    }
 }
 }