xiatian преди 5 години
родител
ревизия
017146f87e

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

@@ -2,15 +2,19 @@ package cn.com.qmth.examcloud.core.reports.api.controller;
 
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 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.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 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.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.core.reports.service.ExamStudentCountService;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 
 
 @RestController
 @RestController
 @Api(tags = "考生在线人数")
 @Api(tags = "考生在线人数")
@@ -25,4 +29,10 @@ public class ExamStudentCountController extends ControllerSupport {
 		User user = getAccessUser();
 		User user = getAccessUser();
 		return examStudentCountService.getOnlineCount(user.getRootOrgId(), orgId,examId);
 		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);
+	}
 }
 }

+ 2 - 3
examcloud-core-reports-api-provider/src/main/java/cn/com/qmth/examcloud/core/reports/api/controller/StudentTotalCountController.java

@@ -3,7 +3,6 @@ package cn.com.qmth.examcloud.core.reports.api.controller;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
@@ -23,7 +22,7 @@ public class StudentTotalCountController extends ControllerSupport {
 	@Autowired
 	@Autowired
 	private StudentTotalCountService studentTotalCountService;
 	private StudentTotalCountService studentTotalCountService;
 
 
-	@PostMapping("/getSumTotalCount")
+	@GetMapping("/getSumTotalCount")
 	@ApiOperation(value = "获取总的学生人数")
 	@ApiOperation(value = "获取总的学生人数")
 	public Long getSumTotalCount() {
 	public Long getSumTotalCount() {
 		return studentTotalCountService.getSumTotalCount();
 		return studentTotalCountService.getSumTotalCount();
@@ -31,7 +30,7 @@ public class StudentTotalCountController extends ControllerSupport {
 	
 	
 	@GetMapping("page/{pageNo}/{pageSize}")
 	@GetMapping("page/{pageNo}/{pageSize}")
 	@ApiOperation(value = "分页查询学生在线人数和总人数")
 	@ApiOperation(value = "分页查询学生在线人数和总人数")
-	public PageInfo<StudentCountBean> queryPage(@RequestParam String rootOrgId,
+	public PageInfo<StudentCountBean> queryPage(@RequestParam(required = false) String rootOrgId,
 			@PathVariable @ApiParam(value = "pageNo = 1,2,3...") Integer pageNo, @PathVariable Integer pageSize) {
 			@PathVariable @ApiParam(value = "pageNo = 1,2,3...") Integer pageNo, @PathVariable Integer pageSize) {
 		return studentTotalCountService.queryPage(rootOrgId, pageNo, pageSize);
 		return studentTotalCountService.queryPage(rootOrgId, pageNo, pageSize);
 	}
 	}

+ 5 - 0
examcloud-core-reports-base/pom.xml

@@ -33,6 +33,11 @@
             <artifactId>examcloud-core-basic-api-client</artifactId>
             <artifactId>examcloud-core-basic-api-client</artifactId>
             <version>${examcloud.version}</version>
             <version>${examcloud.version}</version>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>cn.com.qmth.examcloud.rpc</groupId>
+            <artifactId>examcloud-core-oe-admin-api-client</artifactId>
+            <version>${examcloud.version}</version>
+        </dependency>
 	</dependencies>
 	</dependencies>
 
 
 </project>
 </project>

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

@@ -0,0 +1,84 @@
+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;
+	}
+
+}

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

@@ -17,6 +17,8 @@ public class StudentCountBean implements JsonSerializable {
 	private Integer totalCount;
 	private Integer totalCount;
 	@ApiModelProperty(value = "在线人数")
 	@ApiModelProperty(value = "在线人数")
 	private Integer onlineCount;
 	private Integer onlineCount;
+	@ApiModelProperty(value = "在考人数")
+	private Integer onExamCount;
 	public String getRootOrgName() {
 	public String getRootOrgName() {
 		return rootOrgName;
 		return rootOrgName;
 	}
 	}
@@ -41,5 +43,11 @@ public class StudentCountBean implements JsonSerializable {
 	public void setOnlineCount(Integer onlineCount) {
 	public void setOnlineCount(Integer onlineCount) {
 		this.onlineCount = onlineCount;
 		this.onlineCount = onlineCount;
 	}
 	}
+	public Integer getOnExamCount() {
+		return onExamCount;
+	}
+	public void setOnExamCount(Integer onExamCount) {
+		this.onExamCount = onExamCount;
+	}
 
 
 }
 }

+ 8 - 0
examcloud-core-reports-dao/src/main/java/cn/com/qmth/examcloud/core/reports/dao/ExamStudentCountRepo.java

@@ -1,5 +1,7 @@
 package cn.com.qmth.examcloud.core.reports.dao;
 package cn.com.qmth.examcloud.core.reports.dao;
 
 
+import java.util.List;
+
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Modifying;
@@ -14,4 +16,10 @@ public interface ExamStudentCountRepo extends JpaRepository<ExamStudentCountEnti
 	@Modifying
 	@Modifying
 	@Query(value = "update ec_r_exam_student_count set online_count=0", nativeQuery = true)
 	@Query(value = "update ec_r_exam_student_count set online_count=0", nativeQuery = true)
 	public void resetAllCount();
 	public void resetAllCount();
+	
+	@Query(value = "select * from ec_r_exam_student_count where root_org_id in(?1)", nativeQuery = true)
+	public List<ExamStudentCountEntity> getByRootOrgIds(List<Long> rootOrgIds);
+	
+	@Query(value = "select * from ec_r_exam_student_count where exam_id in(?1) and root_org_id=(?2)", nativeQuery = true)
+	public List<ExamStudentCountEntity> getByExamIdsRootOrgId(List<Long> examIds,Long rootOrgId);
 }
 }

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

