فهرست منبع

重构部分代码

宋悦 8 سال پیش
والد
کامیت
95b94445cc
17فایلهای تغییر یافته به همراه402 افزوده شده و 40 حذف شده
  1. 9 4
      exam-work-api/pom.xml
  2. 32 6
      exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/api/ExamApi.java
  3. 2 2
      exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/api/ExamCourseApi.java
  4. 46 0
      exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/api/ExamPaperTypeApi.java
  5. 39 6
      exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/api/ExamStudentApi.java
  6. 20 2
      exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/service/ExamService.java
  7. 28 12
      exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/service/ExamStudentService.java
  8. 120 0
      exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/util/BeanCopierUtil.java
  9. 8 0
      exam-work-domain/src/main/java/cn/com/qmth/examcloud/service/examwork/dao/ExamRepo.java
  10. 6 0
      exam-work-domain/src/main/java/cn/com/qmth/examcloud/service/examwork/dao/ExamStudentRepo.java
  11. 35 0
      exam-work-domain/src/main/java/cn/com/qmth/examcloud/service/examwork/dto/ExamPaperTypeDTO.java
  12. 16 3
      exam-work-domain/src/main/java/cn/com/qmth/examcloud/service/examwork/dto/ExamStudentDTO.java
  13. 24 1
      exam-work-domain/src/main/java/cn/com/qmth/examcloud/service/examwork/entity/ExamStudent.java
  14. 9 0
      exam-work-main/src/main/java/cn/com/qmth/examcloud/service/examwork/AccessControlConfig.java
  15. 3 3
      exam-work-main/src/main/resources/application-dev.properties
  16. 3 0
      exam-work-main/src/main/resources/application-test.properties
  17. 2 1
      exam-work-main/src/main/resources/application.properties

+ 9 - 4
exam-work-api/pom.xml

@@ -50,10 +50,15 @@
             <artifactId>common-dto</artifactId>
              <version>${exam.cloud.version}</version>
         </dependency>
-		<dependency>
-            <groupId>com.facepp</groupId>
-            <artifactId>faceppsdk</artifactId>
-            <version>1.0</version>
+		<!--<dependency>-->
+            <!--<groupId>com.facepp</groupId>-->
+            <!--<artifactId>faceppsdk</artifactId>-->
+            <!--<version>1.0</version>-->
+        <!--</dependency>-->
+        <dependency>
+            <groupId>com.esotericsoftware</groupId>
+            <artifactId>reflectasm</artifactId>
+            <version>1.11.3</version>
         </dependency>
     </dependencies>
     

+ 32 - 6
exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/api/ExamApi.java

@@ -1,8 +1,14 @@
 package cn.com.qmth.examcloud.service.examwork.api;
 
+import cn.com.qmth.examcloud.common.uac.entity.AccessUser;
 import io.swagger.annotations.ApiOperation;
 
 import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.PageRequest;
@@ -16,13 +22,14 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 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.service.examwork.dao.ExamRepo;
 import cn.com.qmth.examcloud.service.examwork.entity.Exam;
 import cn.com.qmth.examcloud.service.examwork.service.ExamService;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * 考试服务API
  * Created by songyue on 17/1/13.
