You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tianze-pro/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseStudentSig...

815 lines
46 KiB
Java

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;
2 years ago
import com.ibeetl.jlw.entity.vo.TeacherOpenCourseStudentSigninLogSummaryVO;
2 years ago
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;
2 years ago
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;
2 years ago
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.*;
2 years ago
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<TeacherOpenCourseStudentSigninLog> implements DeleteResourcesBy{
2 years ago
@Autowired private TeacherOpenCourseStudentSigninLogDao teacherOpenCourseStudentSigninLogDao;
@Autowired private TeacherOpenCourseStudentSigninSettingDao teacherOpenCourseStudentSigninSettingDao;
2 years ago
@Autowired private StudentDao studentDao;
@Autowired private TeacherOpenCourseMergeSchoolClassDao teacherOpenCourseMergeSchoolClassDao;
@Autowired private TeacherOpenCourseMergeStudentService teacherOpenCourseMergeStudentService;
2 years ago
@Autowired private TeacherOpenCourseStudentSigninLogSigninDTOValidator teacherOpenCourseStudentSigninLogSigninDTOValidator;
public PageQuery<TeacherOpenCourseStudentSigninLog>queryByCondition(PageQuery query){
PageQuery ret = teacherOpenCourseStudentSigninLogDao.queryByCondition(query);
queryListAfter(ret.getList());
return ret;
}
public PageQuery<TeacherOpenCourseStudentSigninLog>queryByConditionQuery(PageQuery query){
PageQuery ret = teacherOpenCourseStudentSigninLogDao.queryByConditionQuery(query);
queryListAfter(ret.getList());
return ret;
}
/**
*
* @param signinLogQuery
* @return
*/
public JsonResult<String> 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<list.size();i++){
ids += list.get(i).toString()+(i==list.size()-1?"":",");
}
if(StringUtils.isNotBlank(ids)){
teacherOpenCourseStudentSigninLogDao.deleteTeacherOpenCourseStudentSigninLogByIds(ids);
}
}
public void deleteTeacherOpenCourseStudentSigninLog(String ids){
try {
teacherOpenCourseStudentSigninLogDao.deleteTeacherOpenCourseStudentSigninLogByIds(ids);
} catch (Exception e) {
throw new PlatformException("批量删除学生签到记录失败", e);
}
}
public String addAll(TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery){
String msg = "";
List<TeacherOpenCourseStudentSigninLog> 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<teacherOpenCourseStudentSigninLogList.size();i++){
TeacherOpenCourseStudentSigninLog teacherOpenCourseStudentSigninLog = teacherOpenCourseStudentSigninLogList.get(i);
teacherOpenCourseStudentSigninLog.setUserId(teacherOpenCourseStudentSigninLogQuery.getUserId());
teacherOpenCourseStudentSigninLog.setOrgId(teacherOpenCourseStudentSigninLogQuery.getOrgId());
}
insertBatch(teacherOpenCourseStudentSigninLogList);
}
return msg;
}
public JsonResult add(TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery){
String msg = "";
TeacherOpenCourseStudentSigninLog teacherOpenCourseStudentSigninLog = teacherOpenCourseStudentSigninLogQuery.pojo();
teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninLogAddTime(new Date());
teacherOpenCourseStudentSigninLogDao.insert(teacherOpenCourseStudentSigninLog);
teacherOpenCourseStudentSigninLogQuery.setTeacherOpenCourseStudentSigninLogId(teacherOpenCourseStudentSigninLog.getTeacherOpenCourseStudentSigninLogId());
JsonResult jsonResult = new JsonResult();
jsonResult.setData(teacherOpenCourseStudentSigninLog.getTeacherOpenCourseStudentSigninLogId());//自增的ID丢进去
jsonResult.setCode(JsonReturnCode.SUCCESS.getCode());
jsonResult.setMsg(msg);
return jsonResult;
}
public String edit(TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery){
String msg = "";
TeacherOpenCourseStudentSigninLog teacherOpenCourseStudentSigninLog = teacherOpenCourseStudentSigninLogQuery.pojo();
teacherOpenCourseStudentSigninLogDao.updateTemplateById(teacherOpenCourseStudentSigninLog);
return msg;
}
public String updateGivenByIds(TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery){
String msg = "";
if(StringUtils.isNotBlank(teacherOpenCourseStudentSigninLogQuery.get_given())){
boolean flag = teacherOpenCourseStudentSigninLogDao.updateGivenByIds(teacherOpenCourseStudentSigninLogQuery) > 0;
if(!flag){
msg = "更新指定参数失败";
}
}else{
msg = "指定参数为空";
}
return msg;
}
public List<TeacherOpenCourseStudentSigninLog> getValues (Object paras){
return sqlManager.select(SqlId.of("jlw.teacherOpenCourseStudentSigninLog.getTeacherOpenCourseStudentSigninLogValues"), TeacherOpenCourseStudentSigninLog.class, paras);
}
public List<TeacherOpenCourseStudentSigninLog> getValuesByQuery (TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery){
return teacherOpenCourseStudentSigninLogDao.getValuesByQuery(teacherOpenCourseStudentSigninLogQuery);
}
public List<TeacherOpenCourseStudentSigninLog> getValuesByQueryNotWithPermission (TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery){
List<TeacherOpenCourseStudentSigninLog> values = teacherOpenCourseStudentSigninLogDao.getValuesByQueryNotWithPermission(teacherOpenCourseStudentSigninLogQuery);
queryListAfter(values);
return values;
}
public TeacherOpenCourseStudentSigninLog getInfo (Long teacherOpenCourseStudentSigninLogId){
TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery = new TeacherOpenCourseStudentSigninLogQuery();
teacherOpenCourseStudentSigninLogQuery.setTeacherOpenCourseStudentSigninLogId(teacherOpenCourseStudentSigninLogId);
List<TeacherOpenCourseStudentSigninLog> list = teacherOpenCourseStudentSigninLogDao.getValuesByQuery(teacherOpenCourseStudentSigninLogQuery);
if(null != list && list.size()>0){
return list.get(0);
}else{
return null;
}
}
public TeacherOpenCourseStudentSigninLog getInfo (TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery){
List<TeacherOpenCourseStudentSigninLog> 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) {
2 years ago
Student student = getStudent();
Assert.notNull(student, "该接口只能学生操作");
// 通过签到配置ID查询配置信息
List<TeacherOpenCourseStudentSigninSetting> signinSettingList =
teacherOpenCourseStudentSigninSettingDao.getByIds(signinDTO.getTeacherOpenCourseStudentSigninSettingId() + "");
Assert.notEmpty(signinSettingList, "签到配置ID无效");
// 通过签到配置ID查询对应的参数信息。用于下面的验证。
TeacherOpenCourseStudentSigninSetting signinSetting = signinSettingList.get(0);
// 断言验证,学生某个课程只能签到一次。三种签到类型,都可以签到
TeacherOpenCourseStudentSigninLog entity = new TeacherOpenCourseStudentSigninLog();
2 years ago
entity.setStudentId(student.getStudentId());
entity.setTeacherOpenCourseStudentSigninSettingId(signinSetting.getTeacherOpenCourseStudentSigninSettingId());
entity.setTeacherOpenCourseStudentSigninLogTag(SIGN_IN);
Assert.isTrue(ObjectUtil.isEmpty(teacherOpenCourseStudentSigninLogDao.template(entity)), "该学生已经签到过了!");
// 判断是否加入到这个课程中
long teacherOpenCourseInCount = teacherOpenCourseMergeSchoolClassDao.createLambdaQuery()
2 years ago
.andEq(TeacherOpenCourseMergeSchoolClass::getSchoolClassId, student.getClassId())
.andEq(TeacherOpenCourseMergeSchoolClass::getTeacherOpenCourseId, signinSetting.getTeacherOpenCourseId())
.count();
Assert.isTrue(teacherOpenCourseInCount > 0, "未加入到该课程中开课ID或学生ID有误");
switch (signinDTO.getTeacherOpenCourseStudentSigninLogType()) {
2 years ago
// IP签到
2 years ago
2 years ago
case ip_signin: {
ipSignInHandler(signinDTO, signinSetting);
}break;
2 years ago
// 手动签到。教师端操作
case manual_signin: {
manualSignInHandler(signinDTO, signinSetting);
}break;
2 years ago
// 验证码签到
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签到教师只能手动签到
2 years ago
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());
2 years ago
signinLogQuery.setStudentId(student.getStudentId());
2 years ago
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);
// 获取学生信息
2 years ago
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());
2 years ago
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签到教师只能手动签到
// 获取学生信息
2 years ago
Student student = getStudent();
Assert.notNull(student, "验证码签到方式,只允许学生进行操作!");
2 years ago
// 获取学生信息
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);
2 years ago
signinLogQuery.setStudentId(student.getStudentId());
signinLogQuery.setSchoolClassId(student.getClassId());
2 years ago
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<FileEntity> fileEntityList, List<Long>list, CoreUser coreUser){
List<String[]>errMsg = new ArrayList<>();
String msg ="";
int count = 0;
Date date = new Date();
for(int item=0;null != fileEntityList && item<fileEntityList.size();item++){
FileEntity fileEntity = fileEntityList.get(item);
if(null != fileEntity){
File file = new File(fileEntity.getAbsoluteUrl());
if(file.exists() && file.isFile() && file.canRead() && ToolUtils.findInSet("xls,xlsx",fileEntity.getFormat())){
Workbook wb = null;
InputStream is = null;
try {
is = new FileInputStream(fileEntity.getAbsoluteUrl());
if("xls".equals(fileEntity.getFormat())){
wb = new HSSFWorkbook(is);
}else if("xlsx".equals(fileEntity.getFormat())){
wb = new XSSFWorkbook(is);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(null != is){
is.close();
}
}catch (Exception e){
e.printStackTrace();
}
if(wb != null){
//获取Sheet1
Sheet sheet = wb.getSheet("Sheet1");
//获取最大行数
int rowNum = sheet.getPhysicalNumberOfRows();
//获取第一行
Row firstRow = sheet.getRow(0);
//获取最大列数
int colNum = firstRow.getPhysicalNumberOfCells();
2 years ago
String[] columns = {
"签到配置",
"场次时间",
"学生",
"开课",
"班级",
"签到日期",
"签到方式 ",
"备注",
"签到的IP",
"标记 10签到 20缺勤",
};
Map<String,Integer> map = new HashMap<>();//获取需要的表头的列
//从第一列找到需要的表头
for (int i=0; i<colNum; i++){
String cellData = getCellFormatValue(firstRow.getCell(i));
for(int j=0;j<columns.length;j++){
if(columns[j].equals(cellData)){
map.put(columns[j],i);
}
}
}
//验证所需要的表头是否全
Integer flag = 0;
for(int i=0;i<columns.length;i++){
if(null != map.get(columns[i])){
flag ++;
}
}
if(flag != columns.length){
String str = " ";
for(int i=0;i<columns.length;i++){
str += "\""+columns[i]+"\""+(i == columns.length-1?"":", ");
}
return JsonResult.failMessage("导入失败,表格表头应包含"+str);
}
for (int i = 1; i<rowNum; i++) {
Row row = sheet.getRow(i);
if(null == row){
errMsg.add(new String[]{"第"+(i+1)+"数据为空"});
continue;
}
String teacherOpenCourseStudentSigninSettingId = getCellFormatValue(row.getCell(map.get(columns[0])));
String teacherOpenCourseStudentSigninSettingSessionTime = getCellFormatValue(row.getCell(map.get(columns[1])));
String studentId = getCellFormatValue(row.getCell(map.get(columns[2])));
String teacherOpenCourseId = getCellFormatValue(row.getCell(map.get(columns[3])));
String schoolClassId = getCellFormatValue(row.getCell(map.get(columns[4])));
String teacherOpenCourseStudentSigninLogAddTime = getCellFormatValue(row.getCell(map.get(columns[5])));
String teacherOpenCourseStudentSigninLogType = getCellFormatValue(row.getCell(map.get(columns[6])));
String teacherOpenCourseStudentSigninLogRemark = getCellFormatValue(row.getCell(map.get(columns[7])));
String teacherOpenCourseStudentSigninLogIp = getCellFormatValue(row.getCell(map.get(columns[8])));
String teacherOpenCourseStudentSigninLogTag = getCellFormatValue(row.getCell(map.get(columns[9])));
//TODO 判断(如重复等复杂判断要额外写)
if(StringUtils.isBlank(teacherOpenCourseStudentSigninSettingId)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[0])+1)+"列,第"+(i+1)+"行签到配置为空"});
continue;
}else
if(StringUtils.isBlank(teacherOpenCourseStudentSigninSettingSessionTime)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[1])+1)+"列,第"+(i+1)+"行场次时间为空"});
continue;
}else
if(StringUtils.isBlank(studentId)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[2])+1)+"列,第"+(i+1)+"行学生为空"});
continue;
}else
if(StringUtils.isBlank(teacherOpenCourseId)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[3])+1)+"列,第"+(i+1)+"行开课为空"});
continue;
}else
if(StringUtils.isBlank(schoolClassId)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[4])+1)+"列,第"+(i+1)+"行班级为空"});
continue;
}else
if(StringUtils.isBlank(teacherOpenCourseStudentSigninLogAddTime)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[5])+1)+"列,第"+(i+1)+"行签到日期为空"});
continue;
}else
if(StringUtils.isBlank(teacherOpenCourseStudentSigninLogType)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[6])+1)+"列,第"+(i+1)+"行签到方式 为空"});
continue;
}else
if(StringUtils.isBlank(teacherOpenCourseStudentSigninLogRemark)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[7])+1)+"列,第"+(i+1)+"行备注为空"});
continue;
}else
if(StringUtils.isBlank(teacherOpenCourseStudentSigninLogIp)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[8])+1)+"列,第"+(i+1)+"行签到的IP为空"});
continue;
}else
if(StringUtils.isBlank(teacherOpenCourseStudentSigninLogTag)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[9])+1)+"列,第"+(i+1)+"行标记 10签到 20缺勤为空"});
continue;
}else
{
//TODO 保存
TeacherOpenCourseStudentSigninLog teacherOpenCourseStudentSigninLog = new TeacherOpenCourseStudentSigninLog();
teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninSettingId(Long.parseLong(teacherOpenCourseStudentSigninSettingId));
teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninSettingSessionTime(TimeTool.getTime(teacherOpenCourseStudentSigninSettingSessionTime));
teacherOpenCourseStudentSigninLog.setStudentId(Long.parseLong(studentId));
teacherOpenCourseStudentSigninLog.setTeacherOpenCourseId(Long.parseLong(teacherOpenCourseId));
teacherOpenCourseStudentSigninLog.setSchoolClassId(Long.parseLong(schoolClassId));
teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninLogAddTime(TimeTool.getTime(teacherOpenCourseStudentSigninLogAddTime));
teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninLogType(teacherOpenCourseStudentSigninLogType);
teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninLogRemark(teacherOpenCourseStudentSigninLogRemark);
teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninLogIp(teacherOpenCourseStudentSigninLogIp);
teacherOpenCourseStudentSigninLog.setTeacherOpenCourseStudentSigninLogTag(EnumUtil
2 years ago
.likeValueOf(SignInTypeEnum.class, teacherOpenCourseStudentSigninLogTag));
teacherOpenCourseStudentSigninLog.setOrgId(coreUser.getOrgId());
teacherOpenCourseStudentSigninLog.setUserId(coreUser.getId());
count++;
}
}
}
}
}
}
JsonResult jsonResult = new JsonResult();
jsonResult.setCode(count>0?JsonReturnCode.SUCCESS.getCode():JsonReturnCode.FAIL.getCode());
jsonResult.setData(errMsg);
jsonResult.setMsg((count>0?"导入成功,共导入"+count+"条":"导入失败")+(StringUtils.isNotBlank(msg)?"<br>"+msg:""));
return jsonResult;
}
public List<Map<String,Object>> getExcelValues (TeacherOpenCourseStudentSigninLogQuery teacherOpenCourseStudentSigninLogQuery){
return teacherOpenCourseStudentSigninLogDao.getExcelValues(teacherOpenCourseStudentSigninLogQuery);
}
/**
* -
* @param dto
* @return
*/
public void manualSigninAdd(@NotNull(message = "手动签到参数不能为空!") TeacherOpenCourseStudentSigninLogManualMergeDTO dto) {
// 获取当前登录用户信息
2 years ago
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);
2 years ago
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<Student> studentList = studentDao.getValuesByQuery(studentQuery);
String allStudentIds = listJoin(studentList, Student::getStudentId);
// 查询这个开课下的所有学生
TeacherOpenCourseMergeStudentQuery mergeStudentQuery = new TeacherOpenCourseMergeStudentQuery();
mergeStudentQuery.setTeacherOpenCourseSchoolClassMergeStudentStatus(1);
mergeStudentQuery.setStudentIdPlural(allStudentIds);
Set<Long> mergeStudentIdsSet = getFieldToSet(teacherOpenCourseMergeStudentService.getValuesByQueryNotWithPermission(mergeStudentQuery), TeacherOpenCourseMergeStudent::getStudentId);
// 替换原来查询到的所有学生,过滤后的数据
studentList = studentList.stream().filter(item -> mergeStudentIdsSet.contains(item.getStudentId())).collect(Collectors.toList());
// 构建签到日志集合
List<TeacherOpenCourseStudentSigninLog> 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);
}
2 years ago
2 years ago
/**
*
* @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<Student> studentList = studentDao.getValuesByQuery(studentQuery);
String allStudentIds = listJoin(studentList, Student::getStudentId);
// 查询这个开课下的所有学生
TeacherOpenCourseMergeStudentQuery mergeStudentQuery = new TeacherOpenCourseMergeStudentQuery();
mergeStudentQuery.setTeacherOpenCourseSchoolClassMergeStudentStatus(1);
mergeStudentQuery.setStudentIdPlural(allStudentIds);
Set<Long> 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());
2 years ago
teacherOpenCourseStudentSigninLogDao.insert(signInLog);
}
});
}
}
2 years ago
/**
*
* @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("需要实现删除操作!");
}
}