Commit 72047ffc by 邓敏

Merge branch '2.7.1人脸识别版本' into websocker

2 parents ea11f978 0f667e75
Showing with 920 additions and 107 deletions
package com.subsidy.common.configure;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "activity")
public class ActivityDetectionConfig {
private Long captchaAppId;
private String appSecretKey;
private Long businessId;
}
......@@ -62,6 +62,16 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
TimeRequired timeRequired = method.getAnnotation(TimeRequired.class);
if (timeRequired !=null){
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
if (hour<6){
throw new HttpException(17001);
}
}
LoginRequired methodAnnotation = method.getAnnotation(LoginRequired.class);
if (methodAnnotation != null) {
String authorization = request.getHeader("Authorization");
......@@ -111,15 +121,6 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
}
throw new HttpException(1010);
}
TimeRequired timeRequired = method.getAnnotation(TimeRequired.class);
if (timeRequired !=null){
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
if (hour<6){
throw new HttpException(17001);
}
}
return true;
}
......
package com.subsidy.controller;
import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO;
import com.subsidy.common.interceptor.TimeRequired;
import com.subsidy.dto.detection.VerifyDTO;
import com.subsidy.model.ActivityDetectionDO;
import com.subsidy.service.ActivityDetectionService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import javax.servlet.http.HttpServletRequest;
/**
* <p>
* 活跃度检测表 前端控制器
* </p>
*
* @author DengMin
* @since 2022-07-13
*/
@RestController
@Api(tags = "活跃度检测表")
@RequestMapping("/activityDetection")
public class ActivityDetectionController {
@Autowired
private ActivityDetectionService activityDetectionService;
@PostMapping("verify")
@ApiOperation("验证滑块 ticket randStr memberId classId")
@TimeRequired
public ResponseVO verify(@RequestBody VerifyDTO verifyDTO, HttpServletRequest request){
return ResponseData.generateCreatedResponse(0,activityDetectionService.verify(verifyDTO,request));
}
@PostMapping("getCheckHistory")
@ApiOperation("获取某个人某个课程的活跃度验证详情 memberId classId")
public ResponseVO getCheckHistory(@RequestBody ActivityDetectionDO activityDetectionDO){
return ResponseData.generateCreatedResponse(0,activityDetectionService.getCheckHistory(activityDetectionDO));
}
}
......@@ -42,11 +42,11 @@ public class AdministerController {
@Autowired
private AdministerService administerService;
@GetMapping("getIp")
public String getIp()throws Exception{
InetAddress addr = InetAddress.getLocalHost();
return addr.getHostAddress();
}
// @GetMapping("getIp")
// public String getIp()throws Exception{
// InetAddress addr = InetAddress.getLocalHost();
// return addr.getHostAddress();
// }
@PostMapping("/login")
@ApiOperation("登录接口 accountName password")
......@@ -97,8 +97,8 @@ public class AdministerController {
}
@PostMapping("classDetail")
@ApiOperation("班级管理--班级成员 id 班级id userName")
// @LoginRequired
@ApiOperation("班级管理--班级成员 id 班级id userName pageSize pageNum")
@LoginRequired
public ResponseVO classDetail(@RequestBody ClassDetailDTO classDetailDTO){
return ResponseData.generateCreatedResponse(0,administerService.classDetail(classDetailDTO));
}
......@@ -112,7 +112,7 @@ public class AdministerController {
}
@PostMapping("signDetail")
@ApiOperation("班级管理--注册签到 id 班级id userName")
@ApiOperation("班级管理--注册签到 id 班级id userName pageSize pageNum")
@LoginRequired
public ResponseVO signDetail(@RequestBody ClassDetailDTO classDetailDTO){
return ResponseData.generateCreatedResponse(0,administerService.signDetail(classDetailDTO));
......@@ -127,7 +127,7 @@ public class AdministerController {
}
@PostMapping("exerciseTest")
@ApiOperation("班级管理--测评成绩 id 班级id userName paperId")
@ApiOperation("班级管理--测评成绩 id 班级id userName paperId pageSize pageNum")
@LoginRequired
public ResponseVO exerciseTest(@RequestBody ClassDetailDTO classDetailDTO){
return ResponseData.generateCreatedResponse(0,administerService.exerciseTest(classDetailDTO));
......@@ -212,6 +212,28 @@ public class AdministerController {
return ResponseData.generateCreatedResponse(0,administerService.memberStudy(memberStudyLogDTO));
}
@PostMapping("memberDetectionRecord")
@ApiOperation("获取某个班级活跃度检测记录 id userName pageSize pageNum ")
@LoginRequired
public ResponseVO memberDetectionRecord(@RequestBody ClassDetailDTO classDetailDTO ){
return ResponseData.generateCreatedResponse(0,administerService.memberDetectionRecord(classDetailDTO));
}
@PostMapping("exportMemberDetectionRecord")
@ApiOperation("获取某个班级活跃度检测记录 id userName ")
@LoginRequired
public void exportMemberDetectionRecord(@RequestBody ClassDetailDTO classDetailDTO ){
administerService.exportMemberDetectionRecord(classDetailDTO);
}
@PostMapping("imageCheckDetail")
@ApiOperation("实名制验证详情 id 班级id userName pageSize pageNum")
@LoginRequired
public ResponseVO imageCheckDetail(@RequestBody ClassDetailDTO classDetailDTO){
return ResponseData.generateCreatedResponse(0,administerService.imageCheckDetail(classDetailDTO));
}
@PostMapping("exportZip")
@ApiOperation("下载压缩包 id 班级id")
@CrossOrigin
......@@ -235,7 +257,7 @@ public class AdministerController {
}
@PostMapping("manageMember")
@ApiOperation("用户管理 {pageSize pageNum userName:名字}")
@ApiOperation("用户管理 {pageSize pageNum userName:名字 【废弃】}")
@LoginRequired
public ResponseVO manageMember(@RequestBody ManageMemberDTO manageMemberDTO){
return ResponseData.generateCreatedResponse(0,administerService.manageMember(manageMemberDTO));
......
......@@ -6,7 +6,9 @@ import com.subsidy.common.ResponseVO;
import com.subsidy.common.interceptor.LoginRequired;
import com.subsidy.dto.administer.OperatorsDTO;
import com.subsidy.dto.company.AddCompanyDTO;
import com.subsidy.dto.company.GetCompanyMembersDTO;
import com.subsidy.model.CompanyDictDO;
import com.subsidy.model.MemberDO;
import com.subsidy.service.CompanyDictService;
import com.subsidy.util.ConstantUtils;
import io.swagger.annotations.Api;
......@@ -63,8 +65,16 @@ public class CompanyDictController {
@PostMapping("getAllCompany")
@ApiOperation("获取全部企业 {companyName}")
@LoginRequired
public ResponseVO getAllCompany(@RequestBody CompanyDictDO companyDictDO){
return ResponseData.generateCreatedResponse(0,companyDictService.getAllCompany(companyDictDO));
}
@PostMapping("getCompanyMembers")
@ApiOperation("获取公司里的成员 pageNum pageSize companyId 公司id userName 成员名称")
@LoginRequired
public ResponseVO getCompanyMembers(@RequestBody GetCompanyMembersDTO getCompanyMembersDTO){
return ResponseData.generateCreatedResponse(0,companyDictService.getCompanyMembers(getCompanyMembersDTO));
}
}
package com.subsidy.controller;
import com.subsidy.common.ResponseData;
import com.subsidy.common.ResponseVO;
import com.subsidy.common.interceptor.LoginRequired;
import com.subsidy.model.ImageCheckRecordDO;
import com.subsidy.service.ImageCheckRecordService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
/**
* <p>
* 实名验证记录表 前端控制器
* </p>
*
* @author DengMin
* @since 2022-07-14
*/
@RestController
@Api(tags = "实名验证记录表")
@RequestMapping("/imageCheckRecord")
public class ImageCheckRecordController {
@Autowired
private ImageCheckRecordService imageCheckRecordService;
@PostMapping("getImageCheckHistory")
@ApiOperation("获取某人某个班级的验证历史 memberId classId ")
@LoginRequired
public ResponseVO getImageCheckHistory(@RequestBody ImageCheckRecordDO imageCheckRecordDO){
return ResponseData.generateCreatedResponse(0,imageCheckRecordService.getImageCheckHistory(imageCheckRecordDO));
}
}
......@@ -63,14 +63,12 @@ public class MemberController {
@PostMapping(value = "/login")
@ApiOperation("手机端:登录:telephone/手机号, verifyCode/验证码")
@TimeRequired
public ResponseVO login(@RequestBody VerifyCodeDTO verifyCodeDTO) {
return ResponseData.generateCreatedResponse(0, memberService.login(verifyCodeDTO));
}
@PostMapping("passwordLogin")
@ApiOperation("手机端:密码登录 { companyId accountName password}")
@TimeRequired
public ResponseVO passwordLogin(@RequestBody PasswordLoginDTO passwordLoginDTO){
return ResponseData.generateCreatedResponse(0,memberService.passwordLogin(passwordLoginDTO));
}
......@@ -89,6 +87,12 @@ public class MemberController {
return ResponseData.generateCreatedResponse(0,memberService.kunchiLogin(qingxuetangLoginDTO));
}
@PostMapping("checkStatus")
@ApiOperation("实名制验证状态 memberId")
@TimeRequired
public ResponseVO checkStatus(@RequestBody MemberDO memberDO){
return ResponseData.generateCreatedResponse(0,memberService.checkStatus(memberDO));
}
@PostMapping("updatePassword")
@ApiOperation("修改密码 {id password}")
......@@ -98,10 +102,17 @@ public class MemberController {
return ResponseData.generateCreatedResponse(0,memberService.updatePassword(memberDO));
}
@PostMapping("studyPage")
@ApiOperation("[废弃]手机端:学习主页 id 学员id")
public ResponseVO studyPage(@RequestBody MemberDO memberDO){
return ResponseData.generateCreatedResponse(0,memberService.studyPage(memberDO));
@PostMapping("updateCheckImage")
@ApiOperation("上传采集照片 id checkImage")
@TimeRequired
public ResponseVO updateCheckImage(@RequestBody MemberDO memberDO){
return ResponseData.generateCreatedResponse(0,memberService.updateCheckImage(memberDO));
}
@PostMapping("removeCheckImage")
@ApiOperation("清除采集照片 id ")
public ResponseVO removeCheckImage(@RequestBody MemberDO memberDO){
return ResponseData.generateCreatedResponse(0,memberService.removeCheckImage(memberDO));
}
@PostMapping("myCourses")
......
package com.subsidy.dto.company;
import lombok.Data;
@Data
public class GetCompanyMembersDTO {
private Integer pageSize;
private Integer pageNum;
private Long companyId;
private String userName;
}
package com.subsidy.dto.detection;
import lombok.Data;
@Data
public class VerifyDTO {
private String ticket;
private String userIp;
private String randStr;
private Long memberId;
private Long classId;
}
package com.subsidy.mapper;
import com.subsidy.model.ActivityDetectionDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
/**
* <p>
* 活跃度检测表 Mapper 接口
* </p>
*
* @author DengMin
* @since 2022-07-13
*/
@Repository
public interface ActivityDetectionMapper extends BaseMapper<ActivityDetectionDO> {
}
......@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.model.AdministerDO;
import com.subsidy.vo.administer.ExerciseTestVO;
import com.subsidy.vo.administer.ImageCheckDetailVO;
import com.subsidy.vo.administer.MemberDetectionRecordVO;
import com.subsidy.vo.administer.PermissionsVO;
import com.subsidy.vo.classdict.ClassDetailVO;
import com.subsidy.vo.member.ClassSignVO;
......@@ -45,5 +47,14 @@ public interface AdministerMapper extends BaseMapper<AdministerDO> {
*/
IPage<AnswerRecordVO> answerRecord(IPage iPage, Long classId, String userName);
/**
* 活跃度检测
*/
IPage<MemberDetectionRecordVO> classActivityDetection(IPage iPage, Long classId, String userName);
/**
* 实名验证
*/
IPage<ImageCheckDetailVO> imageCheckDetail(IPage iPage, Long classId, String userName);
}
......@@ -3,8 +3,10 @@ package com.subsidy.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.model.CompanyDictDO;
import com.subsidy.model.MemberDO;
import com.subsidy.vo.administer.OperatorsVO;
import com.subsidy.vo.company.GetAllCompanyVO;
import com.subsidy.vo.company.GetCompanyMembersVO;
import org.springframework.stereotype.Repository;
import java.util.List;
......@@ -22,13 +24,20 @@ public interface CompanyDictMapper extends BaseMapper<CompanyDictDO> {
/**
* 企业管理--查找所有主账号 、运营者
*
* @return
*/
IPage<OperatorsVO> operators(IPage page, String companyName,Long fieldId,Long id,Integer role,String superviseName);
IPage<OperatorsVO> operators(IPage page, String companyName, Long fieldId, Long id, Integer role, String superviseName);
/**
* 查找所有的公司名称
*/
List<GetAllCompanyVO> getAllCompany(CompanyDictDO companyDictDO);
/**
* 查看某个公司的学生
*/
IPage<GetCompanyMembersVO> getCompanyMembers(IPage page, Long companyId, String userName);
}
package com.subsidy.mapper;
import com.subsidy.model.ImageCheckRecordDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
/**
* <p>
* 实名验证记录表 Mapper 接口
* </p>
*
* @author DengMin
* @since 2022-07-14
*/
@Repository
public interface ImageCheckRecordMapper extends BaseMapper<ImageCheckRecordDO> {
}
......@@ -70,4 +70,11 @@ public interface MemberMapper extends BaseMapper<MemberDO> {
List<MemberDO> getMemberListBySignInRecord(Long classId);
List<MemberDO> getUnfinishedMemberList(Long classId);
/**
* 清除采集照片
*/
void removeCheckImage(Long id);
}
package com.subsidy.model;
import com.subsidy.util.BaseModel;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 活跃度检测表
* </p>
*
* @author DengMin
* @since 2022-07-13
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("activity_detection")
public class ActivityDetectionDO extends BaseModel {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 班级id
*/
private Long classId;
/**
* 人员id
*/
private Long memberId;
/**
* 成功/失败
*/
private Integer status;
/**
* RequestId
*/
private String requestId;
}
......@@ -66,6 +66,9 @@ public class ExerciseDoneResultDO extends BaseModel {
*/
private String result;
/**
* 做题时长
*/
private Integer length;
}
package com.subsidy.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.subsidy.util.BaseModel;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 实名验证记录表
* </p>
*
* @author DengMin
* @since 2022-07-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("image_check_record")
public class ImageCheckRecordDO extends BaseModel {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 班级id
*/
private Long classId;
/**
* 试卷id
*/
private Long paperId;
/**
* 成员id
*/
private Long memberId;
private String requestId;
/**
* 图片地址
*/
private String imageUrl;
}
......@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
import java.util.Date;
/**
......@@ -85,6 +86,16 @@ public class MemberDO extends BaseModel {
private String image;
/**
* 人脸核验--照片
*/
private String checkImage;
/**
* 采集时间
*/
private LocalDateTime checkTime;
/**
* 身份证号
*/
private String idCard;
......
......@@ -37,4 +37,9 @@ public class OprMemDictDO extends BaseModel {
*/
private Integer result;
/**
* 登录ip
*/
private String ipAddress;
}
package com.subsidy.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.dto.detection.VerifyDTO;
import com.subsidy.model.ActivityDetectionDO;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* <p>
* 活跃度检测表 服务类
* </p>
*
* @author DengMin
* @since 2022-07-13
*/
public interface ActivityDetectionService extends IService<ActivityDetectionDO> {
String verify(VerifyDTO verifyDTO, HttpServletRequest request);
IPage<ActivityDetectionDO> getCheckHistory(ActivityDetectionDO activityDetectionDO);
}
......@@ -68,6 +68,12 @@ public interface AdministerService extends IService<AdministerDO> {
void exportClassVodDailyInfo(ClassVodDailyInfoDTO classVodDailyInfoDTO);
IPage memberDetectionRecord(ClassDetailDTO classDetailDTO);
void exportMemberDetectionRecord(ClassDetailDTO classDetailDTO);
IPage<ImageCheckDetailVO> imageCheckDetail(ClassDetailDTO classDetailDTO);
void export(ClassDetailDTO classDetailDTO)throws Exception;
IPage memberStudy(MemberStudyLogDTO memberStudyLogDTO);
......
......@@ -4,9 +4,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.subsidy.dto.administer.OperatorsDTO;
import com.subsidy.dto.company.AddCompanyDTO;
import com.subsidy.dto.company.GetCompanyMembersDTO;
import com.subsidy.model.CompanyDictDO;
import com.subsidy.model.MemberDO;
import com.subsidy.vo.administer.OperatorsVO;
import com.subsidy.vo.company.GetAllCompanyVO;
import com.subsidy.vo.company.GetCompanyMembersVO;
import java.util.List;
......@@ -30,4 +33,6 @@ public interface CompanyDictService extends IService<CompanyDictDO> {
List<GetAllCompanyVO> getAllCompany(CompanyDictDO companyDictDO);
IPage<GetCompanyMembersVO> getCompanyMembers(GetCompanyMembersDTO getCompanyMembersDTO);
}
package com.subsidy.service;
import com.subsidy.model.ImageCheckRecordDO;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 实名验证记录表 服务类
* </p>
*
* @author DengMin
* @since 2022-07-14
*/
public interface ImageCheckRecordService extends IService<ImageCheckRecordDO> {
List<ImageCheckRecordDO> getImageCheckHistory(ImageCheckRecordDO imageCheckRecordDO);
}
......@@ -39,9 +39,13 @@ public interface MemberService extends IService<MemberDO> {
UserRoleVO kunchiLogin(QingxuetangLoginDTO qingxuetangLoginDTO);
CheckStatusVO checkStatus(MemberDO memberDO);
String updatePassword(MemberDO memberDO);
MemberStudyPageVO studyPage(MemberDO memberDO);
String updateCheckImage(MemberDO memberDO);
String removeCheckImage(MemberDO memberDO);
List<MyCoursesVO> myCourses(MyCoursesDTO myCoursesDTO);
......
package com.subsidy.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.subsidy.common.configure.ActivityDetectionConfig;
import com.subsidy.common.configure.VODConfig;
import com.subsidy.common.configure.WechatConfig;
import com.subsidy.dto.detection.VerifyDTO;
import com.subsidy.model.ActivityDetectionDO;
import com.subsidy.mapper.ActivityDetectionMapper;
import com.subsidy.service.ActivityDetectionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.util.ConstantUtils;
import com.tencentcloudapi.captcha.v20190722.CaptchaClient;
import com.tencentcloudapi.captcha.v20190722.models.DescribeCaptchaResultRequest;
import com.tencentcloudapi.captcha.v20190722.models.DescribeCaptchaResultResponse;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
/**
* <p>
* 活跃度检测表 服务实现类
* </p>
*
* @author DengMin
* @since 2022-07-13
*/
@Service
public class ActivityDetectionServiceImpl extends ServiceImpl<ActivityDetectionMapper, ActivityDetectionDO> implements ActivityDetectionService {
@Autowired
private ActivityDetectionConfig activityDetectionConfig;
@Autowired
private VODConfig vodConfig;
public String verify(VerifyDTO verifyDTO, HttpServletRequest request){
try{
// 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
// 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
Credential cred = new Credential(vodConfig.getSecretId(),vodConfig.getSecretKey());
// 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("captcha.tencentcloudapi.com");
// 实例化一个client选项,可选的,没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
CaptchaClient client = new CaptchaClient(cred, "", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
DescribeCaptchaResultRequest req = new DescribeCaptchaResultRequest();
req.setCaptchaType(9L);
req.setTicket(verifyDTO.getTicket());
// String ip = request.getHeader("x-forwarded-for");
String ip = request.getHeader( " x-forwarded-for " );
if (ip == null || ip.length() == 0 || " unknown " .equalsIgnoreCase(ip)) {
ip = request.getHeader( " Proxy-Client-IP " );
}
if (ip == null || ip.length() == 0 || " unknown " .equalsIgnoreCase(ip)) {
ip = request.getHeader( " WL-Proxy-Client-IP " );
}
if (ip == null || ip.length() == 0 || " unknown " .equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
req.setUserIp(ip);
req.setRandstr(verifyDTO.getRandStr());
req.setCaptchaAppId(activityDetectionConfig.getCaptchaAppId());
req.setAppSecretKey(activityDetectionConfig.getAppSecretKey());
req.setBusinessId(activityDetectionConfig.getBusinessId());
// 返回的resp是一个DescribeCaptchaResultResponse的实例,与请求对象对应
DescribeCaptchaResultResponse resp = client.DescribeCaptchaResult(req);
// 输出json格式的字符串回包
System.out.println(DescribeCaptchaResultResponse.toJsonString(resp));
ActivityDetectionDO activityDetectionDO = new ActivityDetectionDO();
activityDetectionDO.setClassId(verifyDTO.getClassId());
activityDetectionDO.setMemberId(verifyDTO.getMemberId());
activityDetectionDO.setRequestId(resp.getRequestId());
if (resp.getCaptchaCode()==1){
activityDetectionDO.setStatus(1);
this.baseMapper.insert(activityDetectionDO);
return ConstantUtils.SUCCESS_VERIFY;
}else {
activityDetectionDO.setStatus(0);
this.baseMapper.insert(activityDetectionDO);
return ConstantUtils.FAIL_VERIFY;
}
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
return null;
}
public IPage<ActivityDetectionDO> getCheckHistory(ActivityDetectionDO activityDetectionDO){
return null;
}
}
......@@ -8,6 +8,7 @@ import com.subsidy.common.RedisPrefixConstant;
import com.subsidy.common.exception.HttpException;
import com.subsidy.dto.administer.OperatorsDTO;
import com.subsidy.dto.company.AddCompanyDTO;
import com.subsidy.dto.company.GetCompanyMembersDTO;
import com.subsidy.mapper.AdministerMapper;
import com.subsidy.mapper.ClassHourDictMapper;
import com.subsidy.mapper.ClassTypeDictMapper;
......@@ -19,22 +20,13 @@ import com.subsidy.mapper.JobDictMapper;
import com.subsidy.mapper.RankDictMapper;
import com.subsidy.mapper.RoleAdministerMappingMapper;
import com.subsidy.mapper.RotationImgDictMapper;
import com.subsidy.model.AdministerDO;
import com.subsidy.model.ClassHourDictDO;
import com.subsidy.model.ClassTypeDictDO;
import com.subsidy.model.CompanyDictDO;
import com.subsidy.model.CompanyFieldMappingDO;
import com.subsidy.model.DepartmentDictDO;
import com.subsidy.model.FieldDictDO;
import com.subsidy.model.JobDictDO;
import com.subsidy.model.RankDictDO;
import com.subsidy.model.RoleAdministerMappingDO;
import com.subsidy.model.RotationImgDictDO;
import com.subsidy.model.*;
import com.subsidy.service.CompanyDictService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.subsidy.util.ConstantUtils;
import com.subsidy.vo.administer.OperatorsVO;
import com.subsidy.vo.company.GetAllCompanyVO;
import com.subsidy.vo.company.GetCompanyMembersVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
......@@ -64,9 +56,6 @@ public class CompanyDictServiceImpl extends ServiceImpl<CompanyDictMapper, Compa
@Autowired
private DepartmentDictMapper departmentDictMapper;
//@Autowired
//private RedisUtil redisUtil;
@Autowired
private FieldDictMapper fieldDictMapper;
......@@ -96,13 +85,13 @@ public class CompanyDictServiceImpl extends ServiceImpl<CompanyDictMapper, Compa
//判断该用户的角色
Integer count = roleAdministerMappingMapper.selectCount(new QueryWrapper<RoleAdministerMappingDO>()
.lambda()
.eq(RoleAdministerMappingDO::getAdministerId,operatorsDTO.getId())
.eq(RoleAdministerMappingDO::getRoleId,1));
.eq(RoleAdministerMappingDO::getAdministerId, operatorsDTO.getId())
.eq(RoleAdministerMappingDO::getRoleId, 1));
if (count > 0){
if (count > 0) {
administerDO.setCompanyId(null);
}
IPage page = this.baseMapper.operators(pager, operatorsDTO.getCompanyName(), operatorsDTO.getFieldId(),administerDO.getCompanyId(),2,operatorsDTO.getSuperviseName());
IPage page = this.baseMapper.operators(pager, operatorsDTO.getCompanyName(), operatorsDTO.getFieldId(), administerDO.getCompanyId(), 2, operatorsDTO.getSuperviseName());
List<OperatorsVO> operatorsVOS = page.getRecords();
for (OperatorsVO operatorsVO : operatorsVOS) {
//查看公司所在行业
......@@ -183,7 +172,7 @@ public class CompanyDictServiceImpl extends ServiceImpl<CompanyDictMapper, Compa
List<JobDictDO> jobDictDOS = jobDictMapper.selectList(new QueryWrapper<JobDictDO>()
.lambda()
.isNull(JobDictDO::getCompanyId));
for (JobDictDO jobDictDO : jobDictDOS){
for (JobDictDO jobDictDO : jobDictDOS) {
jobDictDO.setCompanyId(companyDictDO.getId());
jobDictMapper.insert(jobDictDO);
}
......@@ -192,7 +181,7 @@ public class CompanyDictServiceImpl extends ServiceImpl<CompanyDictMapper, Compa
List<RankDictDO> rankDictDOS = rankDictMapper.selectList(new QueryWrapper<RankDictDO>()
.lambda()
.isNull(RankDictDO::getCompanyId));
for (RankDictDO rankDictDO : rankDictDOS){
for (RankDictDO rankDictDO : rankDictDOS) {
rankDictDO.setCompanyId(companyDictDO.getId());
rankDictMapper.insert(rankDictDO);
}
......@@ -201,7 +190,7 @@ public class CompanyDictServiceImpl extends ServiceImpl<CompanyDictMapper, Compa
List<RotationImgDictDO> rotationImgDictDOS = rotationImgDictMapper.selectList(new QueryWrapper<RotationImgDictDO>()
.lambda()
.isNull(RotationImgDictDO::getCompanyId));
for (RotationImgDictDO rotationImgDictDO : rotationImgDictDOS){
for (RotationImgDictDO rotationImgDictDO : rotationImgDictDOS) {
rotationImgDictDO.setCompanyId(companyDictDO.getId());
rotationImgDictMapper.insert(rotationImgDictDO);
}
......@@ -248,7 +237,7 @@ public class CompanyDictServiceImpl extends ServiceImpl<CompanyDictMapper, Compa
//查找企业管理员
AdministerDO administerDO = roleAdministerMappingMapper.getAdminister(addCompanyDTO.getId());
if (null !=administerDO){
if (null != administerDO) {
if (StringUtils.isNotBlank(addCompanyDTO.getAccountName())) {
administerDO.setAccountName(addCompanyDTO.getAccountName());
}
......@@ -264,4 +253,10 @@ public class CompanyDictServiceImpl extends ServiceImpl<CompanyDictMapper, Compa
return this.baseMapper.getAllCompany(companyDictDO);
}
public IPage<GetCompanyMembersVO> getCompanyMembers(GetCompanyMembersDTO getCompanyMembersDTO) {
Page pager = new Page(getCompanyMembersDTO.getPageNum(), getCompanyMembersDTO.getPageSize());
return this.baseMapper.getCompanyMembers(pager,getCompanyMembersDTO.getCompanyId(),getCompanyMembersDTO.getUserName());
}
}
package com.subsidy.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.subsidy.model.ImageCheckRecordDO;
import com.subsidy.mapper.ImageCheckRecordMapper;
import com.subsidy.service.ImageCheckRecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 实名验证记录表 服务实现类
* </p>
*
* @author DengMin
* @since 2022-07-14
*/
@Service
public class ImageCheckRecordServiceImpl extends ServiceImpl<ImageCheckRecordMapper, ImageCheckRecordDO> implements ImageCheckRecordService {
public List<ImageCheckRecordDO> getImageCheckHistory(ImageCheckRecordDO imageCheckRecordDO){
return this.baseMapper.selectList(new QueryWrapper<ImageCheckRecordDO>()
.lambda()
.eq(ImageCheckRecordDO::getClassId,imageCheckRecordDO.getClassId())
.eq(ImageCheckRecordDO::getMemberId,imageCheckRecordDO.getMemberId())
.orderByDesc(ImageCheckRecordDO::getCreateDate));
}
}
......@@ -682,49 +682,42 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper, MemberDO> imple
return userRoleVO;
}
public String updatePassword(MemberDO memberDO) {
this.baseMapper.updateById(memberDO);
//MemberDO memberDO1 = this.baseMapper.selectById(memberDO.getId());
//redisUtil.set(RedisPrefixConstant.SUBSIDY_COMPANY_MEMBER_PREFIX + memberDO1.getCompanyId() + ":" + memberDO.getAccountName(), memberDO);
return ConstantUtils.SET_SUCCESS;
}
public CheckStatusVO checkStatus(MemberDO memberDO) {
public MemberStudyPageVO studyPage(MemberDO memberDO) {
MemberStudyPageVO memberStudyPageVO = new MemberStudyPageVO();
List<StudyPageVO> studyPageVOS = this.baseMapper.studyPage(memberDO);
CheckStatusVO checkStatusVO = new CheckStatusVO();
MemberDO memberDO1 = this.baseMapper.selectById(memberDO.getId());
final ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
for (StudyPageVO studyPageVO : studyPageVOS) {
//查看课程下有几节课
List<VodDictDO> vodDictDOS = courseContentMapper.getCourseVods(studyPageVO.getId());
studyPageVO.setTotalVods(vodDictDOS.size());
newCachedThreadPool.submit(() -> studyPageTask1(studyPageVO, vodDictDOS, memberDO.getId()));
if (StringUtils.isEmpty(memberDO1.getCheckImage())) {
checkStatusVO.setImageStatus(false);
} else {
checkStatusVO.setImageStatus(true);
}
newCachedThreadPool.shutdown();
memberStudyPageVO.setStudyPageVOS(studyPageVOS);
return memberStudyPageVO;
if (memberDO1.getFirstLogin() == 1) {
checkStatusVO.setSMSStatus(true);
} else {
checkStatusVO.setSMSStatus(false);
}
public Future<StudyPageVO> studyPageTask1(StudyPageVO studyPageVO, List<VodDictDO> vodDictDOS, Long memberId) {
return checkStatusVO;
}
int i = 0;
public String updatePassword(MemberDO memberDO) {
this.baseMapper.updateById(memberDO);
//MemberDO memberDO1 = this.baseMapper.selectById(memberDO.getId());
//redisUtil.set(RedisPrefixConstant.SUBSIDY_COMPANY_MEMBER_PREFIX + memberDO1.getCompanyId() + ":" + memberDO.getAccountName(), memberDO);
return ConstantUtils.SET_SUCCESS;
}
//该成员完成了几个视频
for (VodDictDO vodDictDO : vodDictDOS) {
int completeVodOrNot = vodPlayHistoryMapper.completeVodOrNot(memberId, vodDictDO.getId(), studyPageVO.getClassId());
i += completeVodOrNot;
public String updateCheckImage(MemberDO memberDO) {
memberDO.setCheckTime(LocalDateTime.now());
this.baseMapper.updateById(memberDO);
return ConstantUtils.SET_SUCCESS;
}
studyPageVO.setDoneVods(i);
////该班级课程下有多少人
//Integer count = classMemberMappingMapper.selectCount(new QueryWrapper<ClassMemberMappingDO>()
// .lambda()
// .eq(ClassMemberMappingDO::getClassId, studyPageVO.getClassId()));
//studyPageVO.setTotalMember(count);
return new AsyncResult<>(studyPageVO);
public String removeCheckImage(MemberDO memberDO) {
this.baseMapper.removeCheckImage(memberDO.getId());
return ConstantUtils.DELETE_SUCCESS;
}
public List<MyCoursesVO> myCourses(MyCoursesDTO myCoursesDTO) {
......
......@@ -6,9 +6,9 @@ import java.util.List;
public class ExcelFormatUtils {
public static final List<String> memberList = Arrays.asList("序号", "成员名称","身份证号码", "性别", "账号", "联系方式", "签到次数", "课程进度", "学习时长", "答疑数", "测试成绩", "总评价");
public static final List<String> memberList = Arrays.asList("序号", "成员名称","身份证号码", "性别", "账号", "联系方式", "签到次数", "课程进度", "学习时长(小时)","学习时长(分钟)", "答疑数", "测试成绩", "总评价");
public static final List<String> signList = Arrays.asList("序号", "成员名称", "身份证号码", "联系方式", "学习时长", "课程进度", "完成率", "签到次数", "签到日期");
public static final List<String> signList = Arrays.asList("序号", "成员名称", "身份证号码", "联系方式", "学习时长(小时)","学习时长(分钟)", "课程进度", "完成率", "签到次数", "签到日期");
public static final List<String> scoreList = Arrays.asList("序号", "成员名称", "身份证号码", "联系方式", "测试成绩", "测试次数", "总评价");
......
......@@ -466,7 +466,7 @@ public class ExcelUtil {
sheet.addMergedRegion(cellRangeAddress21);
setBorderStyle(HSSFCellStyle.BORDER_THIN, cellRangeAddress21, sheet, workbook); //给合并过的单元格加边框
CellRangeAddress cellRangeAddress22 = new CellRangeAddress(1, 1, 5, 11);
CellRangeAddress cellRangeAddress22 = new CellRangeAddress(1, 1, 5, 12);
sheet.addMergedRegion(cellRangeAddress22);
setBorderStyle(HSSFCellStyle.BORDER_THIN, cellRangeAddress22, sheet, workbook); //给合并过的单元格加边框
......@@ -482,7 +482,7 @@ public class ExcelUtil {
sheet.addMergedRegion(cellRangeAddress31);
setBorderStyle(HSSFCellStyle.BORDER_THIN, cellRangeAddress31, sheet, workbook); //给合并过的单元格加边框
CellRangeAddress cellRangeAddress32 = new CellRangeAddress(2, 2, 5, 11);
CellRangeAddress cellRangeAddress32 = new CellRangeAddress(2, 2, 5, 12);
sheet.addMergedRegion(cellRangeAddress32);
setBorderStyle(HSSFCellStyle.BORDER_THIN, cellRangeAddress32, sheet, workbook); //给合并过的单元格加边框
thirdRow.createCell(0).setCellValue(thirdHead[0]);
......@@ -553,14 +553,18 @@ public class ExcelUtil {
newCell = dataRow.createCell(9);
newCell.setCellStyle(cellStyle);
newCell.setCellValue(classDetailVO.getAskCounts());
newCell.setCellValue(classDetailVO.getTrainingLengthMinute());
newCell = dataRow.createCell(10);
newCell.setCellStyle(cellStyle);
newCell.setCellValue(classDetailVO.getScore());
newCell.setCellValue(classDetailVO.getAskCounts());
newCell = dataRow.createCell(11);
newCell.setCellStyle(cellStyle);
newCell.setCellValue(classDetailVO.getScore());
newCell = dataRow.createCell(12);
newCell.setCellStyle(cellStyle);
newCell.setCellValue(classDetailVO.getResult());
rowIndex++;
seq++;
......@@ -693,7 +697,7 @@ public class ExcelUtil {
sheet.addMergedRegion(cellRangeAddress21);
setBorderStyle(HSSFCellStyle.BORDER_THIN, cellRangeAddress21, sheet, workbook); //给合并过的单元格加边框
CellRangeAddress cellRangeAddress22 = new CellRangeAddress(1, 1, 4, 8);
CellRangeAddress cellRangeAddress22 = new CellRangeAddress(1, 1, 4, 9);
sheet.addMergedRegion(cellRangeAddress22);
setBorderStyle(HSSFCellStyle.BORDER_THIN, cellRangeAddress22, sheet, workbook); //给合并过的单元格加边框
......@@ -709,7 +713,7 @@ public class ExcelUtil {
sheet.addMergedRegion(cellRangeAddress31);
setBorderStyle(HSSFCellStyle.BORDER_THIN, cellRangeAddress31, sheet, workbook); //给合并过的单元格加边框
CellRangeAddress cellRangeAddress32 = new CellRangeAddress(2, 2, 4, 8);
CellRangeAddress cellRangeAddress32 = new CellRangeAddress(2, 2, 4, 9);
sheet.addMergedRegion(cellRangeAddress32);
setBorderStyle(HSSFCellStyle.BORDER_THIN, cellRangeAddress32, sheet, workbook); //给合并过的单元格加边框
thirdRow.createCell(0).setCellValue(thirdHead[0]);
......@@ -765,18 +769,22 @@ public class ExcelUtil {
newCell = dataRow.createCell(5);
newCell.setCellStyle(cellStyle);
newCell.setCellValue(classSignVO.getClassProcess());
newCell.setCellValue(classSignVO.getTrainingLengthMinute());
newCell = dataRow.createCell(6);
newCell.setCellStyle(cellStyle);
newCell.setCellValue(classSignVO.getPercent());
newCell.setCellValue(classSignVO.getClassProcess());
newCell = dataRow.createCell(7);
newCell.setCellStyle(cellStyle);
newCell.setCellValue(classSignVO.getSignCounts());
newCell.setCellValue(classSignVO.getPercent());
newCell = dataRow.createCell(8);
newCell.setCellStyle(cellStyle);
newCell.setCellValue(classSignVO.getSignCounts());
newCell = dataRow.createCell(9);
newCell.setCellStyle(cellStyle);
newCell.setCellValue(classSignVO.getSignInDateList());
rowIndex++;
......
package com.subsidy.vo.administer;
import lombok.Data;
@Data
public class ImageCheckDetailVO {
}
package com.subsidy.vo.administer;
import com.subsidy.util.excel.ExcelColumn;
import lombok.Data;
@Data
public class MemberDetectionRecordVO {
private Long id;
@ExcelColumn(col = 1,value = "成员名称")
private String userName;
@ExcelColumn(col = 2,value = "账号")
private String accountName;
@ExcelColumn(col = 3,value = "身份证号")
private String idCard;
@ExcelColumn(col = 4,value = "身份证号")
private String telephone;
@ExcelColumn(col = 5,value = "检测次数")
private Integer cnt;
}
......@@ -51,9 +51,11 @@ public class ClassDetailVO{
private Integer trainingLength;
@ExcelColumn(col = 8,value = "培训时长")
@ExcelColumn(col = 8,value = "培训时长(小时)")
private String trainingLengthStr;
@ExcelColumn(col = 9,value = "培训时长(分钟)")
private String trainingLengthMinute;
/**
* 作对个数
......@@ -68,13 +70,13 @@ public class ClassDetailVO{
/**
* 评价测试
*/
@ExcelColumn(col = 9,value = "评价测试")
@ExcelColumn(col = 10,value = "评价测试")
private String score;
/**
* 答疑个数
*/
@ExcelColumn(col = 10,value = "答题数")
@ExcelColumn(col = 11,value = "答题数")
private Integer askCounts;
......
package com.subsidy.vo.company;
import lombok.Data;
@Data
public class GetCompanyMembersVO {
private Long id;
private String userName;
private String idCard;
private String companyName;
private Integer firstLogin;
private String checkImage;
private String checkTime;
}
package com.subsidy.vo.member;
import lombok.Data;
@Data
public class CheckStatusVO {
private Boolean SMSStatus;
private Boolean imageStatus;
}
......@@ -31,17 +31,19 @@ public class ClassSignVO {
*/
private Integer trainingLength;
@ExcelColumn(col = 4,value = "培训时长")
@ExcelColumn(col = 4,value = "培训时长(小时)")
private String trainingLengthStr;
@ExcelColumn(col = 5,value = "培训时长(分钟)")
private String trainingLengthMinute;
@ExcelColumn(col = 5,value = "课程进度")
@ExcelColumn(col = 6,value = "课程进度")
private String classProcess;
/**
* 完成率
*/
@ExcelColumn(col = 6,value = "完成率")
@ExcelColumn(col = 7,value = "完成率")
private String percent;
......
......@@ -69,3 +69,9 @@ wechat:
#pro
appId: wx5e1ecb9c9bd33451
appSecret: 4f5e1abb6fb4f68f5273820b6295ec6b
#活体检测配置
activity.captchaAppId: 2013197365
activity.appSecretKey: 04ABoF0ZVuMje8NP84DE5Sg**
activity.businessId: 1
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.subsidy.mapper.ActivityDetectionMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.subsidy.model.ActivityDetectionDO">
<id column="id" property="id" />
<result column="create_date" property="createDate" />
<result column="update_date" property="updateDate" />
<result column="delete_date" property="deleteDate" />
<result column="class_id" property="classId" />
<result column="member_id" property="memberId" />
<result column="status" property="status" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
create_date,
update_date,
delete_date,
id, class_id, member_id, status
</sql>
</mapper>
......@@ -120,4 +120,77 @@
</if>
</select>
<select id="classActivityDetection" resultType="com.subsidy.vo.administer.MemberDetectionRecordVO">
SELECT
t2.id,
t2.user_name,
t2.account_name,
t2.telephone,
t2.id_card,
count( t3.id ) as cnt
FROM
class_member_mapping t
LEFT JOIN member t2 ON t.member_id = t2.id
LEFT JOIN activity_detection t3 ON t.class_id = t3.class_id
AND t.member_id = t3.member_id
where t.delete_date IS NULL
AND t2.delete_date IS NULL
AND t.class_id = #{classId}
<if test="userName != null and userName !=''">
and t2.user_name like concat('%',#{userName} ,'%')
</if>
GROUP BY
t.member_id
order by t2.id
</select>
<select id="imageCheckDetail" resultType="com.subsidy.vo.administer.ImageCheckDetailVO">
SELECT
t1.id,
t1.user_name,
t1.account_name,
t1.telephone,
t1.id_card,
cnt,
recentDate
FROM
(
SELECT
t2.id,
t2.user_name,
t2.account_name,
t2.telephone,
t2.id_card,
count( t3.id ) AS cnt
FROM
class_member_mapping t
LEFT JOIN member t2 ON t.member_id = t2.id
LEFT JOIN image_check_record t3 ON t.class_id = t3.class_id
AND t.member_id = t3.member_id
WHERE
t.delete_date IS NULL
AND t2.delete_date IS NULL
<if test="userName != null and userName !=''">
and t2.user_name like concat('%',#{userName} ,'%')
</if>
AND t.class_id = #{classId}
GROUP BY
t.member_id
) t1
LEFT JOIN (
SELECT
t2.member_id,
t2.class_id,
max( t2.create_date ) AS recentDate
FROM
image_check_record t2
WHERE
t2.delete_date IS NULL
AND t2.class_id = #{classId}
GROUP BY
t2.member_id,
t2.class_id
) t2 ON t1.id = t2.member_id
</select>
</mapper>
......@@ -75,4 +75,24 @@
</if>
</select>
<select id="getCompanyMembers" resultType="com.subsidy.vo.company.GetCompanyMembersVO">
SELECT
t.id,
t.user_name,
t.id_card,
t2.company_name,
t.first_login,
t.check_image,
t.check_time
FROM
member t
LEFT JOIN company_dict t2 ON t.company_id = t2.id
WHERE
t.delete_date IS NULL
AND t2.delete_date IS NULL
and t.company_id = #{companyId}
and t.user_name like concat('%',#{userName} ,'%')
</select>
</mapper>
......@@ -119,11 +119,19 @@
<select id="testScoreInfo" resultType="com.subsidy.vo.done.TestScoreInfoVO">
SELECT
t1.paper_id,
t1.score,
t1.result,
t2.cnt
FROM
(
SELECT
t.paper_id,
max( t.score ) AS score,
count( 1 ) AS cnt,
t.class_id,
t.member_id,
t.score,
IF
( max( t.score )>= 60, '合格', '不合格' ) AS result
( ( t.score )>= 60, '合格', '不合格' ) AS result
FROM
exercise_done_result t
LEFT JOIN paper_dict t2 ON t.paper_id = t2.id
......@@ -131,11 +139,27 @@
t.delete_date IS NULL
AND t.member_id = #{memberId}
AND t.paper_id = #{paperId}
and t.class_id = #{classId}
GROUP BY
t.class_id,
t.paper_id,
t.member_id
AND t.class_id = #{classId}
ORDER BY
t.create_date DESC
LIMIT 1
) t1
LEFT JOIN (
SELECT
t2.paper_id,
t2.class_id,
t2.member_id,
count( 1 ) AS cnt
FROM
exercise_done_result t2
WHERE
t2.delete_date IS NULL
AND t2.member_id = #{memberId}
AND t2.paper_id = #{paperId}
AND t2.class_id = #{classId}
) t2 ON t1.paper_id = t2.paper_id
AND t1.member_id = t2.member_id
AND t1.class_id = t2.class_id
</select>
<select id="getClassTestPassRate" parameterType="long" resultType="integer">
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.subsidy.mapper.ImageCheckRecordMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.subsidy.model.ImageCheckRecordDO">
<id column="id" property="id" />
<result column="create_date" property="createDate" />
<result column="update_date" property="updateDate" />
<result column="delete_date" property="deleteDate" />
<result column="class_id" property="classId" />
<result column="paper_id" property="paperId" />
<result column="request_id" property="requestId" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
create_date,
update_date,
delete_date,
id, class_id, paper_id, request_id
</sql>
</mapper>
......@@ -323,4 +323,8 @@
AND r.ts is NULL
and m.delete_date is null
</select>
<update id="removeCheckImage" parameterType="long">
update member set check_image = nulll where id = #{id}
</update>
</mapper>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!