package cn.com.qmth.am.controller; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletResponse; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.alibaba.fastjson.util.IOUtils; import com.qmth.boot.api.annotation.Aac; import com.qmth.boot.api.constant.ApiConstant; import com.qmth.boot.core.concurrent.service.ConcurrentService; import cn.com.qmth.am.bean.DataKey; import cn.com.qmth.am.config.SysProperty; import cn.com.qmth.am.entity.QuestionEntity; import cn.com.qmth.am.entity.StudentScoreEntity; import cn.com.qmth.am.enums.DataStatus; import cn.com.qmth.am.enums.ImportFileName; import cn.com.qmth.am.enums.LockType; import cn.com.qmth.am.service.QuestionService; import cn.com.qmth.am.service.StudentScoreService; import cn.com.qmth.am.service.StudentService; import cn.com.qmth.am.utils.Calculator; import io.swagger.annotations.ApiOperation; @RestController @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/admin") @Aac(strict = false, auth = false) public class AdminController { @Autowired private QuestionService questionService; @Autowired private StudentService studentService; @Autowired private StudentScoreService studentScoreService; @Autowired private SysProperty sysProperty; @Autowired private ConcurrentService concurrentService; @ApiOperation(value = "分析数据") @RequestMapping(value = "fenxi", method = RequestMethod.GET) public void fenxi(HttpServletResponse response, @RequestParam Long examId, @RequestParam(required = false) Boolean exZero,@RequestParam(required = false) Integer count) { StringBuilder sb = new StringBuilder(); List qs = questionService.findByExamId(examId); if (CollectionUtils.isEmpty(qs)) { sb.append("试题数:0"); returnJson(sb.toString(), response); return; } sb.append("试题数:" + qs.size() + "\r\n"); for (QuestionEntity q : qs) { List scores = studentScoreService.findBy(examId, q.getSubjectCode(), q.getMainNumber(), q.getSubNumber(), exZero,count); if (CollectionUtils.isEmpty(scores)) { sb.append(q.getSubjectCode() + "|" + q.getMainNumber() + "|" + q.getSubNumber() + "| 相关系数:- \r\n"); } else { double[] a = new double[scores.size()]; double[] b = new double[scores.size()]; int i = 0; for (StudentScoreEntity s : scores) { a[i] = s.getAiScore(); b[i] = s.getMarkingScore(); i++; } try { double ret = new BigDecimal(Calculator.correlation(a, b)).setScale(2, BigDecimal.ROUND_HALF_UP) .doubleValue(); double avg1 = new BigDecimal(Calculator.mean(a)).setScale(2, BigDecimal.ROUND_HALF_UP) .doubleValue(); double avg2 = new BigDecimal(Calculator.mean(b)).setScale(2, BigDecimal.ROUND_HALF_UP) .doubleValue(); sb.append(q.getSubjectCode() + "|" + q.getMainNumber() + "|" + q.getSubNumber() + "| 相关系数:" + ret + "| 人评均分:" + avg2 + "| 机评均分:" + avg1 +"| 题数:"+scores.size()+ " \r\n"); fill(scores, sb); } catch (Exception e) { sb.append(q.getSubjectCode() + "|" + q.getMainNumber() + "|" + q.getSubNumber() + "| 相关系数出错:- \r\n"); } } } returnJson(sb.toString(), response); } private void fill(List scores,StringBuilder sb) { int total=scores.size(); int st=0; Map ret=new HashMap<>(); for(StudentScoreEntity s:scores) { DataKey k=getKey(s.getAiScore()-s.getMarkingScore()); Integer tem=ret.get(k); if(tem==null) { tem=0; } ret.put(k, tem+1); } List ks=new ArrayList<>(ret.keySet()); ks.sort(new Comparator() { @Override public int compare(DataKey o1, DataKey o2) { int c1 = o1.getIndex(); int c2 = o2.getIndex(); if (c1 < c2) { return -1; } else if (c1 > c2) { return 1; } else { return 0; } } }); for(DataKey k:ks) { Integer c=ret.get(k); if(k.getIndex()<=2) { st=st+c; } sb.append(" "+k.getKey()+" "+c+" "+Calculator.percentage(c, total, 2)+ " \r\n"); } sb.append(" 3分差值:"+st+" "+Calculator.percentage(st, total, 2)+ " \r\n"); } private static DataKey getKey(double s) { if(s<0) { s=0-s; } if(s==0) { DataKey r=new DataKey(); r.setKey("[0,0]"); r.setIndex(-1); return r; } int i=0; for(;;) { if(i qs = questionService.findByExamId(examId); int qstotal = 0; int qsCourse = 0; if (CollectionUtils.isNotEmpty(qs)) { Set cset = new HashSet<>(); qstotal = qs.size(); for (QuestionEntity q : qs) { cset.add(q.getSubjectCode()); } qsCourse = cset.size(); } sb.append("ocr任务是否开启:" + (sysProperty.getOcrTaskEnable() ? "是" : "否") + "\r\n"); sb.append("评分任务是否开启:" + (sysProperty.getMarkingTaskEnable() ? "是" : "否") + "\r\n"); sb.append("试卷科目总数:" + qsCourse + "\r\n"); sb.append("试卷小题总数:" + qstotal + "\r\n"); int total = studentService.countBy(examId, null); if (total == 0) { sb.append("考生总数:0"); returnJson(sb.toString(), response); return; } sb.append("考生总数:" + total + "\r\n"); int suc = studentService.countBy(examId, DataStatus.SUCCESS); sb.append("考生处理成功总数:" + suc + "\r\n"); int failed = studentService.countBy(examId, DataStatus.FAILED); sb.append("考生处理失败总数:" + failed + "\r\n"); int qtotal = studentScoreService.countBy(examId, null); if (qtotal == 0) { sb.append("试题总数:0"); returnJson(sb.toString(), response); return; } sb.append("考生试题总数:" + qtotal + "\r\n"); int qocrsuc = studentScoreService.countOcrBy(examId, DataStatus.SUCCESS); sb.append("考生试题OCR成功总数:" + qocrsuc + "\r\n"); int qocrfailed = studentScoreService.countOcrBy(examId, DataStatus.FAILED); sb.append("考生试题OCR失败总数:" + qocrfailed + "\r\n"); int qsuc = studentScoreService.countBy(examId, DataStatus.SUCCESS); sb.append("考生试题评分成功总数:" + qsuc + "\r\n"); int qfailed = studentScoreService.countBy(examId, DataStatus.FAILED); sb.append("考生试题评分失败总数:" + qfailed + "\r\n"); returnJson(sb.toString(), response); } @ApiOperation(value = "上传导入文件") @RequestMapping(value = "upload", method = RequestMethod.POST) public String upload(@RequestParam MultipartFile file) { if (ImportFileName.getByName(file.getOriginalFilename()) == null) { return "上传失败,文件名错误"; } File old = new File(sysProperty.getDataDir() + "/" + file.getOriginalFilename()); if (old.exists()) { return "上传失败,有正在处理的文件"; } InputStream in = null; try { in = file.getInputStream(); FileUtils.copyInputStreamToFile(file.getInputStream(), old); } catch (IOException e) { return "上传失败," + e.getMessage(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { } } } return "上传成功"; } @ApiOperation(value = "重置数据") @RequestMapping(value = "reset", method = RequestMethod.GET) public String reset(@RequestParam Long examId, @RequestParam(required = false) String subjectCode) { boolean lock1 = concurrentService.getReadWriteLock(LockType.AI_MARKING.name()).writeLock().tryLock(); if (!lock1) { return "重置失败,有任务正在处理,请稍后 再试"; } boolean lock2 = concurrentService.getReadWriteLock(LockType.OCR.name()).writeLock().tryLock(); if (!lock2) { return "重置失败,有任务正在处理,请稍后 再试"; } try { studentService.reset(examId, subjectCode); return "重置成功"; } finally { if (lock2) { concurrentService.getReadWriteLock(LockType.OCR.name()).writeLock().unlock(); } if (lock1) { concurrentService.getReadWriteLock(LockType.AI_MARKING.name()).writeLock().unlock(); } } } @ApiOperation(value = "删除数据") @RequestMapping(value = "clear", method = RequestMethod.GET) public String clear(@RequestParam Long examId, @RequestParam(required = false) String subjectCode) { boolean lock1 = concurrentService.getReadWriteLock(LockType.AI_MARKING.name()).writeLock().tryLock(); if (!lock1) { return "删除失败,有任务正在处理,请稍后 再试"; } boolean lock2 = concurrentService.getReadWriteLock(LockType.OCR.name()).writeLock().tryLock(); if (!lock2) { return "删除失败,有任务正在处理,请稍后 再试"; } try { studentService.clear(examId, subjectCode); return "删除成功"; } finally { if (lock2) { concurrentService.getReadWriteLock(LockType.OCR.name()).writeLock().unlock(); } if (lock1) { concurrentService.getReadWriteLock(LockType.AI_MARKING.name()).writeLock().unlock(); } } } @ApiOperation(value = "机评开关") @RequestMapping(value = "marking/status", method = RequestMethod.GET) public String markingStatus(@RequestParam Boolean enable) { sysProperty.setMarkingTaskEnable(enable); return "设置成功:" + enable; } @ApiOperation(value = "ocr开关") @RequestMapping(value = "ocr/status", method = RequestMethod.GET) public String ocrStatus(@RequestParam Boolean enable) { sysProperty.setOcrTaskEnable(enable); return "设置成功:" + enable; } private void returnJson(String body, HttpServletResponse response) { response.setContentType("application/json;charset=utf-8"); PrintWriter writer = null; try { writer = response.getWriter(); writer.write(body); } catch (IOException e) { } finally { IOUtils.close(writer); } } }