Selaa lähdekoodia

学生总数统计

xiatian 5 vuotta sitten
vanhempi
commit
c53c0748e8
16 muutettua tiedostoa jossa 783 lisäystä ja 400 poistoa
  1. 32 0
      examcloud-core-reports-api-provider/src/main/java/cn/com/qmth/examcloud/core/reports/api/controller/ExamDataController.java
  2. 11 19
      examcloud-core-reports-api-provider/src/main/java/cn/com/qmth/examcloud/core/reports/api/controller/ExamStudentCountController.java
  3. 37 0
      examcloud-core-reports-api-provider/src/main/java/cn/com/qmth/examcloud/core/reports/api/provider/ExamDataCloudServiceProvider.java
  4. 18 17
      examcloud-core-reports-api-provider/src/main/java/cn/com/qmth/examcloud/core/reports/api/provider/StudentTotalCountCloudServiceProvider.java
  5. 125 0
      examcloud-core-reports-base/src/main/java/cn/com/qmth/examcloud/core/reports/base/bean/ExamDataBean.java
  6. 0 84
      examcloud-core-reports-base/src/main/java/cn/com/qmth/examcloud/core/reports/base/bean/ExamStudentCountBean.java
  7. 12 0
      examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/ExamDataRepo.java
  8. 14 13
      examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/StudentCountRepo.java
  9. 8 7
      examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/StudentTotalCountRepo.java
  10. 108 0
      examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/entity/ExamDataEntity.java
  11. 12 0
      examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/ExamDataService.java
  12. 4 6
      examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/ExamStudentCountService.java
  13. 5 3
      examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/StudentTotalCountService.java
  14. 176 0
      examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/impl/ExamDataServiceImpl.java
  15. 47 109
      examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/impl/ExamStudentCountServiceImpl.java
  16. 174 142
      examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/impl/StudentTotalCountServiceImpl.java

+ 32 - 0
examcloud-core-reports-api-provider/src/main/java/cn/com/qmth/examcloud/core/reports/api/controller/ExamDataController.java

@@ -0,0 +1,32 @@
+package cn.com.qmth.examcloud.core.reports.api.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.com.qmth.examcloud.api.commons.exchange.PageInfo;
+import cn.com.qmth.examcloud.core.reports.base.bean.ExamDataBean;
+import cn.com.qmth.examcloud.core.reports.service.ExamDataService;
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+
+@RestController
+@Api(tags = "考试数据")
+@RequestMapping("${$rmp.ctr.reports}/" + "examData")
+public class ExamDataController extends ControllerSupport {
+
+    @Autowired
+    private ExamDataService examDataService;
+
+    @GetMapping("page/{pageNo}/{pageSize}")
+    @ApiOperation(value = "分页查询考试在线人数及完成情况")
+    public PageInfo<ExamDataBean> queryPage(@RequestParam Long rootOrgId,
+            @PathVariable @ApiParam(value = "pageNo = 1,2,3...") Integer pageNo, @PathVariable Integer pageSize) {
+        return examDataService.queryPage(rootOrgId, pageNo, pageSize);
+    }
+}

+ 11 - 19
examcloud-core-reports-api-provider/src/main/java/cn/com/qmth/examcloud/core/reports/api/controller/ExamStudentCountController.java

@@ -2,37 +2,29 @@ package cn.com.qmth.examcloud.core.reports.api.controller;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
-import cn.com.qmth.examcloud.api.commons.exchange.PageInfo;
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
-import cn.com.qmth.examcloud.core.reports.base.bean.ExamStudentCountBean;
 import cn.com.qmth.examcloud.core.reports.service.ExamStudentCountService;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
 
 @RestController
 @Api(tags = "考生在线人数")
 @RequestMapping("${$rmp.ctr.reports}/" + "examStudentCount")
 public class ExamStudentCountController extends ControllerSupport {
-	@Autowired
-	private ExamStudentCountService examStudentCountService;
-	
-	@GetMapping("/getOnlineCount")
-	@ApiOperation(value = "获取在线人数")
-	public Long getOnlineCount(@RequestParam(required = false) Long orgId,@RequestParam(required = false) Long examId) {
-		User user = getAccessUser();
-		return examStudentCountService.getOnlineCount(user.getRootOrgId(), orgId,examId);
-	}
-	@GetMapping("page/{pageNo}/{pageSize}")
-	@ApiOperation(value = "分页查询考生在线人数及完成情况")
-	public PageInfo<ExamStudentCountBean> queryPage(@RequestParam Long rootOrgId,
-			@PathVariable @ApiParam(value = "pageNo = 1,2,3...") Integer pageNo, @PathVariable Integer pageSize) {
-		return examStudentCountService.queryPage(rootOrgId, pageNo, pageSize);
-	}
+
+    @Autowired
+    private ExamStudentCountService examStudentCountService;
+
+    @GetMapping("/getOnlineCount")
+    @ApiOperation(value = "获取在线人数")
+    public Long getOnlineCount(@RequestParam(required = false) Long orgId,
+            @RequestParam(required = false) Long examId) {
+        User user = getAccessUser();
+        return examStudentCountService.getOnlineCount(user.getRootOrgId(), orgId, examId);
+    }
 }

+ 37 - 0
examcloud-core-reports-api-provider/src/main/java/cn/com/qmth/examcloud/core/reports/api/provider/ExamDataCloudServiceProvider.java

@@ -0,0 +1,37 @@
+package cn.com.qmth.examcloud.core.reports.api.provider;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.com.qmth.examcloud.core.reports.api.ExamDataCloudService;
+import cn.com.qmth.examcloud.core.reports.api.request.SaveExamDataReq;
+import cn.com.qmth.examcloud.core.reports.api.response.SaveExamDataResp;
+import cn.com.qmth.examcloud.core.reports.service.ExamDataService;
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+@RestController
+@Api(tags = "考试数据接口")
+@RequestMapping("${$rmp.cloud.reports}" + "examData")
+public class ExamDataCloudServiceProvider extends ControllerSupport implements ExamDataCloudService {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 4065377147777658448L;
+
+    @Autowired
+    private ExamDataService examDataService;
+
+    @ApiOperation(value = "保存考试数据")
+    @PostMapping("/save")
+    @Override
+    public SaveExamDataResp save(@RequestBody SaveExamDataReq req) {
+        examDataService.save(req);
+        return new SaveExamDataResp();
+    }
+}

