罗识 7 anos atrás
commit
01702e3218
100 arquivos alterados com 10245 adições e 0 exclusões
  1. 340 0
      pom.xml
  2. 67 0
      stmms-biz/pom.xml
  3. 25 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/annotation/AuthValidate.java
  4. 10 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/interfaces/AuthValidator.java
  5. 9 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/model/AuthInfo.java
  6. 36 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/model/BasicAuthInfo.java
  7. 40 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/service/AuthInfoService.java
  8. 37 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/service/validator/AdminUserValidator.java
  9. 41 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/service/validator/AuthValidateService.java
  10. 52 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/service/validator/DefaultValidator.java
  11. 16 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/dao/CampusDao.java
  12. 137 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/model/Campus.java
  13. 58 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/query/CampusSearchQuery.java
  14. 27 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/service/CampusService.java
  15. 117 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/service/impl/CampusServiceImp.java
  16. 266 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/common/BaseQuery.java
  17. 28 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/common/BaseQueryService.java
  18. 16 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/CaseHistoryDao.java
  19. 26 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/CaseLibraryDao.java
  20. 18 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/FormallyHistoryDao.java
  21. 53 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/FormallyLibraryDao.java
  22. 18 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/ProblemHistoryDao.java
  23. 15 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/ProblemLibraryDao.java
  24. 18 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/StandardHistoryDao.java
  25. 26 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/StandardLibraryDao.java
  26. 18 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/TryHistoryDao.java
  27. 33 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/TryLibraryDao.java
  28. 174 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/CaseHistory.java
  29. 246 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/CaseLibrary.java
  30. 160 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/FormallyHistory.java
  31. 309 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/FormallyLibrary.java
  32. 158 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/ProblemHistory.java
  33. 265 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/ProblemLibrary.java
  34. 174 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/StandardHistory.java
  35. 246 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/StandardLibrary.java
  36. 160 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/TryHistory.java
  37. 291 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/TryLibrary.java
  38. 80 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/query/FormallyHistorySearchQuery.java
  39. 101 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/query/FormallyLibrarySearchQuery.java
  40. 80 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/query/TryHistorySearchQuery.java
  41. 101 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/query/TryLibrarySearchQuery.java
  42. 23 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/CaseHistoryService.java
  43. 44 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/CaseLibraryService.java
  44. 31 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/FormallyHistoryService.java
  45. 47 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/FormallyLibraryService.java
  46. 22 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/ProblemHistoryService.java
  47. 39 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/ProblemLibraryService.java
  48. 13 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/ProgressService.java
  49. 25 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/StandardHistoryService.java
  50. 45 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/StandardLibraryService.java
  51. 23 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/TryHistoryService.java
  52. 42 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/TryLibraryService.java
  53. 66 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/CaseHistoryServiceImpl.java
  54. 188 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/CaseLibraryServiceImpl.java
  55. 167 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/FormallyHistoryServiceImpl.java
  56. 191 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/FormallyLibraryServiceImpl.java
  57. 56 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/ProblemHistoryServiceImpl.java
  58. 223 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/ProblemLibraryServiceImpl.java
  59. 41 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/ProgressServiceImpl.java
  60. 70 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/StandardHistoryServiceImpl.java
  61. 188 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/StandardLibraryServiceImpl.java
  62. 149 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/TryHistoryServiceImpl.java
  63. 137 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/TryLibraryServiceImpl.java
  64. 29 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java
  65. 40 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamPackageDao.java
  66. 54 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamQuestionDao.java
  67. 94 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java
  68. 90 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamSubjectDao.java
  69. 18 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamSubjectPaperDao.java
  70. 26 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkLevelDao.java
  71. 22 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkStepDao.java
  72. 40 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkerDao.java
  73. 31 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ObjectiveBlockDao.java
  74. 22 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ObjectiveQuestionDao.java
  75. 36 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ScoreRateDao.java
  76. 32 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/SubjectiveBlockDao.java
  77. 15 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/TagDao.java
  78. 129 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java
  79. 73 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamPackage.java
  80. 75 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamPackagePK.java
  81. 195 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java
  82. 639 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamStudent.java
  83. 249 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubject.java
  84. 75 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubjectPK.java
  85. 114 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubjectPaper.java
  86. 108 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubjectPaperDTO.java
  87. 173 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkLevel.java
  88. 261 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkStep.java
  89. 234 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Marker.java
  90. 183 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ObjectiveBlock.java
  91. 122 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ObjectiveQuestion.java
  92. 119 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/QuestionPK.java
  93. 143 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ScoreRate.java
  94. 136 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ScoreRatePK.java
  95. 285 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/SubjectiveBlock.java
  96. 38 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Tag.java
  97. 37 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamPackageSearchQuery.java
  98. 82 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamSearchQuery.java
  99. 255 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamStudentSearchQuery.java
  100. 49 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/MarkerSearchQuery.java

+ 340 - 0
pom.xml

