Quellcode durchsuchen

Merge remote-tracking branch 'origin/ywx' into wn_j

tags/正式版本
王宁 vor 2 Jahren
Ursprung
Commit
79d85265a8

+ 21
- 0
sexam/src/main/java/com/xhkjedu/sexam/mapper/report/EReportGenerateMapper.java Datei anzeigen

@@ -0,0 +1,21 @@
1
+package com.xhkjedu.sexam.mapper.report;
2
+
3
+import com.xhkjedu.sexam.vo.report.ERPaperVo;
4
+import org.apache.ibatis.annotations.Param;
5
+
6
+import java.util.List;
7
+import java.util.Map;
8
+
9
+/**
10
+ * @author ywx
11
+ * @className EReportGenerateMapper
12
+ * @description 考试报告生成
13
+ * @date 2022/8/9 10:00
14
+ **/
15
+public interface EReportGenerateMapper {
16
+    //考试科目
17
+    List<Map> listSubject(@Param("examid") Integer examid);
18
+
19
+    //考试试卷
20
+    public List<ERPaperVo> listPaper(@Param("examid") Integer examid);
21
+}

+ 164
- 33
sexam/src/main/java/com/xhkjedu/sexam/service/report/EReportGenerateService.java Datei anzeigen

@@ -1,12 +1,27 @@
1 1
 package com.xhkjedu.sexam.service.report;
2 2
 
3
-import com.xhkjedu.sexam.mapper.exam.EBaseMapper;
3
+import com.alibaba.fastjson.JSON;
4 4
 import com.xhkjedu.sexam.mapper.exam.EClassMapper;
5
-import com.xhkjedu.sexam.mapper.exam.ESubjectMapper;
6 5
 import com.xhkjedu.sexam.mapper.paperstudent.EPaperStudentMapper;
7 6
 import com.xhkjedu.sexam.mapper.report.ERbaseMapper;
7
+import com.xhkjedu.sexam.mapper.report.EReportGenerateMapper;
8
+import com.xhkjedu.sexam.mapper.report.ERsubjectMapper;
9
+import com.xhkjedu.sexam.mapper.reportclass.ERclassMapper;
10
+import com.xhkjedu.sexam.mapper.reportclass.ERclassQtypeMapper;
11
+import com.xhkjedu.sexam.mapper.reportclass.ERclassQuestionErrorMapper;
12
+import com.xhkjedu.sexam.mapper.reportclass.ERclassQuestionMapper;
13
+import com.xhkjedu.sexam.mapper.reportclass.ERclassQuestionPointMapper;
8 14
 import com.xhkjedu.sexam.mapper.reportstu.ERstudentMapper;
15
+import com.xhkjedu.sexam.model.report.ERbase;
16
+import com.xhkjedu.sexam.model.report.ERsubject;
17
+import com.xhkjedu.sexam.model.reportclass.ERclass;
18
+import com.xhkjedu.sexam.model.reportclass.ERclassQtype;
19
+import com.xhkjedu.sexam.model.reportclass.ERclassQuestion;
20
+import com.xhkjedu.sexam.model.reportclass.ERclassQuestionError;
21
+import com.xhkjedu.sexam.model.reportclass.ERclassQuestionPoint;
9 22
 import com.xhkjedu.sexam.model.reportstu.ERstudent;
23
+import com.xhkjedu.sexam.vo.paper.EPaperQsVo;
24
+import com.xhkjedu.sexam.vo.report.ERPaperVo;
10 25
 import org.springframework.stereotype.Service;
11 26
 
12 27
 import javax.annotation.Resource;
@@ -26,45 +41,52 @@ import java.util.stream.Collectors;
26 41
 @Service