@@ -1,6 +1,10 @@
 package cn.com.qmth.examcloud.core.reports.service;
 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 interface ExamStudentCountService {
 	public void saveCount();
 	public void saveCount();
 	public Long getOnlineCount(Long rootOrgId,Long orgId,Long examId);
 	public Long getOnlineCount(Long rootOrgId,Long orgId,Long examId);
+	public PageInfo<ExamStudentCountBean> queryPage(Long rootOrgId, Integer pageNo, Integer pageSize);
 }
 }

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

@@ -1,13 +1,25 @@
 package cn.com.qmth.examcloud.core.reports.service.impl;
 package cn.com.qmth.examcloud.core.reports.service.impl;
 
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 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.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 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.ActiveDataUtil;
 import cn.com.qmth.examcloud.core.reports.base.util.online.OnlineCount;
 import cn.com.qmth.examcloud.core.reports.base.util.online.OnlineCount;
 import cn.com.qmth.examcloud.core.reports.dao.ExamStudentCountRepo;
 import cn.com.qmth.examcloud.core.reports.dao.ExamStudentCountRepo;
@@ -20,7 +32,8 @@ public class ExamStudentCountServiceImpl implements ExamStudentCountService {
 	private ExamStudentCountRepo examStudentCountRepo;
 	private ExamStudentCountRepo examStudentCountRepo;
 	@Autowired
 	@Autowired
 	private JdbcTemplate jdbcTemplate;
 	private JdbcTemplate jdbcTemplate;
-
+	@Autowired
+	private ExamStatisticsCloudService examStatisticsCloudService;
 
 
 	@Override
 	@Override
 	public Long getOnlineCount(Long rootOrgId, Long orgId, Long examId) {
 	public Long getOnlineCount(Long rootOrgId, Long orgId, Long examId) {
@@ -64,4 +77,55 @@ public class ExamStudentCountServiceImpl implements ExamStudentCountService {
 		e.setOnlineCount(oc.getOnlineCount());
 		e.setOnlineCount(oc.getOnlineCount());
 		examStudentCountRepo.save(e);
 		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()));
+			}
+		}
+	}
 }
 }

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