@@ -57,21 +64,40 @@ public class ExamApi {
 
     @ApiOperation(value="新增考试批次",notes = "新增")
     @PostMapping("/exam")
-    public ResponseEntity addExam(@RequestBody Exam exam){
-        exam.setCreateTime(new Date());
-        return new ResponseEntity(examService.saveExam(exam),HttpStatus.OK);
+    public ResponseEntity addExam(HttpServletRequest request,@RequestBody Exam exam){
+        Map<String,String> errorMap = new HashMap<String,String>();
+        if(!examService.checkExamName(exam)){
+            errorMap.put("errorMsg","考试名称已存在,请重新填写");
+            return new ResponseEntity(errorMap,HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+        AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
+        if(accessUser != null){
+            exam.setOrgId(accessUser.getOrgId());
+            exam.setCreateTime(new Date());
+            return new ResponseEntity(examService.saveExam(exam),HttpStatus.OK);
+        }else{
+            errorMap.put("errorMsg","accessUser为空");
+            return new ResponseEntity(errorMap,HttpStatus.INTERNAL_SERVER_ERROR);
+        }
     }
 
     @ApiOperation(value="更新考试批次",notes = "更新")
     @PutMapping("/exam")
     public ResponseEntity updateExam(@RequestBody Exam exam){
+        Map<String,String> errorMap = new HashMap<String,String>();
+        if(!examService.checkExamName(exam)){
+            errorMap.put("errorMsg","考试名称已存在,请重新填写");
+            return new ResponseEntity(errorMap,HttpStatus.INTERNAL_SERVER_ERROR);
+        }
         return new ResponseEntity(examService.saveExam(exam),HttpStatus.OK);
     }
 
     @ApiOperation(value="按ID删除考试批次",notes = "删除")
     @DeleteMapping("/exam/{id}")
-    public ResponseEntity deleteExam(@PathVariable Long id){
-    	examService.deleteExam(id);
+    public ResponseEntity deleteExam(@PathVariable String id){
+        List<Long> examIds = Stream.of(id.split(",")).map(s->Long.parseLong(s.trim()))
+                .collect(Collectors.toList());
+        examRepo.deleteInBatch(examRepo.findByIdIn(examIds));
         return new ResponseEntity(HttpStatus.OK);
     }
 }

+ 2 - 2
exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/api/ExamCourseApi.java

@@ -32,9 +32,9 @@ public class ExamCourseApi {
 
         Page<ExamStudent> examStudentPage;
         if (StringUtils.isEmpty(courseName)) {
-            examStudentPage = examStudentRepo.findDistinctCourseCode(examId, new PageRequest(curPage, pageSize));
+            examStudentPage = examStudentRepo.findDistinctCourseCode(examId, new PageRequest(curPage - 1, pageSize));
         } else {
-            examStudentPage = examStudentRepo.findDistinctCourseCode(examId, '%' + courseName + "%", new PageRequest(curPage, pageSize));
+            examStudentPage = examStudentRepo.findDistinctCourseCode(examId, '%' + courseName + "%", new PageRequest(curPage - 1, pageSize));
         }
 
 

+ 46 - 0
exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/api/ExamPaperTypeApi.java

@@ -0,0 +1,46 @@
+package cn.com.qmth.examcloud.service.examwork.api;
+
+import cn.com.qmth.examcloud.service.examwork.dao.ExamStudentRepo;
+import cn.com.qmth.examcloud.service.examwork.dto.ExamPaperTypeDTO;
+import cn.com.qmth.examcloud.service.examwork.entity.ExamStudent;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+/**
+ * Created by yuanpan on 2017/4/12.
+ */
+@RestController
+@RequestMapping("${app.api.root}/exam_paper_type")
+public class ExamPaperTypeApi {
+
+    @Autowired
+    ExamStudentRepo examStudentRepo;
+
+
+    @ApiOperation(value="根据考试获取试卷类型",notes = "获取试卷类型")
+    @GetMapping
+    public List<ExamPaperTypeDTO> query(@RequestParam("exam_id") Long examId,
+                                        @RequestParam("course_no") String courseNo) {
+
+
+        List<ExamStudent> examStudents = examStudentRepo.findDistinctPaperType(examId,courseNo);
+
+        List<ExamPaperTypeDTO> examPaperTypeDTOs = new ArrayList<ExamPaperTypeDTO>();
+
+        for(ExamStudent examStudent:examStudents){
+            ExamPaperTypeDTO examPaperTypeDTO = new ExamPaperTypeDTO();
+            examPaperTypeDTO.setCode(examStudent.getPaperType());
+            examPaperTypeDTO.setName(examStudent.getPaperType());
+            examPaperTypeDTO.setExamId(examId);
+            examPaperTypeDTOs.add(examPaperTypeDTO);
+        }
+        return examPaperTypeDTOs;
+    }
+
+}

+ 39 - 6
exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/api/ExamStudentApi.java

@@ -1,11 +1,17 @@
 package cn.com.qmth.examcloud.service.examwork.api;
 
+import cn.com.qmth.examcloud.common.uac.entity.AccessUser;
+import cn.com.qmth.examcloud.service.examwork.dao.ExamRepo;
+import cn.com.qmth.examcloud.service.examwork.entity.Exam;
 import io.swagger.annotations.ApiOperation;
 
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -50,15 +56,31 @@ public class ExamStudentApi {
     @Autowired
     ExamStudentAssembler examStudentAssembler;
 
+    @Autowired
+    ExamRepo examRepo;
+
     @ApiOperation(value = "查询考试学生带条件和分页", notes = "带条件带分页")
     @GetMapping("/all/{curPage}/{pageSize}")
-    public ResponseEntity getAllExamStudent(@ModelAttribute ExamStudentDTO examStudent, @PathVariable Integer curPage, @PathVariable Integer pageSize) {
-        return new ResponseEntity(examStudentService.getAllExamStudent(examStudent, new PageRequest(curPage, pageSize)), HttpStatus.OK);
+    public ResponseEntity getAllExamStudent(HttpServletRequest request,
+                                            @ModelAttribute ExamStudentDTO examStudent,
+                                            @PathVariable Integer curPage,
+                                            @PathVariable Integer pageSize) {
+        AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
+        if(accessUser != null){
+            examStudent.setRootOrgId(accessUser.getRootOrgId());
+        }
+        return new ResponseEntity(examStudentService.getAllExamStudent(examStudent,
+                new PageRequest(curPage - 1, pageSize)), HttpStatus.OK);
     }
 
     @ApiOperation(value = "查询所有考试学生带条件", notes = "带条件不分页")
     @GetMapping("/all")
-    public ResponseEntity getAllExamStudent(@ModelAttribute ExamStudentDTO examStudent) {
+    public ResponseEntity getAllExamStudent(HttpServletRequest request,
+                                            @ModelAttribute ExamStudentDTO examStudent) {
+        AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
+        if(accessUser != null){
+            examStudent.setRootOrgId(accessUser.getRootOrgId());
+        }
         return new ResponseEntity(examStudentService.getAllExamStudent(examStudent), HttpStatus.OK);
     }
 
@@ -70,13 +92,22 @@ public class ExamStudentApi {
 
     @ApiOperation(value = "新增考试学生", notes = "新增")
     @PostMapping()
-    public ResponseEntity addExamStudent(@RequestBody ExamStudent examStudent) {
+    public ResponseEntity addExamStudent(HttpServletRequest request,
+                                         @RequestBody ExamStudent examStudent) {
+        AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
+        if(accessUser != null){
+            examStudent.setRootOrgId(accessUser.getRootOrgId());
+        }
+        Exam exam = examRepo.findOne(examStudent.getExam().getId());
+        examStudent.setExam(exam);
         return new ResponseEntity<ExamStudent>(examStudentService.saveExamStudent(examStudent), HttpStatus.OK);
     }
 
     @ApiOperation(value = "更新考试学生", notes = "更新")
     @PutMapping()
     public ResponseEntity updateExamStudent(@RequestBody ExamStudent examStudent) {
+        Exam exam = examRepo.findOne(examStudent.getExam().getId());
+        examStudent.setExam(exam);
         return new ResponseEntity(examStudentService.saveExamStudent(examStudent), HttpStatus.OK);
     }
 
@@ -90,8 +121,10 @@ public class ExamStudentApi {
 
     @ApiOperation(value = "按ID删除考试学生", notes = "删除")
     @DeleteMapping("/{id}")
-    public ResponseEntity deleteExamStudent(@PathVariable Long id) {
-        examStudentService.deleteExamStudent(id);
+    public ResponseEntity deleteExamStudent(@PathVariable String id) {
+        List<Long> examStuIds = Stream.of(id.split(",")).map(s->Long.parseLong(s.trim()))
+                .collect(Collectors.toList());
+        examStudentRepo.deleteInBatch(examStudentRepo.findByIdIn(examStuIds));
         return new ResponseEntity(HttpStatus.OK);
     }
 

+ 20 - 2
exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/service/ExamService.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.examcloud.service.examwork.service;
 
+import static org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers.contains;
 import static org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers.startsWith;
 
 import java.util.List;
@@ -31,7 +32,7 @@ public class ExamService {
      */
     public Page<Exam> getAllExam(Exam examCriteria, Pageable pageable){
         ExampleMatcher exampleMatcher = ExampleMatcher.matching()
-                .withMatcher("name",startsWith());
+                .withMatcher("name",contains());
         Example<Exam> examExample = Example.of(examCriteria, exampleMatcher);
         return examRepo.findAll(examExample,pageable);
     }
@@ -44,7 +45,7 @@ public class ExamService {
      */
     public List<Exam> getAllExam(Exam examCriteria){
     	ExampleMatcher exampleMatcher = ExampleMatcher.matching()
-                .withMatcher("name",startsWith());
+                .withMatcher("name",contains());
         Example<Exam> examExample = Example.of(examCriteria,exampleMatcher);
         return examRepo.findAll(examExample);
     }
@@ -91,4 +92,21 @@ public class ExamService {
     public void deleteAllExam(){
         examRepo.deleteAll();
     }
+
+    public boolean checkExamName(Exam exam){
+        if(exam.getId()!=null){
+            if(examRepo.countByNameAndIdNot(exam.getName(),exam.getId()) > 0){
+                return false;
+            }else{
+                return true;
+            }
+        }else{
+            if(examRepo.countByName(exam.getName()) > 0){
+                return false;
+            }else{
+                return true;
+            }
+        }
+
+    }
 }

+ 28 - 12
exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/service/ExamStudentService.java

@@ -6,7 +6,10 @@ import java.util.List;
 
 import javax.persistence.criteria.Predicate;
 
+import cn.com.qmth.examcloud.service.examwork.util.BeanCopierUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.data.domain.ExampleMatcher;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;
@@ -31,6 +34,8 @@ import cn.com.qmth.examcloud.service.examwork.service.rpc.CourseService;
 import cn.com.qmth.examcloud.service.examwork.service.rpc.OrgService;
 import cn.com.qmth.examcloud.service.examwork.service.rpc.StudentService;
 
+import static org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers.contains;
+
 /**
  * 考试学生服务类
  * Created by songyue on 17/1/14.
@@ -65,12 +70,17 @@ public class ExamStudentService {
      * @return
      */
     public Page<ExamStudent> getAllExamStudent(ExamStudentDTO examCriteria, Pageable pageable){
+//		ExamStudent examStudentSearch = BeanCopierUtil.copyProperties(examCriteria,ExamStudent.class);
 //        ExampleMatcher exampleMatcher = ExampleMatcher.matching()
-//                .withMatcher("name",startsWith());
-//        Example<ExamStudent> examExamStudentple = Example.of(examCriteria, exampleMatcher);
-//        return examStudentRepo.findAll(examExamStudentple,pageable);
+//                .withMatcher("name",contains())
+//				.withMatcher("studentCode",contains())
+//				.withMatcher("specialtyName",contains()).withIgnoreNullValues();
+//        Example<ExamStudent> examExamStudentple = Example.of(examStudentSearch, exampleMatcher);
+//		Page<ExamStudent> examStudents = examStudentRepo.findAll(examExamStudentple,pageable);
+//        return examStudents;
     	Specification<ExamStudent> specification = getSpecification(examCriteria);
-        return examStudentRepo.findAll(specification,pageable);
+		Page<ExamStudent> examStudents = examStudentRepo.findAll(specification,pageable);
+        return examStudents;
     }
 
     /**
@@ -185,7 +195,7 @@ public class ExamStudentService {
 	
 	/**
 	 * 考生导入验证
-	 * @param stu
+	 * @param dto
 	 * @return
 	 */
 	public ExcelError importCheck(ExamStudentDTO dto){
@@ -247,27 +257,33 @@ public class ExamStudentService {
 	private Specification<ExamStudent> getSpecification(ExamStudentDTO examCriteria) {
 		Specification<ExamStudent> specification = (root, query, cb) -> {
 		    List<Predicate> predicates = new ArrayList<>();
-		    if(null!=examCriteria.getRootOrgId()){
+		    if(!StringUtils.isEmpty(examCriteria.getRootOrgId())){
 		    	predicates.add(cb.equal(root.get("rootOrgId"),examCriteria.getRootOrgId()));
 		    }
-		    if(null!=examCriteria.getOrgId()){
+		    if(!StringUtils.isEmpty(examCriteria.getOrgId())){
 		    	predicates.add(cb.equal(root.get("orgId"),examCriteria.getOrgId()));
 		    }
-		    if(null!=examCriteria.getExam()){
+		    if(!StringUtils.isEmpty(examCriteria.getExam())){
 		    	predicates.add(cb.equal(root.get("exam").get("id"),examCriteria.getExam().getId()));
 		    }
-		    if(null!=examCriteria.getName()){
+		    if(!StringUtils.isEmpty(examCriteria.getName())){
 		    	predicates.add(cb.like(root.get("name"),"%"+examCriteria.getName()+"%"));
 		    }
-		    if(null!=examCriteria.getStudentCode()){
+		    if(!StringUtils.isEmpty(examCriteria.getStudentCode())){
 		    	predicates.add(cb.like(root.get("studentCode"),"%"+examCriteria.getStudentCode()+"%"));
 		    }
-		    if(null!=examCriteria.getFinished()){
+			if(!StringUtils.isEmpty(examCriteria.getCourseCode())){
+				predicates.add(cb.equal(root.get("courseCode"),examCriteria.getCourseCode()));
+			}
+		    if(!StringUtils.isEmpty(examCriteria.getFinished())){
 		    	predicates.add(cb.equal(root.get("finished"),examCriteria.getFinished()));
 		    }
-		    if(null!=examCriteria.getStudentId()){
+		    if(!StringUtils.isEmpty(examCriteria.getStudentId())){
 		    	predicates.add(cb.equal(root.get("studentId"),examCriteria.getStudentId()));
 		    }
+			if(!StringUtils.isEmpty(examCriteria.getExamSite())){
+				predicates.add(cb.like(root.get("examSite"),"%"+examCriteria.getExamSite()+"%"));
+			}
 		    return cb.and(predicates.toArray(new Predicate[predicates.size()]));
 		};
 		return specification;

+ 120 - 0
exam-work-api/src/main/java/cn/com/qmth/examcloud/service/examwork/util/BeanCopierUtil.java

@@ -0,0 +1,120 @@
+package cn.com.qmth.examcloud.service.examwork.util;
+
+import com.esotericsoftware.reflectasm.ConstructorAccess;
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static java.lang.String.format;
+
+/**
+ * Created by songyue on 17/3/15.
+ */
+public class BeanCopierUtil {
+    private static final Map<String, BeanCopier> beanCopierCache = new ConcurrentHashMap<>();
+    private static final Map<String,ConstructorAccess> constructorAccessCache = new ConcurrentHashMap<>();
+
+    private static void copyProperties(Object source, Object target) {
+        BeanCopier copier = getBeanCopier(source.getClass(), target.getClass());
+        copier.copy(source, target, null);
+    }
+
+    /**
+     * 获取BeanCopier实例
+     * @param sourceClass
+     * @param targetClass
+     * @return
+     */
+    private static BeanCopier getBeanCopier(Class sourceClass, Class targetClass) {
+        String beanKey = generateKey(sourceClass, targetClass);
+        BeanCopier copier = null;
+        if (!beanCopierCache.containsKey(beanKey)) {
+            copier = BeanCopier.create(sourceClass, targetClass, false);
+            beanCopierCache.put(beanKey, copier);
+        } else {
+            copier = beanCopierCache.get(beanKey);
+        }
+        return copier;
+    }
+
+    /**
+     * 生成key
+     * @param class1
+     * @param class2
+     * @return
+     */
+    private static String generateKey(Class<?> class1, Class<?> class2) {
+        return class1.toString() + class2.toString();
+    }
+
+    /**
+     * 拷贝对象
+     * @param source
+     * @param targetClass
+     * @param <T>
+     * @return
+     */
+    public static <T> T copyProperties(Object source, Class<T> targetClass) {
+        T t = null;
+        try {
+            t = targetClass.newInstance();
+        } catch (InstantiationException | IllegalAccessException e) {
+            throw new RuntimeException(format("Create new instance of %s failed: %s", targetClass, e.getMessage()));
+        }
+        copyProperties(source, t);
+        return t;
+    }
+
+    /**
+     * 拷贝List
+     * @param sourceList
+     * @param targetClass
+     * @param <T>
+     * @return
+     */
+    public static <T> List<T> copyPropertiesOfList(List<?> sourceList, Class<T> targetClass) {
+        if (CollectionUtils.isEmpty(sourceList)) {
+            return Collections.emptyList();
+        }
+        ConstructorAccess<T> constructorAccess = getConstructorAccess(targetClass);
+        List<T> resultList = new ArrayList<>(sourceList.size());
+        for (Object o : sourceList) {
+            T t = null;
+            try {
+                t = constructorAccess.newInstance();
+                copyProperties(o, t);
+                resultList.add(t);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return resultList;
+    }
+
+    /**
+     * 获取集合包装类
+     * @param targetClass
+     * @param <T>
+     * @return
+     */
+    private static <T> ConstructorAccess<T> getConstructorAccess(Class<T> targetClass) {
+        ConstructorAccess<T> constructorAccess = constructorAccessCache.get(targetClass.toString());
+        if(constructorAccess != null) {
+            return constructorAccess;
+        }
+        try {
+            constructorAccess = ConstructorAccess.get(targetClass);
+            constructorAccess.newInstance();
+            constructorAccessCache.put(targetClass.toString(),constructorAccess);
+        } catch (Exception e) {
+            throw new RuntimeException(format("Create new instance of %s failed: %s", targetClass, e.getMessage()));
+        }
+        return constructorAccess;
+    }
+
+}

+ 8 - 0
exam-work-domain/src/main/java/cn/com/qmth/examcloud/service/examwork/dao/ExamRepo.java

@@ -10,4 +10,12 @@ import cn.com.qmth.examcloud.service.examwork.entity.Exam;
 public interface ExamRepo extends JpaRepository<Exam, Long>,QueryByExampleExecutor<Exam>{
 
 	List<Exam> findByOrgId(Long orgId);
+
+	void deleteByIdIn(List<Long> ids);
+
+	List<Exam> findByIdIn(List<Long> ids);
+
+	Long countByName(String name);
+
+	Long countByNameAndIdNot(String name,Long id);
 }

+ 6 - 0
exam-work-domain/src/main/java/cn/com/qmth/examcloud/service/examwork/dao/ExamStudentRepo.java

@@ -2,6 +2,7 @@ package cn.com.qmth.examcloud.service.examwork.dao;
 
 import java.util.List;
 
+import cn.com.qmth.examcloud.service.examwork.entity.Exam;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
@@ -21,4 +22,9 @@ public interface ExamStudentRepo extends JpaRepository<ExamStudent, Long>, Query
 
     @Query("select s from ExamStudent s where s.exam.id=?1 and s.courseName like ?2 group by s.courseCode")
     Page<ExamStudent> findDistinctCourseCode(Long examId,String courseName, Pageable pageable);
+
+    List<ExamStudent> findByIdIn(List<Long> ids);
+
+    @Query("select s from ExamStudent s where s.exam.id=?1 and s.courseCode =?2 group by s.paperType")
+    List<ExamStudent> findDistinctPaperType(Long examId,String courseCode);
 }

+ 35 - 0
exam-work-domain/src/main/java/cn/com/qmth/examcloud/service/examwork/dto/ExamPaperTypeDTO.java

@@ -0,0 +1,35 @@
+package cn.com.qmth.examcloud.service.examwork.dto;
+
+/**
+ * Created by yuanpan on 2017/4/12.
+ */
+public class ExamPaperTypeDTO {
+
+    private Long examId;
+    private String code;
+    private String name;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 16 - 3
exam-work-domain/src/main/java/cn/com/qmth/examcloud/service/examwork/dto/ExamStudentDTO.java

@@ -5,7 +5,7 @@ import cn.com.qmth.examcloud.service.examwork.entity.Exam;
 
 public class ExamStudentDTO {
 
-	private long id;
+	private Long id;
 	
 	@ExcelProperty(index = 0,name = "姓名")
 	private String name;
@@ -73,11 +73,16 @@ public class ExamStudentDTO {
 	 */
 	private Boolean finished;
 
-	public long getId() {
+	/**
+	 * 考点
+     */
+	private String examSite;
+
+	public Long getId() {
 		return id;
 	}
 
-	public void setId(long id) {
+	public void setId(Long id) {
 		this.id = id;
 	}
 
@@ -241,6 +246,14 @@ public class ExamStudentDTO {
 		this.studentId = studentId;
 	}
 
+	public String getExamSite() {
+		return examSite;
+	}
+
+	public void setExamSite(String examSite) {
+		this.examSite = examSite;
+	}
+
 	public ExamStudentDTO() {
 	}
 }

+ 24 - 1
exam-work-domain/src/main/java/cn/com/qmth/examcloud/service/examwork/entity/ExamStudent.java

@@ -21,7 +21,7 @@ public class ExamStudent implements Serializable {
 	@NotNull
 	private String name;
 
-	@ManyToOne
+	@ManyToOne(cascade = { CascadeType.ALL })
 	@JoinColumn(name = "examId")
 	private Exam exam;
 	/**
@@ -38,6 +38,8 @@ public class ExamStudent implements Serializable {
 	 */
     private String orgCode;
 
+	private String orgName;
+
 	private String studentCode;
 
 	@Column(unique=true)
@@ -88,6 +90,11 @@ public class ExamStudent implements Serializable {
 	 */
     private Long studentId;
 
+	/**
+	 * 考点
+	 */
+	private String examSite;
+
 	public static long getSerialVersionUID() {
 		return serialVersionUID;
 	}
@@ -264,6 +271,22 @@ public class ExamStudent implements Serializable {
 		this.studentId = studentId;
 	}
 
+	public String getExamSite() {
+		return examSite;
+	}
+
+	public void setExamSite(String examSite) {
+		this.examSite = examSite;
+	}
+
+	public String getOrgName() {
+		return orgName;
+	}
+
+	public void setOrgName(String orgName) {
+		this.orgName = orgName;
+	}
+
 	public ExamStudent() {
 	}
 }

+ 9 - 0
exam-work-main/src/main/java/cn/com/qmth/examcloud/service/examwork/AccessControlConfig.java

@@ -3,6 +3,7 @@ package cn.com.qmth.examcloud.service.examwork;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Profile;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 
@@ -25,4 +26,12 @@ public class AccessControlConfig extends WebMvcConfigurerAdapter {
 	public void addInterceptors(InterceptorRegistry registry) {
 		registry.addInterceptor(getInterceptor()).addPathPatterns("/**").excludePathPatterns("/**/swagger-ui.html#/**");
 	}
+
+	@Override
+	public void addCorsMappings(CorsRegistry registry) {
+		registry.addMapping("/**")
+				.allowedOrigins("*")
+				.allowedMethods("GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "TRACE")
+				.allowedHeaders("*");
+	}
 }

+ 3 - 3
exam-work-main/src/main/resources/application-dev.properties

@@ -1,10 +1,10 @@
-spring.datasource.url=jdbc:mysql://192.168.1.99:3306/exam_cloud_test?useUnicode=true&characterEncoding=UTF-8
+spring.datasource.url=jdbc:mysql://localhost:3306/exam_cloud_test?useUnicode=true&characterEncoding=UTF-8
 spring.datasource.username=root
 spring.datasource.password=root
 
 
-spring.redis.host=192.168.1.99
+spring.redis.host=127.0.0.1
 spring.redis.port=6379
 
 
-eureka.client.serviceUrl.defaultZone=http://192.168.1.99:1111/eureka/
+eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

+ 3 - 0
exam-work-main/src/main/resources/application-test.properties

@@ -0,0 +1,3 @@
+spring.datasource.url=jdbc:mysql://192.168.1.74:3306/exam_cloud_yun?useUnicode=true&characterEncoding=UTF-8
+spring.datasource.username=root
+spring.datasource.password=root

+ 2 - 1
exam-work-main/src/main/resources/application.properties

@@ -1,4 +1,4 @@
-
+spring.profiles.active=dev
 spring.datasource.validation-query=SELECT 1 FROM DUAL
 spring.datasource.test-on-borrow=true
 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
@@ -22,6 +22,7 @@ spring.http.multipart.max-file-size=10Mb
 
 spring.application.name=ExamCloud-service-exam-work
 server.port=8001
+eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
 hystrix.command.default.execution.timeout.enabled=false
 
 app.api.root=/api/ecs_exam_work