+ 18 - 17
examcloud-core-reports-api-provider/src/main/java/cn/com/qmth/examcloud/core/reports/api/provider/StudentTotalCountCloudServiceProvider.java

@@ -2,35 +2,36 @@ package cn.com.qmth.examcloud.core.reports.api.provider;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import cn.com.qmth.examcloud.core.reports.api.StudentTotalCountCloudService;
-import cn.com.qmth.examcloud.core.reports.api.response.StudentTotalCountResp;
-import cn.com.qmth.examcloud.core.reports.service.StudentCountService;
+import cn.com.qmth.examcloud.core.reports.api.request.SaveStudentTotalCountReq;
+import cn.com.qmth.examcloud.core.reports.api.response.SaveStudentTotalCountResp;
+import cn.com.qmth.examcloud.core.reports.service.StudentTotalCountService;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
 @RestController
 @Api(tags = "学生总人数接口")
-@RequestMapping("${$rmp.cloud.reports}"+"studentTotalCount")
+@RequestMapping("${$rmp.cloud.reports}" + "studentTotalCount")
 public class StudentTotalCountCloudServiceProvider extends ControllerSupport implements StudentTotalCountCloudService {
 
-	
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 3112398369884979088L;
-	@Autowired
-	private StudentCountService studentCountService;
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 3112398369884979088L;
 
+    @Autowired
+    private StudentTotalCountService studentTotalCountService;
 
-	@ApiOperation(value = "计算总人数")
-    @PostMapping("/compute")
-	@Override
-	public StudentTotalCountResp compute() {
-		// TODO Auto-generated method stub
-		return new StudentTotalCountResp();
-	}
+    @ApiOperation(value = "保存总人数")
+    @PostMapping("/save")
+    @Override
+    public SaveStudentTotalCountResp save(@RequestBody SaveStudentTotalCountReq req) {
+        studentTotalCountService.save(req);
+        return new SaveStudentTotalCountResp();
+    }
 }

+ 125 - 0
examcloud-core-reports-base/src/main/java/cn/com/qmth/examcloud/core/reports/base/bean/ExamDataBean.java