27 42
 public class EReportGenerateService {
28 43
     @Resource
29
-    private EBaseMapper eBaseMapper;
44
+    private EReportGenerateMapper eReportGenerateMapper;
30 45
     @Resource
31 46
     private EClassMapper eClassMapper;
32 47
     @Resource
33
-    private ESubjectMapper eSubjectMapper;
34
-    @Resource
35 48
     private EPaperStudentMapper ePaperStudentMapper;
36 49
 
37 50
     @Resource
38 51
     private ERbaseMapper eRbaseMapper;
39 52
     @Resource
40 53
     private ERstudentMapper eRstudentMapper;
54
+    @Resource
55
+    private ERsubjectMapper eRsubjectMapper;
56
+    @Resource
57
+    private ERclassMapper eRclassMapper;
58
+    @Resource
59
+    private ERclassQtypeMapper eRclassQtypeMapper;
60
+    @Resource
61
+    private ERclassQuestionMapper eRclassQuestionMapper;
62
+    @Resource
63
+    private ERclassQuestionPointMapper eRclassQuestionPointMapper;
64
+    @Resource
65
+    private ERclassQuestionErrorMapper eRclassQuestionErrorMapper;
41 66
 
42 67
     //生成考试报告
43 68
     public void generateExamReport(Integer examid) {
44 69
         List<Map> classes = eClassMapper.listByExamId(examid);
45
-        List<Map> subjects = eSubjectMapper.listSubject(examid);
70
+        List<Map> subjects = eReportGenerateMapper.listSubject(examid);
71
+        List<ERPaperVo> papers = eReportGenerateMapper.listPaper(examid);
46 72
         int classnum = classes.size();
47 73
         int stunum = classes.stream().mapToInt(m -> (int) m.get("classnum")).sum();
48 74
         int subjectnum = subjects.size();
49
-        /*ERbase rbase = new ERbase();
50
-        rbase.setExamid(examid);
51
-        rbase.setClassnum(classnum);
52
-        rbase.setStunum(stunum);
53
-        rbase.setSubjectnum(subjectnum);
54
-        eRbaseMapper.insertSelective(rbase);*/
55 75
 
56 76
         String subjectid = "zf";
57 77
         String subjectname = "总分";
58 78
         Map<String, String> subjectMap = subjects.stream().collect(Collectors.toMap(m -> m.get("subjectid").toString(),
59 79
                 m -> m.get("subjectname").toString()));
80
+        Map<String, ERPaperVo> paperMap = papers.stream().collect(Collectors.toMap(m -> m.getSubjectid(), m -> m));
60 81
 
61 82
         List<ERstudent> schoolStudents = new ArrayList<>();//学校学生成绩
83
+        List<ERstudent> schoolSubjectStudents = new ArrayList<>();//学校科目学生成绩
62 84
         List<ERstudent> classStudents = new ArrayList<>();//班级学生成绩
63
-        List<ERstudent> subjectStudents = new ArrayList<>();//科目学生成绩
85
+        List<ERstudent> classSubjectStudents = new ArrayList<>();//班级科目学生成绩
64 86
         Map<String, Integer> schoolRank = new HashMap<>();//学校分数排名
87
+        Map<String, Integer> schoolSubjectRank = new HashMap<>();//学校科目分数排名
65 88
         Map<String, Integer> classRank = new HashMap<>();//班级分数排名
66
-        Map<String, Integer> ssubjectRank = new HashMap<>();//学校科目分数排名
67
-        Map<String, Integer> csubjectRank = new HashMap<>();//班级科目分数排名
89
+        Map<String, Integer> classSubjectRank = new HashMap<>();//班级科目分数排名
68 90
 
69 91
         List<ERstudent> students = ePaperStudentMapper.listByExamId(examid);
70 92
         Map<Integer, List<ERstudent>> schoolCollect = students.stream().collect(Collectors.groupingBy(s -> s.getStudentid()));
@@ -75,8 +97,6 @@ public class EReportGenerateService {
75 97
             cs.setScore(entry.getValue().stream().mapToDouble(s -> s.getScore()).sum());
76 98
             schoolStudents.add(cs);
77 99
         }
78
-        setRank(schoolStudents, schoolRank, 1);//学校分数排名
79
-
80 100
         Map<Integer, List<ERstudent>> cCollect = students.stream().collect(Collectors.groupingBy(s -> s.getClassid()));
81 101
         for (Map.Entry<Integer, List<ERstudent>> entry : cCollect.entrySet()) {
82 102
             Integer classid = entry.getKey();
@@ -91,8 +111,6 @@ public class EReportGenerateService {
91 111
                 cs.setScore(csEntry.getValue().stream().mapToDouble(s -> s.getScore()).sum());
92 112
                 classStudents.add(cs);
93 113
             }
94
-            setRank(classStudents, classRank, 2);//班级分数排名
95
-
96 114
             Map<String, List<ERstudent>> subCollect = studentList.stream().collect(Collectors.groupingBy(s -> s.getSubjectid()));
97 115
             for (Map.Entry<String, List<ERstudent>> ssEntry : subCollect.entrySet()) {
98 116
                 subjectid = ssEntry.getKey();
@@ -100,35 +118,146 @@ public class EReportGenerateService {
100 118
                 studentList = ssEntry.getValue();
101 119
                 for (ERstudent cs : studentList) {
102 120
                     cs.setSubjectname(subjectname);
103
-                    subjectStudents.add(cs);
121
+                    classSubjectStudents.add(cs);
104 122
                 }
105 123
             }
106
-            setRank(subjectStudents, ssubjectRank, 3);//科目分数排名
107 124
         }
108 125
 
109 126
         DoubleSummaryStatistics schoolStatistics = schoolStudents.stream().mapToDouble(s -> s.getScore()).summaryStatistics();
127
+        DoubleSummaryStatistics sSStatistics = schoolSubjectStudents.stream().mapToDouble(s -> s.getScore()).summaryStatistics();
110 128
         DoubleSummaryStatistics classStatistics = classStudents.stream().mapToDouble(s -> s.getScore()).summaryStatistics();
129
+        DoubleSummaryStatistics cSStatistics = classSubjectStudents.stream().mapToDouble(s -> s.getScore()).summaryStatistics();
130
+        double schoolStatisticsMax = schoolStatistics.getMax();
131
+        double schoolStatisticsAverage = schoolStatistics.getAverage();
132
+        double schoolStatisticsMin = schoolStatistics.getMin();
133
+
134
+        ERbase rbase = new ERbase();
135
+        rbase.setExamid(examid);
136
+        rbase.setClassnum(classnum);
137
+        rbase.setStunum(stunum);
138
+        rbase.setMissnum(students.stream().filter(l -> l.getSstate() == 3)
139
+                .map(l -> l.getStudentid()).distinct().collect(Collectors.toList()).size());
140
+        rbase.setSubjectnum(subjectnum);
141
+        rbase.setMaxscore(schoolStatisticsMax);
142
+        rbase.setAvgscore(schoolStatisticsAverage);
143
+        rbase.setMixscore(schoolStatisticsMin);
144
+        eRbaseMapper.insertSelective(rbase);
145
+
146
+        Map<String, List<ERstudent>> subCollect = students.stream().collect(Collectors.groupingBy(s -> s.getSubjectid()));
147
+        List<ERsubject> subjectList = new ArrayList<>();//考试报告科目情况
148
+        List<ERclass> classList = new ArrayList<>();//考试报告班级情况
149
+        List<ERclassQtype> qtypeList = new ArrayList<>();//考试报告班级题型情况
150
+        List<ERclassQuestion> questionList = new ArrayList<>();//考试报告班级试题情况
151
+        List<ERclassQuestionError> errorList = new ArrayList<>();//考试报告班级高频错题情况
152
+        List<ERclassQuestionPoint> pointList = new ArrayList<>();//考试报告班级试题知识点情况
153
+        for (Map.Entry<String, List<ERstudent>> ssEntry : subCollect.entrySet()) {
154
+            subjectid = ssEntry.getKey();
155
+            subjectname = subjectMap.get(subjectid);
156
+            List<ERstudent> list = ssEntry.getValue();
157
+            Map<Integer, List<ERstudent>> sCollect = list.stream().collect(Collectors.groupingBy(s -> s.getStudentid()));
158
+            for (Map.Entry<Integer, List<ERstudent>> csEntry : sCollect.entrySet()) {
159
+                ERstudent cs = new ERstudent();
160
+                cs.setClassid(0);
161
+                cs.setStudentid(csEntry.getKey());
162
+                cs.setSubjectid(subjectid);
163
+                cs.setSubjectname(subjectname);
164
+                cs.setScore(csEntry.getValue().stream().mapToDouble(s -> s.getScore()).sum());
165
+                schoolSubjectStudents.add(cs);
166
+            }
167
+            ERPaperVo rp = paperMap.get(subjectid);
168
+            Double allscore = rp.getPscore();//满分
169
+            double yxscore = allscore * 0.85;//优秀分
170
+            double lhscore = allscore * 0.7;//良好分
171
+            double jgscore = allscore * 0.6;//及格分
172
+            double dfscore = allscore * 0.4;//低分
173
+
174
+            DoubleSummaryStatistics statistics = list.stream().mapToDouble(s -> s.getScore()).summaryStatistics();
175
+            ERsubject rs = new ERsubject();
176
+            rs.setExamid(examid);
177
+            rs.setSubjectid(subjectid);
178
+            rs.setSubjectname(subjectname);
179
+            rs.setScore(allscore);
180
+            rs.setMaxscore(statistics.getMax());
181
+            rs.setMinscore(statistics.getMin());
182
+            rs.setAvgscore(statistics.getAverage());
183
+            rs.setStunum(list.stream().filter(l -> l.getSstate() == 2).collect(Collectors.toList()).size());
184
+            rs.setMissnum(list.stream().filter(l -> l.getSstate() == 3).collect(Collectors.toList()).size());
185
+            subjectList.add(rs);
186
+
187
+            Map<Integer, List<ERstudent>> claCollect = list.stream().collect(Collectors.groupingBy(s -> s.getClassid()));
188
+            for (Map.Entry<Integer, List<ERstudent>> entry : claCollect.entrySet()) {
189
+                Integer classid = entry.getKey();
190
+                List<ERstudent> rstudentList = entry.getValue();
191
+                statistics = rstudentList.stream().mapToDouble(s -> s.getScore()).summaryStatistics();
192
+                ERclass rc = new ERclass();
193
+                rc.setExamid(examid);
194
+                rc.setClassid(classid);
195
+                rc.setSubjectid(subjectid);
196
+                rc.setSubjectname(subjectname);
197
+                rc.setAllscore(allscore);
198
+                rc.setClassmaxscore(statistics.getMax());
199
+                rc.setClassminscore(statistics.getMin());
200
+                rc.setClassavgscore(statistics.getAverage());
201
+                rc.setStunum(rstudentList.stream().filter(l -> l.getSstate() == 2).collect(Collectors.toList()).size());
202
+                rc.setMissnum(rstudentList.stream().filter(l -> l.getSstate() == 3).collect(Collectors.toList()).size());
203
+                classList.add(rc);
204
+                List<EPaperQsVo> typelist = JSON.parseArray(rp.getQnumjson(), EPaperQsVo.class);
205
+                for (EPaperQsVo t : typelist) {
206
+                    ERclassQtype rt = new ERclassQtype();
207
+                    rt.setExamid(examid);
208
+                    rt.setClassid(classid);
209
+                    rt.setSubjectid(subjectid);
210
+                    rt.setQtypename(t.getQtname());
211
+                    rt.setScore(t.getScore());
212
+                    rt.setNum(t.getNum());
213
+                    rt.setSrate(t.getSrate());
214
+                    qtypeList.add(rt);
215
+                }
216
+
217
+                List<Map> points = JSON.parseArray(rp.getQnumjson(), Map.class);
218
+                for (Map p : points) {
219
+                    ERclassQuestionPoint rqp = new ERclassQuestionPoint();
220
+                    rqp.setExamid(examid);
221
+                    rqp.setClassid(classid);
222
+                    rqp.setSubjectid(subjectid);
223
+                    rqp.setPointname(p.get("pointname").toString());
224
+                    rqp.setScore((Double) p.get("score"));
225
+                    rqp.setSrate((Double) p.get("srate"));
226
+                    pointList.add(rqp);
227
+                }
228
+            }
229
+        }
230
+
231
+        eRclassMapper.insertList(classList);
232
+        eRsubjectMapper.insertList(subjectList);
233
+
234
+        setRank(schoolStudents, schoolRank, 1);//学校分数排名
235
+        setRank(schoolSubjectStudents, schoolSubjectRank, 2);//学校科目分数排名
236
+        setRank(classStudents, classRank, 3);//班级分数排名
237
+        setRank(classSubjectStudents, classSubjectRank, 4);//班级科目分数排名
238
+
111 239
         for (ERstudent cs : classStudents) {
112 240
             Integer studentid = cs.getStudentid();
113
-            cs.setClassrank(classRank.get(cs.getClassid()+"_"+ studentid));
241
+            cs.setClassrank(classRank.get(cs.getClassid() + "_" + studentid));
114 242
             cs.setClassmaxscore(classStatistics.getMax());
115 243
             cs.setClassavgscore(classStatistics.getAverage());
116 244
             cs.setSchoolrank(schoolRank.get(studentid));
117
-            cs.setSchoolmaxscore(schoolStatistics.getMax());
118
-            cs.setSchoolavgscore(schoolStatistics.getAverage());
245
+            cs.setSchoolmaxscore(schoolStatisticsMax);
246
+            cs.setSchoolavgscore(schoolStatisticsAverage);
119 247
         }
120 248
         eRstudentMapper.insertList(classStudents);
121 249
 
122
-        for (ERstudent cs : subjectStudents) {
250
+        for (ERstudent cs : classSubjectStudents) {
123 251
             Integer studentid = cs.getStudentid();
124
-            cs.setClassrank(classRank.get(cs.getClassid()+"_"+ studentid));
252
+            Integer classid = cs.getClassid();
253
+            cs.setClassrank(classRank.get(classid + "_" + studentid));
125 254
             cs.setClassmaxscore(classStatistics.getMax());
126 255
             cs.setClassavgscore(classStatistics.getAverage());
127
-            cs.setSchoolrank(schoolRank.get(studentid));
128
-            cs.setSchoolmaxscore(schoolStatistics.getMax());
129
-            cs.setSchoolavgscore(schoolStatistics.getAverage());
256
+            cs.setSchoolrank(schoolSubjectRank.get(classid + "_" + cs.getSubjectid() + "_" + studentid));
257
+            cs.setSchoolmaxscore(sSStatistics.getMax());
258
+            cs.setSchoolavgscore(sSStatistics.getAverage());
130 259
         }
131
-        eRstudentMapper.insertList(subjectStudents);
260
+        eRstudentMapper.insertList(classSubjectStudents);
132 261
     }
133 262
 
134 263
     //分数排名
@@ -147,10 +276,12 @@ public class EReportGenerateService {
147 276
                 String subjectid = cgs.getSubjectid();
148 277
                 if (code == 1) {//学校
149 278
                     key = studentid.toString();
150
-                } else if (code == 2) {//班级
151
-                    key = classid + "_" + studentid;
152
-                } else {//科目
279
+                } else if (code == 2) {//学校科目
153 280
                     key = subjectid + "_" + studentid;
281
+                } else if (code == 3) {//班级
282
+                    key = classid + "_" + studentid;
283
+                } else {//班级科目
284
+                    key = classid + "_" + subjectid + "_" + studentid;
154 285
                 }
155 286
                 rank.put(key, index);
156 287
             }

+ 27
- 0
sexam/src/main/java/com/xhkjedu/sexam/vo/report/ERPaperVo.java Datei anzeigen

@@ -0,0 +1,27 @@
1
+package com.xhkjedu.sexam.vo.report;
2
+
3
+import lombok.Data;
4
+
5
+/**
6
+ * @author ywx
7
+ * @classname ERPaperVo
8
+ * @description 
9
+ * @date 2022/8/9 11:27
10
+ **/
11
+@Data
12
+public class ERPaperVo {
13
+    //科目id
14
+    private String subjectid;
15
+
16
+    //试卷总分
17
+    private Double pscore;
18
+
19
+    //试题量分布分析
20
+    private String qnumjson;
21
+
22
+    //难易度
23
+    private String complexityjson;
24
+
25
+    //知识点分析
26
+    private String pointjson;
27
+}

+ 8
- 8
sexam/src/main/resources/mapper/paper/EPaperCorrectTeacherMapper.xml Datei anzeigen

@@ -5,8 +5,8 @@
5 5
     <select id="listPending" resultType="java.util.Map">
6 6
         select a.*,eb.examname,eb.gradeid,eb.examtype,es.sdate,es.begintime,es.endtime,es.subjectname
7 7
         ,truncate(a.pynum*100/a.tjnum,2)pgrate
8
-        from(select p.esid,p.epid,group_concat(distinct pq.qn order by pq.eptqid)qns
9
-        ,group_concat(distinct pq.eptqid order by pq.eptqid)eptqids,group_concat(distinct pc.classid)classids
8
+        from(select p.esid,p.epid,group_concat(distinct concat(pq.qn,'_',pq.eptqid) order by pq.eptqid)qns
9
+        ,group_concat(distinct pc.classid)classids
10 10
         ,count(case when psq.answered=1 then psq.epsqid else null end)tjnum
11 11
         ,count(case when psq.answered=1 and psq.checked=2 then psq.epsqid else null end)pynum
12 12
         from e_paper p left join e_paper_qtype_question pq on p.epid = pq.epid
@@ -14,8 +14,8 @@
14 14
         left join e_paper_student_question psq on psq.epid = pc.epid and psq.classid=pc.classid and psq.qorder=pq.qorder
15 15
         where pc.teacherid=#{teacherid} and pq.ctype in(3,14,15) group by p.epid
16 16
         union
17
-        select p.esid,p.epid,group_concat(distinct pq.qn order by pq.eptqid)qns
18
-        ,group_concat(distinct pq.eptqid order by pq.eptqid)eptqids,0 classids
17
+        select p.esid,p.epid,group_concat(distinct concat(pq.qn,'_',pq.eptqid) order by pq.eptqid)qns
18
+        ,0 classids
19 19
         ,count(case when psq.answered=1 then psq.epsqid else null end)tjnum
20 20
         ,count(case when psq.answered=1 and psq.checked=2 then psq.epsqid else null end)pynum
21 21
         from e_paper p left join e_paper_correctquestion pq on p.epid = pq.epid
@@ -28,8 +28,8 @@
28 28
     <select id="listMarked" resultType="java.util.Map">
29 29
         select a.*,eb.examname,eb.gradeid,eb.examtype,es.sdate,es.begintime,es.endtime,es.subjectname
30 30
         ,100 pgrate
31
-        from(select p.esid,p.epid,group_concat(distinct pq.qn order by pq.eptqid)qns
32
-        ,group_concat(distinct pq.eptqid order by pq.eptqid)eptqids,group_concat(distinct pc.classid)classids
31
+        from(select p.esid,p.epid,group_concat(distinct concat(pq.qn,'_',pq.eptqid) order by pq.eptqid)qns
32
+        ,group_concat(distinct pc.classid)classids
33 33
         ,count(case when psq.answered=1 then psq.epsqid else null end)tjnum
34 34
         ,count(case when psq.answered=1 and psq.checked=2 then psq.epsqid else null end)pynum
35 35
         from e_paper p left join e_paper_qtype_question pq on p.epid = pq.epid
@@ -37,8 +37,8 @@
37 37
         left join e_paper_student_question psq on psq.epid = pc.epid and psq.classid=pc.classid and psq.qorder=pq.qorder
38 38
         where pc.teacherid=#{teacherid} and pq.ctype in(3,14,15) group by p.epid
39 39
         union
40
-        select p.esid,p.epid,group_concat(distinct pq.qn order by pq.eptqid)qns
41
-        ,group_concat(distinct pq.eptqid order by pq.eptqid)eptqids,0 classids
40
+        select p.esid,p.epid,group_concat(distinct concat(pq.qn,'_',pq.eptqid) order by pq.eptqid)qns
41
+        ,0 classids
42 42
         ,count(case when psq.answered=1 then psq.epsqid else null end)tjnum
43 43
         ,count(case when psq.answered=1 and psq.checked=2 then psq.epsqid else null end)pynum
44 44
         from e_paper p left join e_paper_correctquestion pq on p.epid = pq.epid

+ 14
- 0
sexam/src/main/resources/mapper/report/EReportGenerateMapper.xml Datei anzeigen

@@ -0,0 +1,14 @@
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3
+<mapper namespace="com.xhkjedu.sexam.mapper.report.EReportGenerateMapper">
4
+    <!--考试科目-->
5
+    <select id="listSubject" resultType="java.util.Map">
6
+        select subjectid,subjectname from e_subject where examid=#{examid}
7
+    </select>
8
+    <!--考试试卷-->
9
+    <select id="listPaper" resultType="com.xhkjedu.sexam.vo.report.ERPaperVo">
10
+        select ep.subjectid,ep.pscore,epa.qnumjson,epa.complexityjson,epa.pointjson
11
+        from e_paper ep left join e_paper_analyze epa on ep.epid = epa.epid
12
+        where ep.examid=#{examid}
13
+    </select>
14
+</mapper>

Laden…
Abbrechen
Speichern