题目日志汇总

beetlsql3-dev
Mlxa0324 2 years ago
parent df0d31b126
commit aac51b295f

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?PowerDesigner AppLocale="UTF16" ID="{BA33ABB7-B246-4DB0-85DE-396EDDB46458}" Label="" LastModificationDate="1669988334" Name="cjks" Objects="1356" Symbols="103" Target="MySQL 5.0" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="16.5.0.3982"?>
<?PowerDesigner AppLocale="UTF16" ID="{BA33ABB7-B246-4DB0-85DE-396EDDB46458}" Label="" LastModificationDate="1670172135" Name="cjks" Objects="1348" Symbols="103" Target="MySQL 5.0" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="16.5.0.3982"?>
<!-- do not edit this file -->
<Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object">
@ -6748,10 +6748,11 @@ LABL 0 新宋体,8,N</a:FontList>
</o:TableSymbol>
<o:TableSymbol Id="o215">
<a:CreationDate>1669986324</a:CreationDate>
<a:ModificationDate>1669988273</a:ModificationDate>
<a:ModificationDate>1670172135</a:ModificationDate>
<a:IconMode>-1</a:IconMode>
<a:Rect>((255920,65489), (280286,83103))</a:Rect>
<a:Rect>((255845,64095), (280211,84151))</a:Rect>
<a:AutoAdjustToText>0</a:AutoAdjustToText>
<a:ShadowStyle>1</a:ShadowStyle>
<a:LineColor>12615680</a:LineColor>
<a:FillColor>16570034</a:FillColor>
<a:ShadowColor>12632256</a:ShadowColor>
@ -20914,7 +20915,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Code>question_log_summary</a:Code>
<a:CreationDate>1661850632</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1669988334</a:ModificationDate>
<a:ModificationDate>1670172100</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>学生-题目日志-分析汇总</a:Comment>
<a:PhysicalOptions>auto_increment = 1
@ -20952,10 +20953,11 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Code>question_setting_name</a:Code>
<a:CreationDate>1664182126</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1669987509</a:ModificationDate>
<a:ModificationDate>1670167380</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>题目配置名称</a:Comment>
<a:DataType>bigint</a:DataType>
<a:DataType>varchar(100)</a:DataType>
<a:Length>100</a:Length>
</o:Column>
<o:Column Id="o1273">
<a:ObjectID>0D1D927F-7B3A-4209-9E41-5E51D6C7DF98</a:ObjectID>
@ -20986,10 +20988,10 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Code>question_setting_total_score</a:Code>
<a:CreationDate>1669987828</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1669988154</a:ModificationDate>
<a:ModificationDate>1670167453</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>配置的题目总分数</a:Comment>
<a:DataType>int</a:DataType>
<a:DataType>float</a:DataType>
</o:Column>
<o:Column Id="o1276">
<a:ObjectID>B6F6BAB4-0EF0-4BE6-B661-74638716B0F8</a:ObjectID>
@ -21003,6 +21005,18 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:DataType>bigint</a:DataType>
</o:Column>
<o:Column Id="o1277">
<a:ObjectID>425F40EA-F79E-409A-8C41-34C006D6D589</a:ObjectID>
<a:Name>question_log_ids</a:Name>
<a:Code>question_log_ids</a:Code>
<a:CreationDate>1670155136</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1670155185</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>关联的做题日志IDs</a:Comment>
<a:DataType>varchar(2000)</a:DataType>
<a:Length>2000</a:Length>
</o:Column>
<o:Column Id="o1278">
<a:ObjectID>2287A3B7-121E-41AE-87AC-FE935B55A80C</a:ObjectID>
<a:Name>question_log_summary_question_total_count</a:Name>
<a:Code>question_log_summary_question_total_count</a:Code>
@ -21013,7 +21027,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Comment>配置的题目总数</a:Comment>
<a:DataType>int</a:DataType>
</o:Column>
<o:Column Id="o1278">
<o:Column Id="o1279">
<a:ObjectID>9859472C-69C7-4E9A-9316-7BF0939E6BF2</a:ObjectID>
<a:Name>question_log_summary_student_do_count</a:Name>
<a:Code>question_log_summary_student_do_count</a:Code>
@ -21024,29 +21038,29 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Comment>学生做题总数</a:Comment>
<a:DataType>int</a:DataType>
</o:Column>
<o:Column Id="o1279">
<o:Column Id="o1280">
<a:ObjectID>B7EDC098-95AB-4219-9242-E644701913C4</a:ObjectID>
<a:Name>question_log_summary_success_count</a:Name>
<a:Code>question_log_summary_success_count</a:Code>
<a:CreationDate>1661869211</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1669988220</a:ModificationDate>
<a:ModificationDate>1670154702</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>正确数量(包含半对题)</a:Comment>
<a:Comment>正确数量</a:Comment>
<a:DataType>int</a:DataType>
</o:Column>
<o:Column Id="o1280">
<o:Column Id="o1281">
<a:ObjectID>109364AE-9C76-407B-934A-4307215E4982</a:ObjectID>
<a:Name>question_log_summary_error_count</a:Name>
<a:Code>question_log_summary_error_count</a:Code>
<a:CreationDate>1664181836</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1669988220</a:ModificationDate>
<a:ModificationDate>1670154702</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>错数量</a:Comment>
<a:Comment>错数量</a:Comment>
<a:DataType>int</a:DataType>
</o:Column>
<o:Column Id="o1281">
<o:Column Id="o1282">
<a:ObjectID>4EEC3C67-2C8A-45F5-8540-A6FFFEA2968C</a:ObjectID>
<a:Name>question_log_summary_success_rate</a:Name>
<a:Code>question_log_summary_success_rate</a:Code>
@ -21057,7 +21071,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Comment>正确率,最大100</a:Comment>
<a:DataType>float</a:DataType>
</o:Column>
<o:Column Id="o1282">
<o:Column Id="o1283">
<a:ObjectID>11D26CA6-CB55-43F0-9C8F-D1C07A6BC233</a:ObjectID>
<a:Name>question_log_summary_current_pass_rate</a:Name>
<a:Code>question_log_summary_current_pass_rate</a:Code>
@ -21068,7 +21082,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Comment>当前配置的及格比率</a:Comment>
<a:DataType>float</a:DataType>
</o:Column>
<o:Column Id="o1283">
<o:Column Id="o1284">
<a:ObjectID>B7B56144-0CE8-4EA3-8315-C097AE2A2B4D</a:ObjectID>
<a:Name>question_log_summary_is_pass</a:Name>
<a:Code>question_log_summary_is_pass</a:Code>
@ -21080,7 +21094,30 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:DataType>int(2)</a:DataType>
<a:Length>2</a:Length>
</o:Column>
<o:Column Id="o1284">
<o:Column Id="o1285">
<a:ObjectID>45DBB89C-2AC0-4F71-AB87-1350950F054B</a:ObjectID>
<a:Name>finish_second_time</a:Name>
<a:Code>finish_second_time</a:Code>
<a:CreationDate>1670172057</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1670172127</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>完成用时(秒)</a:Comment>
<a:DataType>int</a:DataType>
</o:Column>
<o:Column Id="o1286">
<a:ObjectID>32BB73E0-CEAF-45BD-BC36-F699A354C8D7</a:ObjectID>
<a:Name>finish_time</a:Name>
<a:Code>finish_time</a:Code>
<a:CreationDate>1670172057</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1670172127</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>完成用时,时间格式</a:Comment>
<a:DataType>varchar(50)</a:DataType>
<a:Length>50</a:Length>
</o:Column>
<o:Column Id="o1287">
<a:ObjectID>30F0DBA1-03FC-493E-B628-E3297D197E97</a:ObjectID>
<a:Name>question_log_summary_status</a:Name>
<a:Code>question_log_summary_status</a:Code>
@ -21092,7 +21129,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:DataType>int(2)</a:DataType>
<a:Length>2</a:Length>
</o:Column>
<o:Column Id="o1285">
<o:Column Id="o1288">
<a:ObjectID>5BDCBCAE-7982-49D0-91A7-2C51706D400F</a:ObjectID>
<a:Name>question_log_summary_add_time</a:Name>
<a:Code>question_log_summary_add_time</a:Code>
@ -21103,7 +21140,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Comment>添加时间</a:Comment>
<a:DataType>datetime</a:DataType>
</o:Column>
<o:Column Id="o1286">
<o:Column Id="o1289">
<a:ObjectID>37755E03-C150-47C6-98C6-1BB69E36CAC1</a:ObjectID>
<a:Name>org_id</a:Name>
<a:Code>org_id</a:Code>
@ -21114,7 +21151,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Comment>组织ID</a:Comment>
<a:DataType>bigint</a:DataType>
</o:Column>
<o:Column Id="o1287">
<o:Column Id="o1290">
<a:ObjectID>9A38CEE4-E7F0-4393-8A46-7F0B8D2B44BD</a:ObjectID>
<a:Name>user_id</a:Name>
<a:Code>user_id</a:Code>
@ -21127,7 +21164,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
</o:Column>
</c:Columns>
<c:Keys>
<o:Key Id="o1288">
<o:Key Id="o1291">
<a:ObjectID>203F6632-947A-4CFA-815D-E029ACCFD264</a:ObjectID>
<a:Name>Key_1</a:Name>
<a:Code>Key_1</a:Code>
@ -21141,12 +21178,12 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
</o:Key>
</c:Keys>
<c:PrimaryKey>
<o:Key Ref="o1288"/>
<o:Key Ref="o1291"/>
</c:PrimaryKey>
</o:Table>
</c:Tables>
<c:DefaultGroups>
<o:Group Id="o1289">
<o:Group Id="o1292">
<a:ObjectID>BFEA4109-96F9-4074-AF58-B84D6574A7FC</a:ObjectID>
<a:Name>PUBLIC</a:Name>
<a:Code>PUBLIC</a:Code>
@ -21157,7 +21194,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
</o:Group>
</c:DefaultGroups>
<c:ChildTraceabilityLinks>
<o:ExtendedDependency Id="o1290">
<o:ExtendedDependency Id="o1293">
<a:ObjectID>ABEFC813-1056-4507-A9A7-809C149B4ABE</a:ObjectID>
<a:CreationDate>1661954753</a:CreationDate>
<a:Creator>lx</a:Creator>
@ -21445,7 +21482,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
</o:ExtendedDependency>
</c:ChildTraceabilityLinks>
<c:TargetModels>
<o:TargetModel Id="o1291">
<o:TargetModel Id="o1294">
<a:ObjectID>5963E417-B2CE-431D-988A-B3493AAE5EE4</a:ObjectID>
<a:Name>MySQL 5.0</a:Name>
<a:Code>MYSQL50</a:Code>

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<?PowerDesigner AppLocale="UTF16" ID="{BA33ABB7-B246-4DB0-85DE-396EDDB46458}" Label="" LastModificationDate="1669988481" Name="cjks" Objects="1357" Symbols="103" Target="MySQL 5.0" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="16.5.0.3982"?>
<?PowerDesigner AppLocale="UTF16" ID="{BA33ABB7-B246-4DB0-85DE-396EDDB46458}" Label="" LastModificationDate="1670172137" Name="cjks" Objects="1348" Symbols="103" Target="MySQL 5.0" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="16.5.0.3982"?>
<!-- do not edit this file -->
<Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object">
@ -6748,10 +6748,11 @@ LABL 0 新宋体,8,N</a:FontList>
</o:TableSymbol>
<o:TableSymbol Id="o215">
<a:CreationDate>1669986324</a:CreationDate>
<a:ModificationDate>1669988273</a:ModificationDate>
<a:ModificationDate>1670172137</a:ModificationDate>
<a:IconMode>-1</a:IconMode>
<a:Rect>((255920,65489), (280286,83103))</a:Rect>
<a:Rect>((255995,64770), (280361,84826))</a:Rect>
<a:AutoAdjustToText>0</a:AutoAdjustToText>
<a:ShadowStyle>1</a:ShadowStyle>
<a:LineColor>12615680</a:LineColor>
<a:FillColor>16570034</a:FillColor>
<a:ShadowColor>12632256</a:ShadowColor>
@ -20914,7 +20915,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Code>question_log_summary</a:Code>
<a:CreationDate>1661850632</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1669988475</a:ModificationDate>
<a:ModificationDate>1670172100</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>学生-题目日志-分析汇总</a:Comment>
<a:PhysicalOptions>auto_increment = 1
@ -20952,10 +20953,11 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Code>question_setting_name</a:Code>
<a:CreationDate>1664182126</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1669987509</a:ModificationDate>
<a:ModificationDate>1670167380</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>题目配置名称</a:Comment>
<a:DataType>bigint</a:DataType>
<a:DataType>varchar(100)</a:DataType>
<a:Length>100</a:Length>
</o:Column>
<o:Column Id="o1273">
<a:ObjectID>0D1D927F-7B3A-4209-9E41-5E51D6C7DF98</a:ObjectID>
@ -20986,10 +20988,10 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Code>question_setting_total_score</a:Code>
<a:CreationDate>1669987828</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1669988154</a:ModificationDate>
<a:ModificationDate>1670167453</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>配置的题目总分数</a:Comment>
<a:DataType>int</a:DataType>
<a:DataType>float</a:DataType>
</o:Column>
<o:Column Id="o1276">
<a:ObjectID>B6F6BAB4-0EF0-4BE6-B661-74638716B0F8</a:ObjectID>
@ -21003,6 +21005,18 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:DataType>bigint</a:DataType>
</o:Column>
<o:Column Id="o1277">
<a:ObjectID>425F40EA-F79E-409A-8C41-34C006D6D589</a:ObjectID>
<a:Name>question_log_ids</a:Name>
<a:Code>question_log_ids</a:Code>
<a:CreationDate>1670155136</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1670155185</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>关联的做题日志IDs</a:Comment>
<a:DataType>varchar(2000)</a:DataType>
<a:Length>2000</a:Length>
</o:Column>
<o:Column Id="o1278">
<a:ObjectID>2287A3B7-121E-41AE-87AC-FE935B55A80C</a:ObjectID>
<a:Name>question_log_summary_question_total_count</a:Name>
<a:Code>question_log_summary_question_total_count</a:Code>
@ -21013,7 +21027,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Comment>配置的题目总数</a:Comment>
<a:DataType>int</a:DataType>
</o:Column>
<o:Column Id="o1278">
<o:Column Id="o1279">
<a:ObjectID>9859472C-69C7-4E9A-9316-7BF0939E6BF2</a:ObjectID>
<a:Name>question_log_summary_student_do_count</a:Name>
<a:Code>question_log_summary_student_do_count</a:Code>
@ -21024,26 +21038,15 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Comment>学生做题总数</a:Comment>
<a:DataType>int</a:DataType>
</o:Column>
<o:Column Id="o1279">
<o:Column Id="o1280">
<a:ObjectID>B7EDC098-95AB-4219-9242-E644701913C4</a:ObjectID>
<a:Name>question_log_summary_success_count</a:Name>
<a:Code>question_log_summary_success_count</a:Code>
<a:CreationDate>1661869211</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1669988481</a:ModificationDate>
<a:ModificationDate>1670154702</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>全对数量</a:Comment>
<a:DataType>int</a:DataType>
</o:Column>
<o:Column Id="o1280">
<a:ObjectID>B93527C6-CCD1-4AD8-9996-6EBFD099A730</a:ObjectID>
<a:Name>question_log_summary_half_success_count</a:Name>
<a:Code>question_log_summary_half_success_count</a:Code>
<a:CreationDate>1661869211</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1669988481</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>半对数量</a:Comment>
<a:Comment>正确数量</a:Comment>
<a:DataType>int</a:DataType>
</o:Column>
<o:Column Id="o1281">
@ -21052,9 +21055,9 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Code>question_log_summary_error_count</a:Code>
<a:CreationDate>1664181836</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1669988220</a:ModificationDate>
<a:ModificationDate>1670154702</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>错数量</a:Comment>
<a:Comment>错数量</a:Comment>
<a:DataType>int</a:DataType>
</o:Column>
<o:Column Id="o1282">
@ -21092,6 +21095,29 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Length>2</a:Length>
</o:Column>
<o:Column Id="o1285">
<a:ObjectID>45DBB89C-2AC0-4F71-AB87-1350950F054B</a:ObjectID>
<a:Name>finish_second_time</a:Name>
<a:Code>finish_second_time</a:Code>
<a:CreationDate>1670172057</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1670172127</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>完成用时(秒)</a:Comment>
<a:DataType>int</a:DataType>
</o:Column>
<o:Column Id="o1286">
<a:ObjectID>32BB73E0-CEAF-45BD-BC36-F699A354C8D7</a:ObjectID>
<a:Name>finish_time</a:Name>
<a:Code>finish_time</a:Code>
<a:CreationDate>1670172057</a:CreationDate>
<a:Creator>lx</a:Creator>
<a:ModificationDate>1670172127</a:ModificationDate>
<a:Modifier>lx</a:Modifier>
<a:Comment>完成用时,时间格式</a:Comment>
<a:DataType>varchar(50)</a:DataType>
<a:Length>50</a:Length>
</o:Column>
<o:Column Id="o1287">
<a:ObjectID>30F0DBA1-03FC-493E-B628-E3297D197E97</a:ObjectID>
<a:Name>question_log_summary_status</a:Name>
<a:Code>question_log_summary_status</a:Code>
@ -21103,7 +21129,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:DataType>int(2)</a:DataType>
<a:Length>2</a:Length>
</o:Column>
<o:Column Id="o1286">
<o:Column Id="o1288">
<a:ObjectID>5BDCBCAE-7982-49D0-91A7-2C51706D400F</a:ObjectID>
<a:Name>question_log_summary_add_time</a:Name>
<a:Code>question_log_summary_add_time</a:Code>
@ -21114,7 +21140,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Comment>添加时间</a:Comment>
<a:DataType>datetime</a:DataType>
</o:Column>
<o:Column Id="o1287">
<o:Column Id="o1289">
<a:ObjectID>37755E03-C150-47C6-98C6-1BB69E36CAC1</a:ObjectID>
<a:Name>org_id</a:Name>
<a:Code>org_id</a:Code>
@ -21125,7 +21151,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
<a:Comment>组织ID</a:Comment>
<a:DataType>bigint</a:DataType>
</o:Column>
<o:Column Id="o1288">
<o:Column Id="o1290">
<a:ObjectID>9A38CEE4-E7F0-4393-8A46-7F0B8D2B44BD</a:ObjectID>
<a:Name>user_id</a:Name>
<a:Code>user_id</a:Code>
@ -21138,7 +21164,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
</o:Column>
</c:Columns>
<c:Keys>
<o:Key Id="o1289">
<o:Key Id="o1291">
<a:ObjectID>203F6632-947A-4CFA-815D-E029ACCFD264</a:ObjectID>
<a:Name>Key_1</a:Name>
<a:Code>Key_1</a:Code>
@ -21152,12 +21178,12 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
</o:Key>
</c:Keys>
<c:PrimaryKey>
<o:Key Ref="o1289"/>
<o:Key Ref="o1291"/>
</c:PrimaryKey>
</o:Table>
</c:Tables>
<c:DefaultGroups>
<o:Group Id="o1290">
<o:Group Id="o1292">
<a:ObjectID>BFEA4109-96F9-4074-AF58-B84D6574A7FC</a:ObjectID>
<a:Name>PUBLIC</a:Name>
<a:Code>PUBLIC</a:Code>
@ -21168,7 +21194,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
</o:Group>
</c:DefaultGroups>
<c:ChildTraceabilityLinks>
<o:ExtendedDependency Id="o1291">
<o:ExtendedDependency Id="o1293">
<a:ObjectID>ABEFC813-1056-4507-A9A7-809C149B4ABE</a:ObjectID>
<a:CreationDate>1661954753</a:CreationDate>
<a:Creator>lx</a:Creator>
@ -21456,7 +21482,7 @@ COLLATE = utf8_general_ci</a:PhysicalOptions>
</o:ExtendedDependency>
</c:ChildTraceabilityLinks>
<c:TargetModels>
<o:TargetModel Id="o1292">
<o:TargetModel Id="o1294">
<a:ObjectID>5963E417-B2CE-431D-988A-B3493AAE5EE4</a:ObjectID>
<a:Name>MySQL 5.0</a:Name>
<a:Code>MYSQL50</a:Code>