@@ -0,0 +1,340 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>cn.com.qmth.stmms</groupId>
+	<artifactId>stmms-parent</artifactId>
+	<packaging>pom</packaging>
+	<version>1.0-SNAPSHOT</version>
+
+	<name>stmms-parent</name>
+	<url>http://maven.apache.org</url>
+
+	<modules>
+		<module>stmms-common</module>
+		<module>stmms-biz</module>
+		<module>stmms-web</module>
+	</modules>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<spring.version>3.2.2.RELEASE</spring.version>
+		<hibernate.version>4.2.1.Final</hibernate.version>
+		<log4j.version>1.2.17</log4j.version>
+		<aspectj.version>1.6.5</aspectj.version>
+		<junit.version>4.11</junit.version>
+		<java.version>1.7</java.version>
+		<spring-data-redis.version>1.2.1.RELEASE</spring-data-redis.version>
+		<poi.version>3.9</poi.version>
+		<guava.version>14.0.1</guava.version>
+		<commons-lang3.version>3.1</commons-lang3.version>
+	</properties>
+
+	<dependencyManagement>
+		<dependencies>
+			<!-- ======================================== -->
+			<!-- 子项目依赖 -->
+			<!-- ======================================== -->
+			<dependency>
+				<groupId>cn.com.qmth.stmms</groupId>
+				<artifactId>stmms-common</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>cn.com.qmth.stmms</groupId>
+				<artifactId>stmms-orm</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>cn.com.qmth.stmms</groupId>
+				<artifactId>stmms-biz</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>cn.com.qmth.stmms</groupId>
+				<artifactId>stmms-web</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>cn.com.qmth.stmms</groupId>
+				<artifactId>remote-interface</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>cn.com.qmth.stmms</groupId>
+				<artifactId>remote-service</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<!-- ================================================= -->
+			<!-- 日志及相关依赖(用slf4j+logback代替jcl+log4j) -->
+			<!-- ================================================= -->
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>slf4j-api</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>jcl-over-slf4j</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>ch.qos.logback</groupId>
+				<artifactId>logback-classic</artifactId>
+				<version>0.9.29</version>
+				<scope>runtime</scope>
+			</dependency>
+			<dependency>
+				<groupId>com.caucho</groupId>
+				<artifactId>hessian</artifactId>
+				<version>4.0.7</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-logging</groupId>
+				<artifactId>commons-logging</artifactId>
+				<version>1.1.1</version>
+				<scope>provided</scope>
+			</dependency>
+			<!-- ================================================= -->
+			<!-- Spring框架 -->
+			<!-- ================================================= -->
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-core</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-beans</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-aop</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-aspects</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-context</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-context-support</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-tx</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-jdbc</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-orm</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-web</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-webmvc</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-test</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework</groupId>
+				<artifactId>spring-instrument</artifactId>
+				<version>${spring.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework.data</groupId>
+				<artifactId>spring-data-jpa</artifactId>
+				<version>1.3.2.RELEASE</version>
+			</dependency>
+			<dependency>
+				<groupId>org.springframework.data</groupId>
+				<artifactId>spring-data-redis</artifactId>
+				<version>${spring-data-redis.version}</version>
+			</dependency>
+			<!-- ======================================== -->
+			<!-- 其它第三方依赖 -->
+			<!-- ======================================== -->
+			<dependency>
+				<groupId>javax.servlet</groupId>
+				<artifactId>javax.servlet-api</artifactId>
+				<version>3.0.1</version>
+				<scope>provided</scope>
+			</dependency>
+			<dependency>
+				<groupId>org.mortbay.jetty</groupId>
+				<artifactId>jetty</artifactId>
+				<version>6.1.26</version>
+			</dependency>
+			<dependency>
+				<groupId>jstl</groupId>
+				<artifactId>jstl</artifactId>
+				<version>1.2</version>
+			</dependency>
+			<dependency>
+				<groupId>junit</groupId>
+				<artifactId>junit</artifactId>
+				<version>${junit.version}</version>
+				<scope>test</scope>
+			</dependency>
+			<dependency>
+				<groupId>commons-fileupload</groupId>
+				<artifactId>commons-fileupload</artifactId>
+				<version>1.2.2</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-io</groupId>
+				<artifactId>commons-io</artifactId>
+				<version>2.1</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-net</groupId>
+				<artifactId>commons-net</artifactId>
+				<version>2.0</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-collections</groupId>
+				<artifactId>commons-collections</artifactId>
+				<version>20040616</version>
+			</dependency>
+			<dependency>
+				<groupId>org.hibernate</groupId>
+				<artifactId>hibernate-entitymanager</artifactId>
+				<version>${hibernate.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.hibernate</groupId>
+				<artifactId>hibernate-ehcache</artifactId>
+				<version>${hibernate.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.hibernate.javax.persistence</groupId>
+				<artifactId>hibernate-jpa-2.0-api</artifactId>
+				<version>1.0.1.Final</version>
+			</dependency>
+			<dependency>
+				<groupId>org.eclipse.persistence</groupId>
+				<artifactId>javax.persistence</artifactId>
+				<version>2.1.0</version>
+			</dependency>
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>slf4j-api</artifactId>
+				<version>1.7.5</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-dbcp</groupId>
+				<artifactId>commons-dbcp</artifactId>
+				<version>1.4</version>
+			</dependency>
+			<dependency>
+				<groupId>commons-pool</groupId>
+				<artifactId>commons-pool</artifactId>
+				<version>20030825.183949</version>
+			</dependency>
+			<dependency>
+				<groupId>mysql</groupId>
+				<artifactId>mysql-connector-java</artifactId>
+				<version>5.1.21</version>
+			</dependency>
+			<dependency>
+				<groupId>org.codehaus.jackson</groupId>
+				<artifactId>jackson-mapper-asl</artifactId>
+				<version>1.9.12</version>
+			</dependency>
+			<dependency>
+				<groupId>org.codehaus.jackson</groupId>
+				<artifactId>jackson-core-asl</artifactId>
+				<version>1.9.12</version>
+			</dependency>
+			<dependency>
+				<groupId>com.fasterxml.jackson.core</groupId>
+				<artifactId>jackson-databind</artifactId>
+				<version>2.8.8</version>
+			</dependency>
+			<dependency>
+				<groupId>log4j</groupId>
+				<artifactId>log4j</artifactId>
+				<version>${log4j.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>net.sourceforge.jexcelapi</groupId>
+				<artifactId>jxl</artifactId>
+				<version>2.6.12</version>
+			</dependency>
+			<dependency>
+				<groupId>net.sf.json-lib</groupId>
+				<artifactId>json-lib-ext-spring</artifactId>
+				<version>1.0.2</version>
+			</dependency>
+			<dependency>
+				<groupId>redis.clients</groupId>
+				<artifactId>jedis</artifactId>
+				<version>2.4.1</version>
+			</dependency>
+			<dependency>
+				<groupId>org.aspectj</groupId>
+				<artifactId>aspectjweaver</artifactId>
+				<version>1.8.0</version>
+			</dependency>
+			<dependency>
+				<groupId>com.google.guava</groupId>
+				<artifactId>guava</artifactId>
+				<version>18.0</version>
+			</dependency>
+			<dependency>
+				<groupId>junit</groupId>
+				<artifactId>junit</artifactId>
+				<version>4.12</version>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.3.2</version>
+				<configuration>
+					<source>${java.version}</source>
+					<target>${java.version}</target>
+					<encoding>UTF-8</encoding>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>2.14.1</version>
+				<configuration>
+					<skipTests>true</skipTests>
+					<additionalClasspathElements>
+						<additionalClasspathElement>src/main/resources</additionalClasspathElement>
+					</additionalClasspathElements>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>

+ 67 - 0
stmms-biz/pom.xml

@@ -0,0 +1,67 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>cn.com.qmth.stmms</groupId>
+		<artifactId>stmms-parent</artifactId>
+		<version>1.0-SNAPSHOT</version>
+	</parent>
+	<groupId>cn.com.qmth.stmms</groupId>
+	<artifactId>stmms-biz</artifactId>
+	<version>1.0-SNAPSHOT</version>
+	<packaging>jar</packaging>
+	<name>stmms-biz</name>
+	<url>http://maven.apache.org</url>
+
+	<dependencies>
+		<dependency>
+			<groupId>cn.com.qmth.stmms</groupId>
+			<artifactId>stmms-common</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.data</groupId>
+			<artifactId>spring-data-jpa</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-entitymanager</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-ehcache</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.persistence</groupId>
+			<artifactId>javax.persistence</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate.javax.persistence</groupId>
+			<artifactId>hibernate-jpa-2.0-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>commons-dbcp</groupId>
+			<artifactId>commons-dbcp</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>commons-pool</groupId>
+			<artifactId>commons-pool</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>net.sf.json-lib</groupId>
+			<artifactId>json-lib-ext-spring</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.google.guava</groupId>
+			<artifactId>guava</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+</project>

+ 25 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/annotation/AuthValidate.java

@@ -0,0 +1,25 @@
+package cn.com.qmth.stmms.biz.api.auth.annotation;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * API方法权限验证器定义
+ * 
+ * @author LS
+ * 
+ */
+@Target({ METHOD })
+@Retention(RUNTIME)
+public @interface AuthValidate {
+
+    /**
+     * 指定权限验证器的名称
+     * 
+     * @return
+     */
+    String[] value() default {};
+}

+ 10 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/interfaces/AuthValidator.java

@@ -0,0 +1,10 @@
+package cn.com.qmth.stmms.biz.api.auth.interfaces;
+
+import cn.com.qmth.stmms.biz.api.auth.model.AuthInfo;
+
+public interface AuthValidator {
+
+    public String getName();
+
+    public boolean validate(AuthInfo auth);
+}

+ 9 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/model/AuthInfo.java

@@ -0,0 +1,9 @@
+package cn.com.qmth.stmms.biz.api.auth.model;
+
+import cn.com.qmth.stmms.biz.user.model.User;
+
+public interface AuthInfo {
+
+    public User getLoginUser();
+
+}

+ 36 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/model/BasicAuthInfo.java

@@ -0,0 +1,36 @@
+package cn.com.qmth.stmms.biz.api.auth.model;
+
+import cn.com.qmth.stmms.biz.user.model.User;
+
+public class BasicAuthInfo implements AuthInfo {
+
+    private User loginUser;
+
+    private String loginName;
+
+    private String password;
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public User getLoginUser() {
+        return loginUser;
+    }
+
+    public void setLoginUser(User loginUser) {
+        this.loginUser = loginUser;
+    }
+}

+ 40 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/service/AuthInfoService.java

@@ -0,0 +1,40 @@
+package cn.com.qmth.stmms.biz.api.auth.service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.stmms.biz.api.auth.model.AuthInfo;
+import cn.com.qmth.stmms.biz.api.auth.model.BasicAuthInfo;
+
+@Service("authInfoService")
+public class AuthInfoService {
+
+    private static final String ENTRY_SPLITE = ";";
+
+    private static final String KV_SPLITE = "=";
+
+    public AuthInfo getAuthInfo(String infoString) {
+        Map<String, String> infoMap = buildInfoMap(infoString);
+        BasicAuthInfo info = new BasicAuthInfo();
+        info.setLoginName(infoMap.get("loginname"));
+        info.setPassword(infoMap.get("password"));
+        return info;
+    }
+
+    private Map<String, String> buildInfoMap(String infoString) {
+        Map<String, String> infoMap = new HashMap<String, String>();
+        String[] values = StringUtils.split(infoString, ENTRY_SPLITE);
+        if (values != null && values.length > 0) {
+            for (String value : values) {
+                String[] pair = StringUtils.split(value, KV_SPLITE);
+                if (pair != null && pair.length == 2) {
+                    infoMap.put(pair[0].trim(), pair[1].trim());
+                }
+            }
+        }
+        return infoMap;
+    }
+}

+ 37 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/service/validator/AdminUserValidator.java

@@ -0,0 +1,37 @@
+package cn.com.qmth.stmms.biz.api.auth.service.validator;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.stmms.biz.api.auth.interfaces.AuthValidator;
+import cn.com.qmth.stmms.biz.api.auth.model.AuthInfo;
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.common.enums.Role;
+
+@Component
+public class AdminUserValidator implements AuthValidator {
+
+    @Autowired
+    private AuthValidateService validateService;
+
+    @PostConstruct
+    protected void init() {
+        validateService.addValidator(this);
+    }
+
+    @Override
+    public boolean validate(AuthInfo auth) {
+        User user = auth.getLoginUser();
+        return user != null
+                && (user.getRoles().contains(Role.CAMPUS_ADMIN) || user.getRoles().contains(
+                        Role.SCHOOL_ADMIN));
+    }
+
+    @Override
+    public String getName() {
+        return "adminUser";
+    }
+
+}

+ 41 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/service/validator/AuthValidateService.java

@@ -0,0 +1,41 @@
+package cn.com.qmth.stmms.biz.api.auth.service.validator;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.stmms.biz.api.auth.interfaces.AuthValidator;
+
+@Service("authValidateService")
+public class AuthValidateService {
+
+    private Map<String, AuthValidator> map = new HashMap<String, AuthValidator>();
+
+    public List<AuthValidator> getValidators(String[] names) {
+        List<AuthValidator> list = new LinkedList<AuthValidator>();
+        list.add(getValidator("default"));
+
+        if (names != null && names.length > 0) {
+            for (String name : names) {
+                AuthValidator v = getValidator(name);
+                if (v != null) {
+                    list.add(v);
+                }
+            }
+        }
+        return list;
+    }
+
+    public AuthValidator getValidator(String name) {
+        return map.get(name);
+    }
+
+    protected void addValidator(AuthValidator validator) {
+        if (validator != null) {
+            map.put(validator.getName(), validator);
+        }
+    }
+}

+ 52 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/api/auth/service/validator/DefaultValidator.java

@@ -0,0 +1,52 @@
+package cn.com.qmth.stmms.biz.api.auth.service.validator;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.stmms.biz.api.auth.interfaces.AuthValidator;
+import cn.com.qmth.stmms.biz.api.auth.model.AuthInfo;
+import cn.com.qmth.stmms.biz.api.auth.model.BasicAuthInfo;
+import cn.com.qmth.stmms.biz.role.service.RoleAuthService;
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.biz.utils.RoleAuthUtil;
+import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
+
+@Component
+public class DefaultValidator implements AuthValidator {
+
+    @Autowired
+    private AuthValidateService validateService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private RoleAuthService roleService;
+
+    @PostConstruct
+    protected void init() {
+        validateService.addValidator(this);
+    }
+
+    @Override
+    public String getName() {
+        return "default";
+    }
+
+    @Override
+    public boolean validate(AuthInfo auth) {
+        BasicAuthInfo info = (BasicAuthInfo) auth;
+        User user = userService.findByLoginName(info.getLoginName());
+        if (user != null) {
+            if (user.getPassword().equals(Md5EncryptUtils.md5(info.getPassword()))) {
+                info.setLoginUser(RoleAuthUtil.buildRoleAuthByUser(user, roleService));
+                return true;
+            }
+        }
+        return false;
+    }
+
+}

+ 16 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/dao/CampusDao.java

@@ -0,0 +1,16 @@
+package cn.com.qmth.stmms.biz.campus.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.campus.model.Campus;
+
+public interface CampusDao extends PagingAndSortingRepository<Campus, Integer>, JpaSpecificationExecutor<Campus> {
+
+    public List<Campus> findBySchoolId(int schoolId);
+
+    public List<Campus> findBySchoolIdAndName(int schoolId, String name);
+
+}

+ 137 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/model/Campus.java

@@ -0,0 +1,137 @@
+package cn.com.qmth.stmms.biz.campus.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "b_campus")
+public class Campus implements Serializable {
+
+    private static final long serialVersionUID = -1056886453298677825L;
+
+    /**
+     * 主键
+     */
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 所属学校ID
+     */
+    @Column(name = "school_id")
+    private Integer schoolId;
+
+    /**
+     * 学习中心名称
+     */
+    private String name;
+
+    /**
+     * 省份
+     */
+    private String province;
+
+    /**
+     * 城市
+     */
+    private String city;
+
+    /**
+     * 地区
+     */
+    private String district;
+
+    /**
+     * 地址
+     */
+    private String address;
+
+    /**
+     * 电话
+     */
+    private String phone;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getDistrict() {
+        return district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+
+}

+ 58 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/query/CampusSearchQuery.java

@@ -0,0 +1,58 @@
+package cn.com.qmth.stmms.biz.campus.query;
+
+import cn.com.qmth.stmms.biz.common.BaseQuery;
+import cn.com.qmth.stmms.biz.campus.model.Campus;
+
+public class CampusSearchQuery extends BaseQuery<Campus> {
+
+    private Integer schoolId;
+
+    private String name;
+
+    private String province;
+
+    private String city;
+
+    private String district;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getDistrict() {
+        return district;
+    }
+
+    public void setDistrict(String district) {
+        this.district = district;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+
+}

+ 27 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/service/CampusService.java

@@ -0,0 +1,27 @@
+package cn.com.qmth.stmms.biz.campus.service;
+
+import java.util.List;
+import java.util.Map;
+
+import cn.com.qmth.stmms.biz.campus.model.Campus;
+import cn.com.qmth.stmms.biz.campus.query.CampusSearchQuery;
+
+public interface CampusService {
+
+    Campus save(Campus campus);
+
+    Campus findById(Integer id);
+
+    public Map<String, Campus> findBySchool(int schoolId);
+
+    List<Campus> findBySchoolId(int schoolId);
+
+    Campus findBySchoolAndName(int schoolId, String name);
+
+    public CampusSearchQuery findByQuery(final CampusSearchQuery query);
+
+    void deleteById(Integer id);
+
+    void delete(Campus campus);
+
+}

+ 117 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/campus/service/impl/CampusServiceImp.java

@@ -0,0 +1,117 @@
+package cn.com.qmth.stmms.biz.campus.service.impl;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.campus.dao.CampusDao;
+import cn.com.qmth.stmms.biz.campus.model.Campus;
+import cn.com.qmth.stmms.biz.campus.query.CampusSearchQuery;
+import cn.com.qmth.stmms.biz.campus.service.CampusService;
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+
+@Service("campusService")
+public class CampusServiceImp extends BaseQueryService<Campus> implements CampusService {
+
+    protected static Logger logger = LoggerFactory.getLogger(CampusServiceImp.class);
+
+    @Autowired
+    public CampusDao campusDao;
+
+    @Override
+    public Campus findById(Integer id) {
+        return campusDao.findOne(id);
+    }
+
+    public List<Campus> findBySchoolId(int schoolId) {
+        return campusDao.findBySchoolId(schoolId);
+    }
+
+    public Map<String, Campus> findBySchool(int schoolId) {
+        Map<String, Campus> map = new HashMap<String, Campus>();
+        List<Campus> list = findBySchoolId(schoolId);
+        if (list != null) {
+            for (Campus campus : list) {
+                map.put(campus.getName(), campus);
+            }
+        }
+        return map;
+    }
+
+    // @Cacheable(value = "campus_cache", key =
+    // "T(String).valueOf(#schoolId)+'-'+#name", condition = "#schoolId>0 &&
+    // #name!=null")
+    public Campus findBySchoolAndName(int schoolId, String name) {
+        List<Campus> list = campusDao.findBySchoolIdAndName(schoolId, name);
+        return list != null && list.size() > 0 ? list.get(0) : null;
+    }
+
+    public CampusSearchQuery findByQuery(final CampusSearchQuery query) {
+        checkQuery(query);
+        Page<Campus> result = campusDao.findAll(new Specification<Campus>() {
+
+            @Override
+            public Predicate toPredicate(Root<Campus> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                if (query.getSchoolId() != null) {
+                    predicates.add(cb.equal(root.get("schoolId"), query.getSchoolId()));
+                }
+                if (StringUtils.isNotBlank(query.getName())) {
+                    predicates.add(cb.like(root.get("name").as(String.class), query.getName() + "%"));
+                }
+                if (StringUtils.isNotBlank(query.getProvince())) {
+                    predicates.add(cb.equal(root.get("province"), query.getProvince()));
+                }
+                if (StringUtils.isNotBlank(query.getCity())) {
+                    predicates.add(cb.equal(root.get("city"), query.getCity()));
+                }
+                if (StringUtils.isNotBlank(query.getDistrict())) {
+                    predicates.add(cb.equal(root.get("district"), query.getDistrict()));
+                }
+                return predicates.isEmpty() ? cb.conjunction()
+                        : cb.and(predicates.toArray(new Predicate[predicates.size()]));
+            }
+
+        }, query);
+
+        fillResult(result, query);
+        return query;
+    }
+
+    @Transactional
+    // @CachePut(value = "campus_cache", key =
+    // "T(String).valueOf(#campus.schoolId)+'-'+#campus.name", condition =
+    // "#campus!=null && #campus.schoolId!=null && #campus.name!=null")
+    public Campus save(Campus campus) {
+        return campusDao.save(campus);
+    }
+
+    @Transactional
+    // @CacheEvict(value = "campus_cache", allEntries = true, beforeInvocation =
+    // true)
+    public void deleteById(Integer id) {
+        campusDao.delete(id);
+    }
+
+    @Transactional
+    // @CacheEvict(value = "campus_cache", allEntries = true, beforeInvocation =
+    // true)
+    public void delete(Campus campus) {
+        campusDao.delete(campus);
+    }
+}

+ 266 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/common/BaseQuery.java

@@ -0,0 +1,266 @@
+package cn.com.qmth.stmms.biz.common;
+
+import java.util.List;
+
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+
+public class BaseQuery<T> implements Pageable {
+
+    public static final int DEFAULT_PAGE_SIZE = 10;
+
+    private int pageNumber = 1;
+
+    private int pageSize = 10;
+
+    private Sort sort;
+
+    private List<T> result;
+
+    private long currentCount;
+
+    private int totalPage;
+
+    private long totalCount;
+
+    private int first;// 首页索引
+
+    private int last;// 尾页索引
+
+    private int prev;// 上一页索引
+
+    private int next;// 下一页索引
+
+    private boolean firstPage;// 是否是第一页
+
+    private boolean lastPage;// 是否是最后一页
+
+    private int length = 8;// 显示页面长度
+
+    private int slider = 1;// 前后显示页面长度
+
+    private String funcName = "page"; // 设置点击页码调用的js函数名称,默认为page,在一页有多个分页对象时使用。
+
+    private String message = ""; // 设置提示消息,显示在“共n条”之后
+
+    public List<T> getResult() {
+        return result;
+    }
+
+    public void setResult(List<T> result) {
+        this.result = result;
+    }
+
+    @Override
+    public int getOffset() {
+        return (pageNumber - 1) * pageSize;
+    }
+
+    public void setPageNumber(int pageNumber) {
+        this.pageNumber = pageNumber;
+    }
+
+    @Override
+    public int getPageNumber() {
+        return pageNumber;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    @Override
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public void setSort(Sort sort) {
+        this.sort = sort;
+    }
+
+    @Override
+    public Sort getSort() {
+        return sort;
+    }
+
+    public int getTotalPage() {
+        return totalPage;
+    }
+
+    public void setTotalPage(int totalPage) {
+        this.totalPage = totalPage;
+    }
+
+    public long getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(long totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public long getCurrentCount() {
+        return currentCount;
+    }
+
+    public void setCurrentCount(long currentCount) {
+        this.currentCount = currentCount;
+    }
+
+    /**
+     * 初始化参数
+     */
+    public void initialize() {
+
+        // 1
+        this.first = 1;
+
+        this.last = (int) (totalCount / (this.pageSize < 1 ? 20 : this.pageSize) + first - 1);
+
+        if (this.totalCount % this.pageSize != 0 || this.last == 0) {
+            this.last++;
+        }
+
+        if (this.last < this.first) {
+            this.last = this.first;
+        }
+
+        if (this.pageNumber <= 1) {
+            this.pageNumber = this.first;
+            this.firstPage = true;
+        }
+
+        if (this.pageNumber >= this.last) {
+            this.pageNumber = this.last;
+            this.lastPage = true;
+        }
+
+        if (this.pageNumber < this.last - 1) {
+            this.next = this.pageNumber + 1;
+        } else {
+            this.next = this.last;
+        }
+
+        if (this.pageNumber > 1) {
+            this.prev = this.pageNumber - 1;
+        } else {
+            this.prev = this.first;
+        }
+
+        // 2
+        if (this.pageNumber < this.first) {// 如果当前页小于首页
+            this.pageNumber = this.first;
+        }
+
+        if (this.pageNumber > this.last) {// 如果当前页大于尾页
+            this.pageNumber = this.last;
+        }
+
+    }
+
+    /**
+     * 默认输出当前分页标签 <div class="page">${page}</div>
+     */
+    @Override
+    public String toString() {
+
+        initialize();
+
+        StringBuilder sb = new StringBuilder();
+
+        if (pageNumber == first) {// 如果是首页
+            sb.append("<li class=\"disabled\"><a href=\"javascript:\">&#171; 上一页</a></li>\n");
+        } else {
+            sb.append("<li><a href=\"javascript:\" onclick=\"" + funcName + "(" + prev + "," + pageSize
+                    + ");\">&#171; 上一页</a></li>\n");
+        }
+
+        int begin = pageNumber - (length / 2);
+
+        if (begin < first) {
+            begin = first;
+        }
+
+        int end = begin + length - 1;
+
+        if (end >= last) {
+            end = last;
+            begin = end - length + 1;
+            if (begin < first) {
+                begin = first;
+            }
+        }
+
+        if (begin > first) {
+            int i = 0;
+            for (i = first; i < first + slider && i < begin; i++) {
+                sb.append("<li><a href=\"javascript:\" onclick=\"" + funcName + "(" + i + "," + pageSize + ");\">"
+                        + (i + 1 - first) + "</a></li>\n");
+            }
+            if (i < begin) {
+                sb.append("<li class=\"disabled\"><a href=\"javascript:\">...</a></li>\n");
+            }
+        }
+
+        for (int i = begin; i <= end; i++) {
+            if (i == pageNumber) {
+                sb.append("<li class=\"active\"><a href=\"javascript:\">" + (i + 1 - first) + "</a></li>\n");
+            } else {
+                sb.append("<li><a href=\"javascript:\" onclick=\"" + funcName + "(" + i + "," + pageSize + ");\">"
+                        + (i + 1 - first) + "</a></li>\n");
+            }
+        }
+
+        if (last - end > slider) {
+            sb.append("<li class=\"disabled\"><a href=\"javascript:\">...</a></li>\n");
+            end = last - slider;
+        }
+
+        for (int i = end + 1; i <= last; i++) {
+            sb.append("<li><a href=\"javascript:\" onclick=\"" + funcName + "(" + i + "," + pageSize + ");\">"
+                    + (i + 1 - first) + "</a></li>\n");
+        }
+
+        if (pageNumber == last) {
+            sb.append("<li class=\"disabled\"><a href=\"javascript:\">下一页 &#187;</a></li>\n");
+        } else {
+            sb.append("<li><a href=\"javascript:\" onclick=\"" + funcName + "(" + next + "," + pageSize + ");\">"
+                    + "下一页 &#187;</a></li>\n");
+        }
+
+        sb.append("<li class=\"disabled controls\"><a href=\"javascript:\">当前 ");
+        sb.append("<input type=\"text\" value=\"" + pageNumber
+                + "\" onkeypress=\"var e=window.event||this;var c=e.keyCode||e.which;if(c==13)");
+        sb.append(funcName + "(this.value," + pageSize + ");\" onclick=\"this.select();\"/> / ");
+        sb.append("<input type=\"text\" value=\"" + pageSize
+                + "\" onkeypress=\"var e=window.event||this;var c=e.keyCode||e.which;if(c==13)");
+        sb.append(funcName + "(" + pageNumber + ",this.value);\" onclick=\"this.select();\"/> 页,");
+        sb.append("共 " + totalCount + " 条" + (message != null ? message : "") + "</a><li>\n");
+
+        sb.insert(0, "<ul>\n").append("</ul>\n");
+
+        sb.append("<div style=\"clear:both;\"></div>");
+
+        // sb.insert(0,"<div class=\"page\">\n").append("</div>\n");
+
+        return sb.toString();
+    }
+
+    /**
+     * 获取分页HTML代码
+     * 
+     * @return
+     */
+    public String getHtml() {
+        return toString();
+    }
+
+    public boolean isFirstPage() {
+        return firstPage;
+    }
+
+    public boolean isLastPage() {
+        return lastPage;
+    }
+
+}

+ 28 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/common/BaseQueryService.java

@@ -0,0 +1,28 @@
+package cn.com.qmth.stmms.biz.common;
+
+import org.springframework.data.domain.Page;
+
+public class BaseQueryService<T> {
+
+    public void checkQuery(BaseQuery<T> query) {
+        if (query.getPageNumber() < 1) {
+            query.setPageNumber(1);
+        }
+        if (query.getPageSize() < 1) {
+            query.setPageSize(10);
+        }
+    }
+
+    public void fillResult(Page<T> result, BaseQuery<T> query) {
+        if (result != null) {
+            query.setTotalCount(result.getTotalElements());
+            query.setTotalPage(result.getTotalPages());
+            query.setCurrentCount(result.getNumberOfElements());
+            query.setResult(result.getContent());
+        } else {
+            query.setTotalCount(0);
+            query.setTotalPage(0);
+            query.setCurrentCount(0);
+        }
+    }
+}

+ 16 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/CaseHistoryDao.java

@@ -0,0 +1,16 @@
+package cn.com.qmth.stmms.biz.distributpaper.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.CaseHistory;
+
+public interface CaseHistoryDao extends PagingAndSortingRepository<CaseHistory, Integer>,
+        JpaSpecificationExecutor<CaseHistory> {
+
+    List<CaseHistory> findByLibraryId(Integer libraryId);
+
+    List<CaseHistory> findByLibraryIdAndScorer(Integer libraryId, Integer scorer);
+}

+ 26 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/CaseLibraryDao.java

@@ -0,0 +1,26 @@
+package cn.com.qmth.stmms.biz.distributpaper.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.CaseLibrary;
+
+public interface CaseLibraryDao extends PagingAndSortingRepository<CaseLibrary, Integer>,
+        JpaSpecificationExecutor<CaseLibrary> {
+
+    List<CaseLibrary> findByExamIdAndBlockId(Integer examId, Integer blockId);
+
+    List<CaseLibrary> findByExamIdAndBlockIdAndSubjectCode(Integer examId, Integer blockId, String subjectCode);
+
+    List<CaseLibrary> findByBlockIdAndSecretNo(Integer blockId, Integer secretNo);
+
+    List<CaseLibrary> findByBlockId(Integer blockId);
+
+    @Modifying
+    @Query("update CaseLibrary c set c.getCount=c.getCount+1 where c.id=?1")
+    void incrGetCount(Integer id);
+}

+ 18 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/FormallyHistoryDao.java

@@ -0,0 +1,18 @@
+package cn.com.qmth.stmms.biz.distributpaper.dao;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.FormallyHistory;
+
+public interface FormallyHistoryDao extends PagingAndSortingRepository<FormallyHistory, Integer>,
+        JpaSpecificationExecutor<FormallyHistory> {
+
+    List<FormallyHistory> findByLibraryId(int libraryId, Sort sort);
+
+    List<FormallyHistory> findByScorer(int markerId);
+
+}

+ 53 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/FormallyLibraryDao.java

@@ -0,0 +1,53 @@
+package cn.com.qmth.stmms.biz.distributpaper.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.FormallyLibrary;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+public interface FormallyLibraryDao extends PagingAndSortingRepository<FormallyLibrary, Integer>,
+        JpaSpecificationExecutor<FormallyLibrary> {
+
+    List<FormallyLibrary> findByExamIdAndBlockId(Integer examId, Integer blockId);
+
+    List<FormallyLibrary> findByExamIdAndBlockIdAndStatus(Integer examId, Integer blockId, LibraryStatus status);
+
+    List<FormallyLibrary> findByExamIdAndBlockIdAndStatusAndIsChecked(Integer examId, Integer blockId,
+            LibraryStatus status, boolean isChecked);
+
+    List<FormallyLibrary> findByExamIdAndBlockIdAndGetter(Integer examId, Integer blockId, Integer getter);
+
+    List<FormallyLibrary> findByBlockIdAndSecretNo(Integer blockId, Integer secretNo);
+
+    List<FormallyLibrary> findByExamIdAndBlockIdAndGetterAndStatus(int examId, int blockId, int getter,
+            LibraryStatus status);
+
+    @Query("select count(*) from FormallyLibrary f where f.examId=?1 and f.subjectCode=?2 and f.blockId=?3")
+    Long getCountByExamIdAndSubjectCodeAndBlockId(Integer examId, String subjectCode, Integer blockId);
+
+    List<FormallyLibrary> findByExamIdAndSubjectCodeAndStatus(Integer examId, String subjectCode, LibraryStatus status);
+
+    @Query("select count(*) from FormallyLibrary f where f.examId=?1 and f.subjectCode=?2 and f.blockId=?3 and f.getter=?4 and f.status=?5")
+    Long endingCount(Integer examId, String subjectCode, Integer blockId, Integer getterId, LibraryStatus status);
+
+    List<FormallyLibrary> findByExamIdAndSubjectCodeAndBlockIdAndSecretNoAndStatus(int examId, String subjectCode, int blockId, int secretNo, LibraryStatus status);
+
+    List<FormallyLibrary> findByExamIdAndSubjectCodeAndBlockId(int examId, String subjectCode, int blockId);
+
+    @Query("select count(*) from FormallyLibrary f where f.examId=?1 and f.subjectCode=?2 and f.blockId=?3 and f.status=?4")
+    Long getCountByExamIdAndSubjectCodeAndBlockIdAndStatus(Integer examId, String subjectCode, Integer blockId,
+            LibraryStatus status);
+
+    @Query("select f from FormallyLibrary f where f.examId=?1 and f.subjectCode=?2 and f.blockId=?3 and f.status=?4 and f.getter=?5")
+    List<FormallyLibrary> endTask(Integer examId, String subjectCode, Integer blockId, LibraryStatus status, Integer id1);
+
+    @Modifying
+    @Query("update FormallyLibrary f set f.status=?2 where f.id=?1")
+    void updateStatusById(int id, LibraryStatus status);
+
+}

+ 18 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/ProblemHistoryDao.java

@@ -0,0 +1,18 @@
+package cn.com.qmth.stmms.biz.distributpaper.dao;
+
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.ProblemHistory;
+
+public interface ProblemHistoryDao extends PagingAndSortingRepository<ProblemHistory, Integer> {
+
+    /*
+     * List<ProblemHistory>
+     * findByExamIdAndSubjectIdAndSchoolIdAndStatusAndIsChecked(Integer examId,
+     * Integer subjectId, Integer schoolId, Integer status, boolean isChecked);
+     * 
+     * List<ProblemHistory>
+     * findByExamIdAndSubjectIdAndSchoolIdAndBlockId(Integer examId, Integer
+     * subjectId, Integer schoolId, Integer blockId);
+     */
+}

+ 15 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/ProblemLibraryDao.java

@@ -0,0 +1,15 @@
+package cn.com.qmth.stmms.biz.distributpaper.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.ProblemLibrary;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+public interface ProblemLibraryDao extends PagingAndSortingRepository<ProblemLibrary, Integer>,
+        JpaSpecificationExecutor<ProblemLibrary> {
+
+    List<ProblemLibrary> findByLibraryIdAndStatus(int libraryId, LibraryStatus status);
+}

+ 18 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/StandardHistoryDao.java

@@ -0,0 +1,18 @@
+package cn.com.qmth.stmms.biz.distributpaper.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.StandardHistory;
+
+public interface StandardHistoryDao extends PagingAndSortingRepository<StandardHistory, Integer>,
+        JpaSpecificationExecutor<StandardHistory> {
+
+    List<StandardHistory> findByLibraryId(Integer libraryId);
+
+    List<StandardHistory> findByLibraryIdAndScorer(Integer libraryId, Integer scorer);
+
+    List<StandardHistory> findByScorer(Integer scorerId);
+}

+ 26 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/StandardLibraryDao.java

@@ -0,0 +1,26 @@
+package cn.com.qmth.stmms.biz.distributpaper.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.StandardLibrary;
+
+public interface StandardLibraryDao extends PagingAndSortingRepository<StandardLibrary, Integer>,
+        JpaSpecificationExecutor<StandardLibrary> {
+
+    List<StandardLibrary> findByExamIdAndBlockId(Integer examId, Integer blockId);
+
+    List<StandardLibrary> findByExamIdAndBlockIdAndSubjectCode(Integer examId, Integer blockId, String subjectCode);
+
+    List<StandardLibrary> findByBlockIdAndSecretNo(Integer blockId, Integer secretNo);
+
+    List<StandardLibrary> findByBlockId(Integer blockId);
+
+    @Modifying
+    @Query("update StandardLibrary s set s.getCount=s.getCount+1 where s.id=?1")
+    void incrGetCount(Integer id);
+}

+ 18 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/TryHistoryDao.java

@@ -0,0 +1,18 @@
+package cn.com.qmth.stmms.biz.distributpaper.dao;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.TryHistory;
+
+public interface TryHistoryDao extends PagingAndSortingRepository<TryHistory, Integer>,
+        JpaSpecificationExecutor<TryHistory> {
+
+    List<TryHistory> findByLibraryIdAndScorer(int libraryId, int scorer);
+
+    List<TryHistory> findByLibraryId(int libraryId, Sort sort);
+
+}

+ 33 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/dao/TryLibraryDao.java

@@ -0,0 +1,33 @@
+package cn.com.qmth.stmms.biz.distributpaper.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.TryLibrary;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+public interface TryLibraryDao extends PagingAndSortingRepository<TryLibrary, Integer>,
+        JpaSpecificationExecutor<TryLibrary> {
+
+    List<TryLibrary> findByExamIdAndBlockId(int examId, int blockId);
+
+    List<TryLibrary> findByExamIdAndBlockIdAndStatusAndIsChecked(int examId, int blockId, LibraryStatus status,
+            boolean isChecked);
+
+    List<TryLibrary> findByBlockIdAndSecretNo(int blockId, int secretNo);
+
+    List<TryLibrary> findByExamIdAndBlockIdAndGetterAndStatus(int examId, int blockId, int getter, LibraryStatus status);
+
+    List<TryLibrary> findByExamIdAndBlockIdAndStatus(int examId, int blockId, LibraryStatus status);
+
+    List<TryLibrary> findByExamIdAndSubjectCodeAndBlockIdAndSecretNoAndStatus(int examId, String subjectCode, int blockId, int secretNo, LibraryStatus status);
+
+    @Modifying
+    @Query("update TryLibrary f set f.status=?2 where f.id=?1")
+    void updateStatusById(int id, LibraryStatus status);
+
+}

+ 174 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/CaseHistory.java

@@ -0,0 +1,174 @@
+package cn.com.qmth.stmms.biz.distributpaper.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.common.enums.LibraryType;
+
+@Entity
+@Table(name = "m_case_history")
+public class CaseHistory implements Serializable {
+
+    private static final long serialVersionUID = 5981774838980004673L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 样卷库ID
+     */
+    @Column(name = "library_id")
+    private Integer libraryId;
+
+    /**
+     * 一评,二评
+     */
+    @Column(name = "stage")
+    private Integer stage;
+
+    /**
+     * 评卷人
+     */
+    @Column(name = "scorer")
+    private Integer scorer;
+
+    /**
+     * 领卷时间
+     */
+    @Column(name = "score_time")
+    private Date scoreTime;
+
+    /**
+     * 总得分
+     */
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    /**
+     * 分值列表
+     */
+    @Column(name = "score_list")
+    private String scoreList;
+
+    /**
+     * 所花时间,以秒为单位
+     */
+    @Column(name = "spent")
+    private Long spent;
+
+    /**
+     * 1:试评2:正评
+     */
+    @Column(name = "type")
+    @Enumerated(EnumType.ORDINAL)
+    private LibraryType type;
+
+    /**
+     * 状态:1正常给分2问题卷给分3需仲裁
+     */
+    @Column(name = "status")
+    private Integer status;
+
+    @Transient
+    private Marker marker;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getScorer() {
+        return scorer;
+    }
+
+    public void setScorer(Integer scorer) {
+        this.scorer = scorer;
+    }
+
+    public Date getScoreTime() {
+        return scoreTime;
+    }
+
+    public void setScoreTime(Date scoreTime) {
+        this.scoreTime = scoreTime;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(String scoreList) {
+        this.scoreList = scoreList;
+    }
+
+    public Long getSpent() {
+        return spent;
+    }
+
+    public void setSpent(Long spent) {
+        this.spent = spent;
+    }
+
+    public Integer getStage() {
+        return stage;
+    }
+
+    public void setStage(Integer stage) {
+        this.stage = stage;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Marker getMarker() {
+        return marker;
+    }
+
+    public void setMarker(Marker marker) {
+        this.marker = marker;
+    }
+
+    public Integer getLibraryId() {
+        return libraryId;
+    }
+
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
+    }
+
+    public LibraryType getType() {
+        return type;
+    }
+
+    public void setType(LibraryType type) {
+        this.type = type;
+    }
+
+}

+ 246 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/CaseLibrary.java

@@ -0,0 +1,246 @@
+package cn.com.qmth.stmms.biz.distributpaper.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveBlock;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+@Entity
+@Table(name = "m_case_library")
+public class CaseLibrary implements Serializable {
+
+    private static final long serialVersionUID = -3007844827459700822L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 学习中心Code
+     */
+    @Column(name = "campus_code")
+    private String campusCode;
+
+    /**
+     * 考试ID
+     */
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    /**
+     * 科目CODE
+     */
+    @Column(name = "subject_code")
+    private String subjectCode;
+
+    /**
+     * 科目块ID
+     */
+    @Column(name = "block_id")
+    private Integer blockId;
+
+    /**
+     * 密号
+     */
+    @Column(name = "secret_no")
+    private Integer secretNo;
+
+    /**
+     * 准考证号
+     */
+    @Column(name = "exam_number")
+    private String examNumber;
+
+    @Column(name = "pic_count")
+    private Integer picCount;
+
+    /**
+     * 总分
+     */
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    /**
+     * 分值列表
+     */
+    @Column(name = "score_list")
+    private String scoreList;
+
+    /**
+     * 采样人
+     */
+    @Column(name = "sampler")
+    private Integer sampler;
+
+    /**
+     * 采样时间
+     */
+    @Column(name = "sample_time")
+    private Date sampleTime;
+
+    /**
+     * 状态,0:已领取1:未领取
+     */
+    @Column(name = "status")
+    @Enumerated(EnumType.ORDINAL)
+    private LibraryStatus status;
+
+    /**
+     * 领取数量
+     */
+    @Column(name = "get_count")
+    private Integer getCount;
+
+    private transient SubjectiveBlock subjectiveBlock;
+
+    private transient String pictureConfig;
+
+    private transient List<String> pictureUrls;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getSecretNo() {
+        return secretNo;
+    }
+
+    public void setSecretNo(Integer secretNo) {
+        this.secretNo = secretNo;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public Integer getBlockId() {
+        return blockId;
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.blockId = blockId;
+    }
+
+    public String getCampusCode() {
+        return campusCode;
+    }
+
+    public void setCampusCode(String campusCode) {
+        this.campusCode = campusCode;
+    }
+
+    public LibraryStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(LibraryStatus status) {
+        this.status = status;
+    }
+
+    public Integer getGetCount() {
+        return getCount;
+    }
+
+    public void setGetCount(Integer getCount) {
+        this.getCount = getCount;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(String scoreList) {
+        this.scoreList = scoreList;
+    }
+
+    public Integer getSampler() {
+        return sampler;
+    }
+
+    public void setSampler(Integer sampler) {
+        this.sampler = sampler;
+    }
+
+    public Date getSampleTime() {
+        return sampleTime;
+    }
+
+    public void setSampleTime(Date sampleTime) {
+        this.sampleTime = sampleTime;
+    }
+
+    public SubjectiveBlock getSubjectiveBlock() {
+        return subjectiveBlock;
+    }
+
+    public void setSubjectiveBlock(SubjectiveBlock subjectiveBlock) {
+        this.subjectiveBlock = subjectiveBlock;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public Integer getPicCount() {
+        return picCount;
+    }
+
+    public void setPicCount(Integer picCount) {
+        this.picCount = picCount;
+    }
+
+    public String getPictureConfig() {
+        return pictureConfig;
+    }
+
+    public void setPictureConfig(String pictureConfig) {
+        this.pictureConfig = pictureConfig;
+    }
+
+    public List<String> getPictureUrls() {
+        return pictureUrls;
+    }
+
+    public void setPictureUrls(List<String> pictureUrls) {
+        this.pictureUrls = pictureUrls;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+}

+ 160 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/FormallyHistory.java

@@ -0,0 +1,160 @@
+package cn.com.qmth.stmms.biz.distributpaper.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.common.enums.HistoryType;
+
+@Entity
+@Table(name = "m_formally_history")
+public class FormallyHistory implements Serializable {
+
+    private static final long serialVersionUID = 1751016902951510338L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 正评库ID
+     */
+    @Column(name = "library_id")
+    private Integer libraryId;
+
+    /**
+     * 一评,二评
+     */
+    @Column(name = "stage")
+    private Integer stage;
+
+    /**
+     * 评卷人
+     */
+    @Column(name = "scorer")
+    private Integer scorer;
+
+    /**
+     * 给分时间
+     */
+    @Column(name = "score_time")
+    private Date scoreTime;
+
+    /**
+     * 总得分
+     */
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    /**
+     * 分值列表
+     */
+    @Column(name = "score_list")
+    private String scoreList;
+
+    /**
+     * 所花时间,以秒为单位
+     */
+    @Column(name = "spent")
+    private Long spent;
+
+    /**
+     * 类型
+     */
+    @Column(name = "type")
+    @Enumerated(EnumType.ORDINAL)
+    private HistoryType type;
+
+    @Transient
+    private Marker marker;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLibraryId() {
+        return libraryId;
+    }
+
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
+    }
+
+    public Integer getStage() {
+        return stage;
+    }
+
+    public void setStage(Integer stage) {
+        this.stage = stage;
+    }
+
+    public Integer getScorer() {
+        return scorer;
+    }
+
+    public void setScorer(Integer scorer) {
+        this.scorer = scorer;
+    }
+
+    public Date getScoreTime() {
+        return scoreTime;
+    }
+
+    public void setScoreTime(Date scoreTime) {
+        this.scoreTime = scoreTime;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(String scoreList) {
+        this.scoreList = scoreList;
+    }
+
+    public Long getSpent() {
+        return spent;
+    }
+
+    public void setSpent(Long spent) {
+        this.spent = spent;
+    }
+
+    public HistoryType getType() {
+        return type;
+    }
+
+    public void setType(HistoryType type) {
+        this.type = type;
+    }
+
+    public Marker getMarker() {
+        return marker;
+    }
+
+    public void setMarker(Marker marker) {
+        this.marker = marker;
+    }
+
+}

+ 309 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/FormallyLibrary.java

@@ -0,0 +1,309 @@
+package cn.com.qmth.stmms.biz.distributpaper.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+@Entity
+@Table(name = "m_formally_library")
+public class FormallyLibrary implements Serializable {
+
+    private static final long serialVersionUID = 7121951721670633060L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 学习中心CODE
+     */
+    @Column(name = "campus_code")
+    private String campusCode;
+
+    /**
+     * 考试ID
+     */
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    /**
+     * 科目CODE
+     */
+    @Column(name = "subject_code")
+    private String subjectCode;
+
+    /**
+     * 科目块ID
+     */
+    @Column(name = "block_id")
+    private Integer blockId;
+
+    /**
+     * 密号
+     */
+    @Column(name = "secret_no")
+    private Integer secretNo;
+
+    /**
+     * 准考证号
+     */
+    @Column(name = "exam_number")
+    private String examNumber;
+
+    /**
+     * 小图数量
+     */
+    @Column(name = "pic_count")
+    private Integer picCount;
+
+    /**
+     * 评卷员
+     */
+    @Column(name = "getter")
+    private Integer getter;
+
+    /**
+     * 评卷时间
+     */
+    @Column(name = "get_time")
+    private Date getTime;
+
+    /**
+     * 任务状态
+     */
+    @Column(name = "status")
+    @Enumerated(EnumType.ORDINAL)
+    private LibraryStatus status;
+
+    /**
+     * 当前大题的多评次数
+     */
+    @Column(name = "marker_count")
+    private Integer markerCount;
+
+    /**
+     * 多评情况下,当前任务的序号
+     */
+    private Integer number;
+
+    /**
+     * 是否已抽查
+     */
+    @Column(name = "is_checked")
+    private boolean isChecked;
+
+    /**
+     * 科组长最终给分
+     */
+    @Column(name = "header_score")
+    private Double headerScore;
+
+    /**
+     * 科组长最终给分列表
+     */
+    @Column(name = "header_score_list")
+    private String headerScoreList;
+
+    /**
+     * 评卷员最终给分
+     */
+    @Column(name = "marker_score")
+    private Double markerScore;
+
+    /**
+     * 评卷员最终给分列表
+     */
+    @Column(name = "marker_score_list")
+    private String markerScoreList;
+
+    /**
+     * 客观题得分
+     */
+    @Column(name = "objective_score")
+    private Double objectiveScore;
+
+    public FormallyLibrary clone() {
+        FormallyLibrary library = new FormallyLibrary();
+        library.setExamId(examId);
+        library.setCampusCode(campusCode);
+        library.setSubjectCode(subjectCode);
+        library.setBlockId(blockId);
+        library.setSecretNo(secretNo);
+        library.setExamNumber(examNumber);
+        library.setPicCount(picCount);
+        library.setGetter(getter);
+        library.setGetTime(getTime);
+        library.setStatus(status);
+        library.setMarkerCount(markerCount);
+        library.setNumber(number);
+        library.setChecked(isChecked);
+        library.setHeaderScore(headerScore);
+        library.setMarkerScore(markerScore);
+        library.setHeaderScoreList(headerScoreList);
+        library.setMarkerScoreList(markerScoreList);
+        library.setObjectiveScore(objectiveScore);
+        return library;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getSecretNo() {
+        return secretNo;
+    }
+
+    public void setSecretNo(Integer secretNo) {
+        this.secretNo = secretNo;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public Integer getBlockId() {
+        return blockId;
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.blockId = blockId;
+    }
+
+    public String getCampusCode() {
+        return campusCode;
+    }
+
+    public void setCampusCode(String campusCode) {
+        this.campusCode = campusCode;
+    }
+
+    public Integer getGetter() {
+        return getter;
+    }
+
+    public void setGetter(Integer getter) {
+        this.getter = getter;
+    }
+
+    public Date getGetTime() {
+        return getTime;
+    }
+
+    public void setGetTime(Date getTime) {
+        this.getTime = getTime;
+    }
+
+    public LibraryStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(LibraryStatus status) {
+        this.status = status;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public boolean isChecked() {
+        return isChecked;
+    }
+
+    public void setChecked(boolean isChecked) {
+        this.isChecked = isChecked;
+    }
+
+    public Integer getMarkerCount() {
+        return markerCount;
+    }
+
+    public void setMarkerCount(Integer markerCount) {
+        this.markerCount = markerCount;
+    }
+
+    public Double getHeaderScore() {
+        return headerScore;
+    }
+
+    public void setHeaderScore(Double headerScore) {
+        this.headerScore = headerScore;
+    }
+
+    public Double getMarkerScore() {
+        return markerScore;
+    }
+
+    public void setMarkerScore(Double markerScore) {
+        this.markerScore = markerScore;
+    }
+
+    public String getHeaderScoreList() {
+        return headerScoreList;
+    }
+
+    public void setHeaderScoreList(String headerScoreList) {
+        this.headerScoreList = headerScoreList;
+    }
+
+    public String getMarkerScoreList() {
+        return markerScoreList;
+    }
+
+    public void setMarkerScoreList(String markerScoreList) {
+        this.markerScoreList = markerScoreList;
+    }
+
+    public Integer getPicCount() {
+        return picCount;
+    }
+
+    public void setPicCount(Integer picCount) {
+        this.picCount = picCount;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public Double getObjectiveScore() {
+        return objectiveScore;
+    }
+
+    public void setObjectiveScore(Double objectiveScore) {
+        this.objectiveScore = objectiveScore;
+    }
+
+}

+ 158 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/ProblemHistory.java

@@ -0,0 +1,158 @@
+package cn.com.qmth.stmms.biz.distributpaper.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+@Entity
+@Table(name = "m_problem_history")
+public class ProblemHistory implements Serializable {
+
+    private static final long serialVersionUID = 5760219635508062736L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 问题卷库ID
+     */
+    @Column(name = "library_id")
+    private Integer libraryId;
+
+    /**
+     * 总得分
+     */
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    /**
+     * 分值列表
+     */
+    @Column(name = "score_list")
+    private String scoreList;
+
+    /**
+     * 所花时间,以秒为单位
+     */
+    @Column(name = "spent")
+    private Long spent;
+
+    @Enumerated(EnumType.ORDINAL)
+    @Column(name = "status")
+    private LibraryStatus status;
+
+    /**
+     * 提交人
+     */
+    @Column(name = "submitter")
+    private Integer submitter;
+
+    /**
+     * 领卷时间
+     */
+    @Column(name = "submit_time")
+    private Date submitTime;
+
+    /**
+     * 类型:0:样卷1:试评2:正评
+     */
+    @Column(name = "type")
+    private Integer type;
+
+    /**
+     * 1:一评2:二评
+     */
+    @Column(name = "stage")
+    private Integer stage;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLibraryId() {
+        return libraryId;
+    }
+
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(String scoreList) {
+        this.scoreList = scoreList;
+    }
+
+    public Long getSpent() {
+        return spent;
+    }
+
+    public void setSpent(Long spent) {
+        this.spent = spent;
+    }
+
+    public LibraryStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(LibraryStatus status) {
+        this.status = status;
+    }
+
+    public Integer getSubmitter() {
+        return submitter;
+    }
+
+    public void setSubmitter(Integer submitter) {
+        this.submitter = submitter;
+    }
+
+    public Date getSubmitTime() {
+        return submitTime;
+    }
+
+    public void setSubmitTime(Date submitTime) {
+        this.submitTime = submitTime;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public Integer getStage() {
+        return stage;
+    }
+
+    public void setStage(Integer stage) {
+        this.stage = stage;
+    }
+
+}

+ 265 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/ProblemLibrary.java

@@ -0,0 +1,265 @@
+package cn.com.qmth.stmms.biz.distributpaper.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveBlock;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.LibraryType;
+
+@Entity
+@Table(name = "m_problem_library")
+public class ProblemLibrary implements Serializable {
+
+    private static final long serialVersionUID = -8940367483803324547L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 学习中心CODE
+     */
+    @Column(name = "campus_code")
+    private String campusCode;
+
+    /**
+     * 考试ID
+     */
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    /**
+     * 科目CODE
+     */
+    @Column(name = "subject_Code")
+    private String subjectCode;
+
+    /**
+     * 库ID
+     */
+    @Column(name = "library_id")
+    private Integer libraryId;
+
+    /**
+     * 类型:0:样卷1:试评2:正评
+     */
+    @Column(name = "type")
+    @Enumerated(EnumType.ORDINAL)
+    private LibraryType type;
+
+    /**
+     * 科目块ID
+     */
+    @Column(name = "block_id")
+    private Integer blockId;
+
+    /**
+     * 密号
+     */
+    @Column(name = "secret_no")
+    private Integer secretNo;
+
+    /**
+     * 原因
+     */
+    @Column(name = "reason")
+    private Integer reason;
+
+    /**
+     * 发生时间
+     */
+    @Column(name = "submit_time")
+    private Date submitTime;
+
+    /**
+     * 提交人ID
+     */
+    @Column(name = "submitter")
+    private Integer submitter;
+
+    /**
+     * 状态
+     */
+    @Enumerated(EnumType.ORDINAL)
+    @Column(name = "status")
+    private LibraryStatus status;
+
+    /**
+     * 一评、二评
+     */
+    @Transient
+    private Integer stage;
+
+    @Transient
+    private Marker marker;
+
+    @Transient
+    private SubjectiveBlock subjectiveBlock;
+
+    @Transient
+    private String pictureConfig;
+
+    @Transient
+    private List<String> pictureUrls;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getSecretNo() {
+        return secretNo;
+    }
+
+    public void setSecretNo(Integer secretNo) {
+        this.secretNo = secretNo;
+    }
+
+    public Integer getBlockId() {
+        return blockId;
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.blockId = blockId;
+    }
+
+    public Integer getReason() {
+        return reason;
+    }
+
+    public void setReason(Integer reason) {
+        this.reason = reason;
+    }
+
+    public Date getSubmitTime() {
+        return submitTime;
+    }
+
+    public void setSubmitTime(Date submitTime) {
+        this.submitTime = submitTime;
+    }
+
+    public Integer getSubmitter() {
+        return submitter;
+    }
+
+    public void setSubmitter(Integer submitter) {
+        this.submitter = submitter;
+    }
+
+    public Marker getMarker() {
+        return marker;
+    }
+
+    public void setMarker(Marker marker) {
+        this.marker = marker;
+    }
+
+    public SubjectiveBlock getSubjectiveBlock() {
+        return subjectiveBlock;
+    }
+
+    public void setSubjectiveBlock(SubjectiveBlock subjectiveBlock) {
+        this.subjectiveBlock = subjectiveBlock;
+    }
+
+    public Integer getStage() {
+        return stage;
+    }
+
+    public void setStage(Integer stage) {
+        this.stage = stage;
+    }
+
+    public LibraryType getType() {
+        return type;
+    }
+
+    public void setType(LibraryType type) {
+        this.type = type;
+    }
+
+    public Integer getLibraryId() {
+        return libraryId;
+    }
+
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
+    }
+
+    public LibraryStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(LibraryStatus status) {
+        this.status = status;
+    }
+
+    public String getPictureConfig() {
+        return pictureConfig;
+    }
+
+    public void setPictureConfig(String pictureConfig) {
+        this.pictureConfig = pictureConfig;
+    }
+
+    public String getPictureUrls() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("[");
+        if (pictureUrls != null && pictureUrls.size() > 0) {
+            int length = pictureUrls.size();
+            for (int i = 0; i < length; i++) {
+                sb.append("\"").append(pictureUrls.get(i)).append("\"");
+                if (i < (length - 1)) {
+                    sb.append(",");
+                }
+            }
+        }
+        sb.append("]");
+        return sb.toString();
+    }
+
+    public void setPictureUrls(List<String> pictureUrls) {
+        this.pictureUrls = pictureUrls;
+    }
+
+    public String getCampusCode() {
+        return campusCode;
+    }
+
+    public void setCampusCode(String campusCode) {
+        this.campusCode = campusCode;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+}

+ 174 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/StandardHistory.java

@@ -0,0 +1,174 @@
+package cn.com.qmth.stmms.biz.distributpaper.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.common.enums.LibraryType;
+
+@Entity
+@Table(name = "m_standard_history")
+public class StandardHistory implements Serializable {
+
+    private static final long serialVersionUID = 3265772212222711113L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 样卷库ID
+     */
+    @Column(name = "library_id")
+    private Integer libraryId;
+
+    /**
+     * 一评,二评
+     */
+    @Column(name = "stage")
+    private Integer stage;
+
+    /**
+     * 评卷人
+     */
+    @Column(name = "scorer")
+    private Integer scorer;
+
+    /**
+     * 领卷时间
+     */
+    @Column(name = "score_time")
+    private Date scoreTime;
+
+    /**
+     * 总得分
+     */
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    /**
+     * 分值列表
+     */
+    @Column(name = "score_list")
+    private String scoreList;
+
+    /**
+     * 所花时间,以秒为单位
+     */
+    @Column(name = "spent")
+    private Long spent;
+
+    /**
+     * 1:试评2:正评
+     */
+    @Column(name = "type")
+    @Enumerated(EnumType.ORDINAL)
+    private LibraryType type;
+
+    /**
+     * 状态:1正常给分2问题卷给分3需仲裁
+     */
+    @Column(name = "status")
+    private Integer status;
+
+    @Transient
+    private Marker marker;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getScorer() {
+        return scorer;
+    }
+
+    public void setScorer(Integer scorer) {
+        this.scorer = scorer;
+    }
+
+    public Date getScoreTime() {
+        return scoreTime;
+    }
+
+    public void setScoreTime(Date scoreTime) {
+        this.scoreTime = scoreTime;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(String scoreList) {
+        this.scoreList = scoreList;
+    }
+
+    public Long getSpent() {
+        return spent;
+    }
+
+    public void setSpent(Long spent) {
+        this.spent = spent;
+    }
+
+    public Integer getStage() {
+        return stage;
+    }
+
+    public void setStage(Integer stage) {
+        this.stage = stage;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Marker getMarker() {
+        return marker;
+    }
+
+    public void setMarker(Marker marker) {
+        this.marker = marker;
+    }
+
+    public Integer getLibraryId() {
+        return libraryId;
+    }
+
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
+    }
+
+    public LibraryType getType() {
+        return type;
+    }
+
+    public void setType(LibraryType type) {
+        this.type = type;
+    }
+
+}

+ 246 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/StandardLibrary.java

@@ -0,0 +1,246 @@
+package cn.com.qmth.stmms.biz.distributpaper.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveBlock;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+@Entity
+@Table(name = "m_standard_library")
+public class StandardLibrary implements Serializable {
+
+    private static final long serialVersionUID = 986913961826350864L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 学习中心CODE
+     */
+    @Column(name = "campus_code")
+    private String campusCode;
+
+    /**
+     * 考试ID
+     */
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    /**
+     * 科目CODE
+     */
+    @Column(name = "subject_code")
+    private String subjectCode;
+
+    /**
+     * 科目块ID
+     */
+    @Column(name = "block_id")
+    private Integer blockId;
+
+    /**
+     * 密号
+     */
+    @Column(name = "secret_no")
+    private Integer secretNo;
+
+    /**
+     * 准考证号
+     */
+    @Column(name = "exam_number")
+    private String examNumber;
+
+    @Column(name = "pic_count")
+    private Integer picCount;
+
+    /**
+     * 总分
+     */
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    /**
+     * 分值列表
+     */
+    @Column(name = "score_list")
+    private String scoreList;
+
+    /**
+     * 创建人
+     */
+    @Column(name = "creator")
+    private Integer creator;
+
+    /**
+     * 采样时间
+     */
+    @Column(name = "create_time")
+    private Date createTime;
+
+    /**
+     * 状态,0:已领取1:未领取
+     */
+    @Column(name = "status")
+    @Enumerated(EnumType.ORDINAL)
+    private LibraryStatus status;
+
+    /**
+     * 领取数量
+     */
+    @Column(name = "get_count")
+    private Integer getCount;
+
+    private transient SubjectiveBlock subjectiveBlock;
+
+    private transient String pictureConfig;
+
+    private transient List<String> pictureUrls;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getSecretNo() {
+        return secretNo;
+    }
+
+    public void setSecretNo(Integer secretNo) {
+        this.secretNo = secretNo;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public Integer getBlockId() {
+        return blockId;
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.blockId = blockId;
+    }
+
+    public String getCampusCode() {
+        return campusCode;
+    }
+
+    public void setCampusCode(String campusCode) {
+        this.campusCode = campusCode;
+    }
+
+    public LibraryStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(LibraryStatus status) {
+        this.status = status;
+    }
+
+    public Integer getGetCount() {
+        return getCount;
+    }
+
+    public void setGetCount(Integer getCount) {
+        this.getCount = getCount;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(String scoreList) {
+        this.scoreList = scoreList;
+    }
+
+    public Integer getCreator() {
+        return creator;
+    }
+
+    public void setCreator(Integer creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public SubjectiveBlock getSubjectiveBlock() {
+        return subjectiveBlock;
+    }
+
+    public void setSubjectiveBlock(SubjectiveBlock subjectiveBlock) {
+        this.subjectiveBlock = subjectiveBlock;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public Integer getPicCount() {
+        return picCount;
+    }
+
+    public void setPicCount(Integer picCount) {
+        this.picCount = picCount;
+    }
+
+    public String getPictureConfig() {
+        return pictureConfig;
+    }
+
+    public void setPictureConfig(String pictureConfig) {
+        this.pictureConfig = pictureConfig;
+    }
+
+    public List<String> getPictureUrls() {
+        return pictureUrls;
+    }
+
+    public void setPictureUrls(List<String> pictureUrls) {
+        this.pictureUrls = pictureUrls;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+}

+ 160 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/TryHistory.java

@@ -0,0 +1,160 @@
+package cn.com.qmth.stmms.biz.distributpaper.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.common.enums.HistoryType;
+
+@Entity
+@Table(name = "m_try_history")
+public class TryHistory implements Serializable {
+
+    private static final long serialVersionUID = 2659399330984305370L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 试评库ID
+     */
+    @Column(name = "library_id")
+    private Integer libraryId;
+
+    /**
+     * 评卷阶段,1一评2二评
+     */
+    @Column(name = "stage")
+    private Integer stage;
+
+    /**
+     * 评卷人
+     */
+    @Column(name = "scorer")
+    private Integer scorer;
+
+    /**
+     * 给分时间
+     */
+    @Column(name = "score_time")
+    private Date scoreTime;
+
+    /**
+     * 总得分
+     */
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    /**
+     * 分值列表
+     */
+    @Column(name = "score_list")
+    private String scoreList;
+
+    /**
+     * 所花时间,以秒为单位
+     */
+    @Column(name = "spent")
+    private Long spent;
+
+    /**
+     * 类型
+     */
+    @Column(name = "type")
+    @Enumerated(EnumType.ORDINAL)
+    private HistoryType type;
+
+    @Transient
+    private Marker marker;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLibraryId() {
+        return libraryId;
+    }
+
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
+    }
+
+    public Integer getStage() {
+        return stage;
+    }
+
+    public void setStage(Integer stage) {
+        this.stage = stage;
+    }
+
+    public Integer getScorer() {
+        return scorer;
+    }
+
+    public void setScorer(Integer scorer) {
+        this.scorer = scorer;
+    }
+
+    public Date getScoreTime() {
+        return scoreTime;
+    }
+
+    public void setScoreTime(Date scoreTime) {
+        this.scoreTime = scoreTime;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(String scoreList) {
+        this.scoreList = scoreList;
+    }
+
+    public Long getSpent() {
+        return spent;
+    }
+
+    public void setSpent(Long spent) {
+        this.spent = spent;
+    }
+
+    public HistoryType getType() {
+        return type;
+    }
+
+    public void setType(HistoryType type) {
+        this.type = type;
+    }
+
+    public Marker getMarker() {
+        return marker;
+    }
+
+    public void setMarker(Marker marker) {
+        this.marker = marker;
+    }
+
+}

+ 291 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/model/TryLibrary.java

@@ -0,0 +1,291 @@
+package cn.com.qmth.stmms.biz.distributpaper.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+@Entity
+@Table(name = "m_try_library")
+public class TryLibrary implements Serializable {
+
+    private static final long serialVersionUID = 7121951721670633060L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 学习中心ID
+     */
+    @Column(name = "campus_code")
+    private String campusCode;
+
+    /**
+     * 考试ID
+     */
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    /**
+     * 科目CODE
+     */
+    @Column(name = "subject_code")
+    private String subjectCode;
+
+    /**
+     * 科目块ID
+     */
+    @Column(name = "block_id")
+    private Integer blockId;
+
+    /**
+     * 密号
+     */
+    @Column(name = "secret_no")
+    private Integer secretNo;
+
+    /**
+     * 准考证号
+     */
+    @Column(name = "exam_number")
+    private String examNumber;
+
+    @Column(name = "pic_count")
+    private Integer picCount;
+
+    /**
+     * 领卷人
+     */
+    @Column(name = "getter")
+    private Integer getter;
+
+    /**
+     * 领卷时间
+     */
+    @Column(name = "get_time")
+    private Date getTime;
+
+    /**
+     * 状态
+     */
+    @Column(name = "status")
+    @Enumerated(EnumType.ORDINAL)
+    private LibraryStatus status;
+
+    /**
+     * 当前块的多评次数
+     */
+    @Column(name = "marker_count")
+    private Integer markerCount;
+
+    /**
+     * 多评情况下,当前任务的序号
+     */
+    private Integer number;
+
+    /**
+     * 是否已抽查
+     */
+    @Column(name = "is_checked")
+    private boolean isChecked;
+
+    /**
+     * 科组长最终给分
+     */
+    @Column(name = "header_score")
+    private Double headerScore;
+
+    /**
+     * 科组长最终给分列表
+     */
+    @Column(name = "header_score_list")
+    private String headerScoreList;
+
+    /**
+     * 评卷员最终给分
+     */
+    @Column(name = "marker_score")
+    private Double markerScore;
+
+    /**
+     * 评卷员最终给分列表
+     */
+    @Column(name = "marker_score_list")
+    private String markerScoreList;
+
+    public TryLibrary clone() {
+        TryLibrary library = new TryLibrary();
+        library.setExamId(examId);
+        library.setCampusCode(campusCode);
+        library.setSubjectCode(subjectCode);
+        library.setBlockId(blockId);
+        library.setSecretNo(secretNo);
+        library.setExamNumber(examNumber);
+        library.setPicCount(picCount);
+        library.setGetter(getter);
+        library.setGetTime(getTime);
+        library.setStatus(status);
+        library.setMarkerCount(markerCount);
+        library.setNumber(number);
+        library.setChecked(isChecked);
+        library.setHeaderScore(headerScore);
+        library.setMarkerScore(markerScore);
+        library.setHeaderScoreList(headerScoreList);
+        library.setMarkerScoreList(markerScoreList);
+        return library;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public Integer getBlockId() {
+        return blockId;
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.blockId = blockId;
+    }
+
+    public String getCampusCode() {
+        return campusCode;
+    }
+
+    public void setCampusCode(String campusCode) {
+        this.campusCode = campusCode;
+    }
+
+    public Integer getGetter() {
+        return getter;
+    }
+
+    public void setGetter(Integer getter) {
+        this.getter = getter;
+    }
+
+    public Date getGetTime() {
+        return getTime;
+    }
+
+    public void setGetTime(Date getTime) {
+        this.getTime = getTime;
+    }
+
+    public Integer getSecretNo() {
+        return secretNo;
+    }
+
+    public void setSecretNo(Integer secretNo) {
+        this.secretNo = secretNo;
+    }
+
+    public LibraryStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(LibraryStatus status) {
+        this.status = status;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public boolean isChecked() {
+        return isChecked;
+    }
+
+    public void setChecked(boolean isChecked) {
+        this.isChecked = isChecked;
+    }
+
+    public Integer getMarkerCount() {
+        return markerCount;
+    }
+
+    public void setMarkerCount(Integer markerCount) {
+        this.markerCount = markerCount;
+    }
+
+    public Double getHeaderScore() {
+        return headerScore;
+    }
+
+    public void setHeaderScore(Double headerScore) {
+        this.headerScore = headerScore;
+    }
+
+    public Double getMarkerScore() {
+        return markerScore;
+    }
+
+    public void setMarkerScore(Double markerScore) {
+        this.markerScore = markerScore;
+    }
+
+    public String getHeaderScoreList() {
+        return headerScoreList;
+    }
+
+    public void setHeaderScoreList(String headerScoreList) {
+        this.headerScoreList = headerScoreList;
+    }
+
+    public String getMarkerScoreList() {
+        return markerScoreList;
+    }
+
+    public void setMarkerScoreList(String markerScoreList) {
+        this.markerScoreList = markerScoreList;
+    }
+
+    public Integer getPicCount() {
+        return picCount;
+    }
+
+    public void setPicCount(Integer picCount) {
+        this.picCount = picCount;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+}

+ 80 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/query/FormallyHistorySearchQuery.java

@@ -0,0 +1,80 @@
+package cn.com.qmth.stmms.biz.distributpaper.query;
+
+import java.util.Date;
+
+import cn.com.qmth.stmms.biz.common.BaseQuery;
+import cn.com.qmth.stmms.biz.distributpaper.model.FormallyHistory;
+
+public class FormallyHistorySearchQuery extends BaseQuery<FormallyHistory> {
+
+    private Date startTime;
+
+    private Date endTime;
+
+    private Integer libraryId;
+
+    private Integer paperNumber;
+
+    private Integer blockId;
+
+    private Integer status;
+
+    private Boolean isChecked;
+
+    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 getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(Integer paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public Integer getBlockId() {
+        return blockId;
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.blockId = blockId;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getLibraryId() {
+        return libraryId;
+    }
+
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
+    }
+
+    public Boolean getIsChecked() {
+        return isChecked;
+    }
+
+    public void setIsChecked(Boolean isChecked) {
+        this.isChecked = isChecked;
+    }
+
+}

+ 101 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/query/FormallyLibrarySearchQuery.java

@@ -0,0 +1,101 @@
+package cn.com.qmth.stmms.biz.distributpaper.query;
+
+import java.util.Date;
+
+import cn.com.qmth.stmms.biz.common.BaseQuery;
+import cn.com.qmth.stmms.biz.distributpaper.model.FormallyLibrary;
+import cn.com.qmth.stmms.common.enums.ClassType;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+public class FormallyLibrarySearchQuery extends BaseQuery<FormallyLibrary> {
+
+    private int examId;
+
+    private int subjectId;
+
+    private ClassType classType;
+
+    private int blockId;
+
+    private int secretNo;
+
+    private int getter;
+
+    private LibraryStatus status;
+
+    private Date maxGetTime;
+
+    private Date minGetTime;
+
+    public int getExamId() {
+        return examId;
+    }
+
+    public void setExamId(int examId) {
+        this.examId = examId;
+    }
+
+    public int getBlockId() {
+        return blockId;
+    }
+
+    public void setBlockId(int blockId) {
+        this.blockId = blockId;
+    }
+
+    public int getSecretNo() {
+        return secretNo;
+    }
+
+    public void setSecretNo(int secretNo) {
+        this.secretNo = secretNo;
+    }
+
+    public int getGetter() {
+        return getter;
+    }
+
+    public void setGetter(int getter) {
+        this.getter = getter;
+    }
+
+    public LibraryStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(LibraryStatus status) {
+        this.status = status;
+    }
+
+    public int getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(int subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public ClassType getClassType() {
+        return classType;
+    }
+
+    public void setClassType(ClassType classType) {
+        this.classType = classType;
+    }
+
+    public Date getMaxGetTime() {
+        return maxGetTime;
+    }
+
+    public void setMaxGetTime(Date maxGetTime) {
+        this.maxGetTime = maxGetTime;
+    }
+
+    public Date getMinGetTime() {
+        return minGetTime;
+    }
+
+    public void setMinGetTime(Date minGetTime) {
+        this.minGetTime = minGetTime;
+    }
+}

+ 80 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/query/TryHistorySearchQuery.java

@@ -0,0 +1,80 @@
+package cn.com.qmth.stmms.biz.distributpaper.query;
+
+import java.util.Date;
+
+import cn.com.qmth.stmms.biz.common.BaseQuery;
+import cn.com.qmth.stmms.biz.distributpaper.model.TryHistory;
+
+public class TryHistorySearchQuery extends BaseQuery<TryHistory> {
+
+    private Date startTime;
+
+    private Date endTime;
+
+    private Integer libraryId;
+
+    private Integer paperNumber;
+
+    private Integer blockId;
+
+    private Integer status;
+
+    private Boolean isChecked;
+
+    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 getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(Integer paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public Integer getBlockId() {
+        return blockId;
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.blockId = blockId;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getLibraryId() {
+        return libraryId;
+    }
+
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
+    }
+
+    public Boolean getIsChecked() {
+        return isChecked;
+    }
+
+    public void setIsChecked(Boolean isChecked) {
+        this.isChecked = isChecked;
+    }
+
+}

+ 101 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/query/TryLibrarySearchQuery.java

@@ -0,0 +1,101 @@
+package cn.com.qmth.stmms.biz.distributpaper.query;
+
+import java.util.Date;
+
+import cn.com.qmth.stmms.biz.common.BaseQuery;
+import cn.com.qmth.stmms.biz.distributpaper.model.TryLibrary;
+import cn.com.qmth.stmms.common.enums.ClassType;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+public class TryLibrarySearchQuery extends BaseQuery<TryLibrary> {
+
+    private int examId;
+
+    private int subjectId;
+
+    private ClassType classType;
+
+    private int blockId;
+
+    private int secretNo;
+
+    private int getter;
+
+    private LibraryStatus status;
+
+    private Date maxGetTime;
+
+    private Date minGetTime;
+
+    public int getExamId() {
+        return examId;
+    }
+
+    public void setExamId(int examId) {
+        this.examId = examId;
+    }
+
+    public int getBlockId() {
+        return blockId;
+    }
+
+    public void setBlockId(int blockId) {
+        this.blockId = blockId;
+    }
+
+    public int getSecretNo() {
+        return secretNo;
+    }
+
+    public void setSecretNo(int secretNo) {
+        this.secretNo = secretNo;
+    }
+
+    public int getGetter() {
+        return getter;
+    }
+
+    public void setGetter(int getter) {
+        this.getter = getter;
+    }
+
+    public LibraryStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(LibraryStatus status) {
+        this.status = status;
+    }
+
+    public int getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(int subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public ClassType getClassType() {
+        return classType;
+    }
+
+    public void setClassType(ClassType classType) {
+        this.classType = classType;
+    }
+
+    public Date getMaxGetTime() {
+        return maxGetTime;
+    }
+
+    public void setMaxGetTime(Date maxGetTime) {
+        this.maxGetTime = maxGetTime;
+    }
+
+    public Date getMinGetTime() {
+        return minGetTime;
+    }
+
+    public void setMinGetTime(Date minGetTime) {
+        this.minGetTime = minGetTime;
+    }
+}

+ 23 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/CaseHistoryService.java

@@ -0,0 +1,23 @@
+package cn.com.qmth.stmms.biz.distributpaper.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.CaseHistory;
+
+public interface CaseHistoryService {
+
+    CaseHistory save(CaseHistory caseHistory);
+
+    CaseHistory findById(Integer id);
+
+    void deleteById(Integer id);
+
+    void delete(CaseHistory caseHistory);
+
+    List<CaseHistory> getHistoryByScorer(Integer examId, String subjectCode, Integer blockId, Integer scorer);
+
+    List<CaseHistory> findByExamIdAndSubjectIdAndBlockIdAndSchoolId(Integer examId, String subjectCode, Integer blockId);
+
+    public List<CaseHistory> findByLibraryId(int libraryId);
+
+}

+ 44 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/CaseLibraryService.java

@@ -0,0 +1,44 @@
+package cn.com.qmth.stmms.biz.distributpaper.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.CaseLibrary;
+import cn.com.qmth.stmms.biz.subjectheader.query.CaseLibrarySearchQuery;
+
+public interface CaseLibraryService {
+
+    CaseLibrary save(CaseLibrary caseLibrary);
+
+    CaseLibrary findById(Integer id);
+
+    void deleteById(Integer id);
+
+    void delete(CaseLibrary caseLibrary);
+
+    List<CaseLibrary> findByExamIdAndBlockId(Integer examId, Integer blockId);
+
+    CaseLibrary findByBlockIdAndSecretNo(Integer blockId, Integer secretNo);
+
+    /**
+     * 累加领取数量
+     * 
+     * @param id
+     * @return
+     */
+    public CaseLibrary incrGetCount(Integer id);
+
+    public CaseLibrarySearchQuery findByQuery(CaseLibrarySearchQuery query);
+
+    /**
+     * 采样
+     * 
+     * @param examId
+     * @param subjectCode
+     * @param blockId
+     * @param count
+     * @param subjectheaderId
+     */
+    void example(int examId, String subjectCode, int blockId, int count, int subjectheaderId);
+
+    List<CaseLibrary> findByBlockId(int blockId);
+}

+ 31 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/FormallyHistoryService.java

@@ -0,0 +1,31 @@
+package cn.com.qmth.stmms.biz.distributpaper.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.FormallyHistory;
+import cn.com.qmth.stmms.biz.distributpaper.query.FormallyHistorySearchQuery;
+
+public interface FormallyHistoryService {
+
+    FormallyHistory save(FormallyHistory formallyHistory);
+
+    FormallyHistory findById(Integer id);
+
+    void deleteById(Integer id);
+
+    void delete(FormallyHistory formallyHistory);
+
+    List<FormallyHistory> getHistoryByScorer(Integer examId, Integer subjectId, Integer blockId, Integer scorer);
+
+    List<FormallyHistory> getHistoryByScorerAndIsChecked(Integer examId, Integer subjectId, Integer blockId,
+            Integer scorer, boolean isChecked);
+
+    FormallyHistorySearchQuery findByQuery(FormallyHistorySearchQuery query);
+
+    List<FormallyHistory> findByLibraryId(int libraryId);
+
+    public FormallyHistory findLastByLibraryId(int libraryId);
+
+    List<FormallyHistory> findByScorer(int markerId);
+
+}

+ 47 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/FormallyLibraryService.java

@@ -0,0 +1,47 @@
+package cn.com.qmth.stmms.biz.distributpaper.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.FormallyLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.query.FormallyLibrarySearchQuery;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+public interface FormallyLibraryService {
+
+    FormallyLibrary save(FormallyLibrary formallyLibrary);
+
+    FormallyLibrary findById(Integer id);
+
+    void deleteById(Integer id);
+
+    void delete(FormallyLibrary formallyLibrary);
+
+    List<FormallyLibrary> findByExamIdAndBlockId(Integer examId, Integer blockId);
+
+    public long countByExamIdAndBlockId(Integer examId, Integer blockId);
+
+    List<FormallyLibrary> findByExamIdAndBlockIdAndStatus(Integer examId, Integer blockId, LibraryStatus status);
+
+    public long countByExamIdAndBlockIdAndStatus(Integer examId, Integer blockId, LibraryStatus status);
+
+    List<FormallyLibrary> findByBlockIdAndSecretNo(Integer blockId, Integer secretNo);
+
+    /**
+     * 查询打回试卷
+     * 
+     * @param examId
+     * @param blockId
+     * @param getter
+     * @param status
+     * @return
+     */
+    List<FormallyLibrary> findByExamIdAndBlockIdAndGetterAndStatus(int examId, int blockId, int getter,
+            LibraryStatus status);
+
+    public FormallyLibrarySearchQuery findByQuery(final FormallyLibrarySearchQuery query);
+
+    List<FormallyLibrary> randomCheck(int examId, String subjectCode);
+
+    List<FormallyLibrary> findByExamIdAndSubjectCodeAndBlockIdAndSecretNoAndStatus(int examId, String subjectCode, int blockId, int secretNo, LibraryStatus status);
+
+}

+ 22 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/ProblemHistoryService.java

@@ -0,0 +1,22 @@
+package cn.com.qmth.stmms.biz.distributpaper.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.ProblemHistory;
+
+public interface ProblemHistoryService {
+
+    ProblemHistory save(ProblemHistory problemHistory);
+
+    ProblemHistory findById(Integer id);
+
+    void deleteById(Integer id);
+
+    void delete(ProblemHistory ProblemHistory);
+
+    List<ProblemHistory> findByExamIdAndSubjectIdAndStatusAndIsChecked(Integer examId, Integer subjectId,
+            Integer status, boolean isChecked);
+
+    List<ProblemHistory> findByExamIdAndSubjectIdAndBlockId(Integer examId, Integer subjectId, Integer blockId);
+
+}

+ 39 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/ProblemLibraryService.java

@@ -0,0 +1,39 @@
+package cn.com.qmth.stmms.biz.distributpaper.service;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.ProblemHistory;
+import cn.com.qmth.stmms.biz.distributpaper.model.ProblemLibrary;
+import cn.com.qmth.stmms.biz.subjectheader.query.ProblemLibrarySearchQuery;
+
+public interface ProblemLibraryService {
+
+    ProblemLibrary save(ProblemLibrary problemLibrary);
+
+    ProblemLibrary findById(Integer id);
+
+    void deleteById(Integer id);
+
+    void delete(ProblemLibrary problemLibrary);
+
+    ProblemLibrarySearchQuery findByQuery(ProblemLibrarySearchQuery query);
+
+    void saveMark(ProblemHistory problemHistory);
+
+    /**
+     * 查询未处理仲裁卷
+     * 
+     * @param examId
+     * @param subjectCode
+     * @return
+     */
+    int findUntreated(Integer examId, String subjectCode);
+
+    /**
+     * 查询未处理仲裁卷(按照题块)
+     * 
+     * @param examId
+     * @param subjectiveBlockId
+     * @return
+     */
+    int findUntreatedByBlockId(Integer examId, Integer subjectiveBlockId);
+
+}

+ 13 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/ProgressService.java

@@ -0,0 +1,13 @@
+package cn.com.qmth.stmms.biz.distributpaper.service;
+
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+public interface ProgressService {
+
+    public Long formallyHistoryCount(Integer examId, String subjectCode, Integer blockId);
+
+    public Long formallyLibraryCount(Integer examId, String subjectCode, Integer blockId);
+
+    public long formallyLibraryMarkedCount(Integer examId, String subjectCode, Integer blockId, LibraryStatus status);
+
+}

+ 25 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/StandardHistoryService.java

@@ -0,0 +1,25 @@
+package cn.com.qmth.stmms.biz.distributpaper.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.StandardHistory;
+
+public interface StandardHistoryService {
+
+    StandardHistory save(StandardHistory standardHistory);
+
+    StandardHistory findById(Integer id);
+
+    void deleteById(Integer id);
+
+    void delete(StandardHistory StandardHistory);
+
+    List<StandardHistory> getHistoryByScorer(Integer examId, String subjectCode, Integer blockId, Integer scorer);
+
+    List<StandardHistory> findByExamIdAndSubjectCodeAndBlockId(Integer examId, String subjectCode, Integer blockId);
+
+    public List<StandardHistory> findByLibraryId(int libraryId);
+
+    List<StandardHistory> findByScorer(Integer scorerId);
+
+}

+ 45 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/StandardLibraryService.java

@@ -0,0 +1,45 @@
+package cn.com.qmth.stmms.biz.distributpaper.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.StandardLibrary;
+import cn.com.qmth.stmms.biz.subjectheader.query.StandardLibrarySearchQuery;
+import cn.com.qmth.stmms.common.enums.ClassType;
+
+public interface StandardLibraryService {
+
+    StandardLibrary save(StandardLibrary standardLibrary);
+
+    StandardLibrary findById(Integer id);
+
+    void deleteById(Integer id);
+
+    void delete(StandardLibrary standardLibrary);
+
+    List<StandardLibrary> findByExamIdAndBlockId(Integer examId, Integer blockId);
+
+    StandardLibrary findByBlockIdAndSecretNo(Integer blockId, Integer secretNo);
+
+    /**
+     * 累加领取数量
+     * 
+     * @param id
+     * @return
+     */
+    public StandardLibrary incrGetCount(Integer id);
+
+    public StandardLibrarySearchQuery findByQuery(StandardLibrarySearchQuery query);
+
+    /**
+     * 设置标准卷
+     * 
+     * @param examId
+     * @param subjectCode
+     * @param blockId
+     * @param count
+     * @param subjectheaderId
+     */
+    void example(int examId, String subjectCode,  int blockId, int count, int subjectheaderId);
+
+    List<StandardLibrary> findByBlockId(int blockId);
+}

+ 23 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/TryHistoryService.java

@@ -0,0 +1,23 @@
+package cn.com.qmth.stmms.biz.distributpaper.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.TryHistory;
+
+public interface TryHistoryService {
+
+    TryHistory save(TryHistory tryHistory);
+
+    TryHistory findById(Integer id);
+
+    void deleteById(Integer id);
+
+    void delete(TryHistory tryHistory);
+
+    List<TryHistory> getHistoryByScorer(Integer examId, Integer subjectId, Integer blockId, Integer scorer);
+
+    List<TryHistory> findByLibraryId(int libraryId);
+
+    TryHistory findLastByLibraryId(int libraryId);
+
+}

+ 42 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/TryLibraryService.java

@@ -0,0 +1,42 @@
+package cn.com.qmth.stmms.biz.distributpaper.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.distributpaper.model.TryLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.query.TryLibrarySearchQuery;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+public interface TryLibraryService {
+
+    TryLibrary save(TryLibrary tryLibrary);
+
+    TryLibrary findById(Integer id);
+
+    void deleteById(Integer id);
+
+    void delete(TryLibrary tryLibrary);
+
+    List<TryLibrary> findByExamIdAndBlockId(Integer examId, Integer blockId);
+
+    List<TryLibrary> findByBlockIdAndSecretNo(Integer blockId, Integer secretNo);
+
+    /**
+     * 查询打回试卷
+     * 
+     * @param examId
+     * @param blockId
+     * @param getter
+     * @param status
+     * @return
+     */
+    List<TryLibrary> findByExamIdAndBlockIdAndGetterAndStatus(int examId, int blockId, int getter, LibraryStatus status);
+
+    List<TryLibrary> findByExamIdAndBlockIdAndStatus(int examId, int blockId, LibraryStatus status);
+
+    TryLibrarySearchQuery findByQuery(final TryLibrarySearchQuery query);
+
+    List<TryLibrary> randomCheck(int examId, String subjectCode);
+
+    List<TryLibrary> findByExamIdAndSubjectCodeAndBlockIdAndSecretNoAndStatus(int examId, String subjectCode, int blockId, int secretNo, LibraryStatus status);
+
+}

+ 66 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/CaseHistoryServiceImpl.java

@@ -0,0 +1,66 @@
+package cn.com.qmth.stmms.biz.distributpaper.service.impl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.distributpaper.dao.CaseHistoryDao;
+import cn.com.qmth.stmms.biz.distributpaper.dao.CaseLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.model.CaseHistory;
+import cn.com.qmth.stmms.biz.distributpaper.model.CaseLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.service.CaseHistoryService;
+
+@Service
+public class CaseHistoryServiceImpl implements CaseHistoryService {
+
+    @Autowired
+    private CaseHistoryDao caseHistoryDao;
+
+    @Autowired
+    private CaseLibraryDao libraryDao;
+
+    @Transactional
+    public CaseHistory save(CaseHistory caseHistory) {
+        return caseHistoryDao.save(caseHistory);
+    }
+
+    public CaseHistory findById(Integer id) {
+        return caseHistoryDao.findOne(id);
+    }
+
+    @Transactional
+    public void deleteById(Integer id) {
+        caseHistoryDao.delete(id);
+    }
+
+    @Transactional
+    public void delete(CaseHistory caseHistory) {
+        caseHistoryDao.delete(caseHistory);
+    }
+
+    public List<CaseHistory> getHistoryByScorer(Integer examId, String subjectCode, Integer blockId, Integer scorer) {
+        List<CaseLibrary> list = libraryDao.findByExamIdAndBlockIdAndSubjectCode(examId, blockId, subjectCode);
+        if (list != null && list.size() > 0) {
+            return caseHistoryDao.findByLibraryIdAndScorer(list.get(0).getId(), scorer);
+        } else {
+            return null;
+        }
+    }
+
+    public List<CaseHistory> findByExamIdAndSubjectIdAndBlockIdAndSchoolId(Integer examId, String subjectCode,
+            Integer blockId) {
+        List<CaseLibrary> list = libraryDao.findByExamIdAndBlockIdAndSubjectCode(examId, blockId, subjectCode);
+        if (list != null && list.size() > 0) {
+            return caseHistoryDao.findByLibraryId(list.get(0).getId());
+        } else {
+            return null;
+        }
+    }
+
+    public List<CaseHistory> findByLibraryId(int libraryId) {
+        return caseHistoryDao.findByLibraryId(libraryId);
+    }
+
+}

+ 188 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/CaseLibraryServiceImpl.java

@@ -0,0 +1,188 @@
+package cn.com.qmth.stmms.biz.distributpaper.service.impl;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Random;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.distributpaper.dao.CaseLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.dao.FormallyLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.model.CaseLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.model.FormallyLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.service.CaseLibraryService;
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveBlock;
+import cn.com.qmth.stmms.biz.exam.service.SubjectiveBlockService;
+import cn.com.qmth.stmms.biz.subjectheader.query.CaseLibrarySearchQuery;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+@Service
+public class CaseLibraryServiceImpl implements CaseLibraryService {
+
+    @Autowired
+    private CaseLibraryDao caseLibraryDao;
+
+    @Autowired
+    private FormallyLibraryDao formallyLibraryDao;
+
+    @Autowired
+    private SubjectiveBlockService subjectiveBlockService;
+
+    @Transactional
+    public CaseLibrary save(CaseLibrary caseLibrary) {
+        return caseLibraryDao.save(caseLibrary);
+    }
+
+    public CaseLibrary findById(Integer id) {
+        CaseLibrary caseLibrary = caseLibraryDao.findOne(id);
+        return buildCaseLibrary(caseLibrary);
+    }
+
+    @Transactional
+    public void deleteById(Integer id) {
+        caseLibraryDao.delete(id);
+    }
+
+    @Transactional
+    public void delete(CaseLibrary caseLibrary) {
+        caseLibraryDao.delete(caseLibrary);
+    }
+
+    public List<CaseLibrary> findByExamIdAndBlockId(Integer examId, Integer blockId) {
+        List<CaseLibrary> list = caseLibraryDao.findByExamIdAndBlockId(examId, blockId);
+        for (CaseLibrary caseLibrary : list) {
+            buildCaseLibrary(caseLibrary);
+        }
+        return list;
+    }
+
+    public CaseLibrary findByBlockIdAndSecretNo(Integer blockId, Integer secretNo) {
+        List<CaseLibrary> list = caseLibraryDao.findByBlockIdAndSecretNo(blockId, secretNo);
+        return list != null && list.size() > 0 ? list.get(0) : null;
+    }
+
+    @Transactional
+    public CaseLibrary incrGetCount(Integer id) {
+        caseLibraryDao.incrGetCount(id);
+        return findById(id);
+    }
+
+    @Override
+    public CaseLibrarySearchQuery findByQuery(final CaseLibrarySearchQuery query) {
+        Page<CaseLibrary> result = caseLibraryDao.findAll(new Specification<CaseLibrary>() {
+
+            @Override
+            public Predicate toPredicate(Root<CaseLibrary> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                // EntityType<CaseLibrary> ci_ = root.getModel();
+
+                if (query.getExamId() != null) {
+                    predicates.add(cb.equal(root.get("examId"), query.getExamId()));
+                }
+                if (StringUtils.isNotEmpty(query.getSubjectCode())) {
+                    predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
+                }
+                if (query.getBlockId() != null) {
+                    predicates.add(cb.equal(root.get("blockId"), query.getBlockId()));
+                }
+
+                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
+                        .size()]));
+            }
+        }, query);
+        for (CaseLibrary caseLibrary : result) {
+            buildCaseLibrary(caseLibrary);
+        }
+        query.setResult(result.getContent());
+        query.setTotalCount(result.getTotalElements());
+        query.setTotalPage(result.getTotalPages());
+        return query;
+    }
+
+    @Override
+    @Transactional
+    public void example(int examId, String subjectCode, int blockId, int count, int subjectheaderId) {
+        List<FormallyLibrary> libList = formallyLibraryDao.findByExamIdAndSubjectCodeAndBlockId(examId, subjectCode,
+                blockId);
+        int size = libList.size();
+        int[] random = random(size);
+
+        for (int i : random) {
+            FormallyLibrary formally = libList.get(i);
+            CaseLibrary caseLib = new CaseLibrary();
+            caseLib.setBlockId(formally.getBlockId());
+            caseLib.setExamId(formally.getExamId());
+            caseLib.setGetCount(0);
+            caseLib.setPicCount(formally.getPicCount());
+            caseLib.setSampler(subjectheaderId);
+            caseLib.setSampleTime(new Date());
+            caseLib.setCampusCode(formally.getCampusCode());
+            caseLib.setSecretNo(formally.getSecretNo());
+            caseLib.setStatus(LibraryStatus.WAITING);
+            caseLib.setSubjectCode(formally.getSubjectCode());
+            caseLibraryDao.save(caseLib);
+        }
+    }
+
+    private int[] random(int size) {
+        int random[];
+        if (size < 10) {
+            random = new int[size];
+        } else {
+            random = new int[10];
+        }
+        // 全部初始化为-1
+        for (int i = 0; i < random.length; i++) {
+            random[i] = -1;
+        }
+
+        if (size > 0) {
+            Random rand = new Random();
+            int num = 0;
+            for (int i = 0; i < random.length; i++) {
+                do {
+                    num = rand.nextInt(size);
+                } while (!getDistinctNum(num, random));
+                random[i] = num;
+
+            }
+        }
+        return random;
+    }
+
+    private boolean getDistinctNum(int num, int[] random) {
+        boolean result = false;
+        for (int i = 0; i < random.length; i++) {
+            if (num == random[i]) {
+                result = false;
+                break;
+            } else {
+                result = true;
+            }
+        }
+        return result;
+    }
+
+    private CaseLibrary buildCaseLibrary(CaseLibrary caseLibrary) {
+        if (caseLibrary.getBlockId() != null) {
+            SubjectiveBlock subjectiveBlock = subjectiveBlockService.findBlockById(caseLibrary.getBlockId(), true);
+            caseLibrary.setSubjectiveBlock(subjectiveBlock);
+        }
+        return caseLibrary;
+    }
+
+    public List<CaseLibrary> findByBlockId(int blockId) {
+        return caseLibraryDao.findByBlockId(blockId);
+    }
+}

+ 167 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/FormallyHistoryServiceImpl.java

@@ -0,0 +1,167 @@
+package cn.com.qmth.stmms.biz.distributpaper.service.impl;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.persistence.metamodel.EntityType;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.distributpaper.dao.FormallyHistoryDao;
+import cn.com.qmth.stmms.biz.distributpaper.model.FormallyHistory;
+import cn.com.qmth.stmms.biz.distributpaper.query.FormallyHistorySearchQuery;
+import cn.com.qmth.stmms.biz.distributpaper.service.FormallyHistoryService;
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+
+@Service
+public class FormallyHistoryServiceImpl implements FormallyHistoryService {
+
+    @Autowired
+    private FormallyHistoryDao formallyHistoryDao;
+
+    @Autowired
+    private MarkerService markerService;
+
+    @Transactional
+    public FormallyHistory save(FormallyHistory formallyHistory) {
+        formallyHistoryDao.save(formallyHistory);
+        return buildFormallyHistory(formallyHistory);
+    }
+
+    public FormallyHistory findById(Integer id) {
+        FormallyHistory formallyHistory = formallyHistoryDao.findOne(id);
+        return buildFormallyHistory(formallyHistory);
+    }
+
+    @Transactional
+    public void deleteById(Integer id) {
+        formallyHistoryDao.delete(id);
+    }
+
+    @Transactional
+    public void delete(FormallyHistory formallyHistory) {
+        formallyHistoryDao.delete(formallyHistory);
+    }
+
+    public List<FormallyHistory> getHistoryByScorer(Integer examId, Integer subjectId, Integer blockId, Integer scorer) {
+        /*
+         * List<FormallyHistory> list = formallyHistoryDao
+         * .findByExamIdAndSubjectIdAndBlockIdAndSchoolIdAndScorer(examId,
+         * subjectId, blockId, schoolId, scorer); for (FormallyHistory
+         * formallyHistory : list) { buildFormallyHistory(formallyHistory); }
+         * return list;
+         */
+        return null;
+    }
+
+    public List<FormallyHistory> getHistoryByScorerAndIsChecked(Integer examId, Integer subjectId, Integer blockId,
+            Integer scorer, boolean isChecked) {
+        // List<FormallyHistory> list = formallyHistoryDao
+        // .findByExamIdAndSubjectIdAndBlockIdAndSchoolIdAndScorerAndIsChecked(examId,
+        // subjectId, blockId, schoolId, scorer, isChecked);
+        // for (FormallyHistory formallyHistory : list) {
+        // buildFormallyHistory(formallyHistory);
+        // }
+        // return list;
+        return null;
+
+    }
+
+    private FormallyHistory buildFormallyHistory(FormallyHistory formallyHistory) {
+        Marker marker = markerService.findById(formallyHistory.getScorer());
+        formallyHistory.setMarker(marker);
+        return formallyHistory;
+    }
+
+    public FormallyHistorySearchQuery findByQuery(final FormallyHistorySearchQuery query) {
+        Page<FormallyHistory> result = formallyHistoryDao.findAll(new Specification<FormallyHistory>() {
+
+            @Override
+            public Predicate toPredicate(Root<FormallyHistory> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                EntityType<FormallyHistory> ci_ = root.getModel();
+                if (query.getLibraryId() != null) {
+                    predicates.add(cb.equal(root.get("libraryId"), query.getLibraryId()));
+                }
+                if (query.getStatus() != null) {
+                    predicates.add(cb.equal(root.get("status"), query.getStatus()));
+                }
+                if (query.getPaperNumber() != null) {
+                    predicates.add(cb.equal(root.get("paperNumber"), query.getPaperNumber()));
+                }
+                if (query.getBlockId() != null) {
+                    predicates.add(cb.equal(root.get("blockId"), query.getBlockId()));
+                }
+                if (query.getIsChecked() != null) {
+                    predicates.add(cb.equal(root.get("isChecked"), query.getIsChecked()));
+                }
+                // 发放时间处理
+                Predicate issueDate;
+
+                if (query.getStartTime() != null && query.getEndTime() != null) {
+                    Expression<Date> start = cb.literal(query.getStartTime());
+                    Expression<Date> end = cb.literal(query.getEndTime());
+                    issueDate = cb.between(root.get(ci_.getSingularAttribute("scoreTime", Date.class)), start, end);
+                    predicates.add(issueDate);
+                }
+
+                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
+                        .size()]));
+            }
+        }, query);
+
+        query.setResult(result.getContent());
+        query.setTotalCount(result.getTotalElements());
+        query.setTotalPage(result.getTotalPages());
+        List<FormallyHistory> list = query.getResult();
+        for (FormallyHistory formallyHistory : list) {
+            buildFormallyHistory(formallyHistory);
+        }
+        return query;
+    }
+
+    @Override
+    public List<FormallyHistory> findByLibraryId(int libraryId) {
+        List<FormallyHistory> list = formallyHistoryDao.findByLibraryId(libraryId,
+                new Sort(Direction.DESC, "scoreTime"));
+        for (FormallyHistory history : list) {
+            buildFormallyHistory(history);
+        }
+        return list;
+    }
+
+    @Override
+    public FormallyHistory findLastByLibraryId(int libraryId) {
+        FormallyHistorySearchQuery query = new FormallyHistorySearchQuery();
+        query.setLibraryId(libraryId);
+        query.setSort(new Sort(Direction.DESC, "scoreTime"));
+        query.setPageNumber(1);
+        query.setPageSize(1);
+        query = findByQuery(query);
+        if (query.getCurrentCount() > 0) {
+            return query.getResult().get(0);
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public List<FormallyHistory> findByScorer(int markerId) {
+        List<FormallyHistory> list = formallyHistoryDao.findByScorer(markerId);
+        return list;
+    }
+
+}

+ 191 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/FormallyLibraryServiceImpl.java

@@ -0,0 +1,191 @@
+package cn.com.qmth.stmms.biz.distributpaper.service.impl;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.distributpaper.dao.FormallyLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.model.FormallyLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.query.FormallyLibrarySearchQuery;
+import cn.com.qmth.stmms.biz.distributpaper.service.FormallyLibraryService;
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveBlock;
+import cn.com.qmth.stmms.biz.exam.service.SubjectiveBlockService;
+import cn.com.qmth.stmms.common.enums.ClassType;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+@Service
+public class FormallyLibraryServiceImpl extends BaseQueryService<FormallyLibrary> implements FormallyLibraryService {
+
+    @Autowired
+    private FormallyLibraryDao formallyLibraryDao;
+
+    @Autowired
+    private SubjectiveBlockService subjectiveBlockService;
+
+    @Transactional
+    public FormallyLibrary save(FormallyLibrary formallyLibrary) {
+        return formallyLibraryDao.save(formallyLibrary);
+    }
+
+    public FormallyLibrary findById(Integer id) {
+        return formallyLibraryDao.findOne(id);
+    }
+
+    @Transactional
+    public void deleteById(Integer id) {
+        formallyLibraryDao.delete(id);
+    }
+
+    @Transactional
+    public void delete(FormallyLibrary formallyLibrary) {
+        formallyLibraryDao.delete(formallyLibrary);
+    }
+
+    public List<FormallyLibrary> findByExamIdAndBlockId(Integer examId, Integer blockId) {
+        return formallyLibraryDao.findByExamIdAndBlockId(examId, blockId);
+    }
+
+    public long countByExamIdAndBlockId(Integer examId, Integer blockId) {
+        FormallyLibrarySearchQuery query = new FormallyLibrarySearchQuery();
+        query.setExamId(examId);
+        query.setBlockId(blockId);
+        return countByQuery(query);
+    }
+
+    public List<FormallyLibrary> findByExamIdAndBlockIdAndStatus(Integer examId, Integer blockId, LibraryStatus status) {
+        return formallyLibraryDao.findByExamIdAndBlockIdAndStatus(examId, blockId, status);
+    }
+
+    public long countByExamIdAndBlockIdAndStatus(Integer examId, Integer blockId, LibraryStatus status) {
+        FormallyLibrarySearchQuery query = new FormallyLibrarySearchQuery();
+        query.setExamId(examId);
+        query.setBlockId(blockId);
+        query.setStatus(status);
+        return countByQuery(query);
+    }
+
+    public List<FormallyLibrary> findByBlockIdAndSecretNo(Integer blockId, Integer secretNo) {
+        return formallyLibraryDao.findByBlockIdAndSecretNo(blockId, secretNo);
+    }
+
+    public List<FormallyLibrary> findByExamIdAndBlockIdAndGetterAndStatus(int examId, int blockId, int getter,
+            LibraryStatus status) {
+        return formallyLibraryDao.findByExamIdAndBlockIdAndGetterAndStatus(examId, blockId, getter, status);
+    }
+
+    public long countByQuery(final FormallyLibrarySearchQuery query) {
+        return formallyLibraryDao.count(new Specification<FormallyLibrary>() {
+
+            @Override
+            public Predicate toPredicate(Root<FormallyLibrary> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                if (query.getExamId() > 0) {
+                    predicates.add(cb.equal(root.get("examId"), query.getExamId()));
+                }
+                if (query.getSubjectId() > 0) {
+                    predicates.add(cb.equal(root.get("subjectId"), query.getSubjectId()));
+                }
+                if (query.getClassType() != null) {
+                    predicates.add(cb.equal(root.get("classType").as(ClassType.class), query.getClassType()));
+                }
+                if (query.getBlockId() > 0) {
+                    predicates.add(cb.equal(root.get("blockId"), query.getBlockId()));
+                }
+                if (query.getSecretNo() > 0) {
+                    predicates.add(cb.equal(root.get("secretNo"), query.getSecretNo()));
+                }
+                if (query.getGetter() > 0) {
+                    predicates.add(cb.equal(root.get("getter"), query.getGetter()));
+                }
+                if (query.getStatus() != null) {
+                    predicates.add(cb.equal(root.get("status").as(LibraryStatus.class), query.getStatus()));
+                }
+                if (query.getMaxGetTime() != null) {
+                    predicates.add(cb.lessThanOrEqualTo(root.get("getTime").as(Date.class), query.getMaxGetTime()));
+                }
+                if (query.getMinGetTime() != null) {
+                    predicates.add(cb.greaterThan(root.get("getTime").as(Date.class), query.getMinGetTime()));
+                }
+
+                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
+                        .size()]));
+            }
+        });
+    }
+
+    public FormallyLibrarySearchQuery findByQuery(final FormallyLibrarySearchQuery query) {
+        checkQuery(query);
+
+        Page<FormallyLibrary> result = formallyLibraryDao.findAll(new Specification<FormallyLibrary>() {
+
+            @Override
+            public Predicate toPredicate(Root<FormallyLibrary> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                if (query.getExamId() > 0) {
+                    predicates.add(cb.equal(root.get("examId"), query.getExamId()));
+                }
+                if (query.getSubjectId() > 0) {
+                    predicates.add(cb.equal(root.get("subjectId"), query.getSubjectId()));
+                }
+                if (query.getClassType() != null) {
+                    predicates.add(cb.equal(root.get("classType").as(ClassType.class), query.getClassType()));
+                }
+                if (query.getBlockId() > 0) {
+                    predicates.add(cb.equal(root.get("blockId"), query.getBlockId()));
+                }
+                if (query.getSecretNo() > 0) {
+                    predicates.add(cb.equal(root.get("secretNo"), query.getSecretNo()));
+                }
+                if (query.getGetter() > 0) {
+                    predicates.add(cb.equal(root.get("getter"), query.getGetter()));
+                }
+                if (query.getStatus() != null) {
+                    predicates.add(cb.equal(root.get("status").as(LibraryStatus.class), query.getStatus()));
+                }
+                if (query.getMaxGetTime() != null) {
+                    predicates.add(cb.lessThanOrEqualTo(root.get("getTime").as(Date.class), query.getMaxGetTime()));
+                }
+                if (query.getMinGetTime() != null) {
+                    predicates.add(cb.greaterThan(root.get("getTime").as(Date.class), query.getMinGetTime()));
+                }
+
+                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
+                        .size()]));
+            }
+        }, query);
+
+        fillResult(result, query);
+        return query;
+    }
+
+    @Override
+    public List<FormallyLibrary> randomCheck(int examId, String subjectCode) {
+        List<SubjectiveBlock> blockList = subjectiveBlockService.findBlockByExamIdAndSubjectCode(examId,subjectCode);
+        List<FormallyLibrary> list = new ArrayList<FormallyLibrary>();
+        for (SubjectiveBlock block : blockList) {
+            List<FormallyLibrary> formallyList = formallyLibraryDao.findByExamIdAndBlockIdAndStatusAndIsChecked(examId,
+                    block.getId(), LibraryStatus.MARKED, false);
+            list.addAll(formallyList);
+        }
+        return list;
+    }
+
+    @Override
+    public List<FormallyLibrary> findByExamIdAndSubjectCodeAndBlockIdAndSecretNoAndStatus(int examId,
+            String subjectCode, int blockId, int secretNo, LibraryStatus status) {
+        return formallyLibraryDao.findByExamIdAndSubjectCodeAndBlockIdAndSecretNoAndStatus(examId, subjectCode, blockId, secretNo, status);
+    }
+}

+ 56 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/ProblemHistoryServiceImpl.java

@@ -0,0 +1,56 @@
+package cn.com.qmth.stmms.biz.distributpaper.service.impl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.distributpaper.dao.ProblemHistoryDao;
+import cn.com.qmth.stmms.biz.distributpaper.model.ProblemHistory;
+import cn.com.qmth.stmms.biz.distributpaper.service.ProblemHistoryService;
+
+@Service
+public class ProblemHistoryServiceImpl implements ProblemHistoryService {
+
+    @Autowired
+    private ProblemHistoryDao problemHistoryDao;
+
+    @Transactional
+    public ProblemHistory save(ProblemHistory problemHistory) {
+        return problemHistoryDao.save(problemHistory);
+    }
+
+    public ProblemHistory findById(Integer id) {
+        return problemHistoryDao.findOne(id);
+    }
+
+    @Transactional
+    public void deleteById(Integer id) {
+        problemHistoryDao.delete(id);
+    }
+
+    @Transactional
+    public void delete(ProblemHistory ProblemHistory) {
+        problemHistoryDao.delete(ProblemHistory);
+    }
+
+    public List<ProblemHistory> findByExamIdAndSubjectIdAndStatusAndIsChecked(Integer examId, Integer subjectId,
+            Integer status, boolean isChecked) {
+        /*
+         * return problemHistoryDao.
+         * findByExamIdAndSubjectIdAndStatusAndIsChecked(examId, subjectId,
+         * schoolId, status, isChecked);
+         */
+        return null;
+    }
+
+    public List<ProblemHistory> findByExamIdAndSubjectIdAndBlockId(Integer examId, Integer subjectId, Integer blockId) {
+        /*
+         * return problemHistoryDao.findByExamIdAndSubjectIdAndBlockId (examId,
+         * subjectId, schoolId, blockId);
+         */
+        return null;
+    }
+
+}

+ 223 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/ProblemLibraryServiceImpl.java

@@ -0,0 +1,223 @@
+package cn.com.qmth.stmms.biz.distributpaper.service.impl;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.persistence.metamodel.EntityType;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.distributpaper.dao.FormallyLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.dao.ProblemHistoryDao;
+import cn.com.qmth.stmms.biz.distributpaper.dao.ProblemLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.dao.TryLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.model.FormallyLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.model.ProblemHistory;
+import cn.com.qmth.stmms.biz.distributpaper.model.ProblemLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.model.TryLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.service.ProblemLibraryService;
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveBlock;
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.exam.service.SubjectiveBlockService;
+import cn.com.qmth.stmms.biz.subjectheader.query.ProblemLibrarySearchQuery;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+@Service
+public class ProblemLibraryServiceImpl implements ProblemLibraryService {
+
+    @Autowired
+    private ProblemLibraryDao problemLibraryDao;
+
+    @Autowired
+    private ProblemHistoryDao problemHistoryDao;
+
+    @Autowired
+    private MarkerService markerService;
+
+    @Autowired
+    private SubjectiveBlockService subjectiveBlockService;
+
+    @Autowired
+    private TryLibraryDao tryLibraryDao;
+
+    @Autowired
+    private FormallyLibraryDao formallyLibraryDao;
+
+    @Transactional
+    public ProblemLibrary save(ProblemLibrary problemLibrary) {
+        problemLibraryDao.save(problemLibrary);
+        return buildProblemLibrary(problemLibrary);
+    }
+
+    public ProblemLibrary findById(Integer id) {
+        ProblemLibrary problemLibrary = problemLibraryDao.findOne(id);
+        return buildProblemLibrary(problemLibrary);
+    }
+
+    @Transactional
+    public void deleteById(Integer id) {
+        problemLibraryDao.delete(id);
+    }
+
+    @Transactional
+    public void delete(ProblemLibrary problemLibrary) {
+        problemLibraryDao.delete(problemLibrary);
+    }
+
+    public ProblemLibrarySearchQuery findByQuery(final ProblemLibrarySearchQuery query) {
+        Page<ProblemLibrary> result = problemLibraryDao.findAll(new Specification<ProblemLibrary>() {
+
+            @Override
+            public Predicate toPredicate(Root<ProblemLibrary> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                EntityType<ProblemLibrary> ci_ = root.getModel();
+
+                if (query.getExamId() != null) {
+                    predicates.add(cb.equal(root.get("examId"), query.getExamId()));
+                }
+
+                if (StringUtils.isNotEmpty(query.getSubjectCode())) {
+                    predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
+                }
+
+                if (query.getSubmitter() != null) {
+                    predicates.add(cb.equal(root.get("submitter"), query.getSubmitter()));
+                }
+                if (query.getReason() != null) {
+                    predicates.add(cb.equal(root.get("reason"), query.getReason()));
+                }
+                if (query.getStatus() != null) {
+                    predicates.add(cb.equal(root.get("status").as(LibraryStatus.class),
+                            LibraryStatus.findByValue(query.getStatus())));
+                }
+                if (query.getPaperNumber() != null) {
+                    predicates.add(cb.equal(root.get("paperNumber"), query.getPaperNumber()));
+                }
+                if (query.getBlockId() != null) {
+                    predicates.add(cb.equal(root.get("blockId"), query.getBlockId()));
+                }
+                // 发放时间处理
+                Predicate issueDate;
+
+                if (query.getStartTime() != null && query.getEndTime() != null) {
+                    Expression<Date> start = cb.literal(query.getStartTime());
+                    Expression<Date> end = cb.literal(query.getEndTime());
+                    issueDate = cb.between(root.get(ci_.getSingularAttribute("submitTime", Date.class)), start, end);
+                    predicates.add(issueDate);
+                }
+
+                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
+                        .size()]));
+            }
+        }, query);
+        for (ProblemLibrary problemLibrary : result) {
+            buildProblemLibrary(problemLibrary);
+        }
+        query.setResult(result.getContent());
+        query.setTotalCount(result.getTotalElements());
+        query.setTotalPage(result.getTotalPages());
+        return query;
+    }
+
+    private ProblemLibrary buildProblemLibrary(ProblemLibrary problemLibrary) {
+        if (problemLibrary.getSubmitter() != null) {
+            int markerId = problemLibrary.getSubmitter();
+            Marker marker = markerService.findById(markerId);
+            problemLibrary.setMarker(marker);
+        }
+        if (problemLibrary.getBlockId() != null) {
+            SubjectiveBlock block = subjectiveBlockService.findBlockById(problemLibrary.getBlockId());
+            if (block != null) {
+                problemLibrary.setSubjectiveBlock(block);
+
+                // if (problemLibrary.getType() == LibraryType.TRY) {
+                // TryLibrary library =
+                // tryLibraryDao.findOne(problemLibrary.getLibraryId());
+                // problemLibrary.setPictureConfig(block.getPictureConfig());
+                // problemLibrary.setPictureUrls(PictureUrlBuilder.getSliceUrls(library.getExamId(),
+                // library.getCampusCode(), block.getSubjectCode(),
+                // library.getExamNumber(),
+                // library.getPicCount()));
+                // } else {
+                // FormallyLibrary library =
+                // formallyLibraryDao.findOne(problemLibrary.getLibraryId());
+                // problemLibrary.setPictureConfig(block.getPictureConfig());
+                // problemLibrary.setPictureUrls(PictureUrlBuilder.getSliceUrls(library.getExamId(),
+                // library.getCampusCode(), block.getSubjectCode(),
+                // library.getExamNumber(),
+                // library.getPicCount()));
+                // }
+            }
+        }
+        return problemLibrary;
+    }
+
+    @Override
+    public void saveMark(ProblemHistory problemHistory) {
+        ProblemLibrary library = problemLibraryDao.findOne(problemHistory.getLibraryId());
+        if (library.getType().getValue() == 1) {
+            TryLibrary tryLibrary = tryLibraryDao.findOne(library.getLibraryId());
+            tryLibrary.setStatus(LibraryStatus.MARKED);
+            tryLibraryDao.save(tryLibrary);
+        }
+
+        if (library.getType().getValue() == 2) {
+            FormallyLibrary formallyLibrary = formallyLibraryDao.findOne(library.getLibraryId());
+            formallyLibrary.setStatus(LibraryStatus.MARKED);
+            formallyLibraryDao.save(formallyLibrary);
+        }
+
+        library.setStatus(LibraryStatus.MARKED);
+        problemLibraryDao.save(library);
+
+        long spent = new Date().getTime() - problemHistory.getSpent();
+        problemHistory.setSpent(spent);
+        problemHistory.setStatus(LibraryStatus.MARKED);
+        problemHistory.setSubmitTime(new Date());
+        problemHistoryDao.save(problemHistory);
+
+    }
+
+    @Override
+    public int findUntreated(Integer examId, String subjectCode) {
+        int count = 0;
+        List<FormallyLibrary> formallyList = formallyLibraryDao.findByExamIdAndSubjectCodeAndStatus(examId,
+                subjectCode, LibraryStatus.EXCEPTION);
+        for (FormallyLibrary formally : formallyList) {
+            List<ProblemLibrary> markedList = problemLibraryDao.findByLibraryIdAndStatus(formally.getId(),
+                    LibraryStatus.WAITING);
+            if (markedList != null) {
+                count += markedList.size();
+            }
+        }
+        return count;
+    }
+
+    @Override
+    public int findUntreatedByBlockId(Integer examId, Integer subjectiveBlockId) {
+        int count = 0;
+        List<FormallyLibrary> formallyList = formallyLibraryDao.findByExamIdAndBlockIdAndStatus(examId,
+                subjectiveBlockId, LibraryStatus.EXCEPTION);
+        for (FormallyLibrary formally : formallyList) {
+            List<ProblemLibrary> markedList = problemLibraryDao.findByLibraryIdAndStatus(formally.getId(),
+                    LibraryStatus.WAITING);
+            if (markedList != null) {
+                count += markedList.size();
+            }
+        }
+        return count;
+    }
+
+}

+ 41 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/ProgressServiceImpl.java

@@ -0,0 +1,41 @@
+package cn.com.qmth.stmms.biz.distributpaper.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.stmms.biz.distributpaper.dao.FormallyHistoryDao;
+import cn.com.qmth.stmms.biz.distributpaper.dao.FormallyLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.service.ProgressService;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+@Service
+public class ProgressServiceImpl implements ProgressService {
+
+    @Autowired
+    private FormallyHistoryDao formallyHistoryDao;
+
+    @Autowired
+    private FormallyLibraryDao formallyLibraryDao;
+
+    @Override
+    public Long formallyHistoryCount(Integer examId, String subjectCode, Integer blockId) {
+        /*
+         * return
+         * formallyHistoryDao.getCountByExamIdAndSchoolIdAndSubjectIdAndBlockId
+         * (examId, schoolId, subjectId, blockId);
+         */
+        return null;
+    }
+
+    @Override
+    public Long formallyLibraryCount(Integer examId, String subjectCode, Integer blockId) {
+
+        return formallyLibraryDao.getCountByExamIdAndSubjectCodeAndBlockId(examId, subjectCode, blockId);
+    }
+
+    @Override
+    public long formallyLibraryMarkedCount(Integer examId, String subjectCode, Integer blockId, LibraryStatus status) {
+        return formallyLibraryDao.getCountByExamIdAndSubjectCodeAndBlockIdAndStatus(examId, subjectCode, blockId, status);
+    }
+
+}

+ 70 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/StandardHistoryServiceImpl.java

@@ -0,0 +1,70 @@
+package cn.com.qmth.stmms.biz.distributpaper.service.impl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.distributpaper.dao.StandardHistoryDao;
+import cn.com.qmth.stmms.biz.distributpaper.dao.StandardLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.model.StandardHistory;
+import cn.com.qmth.stmms.biz.distributpaper.model.StandardLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.service.StandardHistoryService;
+
+@Service
+public class StandardHistoryServiceImpl implements StandardHistoryService {
+
+    @Autowired
+    private StandardHistoryDao standardHistoryDao;
+
+    @Autowired
+    private StandardLibraryDao libraryDao;
+
+    @Transactional
+    public StandardHistory save(StandardHistory standardHistory) {
+        return standardHistoryDao.save(standardHistory);
+    }
+
+    public StandardHistory findById(Integer id) {
+        return standardHistoryDao.findOne(id);
+    }
+
+    @Transactional
+    public void deleteById(Integer id) {
+        standardHistoryDao.delete(id);
+    }
+
+    @Transactional
+    public void delete(StandardHistory standardHistory) {
+        standardHistoryDao.delete(standardHistory);
+    }
+
+    public List<StandardHistory> getHistoryByScorer(Integer examId, String subjectCode, Integer blockId, Integer scorer) {
+        List<StandardLibrary> list = libraryDao.findByExamIdAndBlockIdAndSubjectCode(examId, blockId, subjectCode);
+        if (list != null && list.size() > 0) {
+            return standardHistoryDao.findByLibraryIdAndScorer(list.get(0).getId(), scorer);
+        } else {
+            return null;
+        }
+    }
+
+    public List<StandardHistory> findByExamIdAndSubjectCodeAndBlockId(Integer examId, String subjectCode, Integer blockId) {
+        List<StandardLibrary> list = libraryDao.findByExamIdAndBlockIdAndSubjectCode(examId, blockId, subjectCode);
+        if (list != null && list.size() > 0) {
+            return standardHistoryDao.findByLibraryId(list.get(0).getId());
+        } else {
+            return null;
+        }
+    }
+
+    public List<StandardHistory> findByLibraryId(int libraryId) {
+        return standardHistoryDao.findByLibraryId(libraryId);
+    }
+
+    @Override
+    public List<StandardHistory> findByScorer(Integer scorerId) {
+        return standardHistoryDao.findByScorer(scorerId);
+    }
+
+}

+ 188 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/StandardLibraryServiceImpl.java

@@ -0,0 +1,188 @@
+package cn.com.qmth.stmms.biz.distributpaper.service.impl;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Random;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.distributpaper.dao.FormallyLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.dao.StandardLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.model.FormallyLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.model.StandardLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.service.StandardLibraryService;
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveBlock;
+import cn.com.qmth.stmms.biz.exam.service.SubjectiveBlockService;
+import cn.com.qmth.stmms.biz.subjectheader.query.StandardLibrarySearchQuery;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+@Service
+public class StandardLibraryServiceImpl implements StandardLibraryService {
+
+    @Autowired
+    private StandardLibraryDao standardLibraryDao;
+
+    @Autowired
+    private FormallyLibraryDao formallyLibraryDao;
+
+    @Autowired
+    private SubjectiveBlockService subjectiveBlockService;
+
+    @Transactional
+    public StandardLibrary save(StandardLibrary standardLibrary) {
+        return standardLibraryDao.save(standardLibrary);
+    }
+
+    public StandardLibrary findById(Integer id) {
+        StandardLibrary standardLibrary = standardLibraryDao.findOne(id);
+        return buildStandardLibrary(standardLibrary);
+    }
+
+    @Transactional
+    public void deleteById(Integer id) {
+        standardLibraryDao.delete(id);
+    }
+
+    @Transactional
+    public void delete(StandardLibrary standardLibrary) {
+        standardLibraryDao.delete(standardLibrary);
+    }
+
+    public List<StandardLibrary> findByExamIdAndBlockId(Integer examId, Integer blockId) {
+        List<StandardLibrary> list = standardLibraryDao.findByExamIdAndBlockId(examId, blockId);
+        for (StandardLibrary standardLibrary : list) {
+            buildStandardLibrary(standardLibrary);
+        }
+        return list;
+    }
+
+    public StandardLibrary findByBlockIdAndSecretNo(Integer blockId, Integer secretNo) {
+        List<StandardLibrary> list = standardLibraryDao.findByBlockIdAndSecretNo(blockId, secretNo);
+        return list != null && list.size() > 0 ? list.get(0) : null;
+    }
+
+    @Transactional
+    public StandardLibrary incrGetCount(Integer id) {
+        standardLibraryDao.incrGetCount(id);
+        return findById(id);
+    }
+
+    @Override
+    public StandardLibrarySearchQuery findByQuery(final StandardLibrarySearchQuery query) {
+        Page<StandardLibrary> result = standardLibraryDao.findAll(new Specification<StandardLibrary>() {
+
+            @Override
+            public Predicate toPredicate(Root<StandardLibrary> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                // EntityType<CaseLibrary> ci_ = root.getModel();
+
+                if (query.getExamId() != null) {
+                    predicates.add(cb.equal(root.get("examId"), query.getExamId()));
+                }
+                if (StringUtils.isNotEmpty(query.getSubjectCode())) {
+                    predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
+                }
+                if (query.getBlockId() != null) {
+                    predicates.add(cb.equal(root.get("blockId"), query.getBlockId()));
+                }
+
+                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
+                        .size()]));
+            }
+        }, query);
+        for (StandardLibrary standardLibrary : result) {
+            buildStandardLibrary(standardLibrary);
+        }
+        query.setResult(result.getContent());
+        query.setTotalCount(result.getTotalElements());
+        query.setTotalPage(result.getTotalPages());
+        return query;
+    }
+
+    @Override
+    @Transactional
+    public void example(int examId, String subjectCode, int blockId, int count, int subjectheaderId) {
+        List<FormallyLibrary> libList = formallyLibraryDao.findByExamIdAndSubjectCodeAndBlockId(examId, subjectCode,
+                blockId);
+        int size = libList.size();
+        int[] random = random(count, size);
+
+        for (int i : random) {
+            FormallyLibrary formally = libList.get(i);
+            StandardLibrary standardLibrary = new StandardLibrary();
+            standardLibrary.setBlockId(formally.getBlockId());
+            standardLibrary.setExamId(formally.getExamId());
+            standardLibrary.setGetCount(0);
+            standardLibrary.setPicCount(formally.getPicCount());
+            standardLibrary.setCreator(subjectheaderId);
+            standardLibrary.setCreateTime(new Date());
+            standardLibrary.setCampusCode(formally.getCampusCode());
+            standardLibrary.setSecretNo(formally.getSecretNo());
+            standardLibrary.setStatus(LibraryStatus.WAITING);
+            standardLibrary.setSubjectCode(formally.getSubjectCode());
+            standardLibraryDao.save(standardLibrary);
+        }
+    }
+
+    private int[] random(int count, int size) {
+        int random[];
+        if (count < 10) {
+            random = new int[count];
+        } else {
+            random = new int[10];
+        }
+        // 全部初始化为-1
+        for (int i = 0; i < random.length; i++) {
+            random[i] = -1;
+        }
+
+        if (count > 0) {
+            Random rand = new Random();
+            int num = 0;
+            for (int i = 0; i < random.length; i++) {
+                do {
+                    num = rand.nextInt(size);
+                } while (!getDistinctNum(num, random));
+                random[i] = num;
+
+            }
+        }
+        return random;
+    }
+
+    private boolean getDistinctNum(int num, int[] random) {
+        boolean result = false;
+        for (int i = 0; i < random.length; i++) {
+            if (num == random[i]) {
+                result = false;
+                break;
+            } else {
+                result = true;
+            }
+        }
+        return result;
+    }
+
+    private StandardLibrary buildStandardLibrary(StandardLibrary standardLibrary) {
+        if (standardLibrary.getBlockId() != null) {
+            SubjectiveBlock subjectiveBlock = subjectiveBlockService.findBlockById(standardLibrary.getBlockId(), true);
+            standardLibrary.setSubjectiveBlock(subjectiveBlock);
+        }
+        return standardLibrary;
+    }
+
+    public List<StandardLibrary> findByBlockId(int blockId) {
+        return standardLibraryDao.findByBlockId(blockId);
+    }
+}

+ 149 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/TryHistoryServiceImpl.java

@@ -0,0 +1,149 @@
+package cn.com.qmth.stmms.biz.distributpaper.service.impl;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import javax.persistence.metamodel.EntityType;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.distributpaper.dao.TryHistoryDao;
+import cn.com.qmth.stmms.biz.distributpaper.dao.TryLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.model.TryHistory;
+import cn.com.qmth.stmms.biz.distributpaper.model.TryLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.query.TryHistorySearchQuery;
+import cn.com.qmth.stmms.biz.distributpaper.service.TryHistoryService;
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+
+@Service
+public class TryHistoryServiceImpl implements TryHistoryService {
+
+    @Autowired
+    private TryLibraryDao tryLibraryDao;
+
+    @Autowired
+    private TryHistoryDao tryHistoryDao;
+
+    @Autowired
+    private MarkerService markerService;
+
+    @Transactional
+    public TryHistory save(TryHistory tryHistory) {
+        return tryHistoryDao.save(tryHistory);
+    }
+
+    public TryHistory findById(Integer id) {
+        return tryHistoryDao.findOne(id);
+    }
+
+    @Transactional
+    public void deleteById(Integer id) {
+        tryHistoryDao.delete(id);
+    }
+
+    @Transactional
+    public void delete(TryHistory tryHistory) {
+        tryHistoryDao.delete(tryHistory);
+    }
+
+    public List<TryHistory> getHistoryByScorer(Integer examId, Integer subjectId, Integer blockId, Integer scorer) {
+        List<TryLibrary> libList = tryLibraryDao.findByExamIdAndBlockId(examId, blockId);
+        if (libList.size() > 0) {
+            TryLibrary lib = libList.get(0);
+            return tryHistoryDao.findByLibraryIdAndScorer(lib.getId(), scorer);
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public List<TryHistory> findByLibraryId(int libraryId) {
+        List<TryHistory> list = tryHistoryDao.findByLibraryId(libraryId, new Sort(Direction.DESC, "scoreTime"));
+        for (TryHistory history : list) {
+            buildTryHistory(history);
+        }
+        return list;
+    }
+
+    @Override
+    public TryHistory findLastByLibraryId(int libraryId) {
+        TryHistorySearchQuery query = new TryHistorySearchQuery();
+        query.setLibraryId(libraryId);
+        query.setSort(new Sort(Direction.DESC, "scoreTime"));
+        query.setPageNumber(1);
+        query.setPageSize(1);
+        query = findByQuery(query);
+        if (query.getCurrentCount() > 0) {
+            return query.getResult().get(0);
+        } else {
+            return null;
+        }
+    }
+
+    public TryHistorySearchQuery findByQuery(final TryHistorySearchQuery query) {
+        Page<TryHistory> result = tryHistoryDao.findAll(new Specification<TryHistory>() {
+
+            @Override
+            public Predicate toPredicate(Root<TryHistory> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                EntityType<TryHistory> ci_ = root.getModel();
+                if (query.getLibraryId() != null) {
+                    predicates.add(cb.equal(root.get("libraryId"), query.getLibraryId()));
+                }
+                if (query.getStatus() != null) {
+                    predicates.add(cb.equal(root.get("status"), query.getStatus()));
+                }
+                if (query.getPaperNumber() != null) {
+                    predicates.add(cb.equal(root.get("paperNumber"), query.getPaperNumber()));
+                }
+                if (query.getBlockId() != null) {
+                    predicates.add(cb.equal(root.get("blockId"), query.getBlockId()));
+                }
+                if (query.getIsChecked() != null) {
+                    predicates.add(cb.equal(root.get("isChecked"), query.getIsChecked()));
+                }
+                // 发放时间处理
+                Predicate issueDate;
+
+                if (query.getStartTime() != null && query.getEndTime() != null) {
+                    Expression<Date> start = cb.literal(query.getStartTime());
+                    Expression<Date> end = cb.literal(query.getEndTime());
+                    issueDate = cb.between(root.get(ci_.getSingularAttribute("scoreTime", Date.class)), start, end);
+                    predicates.add(issueDate);
+                }
+
+                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
+                        .size()]));
+            }
+        }, query);
+
+        query.setResult(result.getContent());
+        query.setTotalCount(result.getTotalElements());
+        query.setTotalPage(result.getTotalPages());
+        List<TryHistory> list = query.getResult();
+        for (TryHistory history : list) {
+            buildTryHistory(history);
+        }
+        return query;
+    }
+
+    private TryHistory buildTryHistory(TryHistory tryHistory) {
+        Marker marker = markerService.findById(tryHistory.getScorer());
+        tryHistory.setMarker(marker);
+        return tryHistory;
+    }
+
+}

+ 137 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/distributpaper/service/impl/TryLibraryServiceImpl.java

@@ -0,0 +1,137 @@
+package cn.com.qmth.stmms.biz.distributpaper.service.impl;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.distributpaper.dao.TryLibraryDao;
+import cn.com.qmth.stmms.biz.distributpaper.model.TryLibrary;
+import cn.com.qmth.stmms.biz.distributpaper.query.TryLibrarySearchQuery;
+import cn.com.qmth.stmms.biz.distributpaper.service.TryLibraryService;
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveBlock;
+import cn.com.qmth.stmms.biz.exam.service.SubjectiveBlockService;
+import cn.com.qmth.stmms.common.enums.ClassType;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+@Service
+public class TryLibraryServiceImpl extends BaseQueryService<TryLibrary> implements TryLibraryService {
+
+    @Autowired
+    private TryLibraryDao tryLibraryDao;
+
+    @Autowired
+    private SubjectiveBlockService subjectiveBlockService;
+
+    @Transactional
+    public TryLibrary save(TryLibrary tryLibrary) {
+        return tryLibraryDao.save(tryLibrary);
+    }
+
+    public TryLibrary findById(Integer id) {
+        return tryLibraryDao.findOne(id);
+    }
+
+    @Transactional
+    public void deleteById(Integer id) {
+        tryLibraryDao.delete(id);
+    }
+
+    @Transactional
+    public void delete(TryLibrary tryLibrary) {
+        tryLibraryDao.delete(tryLibrary);
+    }
+
+    public List<TryLibrary> findByExamIdAndBlockId(Integer examId, Integer blockId) {
+        return tryLibraryDao.findByExamIdAndBlockId(examId, blockId);
+    }
+
+    public List<TryLibrary> findByBlockIdAndSecretNo(Integer blockId, Integer secretNo) {
+        return tryLibraryDao.findByBlockIdAndSecretNo(blockId, secretNo);
+    }
+
+    public TryLibrarySearchQuery findByQuery(final TryLibrarySearchQuery query) {
+        checkQuery(query);
+
+        Page<TryLibrary> result = tryLibraryDao.findAll(new Specification<TryLibrary>() {
+
+            @Override
+            public Predicate toPredicate(Root<TryLibrary> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                if (query.getExamId() > 0) {
+                    predicates.add(cb.equal(root.get("examId"), query.getExamId()));
+                }
+                if (query.getSubjectId() > 0) {
+                    predicates.add(cb.equal(root.get("subjectId"), query.getSubjectId()));
+                }
+                if (query.getClassType() != null) {
+                    predicates.add(cb.equal(root.get("classType").as(ClassType.class), query.getClassType()));
+                }
+                if (query.getBlockId() > 0) {
+                    predicates.add(cb.equal(root.get("blockId"), query.getBlockId()));
+                }
+                if (query.getSecretNo() > 0) {
+                    predicates.add(cb.equal(root.get("secretNo"), query.getSecretNo()));
+                }
+                if (query.getGetter() > 0) {
+                    predicates.add(cb.equal(root.get("getter"), query.getGetter()));
+                }
+                if (query.getStatus() != null) {
+                    predicates.add(cb.equal(root.get("status").as(LibraryStatus.class), query.getStatus()));
+                }
+                if (query.getMaxGetTime() != null) {
+                    predicates.add(cb.lessThanOrEqualTo(root.get("getTime").as(Date.class), query.getMaxGetTime()));
+                }
+                if (query.getMinGetTime() != null) {
+                    predicates.add(cb.greaterThan(root.get("getTime").as(Date.class), query.getMinGetTime()));
+                }
+                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
+                        .size()]));
+            }
+
+        }, query);
+        fillResult(result, query);
+        return query;
+    }
+
+    @Override
+    public List<TryLibrary> randomCheck(int examId, String subjectCode) {
+        List<SubjectiveBlock> blockList = subjectiveBlockService.findBlockByExamIdAndSubjectCode(examId,subjectCode);
+        List<TryLibrary> list = new ArrayList<TryLibrary>();
+        for (SubjectiveBlock block : blockList) {
+            List<TryLibrary> tryList = tryLibraryDao.findByExamIdAndBlockIdAndStatusAndIsChecked(examId, block.getId(),
+                    LibraryStatus.MARKED, false);
+
+            list.addAll(tryList);
+        }
+        return list;
+
+    }
+
+    public List<TryLibrary> findByExamIdAndBlockIdAndStatus(int examId, int blockId, LibraryStatus status) {
+        return tryLibraryDao.findByExamIdAndBlockIdAndStatus(examId, blockId, status);
+    }
+
+    public List<TryLibrary> findByExamIdAndBlockIdAndGetterAndStatus(int examId, int blockId, int getter,
+            LibraryStatus status) {
+        return tryLibraryDao.findByExamIdAndBlockIdAndGetterAndStatus(examId, blockId, getter, status);
+    }
+
+    @Override
+    public List<TryLibrary> findByExamIdAndSubjectCodeAndBlockIdAndSecretNoAndStatus(int examId,
+            String subjectCode, int blockId, int secretNo, LibraryStatus status) {
+        return tryLibraryDao.findByExamIdAndSubjectCodeAndBlockIdAndSecretNoAndStatus(examId, subjectCode, blockId, secretNo, status);
+    }
+}

+ 29 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java

@@ -0,0 +1,29 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+
+public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaSpecificationExecutor<Exam> {
+
+    public Page<Exam> findAll(Pageable pageable);
+
+    List<Exam> findByStatus(ExamStatus status);
+
+    @Query("select e from Exam e where e.creatorId=?1 and e.status=?2 order by e.examTime desc")
+    public List<Exam> findByCreatorAndStatus(Integer id, ExamStatus status);
+
+    @Modifying
+    @Query("update Exam e set e.status=?2 where e.id=?1")
+    public void updateStatus(int examId, ExamStatus status);
+
+	public List<Exam> findBySchoolIdOrderByIdDesc(Integer schoolId);
+}

+ 40 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamPackageDao.java

@@ -0,0 +1,40 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
+import cn.com.qmth.stmms.biz.exam.model.ExamPackagePK;
+
+public interface ExamPackageDao extends PagingAndSortingRepository<ExamPackage, ExamPackagePK>,
+        JpaSpecificationExecutor<ExamPackage> {
+
+    @Query("select s from ExamPackage s where s.pk.examId=?1")
+    public List<ExamPackage> findByExamId(int examId);
+
+    @Query("select count(s) from ExamPackage s where s.pk.examId=?1")
+    public long countByExamId(int examId);
+
+    @Query("select count(s) from ExamPackage s where s.pk.examId=?1 and s.picCount>0")
+    public long countByExamIdAndUpload(int examId);
+
+    @Query("select count(s) from ExamPackage s where s.pk.examId=?1 and s.picCount=0")
+    public long countByExamIdAndUnUpload(int examId);
+
+    @Query("select s from ExamPackage s where s.pk.examId=?1 and s.pk.code=?2")
+    public ExamPackage findByExamIdAndCode(int examId, String code);
+
+    @Query("select s from ExamPackage s where s.pk.examId=?1 and s.picCount>0")
+    public List<ExamPackage> findByExamIdAndUpload(int examId);
+
+    @Query("select s from ExamPackage s where s.pk.examId=?1 and s.picCount=0")
+    public List<ExamPackage> findByExamIdAndUnUpload(int examId);
+
+    @Modifying
+    @Query("delete ExamPackage s where s.pk.examId=?1")
+    void deleteByExamId(int examId);
+}

+ 54 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamQuestionDao.java

@@ -0,0 +1,54 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
+import cn.com.qmth.stmms.biz.exam.model.QuestionPK;
+
+public interface ExamQuestionDao extends PagingAndSortingRepository<ExamQuestion, QuestionPK>,
+        JpaSpecificationExecutor<ExamQuestion> {
+
+    @Query("select q from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 order by q.pk.mainNumber, q.pk.subNumber")
+    public List<ExamQuestion> findByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode, boolean objective);
+
+    @Query("select q from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 and q.pk.mainNumber=?4 order by q.pk.subNumber")
+    public List<ExamQuestion> findByExamIdAndSubjectCodeAndObjectiveAndMainNumber(int examId, String subjectCode,
+            boolean objective, int mainNumber);
+
+    @Query("select count(q) from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2")
+    public long countByExamIdAndSubjectCode(int examId, String subjectCode);
+
+    @Query("select count(q) from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3")
+    public long countByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode, boolean objective);
+
+    @Modifying
+    @Query("delete from ExamQuestion q where q.pk.examId=?1")
+    public void deleteByExamId(int examId);
+
+    @Modifying
+    @Query("delete from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2")
+    public void deleteByExamIdAndSubjectCode(int examId, String subjectCode);
+
+    @Modifying
+    @Query("delete from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3")
+    public void deleteByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode, boolean objective);
+    
+    @Modifying
+    @Query("delete from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 and q.pk.mainNumber=?4")
+    public void deleteByExamIdAndSubjectCodeAndObjectiveAndMainNumber(int examId, String subjectCode, boolean objective,int mianNumber);
+    
+
+    @Query(value="SELECT case  when sum(q.total_score) != 'null' then sum(q.total_score) else 0 end as score from eb_exam_question q where 1=1 and q.exam_id =?1 and q.subject_code=?2",nativeQuery = true)
+    public double scoreByExamIdAndSubjectCode(int examId, String subjectCode);
+    
+    @Query(value="SELECT case  when sum(q.total_score) != 'null' then sum(q.total_score) else 0 end as score from eb_exam_question q where 1=1 and q.exam_id =?1 and q.subject_code=?2 and q.is_objective=?3",nativeQuery = true)
+    public double scoreByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode,boolean objective);
+    
+    @Query(value="SELECT case  when sum(q.total_score) != 'null' then sum(q.total_score) else 0 end as score from eb_exam_question q where 1=1 and q.exam_id =?1 and q.subject_code=?2 and q.main_number=?3 and q.is_objective=?4",nativeQuery = true)
+    public double scoreByExamIdAndSubjectCodeAndMainNumberAndObjective(int examId, String subjectCode,int mainNumber,boolean objective);
+}

+ 94 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -0,0 +1,94 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+
+public interface ExamStudentDao
+        extends PagingAndSortingRepository<ExamStudent, Integer>, JpaSpecificationExecutor<ExamStudent> {
+
+    public List<ExamStudent> findByExamId(int examId, Pageable pageable);
+
+    public List<ExamStudent> findByExamIdAndUploadAndAbsent(int examId, boolean upload, boolean absent,
+            Pageable pageable);
+
+    public List<ExamStudent> findByExamIdAndCampusName(int examId, String campusName, Pageable pageable);
+
+    public List<ExamStudent> findByExamIdAndExamNumber(int examId, String examNumber);
+
+    @Query("select count(s) from ExamStudent s where s.examId=?1 and s.campusName=?2")
+    public long countByExamIdAndCampusName(int examId, String campusName);
+
+    @Query("select count(distinct s.campusName) from ExamStudent s where s.examId=?1")
+    public long countCampusNameByExamId(int examId);
+
+    @Query("select s from ExamStudent s where s.examId=?1 group by s.subjectCode")
+    public List<ExamStudent> findDistinctSubjectByExamId(int examId, Pageable pageable);
+
+    @Query("select s from ExamStudent s where s.examId=?1 and s.campusName=?2 group by s.subjectCode")
+    public List<ExamStudent> findDistinctSubjectByExamIdAndCampusName(int examId, String campusName);
+
+    @Query("select s.campusName from ExamStudent s where s.examId=?1 group by s.campusName")
+    public List<String> findDistinctCampusName(int examId);
+
+    @Query("select s from ExamStudent s where s.examId=?1 group by s.campusName")
+    public Page<ExamStudent> findDistinctCampusName(int examId, Pageable pageable);
+
+    @Query("select s.packageCode from ExamStudent s where s.examId=?1 group by s.packageCode")
+    public List<String> findDistinctPackageCode(int examId);
+
+    @Modifying
+    @Query("update ExamStudent s set s.subjectiveScore=?2, s.subjectiveScoreList=?3 where s.id=?1")
+    public void updateSubjectiveScore(int id, double score, String scoreList);
+
+    @Modifying
+    @Query("update ExamStudent s set s.exception=?2 where s.id=?1")
+    public void updateException(int id, boolean exception);
+
+    @Modifying
+    @Query("delete from ExamStudent s where s.examId=?1")
+    public void deleteByExamId(int examId);
+
+    @Modifying
+    @Query("delete from ExamStudent s where s.examId=?1 and s.campusName=?2")
+    public void deleteByExamIdAndCampusName(int examId, String campusName);
+
+    public ExamStudent findByExamIdAndSubjectCodeAndStudentCode(Integer examId, String subjectCode, String studentCode);
+
+    public ExamStudent findByExamIdAndSchoolIdAndSubjectCodeAndStudentCode(Integer examId, Integer schoolId,
+            String subjectCode, String studentCode);
+
+    public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(Integer schoolId, String subjectCode,
+            String studentCode, String examSeqCode);
+
+    @Query("select sum(case when (s.objectiveScore + s.subjectiveScore) between 0 and 49 then 1 else 0 end),"
+    		+ "sum(case when (s.objectiveScore + s.subjectiveScore) between 50 and 59 then 1 else 0 end) ,"
+    		+ "sum(case when (s.objectiveScore + s.subjectiveScore) between 60 and 69 then 1 else 0 end) ,"
+    		+ "sum(case when (s.objectiveScore + s.subjectiveScore) between 70 and 79 then 1 else 0 end) ,"
+    		+ "sum(case when (s.objectiveScore + s.subjectiveScore) between 80 and 89 then 1 else 0 end) ,"
+    		+ "sum(case when (s.objectiveScore + s.subjectiveScore) between 90 and 100 then 1 else 0 end) "
+    		+ " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=?3  and s.absent=?4 ")
+	public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId,
+			String code, Boolean upload, boolean absent);
+
+    @Query("select sum(case when (s.objectiveScore + s.subjectiveScore) between 0 and 49 then 1 else 0 end),"
+    		+ "sum(case when (s.objectiveScore + s.subjectiveScore) between 50 and 59 then 1 else 0 end) ,"
+    		+ "sum(case when (s.objectiveScore + s.subjectiveScore) between 60 and 69 then 1 else 0 end) ,"
+    		+ "sum(case when (s.objectiveScore + s.subjectiveScore) between 70 and 79 then 1 else 0 end) ,"
+    		+ "sum(case when (s.objectiveScore + s.subjectiveScore) between 80 and 89 then 1 else 0 end) ,"
+    		+ "sum(case when (s.objectiveScore + s.subjectiveScore) between 90 and 100 then 1 else 0 end) "
+    		+ " from ExamStudent s where s.examId=?1 and s.subjectCode=?2 ")
+	public List<Object[]> statisticsByExamIdAndSubjectCode(Integer examId,
+			String code);
+
+	public ExamStudent findByExamIdAndSubjectCodeStartingWithAndStudentCode(Integer examId,
+			String subjectCode, String studentCode);
+
+}

+ 90 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamSubjectDao.java

@@ -0,0 +1,90 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+import java.util.Set;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubjectPK;
+import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+
+public interface ExamSubjectDao extends PagingAndSortingRepository<ExamSubject, ExamSubjectPK>,
+        JpaSpecificationExecutor<ExamSubject> {
+
+    @Query("select s from ExamSubject s where s.pk.examId=?1")
+    public List<ExamSubject> findByExamId(int examId);
+
+    @Query("select s.level from ExamSubject s where s.pk.examId=?1 and s.level is not null group by s.level")
+    public List<String> findDistinctLevel(int examId);
+
+    @Query("select s.category from ExamSubject s where s.pk.examId=?1 and s.category is not null group by s.category")
+    public List<String> findDistinctCategory(int examId);
+
+    @Query("select count(s) from ExamSubject s where s.pk.examId=?1")
+    public long countByExamId(int examId);
+
+    @Query("select s from ExamSubject s where s.pk.examId=?1 and s.pk.code=?2")
+    public ExamSubject findByExamIdAndCode(int examId, String code);
+
+    @Query("select s from ExamSubject s where s.pk.examId=?1 and s.libraryCount>?2 and s.subjectiveScore>?3")
+    public List<ExamSubject> findByExamIdAndLibraryCountGtAndSubjectiveScoreGt(int examId, int libraryCountGt,
+            double subjectiveScoreGt);
+
+    @Query("select s from ExamSubject s where s.pk.examId=?1 and s.status=?2 and s.libraryCount>?3 and s.subjectiveScore>?4")
+    public List<ExamSubject> findByExamIdAndStatusAndLibraryCountGtAndSubjectiveScoreGt(int examId,
+            ExamSubjectStatus status, int libraryCountGt, double subjectiveScoreGt);
+
+    @Query("select s from ExamSubject s where s.pk.examId=?1 and s.status=?2 and s.libraryCount>?3 and s.leftCount>?4 and s.subjectiveScore>?5")
+    public List<ExamSubject> findByExamIdAndStatusAndLibraryCountGtAndLeftCountGtAndSubjectiveScoreGt(int examId,
+            ExamSubjectStatus status, int libraryCountGt, int leftCountGt, double subjectiveScoreGt);
+
+    @Query("select s from ExamSubject s where s.pk.examId=?1 and s.status in ?2")
+    public List<ExamSubject> findByExamIdAndStatus(int examId, Set<ExamSubjectStatus> status);
+
+    @Query("select s from ExamSubject s where s.status in ?1")
+    public List<ExamSubject> findByStatus(Set<ExamSubjectStatus> status);
+
+    @Query("select count(s) from ExamSubject s where s.pk.examId=?1 and s.status in ?2")
+    public long countByExamIdAndStatus(int examId, Set<ExamSubjectStatus> status);
+
+    @Modifying
+    @Query("update ExamSubject s set s.status=?2 where s.pk.examId=?1")
+    public void updateStatusByExamId(int examId, ExamSubjectStatus status);
+
+    @Modifying
+    @Query("update ExamSubject s set s.libraryCount=?3, s.leftCount=?3-s.markedCount where s.pk.examId=?1 and s.pk.code=?2")
+    public void updateLibraryCountByExamIdAndCode(int examId, String code, int libraryCount);
+
+    @Modifying
+    @Query("update ExamSubject s set s.markedCount=?3, s.leftCount=s.libraryCount-?3 where s.pk.examId=?1 and s.pk.code=?2")
+    public void updateMarkedCountByExamIdAndCode(int examId, String code, int markedCount);
+
+    @Modifying
+    @Query("update ExamSubject s set s.libraryCount=(select count(l) from MarkLibrary l where l.examId=?1 and l.subjectCode=s.pk.code) where s.pk.examId=?1")
+    public void updateLibraryCountByExamId(int examId);
+
+    @Modifying
+    @Query("update ExamSubject s set s.markedCount=(select count(l) from MarkLibrary l where l.examId=?1 and l.subjectCode=s.pk.code and l.status=?2) where s.pk.examId=?1")
+    public void updateMarkedCountByExamId(int examId, LibraryStatus status);
+
+    @Modifying
+    @Query("update ExamSubject s set s.leftCount=s.libraryCount-s.markedCount where s.pk.examId=?1")
+    public void updateLeftCountByExamId(int examId);
+
+    @Query("select sum(s.libraryCount) as count from ExamSubject s where s.pk.examId=?1 and s.libraryCount>?2 and s.subjectiveScore>?3")
+    public Long sumLibraryCountByExamIdAndLibraryCountGtAndSubjectiveScoreGt(int examId, int libraryCountGt,
+            double subjectiveScoreGt);
+
+    @Modifying
+    @Query("update ExamSubject s set s.totalScore=s.objectiveScore+s.subjectiveScore where s.pk.examId=?1")
+    public void updateTotalScoreByExamId(int examId);
+
+    @Modifying
+    @Query("delete ExamSubject s where s.pk.examId=?1")
+    void deleteByExamId(int examId);
+}

+ 18 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamSubjectPaperDao.java

@@ -0,0 +1,18 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamSubjectPaper;
+
+public interface ExamSubjectPaperDao extends PagingAndSortingRepository<ExamSubjectPaper, Integer>,
+        JpaSpecificationExecutor<ExamSubjectPaper> {
+	
+	@Query(value = "select GROUP_CONCAT(b.main_number SEPARATOR ',') mainNumber from ( select p.main_number from eb_exam_subject_paper p where 1=1"
+			+ " and p.exam_id = ?1 and p.`code` = ?2 GROUP BY p.main_number) b",nativeQuery=true)
+	public List<String> getMainNumbersByExamIdAndCode(int examId,String subjectCode);
+}

+ 26 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkLevelDao.java

@@ -0,0 +1,26 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.MarkLevel;
+
+public interface MarkLevelDao extends PagingAndSortingRepository<MarkLevel, Integer> {
+
+    @Query("select m from MarkLevel m where m.pk.blockId=?1 and m.pk.stepNumber=?2 order by m.pk.number")
+    public List<MarkLevel> findByBlockIdAndStepNumber(int blockId, int stepNumber);
+
+    @Query("select m from MarkLevel m where m.pk.blockId=?1 and m.pk.stepNumber=?2 and m.pk.number=?3")
+    public List<MarkLevel> findByBlockIdAndStepNumberAndNumber(int blockId, int stepNumber, int levelNumber);
+
+    @Modifying
+    @Query("delete from MarkLevel m where m.pk.blockId=?1 and m.pk.stepNumber=?2")
+    public void deleteByBlockIdAndStepNumber(int blockId, int stepNumber);
+
+    @Modifying
+    @Query("delete from MarkLevel m where m.pk.blockId=?1")
+    public void deleteByBlockId(int blockId);
+}

+ 22 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkStepDao.java

@@ -0,0 +1,22 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.MarkStep;
+
+public interface MarkStepDao extends PagingAndSortingRepository<MarkStep, Integer> {
+
+    @Query("select m from MarkStep m where m.pk.blockId=?1 order by m.pk.number")
+    public List<MarkStep> findByBlockId(int blockId);
+
+    @Query("select m from MarkStep m where m.pk.blockId=?1 and m.pk.number=?2")
+    public List<MarkStep> findByBlockIdAndNumber(int blockId, int number);
+
+    @Modifying
+    @Query("delete from MarkStep m where m.pk.blockId=?1")
+    public void deleteByBlockId(int blockId);
+}

+ 40 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkerDao.java

@@ -0,0 +1,40 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+
+public interface MarkerDao extends PagingAndSortingRepository<Marker, Integer>, JpaSpecificationExecutor<Marker> {
+
+    @Query("select count(m) from Marker m where m.examId=?1")
+    public long countByExamId(int examId);
+
+    @Query("select count(m) from Marker m where m.examId=?1 and m.subjectCode=?2")
+    public long countByExamIdAndSubjectCode(int examId, String subjectCode);
+
+    public List<Marker> findByExamId(int examId);
+
+    public List<Marker> findByExamIdAndSubjectCode(int examId, String subjectCode);
+
+    public List<Marker> findByExamIdAndSubjectCode(int examId, String subjectCode, Pageable page);
+
+    public List<Marker> findByExamIdAndCommon(int examId, boolean common, Pageable page);
+
+    public List<Marker> findByLoginName(String loginName);
+
+    public List<Marker> findByLoginNameAndPassword(String loginName, String password);
+
+    @Modifying
+    @Query("delete from Marker m where m.examId=?1 and m.subjectCode=?2")
+    public void deleteByExamIdAndSubjectCode(int examId, String subjectCode);
+
+    @Modifying
+    @Query("delete from Marker m where m.examId=?1")
+    public void deleteByExamId(int examId);
+}

+ 31 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ObjectiveBlockDao.java

@@ -0,0 +1,31 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.ObjectiveBlock;
+
+public interface ObjectiveBlockDao extends PagingAndSortingRepository<ObjectiveBlock, Integer>,
+        JpaSpecificationExecutor<ObjectiveBlock> {
+
+    @Query("select count(distinct o.number) from ObjectiveBlock o where o.examId=?1 and o.subjectCode=?2")
+    public long countByExamIdAndSubjectCode(int examId, String subjectCode);
+
+    @Query("select count(ms) from ObjectiveBlock ms where ms.id in ( select m.id from ObjectiveBlock m where m.examId=?1 group by m.subjectCode)")
+    public long countSubjectByExamId(int examId);
+
+    public List<ObjectiveBlock> findByExamIdAndSubjectCodeAndNumber(int examId, String subjectCode, int number);
+
+    public List<ObjectiveBlock> findByExamIdAndSubjectCode(int examId, String subjectCode, Sort sort);
+
+    public List<ObjectiveBlock> findByExamId(int examId);
+
+    @Modifying
+    @Query("delete from ObjectiveBlock o where o.examId=?1 and o.subjectCode=?2")
+    public void deleteByExamIdAndSubjectCode(int examId, String subjectCode);
+}

+ 22 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ObjectiveQuestionDao.java

@@ -0,0 +1,22 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.ObjectiveQuestion;
+
+public interface ObjectiveQuestionDao extends PagingAndSortingRepository<ObjectiveQuestion, Integer> {
+
+    @Query("select q from ObjectiveQuestion q where q.pk.blockId=?1 order by q.pk.number asc")
+    public List<ObjectiveQuestion> findByBlockId(int blockId);
+
+    @Query("select q from ObjectiveQuestion q where q.pk.blockId=?1 and q.pk.number=?2")
+    public List<ObjectiveQuestion> findByBlockIdAndNumber(int blockId, int number);
+
+    @Modifying
+    @Query("delete from ObjectiveQuestion q where q.pk.blockId=?1")
+    public void deleteByBlockId(int blockId);
+}

+ 36 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ScoreRateDao.java

@@ -0,0 +1,36 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.ScoreRate;
+import cn.com.qmth.stmms.biz.exam.model.ScoreRatePK;
+
+public interface ScoreRateDao extends PagingAndSortingRepository<ScoreRate, ScoreRatePK>,
+        JpaSpecificationExecutor<ScoreRate> {
+
+//    @Query("select q from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 order by q.pk.mainNumber, q.pk.subNumber")
+//    public List<ExamQuestion> findByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode, boolean objective);
+//
+//    @Query("select q from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 and q.pk.mainNumber=?4 order by q.pk.subNumber")
+//    public List<ExamQuestion> findByExamIdAndSubjectCodeAndObjectiveAndMainNumber(int examId, String subjectCode,
+//            boolean objective, int mainNumber);
+//
+//    @Query("select count(q) from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2")
+//    public long countByExamIdAndSubjectCode(int examId, String subjectCode);
+//
+//    @Query("select count(q) from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3")
+//    public long countByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode, boolean objective);
+//
+//    @Modifying
+//    @Query("delete from ExamQuestion q where q.pk.examId=?1")
+//    public void deleteByExamId(int examId);
+//
+//    @Modifying
+//    @Query("delete from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2")
+//    public void deleteByExamIdAndSubjectCode(int examId, String subjectCode);
+//
+//    @Modifying
+//    @Query("delete from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3")
+//    public void deleteByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode, boolean objective);
+}

+ 32 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/SubjectiveBlockDao.java

@@ -0,0 +1,32 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveBlock;
+
+public interface SubjectiveBlockDao extends PagingAndSortingRepository<SubjectiveBlock, Integer>,
+        JpaSpecificationExecutor<SubjectiveBlock> {
+
+    @Query("select count(o) from SubjectiveBlock o where o.examId=?1 and o.subjectCode=?2")
+    public long countByExamIdAndSubjectCode(int examId, String subjectCode);
+
+    @Query("select count(ms) from SubjectiveBlock ms where ms.id in ( select m.id from SubjectiveBlock m where m.examId=?1 group by m.subjectCode)")
+    public long countSubjectByExamId(int examId);
+
+    @Query("select o from SubjectiveBlock o where o.examId=?1 and o.subjectCode=?2 order by o.number")
+    public List<SubjectiveBlock> findByExamIdAndSubjectCode(int examId, String subjectCode);
+
+    public List<SubjectiveBlock> findByExamId(int examId);
+
+    public List<SubjectiveBlock> findByExamIdAndSubjectCodeAndNumber(int examId, String subjectCode, int number);
+
+    @Modifying
+    @Query("delete from SubjectiveBlock s where s.examId=?1 and s.subjectCode=?2")
+    public void deleteByExamIdAndSubjectCode(int examId, String subjectCode);
+
+}

+ 15 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/TagDao.java

@@ -0,0 +1,15 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.Tag;
+
+public interface TagDao extends PagingAndSortingRepository<Tag, Integer>, JpaSpecificationExecutor<Tag> {
+
+    @Query("select t from Tag t")
+    public List<Tag> list();
+}

+ 129 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java

@@ -0,0 +1,129 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+
+@Entity
+@Table(name = "eb_exam")
+public class Exam implements Serializable {
+
+    private static final long serialVersionUID = 5179623303410999209L;
+
+    public static final String SUBJECT_ID_SPLIT = ",";
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    private String name;
+
+    @Column(name = "school_id")
+    private Integer schoolId;
+
+    @Temporal(TemporalType.DATE)
+    @Column(name = "exam_time")
+    private Date examTime;
+
+    @Enumerated(EnumType.ORDINAL)
+    private ExamStatus status;
+
+    private String description;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "create_time")
+    private Date createTime;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "update_time")
+    private Date updateTime;
+
+    @Column(name = "creator_id")
+    private Integer creatorId;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Date getExamTime() {
+        return examTime;
+    }
+
+    public void setExamTime(Date examTime) {
+        this.examTime = examTime;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Integer getCreatorId() {
+        return creatorId;
+    }
+
+    public void setCreatorId(Integer creatorId) {
+        this.creatorId = creatorId;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public ExamStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(ExamStatus status) {
+        this.status = status;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+
+}

+ 73 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamPackage.java

@@ -0,0 +1,73 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import org.apache.commons.lang.StringUtils;
+
+@Entity
+@Table(name = "eb_exam_package")
+public class ExamPackage implements Serializable {
+
+    private static final long serialVersionUID = 1713850212826781261L;
+
+    @EmbeddedId
+    private ExamPackagePK pk;
+
+    @Column(name = "pic_count")
+    private Integer picCount;
+
+    @Transient
+    private List<String> urls;
+
+    public ExamPackage() {
+        this.pk = new ExamPackagePK();
+    }
+
+    public Integer getExamId() {
+        return pk.getExamId();
+    }
+
+    public void setExamId(Integer examId) {
+        pk.setExamId(examId);
+    }
+
+    public String getCode() {
+        return pk.getCode();
+    }
+
+    public void setCode(String code) {
+        pk.setCode(code);
+    }
+
+    public Integer getPicCount() {
+        return picCount;
+    }
+
+    public void setPicCount(Integer picCount) {
+        this.picCount = picCount;
+    }
+
+    public List<String> getUrls() {
+        return urls;
+    }
+
+    public void setUrls(List<String> urls) {
+        this.urls = urls;
+    }
+
+    public String getUrlString() {
+        if (urls != null) {
+            return StringUtils.join(urls, ",");
+        } else {
+            return "";
+        }
+    }
+
+}

+ 75 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamPackagePK.java

@@ -0,0 +1,75 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class ExamPackagePK implements Serializable {
+
+    private static final long serialVersionUID = -8708586154329415842L;
+
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    @Column(name = "code")
+    private String code;
+
+    public ExamPackagePK() {
+    }
+
+    @Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((examId == null) ? 0 : examId.hashCode());
+        result = PRIME * result + ((code == null) ? 0 : code.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final ExamPackagePK other = (ExamPackagePK) obj;
+        if (examId == null) {
+            if (other.examId != null)
+                return false;
+        } else if (!examId.equals(other.examId))
+            return false;
+        if (code == null) {
+            if (other.code != null)
+                return false;
+        } else if (!code.equals(other.code))
+            return false;
+
+        return true;
+    }
+
+    public ExamPackagePK(int examId, String code) {
+        this.examId = examId;
+        this.code = code;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+}

+ 195 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java

@@ -0,0 +1,195 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+@Entity
+@Table(name = "eb_exam_question")
+public class ExamQuestion implements Serializable {
+
+    private static final long serialVersionUID = -6614640229855098561L;
+
+    @EmbeddedId
+    private QuestionPK pk;
+
+    @Column(name = "main_title", length = 128)
+    private String mainTitle;
+
+    @Column(name = "answer")
+    private String answer;
+
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    @Column(name = "interval_score")
+    private Double intervalScore;
+
+    /**
+     * 考生人数
+     */
+    @Column(name = "total_count")
+    private Integer totalCount;
+
+    /**
+     * 零分人数
+     */
+    @Column(name = "zero_count")
+    private Integer zeroCount;
+
+    /**
+     * 满分人数
+     */
+    @Column(name = "full_count")
+    private Integer fullCount;
+
+    @Transient
+    private ExamSubject subject;
+
+    public ExamQuestion() {
+        this.pk = new QuestionPK();
+    }
+
+    public Integer getExamId() {
+        return pk.getExamId();
+    }
+
+    public void setExamId(Integer examId) {
+        pk.setExamId(examId);
+    }
+
+    public String getSubjectCode() {
+        return pk.getSubjectCode();
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        pk.setSubjectCode(subjectCode);
+    }
+
+    public Integer getMainNumber() {
+        return pk.getMainNumber();
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        pk.setMainNumber(mainNumber);
+    }
+
+    public Integer getSubNumber() {
+        return pk.getSubNumber();
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        pk.setSubNumber(subNumber);
+    }
+
+    public String getMainTitle() {
+        return mainTitle;
+    }
+
+    public void setObjective(boolean objective) {
+        pk.setObjective(objective);
+    }
+
+    public boolean isObjective() {
+        return pk.isObjective();
+    }
+
+    public void setMainTitle(String mainTitle) {
+        this.mainTitle = mainTitle;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getName() {
+        if (mainTitle != null && getSubNumber() != null) {
+            return mainTitle + "-" + getSubNumber();
+        } else {
+            return "";
+        }
+    }
+
+    public List<Double> getScoreList() {
+        List<Double> list = new LinkedList<Double>();
+        if (totalScore != null && intervalScore != null) {
+            for (double score = 0; score <= totalScore; score += intervalScore) {
+                list.add(score);
+            }
+        }
+        return list;
+    }
+
+    public double[] getScoreListArray() {
+        List<Double> list = getScoreList();
+        int length = list.size();
+        double[] array = new double[length];
+        for (int i = 0; i < list.size(); i++) {
+            array[i] = list.get(i);
+        }
+        return array;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+    public Double getIntervalScore() {
+        return intervalScore;
+    }
+
+    public void setIntervalScore(Double intervalScore) {
+        this.intervalScore = intervalScore;
+    }
+
+    public Integer getZeroCount() {
+        return zeroCount;
+    }
+
+    public void setZeroCount(Integer zeroCount) {
+        this.zeroCount = zeroCount;
+    }
+
+    public Integer getFullCount() {
+        return fullCount;
+    }
+
+    public void setFullCount(Integer fullCount) {
+        this.fullCount = fullCount;
+    }
+
+    public Integer getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(Integer totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public ExamSubject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(ExamSubject subject) {
+        this.subject = subject;
+    }
+
+    public String getQuestionNumber() {
+        return getMainNumber() + "." + getSubNumber();
+    }
+
+}

+ 639 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamStudent.java

@@ -0,0 +1,639 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+
+import org.apache.commons.lang.StringUtils;
+
+import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.common.annotation.ExcelField;
+
+/**
+ * 针对某次考试的考生信息
+ * 
+ * @author LS
+ * 
+ */
+@Entity
+@Table(name = "eb_exam_student")
+public class ExamStudent implements Serializable {
+
+    protected static final long serialVersionUID = 2944870647483950851L;
+
+    public static final String ANSWER_SPLIT = ",";
+
+    public static final String SPLIT = ";";
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 考试ID
+     */
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    /**
+     * 学校ID
+     */
+    @Column(name = "school_id")
+    private Integer schoolId;
+
+    /**
+     * 学习中心
+     */
+    @Column(name = "campus_name")
+    @ExcelField(title = "学习中心", align = 2, sort = 10)
+    private String campusName;
+
+    /**
+     * 科目代码
+     */
+    @Column(name = "subject_code")
+    @ExcelField(title = "课程代码", align = 2, sort = 20)
+    private String subjectCode;
+
+    /**
+     * 科目名称
+     */
+    @Column(name = "subject_name")
+    @ExcelField(title = "课程名称", align = 2, sort = 30)
+    private String subjectName;
+
+    /**
+     * 准考证号
+     */
+    @Column(name = "exam_number")
+    @ExcelField(title = "准考证号", align = 2, sort = 40)
+    private String examNumber;
+
+    /**
+     * 学号
+     */
+    @Column(name = "student_code")
+    @ExcelField(title = "学号", align = 2, sort = 50)
+    private String studentCode;
+
+    /**
+     * 姓名
+     */
+    @Column(name = "name")
+    @ExcelField(title = "姓名", align = 2, sort = 60)
+    private String name;
+
+    /**
+     * 试卷袋签到表编号
+     */
+    @Column(name = "package_code")
+    @ExcelField(title = "签到表编号", align = 2, sort = 70)
+    private String packageCode;
+
+    /**
+     * 考生考点信息
+     */
+    @Column(name = "exam_site")
+    @ExcelField(title = "考点信息", align = 2, sort = 80)
+    private String examSite;
+
+    /**
+     * 考生考场信息
+     */
+    @Column(name = "exam_room")
+    @ExcelField(title = "考场信息", align = 2, sort = 90)
+    private String examRoom;
+
+    /**
+     * 考生备注信息
+     */
+    @Column(name = "remark")
+    @ExcelField(title = "考生备注信息", align = 2, sort = 100)
+    private String remark;
+
+    /**
+     * 扫描批次编号
+     */
+    @Column(name = "batch_code")
+    private String batchCode;
+
+    /**
+     * 原图数量
+     */
+    @Column(name = "sheet_count")
+    private Integer sheetCount;
+
+    /**
+     * 小图数量
+     */
+    @Column(name = "slice_count")
+    private Integer sliceCount;
+
+    /**
+     * 客观答案
+     */
+    @Column(name = "answers")
+    private String answers;
+
+    /**
+     * 是否已上传
+     */
+    @Column(name = "is_upload")
+    private boolean upload;
+
+    /**
+     * 是否缺考
+     */
+    @Column(name = "is_absent")
+    private boolean absent;
+
+    /**
+     * 是否数据校验异常
+     */
+    @Column(name = "is_exception")
+    private boolean exception;
+
+    /**
+     * 是否完成评卷
+     */
+    @Column(name = "finished")
+    private boolean finished;
+
+    /**
+     * 上传时间
+     */
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "upload_time")
+    private Date uploadTime;
+
+    /**
+     * 客观总分
+     */
+    @Column(name = "objective_score")
+    private Double objectiveScore;
+
+    /**
+     * 客观题得分明细
+     */
+    @Column(name = "objective_score_list")
+    private String objectiveScoreList;
+
+    /**
+     * 主观总分
+     */
+    @Column(name = "subjective_score")
+    private Double subjectiveScore;
+
+    /**
+     * 主观题得分明细
+     */
+    @Column(name = "subjective_score_list")
+    private String subjectiveScoreList;
+
+    /**
+     * 科目层次信息
+     */
+    @ExcelField(title = "层次", align = 2, sort = 110)
+    @Column(name = "subject_level")
+    private String subjectLevel;
+
+    /**
+     * 专业类型信息
+     */
+    @ExcelField(title = "专业类型", align = 2, sort = 120)
+    @Column(name = "subject_category")
+    private String subjectCategory;
+
+    /**
+     * 科目备注信息
+     */
+    @ExcelField(title = "科目备注信息", align = 2, sort = 130)
+    @Transient
+    private String subjectRemark;
+
+    /**
+     * 年级
+     */
+    @ExcelField(title = "年级", align = 2, sort = 140)
+    private String grade;
+
+    /**
+     * 专业
+     */
+    @ExcelField(title = "专业", align = 2, sort = 150)
+    private String department;
+
+    @Transient
+    private List<String> sheetUrls;
+
+    @Transient
+    private List<String> packageUrls;
+
+    @Transient
+    private String answerUrl;
+
+    @Transient
+    private String markTime;
+    
+    /**
+     * 主观题是否已经评卷完成
+     */
+    @Transient
+    private boolean marked;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getCampusName() {
+        return campusName;
+    }
+
+    public void setCampusName(String campusName) {
+        this.campusName = campusName;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getAnswers() {
+        return answers;
+    }
+
+    public void setAnswers(String answers) {
+        this.answers = answers;
+    }
+
+    public boolean isUpload() {
+        return upload;
+    }
+
+    public void setUpload(boolean upload) {
+        this.upload = upload;
+    }
+
+    public Date getUploadTime() {
+        return uploadTime;
+    }
+
+    public void setUploadTime(Date uploadTime) {
+        this.uploadTime = uploadTime;
+    }
+
+    public List<String> getAnswerList() {
+        String[] values = StringUtils.split(StringUtils.trimToNull(answers), ANSWER_SPLIT);
+        List<String> list = new ArrayList<String>();
+        if (values != null && values.length > 0) {
+            for (String answer : values) {
+                list.add(StringUtils.trim(answer));
+            }
+        }
+        return list;
+    }
+
+    public Double getObjectiveScore() {
+        return objectiveScore;
+    }
+
+    public void setObjectiveScore(Double objectiveScore) {
+        this.objectiveScore = objectiveScore;
+    }
+
+    public Double getSubjectiveScore() {
+        return subjectiveScore;
+    }
+
+    public void setSubjectiveScore(Double subjectiveScore) {
+        this.subjectiveScore = subjectiveScore;
+    }
+
+    public String getObjectiveScoreList() {
+        return objectiveScoreList;
+    }
+
+    public void setObjectiveScoreList(String objectiveScoreList) {
+        this.objectiveScoreList = objectiveScoreList;
+    }
+
+    public String getSubjectiveScoreList() {
+        return subjectiveScoreList;
+    }
+
+    public void setSubjectiveScoreList(String subjectiveScoreList) {
+        this.subjectiveScoreList = subjectiveScoreList;
+    }
+
+    public static String buildScoreList(List<ScoreItem> scoreList) {
+        if (scoreList != null) {
+            return StringUtils.join(scoreList, SPLIT);
+        } else {
+            return null;
+        }
+    }
+
+    public void setScoreList(List<ScoreItem> scoreList, boolean objective) {
+        if (scoreList != null) {
+            if (objective) {
+                setObjectiveScoreList(StringUtils.join(scoreList, SPLIT));
+            } else {
+                setSubjectiveScoreList(StringUtils.join(scoreList, SPLIT));
+            }
+        }
+    }
+
+    public List<ScoreItem> getScoreList(boolean objective) {
+        List<ScoreItem> scoreList = new LinkedList<ScoreItem>();
+        try {
+            String[] values = StringUtils.split(objective ? objectiveScoreList : subjectiveScoreList, SPLIT);
+            for (String value : values) {
+                ScoreItem item = ScoreItem.parse(value, objective);
+                item.setObjective(objective);
+                if (item != null) {
+                    scoreList.add(item);
+                }
+            }
+        } catch (Exception e) {
+        }
+        return scoreList;
+    }
+
+    public List<String> getSheetUrls() {
+        return sheetUrls;
+    }
+
+    public void setSheetUrls(List<String> sheetUrls) {
+        this.sheetUrls = sheetUrls;
+    }
+
+    public boolean isAbsent() {
+        return absent;
+    }
+
+    public void setAbsent(boolean absent) {
+        this.absent = absent;
+    }
+
+    public boolean isFinished() {
+        return finished;
+    }
+
+    public void setFinished(boolean finished) {
+        this.finished = finished;
+    }
+
+    public Integer getSheetCount() {
+        return sheetCount;
+    }
+
+    public void setSheetCount(Integer sheetCount) {
+        this.sheetCount = sheetCount;
+    }
+
+    public Integer getSliceCount() {
+        return sliceCount;
+    }
+
+    public void setSliceCount(Integer sliceCount) {
+        this.sliceCount = sliceCount;
+    }
+
+    public double getTotalScore() {
+        double score = 0;
+        if (objectiveScore != null) {
+            score += objectiveScore;
+        }
+        if (subjectiveScore != null) {
+            score += subjectiveScore;
+        }
+        return score;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getBatchCode() {
+        return batchCode;
+    }
+
+    public void setBatchCode(String batchCode) {
+        this.batchCode = batchCode;
+    }
+
+    public String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+
+    public List<String> getPackageUrls() {
+        return packageUrls;
+    }
+
+    public void setPackageUrls(List<String> packageUrls) {
+        this.packageUrls = packageUrls;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getMarkTime() {
+        return markTime;
+    }
+
+    public void setMarkTime(String markTime) {
+        this.markTime = markTime;
+    }
+
+    public boolean isException() {
+        return exception;
+    }
+
+    public void setException(boolean exception) {
+        this.exception = exception;
+    }
+
+    public String getObjectiveScoreString() {
+        try {
+            return ScoreItem.NUMBER_FORMAT.format(objectiveScore);
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    public String getSubjectiveScoreString() {
+        try {
+            return ScoreItem.NUMBER_FORMAT.format(subjectiveScore);
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    public String getTotalScoreString() {
+        try {
+            return ScoreItem.NUMBER_FORMAT.format(getTotalScore());
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    public String getSubjectRemark() {
+        return subjectRemark;
+    }
+
+    public void setSubjectRemark(String subjectRemark) {
+        this.subjectRemark = subjectRemark;
+    }
+
+    public String getSheetUrlString() {
+        if (sheetUrls != null) {
+            return StringUtils.join(sheetUrls, ",");
+        } else {
+            return "";
+        }
+    }
+
+    public String getPackageUrlString() {
+        if (packageUrls != null) {
+            return StringUtils.join(packageUrls, ",");
+        } else {
+            return "";
+        }
+    }
+
+    public String getAnswerUrl() {
+        return answerUrl;
+    }
+
+    public void setAnswerUrl(String answerUrl) {
+        this.answerUrl = answerUrl;
+    }
+
+    public String getSubjectLevel() {
+        return subjectLevel;
+    }
+
+    public void setSubjectLevel(String subjectLevel) {
+        this.subjectLevel = subjectLevel;
+    }
+
+    public String getExamSite() {
+        return examSite;
+    }
+
+    public void setExamSite(String examSite) {
+        this.examSite = examSite;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getSubjectCategory() {
+        return subjectCategory;
+    }
+
+    public void setSubjectCategory(String subjectCategory) {
+        this.subjectCategory = subjectCategory;
+    }
+
+    public String getGrade() {
+        return grade;
+    }
+
+    public void setGrade(String grade) {
+        this.grade = grade;
+    }
+
+    public String getDepartment() {
+        return department;
+    }
+
+    public void setDepartment(String department) {
+        this.department = department;
+    }
+
+	public boolean isMarked() {
+		return marked;
+	}
+
+	public void setMarked(boolean marked) {
+		this.marked = marked;
+	}
+
+}

+ 249 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubject.java

@@ -0,0 +1,249 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import org.apache.commons.lang.StringUtils;
+
+import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
+import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+
+@Entity
+@Table(name = "eb_exam_subject")
+public class ExamSubject implements Serializable {
+
+    private static final long serialVersionUID = -6942849844435873366L;
+
+    @EmbeddedId
+    private ExamSubjectPK pk;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "level")
+    private String level;
+
+    @Column(name = "category")
+    private String category;
+
+    @Enumerated(EnumType.ORDINAL)
+    @Column(name = "status")
+    private ExamSubjectStatus status;
+
+    @Column(name = "objective_score")
+    private Double objectiveScore;
+
+    @Column(name = "subjective_score")
+    private Double subjectiveScore;
+
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    @Column(name = "library_count")
+    private Integer libraryCount;
+
+    @Column(name = "marked_count")
+    private Integer markedCount;
+
+    @Column(name = "left_count")
+    private Integer leftCount;
+
+    @Column(name = "has_paper")
+    private Boolean hasPaper;
+
+    @Column(name = "has_answer")
+    private Boolean hasAnswer;
+
+    @Column(name = "remark")
+    private String remark;
+
+    @Transient
+    private long studentCount;
+
+    @Transient
+    private long scanCount;
+
+    @Transient
+    private long subjectiveCount;
+
+    public ExamSubject() {
+        this.pk = new ExamSubjectPK();
+    }
+
+    public Integer getExamId() {
+        return pk.getExamId();
+    }
+
+    public void setExamId(Integer examId) {
+        pk.setExamId(examId);
+    }
+
+    public String getCode() {
+        return pk.getCode();
+    }
+
+    public void setCode(String code) {
+        pk.setCode(code);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public ExamSubjectStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(ExamSubjectStatus status) {
+        this.status = status;
+    }
+
+    public long getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(long studentCount) {
+        this.studentCount = studentCount;
+    }
+
+    public long getScanCount() {
+        return scanCount;
+    }
+
+    public void setScanCount(long scanCount) {
+        this.scanCount = scanCount;
+    }
+
+    public long getSubjectiveCount() {
+        return subjectiveCount;
+    }
+
+    public void setSubjectiveCount(long subjectiveCount) {
+        this.subjectiveCount = subjectiveCount;
+    }
+
+    public Double getObjectiveScore() {
+        return objectiveScore;
+    }
+
+    public void setObjectiveScore(Double objectiveScore) {
+        this.objectiveScore = objectiveScore;
+    }
+
+    public Double getSubjectiveScore() {
+        return subjectiveScore;
+    }
+
+    public void setSubjectiveScore(Double subjectiveScore) {
+        this.subjectiveScore = subjectiveScore;
+    }
+
+    public void setScore(double score, boolean objective) {
+        if (objective) {
+            setObjectiveScore(score);
+        } else {
+            setSubjectiveScore(score);
+        }
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public Integer getLibraryCount() {
+        return libraryCount;
+    }
+
+    public void setLibraryCount(Integer libraryCount) {
+        this.libraryCount = libraryCount;
+    }
+
+    public Integer getMarkedCount() {
+        return markedCount;
+    }
+
+    public void setMarkedCount(Integer markedCount) {
+        this.markedCount = markedCount;
+    }
+
+    public Integer getLeftCount() {
+        return leftCount;
+    }
+
+    public void setLeftCount(Integer leftCount) {
+        this.leftCount = leftCount;
+    }
+
+    public Boolean getHasPaper() {
+        return hasPaper;
+    }
+
+    public void setHasPaper(Boolean hasPaper) {
+        this.hasPaper = hasPaper;
+    }
+
+    public Boolean getHasAnswer() {
+        return hasAnswer;
+    }
+
+    public void setHasAnswer(Boolean hasAnswer) {
+        this.hasAnswer = hasAnswer;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getDisplayName() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(name);
+        if (StringUtils.isNotBlank(remark)) {
+            sb.append("_").append(remark);
+        }
+        return sb.toString();
+    }
+
+    public String getPaperUrl() {
+        return PictureUrlBuilder.getPaperUrl(getExamId(), getCode());
+    }
+
+    public String getAnswerUrl() {
+        return PictureUrlBuilder.getAnswerUrl(getExamId(), getCode());
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public void setCategory(String category) {
+        this.category = category;
+    }
+
+}

+ 75 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubjectPK.java

@@ -0,0 +1,75 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class ExamSubjectPK implements Serializable {
+
+    private static final long serialVersionUID = -8708586154329415842L;
+
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    @Column(name = "code")
+    private String code;
+
+    public ExamSubjectPK() {
+    }
+
+    @Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((examId == null) ? 0 : examId.hashCode());
+        result = PRIME * result + ((code == null) ? 0 : code.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final ExamSubjectPK other = (ExamSubjectPK) obj;
+        if (examId == null) {
+            if (other.examId != null)
+                return false;
+        } else if (!examId.equals(other.examId))
+            return false;
+        if (code == null) {
+            if (other.code != null)
+                return false;
+        } else if (!code.equals(other.code))
+            return false;
+
+        return true;
+    }
+
+    public ExamSubjectPK(int examId, String code) {
+        this.examId = examId;
+        this.code = code;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+}

+ 114 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubjectPaper.java

@@ -0,0 +1,114 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/*
+ * 从科目的维度去维护试卷的结构
+ */
+@Entity
+@Table(name = "eb_exam_subject_paper")
+public class ExamSubjectPaper implements Serializable {
+
+	private static final long serialVersionUID = 8097130416465761643L;
+	
+	@Id
+    @GeneratedValue
+    private Integer id;
+
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    @Column(name = "code")
+    private String code;
+    
+    //题型名称
+    @Column(name = "question_type_name")
+    private String questionTypeName;
+    //题型总个数(包括有效个数和无效个数)
+    @Column(name="total_count")
+    private Integer totalCount;
+    //题型有效个数
+    @Column(name = "count")
+    private Integer count;
+    //题型总分
+    @Column(name = "total_score")
+    private Double totalScore;
+    //题型间隔分
+    @Column(name = "interval_score")
+    private Double intervalScore;
+    //大题号
+    @Column(name = "main_number")
+    private Integer mainNumber;
+    //客观(主观)
+    @Column(name = "is_objective")
+    //1:客观;0:主观
+    private Integer objective;
+	public String getQuestionTypeName() {
+		return questionTypeName;
+	}
+	public void setQuestionTypeName(String questionTypeName) {
+		this.questionTypeName = questionTypeName;
+	}
+	
+	public Integer getTotalCount() {
+		return totalCount;
+	}
+	public void setTotalCount(Integer totalCount) {
+		this.totalCount = totalCount;
+	}
+	public Integer getCount() {
+		return count;
+	}
+	public void setCount(Integer count) {
+		this.count = count;
+	}
+	public Double getTotalScore() {
+		return totalScore;
+	}
+	public void setTotalScore(Double totalScore) {
+		this.totalScore = totalScore;
+	}
+	public Double getIntervalScore() {
+		return intervalScore;
+	}
+	public void setIntervalScore(Double intervalScore) {
+		this.intervalScore = intervalScore;
+	}
+	public Integer getId() {
+		return id;
+	}
+	public void setId(Integer id) {
+		this.id = id;
+	}
+	public Integer getExamId() {
+		return examId;
+	}
+	public void setExamId(Integer examId) {
+		this.examId = examId;
+	}
+	public String getCode() {
+		return code;
+	}
+	public void setCode(String code) {
+		this.code = code;
+	}
+	public Integer getMainNumber() {
+		return mainNumber;
+	}
+	public void setMainNumber(Integer mainNumber) {
+		this.mainNumber = mainNumber;
+	}
+	public Integer getObjective() {
+		return objective;
+	}
+	public void setObjective(Integer objective) {
+		this.objective = objective;
+	}
+}

+ 108 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubjectPaperDTO.java

@@ -0,0 +1,108 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+/*
+ * 从科目的维度去维护试卷的结构
+ */
+public class ExamSubjectPaperDTO implements Serializable {
+
+	private static final long serialVersionUID = 2457589654916634924L;
+	//题型名称
+	private String title;
+	//该题的大题号
+	private Integer mainNumber;
+	//该题的小题号
+	private Integer subNumber;
+	//有效个数
+	private Integer count;
+	//该题间隔分数
+	private Double intervalScore;
+	//该题分数
+	private Double socre;
+	//查考答案
+	private String answer;
+	//考试ID
+	private Long examId;
+	//课程代码
+	private String subjectCode;
+	//分数class名字
+	private String scoreClass;
+	//答案class名字
+	private String answerClass;
+    //1:客观;0:主观
+    private Integer objective;
+	public String getTitle() {
+		return title;
+	}
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	public Integer getMainNumber() {
+		return mainNumber;
+	}
+	public void setMainNumber(Integer mainNumber) {
+		this.mainNumber = mainNumber;
+	}
+	
+	public Integer getSubNumber() {
+		return subNumber;
+	}
+	public void setSubNumber(Integer subNumber) {
+		this.subNumber = subNumber;
+	}
+	public Integer getCount() {
+		return count;
+	}
+	public void setCount(Integer count) {
+		this.count = count;
+	}
+	public Double getIntervalScore() {
+		return intervalScore;
+	}
+	public void setIntervalScore(Double intervalScore) {
+		this.intervalScore = intervalScore;
+	}
+	public Double getSocre() {
+		return socre;
+	}
+	public void setSocre(Double socre) {
+		this.socre = socre;
+	}
+	public String getAnswer() {
+		return answer;
+	}
+	public void setAnswer(String answer) {
+		this.answer = answer;
+	}
+	public Long getExamId() {
+		return examId;
+	}
+	public void setExamId(Long examId) {
+		this.examId = examId;
+	}
+	public String getSubjectCode() {
+		return subjectCode;
+	}
+	public void setSubjectCode(String subjectCode) {
+		this.subjectCode = subjectCode;
+	}
+	public String getScoreClass() {
+		return scoreClass;
+	}
+	public void setScoreClass(String scoreClass) {
+		this.scoreClass = scoreClass;
+	}
+	public String getAnswerClass() {
+		return answerClass;
+	}
+	public void setAnswerClass(String answerClass) {
+		this.answerClass = answerClass;
+	}
+	public Integer getObjective() {
+		return objective;
+	}
+	public void setObjective(Integer objective) {
+		this.objective = objective;
+	}
+}

+ 173 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkLevel.java

@@ -0,0 +1,173 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+@Entity
+@Table(name = "eb_mark_level")
+public class MarkLevel implements Serializable {
+
+    private static final long serialVersionUID = 6710328491557700440L;
+
+    @EmbeddedId
+    private MarkLevelPK pk;
+
+    private String name;
+
+    private Double min;
+
+    private Double max;
+
+    @Transient
+    private double[] scoreList;
+
+    public MarkLevel() {
+        this.pk = new MarkLevelPK();
+    }
+
+    public Integer getBlockId() {
+        return this.pk.getBlockId();
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.pk.setBlockId(blockId);
+    }
+
+    public Integer getStepNumber() {
+        return this.pk.getStepNumber();
+    }
+
+    public void setStepNumber(Integer stepNumber) {
+        this.pk.setStepNumber(stepNumber);
+    }
+
+    public Integer getNumber() {
+        return pk.getNumber();
+    }
+
+    public void setNumber(Integer number) {
+        this.pk.setNumber(number);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Double getMin() {
+        return min;
+    }
+
+    public void setMin(Double min) {
+        this.min = min;
+    }
+
+    public Double getMax() {
+        return max;
+    }
+
+    public void setMax(Double max) {
+        this.max = max;
+    }
+
+    public double[] getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(double[] scoreList) {
+        this.scoreList = scoreList;
+    }
+
+}
+
+@Embeddable
+class MarkLevelPK implements Serializable {
+
+    private static final long serialVersionUID = -5296472857826912303L;
+
+    @Column(name = "block_id")
+    private Integer blockId;
+
+    @Column(name = "step_number")
+    private Integer stepNumber;
+
+    private Integer number;
+
+    public MarkLevelPK() {
+
+    }
+
+    @Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((blockId == null) ? 0 : blockId.hashCode());
+        result = PRIME * result + ((stepNumber == null) ? 0 : stepNumber.hashCode());
+        result = PRIME * result + ((number == null) ? 0 : number.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final MarkLevelPK other = (MarkLevelPK) obj;
+        if (blockId == null) {
+            if (other.blockId != null)
+                return false;
+        } else if (!blockId.equals(other.blockId)) {
+            return false;
+        }
+        if (stepNumber == null) {
+            if (other.stepNumber != null)
+                return false;
+        } else if (!stepNumber.equals(other.stepNumber)) {
+            return false;
+        }
+        if (number == null) {
+            if (other.number != null)
+                return false;
+        } else if (!number.equals(other.number)) {
+            return false;
+        }
+        return true;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public Integer getBlockId() {
+        return blockId;
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.blockId = blockId;
+    }
+
+    public Integer getStepNumber() {
+        return stepNumber;
+    }
+
+    public void setStepNumber(Integer stepNumber) {
+        this.stepNumber = stepNumber;
+    }
+
+}

+ 261 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkStep.java

@@ -0,0 +1,261 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import org.apache.commons.lang.StringUtils;
+
+@Entity
+@Table(name = "eb_mark_step")
+public class MarkStep implements Serializable {
+
+    private static final long serialVersionUID = -4181588561648925132L;
+
+    @EmbeddedId
+    private MarkStepPK pk;
+
+    @Column(name = "title")
+    private String title;
+
+    @Column(name = "has_level")
+    private boolean hasLevel;
+
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    @Column(name = "max")
+    private Double max;
+
+    @Column(name = "min")
+    private Double min;
+
+    @Column(name = "default_score")
+    private Double defaultScore;
+
+    @Column(name = "score_interval")
+    private Double interval;
+
+    @Column(name = "score_list")
+    private String scoreList;
+
+    private String remark;
+
+    @Transient
+    private List<MarkLevel> markLevelList;
+
+    public MarkStep() {
+        this.pk = new MarkStepPK();
+    }
+
+    public Integer getBlockId() {
+        return pk.getBlockId();
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.pk.setBlockId(blockId);
+    }
+
+    public Integer getNumber() {
+        return pk.getNumber();
+    }
+
+    public void setNumber(Integer number) {
+        this.pk.setNumber(number);
+    }
+
+    public boolean isHasLevel() {
+        return hasLevel;
+    }
+
+    public void setHasLevel(boolean hasLevel) {
+        this.hasLevel = hasLevel;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public Double getMax() {
+        return max;
+    }
+
+    public void setMax(Double max) {
+        this.max = max;
+    }
+
+    public Double getMin() {
+        return min;
+    }
+
+    public void setMin(Double min) {
+        this.min = min;
+    }
+
+    public Double getDefaultScore() {
+        return defaultScore;
+    }
+
+    public void setDefaultScore(Double defaultScore) {
+        this.defaultScore = defaultScore;
+    }
+
+    public double[] getScoreArray() {
+        String[] values = StringUtils.split(StringUtils.trimToEmpty(scoreList), ",");
+        if (values != null && values.length > 0) {
+            List<Double> list = new ArrayList<Double>(values.length);
+            for (String value : values) {
+                try {
+                    list.add(Double.valueOf(value));
+                } catch (Exception e) {
+                    continue;
+                }
+            }
+            int length = list.size();
+            if (length > 0) {
+                double[] array = new double[length];
+                for (int i = 0; i < length; i++) {
+                    array[i] = list.get(i);
+                }
+                return array;
+            }
+        }
+        return null;
+    }
+
+    public String getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(String scoreList) {
+        this.scoreList = scoreList;
+    }
+
+    public void setScoreList(double[] scoreList) {
+        if (scoreList != null && scoreList.length > 0) {
+            List<String> list = new LinkedList<String>();
+            for (double value : scoreList) {
+                list.add(String.valueOf(value));
+            }
+            this.scoreList = StringUtils.join(list, ",");
+        }
+    }
+
+    public void setScoreList(List<Double> scoreList) {
+        if (scoreList != null && scoreList.size() > 0) {
+            List<String> list = new LinkedList<String>();
+            for (double value : scoreList) {
+                list.add(String.valueOf(value));
+            }
+            this.scoreList = StringUtils.join(list, ",");
+        }
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public List<MarkLevel> getMarkLevelList() {
+        return markLevelList;
+    }
+
+    public void setMarkLevelList(List<MarkLevel> markLevelList) {
+        this.markLevelList = markLevelList;
+    }
+
+    public Double getInterval() {
+        return interval;
+    }
+
+    public void setInterval(Double interval) {
+        this.interval = interval;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+}
+
+@Embeddable
+class MarkStepPK implements Serializable {
+
+    private static final long serialVersionUID = 4051005509820926166L;
+
+    @Column(name = "block_id")
+    private Integer blockId;
+
+    private Integer number;
+
+    public MarkStepPK() {
+
+    }
+
+    @Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((blockId == null) ? 0 : blockId.hashCode());
+        result = PRIME * result + ((number == null) ? 0 : number.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final MarkStepPK other = (MarkStepPK) obj;
+        if (blockId == null) {
+            if (other.blockId != null)
+                return false;
+        } else if (!blockId.equals(other.blockId))
+            return false;
+        if (number == null) {
+            if (other.number != null)
+                return false;
+        } else if (!number.equals(other.number))
+            return false;
+        return true;
+    }
+
+    public Integer getBlockId() {
+        return blockId;
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.blockId = blockId;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+}

+ 234 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Marker.java

@@ -0,0 +1,234 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import org.apache.commons.lang.StringUtils;
+
+import cn.com.qmth.stmms.common.annotation.ExcelField;
+
+@Entity
+@Table(name = "eb_marker")
+public class Marker implements Serializable {
+
+    public static final String LOGINNAME_SPLITE = "-";
+
+    private static final long serialVersionUID = -5728058071677581938L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    @Column(name = "subject_code")
+    private String subjectCode;
+
+    @Column(name = "login_name")
+    @ExcelField(title = "登录名", align = 2, sort = 20)
+    private String loginName;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "password")
+    @ExcelField(title = "密码", align = 2, sort = 30)
+    private String password;
+
+    @Column(name = "enable")
+    private boolean enable;
+
+    @Column(name = "common")
+    private boolean common;
+
+    @Column(name = "last_login_ip")
+    private String lastLoginIp;
+
+    @Column(name = "last_login_time")
+    private Date lastLoginTime;
+
+    @Column(name = "mode")
+    private String mode;
+
+    @Transient
+    @ExcelField(title = "科目", align = 2, sort = 10)
+    private String subjectName;
+
+    @Transient
+    private int number;
+
+    @Transient
+    private ExamSubject subject;
+
+    @Transient
+    private long markedCount;
+
+    @Transient
+    private long currentCount;
+    
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getLastLoginIp() {
+        return lastLoginIp;
+    }
+
+    public void setLastLoginIp(String lastLoginIp) {
+        this.lastLoginIp = lastLoginIp;
+    }
+
+    public Date getLastLoginTime() {
+        return lastLoginTime;
+    }
+
+    public void setLastLoginTime(Date lastLoginTime) {
+        this.lastLoginTime = lastLoginTime;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public boolean isEnable() {
+        return enable;
+    }
+
+    public void setEnable(boolean enable) {
+        this.enable = enable;
+    }
+
+    public int getNumber() {
+        return number;
+    }
+
+    public void setNumber(int number) {
+        this.number = number;
+    }
+
+    public void buildLoginName(int number) {
+        StringBuilder name = new StringBuilder();
+        name.append(examId).append(LOGINNAME_SPLITE);
+        if (!isCommon()) {
+            name.append(subjectCode).append(LOGINNAME_SPLITE);
+        }
+        name.append(number);
+        setLoginName(name.toString());
+    }
+
+    public static Marker parseLoginName(String loginName) {
+        Marker marker = null;
+        try {
+            String[] values = StringUtils.split(loginName, LOGINNAME_SPLITE);
+            marker = new Marker();
+            marker.setExamId(Integer.valueOf(values[0]));
+            if (values.length == 2) {
+                marker.setSubjectCode("");
+                marker.setNumber(Integer.valueOf(values[1]));
+            } else {
+                marker.setSubjectCode(values[1]);
+                marker.setNumber(Integer.valueOf(values[2]));
+            }
+        } catch (Exception e) {
+            marker = null;
+        }
+        return marker;
+    }
+
+    public ExamSubject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(ExamSubject subject) {
+        this.subject = subject;
+    }
+
+    public long getMarkedCount() {
+        return markedCount;
+    }
+
+    public void setMarkedCount(long markedCount) {
+        this.markedCount = markedCount;
+    }
+
+    public long getCurrentCount() {
+        return currentCount;
+    }
+
+    public void setCurrentCount(long currentCount) {
+        this.currentCount = currentCount;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public boolean isCommon() {
+        return common;
+    }
+
+    public void setCommon(boolean common) {
+        this.common = common;
+    }
+
+    public String getMode() {
+        return mode;
+    }
+
+    public void setMode(String mode) {
+        this.mode = mode;
+    }
+
+}

+ 183 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ObjectiveBlock.java

@@ -0,0 +1,183 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+@Entity
+@Table(name = "eb_objective_block")
+public class ObjectiveBlock implements Serializable {
+
+    private static final long serialVersionUID = 4755460059291973325L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    @Column(name = "subject_code")
+    private String subjectCode;
+
+    @Column(name = "number")
+    private Integer number;
+
+    @Column(name = "title")
+    private String title;
+
+    @Column(name = "question_score")
+    private Double questionScore;
+
+    @Column(name = "question_count")
+    private Integer questionCount;
+
+    @Column(name = "is_single")
+    private boolean single;
+
+    @Column(name = "option_count")
+    private Integer optionCount;
+
+    @Column(name = "miss_score")
+    private Double missScore;
+
+    @Column(name = "is_selective")
+    private boolean isSelective;
+
+    @Column(name = "select_count")
+    private Integer selectCount;
+
+    @Transient
+    private List<ObjectiveQuestion> questionList;
+
+    @Transient
+    private ExamSubject examSubject;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Integer getOptionCount() {
+        return optionCount;
+    }
+
+    public void setOptionCount(Integer optionCount) {
+        this.optionCount = optionCount;
+    }
+
+    public boolean isSelective() {
+        return isSelective;
+    }
+
+    public void setSelective(boolean isSelective) {
+        this.isSelective = isSelective;
+    }
+
+    public Integer getSelectCount() {
+        return selectCount;
+    }
+
+    public void setSelectCount(Integer selectCount) {
+        this.selectCount = selectCount;
+    }
+
+    public List<ObjectiveQuestion> getQuestionList() {
+        return questionList;
+    }
+
+    public void setQuestionList(List<ObjectiveQuestion> questionList) {
+        this.questionList = questionList;
+    }
+
+    public Double getMissScore() {
+        return missScore;
+    }
+
+    public void setMissScore(Double missScore) {
+        this.missScore = missScore;
+    }
+
+    public ExamSubject getExamSubject() {
+        return examSubject;
+    }
+
+    public void setExamSubject(ExamSubject examSubject) {
+        this.examSubject = examSubject;
+    }
+
+    public double getTotalScore() {
+        return questionScore * (isSelective ? selectCount : questionCount);
+    }
+
+    public Integer getQuestionCount() {
+        return questionCount;
+    }
+
+    public void setQuestionCount(Integer questionCount) {
+        this.questionCount = questionCount;
+    }
+
+    public Double getQuestionScore() {
+        return questionScore;
+    }
+
+    public void setQuestionScore(Double questionScore) {
+        this.questionScore = questionScore;
+    }
+
+    public void updateQuestionCount() {
+        if (this.questionList != null) {
+            this.questionCount = this.questionList.size();
+        }
+    }
+
+    public boolean isSingle() {
+        return single;
+    }
+
+    public void setSingle(boolean single) {
+        this.single = single;
+    }
+}

+ 122 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ObjectiveQuestion.java

@@ -0,0 +1,122 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "eb_objective_question")
+public class ObjectiveQuestion implements Serializable {
+
+    private static final long serialVersionUID = 3741809791151768467L;
+
+    @EmbeddedId
+    private ObjectiveQuestionPK pk;
+
+    private String title;
+
+    private String answer;
+
+    public ObjectiveQuestion() {
+        this.pk = new ObjectiveQuestionPK();
+    }
+
+    public Integer getBlockId() {
+        return pk.getBlockId();
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.pk.setBlockId(blockId);
+    }
+
+    public Integer getNumber() {
+        return pk.getNumber();
+    }
+
+    public void setNumber(Integer number) {
+        this.pk.setNumber(number);
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getAnswer() {
+        return answer;
+    }
+
+    public void setAnswer(String answer) {
+        this.answer = answer;
+    }
+
+}
+
+@Embeddable
+class ObjectiveQuestionPK implements Serializable {
+
+    private static final long serialVersionUID = 7792928307824264023L;
+
+    @Column(name = "block_id")
+    private Integer blockId;
+
+    private Integer number;
+
+    public ObjectiveQuestionPK() {
+
+    }
+
+    @Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((blockId == null) ? 0 : blockId.hashCode());
+        result = PRIME * result + ((number == null) ? 0 : number.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final ObjectiveQuestionPK other = (ObjectiveQuestionPK) obj;
+        if (blockId == null) {
+            if (other.blockId != null)
+                return false;
+        } else if (!blockId.equals(other.blockId))
+            return false;
+        if (number == null) {
+            if (other.number != null)
+                return false;
+        } else if (!number.equals(other.number))
+            return false;
+        return true;
+    }
+
+    public Integer getBlockId() {
+        return blockId;
+    }
+
+    public void setBlockId(Integer blockId) {
+        this.blockId = blockId;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+}

+ 119 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/QuestionPK.java

@@ -0,0 +1,119 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class QuestionPK implements Serializable {
+
+    private static final long serialVersionUID = -4806329348030887113L;
+
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    @Column(name = "subject_code")
+    private String subjectCode;
+
+    @Column(name = "main_number")
+    private Integer mainNumber;
+
+    @Column(name = "sub_number")
+    private Integer subNumber;
+
+    @Column(name = "is_objective")
+    private boolean objective;
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public boolean isObjective() {
+        return objective;
+    }
+
+    public void setObjective(boolean objective) {
+        this.objective = objective;
+    }
+
+    @Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((examId == null) ? 0 : examId.hashCode());
+        result = PRIME * result + ((subjectCode == null) ? 0 : subjectCode.hashCode());
+        result = PRIME * result + ((mainNumber == null) ? 0 : mainNumber.hashCode());
+        result = PRIME * result + ((subNumber == null) ? 0 : subNumber.hashCode());
+        result = PRIME * result + (objective ? 1 : 0);
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final QuestionPK other = (QuestionPK) obj;
+        if (examId == null) {
+            if (other.examId != null)
+                return false;
+        } else if (!examId.equals(other.examId))
+            return false;
+        if (subjectCode == null) {
+            if (other.subjectCode != null)
+                return false;
+        } else if (!subjectCode.equals(other.subjectCode))
+            return false;
+
+        if (mainNumber == null) {
+            if (other.mainNumber != null)
+                return false;
+        } else if (!mainNumber.equals(other.mainNumber))
+            return false;
+
+        if (subNumber == null) {
+            if (other.subNumber != null)
+                return false;
+        } else if (!subNumber.equals(other.subNumber))
+            return false;
+
+        if (objective != other.objective) {
+            return false;
+        }
+
+        return true;
+    }
+
+}

+ 143 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ScoreRate.java

@@ -0,0 +1,143 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+/**
+ * 统计得分率
+ *
+ */
+@Entity
+@Table(name = "s_score_rate")
+public class ScoreRate implements Serializable {
+
+	private static final long serialVersionUID = -4245565490416790325L;
+
+	@EmbeddedId
+    private ScoreRatePK pk;
+
+    @Column(name = "main_title")
+    private String mainTitle;
+
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    @Column(name = "avg_score")
+    private Double avgScore;
+
+    @Transient
+    private ExamSubject subject;
+    
+    @Transient
+    private double rate;
+
+    public ScoreRate() {
+        this.pk = new ScoreRatePK();
+    }
+
+    public Integer getExamId() {
+        return pk.getExamId();
+    }
+
+    public void setExamId(Integer examId) {
+        pk.setExamId(examId);
+    }
+    
+    public String getCampusName() {
+		return pk.getCampusName();
+	}
+
+	public void setCampusName(String campusName) {
+		pk.setCampusName(campusName);
+	}
+
+    public String getSubjectCode() {
+        return pk.getSubjectCode();
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        pk.setSubjectCode(subjectCode);
+    }
+
+    public Integer getMainNumber() {
+        return pk.getMainNumber();
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        pk.setMainNumber(mainNumber);
+    }
+
+    public Integer getSubNumber() {
+        return pk.getSubNumber();
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        pk.setSubNumber(subNumber);
+    }
+
+    public String getMainTitle() {
+        return mainTitle;
+    }
+
+    public void setObjective(boolean objective) {
+        pk.setObjective(objective);
+    }
+
+    public boolean isObjective() {
+        return pk.isObjective();
+    }
+
+    public void setMainTitle(String mainTitle) {
+        this.mainTitle = mainTitle;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public String getName() {
+        if (mainTitle != null && getSubNumber() != null) {
+            return mainTitle + "-" + getSubNumber();
+        } else {
+            return "";
+        }
+    }
+
+    public ExamSubject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(ExamSubject subject) {
+        this.subject = subject;
+    }
+
+    public String getQuestionNumber() {
+        return getMainNumber() + "-" + getSubNumber();
+    }
+
+	public Double getAvgScore() {
+		return avgScore;
+	}
+
+	public void setAvgScore(Double avgScore) {
+		this.avgScore = avgScore;
+	}
+
+	public double getRate() {
+		return new BigDecimal(getAvgScore()*100.00/getTotalScore()).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
+	}
+
+	public void setRate(double rate) {
+		this.rate = rate;
+	}
+
+}

+ 136 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ScoreRatePK.java

@@ -0,0 +1,136 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class ScoreRatePK implements Serializable {
+
+	private static final long serialVersionUID = -685920161409129861L;
+
+	@Column(name = "exam_id")
+    private Integer examId;
+	
+    @Column(name = "campus_name")
+    private String campusName;
+
+    @Column(name = "subject_code")
+    private String subjectCode;
+
+    @Column(name = "main_number")
+    private Integer mainNumber;
+
+    @Column(name = "sub_number")
+    private Integer subNumber;
+
+    @Column(name = "is_objective")
+    private boolean objective;
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+
+    public boolean isObjective() {
+        return objective;
+    }
+
+    public void setObjective(boolean objective) {
+        this.objective = objective;
+    }
+
+    public String getCampusName() {
+		return campusName;
+	}
+
+	public void setCampusName(String campusName) {
+		this.campusName = campusName;
+	}
+
+	@Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((examId == null) ? 0 : examId.hashCode());
+        result = PRIME * result + (campusName ==null ? 0 : campusName.hashCode());
+        result = PRIME * result + ((subjectCode == null) ? 0 : subjectCode.hashCode());
+        result = PRIME * result + ((mainNumber == null) ? 0 : mainNumber.hashCode());
+        result = PRIME * result + ((subNumber == null) ? 0 : subNumber.hashCode());
+        result = PRIME * result + (objective ? 1 : 0);
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final ScoreRatePK other = (ScoreRatePK) obj;
+        if (examId == null) {
+            if (other.examId != null)
+                return false;
+        } else if (!examId.equals(other.examId))
+            return false;
+        if (campusName == null) {
+            if (other.campusName != null)
+                return false;
+        } else if (!campusName.equals(other.campusName))
+            return false;
+        if (subjectCode == null) {
+            if (other.subjectCode != null)
+                return false;
+        } else if (!subjectCode.equals(other.subjectCode))
+            return false;
+
+        if (mainNumber == null) {
+            if (other.mainNumber != null)
+                return false;
+        } else if (!mainNumber.equals(other.mainNumber))
+            return false;
+
+        if (subNumber == null) {
+            if (other.subNumber != null)
+                return false;
+        } else if (!subNumber.equals(other.subNumber))
+            return false;
+
+        if (objective != other.objective) {
+            return false;
+        }
+
+        return true;
+    }
+
+}

+ 285 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/SubjectiveBlock.java

@@ -0,0 +1,285 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+@Entity
+@Table(name = "eb_subjective_block")
+public class SubjectiveBlock implements Serializable {
+
+    private static final long serialVersionUID = 3197160699047369929L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    @Column(name = "subject_code")
+    private String subjectCode;
+
+    @Column(name = "number")
+    private Integer number;
+
+    @Column(name = "title ")
+    private String title;
+
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    @Column(name = "mistake_value")
+    private Double mistakeValue;
+
+    @Column(name = "re_mark_percent")
+    private Double reMarkPercent;
+
+    @Column(name = "mark_self_frequency")
+    private Integer markSelfFrequency;
+
+    @Column(name = "standard_frequency")
+    private Integer standardFrequency;
+
+    @Column(name = "is_avg")
+    private boolean avg;
+
+    @Column(name = "picture_config")
+    private String pictureConfig;
+
+    @Column(name = "selective_group_id")
+    private Integer selectiveGroupId;
+
+    @Column(name = "selective_group_index")
+    private Integer selectiveGroupIndex;
+
+    @Column(name = "step_count")
+    private Integer stepCount;
+
+    @Transient
+    private Integer selectiveGroupNumber;
+
+    @Transient
+    private List<MarkStep> markStepList;
+
+    @Transient
+    private long markerCount;
+
+    @Transient
+    private long totalCount;
+
+    @Transient
+    private long markedCount;
+
+    @Transient
+    private String markedPercent;
+
+    @Transient
+    private int toDispatchedCount;
+
+    @Transient
+    private ExamSubject examSubject;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public Double getMistakeValue() {
+        return mistakeValue;
+    }
+
+    public void setMistakeValue(Double mistakeValue) {
+        this.mistakeValue = mistakeValue;
+    }
+
+    public Double getReMarkPercent() {
+        return reMarkPercent;
+    }
+
+    public void setReMarkPercent(Double reMarkPercent) {
+        this.reMarkPercent = reMarkPercent;
+    }
+
+    public Integer getMarkSelfFrequency() {
+        return markSelfFrequency;
+    }
+
+    public void setMarkSelfFrequency(Integer markSelfFrequency) {
+        this.markSelfFrequency = markSelfFrequency;
+    }
+
+    public Integer getStandardFrequency() {
+        return standardFrequency;
+    }
+
+    public void setStandardFrequency(Integer standardFrequency) {
+        this.standardFrequency = standardFrequency;
+    }
+
+    public Integer getSelectiveGroupId() {
+        return selectiveGroupId;
+    }
+
+    public void setSelectiveGroupId(Integer selectiveGroupId) {
+        this.selectiveGroupId = selectiveGroupId;
+    }
+
+    public List<MarkStep> getMarkStepList() {
+        return markStepList;
+    }
+
+    public void setMarkStepList(List<MarkStep> markStepList) {
+        this.markStepList = markStepList;
+    }
+
+    public long getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(long totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public int getToDispatchedCount() {
+        return toDispatchedCount;
+    }
+
+    public void setToDispatchedCount(int toDispatchedCount) {
+        this.toDispatchedCount = toDispatchedCount;
+    }
+
+    public Integer getSelectiveGroupNumber() {
+        return selectiveGroupNumber;
+    }
+
+    public void setSelectiveGroupNumber(Integer selectiveGroupNumber) {
+        this.selectiveGroupNumber = selectiveGroupNumber;
+    }
+
+    public Integer getSelectiveGroupIndex() {
+        return selectiveGroupIndex;
+    }
+
+    public void setSelectiveGroupIndex(Integer selectiveGroupIndex) {
+        this.selectiveGroupIndex = selectiveGroupIndex;
+    }
+
+    public String getPictureConfig() {
+        return pictureConfig;
+    }
+
+    public void setPictureConfig(String pictureConfig) {
+        this.pictureConfig = pictureConfig;
+    }
+
+    public ExamSubject getExamSubject() {
+        return examSubject;
+    }
+
+    public void setExamSubject(ExamSubject examSubject) {
+        this.examSubject = examSubject;
+    }
+
+    public void updateTotalScore() {
+        if (markStepList != null && markStepList.size() > 0) {
+            double score = 0d;
+            int count = 0;
+            for (MarkStep step : markStepList) {
+                score += step.getTotalScore();
+                count++;
+            }
+            this.totalScore = score;
+            this.stepCount = count;
+        }
+    }
+
+    public long getMarkedCount() {
+        return markedCount;
+    }
+
+    public void setMarkedCount(long markedCount) {
+        this.markedCount = markedCount;
+    }
+
+    public String getMarkedPercent() {
+        return markedPercent;
+    }
+
+    public void setMarkedPercent(String markedPercent) {
+        this.markedPercent = markedPercent;
+    }
+
+    public long getMarkerCount() {
+        return markerCount;
+    }
+
+    public void setMarkerCount(long markerCount) {
+        this.markerCount = markerCount;
+    }
+
+    public boolean isAvg() {
+        return avg;
+    }
+
+    public void setAvg(boolean avg) {
+        this.avg = avg;
+    }
+
+    public Integer getStepCount() {
+        return stepCount;
+    }
+
+    public void setStepCount(Integer stepCount) {
+        this.stepCount = stepCount;
+    }
+}

+ 38 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Tag.java

@@ -0,0 +1,38 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "b_tag")
+public class Tag implements Serializable {
+
+    private static final long serialVersionUID = -8796053015319816326L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    private String name;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+}

+ 37 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamPackageSearchQuery.java

@@ -0,0 +1,37 @@
+package cn.com.qmth.stmms.biz.exam.query;
+
+import cn.com.qmth.stmms.biz.common.BaseQuery;
+import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
+
+public class ExamPackageSearchQuery extends BaseQuery<ExamPackage> {
+
+    private int examId;
+
+    private String code;
+
+    private Boolean upload;
+
+    public int getExamId() {
+        return examId;
+    }
+
+    public void setExamId(int examId) {
+        this.examId = examId;
+    }
+
+    public Boolean getUpload() {
+        return upload;
+    }
+
+    public void setUpload(Boolean upload) {
+        this.upload = upload;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+}

+ 82 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamSearchQuery.java

@@ -0,0 +1,82 @@
+package cn.com.qmth.stmms.biz.exam.query;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import cn.com.qmth.stmms.biz.common.BaseQuery;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+
+public class ExamSearchQuery extends BaseQuery<Exam> {
+
+    private String name;
+
+    private Integer creatorId;
+
+    private Integer schoolId;
+
+    private Set<ExamStatus> statusSet;
+
+    private Set<Integer> ids;
+
+    private Boolean orderByCreateTimeDesc;
+
+    public Integer getCreatorId() {
+        return creatorId;
+    }
+
+    public void setCreatorId(Integer creatorId) {
+        this.creatorId = creatorId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Set<ExamStatus> getStatusSet() {
+        return statusSet;
+    }
+
+    public void addStatus(ExamStatus status) {
+        if (statusSet == null) {
+            statusSet = new HashSet<ExamStatus>();
+        }
+        if (status != null) {
+            statusSet.add(status);
+        }
+    }
+
+    public Set<Integer> getIds() {
+        return ids;
+    }
+
+    public void addId(Integer id) {
+        if (ids == null) {
+            ids = new HashSet<Integer>();
+        }
+        if (id != null) {
+            ids.add(id);
+        }
+    }
+
+    public Boolean getOrderByCreateTimeDesc() {
+        return orderByCreateTimeDesc;
+    }
+
+    public void setOrderByCreateTimeDesc(Boolean orderByCreateTimeDesc) {
+        this.orderByCreateTimeDesc = orderByCreateTimeDesc;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+
+}

+ 255 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamStudentSearchQuery.java

@@ -0,0 +1,255 @@
+package cn.com.qmth.stmms.biz.exam.query;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+
+import cn.com.qmth.stmms.biz.common.BaseQuery;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+
+public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
+
+    private Integer examId;
+
+    private String campusName;
+
+    private String name;
+
+    private String examNumber;
+
+    private String examNumberIn;
+
+    private String studentCode;
+
+    private String subjectCode;
+
+    private String batchCode;
+
+    private String packageCode;
+
+    private String subjectLevel;
+
+    private String subjectCategory;
+
+    private Double objectiveScore;
+
+    private Double objectiveScoreGt;
+
+    private Double objectiveScoreLt;
+
+    private Double subjectiveScore;
+
+    private Double subjectiveScoreGt;
+
+    private Double subjectiveScoreLt;
+
+    private Boolean upload;
+
+    private Boolean absent;
+
+    private Boolean exception;
+
+    private String campusNameIn;
+
+    private String subjectCodeIn;
+
+    private String campusNameNotIn;
+
+    private String subjectCodeNotIn;
+
+    public void orderByExamNumber() {
+        setSort(new Sort(Direction.ASC, "examNumber"));
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public Boolean getUpload() {
+        return upload;
+    }
+
+    public void setUpload(Boolean upload) {
+        this.upload = upload;
+    }
+
+    public Boolean getAbsent() {
+        return absent;
+    }
+
+    public void setAbsent(Boolean absent) {
+        this.absent = absent;
+    }
+
+    public String getCampusName() {
+        return campusName;
+    }
+
+    public void setCampusName(String campusName) {
+        this.campusName = campusName;
+    }
+
+    public String getBatchCode() {
+        return batchCode;
+    }
+
+    public void setBatchCode(String batchCode) {
+        this.batchCode = batchCode;
+    }
+
+    public String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+
+    public Boolean getException() {
+        return exception;
+    }
+
+    public void setException(Boolean exception) {
+        this.exception = exception;
+    }
+
+    public Double getObjectiveScore() {
+        return objectiveScore;
+    }
+
+    public void setObjectiveScore(Double objectiveScore) {
+        this.objectiveScore = objectiveScore;
+    }
+
+    public Double getObjectiveScoreGt() {
+        return objectiveScoreGt;
+    }
+
+    public void setObjectiveScoreGt(Double objectiveScoreGt) {
+        this.objectiveScoreGt = objectiveScoreGt;
+    }
+
+    public Double getSubjectiveScore() {
+        return subjectiveScore;
+    }
+
+    public void setSubjectiveScore(Double subjectiveScore) {
+        this.subjectiveScore = subjectiveScore;
+    }
+
+    public Double getSubjectiveScoreGt() {
+        return subjectiveScoreGt;
+    }
+
+    public void setSubjectiveScoreGt(Double subjectiveScoreGt) {
+        this.subjectiveScoreGt = subjectiveScoreGt;
+    }
+
+    public String getSubjectLevel() {
+        return subjectLevel;
+    }
+
+    public void setSubjectLevel(String subjectLevel) {
+        this.subjectLevel = subjectLevel;
+    }
+
+    public String getSubjectCategory() {
+        return subjectCategory;
+    }
+
+    public void setSubjectCategory(String subjectCategory) {
+        this.subjectCategory = subjectCategory;
+    }
+
+    public Double getObjectiveScoreLt() {
+        return objectiveScoreLt;
+    }
+
+    public void setObjectiveScoreLt(Double objectiveScoreLt) {
+        this.objectiveScoreLt = objectiveScoreLt;
+    }
+
+    public Double getSubjectiveScoreLt() {
+        return subjectiveScoreLt;
+    }
+
+    public void setSubjectiveScoreLt(Double subjectiveScoreLt) {
+        this.subjectiveScoreLt = subjectiveScoreLt;
+    }
+
+    public String getCampusNameIn() {
+        return campusNameIn;
+    }
+
+    public void setCampusNameIn(String campusNameIn) {
+        this.campusNameIn = campusNameIn;
+    }
+
+    public String getSubjectCodeIn() {
+        return subjectCodeIn;
+    }
+
+    public void setSubjectCodeIn(String subjectCodeIn) {
+        this.subjectCodeIn = subjectCodeIn;
+    }
+
+    public String getCampusNameNotIn() {
+        return campusNameNotIn;
+    }
+
+    public void setCampusNameNotIn(String campusNamesNotIn) {
+        this.campusNameNotIn = campusNamesNotIn;
+    }
+
+    public String getSubjectCodeNotIn() {
+        return subjectCodeNotIn;
+    }
+
+    public void setSubjectCodeNotIn(String subjectCodesNotIn) {
+        this.subjectCodeNotIn = subjectCodesNotIn;
+    }
+
+    public String getExamNumberIn() {
+        return examNumberIn;
+    }
+
+    public void setExamNumberIn(String examNumberIn) {
+        this.examNumberIn = examNumberIn;
+    }
+
+}

+ 49 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/MarkerSearchQuery.java

@@ -0,0 +1,49 @@
+package cn.com.qmth.stmms.biz.exam.query;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+
+import cn.com.qmth.stmms.biz.common.BaseQuery;
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+
+public class MarkerSearchQuery extends BaseQuery<Marker> {
+
+    private int examId;
+
+    private String subjectCode;
+
+    private String loginName;
+
+    public void orderByLoginName() {
+        setSort(new Sort(Direction.ASC, "loginName"));
+    }
+
+    public void orderById() {
+        setSort(new Sort(Direction.ASC, "id"));
+    }
+
+    public int getExamId() {
+        return examId;
+    }
+
+    public void setExamId(int examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+}

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff