Browse Source

教师功能Complete

bfzgs 2 years ago
parent
commit
40be98f278

+ 17 - 1
final-timetable/src/main/java/org/brynhild/graduation/timetable/controller/TeacherController.groovy

@@ -5,6 +5,7 @@ import org.brynhild.graduation.common.transfer.dto.Result
 import org.brynhild.graduation.common.utils.RequestBodyVerifier
 import org.brynhild.graduation.timetable.service.ITimeTableService
 import org.brynhild.graduation.transfer.timetable.vo.QueryTeachingClassRequest
+import org.brynhild.graduation.transfer.timetable.vo.QueryTeachingCourseStatisticRequest
 import org.brynhild.graduation.transfer.timetable.vo.QueryTimeTableRequest
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.validation.BindingResult
@@ -33,10 +34,25 @@ class TeacherController {
         if(result.hasErrors()){
             return verifier.convertToErrors(result);
         }
-        println request
         return tableService.queryTeachingClass(request)
     }
 
+    @PostMapping("/statistic")
+    Result queryTeachingCourseStatistic(@RequestBody @Validated QueryTeachingCourseStatisticRequest request,BindingResult result){
+        if(result.hasErrors()){
+            return verifier.convertToErrors(result);
+        }
+        return tableService.queryTeachingCourseStatistic(request)
+    }
+
+    @PostMapping("/statistic/generate")
+    Result generateTeachingCourseStatistic(@RequestBody @Validated QueryTeachingCourseStatisticRequest request,BindingResult result){
+        if(result.hasErrors()){
+            return verifier.convertToErrors(result);
+        }
+        return tableService.generateTeachingCourseStatistic(request)
+    }
+
 
     @Autowired
     @Resource

+ 38 - 0
final-timetable/src/main/java/org/brynhild/graduation/timetable/executor/WordExecutor.groovy

@@ -10,6 +10,7 @@ import org.apache.poi.xwpf.usermodel.XWPFTableCell
 import org.brynhild.graduation.common.constant.CourseConstant
 import org.brynhild.graduation.persistence.timetable.entity.Course
 import org.brynhild.graduation.transfer.timetable.bo.ClassStatisticInfo
+import org.brynhild.graduation.transfer.timetable.bo.CourseStatisticInfo
 import org.brynhild.graduation.transfer.timetable.bo.StudentStatisticInfo
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblBorders
@@ -132,6 +133,43 @@ class WordExecutor {
         fos.close()
     }
 