@ -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',

@ -30,4 +30,12 @@ public interface QuestionLogSummaryDao extends BaseMapper<QuestionLogSummary>{
List<QuestionLogSummary> getValuesByQuery(QuestionLogSummaryQuery questionLogSummaryQuery);
List<QuestionLogSummary> getValuesByQueryNotWithPermission(QuestionLogSummaryQuery questionLogSummaryQuery);
List<Map<String,Object>>getExcelValues(QuestionLogSummaryQuery questionLogSummaryQuery);
/**
* ID
* @param questionSettingIds
* @return
*/
@Update
int logicDeleteByQuestionSettingIds(String questionSettingIds);
}

@ -149,4 +149,48 @@ public class GeneralQuestionLog extends BaseEntity{
this.setGeneralQuestionLogFinishTime(null);
}
/**
* : <br>
*
*
* @param successCount
* @Author: lx
* @Date: 2022/12/4 20:39
*/
public void setSuccessCount(Integer successCount) {
this.set("successCount", successCount);
}
/**
* : <br>
*
* @return {@link int}
* @Author: lx
* @Date: 2022/12/4 20:39
*/
public Integer getSuccessCount() {
return Integer.valueOf(this.get("successCount").toString());
}
/**
* : <br>
*
*
* @param errorCount
* @Author: lx
* @Date: 2022/12/4 20:39
*/
public void setErrorCount(Integer errorCount) {
this.set("errorCount", errorCount);
}
/**
* : <br>
*
* @return {@link int}
* @Author: lx
* @Date: 2022/12/4 20:39
*/
public Integer getErrorCount() {
return Integer.valueOf(this.get("errorCount").toString());
}
}

