package com.ibeetl.jlw.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.EnumUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.validation.BeanValidationResult; import cn.hutool.extra.validation.ValidationUtil; import cn.jlw.util.ToolUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.ibeetl.admin.core.entity.CoreUser; import com.ibeetl.admin.core.service.CoreBaseService; import com.ibeetl.admin.core.util.PlatformException; import com.ibeetl.admin.core.util.TimeTool; import com.ibeetl.admin.core.web.JsonResult; import com.ibeetl.admin.core.web.JsonReturnCode; import com.ibeetl.jlw.dao.StudentDao; import com.ibeetl.jlw.dao.TeacherOpenCourseMergeSchoolClassDao; import com.ibeetl.jlw.dao.TeacherOpenCourseStudentSigninLogDao; import com.ibeetl.jlw.dao.TeacherOpenCourseStudentSigninSettingDao; import com.ibeetl.jlw.entity.*; import com.ibeetl.jlw.entity.dto.TeacherOpenCourseStudentSigninLogManualMergeDTO; import com.ibeetl.jlw.entity.dto.TeacherOpenCourseStudentSigninLogSigninDTO; import com.ibeetl.jlw.entity.dto.TeacherOpenCourseStudentSigninLogSigninDTO.ManualClass; import com.ibeetl.jlw.entity.dto.TeacherOpenCourseStudentSigninSettingManualDTO; import com.ibeetl.jlw.entity.vo.TeacherOpenCourseStudentSigninLogSummaryVO; import com.ibeetl.jlw.enums.SignInTypeEnum; import com.ibeetl.jlw.enums.StartStatusEnum; import com.ibeetl.jlw.validator.TeacherOpenCourseStudentSigninLogSigninDTOValidator; import com.ibeetl.jlw.web.query.StudentQuery; import com.ibeetl.jlw.web.query.TeacherOpenCourseMergeStudentQuery; import com.ibeetl.jlw.web.query.TeacherOpenCourseStudentSigninLogQuery; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.beetl.sql.core.SqlId; import org.beetl.sql.core.engine.PageQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.servlet.http.HttpServletRequest; import javax.validation.constraints.NotNull; import java.io.*; import java.util.*; import java.util.stream.Collectors; import static cn.hutool.core.collection.CollUtil.emptyIfNull; import static cn.jlw.util.CacheUserUtil.getStudent; import static cn.jlw.util.IpUtils.getIpAddr; import static cn.jlw.util.IpUtils.isRangeInner; import static cn.jlw.util.ValidatorUtil.getFirstErrorMessage; import static com.ibeetl.admin.core.util.ExcelUtil.getCellFormatValue; import static com.ibeetl.admin.core.util.StreamUtils.getFieldToSet; import static com.ibeetl.admin.core.util.StreamUtils.listJoin; import static com.ibeetl.admin.core.util.servlet.ServletUtils.getRequest; import static com.ibeetl.admin.core.util.user.CacheUserUtil.getUser; import static com.ibeetl.jlw.entity.TeacherOpenCourseStudentSigninSetting.ALL_SCHOOL_CLASS_IDS_SIGN; import static com.ibeetl.jlw.entity.dto.TeacherOpenCourseStudentSigninLogSigninDTO.TeacherOpenCourseStudentSigninLogTypeEnum.*; import static com.ibeetl.jlw.enums.SignInTypeEnum.SIGN_IN; import static com.ibeetl.jlw.enums.SignInTypeEnum.UN_SIGN_IN; /** * 学生签到记录 Service * 当分布式ID开启后请勿使用insert(*,true) */ @Service @Transactional @Validated @Slf4j public class TeacherOpenCourseStudentSigninLogService extends CoreBaseService implements DeleteResourcesBy{ @Autowired private TeacherOpenCourseStudentSigninLogDao teacherOpenCourseStudentSigninLogDao; @Autowired private TeacherOpenCourseStudentSigninSettingDao teacherOpenCourseStudentSigninSettingDao; @Autowired private StudentDao studentDao; @Autowired private TeacherOpenCourseMergeSchoolClassDao teacherOpenCourseMergeSchoolClassDao; @Autowired private TeacherOpenCourseMergeStudentService teacherOpenCourseMergeStudentService; @Autowired private TeacherOpenCourseStudentSigninLogSigninDTOValidator teacherOpenCourseStudentSigninLogSigninDTOValidator; public PageQueryqueryByCondition(PageQuery query){ PageQuery ret = teacherOpenCourseStudentSigninLogDao.queryByCondition(query); queryListAfter(ret.getList()); return ret; } public PageQueryqueryByConditionQuery(PageQuery query){ PageQuery ret = teacherOpenCourseStudentSigninLogDao.queryByConditionQuery(query); queryListAfter(ret.getList()); return ret; } /** * 缺勤备注添加 * @param signinLogQuery * @return */ public JsonResult editReasonForAbsence(TeacherOpenCourseStudentSigninLogQuery signinLogQuery){ if (Objects.isNull(signinLogQuery.getTeacherOpenCourseStudentSigninLogId())){ return JsonResult.failMessage("用户编号不存在"); } TeacherOpenCourseStudentSigninLog single = teacherOpenCourseStudentSigninLogDao.getSQLManager().lambdaQuery(TeacherOpenCourseStudentSigninLog.class) .andEq(TeacherOpenCourseStudentSigninLog::getTeacherOpenCourseStudentSigninLogId, signinLogQuery.getTeacherOpenCourseStudentSigninLogId()) .andEq(TeacherOpenCourseStudentSigninLog::getTeacherOpenCourseStudentSigninLogTag, UN_SIGN_IN) .single(); if (Objects.isNull(single)){ return JsonResult.failMessage("查询不到用户数据"); }else { single.setTeacherOpenCourseStudentSigninLogRemark(signinLogQuery.getTeacherOpenCourseStudentSigninLogRemark()); teacherOpenCourseStudentSigninLogDao.getSQLManager().lambdaQuery(TeacherOpenCourseStudentSigninLog.class) .andEq(TeacherOpenCourseStudentSigninLog::getTeacherOpenCourseStudentSigninLogId, signinLogQuery.getTeacherOpenCourseStudentSigninLogId()) .updateSelective(single); } return JsonResult.success(); } public void deleteByList(List list){ String ids = ""; ToolUtils.deleteNullList(list); for(int i=0;null != list && i teacherOpenCourseStudentSigninLogList = new ArrayList<>(); try { teacherOpenCourseStudentSigninLogList = JSON.parseArray(teacherOpenCourseStudentSigninLogQuery.getTeacherOpenCourseStudentSigninLogJsonStr(), TeacherOpenCourseStudentSigninLog.class); } catch (Exception e) { try { teacherOpenCourseStudentSigninLogList.add(JSONObject.parseObject(teacherOpenCourseStudentSigninLogQuery.getTeacherOpenCourseStudentSigninLogJsonStr(), TeacherOpenCourseStudentSigninLog.class)); } catch (Exception e1) {} } ToolUtils.deleteNullList(teacherOpenCourseStudentSigninLogList); if(null != teacherOpenCourseStudentSigninLogList && teacherOpenCourseStudentSigninLogList.size()>0){ for(int i=0;i 0; if(!flag){ msg = "更新指定参数失败"; } }else{ msg = "指定参数为空"; } return msg; } public List getValues (Object paras){ return sqlManager.select(SqlId.of("jlw.teacherOpenCourseStudentSigninLog.getTeacherOpenCourseStudentSigninLogValues"), TeacherOpenCourseStudentSigninLog.class, paras); } public List getValuesByQuery (TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery){ return teacherOpenCourseStudentSigninLogDao.getValuesByQuery(teacherOpenCourseStudentSigninLogQuery); } public List getValuesByQueryNotWithPermission (TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery){ List values = teacherOpenCourseStudentSigninLogDao.getValuesByQueryNotWithPermission(teacherOpenCourseStudentSigninLogQuery); queryListAfter(values); return values; } public TeacherOpenCourseStudentSigninLog getInfo (Long teacherOpenCourseStudentSigninLogId){ TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery = new TeacherOpenCourseStudentSigninLogQuery(); teacherOpenCourseStudentSigninLogQuery.setTeacherOpenCourseStudentSigninLogId(teacherOpenCourseStudentSigninLogId); List list = teacherOpenCourseStudentSigninLogDao.getValuesByQuery(teacherOpenCourseStudentSigninLogQuery); if(null != list && list.size()>0){ return list.get(0); }else{ return null; } } public TeacherOpenCourseStudentSigninLog getInfo (TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery){ List list = teacherOpenCourseStudentSigninLogDao.getValuesByQuery(teacherOpenCourseStudentSigninLogQuery); if(null != list && list.size()>0){ return list.get(0); }else{ return null; } } /** * 学生端-教师端-签到 * * @param signinDTO */ public void signin(@Validated TeacherOpenCourseStudentSigninLogSigninDTO signinDTO) { Student student = getStudent(); Assert.notNull(student, "该接口只能学生操作"); // 通过签到配置ID查询配置信息 List signinSettingList = teacherOpenCourseStudentSigninSettingDao.getByIds(signinDTO.getTeacherOpenCourseStudentSigninSettingId() + ""); Assert.notEmpty(signinSettingList, "签到配置ID无效!"); // 通过签到配置ID查询对应的参数信息。用于下面的验证。 TeacherOpenCourseStudentSigninSetting signinSetting = signinSettingList.get(0); // 断言验证,学生某个课程只能签到一次。三种签到类型,都可以签到 TeacherOpenCourseStudentSigninLog entity = new TeacherOpenCourseStudentSigninLog(); entity.setStudentId(student.getStudentId()); entity.setTeacherOpenCourseStudentSigninSettingId(signinSetting.getTeacherOpenCourseStudentSigninSettingId()); entity.setTeacherOpenCourseStudentSigninLogTag(SIGN_IN); Assert.isTrue(ObjectUtil.isEmpty(teacherOpenCourseStudentSigninLogDao.template(entity)), "该学生已经签到过了!"); // 判断是否加入到这个课程中 long teacherOpenCourseInCount = teacherOpenCourseMergeSchoolClassDao.createLambdaQuery() .andEq(TeacherOpenCourseMergeSchoolClass::getSchoolClassId, student.getClassId()) .andEq(TeacherOpenCourseMergeSchoolClass::getTeacherOpenCourseId, signinSetting.getTeacherOpenCourseId()) .count(); Assert.isTrue(teacherOpenCourseInCount > 0, "未加入到该课程中,开课ID或学生ID有误!"); switch (signinDTO.getTeacherOpenCourseStudentSigninLogType()) { // IP签到 case ip_signin: { ipSignInHandler(signinDTO, signinSetting); }break; // 手动签到。教师端操作 case manual_signin: { manualSignInHandler(signinDTO, signinSetting); }break; // 验证码签到 case code_signin: { codeSignInHandler(signinDTO, signinSetting); }break; default: throw new RuntimeException("不支持的签到类型,请核对!"); } } /** * 判断班级ID是否在集合中 * * @param schoolClassId * @param signinSetting * @return */ private boolean schoolClassIdJudgment(@NotNull(message = "班级ID不能为空!") Long schoolClassId, @NotNull(message = "签到配置不能为空!") TeacherOpenCourseStudentSigninSetting signinSetting) { Assert.notEmpty(signinSetting.getSchoolClassIds(), "班级ID集合不能为空!"); if(signinSetting.getSchoolClassIds().equals(ALL_SCHOOL_CLASS_IDS_SIGN)) { return true; } // 分割班级ID,逐一比对,只要有一个符合要求,就返回true return Arrays.stream(signinSetting.getSchoolClassIds().split(",")) .anyMatch(item -> item.equals(schoolClassId.toString())); } /** * IP签到 * * @param signinDTO * @param signinSetting */ public void ipSignInHandler(@Validated TeacherOpenCourseStudentSigninLogSigninDTO signinDTO, @NotNull(message = "签到配置不能为空!") TeacherOpenCourseStudentSigninSetting signinSetting) { teacherOpenCourseStudentSigninLogSigninDTOValidator.validator(signinDTO).validatorBySetting(signinSetting); // 获取登录用户,教师身份不支持IP签到,教师只能手动签到 Student student = getStudent(); Assert.notNull(student, "IP签到方式,只允许学生进行操作!"); // 获取学生信息 Assert.isTrue(schoolClassIdJudgment(student.getClassId(), signinSetting), "该学生所在的班级不符合签到要求!"); Date time = new Date(); Date startTime = signinSetting.getTeacherOpenCourseStudentSigninSettingStartTime(); Date endTime = signinSetting.getTeacherOpenCourseStudentSigninSettingEndTime(); if (Objects.isNull(startTime)){ Assert.notNull(null, "未开始签到"); } if (startTime.getTime() > time.getTime()){ Assert.notNull(null, "未开始签到"); } if (!Objects.isNull(endTime) && endTime.getTime() < time.getTime()){ Assert.notNull(null, "已结束签到"); } // 获取到真实的IP String myIpAddress = getIpAddr(getRequest()); // 断言,如果IP不在指定的IP段内,则添加失败,异常信息丢给前台 Assert.isTrue(isRangeInner(myIpAddress, signinSetting.getTeacherOpenCourseStudentSigninSettingValue()), "您的IP地址:{},不在指定的IP段内!", myIpAddress); // 构建实体 TeacherOpenCourseStudentSigninLogQuery signinLogQuery = new TeacherOpenCourseStudentSigninLogQuery(); signinLogQuery.setTeacherOpenCourseStudentSigninSettingSessionTime(signinSetting.getTeacherOpenCourseStudentSigninSettingSessionTime().toString()); signinLogQuery.setTeacherOpenCourseStudentSigninSettingId(signinSetting.getTeacherOpenCourseStudentSigninSettingId()); signinLogQuery.setTeacherOpenCourseId(signinSetting.getTeacherOpenCourseId()); signinLogQuery.setTeacherOpenCourseStudentSigninLogType(ip_signin.name()); signinLogQuery.setTeacherOpenCourseStudentSigninLogIp(myIpAddress); signinLogQuery.setTeacherOpenCourseStudentSigninLogTag(SIGN_IN); signinLogQuery.setSchoolClassId(student.getClassId()); signinLogQuery.setStudentId(student.getStudentId()); signinLogQuery.setOrgId(student.getOrgId()); signinLogQuery.setUserId(student.getUserId()); TeacherOpenCourseStudentSigninLog single = teacherOpenCourseStudentSigninLogDao.getSQLManager() .lambdaQuery(TeacherOpenCourseStudentSigninLog.class) .andEq(TeacherOpenCourseStudentSigninLog::getTeacherOpenCourseStudentSigninSettingId, signinSetting.getTeacherOpenCourseStudentSigninSettingId()) .andEq(TeacherOpenCourseStudentSigninLog::getTeacherOpenCourseStudentSigninLogTag,UN_SIGN_IN) .andEq(TeacherOpenCourseStudentSigninLog::getStudentId,student.getStudentId()) .andEq(TeacherOpenCourseStudentSigninLog::getSchoolClassId,student.getClassId()) .single(); if (ObjectUtil.isNotNull(single)){ single.setTeacherOpenCourseStudentSigninLogRemark(null); single.setTeacherOpenCourseStudentSigninLogTag(SIGN_IN); single.setTeacherOpenCourseStudentSigninLogAddTime(new Date()); single.setTeacherOpenCourseStudentSigninLogIp(myIpAddress); teacherOpenCourseStudentSigninLogDao.upsertByTemplate(single); }else { // 学生签到记录添加 add(signinLogQuery); } } /** * 手动签到 * * @param signinDTO * @param signinSetting */ public void manualSignInHandler(@Validated TeacherOpenCourseStudentSigninLogSigninDTO signinDTO, @NotNull(message = "签到配置不能为空!") TeacherOpenCourseStudentSigninSetting signinSetting) { teacherOpenCourseStudentSigninLogSigninDTOValidator.validator(signinDTO).validatorBySetting(signinSetting); // 获取学生信息 Student student = getStudent(); Assert.notNull(student, "IP签到方式,只允许学生进行操作!"); // 获取学生信息 Assert.isTrue(schoolClassIdJudgment(student.getClassId(), signinSetting), "该学生所在的班级不符合签到要求!"); // 构建实体 TeacherOpenCourseStudentSigninLogQuery signinLogQuery = new TeacherOpenCourseStudentSigninLogQuery(); signinLogQuery.setTeacherOpenCourseStudentSigninSettingSessionTime(signinSetting.getTeacherOpenCourseStudentSigninSettingSessionTime().toString()); signinLogQuery.setTeacherOpenCourseStudentSigninSettingId(signinSetting.getTeacherOpenCourseStudentSigninSettingId()); signinLogQuery.setTeacherOpenCourseId(signinSetting.getTeacherOpenCourseId()); signinLogQuery.setTeacherOpenCourseStudentSigninLogType(manual_signin.name()); signinLogQuery.setTeacherOpenCourseStudentSigninLogIp(getIpAddr(getRequest())); signinLogQuery.setTeacherOpenCourseStudentSigninLogTag(signinDTO.getIsAbsent() ? UN_SIGN_IN : SIGN_IN); signinLogQuery.setSchoolClassId(student.getClassId()); signinLogQuery.setStudentId(student.getStudentId()); // 是否缺勤 if(BooleanUtil.isTrue(signinDTO.getIsAbsent())) { // 断言验证缺勤时候,必传的字段 BeanValidationResult isAbsentValidationResult = ValidationUtil.warpValidate(signinDTO, ManualClass.class); Assert.isTrue(isAbsentValidationResult.isSuccess(), () -> getFirstErrorMessage(isAbsentValidationResult.getErrorMessages())); signinLogQuery.setTeacherOpenCourseStudentSigninLogRemark(signinDTO.getTeacherOpenCourseStudentSigninLogRemark()); } // 学生签到记录添加 add(signinLogQuery); } /** * 验证码签到 * * @param signinDTO * @param signinSetting */ public void codeSignInHandler(@Validated TeacherOpenCourseStudentSigninLogSigninDTO signinDTO, @NotNull(message = "签到配置不能为空!") TeacherOpenCourseStudentSigninSetting signinSetting) { teacherOpenCourseStudentSigninLogSigninDTOValidator.validator(signinDTO).validatorBySetting(signinSetting); // 获取登录用户,教师身份不支持IP签到,教师只能手动签到 // 获取学生信息 Student student = getStudent(); Assert.notNull(student, "验证码签到方式,只允许学生进行操作!"); // 获取学生信息 Assert.isTrue(schoolClassIdJudgment(student.getClassId(), signinSetting), "该学生所在的班级不符合签到要求!"); Date time = new Date(); Date startTime = signinSetting.getTeacherOpenCourseStudentSigninSettingStartTime(); Date endTime = signinSetting.getTeacherOpenCourseStudentSigninSettingEndTime(); if (Objects.isNull(startTime)){ Assert.notNull(null, "未开始签到"); } if (startTime.getTime() > time.getTime()){ Assert.notNull(null, "未开始签到"); } if (!Objects.isNull(endTime) && endTime.getTime() < time.getTime()){ Assert.notNull(null, "已结束签到"); } // 断言,验证码验证 boolean verificationSuccess = signinSetting.getTeacherOpenCourseStudentSigninSettingValue().equals(signinDTO.getVerificationCode()); Assert.isTrue(verificationSuccess, "错误的验证码,签到失败!"); // 构建实体 TeacherOpenCourseStudentSigninLogQuery signinLogQuery = new TeacherOpenCourseStudentSigninLogQuery(); signinLogQuery.setTeacherOpenCourseStudentSigninSettingSessionTime(signinSetting.getTeacherOpenCourseStudentSigninSettingSessionTime().toString()); signinLogQuery.setTeacherOpenCourseStudentSigninSettingId(signinSetting.getTeacherOpenCourseStudentSigninSettingId()); signinLogQuery.setTeacherOpenCourseId(signinSetting.getTeacherOpenCourseId()); signinLogQuery.setTeacherOpenCourseStudentSigninLogType(code_signin.name()); signinLogQuery.setTeacherOpenCourseStudentSigninLogIp(getIpAddr(getRequest())); signinLogQuery.setTeacherOpenCourseStudentSigninLogTag(SIGN_IN); signinLogQuery.setStudentId(student.getStudentId()); signinLogQuery.setSchoolClassId(student.getClassId()); signinLogQuery.setOrgId(student.getOrgId()); signinLogQuery.setUserId(student.getUserId()); TeacherOpenCourseStudentSigninLog single = teacherOpenCourseStudentSigninLogDao.getSQLManager() .lambdaQuery(TeacherOpenCourseStudentSigninLog.class) .andEq(TeacherOpenCourseStudentSigninLog::getTeacherOpenCourseStudentSigninSettingId, signinSetting.getTeacherOpenCourseStudentSigninSettingId()) .andEq(TeacherOpenCourseStudentSigninLog::getTeacherOpenCourseStudentSigninLogTag,UN_SIGN_IN) .andEq(TeacherOpenCourseStudentSigninLog::getStudentId,student.getStudentId()) .andEq(TeacherOpenCourseStudentSigninLog::getSchoolClassId,student.getClassId()) .single(); if (ObjectUtil.isNotNull(single)){ single.setTeacherOpenCourseStudentSigninLogRemark(null); single.setTeacherOpenCourseStudentSigninLogTag(SIGN_IN); single.setTeacherOpenCourseStudentSigninLogAddTime(new Date()); teacherOpenCourseStudentSigninLogDao.upsertByTemplate(single); }else { // 学生签到记录添加 add(signinLogQuery); } } public JsonResult importTemplate(List fileEntityList, Listlist, CoreUser coreUser){ ListerrMsg = new ArrayList<>(); String msg =""; int count = 0; Date date = new Date(); for(int item=0;null != fileEntityList && item map = new HashMap<>();//获取需要的表头的列 //从第一列找到需要的表头 for (int i=0; i0?JsonReturnCode.SUCCESS.getCode():JsonReturnCode.FAIL.getCode()); jsonResult.setData(errMsg); jsonResult.setMsg((count>0?"导入成功,共导入"+count+"条":"导入失败")+(StringUtils.isNotBlank(msg)?"
"+msg:"")); return jsonResult; } public List> getExcelValues (TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery){ return teacherOpenCourseStudentSigninLogDao.getExcelValues(teacherOpenCourseStudentSigninLogQuery); } /** * 教师端-手动签到逻辑 * @param dto * @return */ public void manualSigninAdd(@NotNull(message = "手动签到参数不能为空!") TeacherOpenCourseStudentSigninLogManualMergeDTO dto) { // 获取当前登录用户信息 final CoreUser operatorUser = getUser(); final HttpServletRequest request = getRequest(); // 添加我签到配置 TeacherOpenCourseStudentSigninSettingManualDTO signinSetting = dto.getSigninSetting(); TeacherOpenCourseStudentSigninSetting entity = new TeacherOpenCourseStudentSigninSetting(); // 拷贝前端传过来的值 BeanUtil.copyProperties(signinSetting, entity); DateTime now = DateUtil.date(); //获取现在的时间 精确到分 // 默认的一些属性填充。添加主表 DateTime parse = DateUtil.parse(DateUtil.format(now, "yyyy-MM-dd HH:mm"), "yyyy-MM-dd HH:mm"); entity.setTeacherOpenCourseStudentSigninSettingSessionTime(parse); entity.setTeacherOpenCourseStudentSigninSettingStartTime(now); entity.setTeacherOpenCourseStudentSigninSettingEndTime(now); entity.setTeacherOpenCourseStudentSigninSettingAddTime(now); entity.setTeacherOpenCourseStudentSigninSettingType(manual_signin.name()); entity.setTeacherOpenCourseStudentSigninSettingStartStatus(StartStatusEnum.END); entity.setTeacherOpenCourseStudentSigninSettingStatus(1); entity.setOrgId(operatorUser.getOrgId()); entity.setUserId(operatorUser.getId()); teacherOpenCourseStudentSigninSettingDao.insert(entity); // 获取插入后的配置ID final Long settingId = entity.getTeacherOpenCourseStudentSigninSettingId(); // 查询所有要签到的班级,抽查几个学生以后,其他的学生全部默认是签到状态。 String schoolClassIds = signinSetting.getSchoolClassIds(); StudentQuery studentQuery = new StudentQuery(); studentQuery.setClassIds(schoolClassIds); studentQuery.setStudentStatus(1); // 查询指定班级下面的所有学生IDs List studentList = studentDao.getValuesByQuery(studentQuery); String allStudentIds = listJoin(studentList, Student::getStudentId); // 查询这个开课下的所有学生 TeacherOpenCourseMergeStudentQuery mergeStudentQuery = new TeacherOpenCourseMergeStudentQuery(); mergeStudentQuery.setTeacherOpenCourseSchoolClassMergeStudentStatus(1); mergeStudentQuery.setStudentIdPlural(allStudentIds); Set mergeStudentIdsSet = getFieldToSet(teacherOpenCourseMergeStudentService.getValuesByQueryNotWithPermission(mergeStudentQuery), TeacherOpenCourseMergeStudent::getStudentId); // 替换原来查询到的所有学生,过滤后的数据 studentList = studentList.stream().filter(item -> mergeStudentIdsSet.contains(item.getStudentId())).collect(Collectors.toList()); // 构建签到日志集合 List signinLogList = emptyIfNull(studentList).stream().map(studentInfo -> { Long classId = studentInfo.getClassId(); Assert.notNull(classId, "学生姓名:{}, 编号:{} 信息异常,请联系管理员!" , studentInfo.getStudentName(), studentInfo.getStudentSn()); TeacherOpenCourseStudentSigninLog teacherOpenCourseStudentSigninLog = new TeacherOpenCourseStudentSigninLog(); teacherOpenCourseStudentSigninLog.setStudentId(studentInfo.getStudentId()); teacherOpenCourseStudentSigninLog.setTeacherOpenCourseId(entity.getTeacherOpenCourseId()); teacherOpenCourseStudentSigninLog.setSchoolClassId(classId); teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninLogAddTime(now); teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninLogIp(getIpAddr(request)); teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninLogTag(SIGN_IN); teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninSettingSessionTime(now); teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninSettingId(settingId); teacherOpenCourseStudentSigninLog.setOrgId(operatorUser.getOrgId()); teacherOpenCourseStudentSigninLog.setUserId(studentInfo.getUserId()); // 查询到抽取的学生信息,替换默认的参数 emptyIfNull(dto.getSigninLogList()).stream().filter(ite -> studentInfo.getStudentId().equals(ite.getStudentId())).forEach(findOne -> { teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninLogTag(findOne.getTeacherOpenCourseStudentSigninLogTag()); teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninLogRemark(findOne.getTeacherOpenCourseStudentSigninLogRemark()); }); return teacherOpenCourseStudentSigninLog; }).collect(Collectors.toList()); insertBatch(signinLogList); } /** * 缺勤 * @param id * @param logTypeEnum */ public void studentAbsence(@NotNull(message = "签到配置ID不能为空!") Long id, @NotNull(message = "签到状态不能为空!") TeacherOpenCourseStudentSigninLogSigninDTO.TeacherOpenCourseStudentSigninLogTypeEnum logTypeEnum){ final HttpServletRequest request = getRequest(); //获取签到班级 TeacherOpenCourseStudentSigninSetting single = teacherOpenCourseStudentSigninSettingDao.getSQLManager().lambdaQuery(TeacherOpenCourseStudentSigninSetting.class) .andEq(TeacherOpenCourseStudentSigninSetting::getTeacherOpenCourseStudentSigninSettingId, id) .single(); if (!Objects.isNull(single)){ StudentQuery studentQuery = new StudentQuery(); studentQuery.setClassIds(single.getSchoolClassIds()); studentQuery.setStudentStatus(1); // 查询指定班级下面的所有学生IDs List studentList = studentDao.getValuesByQuery(studentQuery); String allStudentIds = listJoin(studentList, Student::getStudentId); // 查询这个开课下的所有学生 TeacherOpenCourseMergeStudentQuery mergeStudentQuery = new TeacherOpenCourseMergeStudentQuery(); mergeStudentQuery.setTeacherOpenCourseSchoolClassMergeStudentStatus(1); mergeStudentQuery.setStudentIdPlural(allStudentIds); Set mergeStudentIdsSet = getFieldToSet(teacherOpenCourseMergeStudentService.getValuesByQueryNotWithPermission(mergeStudentQuery), TeacherOpenCourseMergeStudent::getStudentId); // 替换原来查询到的所有学生,过滤后的数据 studentList = studentList.stream().filter(item -> mergeStudentIdsSet.contains(item.getStudentId())).collect(Collectors.toList()); studentList.forEach(item ->{ TeacherOpenCourseStudentSigninLog studentSignInLog = teacherOpenCourseStudentSigninLogDao.getSQLManager() .lambdaQuery(TeacherOpenCourseStudentSigninLog.class) .andEq(TeacherOpenCourseStudentSigninLog::getTeacherOpenCourseStudentSigninSettingId, single.getTeacherOpenCourseStudentSigninSettingId()) .andEq(TeacherOpenCourseStudentSigninLog::getStudentId, item.getStudentId()) .andEq(TeacherOpenCourseStudentSigninLog::getTeacherOpenCourseId, single.getTeacherOpenCourseId()) .single(); if (Objects.isNull(studentSignInLog)){ DateTime date = DateUtil.date(); TeacherOpenCourseStudentSigninLog signInLog = new TeacherOpenCourseStudentSigninLog(); signInLog.setTeacherOpenCourseStudentSigninSettingId(single.getTeacherOpenCourseStudentSigninSettingId()); signInLog.setTeacherOpenCourseStudentSigninSettingSessionTime(date); signInLog.setStudentId(item.getStudentId()); signInLog.setTeacherOpenCourseId(single.getTeacherOpenCourseId()); signInLog.setSchoolClassId(item.getClassId()); signInLog.setTeacherOpenCourseStudentSigninLogAddTime(date); signInLog.setTeacherOpenCourseStudentSigninLogType(logTypeEnum.toString()); signInLog.setTeacherOpenCourseStudentSigninLogIp(getIpAddr(Objects.requireNonNull(request))); signInLog.setTeacherOpenCourseStudentSigninLogTag(UN_SIGN_IN); signInLog.setOrgId(single.getOrgId()); signInLog.setUserId(item.getUserId()); teacherOpenCourseStudentSigninLogDao.insert(signInLog); } }); } } /** * 签到汇总 * @param teacherOpenCourseId */ public TeacherOpenCourseStudentSigninLogSummaryVO summary(@NotNull(message = "开课ID不能为空!") Long teacherOpenCourseId) { return teacherOpenCourseStudentSigninLogDao.summary(teacherOpenCourseId); } @Override public void resetOperationByTeacherOpenCourseId(Long teacherOpenCourseId) { log.info("可能需要实现重置操作!"); } @Override public void deleteTeacherOpenCourseAllRelatedByTeacherOpenCourseId(@NotNull(message = "开课ID不能为空!") Long teacherOpenCourseId) { log.info("需要实现删除操作!"); } }