@@ -0,0 +1,125 @@
+package cn.com.qmth.examcloud.core.reports.base.bean;
+
+import java.util.Date;
+
+import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
+import io.swagger.annotations.ApiModelProperty;
+
+public class ExamDataBean implements JsonSerializable {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 3392394929374130898L;
+
+    @ApiModelProperty(value = "考试名称")
+    private Long rootOrgId;
+
+    @ApiModelProperty(value = "考试名称")
+    private String examName;
+
+    @ApiModelProperty(value = "考试类型")
+    private String examType;
+
+    @ApiModelProperty(value = "考试开始时间")
+    private Date examStartDate;
+
+    @ApiModelProperty(value = "考试结束时间")
+    private Date examEndDate;
+
+    @ApiModelProperty(value = "在线人数")
+    private Integer onlineCount;
+
+    @ApiModelProperty(value = "计划人数")
+    private Integer planCount;
+
+    @ApiModelProperty(value = "完成人数")
+    private Integer completeCount;
+
+    @ApiModelProperty(value = "完成率")
+    private Double completeRatio;
+
+    @ApiModelProperty(value = "考试ID")
+    private Long examId;
+
+    public Long getRootOrgId() {
+        return rootOrgId;
+    }
+
+    public void setRootOrgId(Long rootOrgId) {
+        this.rootOrgId = rootOrgId;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public String getExamType() {
+        return examType;
+    }
+
+    public void setExamType(String examType) {
+        this.examType = examType;
+    }
+
+    public Date getExamStartDate() {
+        return examStartDate;
+    }
+
+    public void setExamStartDate(Date examStartDate) {
+        this.examStartDate = examStartDate;
+    }
+
+    public Date getExamEndDate() {
+        return examEndDate;
+    }
+
+    public void setExamEndDate(Date examEndDate) {
+        this.examEndDate = examEndDate;
+    }
+
+    public Integer getOnlineCount() {
+        return onlineCount;
+    }
+
+    public void setOnlineCount(Integer onlineCount) {
+        this.onlineCount = onlineCount;
+    }
+
+    public Integer getPlanCount() {
+        return planCount;
+    }
+
+    public void setPlanCount(Integer planCount) {
+        this.planCount = planCount;
+    }
+
+    public Integer getCompleteCount() {
+        return completeCount;
+    }
+
+    public void setCompleteCount(Integer completeCount) {
+        this.completeCount = completeCount;
+    }
+
+    public Double getCompleteRatio() {
+        return completeRatio;
+    }
+
+    public void setCompleteRatio(Double completeRatio) {
+        this.completeRatio = completeRatio;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+}

+ 0 - 84
examcloud-core-reports-base/src/main/java/cn/com/qmth/examcloud/core/reports/base/bean/ExamStudentCountBean.java

@@ -1,84 +0,0 @@
-package cn.com.qmth.examcloud.core.reports.base.bean;
-
-import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
-import io.swagger.annotations.ApiModelProperty;
-
-public class ExamStudentCountBean implements JsonSerializable {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 3392394929374130898L;
-	@ApiModelProperty(value = "考试名称")
-	private String examName;
-	@ApiModelProperty(value = "考试类型")
-	private String examType;
-	@ApiModelProperty(value = "考试开始时间")
-	private String examStartDate;
-	@ApiModelProperty(value = "考试结束时间")
-	private String examEndDate;
-	@ApiModelProperty(value = "在线人数")
-	private Integer onlineCount;
-	@ApiModelProperty(value = "计划人数")
-	private long totalCount;
-	@ApiModelProperty(value = "完成人数")
-	private long completeCount;
-	@ApiModelProperty(value = "完成率")
-	private long completeRatio;
-	private Long examId;
-	public String getExamName() {
-		return examName;
-	}
-	public void setExamName(String examName) {
-		this.examName = examName;
-	}
-	public String getExamType() {
-		return examType;
-	}
-	public void setExamType(String examType) {
-		this.examType = examType;
-	}
-	public String getExamStartDate() {
-		return examStartDate;
-	}
-	public void setExamStartDate(String examStartDate) {
-		this.examStartDate = examStartDate;
-	}
-	public String getExamEndDate() {
-		return examEndDate;
-	}
-	public void setExamEndDate(String examEndDate) {
-		this.examEndDate = examEndDate;
-	}
-	public Integer getOnlineCount() {
-		return onlineCount;
-	}
-	public void setOnlineCount(Integer onlineCount) {
-		this.onlineCount = onlineCount;
-	}
-	public long getTotalCount() {
-		return totalCount;
-	}
-	public void setTotalCount(long totalCount) {
-		this.totalCount = totalCount;
-	}
-	public long getCompleteCount() {
-		return completeCount;
-	}
-	public void setCompleteCount(long completeCount) {
-		this.completeCount = completeCount;
-	}
-	public long getCompleteRatio() {
-		return completeRatio;
-	}
-	public void setCompleteRatio(long completeRatio) {
-		this.completeRatio = completeRatio;
-	}
-	public Long getExamId() {
-		return examId;
-	}
-	public void setExamId(Long examId) {
-		this.examId = examId;
-	}
-
-}

+ 12 - 0
examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/ExamDataRepo.java

@@ -0,0 +1,12 @@
+package cn.com.qmth.examcloud.core.reports.dao;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import cn.com.qmth.examcloud.core.reports.dao.entity.ExamDataEntity;
+
+public interface ExamDataRepo extends JpaRepository<ExamDataEntity, Long>, JpaSpecificationExecutor<ExamDataEntity> {
+
+    public ExamDataEntity findByRootOrgIdAndExamId(Long rootOrgId, Long examId);
+
+}

+ 14 - 13
examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/StudentCountRepo.java

@@ -9,17 +9,18 @@ import org.springframework.data.jpa.repository.Query;
 
 import cn.com.qmth.examcloud.core.reports.dao.entity.StudentCountEntity;
 
-public interface StudentCountRepo extends JpaRepository<StudentCountEntity, Long>,
-		JpaSpecificationExecutor<StudentCountEntity> {
-	public StudentCountEntity findByRootOrgId(Long rootOrgId);
-	
-	@Modifying
-	@Query(value = "update ec_r_student_count set online_count=0", nativeQuery = true)
-	public void resetAllCount();
-	
-	@Query(value = "select * from ec_r_student_count where root_org_id in(?1)", nativeQuery = true)
-	public List<StudentCountEntity> getCountByRootOrgIds(List<Long> rootOrgIds);
-	
-	@Query(value = "select sum(online_count) from ec_r_student_count", nativeQuery = true)
-	public long getSumOnlineCount();
+public interface StudentCountRepo
+        extends JpaRepository<StudentCountEntity, Long>, JpaSpecificationExecutor<StudentCountEntity> {
+
+    public StudentCountEntity findByRootOrgId(Long rootOrgId);
+
+    @Modifying
+    @Query(value = "update ec_r_student_count set online_count=0", nativeQuery = true)
+    public void resetAllCount();
+
+    @Query(value = "select * from ec_r_student_count where root_org_id in(?1)", nativeQuery = true)
+    public List<StudentCountEntity> getCountByRootOrgIds(List<Long> rootOrgIds);
+
+    @Query(value = "select sum(online_count) from ec_r_student_count", nativeQuery = true)
+    public Long getSumOnlineCount();
 }

+ 8 - 7
examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/StudentTotalCountRepo.java

@@ -6,11 +6,12 @@ import org.springframework.data.jpa.repository.Query;
 
 import cn.com.qmth.examcloud.core.reports.dao.entity.StudentTotalCountEntity;
 
-public interface StudentTotalCountRepo extends JpaRepository<StudentTotalCountEntity, Long>,
-		JpaSpecificationExecutor<StudentTotalCountEntity> {
-	public StudentTotalCountEntity findByRootOrgId(Long rootOrgId);
-	
-	@Query(value = "select sum(total_count) from ec_r_student_total_count", nativeQuery = true)
-	public long getSumTotalCount();
-	
+public interface StudentTotalCountRepo
+        extends JpaRepository<StudentTotalCountEntity, Long>, JpaSpecificationExecutor<StudentTotalCountEntity> {
+
+    public StudentTotalCountEntity findByRootOrgId(Long rootOrgId);
+
+    @Query(value = "select sum(total_count) from ec_r_student_total_count", nativeQuery = true)
+    public Long getSumTotalCount();
+
 }

+ 108 - 0
examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/entity/ExamDataEntity.java

@@ -0,0 +1,108 @@
+package cn.com.qmth.examcloud.core.reports.dao.entity;
+
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.Index;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+
+import cn.com.qmth.examcloud.core.reports.dao.entity.share.IdEntity;
+
+@Entity
+@Table(name = "ec_r_exam_data", indexes = {
+        @Index(name = "IDX_R_EXAM_DATA_01", columnList = "rootOrgId,examId", unique = true) })
+public class ExamDataEntity extends IdEntity {
+
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 34505670159492793L;
+
+    @NotNull
+    private Long rootOrgId;
+
+    @NotNull
+    private Long examId;
+
+    @NotNull
+    private String examName;
+
+    @NotNull
+    private String examType;
+
+    @NotNull
+    private Date startTime;
+
+    @NotNull
+    private Date endTime;
+
+    private Integer planCount;
+
+    private Integer completeCount;
+
+    public Long getRootOrgId() {
+        return rootOrgId;
+    }
+
+    public void setRootOrgId(Long rootOrgId) {
+        this.rootOrgId = rootOrgId;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public String getExamType() {
+        return examType;
+    }
+
+    public void setExamType(String examType) {
+        this.examType = examType;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getPlanCount() {
+        return planCount;
+    }
+
+    public void setPlanCount(Integer planCount) {
+        this.planCount = planCount;
+    }
+
+    public Integer getCompleteCount() {
+        return completeCount;
+    }
+
+    public void setCompleteCount(Integer completeCount) {
+        this.completeCount = completeCount;
+    }
+
+}

+ 12 - 0
examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/ExamDataService.java

@@ -0,0 +1,12 @@
+package cn.com.qmth.examcloud.core.reports.service;
+
+import cn.com.qmth.examcloud.api.commons.exchange.PageInfo;
+import cn.com.qmth.examcloud.core.reports.api.request.SaveExamDataReq;
+import cn.com.qmth.examcloud.core.reports.base.bean.ExamDataBean;
+
+public interface ExamDataService {
+
+    public PageInfo<ExamDataBean> queryPage(Long rootOrgId, Integer pageNo, Integer pageSize);
+
+    public void save(SaveExamDataReq req);
+}

+ 4 - 6
examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/ExamStudentCountService.java

@@ -1,10 +1,8 @@
 package cn.com.qmth.examcloud.core.reports.service;
 
-import cn.com.qmth.examcloud.api.commons.exchange.PageInfo;
-import cn.com.qmth.examcloud.core.reports.base.bean.ExamStudentCountBean;
-
 public interface ExamStudentCountService {
-	public void saveCount();
-	public Long getOnlineCount(Long rootOrgId,Long orgId,Long examId);
-	public PageInfo<ExamStudentCountBean> queryPage(Long rootOrgId, Integer pageNo, Integer pageSize);
+
+    public void saveCount();
+
+    public Long getOnlineCount(Long rootOrgId, Long orgId, Long examId);
 }

+ 5 - 3
examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/StudentTotalCountService.java

@@ -1,12 +1,14 @@
 package cn.com.qmth.examcloud.core.reports.service;
 
 import cn.com.qmth.examcloud.api.commons.exchange.PageInfo;
+import cn.com.qmth.examcloud.core.reports.api.request.SaveStudentTotalCountReq;
 import cn.com.qmth.examcloud.core.reports.base.bean.StudentCountBean;
 
 public interface StudentTotalCountService {
-	public void compute();
 
-	public Long getSumTotalCount();
+    public Long getSumTotalCount();
 
-	public PageInfo<StudentCountBean> queryPage(String rootOrgId, Integer pageNo, Integer pageSize);
+    public PageInfo<StudentCountBean> queryPage(String rootOrgId, Integer pageNo, Integer pageSize);
+
+    public void save(SaveStudentTotalCountReq req);
 }

+ 176 - 0
examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/impl/ExamDataServiceImpl.java

@@ -0,0 +1,176 @@
+package cn.com.qmth.examcloud.core.reports.service.impl;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.persistence.criteria.Predicate;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.google.common.collect.Lists;
+
+import cn.com.qmth.examcloud.api.commons.exchange.PageInfo;
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.core.reports.api.request.SaveExamDataReq;
+import cn.com.qmth.examcloud.core.reports.base.bean.ExamDataBean;
+import cn.com.qmth.examcloud.core.reports.dao.ExamDataRepo;
+import cn.com.qmth.examcloud.core.reports.dao.ExamStudentCountRepo;
+import cn.com.qmth.examcloud.core.reports.dao.entity.ExamDataEntity;
+import cn.com.qmth.examcloud.core.reports.dao.entity.ExamStudentCountEntity;
+import cn.com.qmth.examcloud.core.reports.service.ExamDataService;
+
+@Service
+public class ExamDataServiceImpl implements ExamDataService {
+
+    @Autowired
+    private ExamDataRepo examDataRepo;
+
+    @Autowired
+    private ExamStudentCountRepo examStudentCountRepo;
+
+    @Override
+    public PageInfo<ExamDataBean> queryPage(Long rootOrgId, Integer pageNo, Integer pageSize) {
+        Specification<ExamDataEntity> specification = (root, query, cb) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            if (null != rootOrgId) {
+                predicates.add(cb.equal(root.get("rootOrgId"), rootOrgId));
+            }
+
+            return cb.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+
+        List<ExamDataEntity> es = examDataRepo.findAll(specification);
+
+        List<ExamDataBean> ret = Lists.newArrayList();
+
+        for (ExamDataEntity cur : es) {
+            ExamDataBean bean = new ExamDataBean();
+            bean.setPlanCount(cur.getPlanCount());
+            bean.setCompleteCount(cur.getCompleteCount());
+            bean.setCompleteRatio(getPercentage(bean.getCompleteCount(), bean.getPlanCount()));
+            bean.setExamEndDate(cur.getEndTime());
+            bean.setExamStartDate(cur.getStartTime());
+            bean.setExamId(cur.getExamId());
+            bean.setExamName(cur.getExamName());
+            bean.setExamType(cur.getExamType());
+            bean.setRootOrgId(cur.getRootOrgId());
+            bean.setOnlineCount(0);
+            ret.add(bean);
+        }
+        fillOnlineCount(ret, rootOrgId);
+        Collections.sort(ret, new Comparator<ExamDataBean>() {
+
+            @Override
+            public int compare(ExamDataBean o1, ExamDataBean o2) {
+                if (o1.getOnlineCount() > o2.getOnlineCount()) {
+                    return -1;
+                } else if (o1.getOnlineCount() < o2.getOnlineCount()) {
+                    return 1;
+                } else {
+                    return 0;
+                }
+            }
+
+        });
+        int total = ret.size();
+        ret = ret.stream().skip((pageNo - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
+        PageInfo<ExamDataBean> pi = new PageInfo<ExamDataBean>();
+        pi.setLimit(pageSize);
+        pi.setList(ret);
+        pi.setPages(pageNo);
+        pi.setTotal(total);
+        return pi;
+    }
+
+    private Double getPercentage(Integer a, Integer b) {
+        if (a == null) {
+            a = 0;
+        }
+        if (b == null) {
+            return null;
+        }
+        if (b == 0) {
+            return null;
+        }
+        Double da = Double.valueOf(a);
+        Double db = Double.valueOf(b);
+        BigDecimal bd = new BigDecimal(da * 100 / db);
+        Double tem = bd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+        return tem;
+    }
+
+    private void fillOnlineCount(List<ExamDataBean> ret, Long rootOrgId) {
+        if (CollectionUtils.isEmpty(ret)) {
+            return;
+        }
+        List<Long> temList = ret.stream().map(str -> str.getExamId()).collect(Collectors.toList());
+        List<ExamStudentCountEntity> sl = examStudentCountRepo.getByExamIdsRootOrgId(temList, rootOrgId);
+        if (CollectionUtils.isEmpty(sl)) {
+            return;
+        }
+        Map<Long, Integer> map = sl.stream().collect(Collectors.toMap(ExamStudentCountEntity::getExamId,
+                account -> account.getOnlineCount(), (key1, key2) -> key2));
+        for (ExamDataBean b : ret) {
+            if (map.get(b.getExamId()) != null) {
+                b.setOnlineCount(map.get(b.getExamId()));
+            }
+        }
+    }
+
+    @Transactional
+    @Override
+    public void save(SaveExamDataReq req) {
+        Long rootOrgId = req.getRootOrgId();
+        Integer planCount = req.getPlanCount();
+        Integer completeCount = req.getCompleteCount();
+        Date endTime = req.getEndTime();
+        Date startTime = req.getStartTime();
+        Long examId = req.getExamId();
+        String examName = req.getExamName();
+        String examType = req.getExamType();
+        if (planCount == null) {
+            planCount = 0;
+        }
+        if (completeCount == null) {
+            completeCount = 0;
+        }
+        if (rootOrgId == null) {
+            throw new StatusException("1000001", "rootOrgId不能为空");
+        }
+        if (examId == null) {
+            throw new StatusException("1000002", "examId不能为空");
+        }
+        if (examName == null) {
+            throw new StatusException("1000003", "examName不能为空");
+        }
+        if (examType == null) {
+            throw new StatusException("1000004", "examType不能为空");
+        }
+        ExamDataEntity ed = examDataRepo.findByRootOrgIdAndExamId(rootOrgId, examId);
+        if (ed == null) {
+            Date now = new Date();
+            ed = new ExamDataEntity();
+            ed.setEndTime(endTime);
+            ed.setStartTime(startTime);
+            ed.setExamId(examId);
+            ed.setExamName(examName);
+            ed.setExamType(examType);
+            ed.setRootOrgId(rootOrgId);
+            ed.setCreationTime(now);
+            ed.setUpdateTime(now);
+        }
+        ed.setPlanCount(planCount.intValue());
+        ed.setCompleteCount(completeCount.intValue());
+        examDataRepo.save(ed);
+    }
+}

+ 47 - 109
examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/impl/ExamStudentCountServiceImpl.java

@@ -1,25 +1,13 @@
 package cn.com.qmth.examcloud.core.reports.service.impl;
 
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
 
-import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import com.google.common.collect.Lists;
-
-import cn.com.qmth.examcloud.api.commons.exchange.PageInfo;
-import cn.com.qmth.examcloud.core.oe.admin.api.ExamStatisticsCloudService;
-import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamCompletionBean;
-import cn.com.qmth.examcloud.core.oe.admin.api.request.GetExamCompletionStatisticsReq;
-import cn.com.qmth.examcloud.core.oe.admin.api.response.GetExamCompletionStatisticsResp;
-import cn.com.qmth.examcloud.core.reports.base.bean.ExamStudentCountBean;
 import cn.com.qmth.examcloud.core.reports.base.util.online.ActiveDataUtil;
 import cn.com.qmth.examcloud.core.reports.base.util.online.OnlineCount;
 import cn.com.qmth.examcloud.core.reports.dao.ExamStudentCountRepo;
@@ -28,104 +16,54 @@ import cn.com.qmth.examcloud.core.reports.service.ExamStudentCountService;
 
 @Service
 public class ExamStudentCountServiceImpl implements ExamStudentCountService {
-	@Autowired
-	private ExamStudentCountRepo examStudentCountRepo;
-	@Autowired
-	private JdbcTemplate jdbcTemplate;
-	@Autowired
-	private ExamStatisticsCloudService examStatisticsCloudService;
 
-	@Override
-	public Long getOnlineCount(Long rootOrgId, Long orgId, Long examId) {
-		StringBuffer sb = new StringBuffer();
-		sb.append(" select sum(t.online_count) from ec_r_exam_student_count t where t.root_org_id=").append(rootOrgId);
-		if (orgId != null) {
-			sb.append(" and t.org_id=").append(orgId);
-		}
-		if (examId != null) {
-			sb.append(" and t.exam_id=").append(examId);
-		}
-		Long count = jdbcTemplate.queryForObject(sb.toString(), Long.class);
-		if (count == null) {
-			count = 0l;
-		}
-		return count;
-	}
+    @Autowired
+    private ExamStudentCountRepo examStudentCountRepo;
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @Override
+    public Long getOnlineCount(Long rootOrgId, Long orgId, Long examId) {
+        StringBuffer sb = new StringBuffer();
+        sb.append(" select sum(t.online_count) from ec_r_exam_student_count t where t.root_org_id=").append(rootOrgId);
+        if (orgId != null) {
+            sb.append(" and t.org_id=").append(orgId);
+        }
+        if (examId != null) {
+            sb.append(" and t.exam_id=").append(examId);
+        }
+        Long count = jdbcTemplate.queryForObject(sb.toString(), Long.class);
+        if (count == null) {
+            count = 0l;
+        }
+        return count;
+    }
+
+    @Transactional
+    @Override
+    public synchronized void saveCount() {
+        examStudentCountRepo.resetAllCount();
+        List<OnlineCount> ret = ActiveDataUtil.getExamStudentCount(null);
+        if (ret != null) {
+            for (OnlineCount oc : ret) {
+                addOrUpdateCount(oc);
+            }
+        }
+    }
 
-	@Transactional
-	@Override
-	public synchronized void  saveCount() {
-		examStudentCountRepo.resetAllCount();
-		List<OnlineCount> ret=ActiveDataUtil.getExamStudentCount(null);
-		if(ret!=null) {
-			for(OnlineCount oc:ret) {
-				addOrUpdateCount(oc);
-			}
-		}
-	}
-	
-	private void addOrUpdateCount(OnlineCount oc) {
-		ExamStudentCountEntity e = examStudentCountRepo.findByRootOrgIdAndExamId(oc.getRootOrgId(),oc.getExamId());
-		if (e == null) {
-			e = new ExamStudentCountEntity();
-			e.setRootOrgId(oc.getRootOrgId());
-			e.setExamId(oc.getExamId());
-			Date now=new Date();
-			e.setCreationTime(now);
-			e.setUpdateTime(now);
-		}
-		e.setOnlineCount(oc.getOnlineCount());
-		examStudentCountRepo.save(e);
-	}
+    private void addOrUpdateCount(OnlineCount oc) {
+        ExamStudentCountEntity e = examStudentCountRepo.findByRootOrgIdAndExamId(oc.getRootOrgId(), oc.getExamId());
+        if (e == null) {
+            e = new ExamStudentCountEntity();
+            e.setRootOrgId(oc.getRootOrgId());
+            e.setExamId(oc.getExamId());
+            Date now = new Date();
+            e.setCreationTime(now);
+            e.setUpdateTime(now);
+        }
+        e.setOnlineCount(oc.getOnlineCount());
+        examStudentCountRepo.save(e);
+    }
 
-	@Override
-	public PageInfo<ExamStudentCountBean> queryPage(Long rootOrgId, Integer pageNo, Integer pageSize) {
-		GetExamCompletionStatisticsReq req=new GetExamCompletionStatisticsReq();
-		req.setRootOrgId(rootOrgId);
-		req.setPageNo(pageNo);
-		req.setPageSize(pageSize);	
-		GetExamCompletionStatisticsResp rep=examStatisticsCloudService.getExamCompletionStatistics(req);
-		PageInfo<ExamCompletionBean> pi=rep.getPagedExamCompletionList();
-		PageInfo<ExamStudentCountBean> ret=new PageInfo<ExamStudentCountBean>();
-		ret.setIndex(pi.getIndex());
-		ret.setLimit(pi.getLimit());
-		ret.setPages(pi.getPages());
-		ret.setSize(pi.getSize());
-		ret.setTotal(pi.getTotal());
-		if(pi.getList()==null||pi.getList().size()==0) {
-			ret.setList(Lists.newArrayList());
-		}else {
-			List<ExamStudentCountBean> li=new ArrayList<ExamStudentCountBean>();
-			for(ExamCompletionBean cb:pi.getList()) {
-				ExamStudentCountBean sc=new ExamStudentCountBean();
-				sc.setCompleteCount(cb.getCompleteNum());
-				sc.setCompleteRatio(cb.getCompletePercent());
-				sc.setExamEndDate(cb.getEndTime());
-				sc.setExamName(cb.getExamName());
-				sc.setExamStartDate(cb.getStartTime());
-				sc.setExamType(cb.getExamType());
-				sc.setTotalCount(cb.getPlanNum());
-				li.add(sc);
-			}
-			fillOnExamCount(li,rootOrgId);
-		}
-		return ret;
-	}
-	private void fillOnExamCount(List<ExamStudentCountBean> ret,Long rootOrgId) {
-		if (CollectionUtils.isEmpty(ret)) {
-			return;
-		}
-		List<Long> temList = ret.stream().map(str -> str.getExamId()).collect(Collectors.toList());
-		List<ExamStudentCountEntity> sl = examStudentCountRepo.getByExamIdsRootOrgId(temList, rootOrgId);
-		if (CollectionUtils.isEmpty(sl)) {
-			return;
-		}
-		Map<Long, Integer> map = sl.stream().collect(Collectors.toMap(ExamStudentCountEntity::getExamId,
-				account -> account.getOnlineCount(), (key1, key2) -> key2));
-		for(ExamStudentCountBean b:ret) {
-			if(map.get(b.getExamId())!=null) {
-				b.setOnlineCount(map.get(b.getExamId()));
-			}
-		}
-	}
 }

+ 174 - 142
examcloud-core-reports-service/src/main/java/cn/com/qmth/examcloud/core/reports/service/impl/StudentTotalCountServiceImpl.java

@@ -3,6 +3,7 @@ package cn.com.qmth.examcloud.core.reports.service.impl;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -19,10 +20,12 @@ import org.springframework.transaction.annotation.Transactional;
 import com.google.common.collect.Lists;
 
 import cn.com.qmth.examcloud.api.commons.exchange.PageInfo;
+import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.basic.api.OrgCloudService;
 import cn.com.qmth.examcloud.core.basic.api.bean.OrgBean;
 import cn.com.qmth.examcloud.core.basic.api.request.GetOrgsByIdListReq;
 import cn.com.qmth.examcloud.core.basic.api.response.GetOrgsByIdListResp;
+import cn.com.qmth.examcloud.core.reports.api.request.SaveStudentTotalCountReq;
 import cn.com.qmth.examcloud.core.reports.base.bean.StudentCountBean;
 import cn.com.qmth.examcloud.core.reports.base.util.BatchGetDataUtil;
 import cn.com.qmth.examcloud.core.reports.dao.ExamStudentCountRepo;
@@ -34,146 +37,175 @@ import cn.com.qmth.examcloud.core.reports.service.StudentTotalCountService;
 
 @Service
 public class StudentTotalCountServiceImpl implements StudentTotalCountService {
-	@Autowired
-	private StudentTotalCountRepo studentTotalCountRepo;
-	@Autowired
-	private  ExamStudentCountRepo examStudentCountRepo;
-	@Autowired
-	private StudentCountService studentCountService;
-	@Autowired
-	private OrgCloudService orgCloudService;
-
-	@Transactional
-	@Override
-	public synchronized void compute() {
-		// TODO
-	}
-
-	@Override
-	public Long getSumTotalCount() {
-		return studentTotalCountRepo.getSumTotalCount();
-	}
-
-	@Override
-	public PageInfo<StudentCountBean> queryPage(String rootOrgId, Integer pageNo, Integer pageSize) {
-		Specification<StudentTotalCountEntity> specification = (root, query, cb) -> {
-			List<Predicate> predicates = new ArrayList<>();
-			if (null != rootOrgId) {
-				predicates.add(cb.equal(root.get("rootOrgId"), rootOrgId));
-			}
-
-			return cb.and(predicates.toArray(new Predicate[predicates.size()]));
-		};
-
-		List<StudentTotalCountEntity> es = studentTotalCountRepo.findAll(specification);
-
-		List<StudentCountBean> ret = Lists.newArrayList();
-
-		for (StudentTotalCountEntity cur : es) {
-			StudentCountBean bean = new StudentCountBean();
-			bean.setTotalCount(cur.getTotalCount());
-			bean.setRootOrgId(cur.getRootOrgId());
-			bean.setOnlineCount(0);
-			bean.setOnExamCount(0);
-			ret.add(bean);
-		}
-		fillOnlineCount(ret);
-		fillOnExamCount(ret);
-		fillRootOrgName(ret);
-		Collections.sort(ret, new Comparator<StudentCountBean>() {
-
-			@Override
-			public int compare(StudentCountBean o1, StudentCountBean o2) {
-				if (o1.getOnlineCount() > o2.getOnlineCount()) {
-					return -1;
-				} else if (o1.getOnlineCount() < o2.getOnlineCount()) {
-					return 1;
-				} else {
-					return 0;
-				}
-			}
-
-		});
-		int total = ret.size();
-		ret = ret.stream().skip((pageNo - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
-		PageInfo<StudentCountBean> pi=new PageInfo<StudentCountBean>();
-		pi.setLimit(pageSize);
-		pi.setList(ret);
-		pi.setPages(pageNo);
-		pi.setTotal(total);
-		return pi;
-	}
-
-	private void fillOnlineCount(List<StudentCountBean> ret) {
-		if (CollectionUtils.isEmpty(ret)) {
-			return;
-		}
-		List<Long> temList = ret.stream().map(str -> str.getRootOrgId()).collect(Collectors.toList());
-		List<StudentCountBean> sl = studentCountService.getCountByRootOrgIds(temList);
-		if (CollectionUtils.isEmpty(sl)) {
-			return;
-		}
-		Map<Long, Integer> map = sl.stream().collect(Collectors.toMap(StudentCountBean::getRootOrgId,
-				account -> account.getOnlineCount(), (key1, key2) -> key2));
-		for(StudentCountBean b:ret) {
-			if(map.get(b.getRootOrgId())!=null) {
-				b.setOnlineCount(map.get(b.getRootOrgId()));
-			}
-		}
-	}
-	private void fillOnExamCount(List<StudentCountBean> ret) {
-		if (CollectionUtils.isEmpty(ret)) {
-			return;
-		}
-		List<Long> temList = ret.stream().map(str -> str.getRootOrgId()).collect(Collectors.toList());
-		List<ExamStudentCountEntity> sl = examStudentCountRepo.getByRootOrgIds(temList);
-		if (CollectionUtils.isEmpty(sl)) {
-			return;
-		}
-		Map<Long, Integer> map = groupByRootOrg(sl);
-		for(StudentCountBean b:ret) {
-			if(map.get(b.getRootOrgId())!=null) {
-				b.setOnExamCount(map.get(b.getRootOrgId()));
-			}
-		}
-	}
-	private Map<Long, Integer> groupByRootOrg(List<ExamStudentCountEntity> sl){
-		Map<Long, Integer> map=new HashMap<Long, Integer>();
-		for(ExamStudentCountEntity s:sl) {
-			Integer c=map.get(s.getRootOrgId());
-			if(c==null) {
-				map.put(s.getRootOrgId(), s.getOnlineCount());
-			}else {
-				map.put(s.getRootOrgId(), s.getOnlineCount()+c);
-			}
-		}
-		return map;
-	}
-	private void fillRootOrgName(List<StudentCountBean> ret) {
-		if (CollectionUtils.isEmpty(ret)) {
-			return;
-		}
-		List<Long> param = ret.stream().map(str -> str.getRootOrgId()).collect(Collectors.toList());
-		List<OrgBean> retList=new ArrayList<OrgBean>();
-		GetOrgsByIdListReq req= new GetOrgsByIdListReq();
-		BatchGetDataUtil<OrgBean, Long> tool = new BatchGetDataUtil<OrgBean, Long>() {
-			@Override
-			public List<OrgBean> getData(List<Long> paramList) {
-				
-				req.setOrgIdList(paramList);
-				GetOrgsByIdListResp resp=orgCloudService.getOrgsByIdList(req);
-				return resp.getOrgList();
-			}
-
-		};
-		tool.getDataForBatch(retList, param, 100);
-		if (CollectionUtils.isEmpty(retList)) {
-			return;
-		}
-		Map<Long, String> map = retList.stream().collect(Collectors.toMap(OrgBean::getId,
-				account -> account.getName(), (key1, key2) -> key2));
-		for(StudentCountBean b:ret) {
-			b.setRootOrgName(map.get(b.getRootOrgId()));
-		}
-	}
+
+    @Autowired
+    private StudentTotalCountRepo studentTotalCountRepo;
+
+    @Autowired
+    private ExamStudentCountRepo examStudentCountRepo;
+
+    @Autowired
+    private StudentCountService studentCountService;
+
+    @Autowired
+    private OrgCloudService orgCloudService;
+
+    @Override
+    public Long getSumTotalCount() {
+        Long ret = studentTotalCountRepo.getSumTotalCount();
+        if (ret == null) {
+            ret = 0l;
+        }
+        return ret;
+    }
+
+    @Override
+    public PageInfo<StudentCountBean> queryPage(String rootOrgId, Integer pageNo, Integer pageSize) {
+        Specification<StudentTotalCountEntity> specification = (root, query, cb) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            if (null != rootOrgId) {
+                predicates.add(cb.equal(root.get("rootOrgId"), rootOrgId));
+            }
+
+            return cb.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+
+        List<StudentTotalCountEntity> es = studentTotalCountRepo.findAll(specification);
+
+        List<StudentCountBean> ret = Lists.newArrayList();
+
+        for (StudentTotalCountEntity cur : es) {
+            StudentCountBean bean = new StudentCountBean();
+            bean.setTotalCount(cur.getTotalCount());
+            bean.setRootOrgId(cur.getRootOrgId());
+            bean.setOnlineCount(0);
+            bean.setOnExamCount(0);
+            ret.add(bean);
+        }
+        fillOnlineCount(ret);
+        fillOnExamCount(ret);
+        fillRootOrgName(ret);
+        Collections.sort(ret, new Comparator<StudentCountBean>() {
+
+            @Override
+            public int compare(StudentCountBean o1, StudentCountBean o2) {
+                if (o1.getOnlineCount() > o2.getOnlineCount()) {
+                    return -1;
+                } else if (o1.getOnlineCount() < o2.getOnlineCount()) {
+                    return 1;
+                } else {
+                    return 0;
+                }
+            }
+
+        });
+        int total = ret.size();
+        ret = ret.stream().skip((pageNo - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
+        PageInfo<StudentCountBean> pi = new PageInfo<StudentCountBean>();
+        pi.setLimit(pageSize);
+        pi.setList(ret);
+        pi.setPages(pageNo);
+        pi.setTotal(total);
+        return pi;
+    }
+
+    private void fillOnlineCount(List<StudentCountBean> ret) {
+        if (CollectionUtils.isEmpty(ret)) {
+            return;
+        }
+        List<Long> temList = ret.stream().map(str -> str.getRootOrgId()).collect(Collectors.toList());
+        List<StudentCountBean> sl = studentCountService.getCountByRootOrgIds(temList);
+        if (CollectionUtils.isEmpty(sl)) {
+            return;
+        }
+        Map<Long, Integer> map = sl.stream().collect(Collectors.toMap(StudentCountBean::getRootOrgId,
+                account -> account.getOnlineCount(), (key1, key2) -> key2));
+        for (StudentCountBean b : ret) {
+            if (map.get(b.getRootOrgId()) != null) {
+                b.setOnlineCount(map.get(b.getRootOrgId()));
+            }
+        }
+    }
+
+    private void fillOnExamCount(List<StudentCountBean> ret) {
+        if (CollectionUtils.isEmpty(ret)) {
+            return;
+        }
+        List<Long> temList = ret.stream().map(str -> str.getRootOrgId()).collect(Collectors.toList());
+        List<ExamStudentCountEntity> sl = examStudentCountRepo.getByRootOrgIds(temList);
+        if (CollectionUtils.isEmpty(sl)) {
+            return;
+        }
+        Map<Long, Integer> map = groupByRootOrg(sl);
+        for (StudentCountBean b : ret) {
+            if (map.get(b.getRootOrgId()) != null) {
+                b.setOnExamCount(map.get(b.getRootOrgId()));
+            }
+        }
+    }
+
+    private Map<Long, Integer> groupByRootOrg(List<ExamStudentCountEntity> sl) {
+        Map<Long, Integer> map = new HashMap<Long, Integer>();
+        for (ExamStudentCountEntity s : sl) {
+            Integer c = map.get(s.getRootOrgId());
+            if (c == null) {
+                map.put(s.getRootOrgId(), s.getOnlineCount());
+            } else {
+                map.put(s.getRootOrgId(), s.getOnlineCount() + c);
+            }
+        }
+        return map;
+    }
+
+    private void fillRootOrgName(List<StudentCountBean> ret) {
+        if (CollectionUtils.isEmpty(ret)) {
+            return;
+        }
+        List<Long> param = ret.stream().map(str -> str.getRootOrgId()).collect(Collectors.toList());
+        List<OrgBean> retList = new ArrayList<OrgBean>();
+        GetOrgsByIdListReq req = new GetOrgsByIdListReq();
+        BatchGetDataUtil<OrgBean, Long> tool = new BatchGetDataUtil<OrgBean, Long>() {
+
+            @Override
+            public List<OrgBean> getData(List<Long> paramList) {
+
+                req.setOrgIdList(paramList);
+                GetOrgsByIdListResp resp = orgCloudService.getOrgsByIdList(req);
+                return resp.getOrgList();
+            }
+
+        };
+        tool.getDataForBatch(retList, param, 100);
+        if (CollectionUtils.isEmpty(retList)) {
+            return;
+        }
+        Map<Long, String> map = retList.stream()
+                .collect(Collectors.toMap(OrgBean::getId, account -> account.getName(), (key1, key2) -> key2));
+        for (StudentCountBean b : ret) {
+            b.setRootOrgName(map.get(b.getRootOrgId()));
+        }
+    }
+
+    @Transactional
+    @Override
+    public void save(SaveStudentTotalCountReq req) {
+        Long rootOrgId = req.getRootOrgId();
+        Integer totalCount = req.getCount();
+        if (totalCount == null) {
+            totalCount = 0;
+        }
+        if (rootOrgId == null) {
+            throw new StatusException("1000001", "rootOrgId不能为空");
+        }
+        StudentTotalCountEntity se = studentTotalCountRepo.findByRootOrgId(rootOrgId);
+        if (se == null) {
+            Date now = new Date();
+            se = new StudentTotalCountEntity();
+            se.setRootOrgId(rootOrgId);
+            se.setCreationTime(now);
+            se.setUpdateTime(now);
+        }
+        se.setTotalCount(totalCount.intValue());
+        studentTotalCountRepo.save(se);
+    }
 }