@ -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集合逗号隔开

@ -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分析)

@ -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 ;
//类型 枚举ResourcesQuestionSnapshotFromTypeEnum
/**
* {@link 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 ;
@ -95,6 +89,14 @@ 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;
}
/**IDID
*@return
*/
public Long getPersonId(){
return personId;
}
/**IDID
*@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;
}
}

@ -161,4 +161,49 @@ public class TeacherOpenCourseQuestionLog extends BaseEntity {
this.setTeacherOpenCourseQuestionLogUpdateTime(null);
this.setTeacherOpenCourseQuestionLogFinishTime(null);
}
/**
* : <br>
*
*
* @param successCount
* @Author: lx
* @Date: 2022/12/4 20:39
*/
public void setSuccessCount(Integer successCount) {
this.set("successCount", successCount);
}
/**
* : <br>
*
* @return {@link int}
* @Author: lx
* @Date: 2022/12/4 20:39
*/
public Integer getSuccessCount() {
return Integer.valueOf(this.get("successCount").toString());
}
/**
* : <br>
*
*
* @param errorCount
* @Author: lx
* @Date: 2022/12/4 20:39
*/
public void setErrorCount(Integer errorCount) {
this.set("errorCount", errorCount);
}
/**
* : <br>
*
* @return {@link int}
* @Author: lx
* @Date: 2022/12/4 20:39
*/
public Integer getErrorCount() {
return Integer.valueOf(this.get("errorCount").toString());
}
}