@@ -1,6 +1,7 @@
 package cn.com.qmth.examcloud.core.reports.service.impl;
 package cn.com.qmth.examcloud.core.reports.service.impl;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -26,7 +27,9 @@ 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.basic.api.response.GetOrgsByIdListResp;
 import cn.com.qmth.examcloud.core.reports.base.bean.StudentCountBean;
 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.base.util.BatchGetDataUtil;
+import cn.com.qmth.examcloud.core.reports.dao.ExamStudentCountRepo;
 import cn.com.qmth.examcloud.core.reports.dao.StudentTotalCountRepo;
 import cn.com.qmth.examcloud.core.reports.dao.StudentTotalCountRepo;
+import cn.com.qmth.examcloud.core.reports.dao.entity.ExamStudentCountEntity;
 import cn.com.qmth.examcloud.core.reports.dao.entity.StudentTotalCountEntity;
 import cn.com.qmth.examcloud.core.reports.dao.entity.StudentTotalCountEntity;
 import cn.com.qmth.examcloud.core.reports.service.StudentCountService;
 import cn.com.qmth.examcloud.core.reports.service.StudentCountService;
 import cn.com.qmth.examcloud.core.reports.service.StudentTotalCountService;
 import cn.com.qmth.examcloud.core.reports.service.StudentTotalCountService;
@@ -36,6 +39,8 @@ public class StudentTotalCountServiceImpl implements StudentTotalCountService {
 	@Autowired
 	@Autowired
 	private StudentTotalCountRepo studentTotalCountRepo;
 	private StudentTotalCountRepo studentTotalCountRepo;
 	@Autowired
 	@Autowired
+	private  ExamStudentCountRepo examStudentCountRepo;
+	@Autowired
 	private StudentCountService studentCountService;
 	private StudentCountService studentCountService;
 	@Autowired
 	@Autowired
 	private OrgCloudService orgCloudService;
 	private OrgCloudService orgCloudService;
@@ -72,9 +77,12 @@ public class StudentTotalCountServiceImpl implements StudentTotalCountService {
 			StudentCountBean bean = new StudentCountBean();
 			StudentCountBean bean = new StudentCountBean();
 			bean.setTotalCount(cur.getTotalCount());
 			bean.setTotalCount(cur.getTotalCount());
 			bean.setRootOrgId(cur.getRootOrgId());
 			bean.setRootOrgId(cur.getRootOrgId());
+			bean.setOnlineCount(0);
+			bean.setOnExamCount(0);
 			ret.add(bean);
 			ret.add(bean);
 		}
 		}
 		fillOnlineCount(ret);
 		fillOnlineCount(ret);
+		fillOnExamCount(ret);
 		fillRootOrgName(ret);
 		fillRootOrgName(ret);
 		return new PageInfo<StudentCountBean>(es, ret);
 		return new PageInfo<StudentCountBean>(es, ret);
 	}
 	}
@@ -91,10 +99,39 @@ public class StudentTotalCountServiceImpl implements StudentTotalCountService {
 		Map<Long, Integer> map = sl.stream().collect(Collectors.toMap(StudentCountBean::getRootOrgId,
 		Map<Long, Integer> map = sl.stream().collect(Collectors.toMap(StudentCountBean::getRootOrgId,
 				account -> account.getOnlineCount(), (key1, key2) -> key2));
 				account -> account.getOnlineCount(), (key1, key2) -> key2));
 		for(StudentCountBean b:ret) {
 		for(StudentCountBean b:ret) {
-			b.setOnlineCount(map.get(b.getRootOrgId()));
+			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) {
 	private void fillRootOrgName(List<StudentCountBean> ret) {
 		if (CollectionUtils.isEmpty(ret)) {
 		if (CollectionUtils.isEmpty(ret)) {
 			return;
 			return;