diff --git a/data_base_design/天泽数据大平台.pdb b/data_base_design/天泽数据大平台.pdb index ca058e19..c6bcf2be 100644 --- a/data_base_design/天泽数据大平台.pdb +++ b/data_base_design/天泽数据大平台.pdb @@ -1,5 +1,5 @@ - + @@ -6748,10 +6748,11 @@ LABL 0 新宋体,8,N 1669986324 -1669988273 +1670172135 -1 -((255920,65489), (280286,83103)) +((255845,64095), (280211,84151)) 0 +1 12615680 16570034 12632256 @@ -20914,7 +20915,7 @@ COLLATE = utf8_general_ci question_log_summary 1661850632 lx -1669988334 +1670172100 lx 学生-题目日志-分析汇总 auto_increment = 1 @@ -20952,10 +20953,11 @@ COLLATE = utf8_general_ci question_setting_name 1664182126 lx -1669987509 +1670167380 lx 题目配置名称 -bigint +varchar(100) +100 0D1D927F-7B3A-4209-9E41-5E51D6C7DF98 @@ -20986,10 +20988,10 @@ COLLATE = utf8_general_ci question_setting_total_score 1669987828 lx -1669988154 +1670167453 lx 配置的题目总分数 -int +float B6F6BAB4-0EF0-4BE6-B661-74638716B0F8 @@ -21003,6 +21005,18 @@ COLLATE = utf8_general_ci bigint +425F40EA-F79E-409A-8C41-34C006D6D589 +question_log_ids +question_log_ids +1670155136 +lx +1670155185 +lx +关联的做题日志IDs +varchar(2000) +2000 + + 2287A3B7-121E-41AE-87AC-FE935B55A80C question_log_summary_question_total_count question_log_summary_question_total_count @@ -21013,7 +21027,7 @@ COLLATE = utf8_general_ci 配置的题目总数 int - + 9859472C-69C7-4E9A-9316-7BF0939E6BF2 question_log_summary_student_do_count question_log_summary_student_do_count @@ -21024,29 +21038,29 @@ COLLATE = utf8_general_ci 学生做题总数 int - + B7EDC098-95AB-4219-9242-E644701913C4 question_log_summary_success_count question_log_summary_success_count 1661869211 lx -1669988220 +1670154702 lx -正确数量(包含半对题) +正确数量 int - + 109364AE-9C76-407B-934A-4307215E4982 question_log_summary_error_count question_log_summary_error_count 1664181836 lx -1669988220 +1670154702 lx -错题数量 +错误数量 int - + 4EEC3C67-2C8A-45F5-8540-A6FFFEA2968C question_log_summary_success_rate question_log_summary_success_rate @@ -21057,7 +21071,7 @@ COLLATE = utf8_general_ci 正确率,最大100 float - + 11D26CA6-CB55-43F0-9C8F-D1C07A6BC233 question_log_summary_current_pass_rate question_log_summary_current_pass_rate @@ -21068,7 +21082,7 @@ COLLATE = utf8_general_ci 当前配置的及格比率 float - + B7B56144-0CE8-4EA3-8315-C097AE2A2B4D question_log_summary_is_pass question_log_summary_is_pass @@ -21080,7 +21094,30 @@ COLLATE = utf8_general_ci int(2) 2 - + +45DBB89C-2AC0-4F71-AB87-1350950F054B +finish_second_time +finish_second_time +1670172057 +lx +1670172127 +lx +完成用时(秒) +int + + +32BB73E0-CEAF-45BD-BC36-F699A354C8D7 +finish_time +finish_time +1670172057 +lx +1670172127 +lx +完成用时,时间格式 +varchar(50) +50 + + 30F0DBA1-03FC-493E-B628-E3297D197E97 question_log_summary_status question_log_summary_status @@ -21092,7 +21129,7 @@ COLLATE = utf8_general_ci int(2) 2 - + 5BDCBCAE-7982-49D0-91A7-2C51706D400F question_log_summary_add_time question_log_summary_add_time @@ -21103,7 +21140,7 @@ COLLATE = utf8_general_ci 添加时间 datetime - + 37755E03-C150-47C6-98C6-1BB69E36CAC1 org_id org_id @@ -21114,7 +21151,7 @@ COLLATE = utf8_general_ci 组织ID bigint - + 9A38CEE4-E7F0-4393-8A46-7F0B8D2B44BD user_id user_id @@ -21127,7 +21164,7 @@ COLLATE = utf8_general_ci - + 203F6632-947A-4CFA-815D-E029ACCFD264 Key_1 Key_1 @@ -21141,12 +21178,12 @@ COLLATE = utf8_general_ci - + - + BFEA4109-96F9-4074-AF58-B84D6574A7FC PUBLIC PUBLIC @@ -21157,7 +21194,7 @@ COLLATE = utf8_general_ci - + ABEFC813-1056-4507-A9A7-809C149B4ABE 1661954753 lx @@ -21445,7 +21482,7 @@ COLLATE = utf8_general_ci - + 5963E417-B2CE-431D-988A-B3493AAE5EE4 MySQL 5.0 MYSQL50 diff --git a/data_base_design/天泽数据大平台.pdm b/data_base_design/天泽数据大平台.pdm index fed7dff5..912f8f07 100644 --- a/data_base_design/天泽数据大平台.pdm +++ b/data_base_design/天泽数据大平台.pdm @@ -1,5 +1,5 @@ - + @@ -6748,10 +6748,11 @@ LABL 0 新宋体,8,N 1669986324 -1669988273 +1670172137 -1 -((255920,65489), (280286,83103)) +((255995,64770), (280361,84826)) 0 +1 12615680 16570034 12632256 @@ -20914,7 +20915,7 @@ COLLATE = utf8_general_ci question_log_summary 1661850632 lx -1669988475 +1670172100 lx 学生-题目日志-分析汇总 auto_increment = 1 @@ -20952,10 +20953,11 @@ COLLATE = utf8_general_ci question_setting_name 1664182126 lx -1669987509 +1670167380 lx 题目配置名称 -bigint +varchar(100) +100 0D1D927F-7B3A-4209-9E41-5E51D6C7DF98 @@ -20986,10 +20988,10 @@ COLLATE = utf8_general_ci question_setting_total_score 1669987828 lx -1669988154 +1670167453 lx 配置的题目总分数 -int +float B6F6BAB4-0EF0-4BE6-B661-74638716B0F8 @@ -21003,6 +21005,18 @@ COLLATE = utf8_general_ci bigint +425F40EA-F79E-409A-8C41-34C006D6D589 +question_log_ids +question_log_ids +1670155136 +lx +1670155185 +lx +关联的做题日志IDs +varchar(2000) +2000 + + 2287A3B7-121E-41AE-87AC-FE935B55A80C question_log_summary_question_total_count question_log_summary_question_total_count @@ -21013,7 +21027,7 @@ COLLATE = utf8_general_ci 配置的题目总数 int - + 9859472C-69C7-4E9A-9316-7BF0939E6BF2 question_log_summary_student_do_count question_log_summary_student_do_count @@ -21024,26 +21038,15 @@ COLLATE = utf8_general_ci 学生做题总数 int - + B7EDC098-95AB-4219-9242-E644701913C4 question_log_summary_success_count question_log_summary_success_count 1661869211 lx -1669988481 +1670154702 lx -全对数量 -int - - -B93527C6-CCD1-4AD8-9996-6EBFD099A730 -question_log_summary_half_success_count -question_log_summary_half_success_count -1661869211 -lx -1669988481 -lx -半对数量 +正确数量 int @@ -21052,9 +21055,9 @@ COLLATE = utf8_general_ci question_log_summary_error_count 1664181836 lx -1669988220 +1670154702 lx -错题数量 +错误数量 int @@ -21092,6 +21095,29 @@ COLLATE = utf8_general_ci 2 +45DBB89C-2AC0-4F71-AB87-1350950F054B +finish_second_time +finish_second_time +1670172057 +lx +1670172127 +lx +完成用时(秒) +int + + +32BB73E0-CEAF-45BD-BC36-F699A354C8D7 +finish_time +finish_time +1670172057 +lx +1670172127 +lx +完成用时,时间格式 +varchar(50) +50 + + 30F0DBA1-03FC-493E-B628-E3297D197E97 question_log_summary_status question_log_summary_status @@ -21103,7 +21129,7 @@ COLLATE = utf8_general_ci int(2) 2 - + 5BDCBCAE-7982-49D0-91A7-2C51706D400F question_log_summary_add_time question_log_summary_add_time @@ -21114,7 +21140,7 @@ COLLATE = utf8_general_ci 添加时间 datetime - + 37755E03-C150-47C6-98C6-1BB69E36CAC1 org_id org_id @@ -21125,7 +21151,7 @@ COLLATE = utf8_general_ci 组织ID bigint - + 9A38CEE4-E7F0-4393-8A46-7F0B8D2B44BD user_id user_id @@ -21138,7 +21164,7 @@ COLLATE = utf8_general_ci - + 203F6632-947A-4CFA-815D-E029ACCFD264 Key_1 Key_1 @@ -21152,12 +21178,12 @@ COLLATE = utf8_general_ci - + - + BFEA4109-96F9-4074-AF58-B84D6574A7FC PUBLIC PUBLIC @@ -21168,7 +21194,7 @@ COLLATE = utf8_general_ci - + ABEFC813-1056-4507-A9A7-809C149B4ABE 1661954753 lx @@ -21456,7 +21482,7 @@ COLLATE = utf8_general_ci - + 5963E417-B2CE-431D-988A-B3493AAE5EE4 MySQL 5.0 MYSQL50 diff --git a/doc/sql/mysql/tianze-pro-update.sql b/doc/sql/mysql/tianze-pro-update.sql index f8706648..9855654c 100644 --- a/doc/sql/mysql/tianze-pro-update.sql +++ b/doc/sql/mysql/tianze-pro-update.sql @@ -401,7 +401,7 @@ CREATE TABLE `general_resources_question_snapshot` ( `general_resources_question_snapshot_id` bigint(20) NOT NULL COMMENT '通用题目快照ID', `general_question_setting_id` bigint(20) NOT NULL COMMENT '通用题目配置ID', `business_course_info_id` bigint(20) DEFAULT NULL COMMENT '业务课程ID', - `business_course_info_type` varchar(30) DEFAULT NULL COMMENT '业务课程类型(枚举 BusinessCourseInfoEnum)', + `business_course_info_type` varchar(30) DEFAULT NULL COMMENT '业务课程类型(枚举 QuestionBusinessTypeEnum)', `question_type` int(2) DEFAULT NULL COMMENT '题型(1单选 2多选 3判断 4填空 5分析)', `question_score` decimal(3,1) DEFAULT NULL COMMENT '分值', `question_stem` varchar(3000) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '题干', @@ -454,7 +454,6 @@ CREATE TABLE `general_question_log` ( ALTER TABLE student_client_link ADD COLUMN student_client_link_desc varchar(600) COMMENT '描述说明'; - drop table if exists question_log_summary; /*==============================================================*/ @@ -464,19 +463,21 @@ create table question_log_summary ( question_log_summary_id bigint not null comment '学生做题日志汇总ID', question_setting_id bigint comment '题目配置ID', - question_setting_name bigint comment '题目配置名称', + question_setting_name varchar(100) comment '题目配置名称', question_setting_type bigint comment '类型 枚举(ResourcesQuestionSnapshotFromTypeEnum)', question_log_summary_from_type varchar(50) comment '来源类型 枚举', - question_setting_total_score int comment '配置的题目总分数', + question_setting_total_score float comment '配置的题目总分数', person_id bigint comment '人员ID(学生ID等等)', + question_log_ids varchar(2000) comment '关联的做题日志IDs', question_log_summary_question_total_count int comment '配置的题目总数', question_log_summary_student_do_count int comment '学生做题总数', - question_log_summary_success_count int comment '全对数量', - question_log_summary_half_success_count int comment '半对数量', - question_log_summary_error_count int comment '错题数量', + question_log_summary_success_count int comment '正确数量', + question_log_summary_error_count int comment '错误数量', question_log_summary_success_rate float comment '正确率,最大100', question_log_summary_current_pass_rate float comment '当前配置的及格比率', question_log_summary_is_pass int(2) comment '是否及格', + finish_second_time int comment '完成用时(秒)', + finish_time varchar(50) comment '完成用时,时间格式', question_log_summary_status int(2) comment '状态(1正常 2删除)', question_log_summary_add_time datetime comment '添加时间', org_id bigint comment '组织ID', diff --git a/web/src/main/java/com/ibeetl/jlw/dao/QuestionLogSummaryDao.java b/web/src/main/java/com/ibeetl/jlw/dao/QuestionLogSummaryDao.java index 8cffd336..f619791e 100644 --- a/web/src/main/java/com/ibeetl/jlw/dao/QuestionLogSummaryDao.java +++ b/web/src/main/java/com/ibeetl/jlw/dao/QuestionLogSummaryDao.java @@ -30,4 +30,12 @@ public interface QuestionLogSummaryDao extends BaseMapper{ List getValuesByQuery(QuestionLogSummaryQuery questionLogSummaryQuery); List getValuesByQueryNotWithPermission(QuestionLogSummaryQuery questionLogSummaryQuery); List>getExcelValues(QuestionLogSummaryQuery questionLogSummaryQuery); + + /** + * 通过题目配置ID 逻辑删除数据 + * @param questionSettingIds + * @return + */ + @Update + int logicDeleteByQuestionSettingIds(String questionSettingIds); } diff --git a/web/src/main/java/com/ibeetl/jlw/entity/GeneralQuestionLog.java b/web/src/main/java/com/ibeetl/jlw/entity/GeneralQuestionLog.java index 84f4b8e1..dcc95eae 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/GeneralQuestionLog.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/GeneralQuestionLog.java @@ -148,5 +148,49 @@ public class GeneralQuestionLog extends BaseEntity{ this.setGeneralQuestionLogUpdateTime(null); this.setGeneralQuestionLogFinishTime(null); } - + + /** + * 功能描述:
+ * 设置做对的正确数量 + * + * @param successCount + * @Author: lx + * @Date: 2022/12/4 20:39 + */ + public void setSuccessCount(Integer successCount) { + this.set("successCount", successCount); + } + + /** + * 功能描述:
+ * 正确的数量,有时候会有复杂的题目类型,这里暂时记录下正确数量 + * @return {@link int} + * @Author: lx + * @Date: 2022/12/4 20:39 + */ + public Integer getSuccessCount() { + return Integer.valueOf(this.get("successCount").toString()); + } + /** + * 功能描述:
+ * 设置错题数量 + * + * @param errorCount + * @Author: lx + * @Date: 2022/12/4 20:39 + */ + public void setErrorCount(Integer errorCount) { + this.set("errorCount", errorCount); + } + + /** + * 功能描述:
+ * 错题的数量,有时候会有复杂的题目类型,这里暂时记录下错题数量 + * @return {@link int} + * @Author: lx + * @Date: 2022/12/4 20:39 + */ + public Integer getErrorCount() { + return Integer.valueOf(this.get("errorCount").toString()); + } } diff --git a/web/src/main/java/com/ibeetl/jlw/entity/GeneralQuestionSetting.java b/web/src/main/java/com/ibeetl/jlw/entity/GeneralQuestionSetting.java index 81382b3b..d653a470 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/GeneralQuestionSetting.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/GeneralQuestionSetting.java @@ -6,7 +6,7 @@ import com.ibeetl.admin.core.annotation.DictEnum; import com.ibeetl.admin.core.entity.BaseEntity; import com.ibeetl.admin.core.util.ValidateConfig; import com.ibeetl.jlw.enums.GlobalPushStatusEnum; -import com.ibeetl.jlw.enums.QuestionBussinessTypeEnum; +import com.ibeetl.jlw.enums.QuestionBusinessTypeEnum; import com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum; import lombok.*; import lombok.experimental.Accessors; @@ -41,7 +41,7 @@ public class GeneralQuestionSetting extends BaseEntity{ //业务类型 @DictEnum - private QuestionBussinessTypeEnum businessType ; + private QuestionBusinessTypeEnum businessType ; //班级ID集合(逗号隔开) diff --git a/web/src/main/java/com/ibeetl/jlw/entity/GeneralResourcesQuestionSnapshot.java b/web/src/main/java/com/ibeetl/jlw/entity/GeneralResourcesQuestionSnapshot.java index 0e334337..233b6a5d 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/GeneralResourcesQuestionSnapshot.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/GeneralResourcesQuestionSnapshot.java @@ -3,7 +3,7 @@ package com.ibeetl.jlw.entity; import com.ibeetl.admin.core.annotation.Dict; import com.ibeetl.admin.core.entity.BaseEntity; import com.ibeetl.admin.core.util.ValidateConfig; -import com.ibeetl.jlw.enums.BusinessCourseInfoEnum; +import com.ibeetl.jlw.enums.QuestionBusinessTypeEnum; import lombok.Data; import lombok.EqualsAndHashCode; import org.beetl.sql.annotation.entity.AssignID; @@ -39,7 +39,7 @@ public class GeneralResourcesQuestionSnapshot extends BaseEntity{ //业务课程类型 - private BusinessCourseInfoEnum businessCourseInfoType ; + private QuestionBusinessTypeEnum businessCourseInfoType ; //题型(1单选 2多选 3判断 4填空 5分析) diff --git a/web/src/main/java/com/ibeetl/jlw/entity/QuestionLogSummary.java b/web/src/main/java/com/ibeetl/jlw/entity/QuestionLogSummary.java index d656123c..b450d743 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/QuestionLogSummary.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/QuestionLogSummary.java @@ -3,10 +3,8 @@ package com.ibeetl.jlw.entity; import com.ibeetl.admin.core.annotation.Dict; import com.ibeetl.admin.core.entity.BaseEntity; import com.ibeetl.admin.core.util.ValidateConfig; -import com.ibeetl.jlw.enums.BusinessCourseInfoEnum; +import com.ibeetl.jlw.enums.QuestionBusinessTypeEnum; import com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum; -import lombok.Data; -import lombok.EqualsAndHashCode; import org.beetl.sql.annotation.entity.AssignID; import javax.validation.constraints.NotNull; @@ -15,10 +13,8 @@ import java.util.Date; /* * 学生-题目日志-分析汇总 -* gen by Spring Boot2 Admin 2022-12-02 +* gen by Spring Boot2 Admin 2022-12-04 */ -@Data -@EqualsAndHashCode(callSuper = false) public class QuestionLogSummary extends BaseEntity{ //学生做题日志汇总ID @@ -34,26 +30,28 @@ public class QuestionLogSummary extends BaseEntity{ //题目配置名称 - private Long questionSettingName ; + private String questionSettingName ; - /** - * 类型 枚举 {@link ResourcesQuestionSnapshotFromTypeEnum} - */ + //类型 枚举(ResourcesQuestionSnapshotFromTypeEnum) + private ResourcesQuestionSnapshotFromTypeEnum questionSettingType ; + + //来源类型 枚举 - /** - * 来源类型 枚举 {@link BusinessCourseInfoEnum} - */ - private BusinessCourseInfoEnum questionLogSummaryFromType ; + private QuestionBusinessTypeEnum questionLogSummaryFromType ; //配置的题目总分数 - private Integer questionSettingTotalScore ; + private BigDecimal questionSettingTotalScore ; //人员ID(学生ID等等) private Long personId ; + //关联的做题日志IDs + + private String questionLogIds ; + //配置的题目总数 private Integer questionLogSummaryQuestionTotalCount ; @@ -62,15 +60,11 @@ public class QuestionLogSummary extends BaseEntity{ private Integer questionLogSummaryStudentDoCount ; - //全对数量 + //正确数量 private Integer questionLogSummarySuccessCount ; - //半对数量 - - private Integer questionLogSummaryHalfSuccessCount ; - - //错题数量 + //错误数量 private Integer questionLogSummaryErrorCount ; @@ -94,7 +88,15 @@ public class QuestionLogSummary extends BaseEntity{ //添加时间 private Date questionLogSummaryAddTime ; - + + //完成用时(秒) + + private Long finishSecondTime ; + + //完成用时 时间格式 + + private String finishTime ; + //组织ID private Long orgId ; @@ -103,4 +105,270 @@ public class QuestionLogSummary extends BaseEntity{ private Long userId ; + public QuestionLogSummary(){ + } + + /**学生做题日志汇总ID + *@return + */ + public Long getQuestionLogSummaryId(){ + return questionLogSummaryId; + } + /**学生做题日志汇总ID + *@param questionLogSummaryId + */ + public void setQuestionLogSummaryId(Long questionLogSummaryId){ + this.questionLogSummaryId = questionLogSummaryId; + } + + /**题目配置ID + *@return + */ + public Long getQuestionSettingId(){ + return questionSettingId; + } + /**题目配置ID + *@param questionSettingId + */ + public void setQuestionSettingId(Long questionSettingId){ + this.questionSettingId = questionSettingId; + } + + /**题目配置名称 + *@return + */ + public String getQuestionSettingName(){ + return questionSettingName; + } + /**题目配置名称 + *@param questionSettingName + */ + public void setQuestionSettingName(String questionSettingName){ + this.questionSettingName = questionSettingName; + } + + /**类型 枚举(ResourcesQuestionSnapshotFromTypeEnum) + *@return + */ + public ResourcesQuestionSnapshotFromTypeEnum getQuestionSettingType(){ + return questionSettingType; + } + /**类型 枚举(ResourcesQuestionSnapshotFromTypeEnum) + *@param questionSettingType + */ + public void setQuestionSettingType(ResourcesQuestionSnapshotFromTypeEnum questionSettingType){ + this.questionSettingType = questionSettingType; + } + + /**来源类型 枚举 + *@return + */ + public QuestionBusinessTypeEnum getQuestionLogSummaryFromType(){ + return questionLogSummaryFromType; + } + /**来源类型 枚举 + *@param questionLogSummaryFromType + */ + public void setQuestionLogSummaryFromType(QuestionBusinessTypeEnum questionLogSummaryFromType){ + this.questionLogSummaryFromType = questionLogSummaryFromType; + } + + /**配置的题目总分数 + *@return + */ + public BigDecimal getQuestionSettingTotalScore(){ + return questionSettingTotalScore; + } + /**配置的题目总分数 + *@param questionSettingTotalScore + */ + public void setQuestionSettingTotalScore(BigDecimal questionSettingTotalScore){ + this.questionSettingTotalScore = questionSettingTotalScore; + } + + /**人员ID(学生ID等等) + *@return + */ + public Long getPersonId(){ + return personId; + } + /**人员ID(学生ID等等) + *@param personId + */ + public void setPersonId(Long personId){ + this.personId = personId; + } + + /**关联的做题日志IDs + *@return + */ + public String getQuestionLogIds(){ + return questionLogIds; + } + /**关联的做题日志IDs + *@param questionLogIds + */ + public void setQuestionLogIds(String questionLogIds){ + this.questionLogIds = questionLogIds; + } + + /**配置的题目总数 + *@return + */ + public Integer getQuestionLogSummaryQuestionTotalCount(){ + return questionLogSummaryQuestionTotalCount; + } + /**配置的题目总数 + *@param questionLogSummaryQuestionTotalCount + */ + public void setQuestionLogSummaryQuestionTotalCount(Integer questionLogSummaryQuestionTotalCount){ + this.questionLogSummaryQuestionTotalCount = questionLogSummaryQuestionTotalCount; + } + + /**学生做题总数 + *@return + */ + public Integer getQuestionLogSummaryStudentDoCount(){ + return questionLogSummaryStudentDoCount; + } + /**学生做题总数 + *@param questionLogSummaryStudentDoCount + */ + public void setQuestionLogSummaryStudentDoCount(Integer questionLogSummaryStudentDoCount){ + this.questionLogSummaryStudentDoCount = questionLogSummaryStudentDoCount; + } + + /**正确数量 + *@return + */ + public Integer getQuestionLogSummarySuccessCount(){ + return questionLogSummarySuccessCount; + } + /**正确数量 + *@param questionLogSummarySuccessCount + */ + public void setQuestionLogSummarySuccessCount(Integer questionLogSummarySuccessCount){ + this.questionLogSummarySuccessCount = questionLogSummarySuccessCount; + } + + /**错误数量 + *@return + */ + public Integer getQuestionLogSummaryErrorCount(){ + return questionLogSummaryErrorCount; + } + /**错误数量 + *@param questionLogSummaryErrorCount + */ + public void setQuestionLogSummaryErrorCount(Integer questionLogSummaryErrorCount){ + this.questionLogSummaryErrorCount = questionLogSummaryErrorCount; + } + + /**正确率,最大100 + *@return + */ + public BigDecimal getQuestionLogSummarySuccessRate(){ + return questionLogSummarySuccessRate; + } + /**正确率,最大100 + *@param questionLogSummarySuccessRate + */ + public void setQuestionLogSummarySuccessRate(BigDecimal questionLogSummarySuccessRate){ + this.questionLogSummarySuccessRate = questionLogSummarySuccessRate; + } + + /**当前配置的及格比率 + *@return + */ + public BigDecimal getQuestionLogSummaryCurrentPassRate(){ + return questionLogSummaryCurrentPassRate; + } + /**当前配置的及格比率 + *@param questionLogSummaryCurrentPassRate + */ + public void setQuestionLogSummaryCurrentPassRate(BigDecimal questionLogSummaryCurrentPassRate){ + this.questionLogSummaryCurrentPassRate = questionLogSummaryCurrentPassRate; + } + + /**是否及格 + *@return + */ + public Integer getQuestionLogSummaryIsPass(){ + return questionLogSummaryIsPass; + } + /**是否及格 + *@param questionLogSummaryIsPass + */ + public void setQuestionLogSummaryIsPass(Integer questionLogSummaryIsPass){ + this.questionLogSummaryIsPass = questionLogSummaryIsPass; + } + + /**状态(1正常 2删除) + *@return + */ + public Integer getQuestionLogSummaryStatus(){ + return questionLogSummaryStatus; + } + /**状态(1正常 2删除) + *@param questionLogSummaryStatus + */ + public void setQuestionLogSummaryStatus(Integer questionLogSummaryStatus){ + this.questionLogSummaryStatus = questionLogSummaryStatus; + } + + /**添加时间 + *@return + */ + public Date getQuestionLogSummaryAddTime(){ + return questionLogSummaryAddTime; + } + /**添加时间 + *@param questionLogSummaryAddTime + */ + public void setQuestionLogSummaryAddTime(Date questionLogSummaryAddTime){ + this.questionLogSummaryAddTime = questionLogSummaryAddTime; + } + + /**组织ID + *@return + */ + public Long getOrgId(){ + return orgId; + } + /**组织ID + *@param orgId + */ + public void setOrgId(Long orgId){ + this.orgId = orgId; + } + + /**用户ID + *@return + */ + public Long getUserId(){ + return userId; + } + /**用户ID + *@param userId + */ + public void setUserId(Long userId){ + this.userId = userId; + } + + + public Long getFinishSecondTime() { + return finishSecondTime; + } + + public void setFinishSecondTime(Long finishSecondTime) { + this.finishSecondTime = finishSecondTime; + } + + public String getFinishTime() { + return finishTime; + } + + public void setFinishTime(String finishTime) { + this.finishTime = finishTime; + } } diff --git a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionLog.java b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionLog.java index 05dc1a35..d9e7770a 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionLog.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseQuestionLog.java @@ -161,4 +161,49 @@ public class TeacherOpenCourseQuestionLog extends BaseEntity { this.setTeacherOpenCourseQuestionLogUpdateTime(null); this.setTeacherOpenCourseQuestionLogFinishTime(null); } + + /** + * 功能描述:
+ * 设置做对的正确数量 + * + * @param successCount + * @Author: lx + * @Date: 2022/12/4 20:39 + */ + public void setSuccessCount(Integer successCount) { + this.set("successCount", successCount); + } + + /** + * 功能描述:
+ * 正确的数量,有时候会有复杂的题目类型,这里暂时记录下正确数量 + * @return {@link int} + * @Author: lx + * @Date: 2022/12/4 20:39 + */ + public Integer getSuccessCount() { + return Integer.valueOf(this.get("successCount").toString()); + } + /** + * 功能描述:
+ * 设置错题数量 + * + * @param errorCount + * @Author: lx + * @Date: 2022/12/4 20:39 + */ + public void setErrorCount(Integer errorCount) { + this.set("errorCount", errorCount); + } + + /** + * 功能描述:
+ * 错题的数量,有时候会有复杂的题目类型,这里暂时记录下错题数量 + * @return {@link int} + * @Author: lx + * @Date: 2022/12/4 20:39 + */ + public Integer getErrorCount() { + return Integer.valueOf(this.get("errorCount").toString()); + } } diff --git a/web/src/main/java/com/ibeetl/jlw/enums/BusinessCourseInfoEnum.java b/web/src/main/java/com/ibeetl/jlw/enums/BusinessCourseInfoEnum.java deleted file mode 100644 index b0ceaae8..00000000 --- a/web/src/main/java/com/ibeetl/jlw/enums/BusinessCourseInfoEnum.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ibeetl.jlw.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.beetl.sql.annotation.entity.EnumMapping; - -/** - * 题目业务类型 - * @author lx - */ - -@Getter -@AllArgsConstructor -@EnumMapping("name") -public enum BusinessCourseInfoEnum { - - SYSTEM_QUESTION("系统题库"), - OPEN_COURSE_QUESTION( "开课题库"); - - private String text; - -} \ No newline at end of file diff --git a/web/src/main/java/com/ibeetl/jlw/enums/QuestionBussinessTypeEnum.java b/web/src/main/java/com/ibeetl/jlw/enums/QuestionBusinessTypeEnum.java similarity index 89% rename from web/src/main/java/com/ibeetl/jlw/enums/QuestionBussinessTypeEnum.java rename to web/src/main/java/com/ibeetl/jlw/enums/QuestionBusinessTypeEnum.java index 459678aa..8c7fc2c6 100644 --- a/web/src/main/java/com/ibeetl/jlw/enums/QuestionBussinessTypeEnum.java +++ b/web/src/main/java/com/ibeetl/jlw/enums/QuestionBusinessTypeEnum.java @@ -11,7 +11,7 @@ import org.beetl.sql.annotation.entity.EnumMapping; @Getter @AllArgsConstructor @EnumMapping("name") -public enum QuestionBussinessTypeEnum { +public enum QuestionBusinessTypeEnum { FROM_SYSTEM("系统方"), // 开课(暂时没用到) diff --git a/web/src/main/java/com/ibeetl/jlw/enums/QuestionLogAddTypeEnum.java b/web/src/main/java/com/ibeetl/jlw/enums/QuestionLogAddTypeEnum.java index 9027ea82..3d85187d 100644 --- a/web/src/main/java/com/ibeetl/jlw/enums/QuestionLogAddTypeEnum.java +++ b/web/src/main/java/com/ibeetl/jlw/enums/QuestionLogAddTypeEnum.java @@ -8,8 +8,6 @@ import org.beetl.sql.annotation.entity.EnumMapping; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.NotNull; -import java.util.Arrays; -import java.util.List; /** * 题目提交业务类型
@@ -33,16 +31,6 @@ public enum QuestionLogAddTypeEnum { FINALLY_SUBMIT(3,"最终提交", "简单理解就是交卷"), // TODO 暂时没用到,后面估计会用 RE_EXAM_VOIDED(4, "申请重考", "标记这套试卷作废,目前还没用到这个枚举"), - - // 错题练习 - ERROR_TEST_INIT(100, "错题练习-初始化", "错题练习-初始化"), - ERROR_TEST_PRE_SUBMIT(105, "错题练习-预提交", "错题练习-预提交"), - ERROR_TEST_FINALLY_SUBMIT(110, "错题练习-最终提交", "错题练习-最终提交"), - - // 收藏夹练习 - TUCK_TEST_INIT(200, "错题练习-初始化", "错题练习-初始化"), - TUCK_TEST_PRE_SUBMIT(205, "收藏夹练习-预提交", "错题练习-预提交"), - TUCK_TEST_FINALLY_SUBMIT(210, "收藏夹练习-预提交", "错题练习-最终提交") ; final private Integer code; @@ -92,20 +80,4 @@ public enum QuestionLogAddTypeEnum { // 其他的情况,通用错误信息 Assert.isTrue(expression, "题目提交的状态不支持回退!"); } - - /** - * 验证枚举是否是练习提交类型 - * - * @param newType 提交新的题目状态 - */ - public static void validateTestAddTypeThrow(@NotNull QuestionLogAddTypeEnum newType) { - List types = Arrays.asList( - ERROR_TEST_PRE_SUBMIT, ERROR_TEST_FINALLY_SUBMIT, TUCK_TEST_PRE_SUBMIT, TUCK_TEST_FINALLY_SUBMIT, - ERROR_TEST_INIT, TUCK_TEST_INIT - ); - // 其他的情况,通用错误信息 - Assert.isFalse(types.contains(newType), "改接口不支持练习提交!"); - } - - } \ No newline at end of file diff --git a/web/src/main/java/com/ibeetl/jlw/enums/ResourcesQuestionTypeEnum.java b/web/src/main/java/com/ibeetl/jlw/enums/ResourcesQuestionTypeEnum.java index 74f98d6d..b68d0d68 100644 --- a/web/src/main/java/com/ibeetl/jlw/enums/ResourcesQuestionTypeEnum.java +++ b/web/src/main/java/com/ibeetl/jlw/enums/ResourcesQuestionTypeEnum.java @@ -1,10 +1,14 @@ package com.ibeetl.jlw.enums; +import cn.hutool.core.util.EnumUtil; import lombok.AllArgsConstructor; import lombok.Getter; import org.beetl.sql.annotation.entity.EnumMapping; import org.beetl.sql.annotation.entity.EnumValue; +import java.util.Arrays; +import java.util.List; + /** * 题目类型枚举,目前用在出题配置页面 * @@ -24,4 +28,32 @@ public enum ResourcesQuestionTypeEnum { @EnumValue private Integer code; private String text; + + public static List one = Arrays.asList(SINGLE_QUESTION, MULTIPLE_QUESTION, JUDGMENT_QUESTION); + public static List multiple = Arrays.asList(SINGLE_QUESTION, MULTIPLE_QUESTION, JUDGMENT_QUESTION); + + /** + * 功能描述:
+ * 是否属于一道题,填空题和分析题,有可能是一个题干里面需要回复多个答案的情况。 + * @param typeEnum + * @return {@link boolean} + * @Author: lx + * @Date: 2022/12/4 22:29 + */ + public static boolean isOneQuestion(ResourcesQuestionTypeEnum typeEnum) { + return one.contains(typeEnum); + } + + /** + * 功能描述:
+ * 答案属于一道题 + * + * @param code + * @return {@link boolean} + * @Author: lx + * @Date: 2022/12/4 22:33 + */ + public static boolean isOneQuestion(Integer code) { + return isOneQuestion(EnumUtil.likeValueOf(ResourcesQuestionTypeEnum.class, code)); + } } diff --git a/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionLogService.java b/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionLogService.java index c35e631e..6d2b342c 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionLogService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionLogService.java @@ -22,6 +22,7 @@ import com.ibeetl.jlw.dao.StudentDao; import com.ibeetl.jlw.entity.*; import com.ibeetl.jlw.entity.dto.QuestionLogAddDTO; import com.ibeetl.jlw.entity.vo.QuestionLogAnswerLockVO; +import com.ibeetl.jlw.enums.QuestionBusinessTypeEnum; import com.ibeetl.jlw.enums.QuestionLogAddTypeEnum; import com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum; import com.ibeetl.jlw.web.query.GeneralQuestionLogQuery; @@ -48,15 +49,19 @@ import java.io.*; import java.math.BigDecimal; import java.util.*; import java.util.function.Function; -import java.util.function.Predicate; import java.util.stream.Collectors; import static cn.hutool.core.date.DateUnit.SECOND; +import static cn.hutool.core.util.ArrayUtil.isAllNotEmpty; import static cn.hutool.core.util.ArrayUtil.join; +import static cn.hutool.core.util.ObjectUtil.defaultIfNull; import static cn.jlw.util.CacheUserUtil.getStudent; import static com.ibeetl.admin.core.util.ExcelUtil.getCellFormatValue; import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.*; import static com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum.CHAPTER_EXERCISE; +import static com.ibeetl.jlw.enums.ResourcesQuestionTypeEnum.isOneQuestion; +import static java.lang.Math.abs; +import static java.math.BigDecimal.ZERO; import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.joining; @@ -72,6 +77,7 @@ public class GeneralQuestionLogService extends CoreBaseService { - return item.getQuestionLogAddType() == null || PRE_SUBMIT.equals(item.getQuestionLogAddType()); - }); + case HOMEWORK_QUESTION: { + addQuestionRelatedLog(questionLogAddDTO, questionSettingInfo, student); } break; } } @@ -537,21 +538,16 @@ public class GeneralQuestionLogService extends CoreBaseService questionLogAddTypeEnums = - Arrays.asList(ERROR_TEST_PRE_SUBMIT, ERROR_TEST_FINALLY_SUBMIT, TUCK_TEST_PRE_SUBMIT, TUCK_TEST_FINALLY_SUBMIT); - addQuestionRelatedLog(questionLogAddDTO, student, item -> { - return questionLogAddTypeEnums.contains(item.getQuestionLogAddType()); - }); + addQuestionRelatedLog(questionLogAddDTO, questionSetting, student); } break; } } @@ -583,9 +579,10 @@ public class GeneralQuestionLogService extends CoreBaseService predicate) { + private void addQuestionRelatedLog(@NotNull(message = "提交题目信息不能为空") QuestionLogAddDTO questionLogAddDTO, GeneralQuestionSetting questionSetting, Student student) { // 参数获取 QuestionLogAddTypeEnum addType = questionLogAddDTO.getQuestionLogAddType(); @@ -605,8 +602,6 @@ public class GeneralQuestionLogService extends CoreBaseService logList = generalQuestionLogDao.getValuesByQuery(questionLogQuery); - logList = logList.stream().filter(predicate).collect(Collectors.toList()); - Assert.notEmpty(logList, "未查询到题目信息!"); // 当前时间, 存储要更新的题目日志集合 @@ -640,9 +635,165 @@ public class GeneralQuestionLogService extends CoreBaseService + * 计算学生分数 + * 会判断题目是否打完,并抛出异常 + * + * @param logList + * @Author: lx + * @Date: 2022/12/4 20:16 + */ + public void calculateScoreOnSubmit(@NotEmpty(message = "学生题目日志不能为空!") List logList) { + logList.forEach(questionLog -> { + // 题目原本设置的分数 + final BigDecimal questionScore = questionLog.getQuestionScore(); + // 学生提交的结果 + final String studentAnswer = defaultIfNull(questionLog.getGeneralQuestionLogAnswer(), ""); + // 题目的答案 + final String questionAnswer = defaultIfNull(questionLog.getQuestionAnswer(), ""); + // 判断答案和学生提交的结果,都不能为空 + final boolean allNotEmpty = isAllNotEmpty(questionAnswer, studentAnswer); + // 题目类型,答案属于一道题 + final boolean oneQuestion = isOneQuestion(questionLog.getQuestionType()); + + // 一条日志记录,属于一道题 + if (oneQuestion) { + boolean isTrue = allNotEmpty && studentAnswer.equalsIgnoreCase(questionAnswer); + // 正确题目的数量 + Integer isTrueInteger = BooleanUtil.toInteger(isTrue); + final BigDecimal mySimpleScore = isTrue ? questionScore: ZERO; + // 计算学生最后的得分 + questionLog.setStudentScore(mySimpleScore); + questionLog.setSuccessCount(isTrueInteger); + questionLog.setErrorCount(1 - isTrueInteger); + // 错题标记 + questionLog.setIsErrorFavorite(!isTrue); + } + + // 一条日志记录,属于多道题的逻辑处理 + else { + // 分数,正确数量 + BigDecimal score = ZERO; int successCount = 0; + // 学生提交的题目结果 + final String[] studentAnswerArr = studentAnswer.split(","); + // 正确答案和学生答案对比 + + String[] successAnswerArr = questionAnswer.split(","); + final int studentAnswerLength = studentAnswerArr.length; + final int questionLength = successAnswerArr.length; + // 断言需要判断,题目答案的数量是否相等,不然会对不上答案,导致分数计算错误 + Assert.isTrue(studentAnswerLength == questionLength, "题干:" + questionLog.getQuestionStem()+ ",有选项未提交!"); + + // 一道题的分数 + BigDecimal simpleQuestionScore = NumberUtil.mul(questionScore, questionLength); + // 循环比对这个题目,是否是复杂的题目:如选词填空或者分析题 + for (int i = 0; i < questionLength; i++) { + String sqs = successAnswerArr[i]; + boolean isTrue = allNotEmpty && sqs.equalsIgnoreCase(studentAnswerArr[i]); + BigDecimal oneScore = isTrue ? simpleQuestionScore : ZERO; + score = score.add(oneScore); + + // 正确的数量计数 + if (isTrue) { + successCount++; + } + } + // 全对的题目,才算做正确答案 + final boolean isAllTrue = successCount == questionLength; + // 计算学生最后的得分 + questionLog.setStudentScore(score); + questionLog.setSuccessCount(successCount); + questionLog.setErrorCount(abs(questionLength - successCount)); + // 错题标记 + questionLog.setIsErrorFavorite(!isAllTrue); + } + }); + } + + /** + * 功能描述:
+ * 题目日志信息,分析汇总到某张表里 + * + * @param logList 某个questionSettingId对应的题目日志列表 + * @param questionSettingTotalCount 题目配置下的题目总数 + * @param student 学生 + * @param questionSettingName 题目配置的名称(试卷名称) + * @param fromType 题目配置来源类型 + * @param snapshotFromTypeEnum 题目来源 + * @Author: lx + * @Date: 2022/12/4 20:16 + */ + public void addQuestionLogSummary( + @NotEmpty(message = "学生题目日志不能为空!") List logList, + @NotNull Integer questionSettingTotalCount, + @NotNull Student student, @NotBlank String questionSettingName, @NotNull QuestionBusinessTypeEnum fromType, + @NotNull ResourcesQuestionSnapshotFromTypeEnum snapshotFromTypeEnum) { + // 构建实体 + final QuestionLogSummary questionLogSummary = new QuestionLogSummary(); + final Long questionSettingId = logList.get(0).getGeneralQuestionSettingId(); + // 做对数,做错数,总题数 + Integer sumSuccessCount = 0, sumErrorCount = 0, sumDoCount = 0; + // 试卷总分数, 我的分数, 题目日志ID集 + BigDecimal questionTotalScore = ZERO, myTotalScore = ZERO; StringBuilder sb = new StringBuilder(); + // 获取最大的完成时间 + GeneralQuestionLog maxFinish = logList.stream().max((o1, o2) -> Math.toIntExact(o1.getGeneralQuestionLogFinishTime() - o2.getGeneralQuestionLogFinishTime())) + .get(); + + for (GeneralQuestionLog questionLog : logList) { + Integer successCount = questionLog.getSuccessCount(); + Integer errorCount = questionLog.getErrorCount(); + Assert.isTrue(ObjectUtil.isAllNotEmpty(successCount, errorCount), "题目正确数量和错误数量,计算出了点小问题!"); + + sumSuccessCount += successCount; + sumErrorCount += errorCount; + sumDoCount += ObjectUtil.isNotEmpty(questionLog.getGeneralQuestionLogAnswer()) ? 1 : 0; + questionTotalScore = questionTotalScore.add(questionLog.getQuestionScore()); + myTotalScore = myTotalScore.add(questionLog.getStudentScore()); + sb.append(questionLog.getGeneralQuestionLogId()); + } + // 是否通过及格率 TODO 及格率要查询数据库 这里先写死 + double passRateSetting = 0.6; + boolean isPass = NumberUtil.isGreaterOrEqual(NumberUtil.mul(questionTotalScore, passRateSetting), myTotalScore); + + questionLogSummary.setQuestionSettingId(questionSettingId); + questionLogSummary.setQuestionSettingName(questionSettingName); + questionLogSummary.setQuestionSettingType(snapshotFromTypeEnum); + questionLogSummary.setQuestionLogSummaryFromType(fromType); + questionLogSummary.setQuestionSettingTotalScore(questionTotalScore); + questionLogSummary.setPersonId(student.getStudentId()); + questionLogSummary.setQuestionLogIds(sb.toString()); + questionLogSummary.setQuestionLogSummaryQuestionTotalCount(questionSettingTotalCount); + questionLogSummary.setQuestionLogSummaryStudentDoCount(sumDoCount); + questionLogSummary.setQuestionLogSummarySuccessCount(sumSuccessCount); + questionLogSummary.setQuestionLogSummaryErrorCount(sumErrorCount); + questionLogSummary.setQuestionLogSummarySuccessRate(NumberUtil.div(sumSuccessCount, questionSettingTotalCount, 2).multiply(new BigDecimal(100))); + questionLogSummary.setQuestionLogSummaryCurrentPassRate(new BigDecimal(passRateSetting)); + questionLogSummary.setQuestionLogSummaryIsPass(BooleanUtil.toInteger(isPass)); + questionLogSummary.setQuestionLogSummaryStatus(1); + questionLogSummary.setQuestionLogSummaryAddTime(new Date()); + questionLogSummary.setOrgId(student.getOrgId()); + questionLogSummary.setUserId(student.getUserId()); + if (null != maxFinish) { + Long finishTime = maxFinish.getGeneralQuestionLogFinishTime(); + questionLogSummary.setFinishTime(DateUtil.secondToTime(finishTime.intValue())); + questionLogSummary.setFinishSecondTime(finishTime); + } + questionLogSummaryService.logicDeleteByQuestionSettingIds(questionSettingId.toString()); + questionLogSummaryService.insert(questionLogSummary); } /** diff --git a/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionSettingService.java b/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionSettingService.java index 1b685dc4..a1583cb7 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionSettingService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/GeneralQuestionSettingService.java @@ -49,8 +49,7 @@ import static cn.hutool.core.util.ObjectUtil.defaultIfNull; import static cn.jlw.util.CacheUserUtil.getStudent; import static cn.jlw.util.QuestionUtil.shuffleQuestion; import static com.ibeetl.admin.core.util.ExcelUtil.getCellFormatValue; -import static com.ibeetl.jlw.enums.BusinessCourseInfoEnum.SYSTEM_QUESTION; -import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.*; +import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.FINALLY_SUBMIT; import static com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum.CHAPTER_EXERCISE; import static com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum.HOMEWORK_FILE; import static com.ibeetl.jlw.enums.TuckOrErrorEnum.ERROR_TEST; @@ -385,7 +384,7 @@ public class GeneralQuestionSettingService extends CoreBaseService { item.setGeneralQuestionSettingId(teacherOpenCourseQuestionSettingId); item.setBusinessCourseInfoId(settingQuery.getBusinessId()); - item.setBusinessCourseInfoType(SYSTEM_QUESTION); + item.setBusinessCourseInfoType(QuestionBusinessTypeEnum.FROM_SYSTEM); }); // 更新ID diff --git a/web/src/main/java/com/ibeetl/jlw/service/GeneralResourcesQuestionSnapshotService.java b/web/src/main/java/com/ibeetl/jlw/service/GeneralResourcesQuestionSnapshotService.java index 785ef53d..9749feff 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/GeneralResourcesQuestionSnapshotService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/GeneralResourcesQuestionSnapshotService.java @@ -19,7 +19,7 @@ import com.ibeetl.jlw.entity.Student; import com.ibeetl.jlw.entity.dto.GeneralQuestionTestSimpleInfoDTO; import com.ibeetl.jlw.entity.dto.QuestionSettingDTO; import com.ibeetl.jlw.entity.vo.GeneralQuestionTestSimpleInfoVO; -import com.ibeetl.jlw.enums.BusinessCourseInfoEnum; +import com.ibeetl.jlw.enums.QuestionBusinessTypeEnum; import com.ibeetl.jlw.enums.QuestionLogAddTypeEnum; import com.ibeetl.jlw.web.query.GeneralResourcesQuestionSnapshotQuery; import org.apache.commons.lang3.StringUtils; @@ -355,7 +355,7 @@ public class GeneralResourcesQuestionSnapshotService extends CoreBaseService questionLogSummaryList = new ArrayList<>(); @@ -213,11 +223,11 @@ public class QuestionLogSummaryService extends CoreBaseService> getExcelValues (QuestionLogSummaryQuery questionLogSummaryQuery){ return questionLogSummaryDao.getExcelValues(questionLogSummaryQuery); } - - } diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogService.java index cbcb91bc..fe71997d 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogService.java @@ -43,15 +43,20 @@ import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.util.*; import java.util.function.Function; -import java.util.function.Predicate; import java.util.stream.Collectors; import static cn.hutool.core.date.DateUnit.SECOND; +import static cn.hutool.core.util.ArrayUtil.isAllNotEmpty; import static cn.hutool.core.util.ArrayUtil.join; +import static cn.hutool.core.util.ObjectUtil.defaultIfNull; import static cn.jlw.util.CacheUserUtil.getStudent; import static com.ibeetl.admin.core.util.user.CacheUserUtil.getUserId; +import static com.ibeetl.jlw.enums.QuestionBusinessTypeEnum.FROM_OPEN_COURSE; import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.*; import static com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum.CHAPTER_EXERCISE; +import static com.ibeetl.jlw.enums.ResourcesQuestionTypeEnum.isOneQuestion; +import static java.lang.Math.abs; +import static java.math.BigDecimal.ZERO; import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.joining; @@ -72,6 +77,7 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseServicequeryByCondition(PageQuery query){ PageQuery ret = teacherOpenCourseQuestionLogDao.queryByCondition(query); queryListAfter(ret.getList()); @@ -297,20 +303,17 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService questionLogMap = questionLogAddDTO.getQuestionLogMap(); - // 练习提交验证 - validateTestAddTypeThrow(questionLogAddDTO.getQuestionLogAddType()); - // 查询学生身份 final Student student = getStudent(); Assert.notNull(student, "非学生身份,无法提交!"); - TeacherOpenCourseQuestionSetting info = teacherOpenCourseQuestionSettingService.getInfo(questionSettingId); - Assert.notNull(info, "题目配置ID有误!"); + TeacherOpenCourseQuestionSetting questionSetting = teacherOpenCourseQuestionSettingService.getInfo(questionSettingId); + Assert.notNull(questionSetting, "未匹配到试卷信息!"); // 校验当前时间是否在考试的时间段 teacherOpenCourseQuestionSettingService.verifyQuestionStartAndEndTimeWithNowTimeThrow(questionSettingId); - switch(info.getTeacherOpenCourseQuestionSettingType()) { + switch(questionSetting.getTeacherOpenCourseQuestionSettingType()) { case HOMEWORK_FILE: { addFileRelatedLog(join(questionLogMap.values().toArray(), ","), questionSettingId, student); } break; @@ -319,9 +322,7 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService { - return item.getQuestionLogAddType() == null || PRE_SUBMIT.equals(item.getQuestionLogAddType()); - }); + addQuestionRelatedLog(questionLogAddDTO, questionSetting, student); } break; } } @@ -341,21 +342,16 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService questionLogAddTypeEnums = - Arrays.asList(ERROR_TEST_PRE_SUBMIT, ERROR_TEST_FINALLY_SUBMIT, TUCK_TEST_PRE_SUBMIT, TUCK_TEST_FINALLY_SUBMIT); - addQuestionRelatedLog(questionLogAddDTO, student, item -> { - return questionLogAddTypeEnums.contains(item.getQuestionLogAddType()); - }); + addQuestionRelatedLog(questionLogAddDTO, questionSetting, student); } break; } } @@ -389,14 +385,15 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService predicate) { + private void addQuestionRelatedLog(@NotNull(message = "提交题目信息不能为空") QuestionLogAddDTO questionLogAddDTO, + @NotNull(message = "开课信息不能为空") TeacherOpenCourseQuestionSetting questionSetting, + @NotNull(message = "学生信息不能为空") final Student student) { // 参数获取 QuestionLogAddTypeEnum addType = questionLogAddDTO.getQuestionLogAddType(); Date addTime = questionLogAddDTO.getAddTime(); Long studentId = student.getStudentId(); Long questionSettingId = questionLogAddDTO.getQuestionSettingId(); Map questionLogMap = questionLogAddDTO.getQuestionLogMap(); - // 查询符合条件的日志表 String questionSnapshotIds = join(questionLogMap.keySet().toArray(), ","); @@ -410,9 +407,6 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService logList = teacherOpenCourseQuestionLogDao.getValuesByQuery(questionLogQuery); - // 排除条件交给外部调用 - logList = logList.stream().filter(predicate).collect(Collectors.toList()); - Assert.notEmpty(logList, "未查询到题目信息!"); // 当前时间, 存储要更新的题目日志集合 @@ -427,16 +421,11 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService + * 计算学生分数 + * 会判断题目是否打完,并抛出异常 + * + * @param logList + * @Author: lx + * @Date: 2022/12/4 20:16 + */ + public void calculateScoreOnSubmit(@NotEmpty(message = "学生题目日志不能为空!") List logList) { + logList.forEach(questionLog -> { + // 题目原本设置的分数 + final BigDecimal questionScore = questionLog.getQuestionScore(); + // 学生提交的结果 + final String studentAnswer = defaultIfNull(questionLog.getTeacherOpenCourseQuestionLogAnswer(), ""); + // 题目的答案 + final String questionAnswer = defaultIfNull(questionLog.getQuestionAnswer(), ""); + // 判断答案和学生提交的结果,都不能为空 + final boolean allNotEmpty = isAllNotEmpty(questionAnswer, studentAnswer); + // 题目类型,答案属于一道题 + final boolean oneQuestion = isOneQuestion(questionLog.getQuestionType()); + + // 一条日志记录,属于一道题 + if (oneQuestion) { + boolean isTrue = allNotEmpty && studentAnswer.equalsIgnoreCase(questionAnswer); + // 正确题目的数量 + Integer isTrueInteger = BooleanUtil.toInteger(isTrue); + final BigDecimal mySimpleScore = isTrue ? questionScore: ZERO; + // 计算学生最后的得分 + questionLog.setStudentScore(mySimpleScore); + questionLog.setSuccessCount(isTrueInteger); + questionLog.setErrorCount(1 - isTrueInteger); + // 错题标记 + questionLog.setIsErrorFavorite(!isTrue); + } + + // 一条日志记录,属于多道题的逻辑处理 + else { + // 分数,正确数量 + BigDecimal score = ZERO; int successCount = 0; + // 学生提交的题目结果 + final String[] studentAnswerArr = studentAnswer.split(","); + // 正确答案和学生答案对比 + + String[] successAnswerArr = questionAnswer.split(","); + final int studentAnswerLength = studentAnswerArr.length; + final int questionLength = successAnswerArr.length; + // 断言需要判断,题目答案的数量是否相等,不然会对不上答案,导致分数计算错误 + Assert.isTrue(studentAnswerLength == questionLength, "题干:" + questionLog.getQuestionStem()+ ",有选项未提交!"); + + // 一道题的分数 + BigDecimal simpleQuestionScore = NumberUtil.mul(questionScore, questionLength); + // 循环比对这个题目,是否是复杂的题目:如选词填空或者分析题 + for (int i = 0; i < questionLength; i++) { + String sqs = successAnswerArr[i]; + boolean isTrue = allNotEmpty && sqs.equalsIgnoreCase(studentAnswerArr[i]); + BigDecimal oneScore = isTrue ? simpleQuestionScore : ZERO; + score = score.add(oneScore); + + // 正确的数量计数 + if (isTrue) { + successCount++; + } + } + // 全对的题目,才算做正确答案 + final boolean isAllTrue = successCount == questionLength; + // 计算学生最后的得分 + questionLog.setStudentScore(score); + questionLog.setSuccessCount(successCount); + questionLog.setErrorCount(abs(questionLength - successCount)); + // 错题标记 + questionLog.setIsErrorFavorite(!isAllTrue); + } + }); + } + + /** + * 功能描述:
+ * 题目日志信息,分析汇总到某张表里 + * + * @param logList 某个questionSettingId对应的题目日志列表 + * @param questionSettingTotalCount 题目配置下的题目总数 + * @param student 学生 + * @param questionSettingName 题目配置的名称(试卷名称) + * @param snapshotFromTypeEnum 题目来源 + * @Author: lx + * @Date: 2022/12/4 20:16 + */ + public void addQuestionLogSummary( + @NotEmpty(message = "学生题目日志不能为空!") List logList, + @NotNull Integer questionSettingTotalCount, + @NotNull Student student, @NotBlank String questionSettingName, @NotNull ResourcesQuestionSnapshotFromTypeEnum snapshotFromTypeEnum) { + // 构建实体 + final QuestionLogSummary questionLogSummary = new QuestionLogSummary(); + final Long questionSettingId = logList.get(0).getTeacherOpenCourseQuestionSettingId(); + // 做对数,做错数,总题数 + Integer sumSuccessCount = 0, sumErrorCount = 0, sumDoCount = 0; + // 试卷总分数, 我的分数, 题目日志ID集 + BigDecimal questionTotalScore = ZERO, myTotalScore = ZERO; StringBuilder sb = new StringBuilder(); + + // 获取最大的完成时间 + TeacherOpenCourseQuestionLog maxFinish = logList.stream() + .max((o1, o2) -> Math.toIntExact(o1.getTeacherOpenCourseQuestionLogFinishTime() - o2.getTeacherOpenCourseQuestionLogFinishTime())) + .get(); + + for (TeacherOpenCourseQuestionLog questionLog : logList) { + Integer successCount = questionLog.getSuccessCount(); + Integer errorCount = questionLog.getErrorCount(); + Assert.isTrue(ObjectUtil.isAllNotEmpty(successCount, errorCount), "题目正确数量和错误数量,计算出了点小问题!"); + + sumSuccessCount += successCount; + sumErrorCount += errorCount; + sumDoCount += ObjectUtil.isNotEmpty(questionLog.getTeacherOpenCourseQuestionLogAnswer()) ? 1 : 0; + questionTotalScore = questionTotalScore.add(questionLog.getQuestionScore()); + myTotalScore = myTotalScore.add(questionLog.getStudentScore()); + sb.append(questionLog.getTeacherOpenCourseQuestionLogId()); + } + // 是否通过及格率 TODO 及格率要查询数据库 这里先写死 + double passRateSetting = 0.6; + boolean isPass = NumberUtil.isGreaterOrEqual(NumberUtil.mul(questionTotalScore, passRateSetting), myTotalScore); + questionLogSummary.setQuestionSettingId(questionSettingId); + questionLogSummary.setQuestionSettingName(questionSettingName); + questionLogSummary.setQuestionSettingType(snapshotFromTypeEnum); + questionLogSummary.setQuestionLogSummaryFromType(FROM_OPEN_COURSE); + questionLogSummary.setQuestionSettingTotalScore(questionTotalScore); + questionLogSummary.setPersonId(student.getStudentId()); + questionLogSummary.setQuestionLogIds(sb.toString()); + questionLogSummary.setQuestionLogSummaryQuestionTotalCount(questionSettingTotalCount); + questionLogSummary.setQuestionLogSummaryStudentDoCount(sumDoCount); + questionLogSummary.setQuestionLogSummarySuccessCount(sumSuccessCount); + questionLogSummary.setQuestionLogSummaryErrorCount(sumErrorCount); + questionLogSummary.setQuestionLogSummarySuccessRate(NumberUtil.div(sumSuccessCount, questionSettingTotalCount, 2).multiply(new BigDecimal(100))); + questionLogSummary.setQuestionLogSummaryCurrentPassRate(new BigDecimal(passRateSetting)); + questionLogSummary.setQuestionLogSummaryIsPass(BooleanUtil.toInteger(isPass)); + questionLogSummary.setQuestionLogSummaryStatus(1); + questionLogSummary.setQuestionLogSummaryAddTime(new Date()); + questionLogSummary.setOrgId(student.getOrgId()); + questionLogSummary.setUserId(student.getUserId()); + if (null != maxFinish) { + Long finishTime = maxFinish.getTeacherOpenCourseQuestionLogFinishTime(); + questionLogSummary.setFinishTime(DateUtil.secondToTime(finishTime.intValue())); + questionLogSummary.setFinishSecondTime(finishTime); + } + + questionLogSummaryService.logicDeleteByQuestionSettingIds(questionSettingId.toString()); + questionLogSummaryService.insert(questionLogSummary); + } /** * 验证前端传递过来的添加时间是否是最新的 diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogWrongService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogWrongService.java index 038b07b4..03eae7ad 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogWrongService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseQuestionLogWrongService.java @@ -417,8 +417,6 @@ public class TeacherOpenCourseQuestionLogWrongService extends CoreBaseService questionWrongList = questionLogList.stream() - // 这三种类型,进行机器判断,剩余的走人工处理 - .filter(questionLog -> Arrays.asList(1, 2, 3).contains(questionLog.getQuestionType())) .filter(questionLog -> { // 学生写答案了,并且也给打分了,但是呢,分数是0的情况。这个时候,就是错题了 return (null != questionLog.getStudentScore() diff --git a/web/src/main/java/com/ibeetl/jlw/web/QuestionLogSummaryController.java b/web/src/main/java/com/ibeetl/jlw/web/QuestionLogSummaryController.java index f232e4ed..d85c41bb 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/QuestionLogSummaryController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/QuestionLogSummaryController.java @@ -301,11 +301,11 @@ public class QuestionLogSummaryController{ "来源类型 枚举", "配置的题目总分数", "人员", + "关联的做题日志IDs", "配置的题目总数", "学生做题总数", - "全对数量", - "半对数量", - "错题数量", + "正确数量", + "错误数量", "正确率,最大100", "当前配置的及格比率", "是否及格", @@ -319,10 +319,10 @@ public class QuestionLogSummaryController{ "questionLogSummaryFromType", "questionSettingTotalScore", "personId", + "questionLogIds", "questionLogSummaryQuestionTotalCount", "questionLogSummaryStudentDoCount", "questionLogSummarySuccessCount", - "questionLogSummaryHalfSuccessCount", "questionLogSummaryErrorCount", "questionLogSummarySuccessRate", "questionLogSummaryCurrentPassRate", diff --git a/web/src/main/java/com/ibeetl/jlw/web/query/GeneralQuestionSettingQuery.java b/web/src/main/java/com/ibeetl/jlw/web/query/GeneralQuestionSettingQuery.java index d72058b3..87ed49d5 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/query/GeneralQuestionSettingQuery.java +++ b/web/src/main/java/com/ibeetl/jlw/web/query/GeneralQuestionSettingQuery.java @@ -8,7 +8,7 @@ import com.ibeetl.jlw.entity.GeneralQuestionSetting; import com.ibeetl.jlw.entity.TeacherOpenCourseMergeResourcesQuestion; import com.ibeetl.jlw.entity.dto.QuestionSettingDTO; import com.ibeetl.jlw.enums.GlobalPushStatusEnum; -import com.ibeetl.jlw.enums.QuestionBussinessTypeEnum; +import com.ibeetl.jlw.enums.QuestionBusinessTypeEnum; import com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum; import lombok.*; import lombok.experimental.Accessors; @@ -21,7 +21,7 @@ import java.util.List; import static cn.hutool.core.date.DateUtil.offset; import static cn.hutool.core.util.ObjectUtil.defaultIfNull; import static com.ibeetl.jlw.enums.GlobalPushStatusEnum.UN_PUSH; -import static com.ibeetl.jlw.enums.QuestionBussinessTypeEnum.FROM_SYSTEM; +import static com.ibeetl.jlw.enums.QuestionBusinessTypeEnum.FROM_SYSTEM; import static com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum.CHAPTER_EXERCISE; /** @@ -40,7 +40,7 @@ public class GeneralQuestionSettingQuery extends PageParam { @Query(name = "业务ID", display = false) private Long businessId; @Query(name = "业务类型", display = false) - private QuestionBussinessTypeEnum businessType; + private QuestionBusinessTypeEnum businessType; @Query(name = "班级ID集合(逗号隔开)", display = false) private String generalQuestionSettingSchoolClassIds; @Query(name = "作答次数", display = false) diff --git a/web/src/main/java/com/ibeetl/jlw/web/query/GeneralResourcesQuestionSnapshotQuery.java b/web/src/main/java/com/ibeetl/jlw/web/query/GeneralResourcesQuestionSnapshotQuery.java index 639c0734..0b759aaa 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/query/GeneralResourcesQuestionSnapshotQuery.java +++ b/web/src/main/java/com/ibeetl/jlw/web/query/GeneralResourcesQuestionSnapshotQuery.java @@ -4,7 +4,7 @@ import cn.jlw.validate.ValidateConfig; import com.ibeetl.admin.core.annotation.Query; import com.ibeetl.admin.core.web.query.PageParam; import com.ibeetl.jlw.entity.GeneralResourcesQuestionSnapshot; -import com.ibeetl.jlw.enums.BusinessCourseInfoEnum; +import com.ibeetl.jlw.enums.QuestionBusinessTypeEnum; import lombok.*; import lombok.experimental.Accessors; @@ -29,7 +29,7 @@ public class GeneralResourcesQuestionSnapshotQuery extends PageParam { @Query(name = "业务课程ID", display = false) private Long businessCourseInfoId; @Query(name = "业务课程类型", display = false) - private BusinessCourseInfoEnum businessCourseInfoType; + private QuestionBusinessTypeEnum businessCourseInfoType; @Query(name = "题型(1单选 2多选 3判断 4填空 5分析)", display = false) private Integer questionType; @Query(name = "分值", display = false) diff --git a/web/src/main/java/com/ibeetl/jlw/web/query/QuestionLogSummaryQuery.java b/web/src/main/java/com/ibeetl/jlw/web/query/QuestionLogSummaryQuery.java index 8275e6fd..e78a8b98 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/query/QuestionLogSummaryQuery.java +++ b/web/src/main/java/com/ibeetl/jlw/web/query/QuestionLogSummaryQuery.java @@ -4,10 +4,8 @@ import cn.jlw.validate.ValidateConfig; import com.ibeetl.admin.core.annotation.Query; import com.ibeetl.admin.core.web.query.PageParam; import com.ibeetl.jlw.entity.QuestionLogSummary; -import com.ibeetl.jlw.enums.BusinessCourseInfoEnum; +import com.ibeetl.jlw.enums.QuestionBusinessTypeEnum; import com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum; -import lombok.Data; -import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; import java.math.BigDecimal; @@ -16,8 +14,6 @@ import java.util.Date; /** *通用题目日志汇总查询 */ -@Data -@EqualsAndHashCode(callSuper = false) public class QuestionLogSummaryQuery extends PageParam { @NotNull(message = "ID不能为空", groups =ValidateConfig.UPDATE.class) @Query(name = "学生做题日志汇总ID", display = false) @@ -25,35 +21,39 @@ public class QuestionLogSummaryQuery extends PageParam { @Query(name = "题目配置ID", display = false) private Long questionSettingId; @Query(name = "题目配置名称", display = false) - private Long questionSettingName; - @Query(name = "类型 枚举(ResourcesQuestionSnapshotFromTypeEnum)", display = false) + private String questionSettingName; + @Query(name = "类型 枚举(ResourcesQuestionSnapshotFromTypeEnum)", display = true) private ResourcesQuestionSnapshotFromTypeEnum questionSettingType; - @Query(name = "来源类型 枚举(BusinessCourseInfoEnum)", display = false) - private BusinessCourseInfoEnum questionLogSummaryFromType; + @Query(name = "来源类型 枚举", display = false) + private QuestionBusinessTypeEnum questionLogSummaryFromType; @Query(name = "配置的题目总分数", display = false) - private Integer questionSettingTotalScore; + private BigDecimal questionSettingTotalScore; @Query(name = "人员ID(学生ID等等)", display = false) private Long personId; + @Query(name = "关联的做题日志IDs", display = false) + private String questionLogIds; @Query(name = "配置的题目总数", display = false) private Integer questionLogSummaryQuestionTotalCount; @Query(name = "学生做题总数", display = false) private Integer questionLogSummaryStudentDoCount; - @Query(name = "全对数量", display = false) + @Query(name = "正确数量", display = false) private Integer questionLogSummarySuccessCount; - @Query(name = "半对数量", display = false) - private Integer questionLogSummaryHalfSuccessCount; - @Query(name = "错题数量", display = false) + @Query(name = "错误数量", display = false) private Integer questionLogSummaryErrorCount; @Query(name = "正确率", display = false) private BigDecimal questionLogSummarySuccessRate; @Query(name = "当前配置的及格比率", display = false) private BigDecimal questionLogSummaryCurrentPassRate; - @Query(name = "是否及格", display = false) + @Query(name = "是否及格", display = true) private Integer questionLogSummaryIsPass; @Query(name = "状态(1正常 2删除)", display = true,type=Query.TYPE_DICT,dict="global_status") private Integer questionLogSummaryStatus; @Query(name = "添加时间", display = false) private Date questionLogSummaryAddTime; + @Query(name = "完成用时(秒)", display = false) + private Long finishSecondTime ; + @Query(name = "完成用时 时间格式", display = false) + private String finishTime ; @Query(name = "组织ID", display = false) private Long orgId; @Query(name = "用户ID", display = false) @@ -66,13 +66,124 @@ public class QuestionLogSummaryQuery extends PageParam { private String orgIdPlural; private String userIdPlural; - //json格式 + private String questionLogSummaryJsonStr;//json格式 - private String questionLogSummaryJsonStr; + private String _given;//指定更新的特定字段,多个逗号隔开 - //指定更新的特定字段,多个逗号隔开 - - private String _given; + public Long getQuestionLogSummaryId(){ + return questionLogSummaryId; + } + public void setQuestionLogSummaryId(Long questionLogSummaryId ){ + this.questionLogSummaryId = questionLogSummaryId; + } + public Long getQuestionSettingId(){ + return questionSettingId; + } + public void setQuestionSettingId(Long questionSettingId ){ + this.questionSettingId = questionSettingId; + } + public String getQuestionSettingName(){ + return questionSettingName; + } + public void setQuestionSettingName(String questionSettingName ){ + this.questionSettingName = questionSettingName; + } + public ResourcesQuestionSnapshotFromTypeEnum getQuestionSettingType(){ + return questionSettingType; + } + public void setQuestionSettingType(ResourcesQuestionSnapshotFromTypeEnum questionSettingType ){ + this.questionSettingType = questionSettingType; + } + public QuestionBusinessTypeEnum getQuestionLogSummaryFromType(){ + return questionLogSummaryFromType; + } + public void setQuestionLogSummaryFromType(QuestionBusinessTypeEnum questionLogSummaryFromType ){ + this.questionLogSummaryFromType = questionLogSummaryFromType; + } + public BigDecimal getQuestionSettingTotalScore(){ + return questionSettingTotalScore; + } + public void setQuestionSettingTotalScore(BigDecimal questionSettingTotalScore ){ + this.questionSettingTotalScore = questionSettingTotalScore; + } + public Long getPersonId(){ + return personId; + } + public void setPersonId(Long personId ){ + this.personId = personId; + } + public String getQuestionLogIds(){ + return questionLogIds; + } + public void setQuestionLogIds(String questionLogIds ){ + this.questionLogIds = questionLogIds; + } + public Integer getQuestionLogSummaryQuestionTotalCount(){ + return questionLogSummaryQuestionTotalCount; + } + public void setQuestionLogSummaryQuestionTotalCount(Integer questionLogSummaryQuestionTotalCount ){ + this.questionLogSummaryQuestionTotalCount = questionLogSummaryQuestionTotalCount; + } + public Integer getQuestionLogSummaryStudentDoCount(){ + return questionLogSummaryStudentDoCount; + } + public void setQuestionLogSummaryStudentDoCount(Integer questionLogSummaryStudentDoCount ){ + this.questionLogSummaryStudentDoCount = questionLogSummaryStudentDoCount; + } + public Integer getQuestionLogSummarySuccessCount(){ + return questionLogSummarySuccessCount; + } + public void setQuestionLogSummarySuccessCount(Integer questionLogSummarySuccessCount ){ + this.questionLogSummarySuccessCount = questionLogSummarySuccessCount; + } + public Integer getQuestionLogSummaryErrorCount(){ + return questionLogSummaryErrorCount; + } + public void setQuestionLogSummaryErrorCount(Integer questionLogSummaryErrorCount ){ + this.questionLogSummaryErrorCount = questionLogSummaryErrorCount; + } + public BigDecimal getQuestionLogSummarySuccessRate(){ + return questionLogSummarySuccessRate; + } + public void setQuestionLogSummarySuccessRate(BigDecimal questionLogSummarySuccessRate ){ + this.questionLogSummarySuccessRate = questionLogSummarySuccessRate; + } + public BigDecimal getQuestionLogSummaryCurrentPassRate(){ + return questionLogSummaryCurrentPassRate; + } + public void setQuestionLogSummaryCurrentPassRate(BigDecimal questionLogSummaryCurrentPassRate ){ + this.questionLogSummaryCurrentPassRate = questionLogSummaryCurrentPassRate; + } + public Integer getQuestionLogSummaryIsPass(){ + return questionLogSummaryIsPass; + } + public void setQuestionLogSummaryIsPass(Integer questionLogSummaryIsPass ){ + this.questionLogSummaryIsPass = questionLogSummaryIsPass; + } + public Integer getQuestionLogSummaryStatus(){ + return questionLogSummaryStatus; + } + public void setQuestionLogSummaryStatus(Integer questionLogSummaryStatus ){ + this.questionLogSummaryStatus = questionLogSummaryStatus; + } + public Date getQuestionLogSummaryAddTime(){ + return questionLogSummaryAddTime; + } + public void setQuestionLogSummaryAddTime(Date questionLogSummaryAddTime ){ + this.questionLogSummaryAddTime = questionLogSummaryAddTime; + } + public Long getOrgId(){ + return orgId; + } + public void setOrgId(Long orgId ){ + this.orgId = orgId; + } + public Long getUserId(){ + return userId; + } + public void setUserId(Long userId ){ + this.userId = userId; + } public QuestionLogSummary pojo(){ QuestionLogSummary pojo = new QuestionLogSummary(); @@ -83,19 +194,85 @@ public class QuestionLogSummaryQuery extends PageParam { pojo.setQuestionLogSummaryFromType(this.getQuestionLogSummaryFromType()); pojo.setQuestionSettingTotalScore(this.getQuestionSettingTotalScore()); pojo.setPersonId(this.getPersonId()); + pojo.setQuestionLogIds(this.getQuestionLogIds()); pojo.setQuestionLogSummaryQuestionTotalCount(this.getQuestionLogSummaryQuestionTotalCount()); pojo.setQuestionLogSummaryStudentDoCount(this.getQuestionLogSummaryStudentDoCount()); pojo.setQuestionLogSummarySuccessCount(this.getQuestionLogSummarySuccessCount()); - pojo.setQuestionLogSummaryHalfSuccessCount(this.getQuestionLogSummaryHalfSuccessCount()); pojo.setQuestionLogSummaryErrorCount(this.getQuestionLogSummaryErrorCount()); pojo.setQuestionLogSummarySuccessRate(this.getQuestionLogSummarySuccessRate()); pojo.setQuestionLogSummaryCurrentPassRate(this.getQuestionLogSummaryCurrentPassRate()); pojo.setQuestionLogSummaryIsPass(this.getQuestionLogSummaryIsPass()); pojo.setQuestionLogSummaryStatus(this.getQuestionLogSummaryStatus()); pojo.setQuestionLogSummaryAddTime(this.getQuestionLogSummaryAddTime()); + pojo.setFinishSecondTime(this.getFinishSecondTime()); + pojo.setFinishTime(this.getFinishTime()); pojo.setOrgId(this.getOrgId()); pojo.setUserId(this.getUserId()); return pojo; } + public String getQuestionLogSummaryIdPlural(){ + return questionLogSummaryIdPlural; + } + public void setQuestionLogSummaryIdPlural(String questionLogSummaryIdPlural){ + this.questionLogSummaryIdPlural = questionLogSummaryIdPlural; + } + public String getQuestionSettingIdPlural(){ + return questionSettingIdPlural; + } + public void setQuestionSettingIdPlural(String questionSettingIdPlural){ + this.questionSettingIdPlural = questionSettingIdPlural; + } + public String getPersonIdPlural(){ + return personIdPlural; + } + public void setPersonIdPlural(String personIdPlural){ + this.personIdPlural = personIdPlural; + } + public String getQuestionLogSummaryStatusPlural(){ + return questionLogSummaryStatusPlural; + } + public void setQuestionLogSummaryStatusPlural(String questionLogSummaryStatusPlural){ + this.questionLogSummaryStatusPlural = questionLogSummaryStatusPlural; + } + public String getOrgIdPlural(){ + return orgIdPlural; + } + public void setOrgIdPlural(String orgIdPlural){ + this.orgIdPlural = orgIdPlural; + } + public String getUserIdPlural(){ + return userIdPlural; + } + public void setUserIdPlural(String userIdPlural){ + this.userIdPlural = userIdPlural; + } + public String getQuestionLogSummaryJsonStr(){ + return questionLogSummaryJsonStr; + } + public void setQuestionLogSummaryJsonStr(String questionLogSummaryJsonStr ){ + this.questionLogSummaryJsonStr = questionLogSummaryJsonStr; + } + public String get_given() { + return _given; + } + public void set_given(String _given) { + this._given = _given; + } + + public Long getFinishSecondTime() { + return finishSecondTime; + } + + public void setFinishSecondTime(Long finishSecondTime) { + this.finishSecondTime = finishSecondTime; + } + + public String getFinishTime() { + return finishTime; + } + + public void setFinishTime(String finishTime) { + this.finishTime = finishTime; + } } diff --git a/web/src/main/resources/sql/jlw/generalResourcesQuestionSnapshot.md b/web/src/main/resources/sql/jlw/generalResourcesQuestionSnapshot.md index c6fa23f6..6ab34c14 100644 --- a/web/src/main/resources/sql/jlw/generalResourcesQuestionSnapshot.md +++ b/web/src/main/resources/sql/jlw/generalResourcesQuestionSnapshot.md @@ -761,7 +761,7 @@ getQuestionBySettingOptionDTO select @if(!isEmpty(singleScore)){ '' as general_question_setting_id, - 'SYSTEM_QUESTION' as business_course_info_type, + 'FROM_SYSTEM' as business_course_info_type, t.course_info_id as business_course_info_id, t.question_type, t.question_stem, diff --git a/web/src/main/resources/sql/jlw/questionLogSummary.md b/web/src/main/resources/sql/jlw/questionLogSummary.md index c6cc0e8e..a1af8a01 100644 --- a/web/src/main/resources/sql/jlw/questionLogSummary.md +++ b/web/src/main/resources/sql/jlw/questionLogSummary.md @@ -40,6 +40,9 @@ queryByCondition @if(!isEmpty(personIdPlural)){ and find_in_set(t.person_id,#personIdPlural#) @} + @if(!isEmpty(questionLogIds)){ + and t.question_log_ids =#questionLogIds# + @} @if(!isEmpty(questionLogSummaryQuestionTotalCount)){ and t.question_log_summary_question_total_count =#questionLogSummaryQuestionTotalCount# @} @@ -49,9 +52,6 @@ queryByCondition @if(!isEmpty(questionLogSummarySuccessCount)){ and t.question_log_summary_success_count =#questionLogSummarySuccessCount# @} - @if(!isEmpty(questionLogSummaryHalfSuccessCount)){ - and t.question_log_summary_half_success_count =#questionLogSummaryHalfSuccessCount# - @} @if(!isEmpty(questionLogSummaryErrorCount)){ and t.question_log_summary_error_count =#questionLogSummaryErrorCount# @} @@ -130,6 +130,9 @@ queryByConditionQuery @if(!isEmpty(personIdPlural)){ and find_in_set(t.person_id,#personIdPlural#) @} + @if(!isEmpty(questionLogIds)){ + and t.question_log_ids =#questionLogIds# + @} @if(!isEmpty(questionLogSummaryQuestionTotalCount)){ and t.question_log_summary_question_total_count =#questionLogSummaryQuestionTotalCount# @} @@ -139,9 +142,6 @@ queryByConditionQuery @if(!isEmpty(questionLogSummarySuccessCount)){ and t.question_log_summary_success_count =#questionLogSummarySuccessCount# @} - @if(!isEmpty(questionLogSummaryHalfSuccessCount)){ - and t.question_log_summary_half_success_count =#questionLogSummaryHalfSuccessCount# - @} @if(!isEmpty(questionLogSummaryErrorCount)){ and t.question_log_summary_error_count =#questionLogSummaryErrorCount# @} @@ -190,6 +190,14 @@ deleteQuestionLogSummaryByIds update question_log_summary set question_log_summary_status = 2 where find_in_set(question_log_summary_id,#ids#) +logicDeleteByQuestionSettingIds +=== + +* 批量删除(假删除) + + update question_log_summary set question_log_summary_status = 2 where find_in_set(question_setting_id,#questionSettingIds#) and question_log_summary_status = 1 + + deleteByIds === @@ -254,6 +262,13 @@ updateGivenByIds person_id = #personId# , @} @} + @if(contain("questionLogIds",_given)){ + @if(isEmpty(questionLogIds)){ + question_log_ids = null , + @}else{ + question_log_ids = #questionLogIds# , + @} + @} @if(contain("questionLogSummaryQuestionTotalCount",_given)){ @if(isEmpty(questionLogSummaryQuestionTotalCount)){ question_log_summary_question_total_count = null , @@ -275,13 +290,6 @@ updateGivenByIds question_log_summary_success_count = #questionLogSummarySuccessCount# , @} @} - @if(contain("questionLogSummaryHalfSuccessCount",_given)){ - @if(isEmpty(questionLogSummaryHalfSuccessCount)){ - question_log_summary_half_success_count = null , - @}else{ - question_log_summary_half_success_count = #questionLogSummaryHalfSuccessCount# , - @} - @} @if(contain("questionLogSummaryErrorCount",_given)){ @if(isEmpty(questionLogSummaryErrorCount)){ question_log_summary_error_count = null , @@ -372,6 +380,9 @@ getQuestionLogSummaryValues @if(!isEmpty(personId)){ and t.person_id =#personId# @} + @if(!isEmpty(questionLogIds)){ + and t.question_log_ids =#questionLogIds# + @} @if(!isEmpty(questionLogSummaryQuestionTotalCount)){ and t.question_log_summary_question_total_count =#questionLogSummaryQuestionTotalCount# @} @@ -381,9 +392,6 @@ getQuestionLogSummaryValues @if(!isEmpty(questionLogSummarySuccessCount)){ and t.question_log_summary_success_count =#questionLogSummarySuccessCount# @} - @if(!isEmpty(questionLogSummaryHalfSuccessCount)){ - and t.question_log_summary_half_success_count =#questionLogSummaryHalfSuccessCount# - @} @if(!isEmpty(questionLogSummaryErrorCount)){ and t.question_log_summary_error_count =#questionLogSummaryErrorCount# @} @@ -450,6 +458,9 @@ getValuesByQuery @if(!isEmpty(personIdPlural)){ and find_in_set(t.person_id,#personIdPlural#) @} + @if(!isEmpty(questionLogIds)){ + and t.question_log_ids =#questionLogIds# + @} @if(!isEmpty(questionLogSummaryQuestionTotalCount)){ and t.question_log_summary_question_total_count =#questionLogSummaryQuestionTotalCount# @} @@ -459,9 +470,6 @@ getValuesByQuery @if(!isEmpty(questionLogSummarySuccessCount)){ and t.question_log_summary_success_count =#questionLogSummarySuccessCount# @} - @if(!isEmpty(questionLogSummaryHalfSuccessCount)){ - and t.question_log_summary_half_success_count =#questionLogSummaryHalfSuccessCount# - @} @if(!isEmpty(questionLogSummaryErrorCount)){ and t.question_log_summary_error_count =#questionLogSummaryErrorCount# @} @@ -538,6 +546,9 @@ getValuesByQueryNotWithPermission @if(!isEmpty(personIdPlural)){ and find_in_set(t.person_id,#personIdPlural#) @} + @if(!isEmpty(questionLogIds)){ + and t.question_log_ids =#questionLogIds# + @} @if(!isEmpty(questionLogSummaryQuestionTotalCount)){ and t.question_log_summary_question_total_count =#questionLogSummaryQuestionTotalCount# @} @@ -547,9 +558,6 @@ getValuesByQueryNotWithPermission @if(!isEmpty(questionLogSummarySuccessCount)){ and t.question_log_summary_success_count =#questionLogSummarySuccessCount# @} - @if(!isEmpty(questionLogSummaryHalfSuccessCount)){ - and t.question_log_summary_half_success_count =#questionLogSummaryHalfSuccessCount# - @} @if(!isEmpty(questionLogSummaryErrorCount)){ and t.question_log_summary_error_count =#questionLogSummaryErrorCount# @} @@ -604,10 +612,10 @@ getExcelValues MAX(LENGTH(t.question_log_summary_from_type)) question_log_summary_from_type, MAX(LENGTH(t.question_setting_total_score)) question_setting_total_score, MAX(LENGTH(t.person_id)) person_id, + MAX(LENGTH(t.question_log_ids)) question_log_ids, MAX(LENGTH(t.question_log_summary_question_total_count)) question_log_summary_question_total_count, MAX(LENGTH(t.question_log_summary_student_do_count)) question_log_summary_student_do_count, MAX(LENGTH(t.question_log_summary_success_count)) question_log_summary_success_count, - MAX(LENGTH(t.question_log_summary_half_success_count)) question_log_summary_half_success_count, MAX(LENGTH(t.question_log_summary_error_count)) question_log_summary_error_count, MAX(LENGTH(t.question_log_summary_success_rate)) question_log_summary_success_rate, MAX(LENGTH(t.question_log_summary_current_pass_rate)) question_log_summary_current_pass_rate, @@ -645,6 +653,9 @@ getExcelValues @if(!isEmpty(personIdPlural)){ and find_in_set(t.person_id,#personIdPlural#) @} + @if(!isEmpty(questionLogIds)){ + and t.question_log_ids =#questionLogIds# + @} @if(!isEmpty(questionLogSummaryQuestionTotalCount)){ and t.question_log_summary_question_total_count =#questionLogSummaryQuestionTotalCount# @} @@ -654,9 +665,6 @@ getExcelValues @if(!isEmpty(questionLogSummarySuccessCount)){ and t.question_log_summary_success_count =#questionLogSummarySuccessCount# @} - @if(!isEmpty(questionLogSummaryHalfSuccessCount)){ - and t.question_log_summary_half_success_count =#questionLogSummaryHalfSuccessCount# - @} @if(!isEmpty(questionLogSummaryErrorCount)){ and t.question_log_summary_error_count =#questionLogSummaryErrorCount# @} @@ -703,10 +711,10 @@ getExcelValues t.question_log_summary_from_type , t.question_setting_total_score , t.person_id , + t.question_log_ids , t.question_log_summary_question_total_count , t.question_log_summary_student_do_count , t.question_log_summary_success_count , - t.question_log_summary_half_success_count , t.question_log_summary_error_count , t.question_log_summary_success_rate , t.question_log_summary_current_pass_rate , @@ -744,6 +752,9 @@ getExcelValues @if(!isEmpty(personIdPlural)){ and find_in_set(t.person_id,#personIdPlural#) @} + @if(!isEmpty(questionLogIds)){ + and t.question_log_ids =#questionLogIds# + @} @if(!isEmpty(questionLogSummaryQuestionTotalCount)){ and t.question_log_summary_question_total_count =#questionLogSummaryQuestionTotalCount# @} @@ -753,9 +764,6 @@ getExcelValues @if(!isEmpty(questionLogSummarySuccessCount)){ and t.question_log_summary_success_count =#questionLogSummarySuccessCount# @} - @if(!isEmpty(questionLogSummaryHalfSuccessCount)){ - and t.question_log_summary_half_success_count =#questionLogSummaryHalfSuccessCount# - @} @if(!isEmpty(questionLogSummaryErrorCount)){ and t.question_log_summary_error_count =#questionLogSummaryErrorCount# @} diff --git a/web/src/main/resources/static/js/jlw/questionLogSummary/index.js b/web/src/main/resources/static/js/jlw/questionLogSummary/index.js index 29215127..f438b14c 100644 --- a/web/src/main/resources/static/js/jlw/questionLogSummary/index.js +++ b/web/src/main/resources/static/js/jlw/questionLogSummary/index.js @@ -83,6 +83,13 @@ layui.define([ 'form', 'laydate', 'table' ], function(exports) { hideField :false, hide:$.isEmpty(sx_['personId'])?false:sx_['personId'], }, + { + field : 'questionLogIds', + title : '关联的做题日志IDs', + align:"center", + hideField :false, + hide:$.isEmpty(sx_['questionLogIds'])?false:sx_['questionLogIds'], + }, { field : 'questionLogSummaryQuestionTotalCount', title : '配置的题目总数', @@ -99,21 +106,14 @@ layui.define([ 'form', 'laydate', 'table' ], function(exports) { }, { field : 'questionLogSummarySuccessCount', - title : '全对数量', + title : '正确数量', align:"center", hideField :false, hide:$.isEmpty(sx_['questionLogSummarySuccessCount'])?false:sx_['questionLogSummarySuccessCount'], }, - { - field : 'questionLogSummaryHalfSuccessCount', - title : '半对数量', - align:"center", - hideField :false, - hide:$.isEmpty(sx_['questionLogSummaryHalfSuccessCount'])?false:sx_['questionLogSummaryHalfSuccessCount'], - }, { field : 'questionLogSummaryErrorCount', - title : '错题数量', + title : '错误数量', align:"center", hideField :false, hide:$.isEmpty(sx_['questionLogSummaryErrorCount'])?false:sx_['questionLogSummaryErrorCount'], diff --git a/web/src/main/resources/templates/jlw/questionLogSummary/add.html b/web/src/main/resources/templates/jlw/questionLogSummary/add.html index d5c27071..8fcfc002 100644 --- a/web/src/main/resources/templates/jlw/questionLogSummary/add.html +++ b/web/src/main/resources/templates/jlw/questionLogSummary/add.html @@ -52,15 +52,15 @@
- +
- +
- +
- +
@@ -68,15 +68,15 @@
- +
- +
- +
- +
@@ -84,7 +84,7 @@
- +
diff --git a/web/src/main/resources/templates/jlw/questionLogSummary/edit.html b/web/src/main/resources/templates/jlw/questionLogSummary/edit.html index 53e0ea2e..88352201 100644 --- a/web/src/main/resources/templates/jlw/questionLogSummary/edit.html +++ b/web/src/main/resources/templates/jlw/questionLogSummary/edit.html @@ -52,15 +52,15 @@
- +
- +
- +
- +
@@ -68,15 +68,15 @@
- +
- +
- +
- +
@@ -84,7 +84,7 @@
- +