+    static void generateTeachingCourseStatisticReport(String outputFilename, List<CourseStatisticInfo> infoList, Map<String,String> replaceMap){
+        XWPFDocument document=new XWPFDocument(POIXMLDocument.openPackage(CLASS_STATISTIC_TEMPLATE))
+        if(replaceMap!=null){
+            replaceMarkedText(document,replaceMap)
+        }
+        def tables = document.getTables()
+        def table=tables[0]
+        initForm(table)
+        int firstIndex=table.getRows().size()
+        for(int i=0;i<infoList.size();i++){
+            table.createRow()
+        }
+        for(int i=0;i<infoList.size();i++){
+            def cells = table.getRow(firstIndex + i).getTableCells()
+            cells[0].text="${infoList[i].course.id}"
+            cells[1].text=infoList[i].course.name
+            if(infoList[i].course.type== CourseConstant.COMPULSORY){
+                cells[2].text="必修"
+            }else{
+                cells[2].text="选修"
+            }
+            cells[3].text="${infoList[i].course.credit}"
+            cells[4].text="${infoList[i].count}"
+            cells[5].text="${infoList[i].actualCount}"
+            cells[6].text="${infoList[i].rate*100}%"
+            for(cell in cells){
+                setCellCenter(cell)
+            }
+        }
+        File file=new File(outputFilename)
+        FileOutputStream fos=new FileOutputStream(file)
+        document.write(fos)
+        fos.close()
+    }
+
+
+
     private static void replaceMarkedText(XWPFDocument document,Map<String,String> replaceMap){
         List<XWPFParagraph> paragraphs= document.getParagraphs();
         for(XWPFParagraph paragraph:paragraphs){

+ 5 - 0
final-timetable/src/main/java/org/brynhild/graduation/timetable/service/ITimeTableService.groovy

@@ -7,6 +7,7 @@ import org.brynhild.graduation.transfer.timetable.vo.AdminModifyTimeTable
 import org.brynhild.graduation.transfer.timetable.vo.AdminQueryClassStatistic
 import org.brynhild.graduation.transfer.timetable.vo.AdminQueryStudentStatistic
 import org.brynhild.graduation.transfer.timetable.vo.QueryTeachingClassRequest
+import org.brynhild.graduation.transfer.timetable.vo.QueryTeachingCourseStatisticRequest
 import org.brynhild.graduation.transfer.timetable.vo.QueryTimeTableRequest
 
 interface ITimeTableService {
@@ -28,4 +29,8 @@ interface ITimeTableService {
     Result generateStudentStatistic(AdminQueryStudentStatistic info, String token)
 
     Result queryTeachingClass(QueryTeachingClassRequest request)
+
+    Result queryTeachingCourseStatistic(QueryTeachingCourseStatisticRequest request)
+
+    Result generateTeachingCourseStatistic(QueryTeachingCourseStatisticRequest request)
 }

+ 79 - 0
final-timetable/src/main/java/org/brynhild/graduation/timetable/service/impl/TimeTableServiceImpl.groovy

@@ -26,6 +26,7 @@ import org.brynhild.graduation.timetable.factory.SpecificationFactory
 import org.brynhild.graduation.timetable.service.ITimeTableService
 import org.brynhild.graduation.transfer.file.dto.FileInfo
 import org.brynhild.graduation.transfer.timetable.bo.ClassStatisticInfo
+import org.brynhild.graduation.transfer.timetable.bo.CourseStatisticInfo
 import org.brynhild.graduation.transfer.timetable.bo.StudentStatisticInfo
 import org.brynhild.graduation.transfer.timetable.vo.AdminAddTimeTable
 import org.brynhild.graduation.transfer.timetable.vo.AdminDeleteTimeTable
@@ -33,6 +34,7 @@ import org.brynhild.graduation.transfer.timetable.vo.AdminModifyTimeTable
 import org.brynhild.graduation.transfer.timetable.vo.AdminQueryClassStatistic
 import org.brynhild.graduation.transfer.timetable.vo.AdminQueryStudentStatistic
 import org.brynhild.graduation.transfer.timetable.vo.QueryTeachingClassRequest
+import org.brynhild.graduation.transfer.timetable.vo.QueryTeachingCourseStatisticRequest
 import org.brynhild.graduation.transfer.timetable.vo.QueryTimeTableRequest
 import org.brynhild.graduation.transfer.view.ViewConvertor
 import org.springframework.beans.factory.annotation.Autowired
@@ -307,6 +309,83 @@ class TimeTableServiceImpl implements ITimeTableService {
         return new Result(true,"查询成功",classes)
     }
 
+    private List<CourseStatisticInfo> getTeachingCourseStatistic(QueryTeachingCourseStatisticRequest request){
+        def timeTableByClass = tableRepository.findTimeTableByTeacher(request.id)
+        def courseMap=new HashMap<Long, Course>()
+        def countMap=new HashMap<Long,Long>()
+        def actualCountMap=new HashMap<Long,Long>()
+
+        def courseIdSet = timeTableByClass.stream().map { it.courseId }.collect(Collectors.toSet())
+        for(courseId in courseIdSet){
+            courseRepository.findById(courseId).ifPresent {courseMap.put(courseId,it)}
+        }
+        timeTableByClass.stream().forEach {
+            countMap.computeIfAbsent(it.courseId,i->0L)
+            countMap.put(it.courseId,countMap.get(it.courseId)+1)
+        }
+        List<CourseStatisticInfo> infoList=new ArrayList<>()
+
+        for(timetable in timeTableByClass){
+            def startSignInTime=timetable.getStartSignInTime()
+            def endSignInTime = timetable.getEndSignInTime()
+
+            def startSignOutTime=timetable.getStartSignOutTime()
+            def endSignOutTime=timetable.getEndSignOutTime()
+
+            println "${startSignInTime}----${endSignInTime}"
+            println "${startSignOutTime}----${endSignOutTime}"
+
+            def listOfRecords = signInRecordRepository.findSignInRecordByTimeBetweenAndAreaId(startSignInTime, endSignInTime, timetable.areaId)
+            def signIn = listOfRecords.stream().map { it.userId }.collect(Collectors.toSet())
+            listOfRecords=signInRecordRepository.findSignInRecordByTimeBetweenAndAreaId(timetable.startSignOutTime,timetable.endSignOutTime,timetable.areaId)
+            def signOut = listOfRecords.stream().map { it.userId }.collect(Collectors.toSet())
+            signIn.retainAll(signOut)
+
+            actualCountMap.computeIfAbsent(timetable.courseId,i->0L)
+            actualCountMap.put(timetable.courseId,actualCountMap.get(timetable.courseId)+signIn.size())
+        }
+
+        for(course in courseMap.values()){
+            infoList.add(new CourseStatisticInfo(course,countMap.get(course.id),actualCountMap.getOrDefault(course.id,0L)))
+        }
+
+        infoList=infoList.sort()
+        return infoList
+    }
+
+    @Override
+    Result queryTeachingCourseStatistic(QueryTeachingCourseStatisticRequest request) {
+        def optional = userRepository.findById(request.id)
+        if(optional.isEmpty()){
+            return new Result(false,"用户不存在")
+        }
+        return new Result(true,"查询成功",getTeachingCourseStatistic(request))
+    }
+
+    @Override
+    Result generateTeachingCourseStatistic(QueryTeachingCourseStatisticRequest request) {
+        def optional = userRepository.findById(request.id)
+        if(optional.isEmpty()){
+            return new Result(false,"用户不存在")
+        }
+        def user=optional.get()
+        def result=getTeachingCourseStatistic(request)
+        def filename="docOutput/teaching-class-${request.id}.docx"
+        def map=new HashMap<String,String>()
+        map.put("title","${user.name}教学课程")
+        WordExecutor.generateTeachingCourseStatisticReport(filename,result ,map)
+        def localFile=new LocalFile();
+        localFile.path="teaching-class-${request.id}.docx"
+        cosJavaRepository.addUploadFileTaskSync(new File(filename),localFile)
+
+        FileInfo fileInfo = new FileInfo();
+        fileInfo.setPath(config.getRedirectPath() + localFile.getPath());
+        def list=new ArrayList<FileInfo>()
+        list.add(fileInfo)
+
+        return new Result(true,"生成成功",list)
+    }
+
     @Autowired
     @Resource
     void setConfig(CosConfig config) {

+ 27 - 0
final-transfer/src/main/java/org/brynhild/graduation/transfer/timetable/bo/CourseStatisticInfo.java

@@ -0,0 +1,27 @@
+package org.brynhild.graduation.transfer.timetable.bo;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.brynhild.graduation.persistence.timetable.entity.Course;
+
+@Data
+@NoArgsConstructor
+public class CourseStatisticInfo implements Comparable<CourseStatisticInfo>{
+    private Course course;
+    private Long count;
+    private Long actualCount;
+
+    public CourseStatisticInfo(Course course, Long count, Long actualCount) {
+        this.course = course;
+        this.count = count;
+        this.actualCount = actualCount;
+        rate=1.0*actualCount/count;
+    }
+
+    private Double rate;
+
+    @Override
+    public int compareTo(CourseStatisticInfo o) {
+        return rate.compareTo(o.rate);
+    }
+}

+ 11 - 0
final-transfer/src/main/java/org/brynhild/graduation/transfer/timetable/vo/QueryTeachingCourseStatisticRequest.java

@@ -0,0 +1,11 @@
+package org.brynhild.graduation.transfer.timetable.vo;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class QueryTeachingCourseStatisticRequest {
+    @NotNull
+    private Long id;
+}