@ -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;
}

@ -11,7 +11,7 @@ import org.beetl.sql.annotation.entity.EnumMapping;
@Getter
@AllArgsConstructor
@EnumMapping("name")
public enum QuestionBussinessTypeEnum {
public enum QuestionBusinessTypeEnum {
FROM_SYSTEM("系统方"),
// 开课(暂时没用到)

@ -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;
/**
* <br>
@ -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<QuestionLogAddTypeEnum> 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), "改接口不支持练习提交!");
}
}

@ -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);
/**
* : <br>
*
* @param typeEnum
* @return {@link boolean}
* @Author: lx
* @Date: 2022/12/4 22:29
*/
public static boolean isOneQuestion(ResourcesQuestionTypeEnum typeEnum) {
return one.contains(typeEnum);
}
/**
* : <br>
*
*
* @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));
}
}

@ -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<GeneralQuestionLo
@Autowired private GeneralQuestionLogDao generalQuestionLogDao;
@Autowired private StudentDao studentDao;
@Autowired private QuestionLogSummaryService questionLogSummaryService;
@Autowired @Lazy
private GeneralQuestionSettingService generalQuestionSettingService;
@ -497,16 +503,13 @@ public class GeneralQuestionLogService extends CoreBaseService<GeneralQuestionLo
final Student student = getStudent();
Assert.notNull(student, "非学生身份,无法提交!");
// 练习提交验证
validateTestAddTypeThrow(questionLogAddDTO.getQuestionLogAddType());
GeneralQuestionSetting info = generalQuestionSettingService.getInfo(questionSettingId);
Assert.notNull(info, "题目配置ID有误");
GeneralQuestionSetting questionSettingInfo = generalQuestionSettingService.getInfo(questionSettingId);
Assert.notNull(questionSettingInfo, "未匹配到试卷信息!");
// 校验当前时间是否在考试的时间段
generalQuestionSettingService.verifyQuestionStartAndEndTimeWithNowTimeThrow(questionSettingId);
switch(info.getGeneralQuestionSettingType()) {
switch(questionSettingInfo.getGeneralQuestionSettingType()) {
case HOMEWORK_FILE: {
addFileRelatedLog(join(questionLogMap.values().toArray(), ","), questionSettingId, student);
} break;
@ -514,10 +517,8 @@ public class GeneralQuestionLogService extends CoreBaseService<GeneralQuestionLo
// 这些都和题目相关,暂时先放在一个方法
case CHAPTER_EXERCISE:
case EXAM:
case HOMEWORK_QUESTION:{
addQuestionRelatedLog(questionLogAddDTO, student, item -> {
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<GeneralQuestionLo
final Student student = getStudent();
Assert.notNull(student, "非学生身份,无法提交!");
GeneralQuestionSetting info = generalQuestionSettingService.getInfo(questionSettingId);
Assert.notNull(info, "题目配置ID有误");
GeneralQuestionSetting questionSetting = generalQuestionSettingService.getInfo(questionSettingId);
Assert.notNull(questionSetting, "未匹配到试卷信息");
// 校验当前时间是否在考试的时间段
generalQuestionSettingService.verifyQuestionStartAndEndTimeWithNowTimeThrow(questionSettingId);
switch(info.getGeneralQuestionSettingType()) {
switch(questionSetting.getGeneralQuestionSettingType()) {
// 这些都和题目相关,暂时先放在一个方法
case CHAPTER_EXERCISE: {
// 练习可以提交到几个类型
final List<QuestionLogAddTypeEnum> 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<GeneralQuestionLo
*
*
* @param questionLogAddDTO
* @param student
* @param questionSetting
* @param student
*/
private void addQuestionRelatedLog(@NotNull(message = "提交题目信息不能为空") QuestionLogAddDTO questionLogAddDTO, Student student, Predicate<GeneralQuestionLog> 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<GeneralQuestionLo
.build();
List<GeneralQuestionLog> logList = generalQuestionLogDao.getValuesByQuery(questionLogQuery);
logList = logList.stream().filter(predicate).collect(Collectors.toList());
Assert.notEmpty(logList, "未查询到题目信息!");
// 当前时间, 存储要更新的题目日志集合
@ -640,9 +635,165 @@ public class GeneralQuestionLogService extends CoreBaseService<GeneralQuestionLo
// 只添加可以更新的数据
updateList.add(questionLog);
});
// 计算学生分数,并标记错题
calculateScoreOnSubmit(updateList);
// 学生做的题目的答案与日志关联
updateBatchTemplate(updateList);
// 最后提交试卷答案时候,才会记录错题
if (addType.equals(FINALLY_SUBMIT)) {
// 添加到题目日志汇总中
addQuestionLogSummary(updateList, logList.size(), student,
questionSetting.getGeneralQuestionSettingName(), questionSetting.getBusinessType(), questionSetting.getGeneralQuestionSettingType());
}
}
/**
* : <br>
*
*
*
* @param logList
* @Author: lx
* @Date: 2022/12/4 20:16
*/
public void calculateScoreOnSubmit(@NotEmpty(message = "学生题目日志不能为空!") List<GeneralQuestionLog> 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);
}
});
}
/**
* : <br>
*
*
* @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<GeneralQuestionLog> 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);
}
/**

@ -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<GeneralQuesti
//TODO 保存
GeneralQuestionSetting generalQuestionSetting = new GeneralQuestionSetting();
generalQuestionSetting.setBusinessId(Long.parseLong(bussinessId));
generalQuestionSetting.setBusinessType(EnumUtil.likeValueOf(QuestionBussinessTypeEnum.class, bussinessType));
generalQuestionSetting.setBusinessType(EnumUtil.likeValueOf(QuestionBusinessTypeEnum.class, bussinessType));
generalQuestionSetting.setGeneralQuestionSettingSchoolClassIds(generalQuestionSettingSchoolClassIds);
generalQuestionSetting.setGeneralQuestionSettingDoCount(Integer.parseInt(generalQuestionSettingDoCount));
generalQuestionSetting.setGeneralQuestionSettingQuestionNoOrder(Integer.parseInt(generalQuestionSettingQuestionNoOrder));
@ -599,7 +598,7 @@ public class GeneralQuestionSettingService extends CoreBaseService<GeneralQuesti
list.forEach(item -> {
item.setGeneralQuestionSettingId(teacherOpenCourseQuestionSettingId);
item.setBusinessCourseInfoId(settingQuery.getBusinessId());
item.setBusinessCourseInfoType(SYSTEM_QUESTION);
item.setBusinessCourseInfoType(QuestionBusinessTypeEnum.FROM_SYSTEM);
});
// 更新ID

@ -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<Gen
GeneralResourcesQuestionSnapshot generalResourcesQuestionSnapshot = new GeneralResourcesQuestionSnapshot();
generalResourcesQuestionSnapshot.setGeneralQuestionSettingId(Long.parseLong(generalQuestionSettingId));
generalResourcesQuestionSnapshot.setBusinessCourseInfoId(Long.parseLong(businessCourseInfoId));
generalResourcesQuestionSnapshot.setBusinessCourseInfoType(EnumUtil.likeValueOf(BusinessCourseInfoEnum.class, businessCourseInfoType));
generalResourcesQuestionSnapshot.setBusinessCourseInfoType(EnumUtil.likeValueOf(QuestionBusinessTypeEnum.class, businessCourseInfoType));
generalResourcesQuestionSnapshot.setQuestionType(Integer.parseInt(questionType));
generalResourcesQuestionSnapshot.setQuestionScore(new BigDecimal(questionScore));
generalResourcesQuestionSnapshot.setQuestionStem(questionStem);

@ -1,5 +1,7 @@
package com.ibeetl.jlw.service;
import cn.hutool.core.util.NumberUtil;
import cn.jlw.util.EnumUtil;
import cn.jlw.util.ToolUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
@ -11,7 +13,7 @@ import com.ibeetl.admin.core.web.JsonReturnCode;
import com.ibeetl.jlw.dao.QuestionLogSummaryDao;
import com.ibeetl.jlw.entity.FileEntity;
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 com.ibeetl.jlw.web.query.QuestionLogSummaryQuery;
import org.apache.commons.lang3.StringUtils;
@ -76,6 +78,14 @@ public class QuestionLogSummaryService extends CoreBaseService<QuestionLogSummar
}
}
public void logicDeleteByQuestionSettingIds(String questionSettingIds){
try {
questionLogSummaryDao.logicDeleteByQuestionSettingIds(questionSettingIds);
} catch (Exception e) {
throw new PlatformException("批量删除通用题目日志汇总失败", e);
}
}
public String addAll(QuestionLogSummaryQuery questionLogSummaryQuery){
String msg = "";
List<QuestionLogSummary> questionLogSummaryList = new ArrayList<>();
@ -213,11 +223,11 @@ public class QuestionLogSummaryService extends CoreBaseService<QuestionLogSummar
"来源类型 枚举",
"配置的题目总分数",
"人员",
"关联的做题日志IDs",
"配置的题目总数",
"学生做题总数",
"全对数量",
"半对数量",
"错题数量",
"正确数量",
"错误数量",
"正确率,最大100",
"当前配置的及格比率",
"是否及格",
@ -264,10 +274,10 @@ public class QuestionLogSummaryService extends CoreBaseService<QuestionLogSummar
String questionLogSummaryFromType = getCellFormatValue(row.getCell(map.get(columns[3])));
String questionSettingTotalScore = getCellFormatValue(row.getCell(map.get(columns[4])));
String personId = getCellFormatValue(row.getCell(map.get(columns[5])));
String questionLogSummaryQuestionTotalCount = getCellFormatValue(row.getCell(map.get(columns[6])));
String questionLogSummaryStudentDoCount = getCellFormatValue(row.getCell(map.get(columns[7])));
String questionLogSummarySuccessCount = getCellFormatValue(row.getCell(map.get(columns[8])));
String questionLogSummaryHalfSuccessCount = getCellFormatValue(row.getCell(map.get(columns[9])));
String questionLogIds = getCellFormatValue(row.getCell(map.get(columns[6])));
String questionLogSummaryQuestionTotalCount = getCellFormatValue(row.getCell(map.get(columns[7])));
String questionLogSummaryStudentDoCount = getCellFormatValue(row.getCell(map.get(columns[8])));
String questionLogSummarySuccessCount = getCellFormatValue(row.getCell(map.get(columns[9])));
String questionLogSummaryErrorCount = getCellFormatValue(row.getCell(map.get(columns[10])));
String questionLogSummarySuccessRate = getCellFormatValue(row.getCell(map.get(columns[11])));
String questionLogSummaryCurrentPassRate = getCellFormatValue(row.getCell(map.get(columns[12])));
@ -298,24 +308,24 @@ public class QuestionLogSummaryService extends CoreBaseService<QuestionLogSummar
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[5])+1)+"列,第"+(i+1)+"行人员为空"});
continue;
}else
if(StringUtils.isBlank(questionLogIds)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[6])+1)+"列,第"+(i+1)+"行关联的做题日志IDs为空"});
continue;
}else
if(StringUtils.isBlank(questionLogSummaryQuestionTotalCount)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[6])+1)+"列,第"+(i+1)+"行配置的题目总数为空"});
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[7])+1)+"列,第"+(i+1)+"行配置的题目总数为空"});
continue;
}else
if(StringUtils.isBlank(questionLogSummaryStudentDoCount)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[7])+1)+"列,第"+(i+1)+"行学生做题总数为空"});
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[8])+1)+"列,第"+(i+1)+"行学生做题总数为空"});
continue;
}else
if(StringUtils.isBlank(questionLogSummarySuccessCount)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[8])+1)+"列,第"+(i+1)+"行全对数量为空"});
continue;
}else
if(StringUtils.isBlank(questionLogSummaryHalfSuccessCount)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[9])+1)+"列,第"+(i+1)+"行半对数量为空"});
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[9])+1)+"列,第"+(i+1)+"行正确数量为空"});
continue;
}else
if(StringUtils.isBlank(questionLogSummaryErrorCount)){
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[10])+1)+"列,第"+(i+1)+"行错数量为空"});
errMsg.add(new String[]{"第"+ToolUtils.numberToLetter(map.get(columns[10])+1)+"列,第"+(i+1)+"行错误数量为空"});
continue;
}else
if(StringUtils.isBlank(questionLogSummarySuccessRate)){
@ -338,15 +348,15 @@ public class QuestionLogSummaryService extends CoreBaseService<QuestionLogSummar
//TODO 保存
QuestionLogSummary questionLogSummary = new QuestionLogSummary();
questionLogSummary.setQuestionSettingId(Long.parseLong(questionSettingId));
questionLogSummary.setQuestionSettingName(Long.parseLong(questionSettingName));
questionLogSummary.setQuestionSettingType(ResourcesQuestionSnapshotFromTypeEnum.valueOf(questionSettingType));
questionLogSummary.setQuestionLogSummaryFromType(BusinessCourseInfoEnum.valueOf(questionLogSummaryFromType));
questionLogSummary.setQuestionSettingTotalScore(Integer.parseInt(questionSettingTotalScore));
questionLogSummary.setQuestionSettingName(questionSettingName);
questionLogSummary.setQuestionSettingType(EnumUtil.likeValueOf(ResourcesQuestionSnapshotFromTypeEnum.class, questionSettingType));
questionLogSummary.setQuestionLogSummaryFromType(EnumUtil.likeValueOf(QuestionBusinessTypeEnum.class, questionLogSummaryFromType));
questionLogSummary.setQuestionSettingTotalScore(NumberUtil.toBigDecimal(questionSettingTotalScore));
questionLogSummary.setPersonId(Long.parseLong(personId));
questionLogSummary.setQuestionLogIds(questionLogIds);
questionLogSummary.setQuestionLogSummaryQuestionTotalCount(Integer.parseInt(questionLogSummaryQuestionTotalCount));
questionLogSummary.setQuestionLogSummaryStudentDoCount(Integer.parseInt(questionLogSummaryStudentDoCount));
questionLogSummary.setQuestionLogSummarySuccessCount(Integer.parseInt(questionLogSummarySuccessCount));
questionLogSummary.setQuestionLogSummaryHalfSuccessCount(Integer.parseInt(questionLogSummaryHalfSuccessCount));
questionLogSummary.setQuestionLogSummaryErrorCount(Integer.parseInt(questionLogSummaryErrorCount));
questionLogSummary.setQuestionLogSummarySuccessRate(new BigDecimal(questionLogSummarySuccessRate));
questionLogSummary.setQuestionLogSummaryCurrentPassRate(new BigDecimal(questionLogSummaryCurrentPassRate));
@ -373,6 +383,4 @@ public class QuestionLogSummaryService extends CoreBaseService<QuestionLogSummar
public List<Map<String,Object>> getExcelValues (QuestionLogSummaryQuery questionLogSummaryQuery){
return questionLogSummaryDao.getExcelValues(questionLogSummaryQuery);
}
}

@ -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 CoreBaseService<Teacher
@Autowired @Lazy
private TeacherOpenCourseQuestionSettingService teacherOpenCourseQuestionSettingService;
@Autowired private TeacherOpenCourseQuestionLogWrongService teacherOpenCourseQuestionLogWrongService;
@Autowired private QuestionLogSummaryService questionLogSummaryService;
public PageQuery<TeacherOpenCourseQuestionLog>queryByCondition(PageQuery query){
PageQuery ret = teacherOpenCourseQuestionLogDao.queryByCondition(query);
queryListAfter(ret.getList());
@ -297,20 +303,17 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService<Teacher
final Long questionSettingId = questionLogAddDTO.getQuestionSettingId();
Map<String, String> 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<Teacher
case CHAPTER_EXERCISE:
case EXAM:
case HOMEWORK_QUESTION:{
addQuestionRelatedLog(questionLogAddDTO, student, item -> {
return item.getQuestionLogAddType() == null || PRE_SUBMIT.equals(item.getQuestionLogAddType());
});
addQuestionRelatedLog(questionLogAddDTO, questionSetting, student);
} break;
}
}
@ -341,21 +342,16 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService<Teacher
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 CHAPTER_EXERCISE: {
// 练习可以提交到几个类型
final List<QuestionLogAddTypeEnum> 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<Teacher
* @param questionLogAddDTO
* @param student
*/
private void addQuestionRelatedLog(@NotNull(message = "提交题目信息不能为空") QuestionLogAddDTO questionLogAddDTO, final Student student, Predicate<TeacherOpenCourseQuestionLog> 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<String, String> questionLogMap = questionLogAddDTO.getQuestionLogMap();
// 查询符合条件的日志表
String questionSnapshotIds = join(questionLogMap.keySet().toArray(), ",");
@ -410,9 +407,6 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService<Teacher
.build();
List<TeacherOpenCourseQuestionLog> logList = teacherOpenCourseQuestionLogDao.getValuesByQuery(questionLogQuery);
// 排除条件交给外部调用
logList = logList.stream().filter(predicate).collect(Collectors.toList());
Assert.notEmpty(logList, "未查询到题目信息!");
// 当前时间, 存储要更新的题目日志集合
@ -427,16 +421,11 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService<Teacher
validateQuestionLogAddTypeThrow(questionLog.getQuestionLogAddType(), questionLogAddDTO.getQuestionLogAddType());
// 学生提交的答案
String answersText = join(questionLogMap.get(questionLog.getResourcesQuestionSnapshotId().toString()).split(","), ",");
// 是否是正确答案
Boolean isCorrectAnswer = questionLog.getQuestionAnswer().equalsIgnoreCase(answersText);
// 完成时间,从生成试卷时候,开始计算
long finishSecondTime = DateUtil.between(questionLog.getTeacherOpenCourseQuestionLogAddTime(), now, SECOND);
// 填充属性
questionLog.setTeacherOpenCourseQuestionLogAnswer(answersText);
// 计算该题目学生的得分情况
questionLog.setStudentScore(isCorrectAnswer ? questionLog.getQuestionScore() : BigDecimal.valueOf(0));
questionLog.setIsErrorFavorite(isCorrectAnswer);
questionLog.setTeacherOpenCourseQuestionLogUpdateTime(now);
questionLog.setTeacherOpenCourseQuestionLogFinishTime(finishSecondTime);
questionLog.setQuestionLogAddType(addType);
@ -446,17 +435,168 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService<Teacher
// 只添加可以更新的数据
updateList.add(questionLog);
});
// 计算学生分数,并标记错题
calculateScoreOnSubmit(updateList);
// 学生做的题目的答案与日志关联
updateBatchTemplate(updateList);
// 最后提交试卷答案时候,才会记录错题
if (addType.equals(FINALLY_SUBMIT)) {
// 添加到题目日志汇总中
addQuestionLogSummary(updateList, logList.size(), student,
questionSetting.getTeacherOpenCourseQuestionSettingName(), questionSetting.getTeacherOpenCourseQuestionSettingType());
// 批量插入错题集错题库方法内部自带分数判断。内部方法更新log中的错题标记。
teacherOpenCourseQuestionLogWrongService.insertBatchByQuestionLogList(logList);
teacherOpenCourseQuestionLogWrongService.insertBatchByQuestionLogList(updateList);
}
}
/**
* : <br>
*
*
*
* @param logList
* @Author: lx
* @Date: 2022/12/4 20:16
*/
public void calculateScoreOnSubmit(@NotEmpty(message = "学生题目日志不能为空!") List<TeacherOpenCourseQuestionLog> 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);
}
});
}
/**
* : <br>
*
*
* @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<TeacherOpenCourseQuestionLog> 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);
}
/**
*

@ -417,8 +417,6 @@ public class TeacherOpenCourseQuestionLogWrongService extends CoreBaseService<Te
// 错题集
List<TeacherOpenCourseQuestionLog> questionWrongList = questionLogList.stream()
// 这三种类型,进行机器判断,剩余的走人工处理
.filter(questionLog -> Arrays.asList(1, 2, 3).contains(questionLog.getQuestionType()))
.filter(questionLog -> {
// 学生写答案了,并且也给打分了,但是呢分数是0的情况。这个时候就是错题了
return (null != questionLog.getStudentScore()

@ -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",

@ -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)

@ -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)

@ -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;
}
}

@ -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,

@ -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#
@}

@ -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'],

@ -52,15 +52,15 @@
<div class="layui-row">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">配置的题目总数</label>
<label class="layui-form-label">关联的做题日志IDs</label>
<div class="layui-input-inline">
<input type="text" id="questionLogSummaryQuestionTotalCount" name="questionLogSummaryQuestionTotalCount" value="${questionLogSummary.questionLogSummaryQuestionTotalCount}" class="layui-input" >
<input type="text" id="questionLogIds" name="questionLogIds" value="${questionLogSummary.questionLogIds}" class="layui-input" >
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">学生做题总数</label>
<label class="layui-form-label">配置的题目总数</label>
<div class="layui-input-inline">
<input type="text" id="questionLogSummaryStudentDoCount" name="questionLogSummaryStudentDoCount" value="${questionLogSummary.questionLogSummaryStudentDoCount}" class="layui-input" >
<input type="text" id="questionLogSummaryQuestionTotalCount" name="questionLogSummaryQuestionTotalCount" value="${questionLogSummary.questionLogSummaryQuestionTotalCount}" class="layui-input" >
</div>
</div>
</div>
@ -68,15 +68,15 @@
<div class="layui-row">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">全对数量</label>
<label class="layui-form-label">学生做题总数</label>
<div class="layui-input-inline">
<input type="text" id="questionLogSummarySuccessCount" name="questionLogSummarySuccessCount" value="${questionLogSummary.questionLogSummarySuccessCount}" class="layui-input" >
<input type="text" id="questionLogSummaryStudentDoCount" name="questionLogSummaryStudentDoCount" value="${questionLogSummary.questionLogSummaryStudentDoCount}" class="layui-input" >
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">半对数量</label>
<label class="layui-form-label">正确数量</label>
<div class="layui-input-inline">
<input type="text" id="questionLogSummaryHalfSuccessCount" name="questionLogSummaryHalfSuccessCount" value="${questionLogSummary.questionLogSummaryHalfSuccessCount}" class="layui-input" >
<input type="text" id="questionLogSummarySuccessCount" name="questionLogSummarySuccessCount" value="${questionLogSummary.questionLogSummarySuccessCount}" class="layui-input" >
</div>
</div>
</div>
@ -84,7 +84,7 @@
<div class="layui-row">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">数量</label>
<label class="layui-form-label">数量</label>
<div class="layui-input-inline">
<input type="text" id="questionLogSummaryErrorCount" name="questionLogSummaryErrorCount" value="${questionLogSummary.questionLogSummaryErrorCount}" class="layui-input" >
</div>

@ -52,15 +52,15 @@
<div class="layui-row">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">配置的题目总数</label>
<label class="layui-form-label">关联的做题日志IDs</label>
<div class="layui-input-inline">
<input type="text" id="questionLogSummaryQuestionTotalCount" name="questionLogSummaryQuestionTotalCount" value="${questionLogSummary.questionLogSummaryQuestionTotalCount}" class="layui-input" >
<input type="text" id="questionLogIds" name="questionLogIds" value="${questionLogSummary.questionLogIds}" class="layui-input" >
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">学生做题总数</label>
<label class="layui-form-label">配置的题目总数</label>
<div class="layui-input-inline">
<input type="text" id="questionLogSummaryStudentDoCount" name="questionLogSummaryStudentDoCount" value="${questionLogSummary.questionLogSummaryStudentDoCount}" class="layui-input" >
<input type="text" id="questionLogSummaryQuestionTotalCount" name="questionLogSummaryQuestionTotalCount" value="${questionLogSummary.questionLogSummaryQuestionTotalCount}" class="layui-input" >
</div>
</div>
</div>
@ -68,15 +68,15 @@
<div class="layui-row">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">全对数量</label>
<label class="layui-form-label">学生做题总数</label>
<div class="layui-input-inline">
<input type="text" id="questionLogSummarySuccessCount" name="questionLogSummarySuccessCount" value="${questionLogSummary.questionLogSummarySuccessCount}" class="layui-input" >
<input type="text" id="questionLogSummaryStudentDoCount" name="questionLogSummaryStudentDoCount" value="${questionLogSummary.questionLogSummaryStudentDoCount}" class="layui-input" >
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">半对数量</label>
<label class="layui-form-label">正确数量</label>
<div class="layui-input-inline">
<input type="text" id="questionLogSummaryHalfSuccessCount" name="questionLogSummaryHalfSuccessCount" value="${questionLogSummary.questionLogSummaryHalfSuccessCount}" class="layui-input" >
<input type="text" id="questionLogSummarySuccessCount" name="questionLogSummarySuccessCount" value="${questionLogSummary.questionLogSummarySuccessCount}" class="layui-input" >
</div>
</div>
</div>
@ -84,7 +84,7 @@
<div class="layui-row">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">数量</label>
<label class="layui-form-label">数量</label>
<div class="layui-input-inline">
<input type="text" id="questionLogSummaryErrorCount" name="questionLogSummaryErrorCount" value="${questionLogSummary.questionLogSummaryErrorCount}" class="layui-input" >
</div>

Loading…
Cancel
Save