浏览代码

成绩管理列表

xiatian 1 年之前
父节点
当前提交
422bcbcf23

+ 21 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkArchiveController.java

@@ -1,11 +1,21 @@
 package com.qmth.distributed.print.api.mark;
 
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.mark.bean.archivescore.ArchiveScoreQuery;
+import com.qmth.teachcloud.mark.service.MarkPaperService;
+
 import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
 
 /**
  * <p>
@@ -20,4 +30,13 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_MARK + "/archive")
 public class MarkArchiveController {
 
+	@Autowired
+	private MarkPaperService markPaperService;
+	
+	
+    @ApiOperation(value = "成绩管理列表")
+    @RequestMapping(value = "score/list", method = RequestMethod.POST)
+    public Result scoreList(@Validated ArchiveScoreQuery query) {
+        return ResultUtil.ok(markPaperService.scoreList(query));
+    }
 }

+ 31 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/archivescore/ArchiveScoreQuery.java

@@ -0,0 +1,31 @@
+package com.qmth.teachcloud.mark.bean.archivescore;
+
+import javax.validation.constraints.NotNull;
+
+import com.qmth.teachcloud.mark.utils.PagerQuery;
+
+public class ArchiveScoreQuery extends PagerQuery {
+	@NotNull(message = "考试Id不能为空")
+	private Long examId;
+	
+	private String courseCode;
+
+
+	public Long getExamId() {
+		return examId;
+	}
+
+	public void setExamId(Long examId) {
+		this.examId = examId;
+	}
+
+	public String getCourseCode() {
+		return courseCode;
+	}
+
+	public void setCourseCode(String courseCode) {
+		this.courseCode = courseCode;
+	}
+
+
+}

+ 124 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/archivescore/ArchiveScoreVo.java

@@ -0,0 +1,124 @@
+package com.qmth.teachcloud.mark.bean.archivescore;
+
+public class ArchiveScoreVo {
+
+	private String courseCode;
+
+	private String courseName;
+	private String paperNumber;
+	private Integer studentCount;
+	private Integer classCount;
+	private Integer absentCount;
+	private Double avgScore;
+	private Double maxScore;
+	private Double minScore;
+	private Integer passCount;
+	private String passRate;
+	private Integer excellentCount;
+	private String excellentRate;
+
+	public String getCourseCode() {
+		return courseCode;
+	}
+
+	public void setCourseCode(String courseCode) {
+		this.courseCode = courseCode;
+	}
+
+	public String getCourseName() {
+		return courseName;
+	}
+
+	public void setCourseName(String courseName) {
+		this.courseName = courseName;
+	}
+
+	public String getPaperNumber() {
+		return paperNumber;
+	}
+
+	public void setPaperNumber(String paperNumber) {
+		this.paperNumber = paperNumber;
+	}
+
+	public Integer getStudentCount() {
+		return studentCount;
+	}
+
+	public void setStudentCount(Integer studentCount) {
+		this.studentCount = studentCount;
+	}
+
+	public Integer getClassCount() {
+		return classCount;
+	}
+
+	public void setClassCount(Integer classCount) {
+		this.classCount = classCount;
+	}
+
+	public Integer getAbsentCount() {
+		return absentCount;
+	}
+
+	public void setAbsentCount(Integer absentCount) {
+		this.absentCount = absentCount;
+	}
+
+	public Double getAvgScore() {
+		return avgScore;
+	}
+
+	public void setAvgScore(Double avgScore) {
+		this.avgScore = avgScore;
+	}
+
+	public Double getMaxScore() {
+		return maxScore;
+	}
+
+	public void setMaxScore(Double maxScore) {
+		this.maxScore = maxScore;
+	}
+
+	public Double getMinScore() {
+		return minScore;
+	}
+
+	public void setMinScore(Double minScore) {
+		this.minScore = minScore;
+	}
+
+	public Integer getPassCount() {
+		return passCount;
+	}
+
+	public void setPassCount(Integer passCount) {
+		this.passCount = passCount;
+	}
+
+	public String getPassRate() {
+		return passRate;
+	}
+
+	public void setPassRate(String passRate) {
+		this.passRate = passRate;
+	}
+
+	public Integer getExcellentCount() {
+		return excellentCount;
+	}
+
+	public void setExcellentCount(Integer excellentCount) {
+		this.excellentCount = excellentCount;
+	}
+
+	public String getExcellentRate() {
+		return excellentRate;
+	}
+
+	public void setExcellentRate(String excellentRate) {
+		this.excellentRate = excellentRate;
+	}
+
+}

+ 4 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkPaperMapper.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkSettingDto;
+import com.qmth.teachcloud.mark.bean.archivescore.ArchiveScoreQuery;
+import com.qmth.teachcloud.mark.bean.archivescore.ArchiveScoreVo;
 import com.qmth.teachcloud.mark.dto.mark.score.CheckScoreListDto;
 import com.qmth.teachcloud.mark.dto.mark.score.MarkPaperPackageDto;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
@@ -31,4 +33,6 @@ public interface MarkPaperMapper extends BaseMapper<MarkPaper> {
     IPage<MarkPaperPackageDto> listPackage(@Param("page") Page<MarkPaperPackageDto> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("packageCode") String packageCode);
 
     List<MarkSettingDto> listPaperSetting(@Param("examId") Long examId, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber, @Param("groupStatus") boolean groupStatus, @Param("dpr") DataPermissionRule dpr);
+
+	IPage<ArchiveScoreVo> scoreList(Page<ArchiveScoreVo> page,@Param("req") ArchiveScoreQuery query);
 }

+ 4 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkPaperService.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkSettingDto;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
+import com.qmth.teachcloud.mark.bean.archivescore.ArchiveScoreQuery;
+import com.qmth.teachcloud.mark.bean.archivescore.ArchiveScoreVo;
 import com.qmth.teachcloud.mark.dto.mark.score.CheckScoreListDto;
 import com.qmth.teachcloud.mark.dto.mark.score.MarkPaperPackageDto;
 import com.qmth.teachcloud.mark.dto.mark.score.SettingDto;
@@ -52,4 +54,6 @@ public interface MarkPaperService extends IService<MarkPaper> {
     void updateStudentCountByExamIdAndPaperNumberAndPaperType(Long examId, String paperNumber, String paperType);
 
     SettingDto getSetting(Long examId, String paperNumber);
+
+	IPage<ArchiveScoreVo> scoreList(ArchiveScoreQuery query);
 }

+ 27 - 8
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java

@@ -1,5 +1,15 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -14,6 +24,8 @@ import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.mark.bean.archivescore.ArchiveScoreQuery;
+import com.qmth.teachcloud.mark.bean.archivescore.ArchiveScoreVo;
 import com.qmth.teachcloud.mark.dto.mark.score.CheckScoreListDto;
 import com.qmth.teachcloud.mark.dto.mark.score.MarkPaperPackageDto;
 import com.qmth.teachcloud.mark.dto.mark.score.SettingDto;
@@ -23,14 +35,7 @@ import com.qmth.teachcloud.mark.mapper.MarkPaperMapper;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
 import com.qmth.teachcloud.mark.service.MarkStudentService;
 import com.qmth.teachcloud.mark.service.ScanPackageService;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
+import com.qmth.teachcloud.mark.utils.Calculator;
 
 /**
  * <p>
@@ -225,4 +230,18 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
         return settingDto;
     }
 
+	@Override
+	public IPage<ArchiveScoreVo> scoreList(ArchiveScoreQuery query) {
+		Page<ArchiveScoreVo> page = new Page<>(query.getPageNumber(), query.getPageSize());
+		IPage<ArchiveScoreVo> ret=this.baseMapper.scoreList(page, query);
+		if(CollectionUtils.isNotEmpty(ret.getRecords())) {
+			for(ArchiveScoreVo vo :ret.getRecords()) {
+				double total=vo.getStudentCount()-vo.getAbsentCount();
+				vo.setPassRate(Calculator.divide2String(Calculator.multiply(vo.getPassCount(), 100),total, 2)+"%");
+				vo.setExcellentRate(Calculator.divide2String(Calculator.multiply(vo.getExcellentCount(), 100),total, 2)+"%");
+			}
+		}
+        return ret;
+	}
+
 }

+ 171 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/Calculator.java

@@ -0,0 +1,171 @@
+package com.qmth.teachcloud.mark.utils;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import org.apache.commons.collections4.CollectionUtils;
+
+import com.qmth.boot.core.exception.StatusException;
+
+/**
+ * 计算器
+ *
+ * @author
+ * @date 2019年7月30日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+public class Calculator {
+
+    /**
+     * 加法 保留两位小数
+     * 
+     * @param v1
+     * @param v2
+     * @return
+     */
+    public static double add(double v1, double v2) {
+        return add(v1, v2, 2);
+
+    }
+
+    /**
+     * 加法 保留指定位小数
+     * 
+     * @param v1
+     * @param v2
+     * @param len
+     * @return
+     */
+    public static double add(double v1, double v2, int len) {
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.add(b2).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+    }
+    
+    /** 加法 保留指定位小数
+     * @param ds
+     * @param len
+     * @return
+     */
+    public static double add(List<Double> ds, int len) {
+        if(CollectionUtils.isEmpty(ds)) {
+            throw new StatusException("数组为空");
+        }
+        BigDecimal ret = new BigDecimal(0.0);
+        for(Double d:ds) {
+            if(d==null) {
+                throw new StatusException("数组元素为空");
+            }
+            ret=ret.add(new BigDecimal(d));
+        }
+        return ret.setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+    }
+
+    /**
+     * 减法 保留两位小数
+     * 
+     * @param v1
+     * @param v2
+     * @return
+     */
+    public static double subtract(double v1, double v2) {
+        return subtract(v1, v2, 2);
+
+    }
+
+    /**
+     * 减法 保留指定位小数
+     * 
+     * @param v1
+     * @param v2
+     * @param len
+     * @return
+     */
+    public static double subtract(double v1, double v2, int len) {
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.subtract(b2).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+    }
+    /**差值绝对值
+     * @param v1
+     * @param v2
+     * @param len
+     * @return
+     */
+    public static double absoluteDiff(double v1, double v2, int len) {
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        if(v1>v2) {
+            return b1.subtract(b2).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue();
+        }else {
+            return b2.subtract(b1).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue();
+        }
+
+    }
+    /**
+     * 乘法 
+     * 
+     * @param v1
+     * @param v2
+     * @return
+     */
+    public static double multiply(double v1, double v2) {
+    	BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.multiply(b2).doubleValue();
+    }
+
+    /**
+     * 乘法 保留指定位小数
+     * 
+     * @param v1
+     * @param v2
+     * @param len
+     * @return
+     */
+    public static double multiply(double v1, double v2, int len) {
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.multiply(b2).setScale(len, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+    }
+    
+    
+    /**
+     * 除法 保留两位小数
+     * 
+     * @param v1
+     * @param v2
+     * @param len
+     * @return
+     */
+    public static double divide(double v1, double v2) {
+        return divide(v1, v2, 2);
+    }
+
+    /**
+     * 除法 保留指定位小数
+     * 
+     * @param v1
+     * @param v2
+     * @param len
+     * @return
+     */
+    public static double divide(double v1, double v2, int len) {
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
+    public static String divide2String(Double v1, Double v2, int len) {
+        if(v1==null||v2==null||v2==0) {
+            return "-";
+        }
+        BigDecimal b1 = new BigDecimal(v1);
+        BigDecimal b2 = new BigDecimal(v2);
+        return String.valueOf(b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue());
+    }
+}

+ 21 - 0
teachcloud-mark/src/main/resources/mapper/MarkPaperMapper.xml

@@ -113,4 +113,25 @@
             </if>
         ORDER BY ms.package_code
     </select>
+    <select id="scoreList" resultType="com.qmth.teachcloud.mark.bean.archivescore.ArchiveScoreVo">
+        SELECT t.course_code,t.course_name,t.paper_number,
+        count(*) studentCount,count(distinct s.class_name) classCount,
+        sum(case when s.is_absent =1 then 1 else 0 end) absentCount,
+        avg(case when s.is_absent !=1 then s.objective_score+s.subjective_score else null end) avgScore,
+        max(case when s.is_absent !=1 then s.objective_score+s.subjective_score else null end) maxScore,
+        min(case when s.is_absent !=1 then s.objective_score+s.subjective_score else null end) minScore,
+        sum(case when s.objective_score+s.subjective_score >=t.pass_score then 1 else 0 end) passCount,
+        sum(case when s.objective_score+s.subjective_score >=t.excellent_score then 1 else 0 end) excellentCount
+        FROM
+            mark_paper t 
+            left join mark_student s on t.exam_id=s.exam_id and t.course_paper_id=s.course_paper_id
+        WHERE
+            t.exam_id = #{req.examId}
+            <if test="req.courseCode =! null and req.courseCode != ''">
+                AND t.course_code = #{req.courseCode}
+            </if>
+        group by t.course_code,t.course_name,t.paper_number
+        ORDER BY t.course_code
+    </select>
+    
 </mapper>