diff --git a/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreUserService.java b/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreUserService.java index 568894b4..f06dd841 100644 --- a/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreUserService.java +++ b/admin-core/src/main/java/com/ibeetl/admin/core/service/CoreUserService.java @@ -11,11 +11,15 @@ import com.ibeetl.admin.core.enums.MenuEnums; import com.ibeetl.admin.core.rbac.UserLoginInfo; import com.ibeetl.admin.core.util.PlatformException; import com.ibeetl.admin.core.util.enums.DelFlagEnum; +import com.ibeetl.admin.core.util.enums.GeneralStateEnum; import org.beetl.sql.core.SQLManager; 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.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; import java.util.Date; import java.util.List; @@ -23,9 +27,10 @@ import static com.ibeetl.admin.core.util.enums.GeneralStateEnum.ENABLE; @Service @Transactional +@Validated public class CoreUserService { @Autowired - CoreUserDao userDao ; + CoreUserDao coreUserDao; @Autowired CoreOrgDao orgDao; @@ -40,7 +45,7 @@ public class CoreUserService { query.setCode(userName); query.setPassword(passwordEncryptService.password(password)); query.setState(ENABLE.getValue()); - CoreUser user =userDao.createLambdaQuery().andEq(CoreUser::getCode,userName). + CoreUser user = coreUserDao.createLambdaQuery().andEq(CoreUser::getCode,userName). andEq(CoreUser::getPassword, passwordEncryptService.password(password)) .andEq(CoreUser::getState, ENABLE.getValue()).single(); if(user==null) { @@ -74,7 +79,7 @@ public class CoreUserService { Assert.isTrue(ObjectUtil.isAllNotEmpty(userCode, password, orgId, jobType0, jobType1), "所有参数均为必传!"); // 判断用户Code唯一 - Boolean isNotExist = userDao.createLambdaQuery().andEq(CoreUser::getCode,userCode).count() == 0; + Boolean isNotExist = coreUserDao.createLambdaQuery().andEq(CoreUser::getCode,userCode).count() == 0; Assert.isTrue(isNotExist, "用户Code重复!"); CoreUser user = new CoreUser(); @@ -86,9 +91,8 @@ public class CoreUserService { user.setDelFlag(0); user.setJobType0(jobType0.name()); user.setJobType1(jobType1.name()); - user.setState(ENABLE.getValue()); user.setOrgId(orgId); - userDao.insert(user); + coreUserDao.insert(user); return user.getId(); } @@ -103,17 +107,17 @@ public class CoreUserService { } public List getAllUsersByRole(String role){ - return userDao.getUserByRole(role); + return coreUserDao.getUserByRole(role); } public CoreUser getUserByCode(String userName){ CoreUser user = new CoreUser(); user.setCode(userName); - return userDao.templateOne(user); + return coreUserDao.templateOne(user); } public void update(CoreUser user){ - userDao.updateById(user); + coreUserDao.updateById(user); } public CoreOrg getOrgById(Long orgId){ @@ -121,7 +125,7 @@ public class CoreUserService { } public CoreUser getUserById(Long userId){ - return userDao.unique(userId); + return coreUserDao.unique(userId); } public List getOrgCode(List orgIds){ @@ -129,7 +133,34 @@ public class CoreUserService { } public List getCoreUserList(CoreUser coreUser){ - return userDao.template(coreUser); + return coreUserDao.template(coreUser); + } + + /** + * 验证 + * @return + */ + public Boolean verifyPwd(@NotBlank(message = "待验证的密码不能为空!") String pwd, @NotNull(message = "用户ID不能为空!") Long userId) { + CoreUser user = new CoreUser(); + user.setId(userId); + user.setState(GeneralStateEnum.ENABLE.getValue()); + user.setDelFlag(DelFlagEnum.NORMAL.getValue()); + CoreUser coreUser = coreUserDao.templateOne(user); + return coreUser.getPassword().equals(passwordEncryptService.password(pwd)); + } + + /** + * 验证 + * @return + */ + public Boolean editPwdByOld(@NotBlank(message = "旧密码不能为空!") String oldPwd, + @NotBlank(message = "新密码不能为空!") String newPwd, + @NotNull(message = "用户ID不能为空!") Long userId) { + Assert.isTrue(verifyPwd(oldPwd, userId), "旧密码验证失败!"); + CoreUser entity = new CoreUser(); + entity.setId(userId); + entity.setPassword(newPwd); + return coreUserDao.updateTemplateById(entity) > 0; } /** diff --git a/admin-core/src/main/java/com/ibeetl/admin/core/web/CoreUserController.java b/admin-core/src/main/java/com/ibeetl/admin/core/web/CoreUserController.java index eec6bbf9..25f95347 100644 --- a/admin-core/src/main/java/com/ibeetl/admin/core/web/CoreUserController.java +++ b/admin-core/src/main/java/com/ibeetl/admin/core/web/CoreUserController.java @@ -1,5 +1,6 @@ package com.ibeetl.admin.core.web; +import cn.hutool.core.bean.BeanUtil; import com.ibeetl.admin.core.conf.PasswordConfig.PasswordEncryptService; import com.ibeetl.admin.core.dao.CoreUserRoleDao; import com.ibeetl.admin.core.entity.CoreOrg; @@ -25,11 +26,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static com.ibeetl.admin.core.util.user.CacheUserUtil.getUser; + @Controller @SuppressWarnings("unchecked") public class CoreUserController { private final Log log = LogFactory.getLog(this.getClass()); private static final String MODEL = "/core/user"; + private static final String API = "/api/core/user"; @Autowired CorePlatformService platformService; @@ -125,7 +129,30 @@ public class CoreUserController { } else { return JsonResult.failMessage("密码错误"); } + } + /** + * 对当前登录多用户,支持修改一些属性 + * 修改基础资料 + * @param coreUser + * @return + */ + @PostMapping(API + "/edit.do") + @ResponseBody + public JsonResult edit(CoreUser coreUser) { + // 获取当前登录用户 + CoreUser user = getUser(); + + // 禁止修改的一些属性,先给去掉 + coreUser.setCode(null); + coreUser.setJobType0(null); + coreUser.setJobType1(null); + coreUser.setId(null); + + BeanUtil.copyProperties(coreUser, user); + user.setPassword(passwordEncryptService.password(coreUser.getPassword())); + userService.update(user); + return JsonResult.success(); } /** diff --git a/web/src/main/java/com/ibeetl/jlw/dao/ResourcesQuestionSnapshotDao.java b/web/src/main/java/com/ibeetl/jlw/dao/ResourcesQuestionSnapshotDao.java index 43d41239..6cd25c84 100644 --- a/web/src/main/java/com/ibeetl/jlw/dao/ResourcesQuestionSnapshotDao.java +++ b/web/src/main/java/com/ibeetl/jlw/dao/ResourcesQuestionSnapshotDao.java @@ -1,8 +1,8 @@ package com.ibeetl.jlw.dao; import com.ibeetl.jlw.entity.ResourcesQuestionSnapshot; -import com.ibeetl.jlw.entity.TeacherOpenCourseQuestionTestSimpleInfo; import com.ibeetl.jlw.entity.vo.TeacherOpenCourseQuestionTestDetailVO; +import com.ibeetl.jlw.entity.vo.TeacherOpenCourseQuestionTestSimpleInfoVO; import com.ibeetl.jlw.web.query.ResourcesQuestionSnapshotQuery; import org.beetl.sql.core.engine.PageQuery; import org.beetl.sql.mapper.BaseMapper; @@ -30,10 +30,10 @@ public interface ResourcesQuestionSnapshotDao extends BaseMapper getQuestionTestSimpleInfo(PageQuery query); /** * 题目练习详情 diff --git a/web/src/main/java/com/ibeetl/jlw/dao/TeacherOpenCourseQuestionLogDao.java b/web/src/main/java/com/ibeetl/jlw/dao/TeacherOpenCourseQuestionLogDao.java index 10335fe4..fede0dc8 100644 --- a/web/src/main/java/com/ibeetl/jlw/dao/TeacherOpenCourseQuestionLogDao.java +++ b/web/src/main/java/com/ibeetl/jlw/dao/TeacherOpenCourseQuestionLogDao.java @@ -27,6 +27,7 @@ public interface TeacherOpenCourseQuestionLogDao extends BaseMapper getByIds(String ids); List getValuesByQuery(TeacherOpenCourseQuestionLogQuery teacherOpenCourseQuestionLogQuery); + List getValuesByQueryNotWithPermission(TeacherOpenCourseQuestionLogQuery teacherOpenCourseQuestionLogQuery); PageQuery studentScoreList(PageQuery query); diff --git a/web/src/main/java/com/ibeetl/jlw/entity/dto/TeacherOpenCourseQuestionTestSimpleInfoDTO.java b/web/src/main/java/com/ibeetl/jlw/entity/dto/TeacherOpenCourseQuestionTestSimpleInfoDTO.java new file mode 100644 index 00000000..419fa5f1 --- /dev/null +++ b/web/src/main/java/com/ibeetl/jlw/entity/dto/TeacherOpenCourseQuestionTestSimpleInfoDTO.java @@ -0,0 +1,33 @@ +package com.ibeetl.jlw.entity.dto; + +import cn.jlw.validate.ValidateConfig; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.ibeetl.admin.core.web.query.PageParam; +import lombok.*; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; + +/** + * 题目配置 + * 抽题配置类 + * + * @author mlx + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +@JsonIgnoreProperties(ignoreUnknown = true) +@EqualsAndHashCode(callSuper=false) +public class TeacherOpenCourseQuestionTestSimpleInfoDTO extends PageParam { + + /** + * 题目配置ID + */ + @NotNull(message = "题目配置ID不能为空!", groups = ValidateConfig.ADD.class) + private Long questionSettingId; +} + + diff --git a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionTestSimpleInfo.java b/web/src/main/java/com/ibeetl/jlw/entity/vo/TeacherOpenCourseQuestionTestSimpleInfoVO.java similarity index 83% rename from web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionTestSimpleInfo.java rename to web/src/main/java/com/ibeetl/jlw/entity/vo/TeacherOpenCourseQuestionTestSimpleInfoVO.java index 70525b71..e5f16cc1 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionTestSimpleInfo.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/vo/TeacherOpenCourseQuestionTestSimpleInfoVO.java @@ -1,4 +1,4 @@ -package com.ibeetl.jlw.entity; +package com.ibeetl.jlw.entity.vo; import lombok.Data; import lombok.EqualsAndHashCode; @@ -10,7 +10,7 @@ import lombok.EqualsAndHashCode; */ @Data @EqualsAndHashCode(callSuper=false) -public class TeacherOpenCourseQuestionTestSimpleInfo { +public class TeacherOpenCourseQuestionTestSimpleInfoVO { //开课题目配置ID diff --git a/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionSnapshotService.java b/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionSnapshotService.java index 5ecefa9a..f1f6e54d 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionSnapshotService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionSnapshotService.java @@ -16,6 +16,7 @@ import com.ibeetl.jlw.dao.TeacherOpenCourseMergeResourcesQuestionDao; import com.ibeetl.jlw.entity.*; import com.ibeetl.jlw.entity.dto.TeacherOpenCourseQuestionSettingDTO; import com.ibeetl.jlw.entity.vo.TeacherOpenCourseQuestionTestDetailVO; +import com.ibeetl.jlw.entity.vo.TeacherOpenCourseQuestionTestSimpleInfoVO; import com.ibeetl.jlw.web.query.ResourcesQuestionSnapshotQuery; import com.ibeetl.jlw.web.query.TeacherOpenCourseQuestionSettingQuery; import lombok.extern.slf4j.Slf4j; @@ -462,12 +463,11 @@ public class ResourcesQuestionSnapshotService extends CoreBaseService getQuestionTestSimpleInfo(PageQuery query) { + return resourcesQuestionSnapshotDao.getQuestionTestSimpleInfo(query); } /** @@ -491,16 +491,6 @@ public class ResourcesQuestionSnapshotService extends CoreBaseServicequeryByCondition(PageQuery query){ PageQuery ret = teacherOpenCourseQuestionLogDao.queryByCondition(query); @@ -247,6 +242,23 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService updateList = teacherOpenCourseQuestionLogDao.getValuesByQueryNotWithPermission(teacherOpenCourseQuestionLogQuery); + + // 批量更新分数 + updateList.forEach(questionLog -> questionLog.setQuestionScore(score)); + updateBatchTemplate(updateList); + } + /** * 和题目有关的做题提交方法 * 直接计算出学生得分情况 @@ -255,15 +267,59 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService> questionLogMap, + @NotEmpty(message = "请上传题目快照ID和答案!") Map> questionLogMap, @NotNull(message = "开课题目配置ID不能为空!") final Long questionSettingId) { // 查询学生身份 final Student student = studentDao.getByUserId(getUserId()); + TeacherOpenCourseQuestionSetting info = teacherOpenCourseQuestionSettingService.getInfo(questionSettingId); + switch(info.getTeacherOpenCourseQuestionSettingType()) { + case HOMEWORK_FILE: { + addFileRelatedLog(join(questionLogMap.values().toArray(), ","), questionSettingId, student); + } break; + + // 这些都和题目相关,暂时先放在一个方法 + case CHAPTER_EXERCISE: + case EXAM: + case HOMEWORK_QUESTION:{ + addQuestionRelatedLog(questionLogMap, questionSettingId, student); + } break; + } + } + + /** + * 跟题目相关的题目日志提交方法 + * 附件类型的需要单独,拆分除去 + * + * @param absFilePath + * @param questionSettingId + * @param student + */ + private void addFileRelatedLog(@NotBlank(message = "上传的附件不能为空!") String absFilePath, Long questionSettingId, Student student) { + TeacherOpenCourseQuestionLogQuery query = new TeacherOpenCourseQuestionLogQuery(); + query.setTeacherOpenCourseQuestionLogUploadFile(absFilePath); + query.setTeacherOpenCourseQuestionSettingId(questionSettingId); + query.setTeacherOpenCourseQuestionLogStatus(1); + query.setOrgId(student.getOrgId()); + query.setUserId(student.getUserId()); + query.setStudentId(student.getStudentId()); + add(query); + } + + /** + * 跟题目相关的题目日志提交方法 + * 附件类型的需要单独,拆分除去 + * + * @param questionLogMap + * @param questionSettingId + * @param student + */ + private void addQuestionRelatedLog(Map> questionLogMap, Long questionSettingId, Student student) { // 查询符合条件的日志表 String questionSnapshotIds = join(questionLogMap.keySet().toArray(), ","); + // 做题思路:先从开课QuestionSetting表中生成题目日志,到开课QuestionLog中,学生这个时候提交答案,再修改日志中的结果。 // 查询条件 TeacherOpenCourseQuestionLogQuery questionLogQuery = TeacherOpenCourseQuestionLogQuery.builder() .resourcesQuestionSnapshotIdPlural(questionSnapshotIds) @@ -278,110 +334,22 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService { // 学生提交的答案 String answersText = join(questionLogMap.get(questionLog.getResourcesQuestionSnapshotId()).toArray(), ","); - // 包含/字符,代表是路径地址,是附件类型 - if(answersText.startsWith("/")) { - questionLog.setTeacherOpenCourseQuestionLogUploadFile(answersText); - } - // 否则就是普通选择题的答案 - else { - questionLog.setTeacherOpenCourseQuestionLogAnswer(answersText); - } + questionLog.setTeacherOpenCourseQuestionLogAnswer(answersText); // 是否是正确答案 Boolean isCorrectAnswer = questionLog.getQuestionAnswer().equalsIgnoreCase(answersText); // 计算该题目学生的得分情况 questionLog.setStudentScore(isCorrectAnswer ? questionLog.getQuestionScore() : BigDecimal.valueOf(0)); - }); // 学生做的题目的答案与日志关联 updateBatchTemplate(logList); - // 批量插入错题集,方法内部自带判断 + // 批量插入错题集,方法内部自带分数判断 teacherOpenCourseQuestionLogWrongService.insertBatchByQuestionLogList(logList); } - - /** - * 获取作业 - * - * @param teacherOpenCourseQuestionSettingId 开课作业ID - * @param fromTypeEnum - * @return - */ - public List questionDetail(@NotNull(message = "题目配置ID不能为空!") final Long teacherOpenCourseQuestionSettingId, - @NotNull(message = "类型不能为空!") ResourcesQuestionSnapshotFromTypeEnum fromTypeEnum) { - - // 获取学生ID - CoreUser coreUser = getUser(); - final Student student = studentDao.getByUserId(coreUser.getId()); - - // 常量 True的Integer表现 - final Integer TRUE_CONST = 1; - List resourcesQuestionSnapshots = new ArrayList<>(); - TeacherOpenCourseQuestionSetting homework = teacherOpenCourseQuestionSettingSettingService.getInfo(teacherOpenCourseQuestionSettingId); - Assert.notNull(homework, "未查询到来源ID对应的题目!"); - - TeacherOpenCourseQuestionSettingQuery settingQuery = new TeacherOpenCourseQuestionSettingQuery(); - settingQuery.setTeacherOpenCourseQuestionSettingId(teacherOpenCourseQuestionSettingId); - TeacherOpenCourseQuestionSetting hwSetting = teacherOpenCourseQuestionSettingSettingService.getInfo(settingQuery); - - ResourcesQuestionSnapshotQuery questionSnapshotQuery = new ResourcesQuestionSnapshotQuery(); - questionSnapshotQuery.setTeacherOpenCourseQuestionSettingId(teacherOpenCourseQuestionSettingId); - - // 章节练习,则跳过次数验证 - if (!EnumUtil.contains(fromTypeEnum, CHAPTER_EXERCISE)) { - // 作答次数 - Integer teacherOpenCourseQuestionSettingSettingDoCount = hwSetting.getTeacherOpenCourseQuestionSettingDoCount(); - Assert.isTrue(teacherOpenCourseQuestionSettingSettingDoCount > 1, "作答次数设置有误,请联系管理员!"); - // 数据库查询该学生已经做过的次数 - TeacherOpenCourseQuestionLog teacherOpenCourseQuestionLog = new TeacherOpenCourseQuestionLog(); - teacherOpenCourseQuestionLog.setStudentId(student.getStudentId()); - long doCount = teacherOpenCourseQuestionLogDao.templateCount(teacherOpenCourseQuestionLog); - // 断言判断最大作答次数 - Assert.isTrue(doCount < teacherOpenCourseQuestionSettingSettingDoCount, "已超过最大作答次数!"); - } - - // 答卷后显示答案解析 - if (TRUE_CONST.equals(hwSetting.getTeacherOpenCourseQuestionSettingEndShowQa())) { - // TODO 逻辑不要在这里写 - /** 实现 {@link TeacherOpenCourseQuestionLogService#questionAnalysis(TreeSet)} */ - } - - // 答卷后显示答案对错 - if (TRUE_CONST.equals(hwSetting.getTeacherOpenCourseQuestionSettingEndShowTrueFalse())) { - // TODO 逻辑不要在这里写 - /** 实现 {@link TeacherOpenCourseQuestionLogService#questionAnalysis(TreeSet)} */ - } - - // 题目乱序(同一大题内) - if (TRUE_CONST.equals(hwSetting.getTeacherOpenCourseQuestionSettingQuestionNoOrder())) { - questionSnapshotQuery.setRand(true); - } - - // 题目查询 - resourcesQuestionSnapshots = resourcesQuestionSnapshotDao.getValuesByQuery(questionSnapshotQuery); - - // 选项乱序(限单选、多选) - if (TRUE_CONST.equals(hwSetting.getTeacherOpenCourseQuestionSettingOptionNoOrder())) { - // 单题选项排序处理 - resourcesQuestionSnapshots.forEach(value -> { - shuffleOrderOptions(value, "questionAnswer","questionOption", true); - }); - } - - // 学生身份屏蔽答案,且记录在做题日志表中 - if (coreUser.isStudent()) { - // 做题日志关联学生, 初步提交做题日志信息,不包含学生提交的答案和得分情况 - preSubmitStudentQuestionLog(student.getStudentId(), teacherOpenCourseQuestionSettingId, resourcesQuestionSnapshots); - // 学生身份,需要屏蔽答案,再丢给前端 - resourcesQuestionSnapshots.forEach(ResourcesQuestionSnapshot::hideAnswer); - } - - return resourcesQuestionSnapshots; - } - /** * 日志关联学生信息和配置ID信息 * @@ -397,6 +365,7 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService> questionAnalysis(@NotEmpty(message = "请上传题目快照ID和答案!") final TreeSet questionSnapshotIds) { + public Map> questionAnalysis(@NotNull(message = "题目配置ID不能为空!") Long questionSettingId) { + ResourcesQuestionSnapshotQuery resourcesQuestionSnapshotQuery = new ResourcesQuestionSnapshotQuery(); + resourcesQuestionSnapshotQuery.setTeacherOpenCourseQuestionSettingId(questionSettingId); + resourcesQuestionSnapshotQuery.setQuestionStatus(1); + List valuesByQuery = resourcesQuestionSnapshotDao.getValuesByQuery(resourcesQuestionSnapshotQuery); + return questionAnalysis(valuesByQuery); + } - // 查询题目快照列表 - List questionSnapshots = resourcesQuestionSnapshotDao.getByIds(join(questionSnapshotIds.toArray(), ",")); + /** + * 根据题目快照ID查询题目快照,并根据类型分组 + * + * @param questionSnapshotIds + * @return + */ + public Map> questionAnalysis(@NotNull(message = "题目配置ID不能为空!") TreeSet questionSnapshotIds) { + List valuesByQuery = resourcesQuestionSnapshotDao.getByIds(join(questionSnapshotIds.toArray(), ",")); + return questionAnalysis(valuesByQuery); + } - Assert.notEmpty(questionSnapshots, "未查询到题目列表!"); + /** + * 开课相关-考试或者作业,答题提交后,获取问题解析。根据配置获取 + * @param questionSnapshots + * @return + */ + public Map> questionAnalysis(@NotEmpty(message = "未查询到题目列表!") final List questionSnapshots) { TeacherOpenCourseQuestionSettingQuery settingQuery = new TeacherOpenCourseQuestionSettingQuery(); settingQuery.setTeacherOpenCourseQuestionSettingId(questionSnapshots.get(0).getTeacherOpenCourseQuestionSettingId()); @@ -444,7 +433,7 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService implements DeleteResourcesBy{ @Autowired private TeacherOpenCourseQuestionSettingDao teacherOpenCourseQuestionSettingDao; + @Autowired private ResourcesQuestionSnapshotDao resourcesQuestionSnapshotDao; + @Autowired private TeacherOpenCourseQuestionLogDao teacherOpenCourseQuestionLogDao; + @Autowired private StudentDao studentDao; @Autowired private ResourcesQuestionSnapshotService resourcesQuestionSnapshotService; @Autowired private TeacherOpenCourseQuestionLogService teacherOpenCourseQuestionLogService; @Autowired private TeacherOpenCourseQuestionLogWrongService teacherOpenCourseQuestionLogWrongService; @@ -588,4 +603,86 @@ public class TeacherOpenCourseQuestionSettingService extends CoreBaseService questionDetail(@NotNull(message = "题目配置ID不能为空!") final Long teacherOpenCourseQuestionSettingId, + @NotNull(message = "类型不能为空!") ResourcesQuestionSnapshotFromTypeEnum fromTypeEnum) { + + // 获取学生ID + CoreUser coreUser = getUser(); + final Student student = studentDao.getByUserId(coreUser.getId()); + + Assert.isTrue(!fromTypeEnum.equals(HOMEWORK_FILE), "作业-附件类型 不需要获取题目快照!"); + + // 常量 True的Integer表现 + final Integer TRUE_CONST = 1; + List resourcesQuestionSnapshots = new ArrayList<>(); + TeacherOpenCourseQuestionSetting homework = getInfo(teacherOpenCourseQuestionSettingId); + Assert.notNull(homework, "未查询到来源ID对应的题目!"); + + TeacherOpenCourseQuestionSettingQuery settingQuery = new TeacherOpenCourseQuestionSettingQuery(); + settingQuery.setTeacherOpenCourseQuestionSettingId(teacherOpenCourseQuestionSettingId); + TeacherOpenCourseQuestionSetting hwSetting = getInfo(settingQuery); + + ResourcesQuestionSnapshotQuery questionSnapshotQuery = new ResourcesQuestionSnapshotQuery(); + questionSnapshotQuery.setTeacherOpenCourseQuestionSettingId(teacherOpenCourseQuestionSettingId); + + // 章节练习,则跳过次数验证; + // 其他类型,都需要验证作答次数 + if (!EnumUtil.contains(fromTypeEnum, CHAPTER_EXERCISE)) { + // 作答次数 + Integer teacherOpenCourseQuestionSettingSettingDoCount = hwSetting.getTeacherOpenCourseQuestionSettingDoCount(); + Assert.isTrue(teacherOpenCourseQuestionSettingSettingDoCount > 1, "作答次数设置有误,请联系管理员!"); + // 数据库查询该学生已经做过的次数 + TeacherOpenCourseQuestionLog teacherOpenCourseQuestionLog = new TeacherOpenCourseQuestionLog(); + teacherOpenCourseQuestionLog.setStudentId(student.getStudentId()); + long doCount = teacherOpenCourseQuestionLogDao.templateCount(teacherOpenCourseQuestionLog); + // 断言判断最大作答次数 + Assert.isTrue(doCount < teacherOpenCourseQuestionSettingSettingDoCount, "已超过最大作答次数!"); + } + + // 答卷后显示答案解析 + if (TRUE_CONST.equals(hwSetting.getTeacherOpenCourseQuestionSettingEndShowQa())) { + // TODO 逻辑不要在这里写 + /** 实现 {@link TeacherOpenCourseQuestionLogService#questionAnalysis(TreeSet)} */ + } + + // 答卷后显示答案对错 + if (TRUE_CONST.equals(hwSetting.getTeacherOpenCourseQuestionSettingEndShowTrueFalse())) { + // TODO 逻辑不要在这里写 + /** 实现 {@link TeacherOpenCourseQuestionLogService#questionAnalysis(TreeSet)} */ + } + + // 题目乱序(同一大题内) + if (TRUE_CONST.equals(hwSetting.getTeacherOpenCourseQuestionSettingQuestionNoOrder())) { + questionSnapshotQuery.setRand(true); + } + + // 题目查询 + resourcesQuestionSnapshots = resourcesQuestionSnapshotDao.getValuesByQuery(questionSnapshotQuery); + + // 选项乱序(限单选、多选) + if (TRUE_CONST.equals(hwSetting.getTeacherOpenCourseQuestionSettingOptionNoOrder())) { + // 单题选项排序处理 + resourcesQuestionSnapshots.forEach(value -> { + shuffleOrderOptions(value, "questionAnswer","questionOption", true); + }); + } + + // 学生身份屏蔽答案,且记录在做题日志表中 + if (coreUser.isStudent()) { + // 做题日志关联学生, 初步提交做题日志信息,不包含学生提交的答案和得分情况 + teacherOpenCourseQuestionLogService.preSubmitStudentQuestionLog(student.getStudentId(), teacherOpenCourseQuestionSettingId, resourcesQuestionSnapshots); + // 学生身份,需要屏蔽答案,再丢给前端 + resourcesQuestionSnapshots.forEach(ResourcesQuestionSnapshot::hideAnswer); + } + + return resourcesQuestionSnapshots; + } } diff --git a/web/src/main/java/com/ibeetl/jlw/web/ResourcesQuestionSnapshotController.java b/web/src/main/java/com/ibeetl/jlw/web/ResourcesQuestionSnapshotController.java index 28789bb1..ead837b9 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/ResourcesQuestionSnapshotController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/ResourcesQuestionSnapshotController.java @@ -11,8 +11,8 @@ import com.ibeetl.admin.core.file.FileService; import com.ibeetl.admin.core.web.JsonResult; import com.ibeetl.jlw.entity.ResourcesQuestionSnapshot; import com.ibeetl.jlw.entity.TeacherOpenCourseQuestionLogScoreInfo; -import com.ibeetl.jlw.entity.TeacherOpenCourseQuestionTestSimpleInfo; import com.ibeetl.jlw.entity.dto.TeacherOpenCourseQuestionTestDetailDTO; +import com.ibeetl.jlw.entity.dto.TeacherOpenCourseQuestionTestSimpleInfoDTO; import com.ibeetl.jlw.entity.vo.TeacherOpenCourseQuestionTestDetailVO; import com.ibeetl.jlw.service.ResourcesQuestionSnapshotService; import com.ibeetl.jlw.web.query.ResourcesQuestionSnapshotQuery; @@ -163,6 +163,21 @@ public class ResourcesQuestionSnapshotController extends BaseController { write(response, filename,"Sheet1", header.values(), convertData(header.keySet(), maps)); } + /** + * 学生端-获取章节练习的简单信息 + * 支持根据来源类型查询 + * + * @param dto 分页参数 + * @param coreUser + * @return + */ + @PostMapping(API + "/getQuestionTestSimpleInfo.do") + public JsonResult getQuestionTestSimpleInfoDo(@Validated(ValidateConfig.ADD.class) TeacherOpenCourseQuestionTestSimpleInfoDTO dto, + @SCoreUser CoreUser coreUser) { + Assert.isTrue(coreUser.isStudent(), "非学生身份,无法获取数据!"); + return JsonResult.success(resourcesQuestionSnapshotService.getQuestionTestSimpleInfo(dto.getPageQuery())); + } + /* 后台页面 */ @@ -296,26 +311,6 @@ public class ResourcesQuestionSnapshotController extends BaseController { return JsonResult.success(resourcesQuestionSnapshotService.getScoreInfo(teacherOpenCourseQuestionSettingId)); } - - /** - * 学生端-获取章节练习的简单信息 - * 支持根据来源类型查询 - * - * @param questionSettingId 开课题目配置ID - * @param coreUser - * @return - */ - @PostMapping(MODEL + "/getQuestionTestSimpleInfo.json") - @Function("teacherOpenCourseQuestionLog.query") - @ResponseBody - public JsonResult getQuestionTestSimpleInfo( - Long questionSettingId, - @SCoreUser - CoreUser coreUser) { - Assert.isTrue(coreUser.isStudent(), "非学生身份,无法获取数据!"); - return JsonResult.success(resourcesQuestionSnapshotService.getQuestionTestSimpleInfo(questionSettingId)); - } - /** * 教师端-获取题目的练习成绩 * 支持根据来源类型查询 @@ -345,22 +340,7 @@ public class ResourcesQuestionSnapshotController extends BaseController { } /** - * 教师端-(开课)题目管理列表(试题管理等等) - * 支持根据来源类型查询 - * - * @param questionSettingId 开课题目配置ID - * @return - */ - @PostMapping(MODEL + "/questionManagement.json") - @Function("teacherOpenCourseQuestionLog.query") - @ResponseBody - public JsonResult questionManagement(Long questionSettingId) { - return JsonResult.success(resourcesQuestionSnapshotService.questionManagement(questionSettingId)); - } - - /** - * 教师端-(开课)题目管理列表(试题管理等等) - * 支持根据来源类型查询 + * 教师端-绑定知识点 * * @param teacherOpenCourseIds 开课ID集合,支持多对多 * @param teacherOpenCourseKnowledgePointsIds 知识点ID集合 diff --git a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseChatLogController.java b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseChatLogController.java index 7897de77..66e76d49 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseChatLogController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseChatLogController.java @@ -2,9 +2,6 @@ package com.ibeetl.jlw.web; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.extra.validation.BeanValidationResult; -import cn.hutool.extra.validation.ValidationUtil; -import cn.hutool.json.JSONUtil; import cn.jlw.Interceptor.SCoreUser; import cn.jlw.validate.ValidateConfig; import com.ibeetl.admin.core.annotation.Function; @@ -30,9 +27,6 @@ import java.math.BigDecimal; import java.util.List; import java.util.stream.Collectors; -import static com.ibeetl.jlw.web.query.TeacherOpenCourseChatLogQuery.STUDENT_ADD; -import static com.ibeetl.jlw.web.query.TeacherOpenCourseChatLogQuery.TEACHER_ADD; - /** * 开课互动 课程开课-互动-评论日志 接口 * 切记不要对非线程安全的静态变量进行写操作 @@ -266,24 +260,12 @@ public class TeacherOpenCourseChatLogController{ * @param coreUser * @return */ - @PostMapping(MODEL + "/addByType.json") - @Function("teacherOpenCourseChatLog.add") + @PostMapping(API + "/addByType.do") public JsonResult addByType( @RequestBody TeacherOpenCourseChatLogQuery teacherOpenCourseChatLogQuery, Integer type, BindingResult result, @SCoreUser CoreUser coreUser){ - Boolean isTeacherAdding = type.equals(1); - // 验证 - BeanValidationResult validationResult = ValidationUtil - .warpValidate(teacherOpenCourseChatLogQuery, isTeacherAdding ? TEACHER_ADD.class : STUDENT_ADD.class); - Assert.isTrue(validationResult.isSuccess(), JSONUtil.toJsonStr(validationResult.getErrorMessages())); - - // 教师身份,添加上级ID为0 - if(isTeacherAdding) { - teacherOpenCourseChatLogQuery.setTeacherOpenCourseChatLogParentId(0L); - } - if(result.hasErrors()){ return JsonResult.failMessage(result); }else{ @@ -292,7 +274,7 @@ public class TeacherOpenCourseChatLogController{ if(null == teacherOpenCourseChatLogQuery.getTeacherOpenCourseChatLogStatus()){ teacherOpenCourseChatLogQuery.setTeacherOpenCourseChatLogStatus(1); } - return teacherOpenCourseChatLogService.add(teacherOpenCourseChatLogQuery); + return teacherOpenCourseChatLogService.addByType(teacherOpenCourseChatLogQuery, type); } } diff --git a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogController.java b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogController.java index 9ca57352..df1f3c3a 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionLogController.java @@ -8,7 +8,6 @@ import com.ibeetl.admin.core.entity.CoreUser; import com.ibeetl.admin.core.file.FileService; import com.ibeetl.admin.core.web.JsonResult; import com.ibeetl.jlw.entity.TeacherOpenCourseQuestionLog; -import com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum; import com.ibeetl.jlw.service.TeacherOpenCourseQuestionLogService; import com.ibeetl.jlw.web.query.TeacherOpenCourseQuestionLogQuery; import org.apache.commons.lang3.StringUtils; @@ -22,6 +21,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import javax.validation.constraints.NotNull; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.TreeSet; @@ -85,27 +85,19 @@ public class TeacherOpenCourseQuestionLogController { return JsonResult.success(page); } - /** - * 学生端-教师端-根据题目配置信息,获取相关的题目 - * 每次获取 - * - * @param teacherOpenCourseQuestionSettingId 配置ID - * @param fromTypeEnum 来源类型 - * @return - */ - @PostMapping(API + "/questionDetail.do") - public JsonResult questionDetail(Long teacherOpenCourseQuestionSettingId, - ResourcesQuestionSnapshotFromTypeEnum fromTypeEnum, @SCoreUser CoreUser coreUser) { - Assert.isTrue(coreUser.isStudent(), "非学生身份,无法获取题目!"); - return JsonResult.success(teacherOpenCourseQuestionLogService.questionDetail(teacherOpenCourseQuestionSettingId, fromTypeEnum)); + @PostMapping(API + "/delete.do") + public JsonResult deleteDo(String ids) { + teacherOpenCourseQuestionLogService.deleteTeacherOpenCourseQuestionLog(ids); + return JsonResult.success(); } /** * 学生端-和题目有关的提交方法 (章节测试、考试、作业) - *
  • 支持附件上传
  • - * 答案集合中,会包含"/"字符串,则代表是路径地址,则是附件类型的答案 + *
  • 支持附件上传
  • * - * @param questionLogMap <题目快照ID, [数组:前端传递过来不需要考虑排序和重复问题]> 例: {"10086": ["D", "A", "B", "A"]} + * @param questionLogMap + * <题目快照ID, [数组:前端传递过来不需要考虑排序和重复问题]> 例: {"10086": ["D", "A", "B", "A"]} + * 附件上传:需要传递questionLogMap参数的value值,支持多个文件上传。Key值传不传无所谓,后台不取这个值。 * @param questionSettingId 题目配置ID 简单理解,区分属于哪套卷子:章节测试、考试、作业 目前支持这三种类型。作业中,又区分题目作业,和附件作业。 * @param coreUser 用来验证用户登录,为了解耦不会传递到Service层 * @return @@ -114,7 +106,7 @@ public class TeacherOpenCourseQuestionLogController { @ResponseBody public JsonResult addQuestionLog( @RequestBody - Map> questionLogMap, + Map> questionLogMap, Long questionSettingId, @SCoreUser CoreUser coreUser) { @@ -123,6 +115,23 @@ public class TeacherOpenCourseQuestionLogController { return JsonResult.success(); } + /** + * 教师端-手动批改一些题目的分数 + * + * @param teacherOpenCourseQuestionLogIds 指定更新分数的题目日志IDs + * @param score + */ + @PostMapping(API + "/manualModifyQuestionScores.do") + @ResponseBody + public JsonResult manualModifyQuestionScores( + String teacherOpenCourseQuestionLogIds, BigDecimal score, + @SCoreUser + CoreUser coreUser) { + Assert.notNull(coreUser, "请登录后再操作"); + teacherOpenCourseQuestionLogService.manualModifyQuestionScores(teacherOpenCourseQuestionLogIds, score); + return JsonResult.success(); + } + /** * 学生端-答题后显示答案、和分析 * @@ -130,7 +139,7 @@ public class TeacherOpenCourseQuestionLogController { * @param coreUser 用来验证用户登录,为了解耦不会传递到Service层 * @return */ - @PostMapping(API + "/questionAnalysis.do") + @PostMapping(API + "/questionAnalysisBySnapIds.do") @ResponseBody public JsonResult questionAnalysis( @RequestBody @@ -141,6 +150,18 @@ public class TeacherOpenCourseQuestionLogController { return JsonResult.success(teacherOpenCourseQuestionLogService.questionAnalysis(questionSnapshotIds)); } + /** + * 学生端-答题后显示答案、和分析 + * + * @param questionSettingId 题目配置ID + * @param coreUser 用来验证用户登录,为了解耦不会传递到Service层 + * @return + */ + @PostMapping(API + "/questionAnalysisBySettingId.do") + public JsonResult questionAnalysisBySettingId(Long questionSettingId, @SCoreUser CoreUser coreUser) { + Assert.isTrue(coreUser.isStudent(), "非学生身份,无法获取题目分析!"); + return JsonResult.success(teacherOpenCourseQuestionLogService.questionAnalysis(questionSettingId)); + } /** * 学生端-教师端-学生总得分列表 diff --git a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionSettingController.java b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionSettingController.java index 07a9d028..cbf925d5 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionSettingController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseQuestionSettingController.java @@ -9,6 +9,7 @@ import com.ibeetl.admin.core.file.FileService; import com.ibeetl.admin.core.web.JsonResult; import com.ibeetl.jlw.entity.TeacherOpenCourseQuestionSetting; import com.ibeetl.jlw.enums.GlobalPushStatusEnum; +import com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum; import com.ibeetl.jlw.service.TeacherOpenCourseQuestionSettingService; import com.ibeetl.jlw.web.query.TeacherOpenCourseQuestionSettingQuery; import org.apache.commons.lang3.StringUtils; @@ -96,6 +97,21 @@ public class TeacherOpenCourseQuestionSettingController{ return JsonResult.success(); } + /** + * 学生端-教师端-根据题目配置信息,获取相关的题目 + * 每次获取 + * + * @param teacherOpenCourseQuestionSettingId 配置ID + * @param fromTypeEnum 来源类型 + * @return + */ + @PostMapping(API + "/questionDetail.do") + public JsonResult questionDetail(Long teacherOpenCourseQuestionSettingId, + ResourcesQuestionSnapshotFromTypeEnum fromTypeEnum, @SCoreUser CoreUser coreUser) { + Assert.isTrue(coreUser.isStudent(), "非学生身份,无法获取题目!"); + return JsonResult.success(teacherOpenCourseQuestionSettingService.questionDetail(teacherOpenCourseQuestionSettingId, fromTypeEnum)); + } + /** * 逻辑删除 * @param ids diff --git a/web/src/main/java/com/ibeetl/jlw/web/api/IndexBaseController.java b/web/src/main/java/com/ibeetl/jlw/web/api/IndexBaseController.java index 4a571085..0f9b8aaf 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/api/IndexBaseController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/api/IndexBaseController.java @@ -1,5 +1,8 @@ package com.ibeetl.jlw.web.api; +import cn.jlw.Interceptor.SCoreUser; +import com.ibeetl.admin.core.entity.CoreUser; +import com.ibeetl.admin.core.service.CoreUserService; import com.ibeetl.admin.core.web.JsonResult; import com.ibeetl.jlw.entity.api.CurrentUserInfo; import com.ibeetl.jlw.service.IndexBaseService; @@ -18,9 +21,22 @@ public class IndexBaseController { private static final String API = "/api/base"; @Autowired private IndexBaseService indexBaseService; + @Autowired private CoreUserService coreUserService; @PostMapping(API + "/userInfo.do") public JsonResult userInfo() { return JsonResult.success(indexBaseService.userInfo()); } + + /** + * 通过旧密码修改密码,仅用于修改自己的密码。 + * 暂时 教师端-学生端-适用 + * @param coreUser + * @param coreUser + * @return + */ + @PostMapping(API + "/editPwdByOld.do") + public JsonResult editPwdByOld(String oldPwd, String newPwd, @SCoreUser CoreUser coreUser) { + return JsonResult.success(coreUserService.editPwdByOld(oldPwd, newPwd, coreUser.getId())); + } } diff --git a/web/src/main/java/com/ibeetl/jlw/web/query/TeacherOpenCourseChatLogQuery.java b/web/src/main/java/com/ibeetl/jlw/web/query/TeacherOpenCourseChatLogQuery.java index 3b7b9ca9..cfa591db 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/query/TeacherOpenCourseChatLogQuery.java +++ b/web/src/main/java/com/ibeetl/jlw/web/query/TeacherOpenCourseChatLogQuery.java @@ -1,6 +1,6 @@ package com.ibeetl.jlw.web.query; -import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ObjectUtil; import cn.jlw.validate.ValidateConfig; import com.ibeetl.admin.core.annotation.Query; import com.ibeetl.admin.core.web.query.PageParam; @@ -12,6 +12,8 @@ import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.util.Date; +import static com.ibeetl.jlw.enums.ChatLogSendTypeEnum.normal; + /** *开课互动查询 */ @@ -53,7 +55,7 @@ public class TeacherOpenCourseChatLogQuery extends PageParam { private BigDecimal studentScore; @Query(name = "提问方式", display = false) // 多个逗号隔开 - private String chatLogSendType; + private ChatLogSendTypeEnum chatLogSendType; @Query(name = "附件上传(仅支持图片,多个逗号隔开)", display = false) private String chatFiles; @@ -181,12 +183,7 @@ public class TeacherOpenCourseChatLogQuery extends PageParam { pojo.setChatFiles(this.getChatFiles()); pojo.setTeacherOpenCourseChatLogStatus(this.getTeacherOpenCourseChatLogStatus()); pojo.setTeacherOpenCourseChatLogAddTime(this.getTeacherOpenCourseChatLogAddTime()); - try { - pojo.setChatLogSendType( - EnumUtil.likeValueOf(ChatLogSendTypeEnum.class, this.getChatLogSendType().split(",")[0])); - }catch (Exception e) { - pojo.setChatLogSendType(ChatLogSendTypeEnum.normal); - } + pojo.setChatLogSendType(ObjectUtil.defaultIfNull(this.getChatLogSendType(), normal)); pojo.setOrgId(this.getOrgId()); pojo.setUserId(this.getUserId()); return pojo; @@ -253,11 +250,11 @@ public class TeacherOpenCourseChatLogQuery extends PageParam { this._given = _given; } - public String getChatLogSendType() { + public ChatLogSendTypeEnum getChatLogSendType() { return chatLogSendType; } - public void setChatLogSendType(String chatLogSendType) { + public void setChatLogSendType(ChatLogSendTypeEnum chatLogSendType) { this.chatLogSendType = chatLogSendType; } diff --git a/web/src/main/resources/sql/jlw/resourcesQuestionSnapshot.md b/web/src/main/resources/sql/jlw/resourcesQuestionSnapshot.md index 5b865d99..b0f1adbe 100644 --- a/web/src/main/resources/sql/jlw/resourcesQuestionSnapshot.md +++ b/web/src/main/resources/sql/jlw/resourcesQuestionSnapshot.md @@ -479,7 +479,11 @@ getValuesByQuery getQuestionTestSimpleInfo === * 学生端- 题目的简单信息 - select * from resources_question_snapshot t + select + @pageTag(){ + t.* + @} + from resources_question_snapshot t where 1 = 1 @ // TODO 理想 这里还没写完 diff --git a/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionLog.md b/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionLog.md index e1d9bb4f..9bd595df 100644 --- a/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionLog.md +++ b/web/src/main/resources/sql/jlw/teacherOpenCourseQuestionLog.md @@ -527,4 +527,68 @@ getValuesByQuery @} +getValuesByQueryNotWithPermission +=== + +* 根据不为空的参数进行查询 + + select t.* + from teacher_open_course_question_log t + where 1=1 + @if(!isEmpty(teacherOpenCourseQuestionLogId)){ + and t.teacher_open_course_question_log_id =#teacherOpenCourseQuestionLogId# + @} + @if(!isEmpty(teacherOpenCourseQuestionLogIdPlural)){ + and find_in_set(t.teacher_open_course_question_log_id,#teacherOpenCourseQuestionLogIdPlural#) + @} + @if(!isEmpty(teacherOpenCourseQuestionSettingId)){ + and t.teacher_open_course_question_setting_id =#teacherOpenCourseQuestionSettingId# + @} + @if(!isEmpty(teacherOpenCourseQuestionSettingIdPlural)){ + and find_in_set(t.teacher_open_course_question_setting_id,#teacherOpenCourseQuestionSettingIdPlural#) + @} + @if(!isEmpty(resourcesQuestionSnapshotId)){ + and t.resources_question_snapshot_id =#resourcesQuestionSnapshotId# + @} + @if(!isEmpty(resourcesQuestionSnapshotIdPlural)){ + and find_in_set(t.resources_question_snapshot_id,#resourcesQuestionSnapshotIdPlural#) + @} + @if(!isEmpty(teacherOpenCourseQuestionLogAnswer)){ + and t.teacher_open_course_question_log_answer =#teacherOpenCourseQuestionLogAnswer# + @} + @if(!isEmpty(teacherOpenCourseQuestionLogUploadFile)){ + and t.teacher_open_course_question_log_upload_file =#teacherOpenCourseQuestionLogUploadFile# + @} + @if(!isEmpty(teacherOpenCourseQuestionLogAddTime)){ + and t.teacher_open_course_question_log_add_time =#teacherOpenCourseQuestionLogAddTime# + @} + @if(isEmpty(teacherOpenCourseQuestionLogStatus) && isEmpty(teacherOpenCourseQuestionLogStatusPlural)){ + and t.teacher_open_course_question_log_status != 2 + @}else{ + @if(!isEmpty(teacherOpenCourseQuestionLogStatus)){ + and t.teacher_open_course_question_log_status =#teacherOpenCourseQuestionLogStatus# + @}else if(!isEmpty(teacherOpenCourseQuestionLogStatusPlural)){ + and find_in_set(t.teacher_open_course_question_log_status,#teacherOpenCourseQuestionLogStatusPlural#) + @} + @} + @if(!isEmpty(studentId)){ + and t.student_id =#studentId# + @} + @if(!isEmpty(studentIdPlural)){ + and find_in_set(t.student_id,#studentIdPlural#) + @} + @if(!isEmpty(orgId)){ + and t.org_id =#orgId# + @} + @if(!isEmpty(orgIdPlural)){ + and find_in_set(t.org_id,#orgIdPlural#) + @} + @if(!isEmpty(userId)){ + and t.user_id =#userId# + @} + @if(!isEmpty(userIdPlural)){ + and find_in_set(t.user_id,#userIdPlural#) + @} + +