haogh 11 kuukautta sitten
vanhempi
commit
229bf7d65b
100 muutettua tiedostoa jossa 26752 lisäystä ja 0 poistoa
  1. 24 0
      ses-enrol/pom.xml
  2. 228 0
      ses-enrol/src/main/java/cn/hmsoft/helper/LogHelper.java
  3. 17 0
      ses-enrol/src/main/java/cn/hmsoft/ses/AppMain.java
  4. 709 0
      ses-enrol/src/main/java/cn/hmsoft/ses/common/AppConfig.java
  5. 186 0
      ses-enrol/src/main/java/cn/hmsoft/ses/common/MkConst.java
  6. 134 0
      ses-enrol/src/main/java/cn/hmsoft/ses/common/OperateLogAspect.java
  7. 196 0
      ses-enrol/src/main/java/cn/hmsoft/ses/common/StdConst.java
  8. 613 0
      ses-enrol/src/main/java/cn/hmsoft/ses/constants/ByConst.java
  9. 153 0
      ses-enrol/src/main/java/cn/hmsoft/ses/constants/CfConst.java
  10. 234 0
      ses-enrol/src/main/java/cn/hmsoft/ses/constants/CourseConst.java
  11. 19 0
      ses-enrol/src/main/java/cn/hmsoft/ses/constants/EnrolSessionName.java
  12. 24 0
      ses-enrol/src/main/java/cn/hmsoft/ses/constants/EnrolType.java
  13. 85 0
      ses-enrol/src/main/java/cn/hmsoft/ses/constants/KjConst.java
  14. 95 0
      ses-enrol/src/main/java/cn/hmsoft/ses/constants/LogConst.java
  15. 49 0
      ses-enrol/src/main/java/cn/hmsoft/ses/constants/OrgConst.java
  16. 258 0
      ses-enrol/src/main/java/cn/hmsoft/ses/constants/StdConst.java
  17. 102 0
      ses-enrol/src/main/java/cn/hmsoft/ses/constants/SysConst.java
  18. 18 0
      ses-enrol/src/main/java/cn/hmsoft/ses/constants/SysConst2.java
  19. 28 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/app/AppUpdate.java
  20. 67 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByApplyAuditControl.java
  21. 1913 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByApplyControl.java
  22. 358 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByCertificateControl.java
  23. 288 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByCourseReplRecordControl.java
  24. 66 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByPaperApplyAuditControl.java
  25. 582 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByPaperApplyControl.java
  26. 208 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByTurnInApplyControl.java
  27. 72 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByTurnInScoreControl.java
  28. 505 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByTurnOutApplyControl.java
  29. 78 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/cf/CfOrganizationControl.java
  30. 1102 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/AtgBizIfaceService.java
  31. 174 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/AtgBizIfaceThread.java
  32. 571 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/ByTurnInApplyIfaceService.java
  33. 250 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/ByTurnOutApplyIfaceService.java
  34. 339 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/CallbackAtgBizAffairReceiveRequest.java
  35. 243 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/MkCertEduApplyIfaceService.java
  36. 194 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/MkCertNeduApplyIfaceService.java
  37. 334 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/kj/KjUnifiedScoreDetailControl.java
  38. 67 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertCourseControl.java
  39. 410 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertEduApplyControl.java
  40. 62 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertMajorCourseControl.java
  41. 295 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertNeduApplyControl.java
  42. 75 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertNeduApplyCourseControl.java
  43. 62 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertTimeConfigControl.java
  44. 80 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertTypeControl.java
  45. 203 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkPreEduApplyControl.java
  46. 148 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/pay/PayBillUnionControl.java
  47. 420 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/pay/PayInvoicingControl.java
  48. 62 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/pay/PayNoticeUnionControl.java
  49. 73 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/pl/PlCountryMajorControl.java
  50. 65 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/pl/PlExamAreaCourseControl.java
  51. 132 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/pl/PlExamTimeControl.java
  52. 180 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/pl/PlMajorControl.java
  53. 53 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/pl/PlMajorCourseControl.java
  54. 191 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/service/InterfaceControl.java
  55. 145 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdAppFeedbackControl.java
  56. 73 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdBreakDisciplineControl.java
  57. 62 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdBreakDisciplineItemControl.java
  58. 62 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdBreakDisciplineRuleControl.java
  59. 2070 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdEnrolControl.java
  60. 1219 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdInfoModifyApplyControl.java
  61. 74 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdMajorControl.java
  62. 312 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdQueryControl.java
  63. 350 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdRefundControl.java
  64. 4887 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdRegInfoControl.java
  65. 60 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdRegInfoLogControl.java
  66. 72 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdScoreControl.java
  67. 120 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdScoreReviewControl.java
  68. 77 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdScoreReviewCourseControl.java
  69. 725 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdScoreReviewPayControl.java
  70. 92 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/sys/SysAppNewsControl.java
  71. 715 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/util/FrameIdCardUtil.java
  72. 151 0
      ses-enrol/src/main/java/cn/hmsoft/ses/control/util/ImgUploadConttrol.java
  73. 48 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByApplyAuditDao.java
  74. 159 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByApplyDao.java
  75. 60 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByBlackListDao.java
  76. 61 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByCertificateDao.java
  77. 87 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByCourseReplDetailDao.java
  78. 100 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByCourseReplRecordDao.java
  79. 46 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByCourseReplRuleDao.java
  80. 77 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByDiaplmaDao.java
  81. 49 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByPaperApplyAuditDao.java
  82. 163 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByPaperApplyDao.java
  83. 49 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByPaperDao.java
  84. 307 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByScoreDao.java
  85. 58 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTimeConfigDao.java
  86. 89 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTurnInApplyDao.java
  87. 67 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTurnInScoreDao.java
  88. 131 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTurnOutApplyDao.java
  89. 40 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTurnOutScoreDao.java
  90. 45 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTurnTimeConfigDao.java
  91. 84 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTurnTimePlaceDao.java
  92. 38 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByXueXinDao.java
  93. 32 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByXueXinLogDao.java
  94. 249 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/PaperScoreDao.java
  95. 42 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/cf/CfCityDao.java
  96. 40 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/cf/CfFeeScaleDao.java
  97. 71 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/cf/CfOperateTimeDao.java
  98. 49 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/cf/CfOrganizationDao.java
  99. 91 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/gxzk/CjJigechengjiOldDao.java
  100. 60 0
      ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/kj/KjByInputScoreDao.java

+ 24 - 0
ses-enrol/pom.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>cn.hmsoft</groupId>
+    <artifactId>ses.parent</artifactId>
+    <version>1.0</version>
+  </parent>
+  <artifactId>ses-enrol-v1</artifactId>
+  <packaging>war</packaging>
+  <name>ses-enrol-v1</name>
+  <url>http://maven.apache.org</url>
+  <dependencies>
+    <dependency>
+      <groupId>cn.hmsoft</groupId>
+      <artifactId>ses-model-v1</artifactId>
+      <version>1.0</version>
+    </dependency>    
+  </dependencies>
+  <build>
+    <finalName>ses-enrol-v1</finalName>
+  </build>
+</project>

+ 228 - 0
ses-enrol/src/main/java/cn/hmsoft/helper/LogHelper.java

@@ -0,0 +1,228 @@
+package cn.hmsoft.helper;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.appender.ConsoleAppender;
+import org.apache.logging.log4j.core.config.ConfigurationSource;
+import org.apache.logging.log4j.core.config.Configurator;
+import org.apache.logging.log4j.core.config.builder.api.AppenderComponentBuilder;
+import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
+import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
+import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
+
+
+/*************************
+ * 日志辅助工具,使用Log4j2
+ * @author zxq
+ * @create 2018-04-07 20:55:19
+ * @version 5.0.0
+ * @email: revisit@126.com
+ * @Company: www.hmsoft.cn
+ */
+public class LogHelper {
+	private static Logger logger = null;
+	
+	public static Logger hisomeLogger = null;
+
+	public static LogType LOGTYPE = LogType.Default;
+
+	public enum LogLevel {
+		Trace, Debug, Info, Error, Warn
+	}
+
+	public enum LogType {
+		Default("Auto"), Custom("Custom");
+
+		private String text;
+
+		LogType(String text) {
+			this.text = text;
+		}
+
+		@Override
+		public String toString() {
+			return this.text;
+		}
+	}
+
+	public static void info(Object message) {
+		log(message, LogLevel.Info);
+	}
+
+	public static void warn(Object message) {
+		log(message, LogLevel.Warn);
+	}
+
+	public static void trace(Object message) {
+		log(message, LogLevel.Trace);
+	}
+
+	public static void debug(Object message) {
+		log(message, LogLevel.Debug);
+	}
+
+	public static void log(Object message) {
+		log(message, LogLevel.Info);
+	}
+
+	public static void error(String message) {
+		log(message, LogLevel.Error);
+	}
+
+	public static void error(String message, Throwable e) {
+		log(message, LogLevel.Error);
+		logger.error(e);
+	}
+
+	public static void error(Throwable e) {
+		logger.error(e.getMessage(), e);
+	}
+
+	public static void log(Object message, LogLevel logLevel) {
+		if (logLevel == LogLevel.Trace)
+			logger.trace(message);
+		else if (logLevel == LogLevel.Debug)
+			logger.debug(message);
+		else if (logLevel == LogLevel.Info)
+			logger.info(message);
+		else if (logLevel == LogLevel.Error)
+			logger.error(message);
+		else if (logLevel == LogLevel.Warn)
+			logger.warn(message);
+	}
+
+	static {
+		loadConfig();
+		logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
+		hisomeLogger = LogManager.getLogger("HisomeLog");
+
+	}
+
+	/**********************************
+	 * 自动加载log4j的配置文件
+	 */
+	private final static void loadConfig() {
+		// 先判断是否存在log4j文件
+		try {
+			String path = new File("").getAbsolutePath() + File.separator
+					+ "log4j2.xml";
+			// System.out.println(path);
+			File file = new File(path);
+			// 存在log4j,系统自动加载,不主动加载
+			if (file.exists()) {
+				LOGTYPE = LogType.Custom;
+				ConfigurationSource source = null;
+				try {
+					// 方法1 使用 public ConfigurationSource(InputStream stream)
+					// throws IOException 构造函数
+					source = new ConfigurationSource(new FileInputStream(path));
+					Configurator.initialize(null, source);
+				} catch (Exception e) {
+
+				}
+				if (source != null)
+					return;
+			}
+			// 初始化Log容器
+			ConfigurationBuilder<BuiltConfiguration> builder = ConfigurationBuilderFactory
+					.newConfigurationBuilder();
+
+			builder.setStatusLevel(Level.INFO);
+			builder.setConfigurationName("HmsoftLog");
+
+			// 添加标准输出
+			AppenderComponentBuilder appenderBuilder = builder.newAppender(
+					"Stdout", "CONSOLE").addAttribute("target",
+					ConsoleAppender.Target.SYSTEM_OUT);
+			appenderBuilder.add(builder.newLayout("PatternLayout")
+					.addAttribute("pattern", "%d %-5p %m%n"));
+			// appenderBuilder.add(builder.newFilter("RegexFilter", Result.DENY,
+			// Result.ACCEPT).addAttribute("regex", "*Log4j*"));
+			builder.add(appenderBuilder);
+
+			// 所有Info的消息输出定义,每天一个文件
+			appenderBuilder = builder
+					.newAppender("infoLog", "RollingFile")
+					.addAttribute("fileName", "../logs/log.log")
+					.addAttribute("filePattern",
+							"../logs/log_%d{yyyy-MM-dd}_%i.log");
+			// appenderBuilder = builder.newAppender("infoLog",
+			// "File").addAttribute("fileName",
+			// ".../logs/log.log").addAttribute("append", "true");
+			appenderBuilder.add(builder.newLayout("PatternLayout")
+					.addAttribute("pattern", "%d %-5p %m%n"));
+			appenderBuilder.addComponent(builder
+					.newComponent("TimeBasedTriggeringPolicy")
+					.addAttribute("interval", "24")
+					.addAttribute("modulate", "true"));
+			builder.add(appenderBuilder);
+			// ClassLoaderContextSelector
+			// 所有Error消息输出的路径,每天一个文件
+			appenderBuilder = builder
+					.newAppender("errorLog", "RollingFile")
+					.addAttribute("fileName", "../logs/error.log")
+					.addAttribute("filePattern",
+							"../logs/error_%d{yyyy-MM-dd}_%i.log");
+			// appenderBuilder = builder.newAppender("infoLog",
+			// "File").addAttribute("fileName",
+			// ".../logs/log.log").addAttribute("append", "true");
+			appenderBuilder.add(builder.newLayout("PatternLayout")
+					.addAttribute("pattern", "%d %-5p %m%n"));
+			appenderBuilder.addComponent(builder
+					.newComponent("TimeBasedTriggeringPolicy")
+					.addAttribute("interval", "24")
+					.addAttribute("modulate", "true"));
+			builder.add(appenderBuilder);
+			
+			// 所有HisomeInfo的消息输出定义,每天一个文件
+			appenderBuilder = builder.newAppender("HisomeInfoLog", "RollingFile")
+					.addAttribute("fileName", "../logs/hisome/enrol_log.log")
+					.addAttribute("filePattern", "../logs/hisome/enrol_log_%d{yyyy-MM-dd}_%i.log");
+			appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern",
+					"%d{yyyy-MM-dd HH:mm:ss.SSS}|%X{ip}|%T|%-5p|%C{1}.%M:%L - %m%n"));
+			appenderBuilder.addComponent(builder.newComponent("TimeBasedTriggeringPolicy")
+					.addAttribute("interval", "24").addAttribute("modulate", "true"));
+			builder.add(appenderBuilder);
+			// 所有HisomeError消息输出的路径,每天一个文件
+			appenderBuilder = builder.newAppender("HisomeErrorLog", "RollingFile")
+					.addAttribute("fileName", "../logs/hisome/enrol_error.log")
+					.addAttribute("filePattern", "../logs/hisome/enrol_error_%d{yyyy-MM-dd}_%i.log");
+			appenderBuilder.add(builder.newLayout("PatternLayout").addAttribute("pattern",
+					"%d{yyyy-MM-dd HH:mm:ss.SSS}|%X{ip}|%T|%-5p|%C{1}.%M:%L - %m%n"));
+			appenderBuilder.addComponent(builder.newComponent("TimeBasedTriggeringPolicy")
+					.addAttribute("interval", "24").addAttribute("modulate", "true"));
+			builder.add(appenderBuilder);
+
+			builder.add(builder
+					.newRootLogger(Level.DEBUG)
+					.add(builder.newAppenderRef("Stdout").addAttribute("level",
+							"debug"))
+					.add(builder.newAppenderRef("infoLog").addAttribute(
+							"level", "info"))
+					.add(builder.newAppenderRef("errorLog").addAttribute(
+							"level", "error")));
+			builder.add(builder.newLogger("HisomeLog",Level.INFO).addAttribute("additivity", false)
+					//消息不打印到控制台
+					//.add(builder.newAppenderRef("Stdout").addAttribute("level","debug"))
+					.add(builder.newAppenderRef("HisomeInfoLog").addAttribute("level", "info"))
+					.add(builder.newAppenderRef("HisomeErrorLog").addAttribute("level", "error")));
+
+			builder.add(builder.newLogger("org.springframework", Level.ERROR));
+			builder.add(builder.newLogger("org.apache.logging.log4j",
+					Level.ERROR));
+			builder.add(builder.newLogger("org.quartz", Level.ERROR));
+
+			builder.add(builder.newLogger("com.mchange.v2", Level.ERROR));
+
+			// Interpolator
+			Configurator.initialize(builder.build());
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}

+ 17 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/AppMain.java

@@ -0,0 +1,17 @@
+package cn.hmsoft.ses;
+
+import cn.hmsoft.helper.SecureHelper;
+
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.UUID;
+
+public class AppMain {
+
+    public static void main(String[] args) {
+        String uuid= UUID.randomUUID().toString();
+        String std_id="123456";
+        String token= SecureHelper.des3Encrypt(std_id+ "@"+uuid+ "@"+ LocalDateTime.now().plusDays(30).toInstant(ZoneOffset.of("+8")).toEpochMilli(), SecureHelper.getSecureKey(uuid));
+        System.out.println(token+","+uuid+","+std_id);
+    }
+}

+ 709 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/common/AppConfig.java

@@ -0,0 +1,709 @@
+package cn.hmsoft.ses.common;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+/**
+ * 系统配置常量类.
+ *
+ * @author zhanqiang
+ */
+@Configuration
+@PropertySource(
+        value = {
+                "classpath:config.properties"
+        },
+        ignoreResourceNotFound = true
+)
+public class AppConfig {
+
+    @Value("${upload.base}")
+    private String uploadBase;
+    @Value("${upload.server.url}")
+    private String uploadServerUrl;
+    /**
+     * 省份编码
+     */
+    @Value("${province.code}")
+    private String provinceCode;
+
+    public String getUploadBase() {
+        return uploadBase;
+    }
+
+    public void setUploadBase(String uploadBase) {
+        this.uploadBase = uploadBase;
+    }
+
+    public String getUploadServerUrl() {
+        return uploadServerUrl;
+    }
+
+    public void setUploadServerUrl(String uploadServerUrl) {
+        this.uploadServerUrl = uploadServerUrl;
+    }
+
+    public String getProvinceCode() {
+        return provinceCode;
+    }
+
+    public void setProvinceCode(String provinceCode) {
+        this.provinceCode = provinceCode;
+    }
+
+
+    //支付平台 参数 start
+    @Value("${pay_union_systemName}")
+    private String pay_union_systemName;
+
+    @Value("${pay_union_prvKey}")
+    private String pay_union_prvKey;
+
+    @Value("${pay_union_getQrCode}")
+    private String pay_union_getQrCode;
+
+    @Value("${pay_union_queryOrder}")
+    private String pay_union_queryOrder;
+
+    @Value("${pay_union_notifyUrl}")
+    private String pay_union_notifyUrl;
+
+    @Value("${pay_union_unionPay_url}")
+    private String pay_union_unionPay_url;
+    @Value("${pay_union_getAppPay}")
+    private String pay_union_getAppPay;
+	@Value("${pay_subappid}")
+	private String pay_subappid;
+    //支付平台 参数 end
+	
+
+    public String getPay_union_systemName() {
+        return pay_union_systemName;
+    }
+
+    public String getPay_union_getAppPay() {
+		return pay_union_getAppPay;
+	}
+
+	public void setPay_union_getAppPay(String pay_union_getAppPay) {
+		this.pay_union_getAppPay = pay_union_getAppPay;
+	}
+
+	public String getPay_subappid() {
+		return pay_subappid;
+	}
+
+	public void setPay_subappid(String pay_subappid) {
+		this.pay_subappid = pay_subappid;
+	}
+
+	public void setPay_union_systemName(String pay_union_systemName) {
+        this.pay_union_systemName = pay_union_systemName;
+    }
+
+    public String getPay_union_prvKey() {
+        return pay_union_prvKey;
+    }
+
+    public void setPay_union_prvKey(String pay_union_prvKey) {
+        this.pay_union_prvKey = pay_union_prvKey;
+    }
+
+    public String getPay_union_getQrCode() {
+        return pay_union_getQrCode;
+    }
+
+    public void setPay_union_getQrCode(String pay_union_getQrCode) {
+        this.pay_union_getQrCode = pay_union_getQrCode;
+    }
+
+    public String getPay_union_queryOrder() {
+        return pay_union_queryOrder;
+    }
+
+    public void setPay_union_queryOrder(String pay_union_queryOrder) {
+        this.pay_union_queryOrder = pay_union_queryOrder;
+    }
+
+    public String getPay_union_notifyUrl() {
+        return pay_union_notifyUrl;
+    }
+
+    public void setPay_union_notifyUrl(String pay_union_notifyUrl) {
+        this.pay_union_notifyUrl = pay_union_notifyUrl;
+    }
+
+    public String getPay_union_unionPay_url() {
+        return pay_union_unionPay_url;
+    }
+
+    public void setPay_union_unionPay_url(String pay_union_unionPay_url) {
+        this.pay_union_unionPay_url = pay_union_unionPay_url;
+    }
+
+    @Value("${udmp_username}")
+    private String udmp_username;
+    @Value("${udmp_userpassword}")
+    private String udmp_userpassword;
+
+    @Value("${udmp_getinfo_url}")
+    private String udmp_getinfo_url;
+    @Value("${udmp_reportstatus_url}")
+    private String udmp_reportstatus_url;
+    @Value("${udmp_reportstatusend_url}")
+    private String udmp_reportstatusend_url;
+
+    public String getUdmp_username() {
+        return udmp_username;
+    }
+
+    public void setUdmp_username(String udmp_username) {
+        this.udmp_username = udmp_username;
+    }
+
+    public String getUdmp_userpassword() {
+        return udmp_userpassword;
+    }
+
+    public void setUdmp_userpassword(String udmp_userpassword) {
+        this.udmp_userpassword = udmp_userpassword;
+    }
+
+    public String getUdmp_getinfo_url() {
+        return udmp_getinfo_url;
+    }
+
+    public void setUdmp_getinfo_url(String udmp_getinfo_url) {
+        this.udmp_getinfo_url = udmp_getinfo_url;
+    }
+
+    public String getUdmp_reportstatus_url() {
+        return udmp_reportstatus_url;
+    }
+
+    public void setUdmp_reportstatus_url(String udmp_reportstatus_url) {
+        this.udmp_reportstatus_url = udmp_reportstatus_url;
+    }
+
+    public String getUdmp_reportstatusend_url() {
+        return udmp_reportstatusend_url;
+    }
+
+    public void setUdmp_reportstatusend_url(String udmp_reportstatusend_url) {
+        this.udmp_reportstatusend_url = udmp_reportstatusend_url;
+    }
+
+    @Value("${zw_sxbm_turnin}")
+    private String zw_sxbm_turnin;
+    @Value("${zw_sxbm_turnout}")
+    private String zw_sxbm_turnout;
+    @Value("${zw_sxbm_edu}")
+    private String zw_sxbm_edu;
+    @Value("${zw_sxbm_nedu}")
+    private String zw_sxbm_nedu;
+
+    public String getZw_sxbm_turnin() {
+        return zw_sxbm_turnin;
+    }
+
+    public void setZw_sxbm_turnin(String zw_sxbm_turnin) {
+        this.zw_sxbm_turnin = zw_sxbm_turnin;
+    }
+
+    public String getZw_sxbm_turnout() {
+        return zw_sxbm_turnout;
+    }
+
+    public void setZw_sxbm_turnout(String zw_sxbm_turnout) {
+        this.zw_sxbm_turnout = zw_sxbm_turnout;
+    }
+
+    public String getZw_sxbm_edu() {
+        return zw_sxbm_edu;
+    }
+
+    public void setZw_sxbm_edu(String zw_sxbm_edu) {
+        this.zw_sxbm_edu = zw_sxbm_edu;
+    }
+
+    public String getZw_sxbm_nedu() {
+        return zw_sxbm_nedu;
+    }
+
+    public void setZw_sxbm_nedu(String zw_sxbm_nedu) {
+        this.zw_sxbm_nedu = zw_sxbm_nedu;
+    }
+
+    @Value("${verifycertificate_url}")
+    private String verifyCertificate_url;
+
+    @Value("${ocr_ip}")
+    private String ocr_ip;
+    @Value("${identify_card_url}")
+    private String identify_card_url;
+
+    @Value("${sms_send_url}")
+    private String sms_send_url;
+
+    @Value("${sms_system_code}")
+    private String sms_system_code;
+
+    @Value("${email_send_host}")
+    private String email_send_host;
+
+    @Value("${email_send_port}")
+    private String email_send_port;
+
+    @Value("${email_send_ssl}")
+    private String email_send_ssl;
+    
+    @Value("${email_send_tls}")
+    private String email_send_tls;
+
+    @Value("${email_send_user}")
+    private String email_send_user;
+
+    @Value("${email_send_password}")
+    private String email_send_password;
+
+    @Value("${identify_url}")
+    private String identify_url;
+    @Value("${identify_udmpuserpassword}")
+    private String identify_udmpuserpassword;
+    @Value("${identify_udmpusername}")
+    private String identify_udmpusername;
+
+
+    /**
+     * 考生照片恒生文件服务器域名路径
+     */
+    @Value("${photo_http}")
+    private String photoHttp;
+
+    /**
+     * 考生照片恒生文件服务器IP路径
+     */
+    @Value("${photo_ip}")
+    private String photoIp;
+
+    /**
+     * 考生照片是否读取恒生文件服务器
+     */
+    @Value("${is_remote_photo}")
+    private String isRemotePhoto;
+
+    @Value("${xcdfsclient_url}")
+    private String xcdfsclientUrl;
+    @Value("${xcdfsclient_channel}")
+    private String xcdfsclientChannel;
+    @Value("${xcdfsclient_appId}")
+    private String xcdfsclientAppId;
+    @Value("${xcdfsclient_secret}")
+    private String xcdfsclientSecret;
+
+    @Value("${invoicing.url}")
+    private String invoicing_url;
+    @Value("${invoicing.viewPath}")
+    private String invoicing_viewPath;
+    @Value("${invoicing.handlingPerson}")
+    private String invoicing_handlingPerson;
+    
+    
+    @Value("${xuexin_url}")
+    private String xuexin_url;
+    
+    @Value("${xuexin_xlQrcode_url}")
+    private String xuexin_xlQrcode_url;
+    
+    @Value("${xuexin_xjQrcode_url}")
+    private String xuexin_xjQrcode_url;
+    
+    @Value("${atg_appid}")
+	private String atg_appid;
+	@Value("${atg_gatewayUrl}")
+	private String atg_gatewayUrl;
+	@Value("${atg_keyId}")
+	private String atg_keyId;
+	@Value("${atg_secretKey}")
+	private String atg_secretKey;
+    
+
+    public String getXuexin_xjQrcode_url() {
+		return xuexin_xjQrcode_url;
+	}
+
+	public void setXuexin_xjQrcode_url(String xuexin_xjQrcode_url) {
+		this.xuexin_xjQrcode_url = xuexin_xjQrcode_url;
+	}
+
+	public String getAtg_appid() {
+		return atg_appid;
+	}
+
+	public void setAtg_appid(String atg_appid) {
+		this.atg_appid = atg_appid;
+	}
+
+	public String getAtg_gatewayUrl() {
+		return atg_gatewayUrl;
+	}
+
+	public void setAtg_gatewayUrl(String atg_gatewayUrl) {
+		this.atg_gatewayUrl = atg_gatewayUrl;
+	}
+
+	public String getAtg_keyId() {
+		return atg_keyId;
+	}
+
+	public void setAtg_keyId(String atg_keyId) {
+		this.atg_keyId = atg_keyId;
+	}
+
+	public String getAtg_secretKey() {
+		return atg_secretKey;
+	}
+
+	public void setAtg_secretKey(String atg_secretKey) {
+		this.atg_secretKey = atg_secretKey;
+	}
+
+	public String getXuexin_xlQrcode_url() {
+		return xuexin_xlQrcode_url;
+	}
+
+	public void setXuexin_xlQrcode_url(String xuexin_xlQrcode_url) {
+		this.xuexin_xlQrcode_url = xuexin_xlQrcode_url;
+	}
+
+	public String getXuexin_url() {
+		return xuexin_url;
+	}
+
+	public void setXuexin_url(String xuexin_url) {
+		this.xuexin_url = xuexin_url;
+	}
+
+	public String getInvoicing_viewPath() {
+        return invoicing_viewPath;
+    }
+
+    public void setInvoicing_viewPath(String invoicing_viewPath) {
+        this.invoicing_viewPath = invoicing_viewPath;
+    }
+
+    public String getInvoicing_handlingPerson() {
+        return invoicing_handlingPerson;
+    }
+
+    public void setInvoicing_handlingPerson(String invoicing_handlingPerson) {
+        this.invoicing_handlingPerson = invoicing_handlingPerson;
+    }
+
+    public String getInvoicing_url() {
+        return invoicing_url;
+    }
+
+    public void setInvoicing_url(String invoicing_url) {
+        this.invoicing_url = invoicing_url;
+    }
+
+    public String getVerifyCertificate_url() {
+        return verifyCertificate_url;
+    }
+
+    public void setVerifyCertificate_url(String verifyCertificate_url) {
+        this.verifyCertificate_url = verifyCertificate_url;
+    }
+
+    public String getXcdfsclientUrl() {
+        return xcdfsclientUrl;
+    }
+
+    public void setXcdfsclientUrl(String xcdfsclientUrl) {
+        this.xcdfsclientUrl = xcdfsclientUrl;
+    }
+
+    public String getXcdfsclientChannel() {
+        return xcdfsclientChannel;
+    }
+
+    public void setXcdfsclientChannel(String xcdfsclientChannel) {
+        this.xcdfsclientChannel = xcdfsclientChannel;
+    }
+
+    public String getXcdfsclientAppId() {
+        return xcdfsclientAppId;
+    }
+
+    public void setXcdfsclientAppId(String xcdfsclientAppId) {
+        this.xcdfsclientAppId = xcdfsclientAppId;
+    }
+
+    public String getXcdfsclientSecret() {
+        return xcdfsclientSecret;
+    }
+
+    public void setXcdfsclientSecret(String xcdfsclientSecret) {
+        this.xcdfsclientSecret = xcdfsclientSecret;
+    }
+
+    public String getIsRemotePhoto() {
+        return isRemotePhoto;
+    }
+
+    public void setIsRemotePhoto(String isRemotePhoto) {
+        this.isRemotePhoto = isRemotePhoto;
+    }
+
+    public String getPhotoHttp() {
+        return photoHttp;
+    }
+
+    public void setPhotoHttp(String photoHttp) {
+        this.photoHttp = photoHttp;
+    }
+
+    public String getPhotoIp() {
+        return photoIp;
+    }
+
+    public void setPhotoIp(String photoIp) {
+        this.photoIp = photoIp;
+    }
+
+    public String getIdentify_udmpuserpassword() {
+        return identify_udmpuserpassword;
+    }
+
+    public void setIdentify_udmpuserpassword(String identify_udmpuserpassword) {
+        this.identify_udmpuserpassword = identify_udmpuserpassword;
+    }
+
+    public String getIdentify_udmpusername() {
+        return identify_udmpusername;
+    }
+
+    public void setIdentify_udmpusername(String identify_udmpusername) {
+        this.identify_udmpusername = identify_udmpusername;
+    }
+
+    public String getIdentify_url() {
+        return identify_url;
+    }
+
+    public void setIdentify_url(String identify_url) {
+        this.identify_url = identify_url;
+    }
+
+    public String getEmail_send_user() {
+        return email_send_user;
+    }
+
+    public void setEmail_send_user(String email_send_user) {
+        this.email_send_user = email_send_user;
+    }
+
+    public String getEmail_send_password() {
+        return email_send_password;
+    }
+
+    public void setEmail_send_password(String email_send_password) {
+        this.email_send_password = email_send_password;
+    }
+
+    public String getEmail_send_host() {
+        return email_send_host;
+    }
+
+    public void setEmail_send_host(String email_send_host) {
+        this.email_send_host = email_send_host;
+    }
+
+    public String getEmail_send_port() {
+        return email_send_port;
+    }
+
+    public void setEmail_send_port(String email_send_port) {
+        this.email_send_port = email_send_port;
+    }
+
+    public String getEmail_send_ssl() {
+        return email_send_ssl;
+    }
+    
+
+    public String getEmail_send_tls() {
+		return email_send_tls;
+	}
+
+	public void setEmail_send_tls(String email_send_tls) {
+		this.email_send_tls = email_send_tls;
+	}
+
+	public void setEmail_send_ssl(String email_send_ssl) {
+        this.email_send_ssl = email_send_ssl;
+    }
+
+    public String getSms_send_url() {
+        return sms_send_url;
+    }
+
+    public void setSms_send_url(String sms_send_url) {
+        this.sms_send_url = sms_send_url;
+    }
+
+    public String getSms_system_code() {
+        return sms_system_code;
+    }
+
+    public void setSms_system_code(String sms_system_code) {
+        this.sms_system_code = sms_system_code;
+    }
+
+    public String getIdentify_card_url() {
+        return identify_card_url;
+    }
+
+    public void setIdentify_card_url(String identify_card_url) {
+        this.identify_card_url = identify_card_url;
+    }
+
+    public String getOcr_ip() {
+        return ocr_ip;
+    }
+
+    public void setOcr_ip(String ocr_ip) {
+        this.ocr_ip = ocr_ip;
+    }
+
+
+    @Value("${photo.app.url}")
+    private String photoAppUrl;
+    @Value("${photo.app.id}")
+    private String photoAppId;
+    @Value("${photo.app.security}")
+    private String photoAppSecurity;
+    @Value("${download.temp}")
+    private String downloadTemp;
+
+    @Value("${c_key}")
+    private String cKey;
+    @Value("${pdf_key}")
+    private String pdfKey;
+
+    public String getPdfKey() {
+        return pdfKey;
+    }
+
+    public void setPdfKey(String pdfKey) {
+        this.pdfKey = pdfKey;
+    }
+
+
+    // 消息队列是否启动标识 订单回写的应用配置成true,自考网上系统不配置
+    @Value("${xc_mq}")
+    private String xc_mq;
+
+    public String getXc_mq() {
+        return xc_mq;
+    }
+
+    public void setXc_mq(String xc_mq) {
+        this.xc_mq = xc_mq;
+    }
+
+    public String getcKey() {
+        return cKey;
+    }
+
+    public void setcKey(String cKey) {
+        this.cKey = cKey;
+    }
+
+    public String getPhotoAppUrl() {
+        return photoAppUrl;
+    }
+
+    public void setPhotoAppUrl(String photoAppUrl) {
+        this.photoAppUrl = photoAppUrl;
+    }
+
+    public String getPhotoAppId() {
+        return photoAppId;
+    }
+
+    public void setPhotoAppId(String photoAppId) {
+        this.photoAppId = photoAppId;
+    }
+
+    public String getPhotoAppSecurity() {
+        return photoAppSecurity;
+    }
+
+    public void setPhotoAppSecurity(String photoAppSecurity) {
+        this.photoAppSecurity = photoAppSecurity;
+    }
+
+    public String getDownloadTemp() {
+        return downloadTemp;
+    }
+
+    public void setDownloadTemp(String downloadTemp) {
+        this.downloadTemp = downloadTemp;
+    }
+
+    @Value("${certification.url}")
+    private String certificationUrl;
+    @Value("${certification.account}")
+    private String certificationAccount;
+    @Value("${certification.playKey}")
+    private String certificationPlayKey;
+
+    public String getCertificationUrl() {
+        return certificationUrl;
+    }
+
+    public void setCertificationUrl(String certificationUrl) {
+        this.certificationUrl = certificationUrl;
+    }
+
+    public String getCertificationAccount() {
+        return certificationAccount;
+    }
+
+    public void setCertificationAccount(String certificationAccount) {
+        this.certificationAccount = certificationAccount;
+    }
+
+    public String getCertificationPlayKey() {
+        return certificationPlayKey;
+    }
+
+    public void setCertificationPlayKey(String certificationPlayKey) {
+        this.certificationPlayKey = certificationPlayKey;
+    }
+
+	@Value("${privateKey}")
+	private String privateKey;
+	@Value("${pubKey}")
+	private String pubKey;
+
+	public String getPrivateKey() {
+		return privateKey;
+	}
+
+	public void setPrivateKey(String privateKey) {
+		this.privateKey = privateKey;
+	}
+
+	public String getPubKey() {
+		return pubKey;
+	}
+
+	public void setPubKey(String pubKey) {
+		this.pubKey = pubKey;
+	}
+
+}

+ 186 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/common/MkConst.java

@@ -0,0 +1,186 @@
+package cn.hmsoft.ses.common;
+
+
+
+/**
+ * 免考常量
+ * 
+ * @author yang
+ *
+ */
+public class MkConst {
+	
+	/**学历证书类型
+	 * @author yang
+	 *
+	 */
+	public enum CertCatalog {
+
+		/**
+		 * 非学历证书-0
+		 */
+		NEDU("非学历证书"),
+		/**
+		 * 学历证书-1
+		 */
+		EDU("学历证书");
+	
+
+		private String value;
+
+		private CertCatalog(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	//前置学历
+	public enum PreEduApply {
+
+		/**
+		 * 驳回-0
+		 */
+		NEW("驳回"),
+		/**
+		 * 待现场验证-1
+		 */
+		LOCAL_VERIFY("待现场验证"),
+		/**
+		 * 待省级验证-2
+		 */
+		PROV_VERIFY("待省级验证"),
+		/**
+		 * 归档-3
+		 */
+		ARCHIVE("归档");
+
+		private String value;
+
+		private PreEduApply(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+
+	// 非学历申请
+	public enum NEduApply {
+
+		/**
+		 * 驳回-0
+		 */
+		NEW("驳回"),
+		/**
+		 * 待现场验证-1
+		 */
+		LOCAL_VERIFY("待现场验证"),
+		/**
+		 * 待省级验证-2
+		 */
+		PROV_VERIFY("待省级验证"),
+		/**
+		 * 归档-3
+		 */
+		ARCHIVE("归档"),
+		/**
+		 * 考试院审核不通过-4
+		 */
+		REFUSE("考试院审核不通过");
+
+		private String value;
+
+		private NEduApply(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+
+	// 学历申请
+	public enum EduApply {
+
+		/**
+		 * 驳回-0
+		 */
+		NEW("驳回"),
+		/**
+		 * 待现场验证-1
+		 */
+		LOCAL_VERIFY("待现场验证"),
+		/**
+		 * 待省级验证-2
+		 */
+		PROV_VERIFY("待省级验证"),
+		/**
+		 * 归档-3
+		 */
+		ARCHIVE("归档"),
+		/**
+		 * 考试院审核不通过-4
+		 */
+		REFUSE("考试院审核不通过");
+
+		private String value;
+
+		private EduApply(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+
+	public enum NStdApplyCourse {
+
+		/**
+		 * 草稿-0
+		 */
+		NEW("待审批"),
+		/**
+		 * 待现场验证-1
+		 */
+		PASS("审批通过"),
+		/**
+		 * 待省级验证-2
+		 */
+		FAIL("审批失败");
+
+		private String value;
+
+		private NStdApplyCourse(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	//时间设置
+	public enum TimeConfig {
+
+		NULL("NULL"),
+
+		免考申请("待免考申请"),
+
+		前置学历申请("前置学历申请");
+
+		private String value;
+
+		private TimeConfig(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+}

+ 134 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/common/OperateLogAspect.java

@@ -0,0 +1,134 @@
+package cn.hmsoft.ses.common;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import cn.hmsoft.frame.data.model.FrameOptr;
+import cn.hmsoft.frame.util.RequestContextUtil;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.LogConst;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.data.model.sys.SysOperateLog;
+import cn.hmsoft.ses.service.iface.sys.ISysOperateLogService;
+import cn.hmsoft.web.config.SpringConfig;
+
+/**
+ * 
+ * @author zq
+ *
+ */
+@Aspect
+@Component("operateLogAspect")
+public class OperateLogAspect {
+
+	@After("within(@org.springframework.web.bind.annotation.RestController *)")  
+	public void after(final JoinPoint joinPoint) throws Throwable {
+		final HttpServletRequest request = getRequest();
+		if(request == null) {
+			return; 
+		}
+		final String uri = request.getRequestURI();
+		String methodName = joinPoint.getSignature().getName().toLowerCase();
+		if (methodName != null && (methodName.endsWith("query") 
+				|| methodName.endsWith("init") 
+				|| methodName.endsWith("all") 
+				|| methodName.endsWith("list") 
+				|| methodName.endsWith("get") 
+				|| methodName.endsWith("page") 
+				|| methodName.endsWith("find") 
+				|| methodName.endsWith("validatecode") 
+				|| methodName.endsWith("identifyorc")
+				
+				|| methodName.startsWith("query")
+				|| methodName.startsWith("init")
+				|| methodName.startsWith("all")
+				|| methodName.startsWith("list")
+				|| methodName.startsWith("get")
+				|| methodName.startsWith("page")
+				|| methodName.startsWith("find")
+				)) {
+			return;
+		}
+		final String remoteAddr = getIpAddr(request);
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		final String sessionId = request.getSession() != null ? request.getSession().getId() : null;
+		final String params = getParamString(request.getParameterMap());
+		SpringConfig.getBean(ThreadPoolTaskExecutor.class).submit(new Runnable() {
+
+			@Override
+			public void run() {
+				ISysOperateLogService logService = SpringConfig.getBean(ISysOperateLogService.class);
+				SysOperateLog operLog = new SysOperateLog();
+				operLog.setOper_uri(uri);
+				operLog.setSession_id(sessionId);
+				if (!StringUtils.isEmpty(stdRegInfo)) {
+					operLog.setUser_id(stdRegInfo.getId());
+				}
+				operLog.setMethod_name(methodName);
+				operLog.setRemote_ip(remoteAddr);
+				//operLog.setRequest_time(LocalDateTime.now());
+				operLog.setOper_params(params);
+				operLog.setBuss_name(LogConst.OPER_URI.get(operLog.getOper_uri()));
+				logService.insert(operLog);
+			}
+			
+		});
+	}
+	
+	private String getParamString(Map<String, String[]> map) {
+		StringBuilder sb = new StringBuilder();
+		for (Entry<String, String[]> e : map.entrySet()) {
+			sb.append(e.getKey()).append("=");
+			String[] value = e.getValue();
+			if (value != null && value.length == 1) {
+				sb.append(value[0]).append("&");
+			} else {
+				sb.append(Arrays.toString(value)).append("&");
+			}
+		}
+		if (sb.length() > 0) {
+			return sb.substring(0, sb.length() - 1);
+		}
+		return "";
+	}
+	
+	private HttpServletRequest getRequest() {
+		RequestAttributes ra = RequestContextHolder.getRequestAttributes();  
+		ServletRequestAttributes sra = (ServletRequestAttributes) ra;  
+		return sra.getRequest();
+	}
+	
+	/**
+	 * 获取登录用户远程主机ip地址
+	 * 
+	 * @param request
+	 * @return
+	 */
+	private String getIpAddr(HttpServletRequest request) {
+		String ip = request.getHeader("x-forwarded-for");
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("Proxy-Client-IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("WL-Proxy-Client-IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getRemoteAddr();
+		}
+		return ip;
+	}
+}

+ 196 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/common/StdConst.java

@@ -0,0 +1,196 @@
+package cn.hmsoft.ses.common;
+
+/**
+ * 学生相关常量.
+ */
+public class StdConst {
+
+	/**
+	 * 学生来源、类型
+	 */
+	public enum StudentType {
+		NULL("空"),
+		SOCIAL("社会考生"),
+		ENTRUST("系统委托"),
+		ASSIST("助学班考生");
+		
+		private String value;
+
+		private StudentType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 学生报名状态.
+	 */
+	public enum StdEnrolStatus {
+		/**
+		 * 报名记录创建-0.
+		 */
+		NEW("创建"),
+		/**
+		 * 校验,保留状态-1
+		 */
+		verify("报名验证"),
+		/**
+		 * 报名审核不通过-2
+		 */
+		AUDIT_FAIL("审核不通过"),
+		/**
+		 * 报名审核通过、提交上级-3
+		 */
+		AUDIT_PASS("审核通过"),
+		/**
+		 * 缴费通过-4
+		 */
+		PAY_PASS("缴费通过"),
+		/**
+		 * 订卷-5
+		 */
+		SETVOLUME("订卷"),
+		/**
+		 * 已编排-6
+		 */
+		LAYOUT("已编排");
+		
+		private String value;
+
+		private StdEnrolStatus(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+
+	/**
+	 * 学生报名类型
+	 */
+	public enum StdEnrolType {
+		
+		/**
+		 * NULL-0
+		 * */
+		NULL("NULL"),
+		/**
+		 * 统考-个人报名时间设置-1
+		 * */
+		PERSONAL_REG("个人报名"),
+		/**
+		 * 统考-集体报名时间设置-2
+		 * */
+		COLLECT_REG("集体报名");
+		
+		private String value;
+
+		private StdEnrolType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 学生缴费状态
+	 */
+	public enum StdPayStatus {
+		/**
+		 * 报考科目-已缴费
+		 */
+		ALREADY_PAY("已缴费"),
+		/**
+		 * 报考科目-未缴费
+		 */
+		NO_PAY("未缴费");
+		private String value;
+
+		private StdPayStatus(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 第一次缴费标志
+	 */
+	public enum StdEnrolFlag {
+		/**
+		 * 不用
+		 */
+		NUll("NULL"),
+		/**
+		 * 第一次报考标志
+		 */
+		FIRST_ENROL("第一次报考");
+		private String value;
+
+		private StdEnrolFlag(String value) {
+			this.value = value;
+		}
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 违规考生处罚规则
+	 */
+	public enum StdDisciplineRuLe {
+		/**
+		 * NULL-0
+		 */
+		NULL("NULL"),
+		/**
+		 * 科目成绩作废-1
+		 */
+		SCORE_INVALID("科目成绩作废"),
+		/**
+		 * 本次所有成绩作废-2
+		 */
+		ALL_SCORE_INVALID("本次所有成绩作废"),
+		/**
+		 * 停考1年-3
+		 */
+		STOP_ONE_YEAR("停考1年"),
+		/**
+		 * 停考2年-4
+		 */
+		STOP_TWO_YEAR("停考2年"),
+		/**
+		 * 停考3年-5
+		 */
+		STOP_THREE_YEAR("停考3年"),
+		/**
+		 * 延期毕业1年-6
+		 */
+		DELAY_GRADU_ONE_YAER("延期毕业1年"),
+		/**
+		 * 延期毕业2年-7
+		 */
+		DELAY_GRADU_TWO_YAER("延期毕业2年"),
+		/**
+		 * 延期毕业3年-8
+		 */
+		DELAY_GRADU_THREE_YAER("延期毕业3年");
+		
+		private String value;
+		private StdDisciplineRuLe(String value) {
+			this.value = value;
+		}
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+}

+ 613 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/constants/ByConst.java

@@ -0,0 +1,613 @@
+package cn.hmsoft.ses.constants;
+
+/**
+ * 毕业相关常量
+ */
+public class ByConst {
+	
+	public final static String NO_EXAM = "999";//免考成绩
+	public final static String REPLACE = "888";//课程顶替成绩
+	
+
+	/**
+	 * 成绩来源
+	 */
+	public enum ScoreSource {
+		
+		/**
+		 * 校考导入-0
+		 * */
+		COLLEGE("校考导入"),
+		/**
+		 * 统考导入-1
+		 * */
+		NORMAL("统考导入"),
+		/**
+		 * 顶替-2(成绩来源是由其他课程顶替)
+		 * */
+		REPLACE("顶替"),
+		/**
+		 * 被顶替-3(已经做了顶替使用)
+		 * */
+		BE_REPLACE("被顶替"),
+		/**
+		 * 手工增加-4
+		 * */
+		PERSON_ADD("手工增加"),
+		/**
+		 * 免考-5
+		 * */
+		NO_EXAM("免考"),
+		/**
+		 * 外省转入-6
+		 * */
+		TURN_IN("外省转入"),
+		/**
+		 * 网考合成后成绩-7
+		 */
+		NET_ASSIST_EXAM("网考合成"),
+		/**
+		 * 衔接合成后成绩-8
+		 */
+		JOIN_EXAM("衔接合成"),
+		/**
+		 * 百分百合成-9
+		 */
+		COMPOSE_100("百分百合成"),
+		/**
+		 * 手工评卷-10
+		 */
+		MANUAL_MARK("手工评卷"),
+		/**
+		 * 毕业论文-11
+		 */
+		BY_PAPER("毕业论文"),
+		/**
+		 * 关联准考证-12   毕业审核手工处理
+		 */
+		ASSO_TICKET("关联准考证"),
+		/**
+		 * 手工转入-13  毕业审核手工处理
+		 */
+		MANUAL_TURN_IN("手工转入"),
+		/**
+		 * 违规-14
+		 */
+		MISS_EXAM("违规"),
+		/**
+		 * 作弊-15
+		 */
+		CHEAT_EXAM("作弊");
+		
+		private String value;
+
+		private ScoreSource(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 *	转考状态
+	 */
+	public enum TurnStatus {
+		/**
+		 * 保存-0
+		 * */
+		SAVE("保存"), 
+		/**
+		 * 待现场确认-1(主考学校或者市考办)
+		 * */
+		FIRST_AUDIT("待现场确认"),
+		/**
+		 * 预留-2
+		 * */
+		NULL("NULL"),
+		/**
+		 * 省级审核-3
+		 * */
+		PROVINCE_AUDIT("省级审核"),
+		/**
+		 * 省级审核通过等待转出-4
+		 * */
+		TURN_SUCESS("省级审核通过等待转出"),
+		/**
+		 * 转至省外-5
+		 * */
+		TURN_OUT("转至省外"),
+		/**
+		 * 转出成功-6
+		 * */
+		TURN_SUCESS_END("转出成功"),
+		/**
+		 * 外省退回-7
+		 * */
+		TURN_FAIL("外省退回");
+		
+		private String value;
+
+		private TurnStatus(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 *	外省接收状态
+	 */
+	public enum OutProvStatus {
+		/**
+		 * NULL-0
+		 * */
+		NULL("NULL"), 
+		/**
+		 * 接收-1
+		 * */
+		RECEIVE("接收"),
+		/**
+		 * 逾期接收-2
+		 * */
+		TIME_OUT_RECEIVE("逾期接收"),
+		/**
+		 * 接收-3
+		 * */
+		BACK("退回"),
+		/**
+		 * 逾期退回-4
+		 * */
+		TIME_OUT_BACK("逾期退回"),
+		/**
+		 * 逾期删除-5
+		 * */
+		TIME_OUT_DEL("逾期删除");
+		
+		private String value;
+
+		private OutProvStatus(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 *	外省转入审核-状态
+	 */
+	public enum TurnInStatus {
+		/**
+		 * 保存-0
+		 * */
+		NO_PASS("审核不通过"), 
+		/**
+		 * 待现场确认-1(主考学校或者市考办)
+		 * */
+		FIRST_AUDIT("待现场确认"),
+		/**
+		 * 预留(二级审核)-2
+		 * */
+		NULL("NULL"),
+		/**
+		 * 省级审核-3
+		 * */
+		PROVINCE_AUDIT("省级审核"),
+		/**
+		 * 审核通过-4
+		 * */
+		PASS("审核通过"),
+		/**
+		 * 已归档-5
+		 * */
+		ARCHIVED("已归档"),
+		/**
+		 * 保存(刚导入外省转入的学生状态)-6
+		 * */
+		SAVE("保存");
+		
+		private String value;
+
+		private TurnInStatus(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 *	课程顶替规则
+	 */
+	public enum CourseReplRule {
+		/**
+		 * NULL-0
+		 * */
+		NULL("NULL"), 
+		/**
+		 * 整体-1
+		 * */
+		ALL("整体"),
+		/**
+		 * 任选-2
+		 * */
+		PART("任选");
+		private String value;
+
+		private CourseReplRule(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 *	顶替模式
+	 */
+	public enum CourseReplType {
+		/**
+		 * NULL-0
+		 * */
+		NULL("NULL"), 
+		/**
+		 * 整体-1
+		 * */
+		COURSE("课程模式"),
+		/**
+		 * 任选-2
+		 * */
+		SCORE("学分模式");
+		private String value;
+
+		private CourseReplType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 适用所有专业
+	 */
+	public enum YesOrNo {
+		/**
+		 * 否-0
+		 */
+		NO("否"),
+		/**
+		 * 是-1
+		 */
+		YES("是");
+
+		private String value;
+
+		private YesOrNo(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	/**
+	 * 通用启用、禁用
+	 */
+	public enum EnableStatus {
+		/**
+		 * 禁用-0
+		 */
+		disable("禁用"),
+		/**
+		 * 启用-1
+		 */
+		enable("启用");
+		
+		private String value;
+
+		private EnableStatus(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	/**
+	 * 转考类型
+	 */
+	public enum TurnType {
+		/**
+		 * NULL-0
+		 */
+		NULL("NULL"),
+		/**
+		 * 省内转考-1
+		 */
+		PROVINCE("省内转考"),
+		/**
+		 * 转至省外-2
+		 */
+		TURN_OUT("转至省外"),
+		/**
+		 * 外省转入-3
+		 */
+		TURN_IN("外省转入");
+		private String value;
+
+		private TurnType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 转考时间类型
+	 */
+	public enum TurnTimeType {
+		/**
+		 * NULL-0
+		 */
+		NULL("NULL"),
+		/**
+		 * 上半年-1
+		 */
+		FIRST_HALF_YEAR("上半年"),
+		/**
+		 * 下半年-2
+		 */
+		SECOND_HALF_YEAR("下半年");
+		private String value;
+
+		private TurnTimeType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	
+	/**
+	 * 学历层次
+	 *
+	 */
+	public enum EduLevel {
+
+		/**
+		 * 专科(高起专)
+		 */
+		A("专科"),
+		/**
+		 * 本科
+		 */
+		B("本科"),
+		
+		/**
+		 * 高起本
+		 */
+		C("高起本");
+		
+		
+		String cname;
+
+		private EduLevel(String cname) {
+			this.cname = cname;
+		}
+
+		public String getCname() {
+			return cname;
+		}
+	}
+
+	public enum PaperAuthStatus {
+		/**
+		 * 待审核
+		 */
+		TO_AUTH("待审核"),
+		
+		/**
+		 * 审核通过
+		 */
+		PASSED("审核通过");
+		
+		
+		String caption;
+
+		private PaperAuthStatus(String caption) {
+			this.caption = caption;
+		}
+
+		public String getCaption() {
+			return caption;
+		}
+	}
+	
+	/**
+	 * 论文成绩
+	 *
+	 */
+	public enum PaperScoreLevel {
+		/**
+		 * 不合格
+		 */
+		NOT_QUALIFIED("不合格"),
+		/**
+		 * 合格
+		 */
+		QUALIFIED("合格"),
+		
+		/**
+		 * 中等
+		 */
+		MDEIUM("中等"),
+		/**
+		 * 良好
+		 */
+		GOOD("良好"),
+		/**
+		 * 优秀
+		 */
+		EXCELLENT("优秀");
+		
+		String caption;
+
+		private PaperScoreLevel(String caption) {
+			this.caption = caption;
+		}
+
+		public String getCaption() {
+			return caption;
+		}
+	}
+	
+	/**
+	 * 毕业申请状态.
+	 *
+	 */
+	public enum ByStatus {
+		NEW_0("新建"),
+		TO_FIRST_AUDIT_1("现场确认"),
+		TO_FINAL_AUDIT_2("待自治区招生考试院终审"),
+		TO_DISTRIBUTE_3("待发放"),
+		TO_UPLOAD_4("待上报"),
+		ARCHIVED_5("完成"),
+		/**
+		 * 6-审核不通过
+		 */
+		COMPLETE_FAIL_6("审核不通过");
+		
+		private String value;
+
+		private ByStatus(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+
+	/**
+	 * 终审AB审核.
+	 *
+	 */
+	public enum ByFinalAuth {
+		/**
+		 * 0-待审核
+		 */
+		TO_BE_AUTH("待审核"),
+		/**
+		 * 1-审核通过
+		 */
+		AUTH_PASS("审核通过"),
+		/**
+		 * 2-审核不通过
+		 */
+		AUTH_FAIL("审核不通过");
+		
+		private String value;
+
+		private ByFinalAuth(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	
+	/**
+	 * 成绩状态
+	 *
+	 */
+	public enum ScoreStatus {
+		/**
+		 * 废弃-0.
+		 */
+		ABANDON("废弃"),
+		/**
+		 * 启用-1.
+		 */
+		ENABLE("启用"),
+		/**
+		 * 毕业使用-2
+		 */
+		BY_USED("毕业使用");
+		
+		private String value;
+		
+		private ScoreStatus(String value) {
+			this.value = value;
+		}
+		
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 学历层次
+	 *
+	 */
+	public enum MajorLevel {
+
+		/**
+		 * 专科(高起专)
+		 */
+		A("专科"),
+		/**
+		 * 本科
+		 */
+		B("本科"),
+		
+		/**
+		 * 高起本
+		 */
+		C("高起本");
+		
+		
+		String cname;
+
+		private MajorLevel(String cname) {
+			this.cname = cname;
+		}
+
+		public String getCname() {
+			return cname;
+		}
+	}
+	
+	/**
+	 * 毕业证发放状态
+	 *
+	 */
+	public enum ByApplyType {
+		STD_APPLY("考生申请"),
+		MGM_APPLY("管理端申请");
+		
+		private String value;
+
+		private ByApplyType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+}

+ 153 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/constants/CfConst.java

@@ -0,0 +1,153 @@
+package cn.hmsoft.ses.constants;
+
+/**
+ * cf配置相关常量.
+ */
+public class CfConst {
+
+	/**
+	 * 考务业务时间操作类型.
+	 */
+	public enum CfOperateTimeType {
+		
+		/**
+		 * NULL-0,为了和湖北保持一致
+		 * */
+		NULL("NULL"),
+		/**
+		 * 统考-个人报名时间设置-1
+		 * */
+		PERSONAL_REG("个人报名"), 
+		
+		/**
+		 * 统考-集体报名时间设置-2
+		 * */
+		COLLECT_REG("集体报名"), 
+		/**
+		 * 沟通课上报-3
+		 * */
+		GTK("沟通课上报"),
+		/**
+		 * 成绩复查时间设置-4
+		 * */
+		SCORE_CHECK("成绩复查申请"), 
+		/**
+		 * 成绩复查结果公布时间设置-5
+		 * */
+		SCORE_CHECK_RESULT("成绩复查结果公布"),
+		/**
+		 * 沟通课上报-6
+		 * */
+		COMGRADE("沟通课上报"),
+		/**
+		 * 实践课考试计划-7
+		 * */
+		SJKEXAM("实践课考试计划"),
+		/**
+		 * 注册读卡提交时间-8
+		 * */
+		REGISTER("注册读卡提交时间"),
+		/**
+		 * 注册主考院校提交时间-9
+		 * */
+		REGSCHOOLVERIFY("注册主考院校提交时间"),
+		/**
+		 * 学业综合评价-10
+		 * */
+		EVALUATION("学业综合评价"),
+		/**
+		 * 课改实践课考试计划-11
+		 * */
+		KGSJKEXAM("课改实践课考试计划"),
+		/**
+		 * 未知-12
+		 * */
+		JKEXANINFO(""),
+		/**
+		 * 未知-13
+		 * */
+		EXANINFO(""),
+		/**
+		 * 课改实践课成绩-14
+		 * */
+		REFORM_SJK_GRADE("课改实践课成绩"),
+		/**
+		 * 学业综合评价报名-15
+		 * */
+		EVALUATION_BM("学业综合评价报名"),
+		/**
+		 * 考务编排时间设置-16
+		 * */
+		layOut("考务编排"),
+		/**
+		 * 机考成绩复查申请-17
+		 * **/
+		CBT_GRADE("机考成绩复查申请"),
+		/**
+		 * 机考成绩复查公布-18
+		 * */
+		CBT_GRADE_PUB("机考成绩复查公布"),
+		/**
+		 * 机考考场查询-19
+		 * */
+		COMPUTER_QUYER("机考考场查询"), 
+		/**
+		 * 统考考场查询-20
+		 * */
+		NATION_QUYER("统考考场查询"), 
+		/**
+		 * 统考成绩查询-21
+		 * */
+		unionGradeQuery("统考成绩查询"),
+		
+		/**
+		 * 考试计划查询-22
+		 * */
+		eamxTimePlanQuery("考试计划查询"),
+		
+		/**
+		 * 考试计划查询-23
+		 * */
+		ticketDownload("准考证下载"),
+		
+		/**
+		 * 考试计划查询-24
+		 * */
+		enrolPay("报考缴费"),
+
+
+
+		/**
+		 * 发票申请-25
+		 * */
+		INVOICING("发票申请"),
+		/**
+		 * 成绩复核-26
+		 * */
+		SCOREREVIEW("成绩复核"),
+		/**
+		 * 退款申请-27
+		 * */
+		REFUND("退款申请"),
+		/**
+		 * 评卷人员登记-28
+		 * */
+		PLPJMAN("评卷人员登记"),
+		/**
+		 * 退款申请补充证明材料-29
+		 * */
+		REFUND_REPLENISH("退款申请补充证明材料");
+
+
+		private String value;
+
+		private CfOperateTimeType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+}

+ 234 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/constants/CourseConst.java

@@ -0,0 +1,234 @@
+package cn.hmsoft.ses.constants;
+
+/**
+ * 
+ * @author zq
+ *
+ */
+public class CourseConst {
+
+	/**
+	 * 课程类型.
+	 */
+	@Deprecated
+	public enum CourseTypeEnum {
+		/**
+		 * null-0
+		 */
+		NULL("NULL"),
+		/**
+		 * 公共课-1
+		 */
+		THEORY("公共课"),
+		/**
+		 * 专业课-2
+		 */
+		PRACTISE("专业课"),
+		/**
+		 * 选考课-3
+		 */
+		COMMUNICATE("选考课"),
+		/**
+		 * 毕业论文-4
+		 */
+		THESIS("毕业论文");
+		
+		private String value;
+
+		private CourseTypeEnum(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 课程性质,和专业关联起来才有意义.
+	 */
+	public enum CourseNatureEnum {
+		/**
+		 * null-0
+		 */
+		NULL("NULL"),
+		/**
+		 * 公共课-1
+		 */
+		COMMON_COURSE("公共课"),
+		/**
+		 * 专业课-2
+		 */
+		PROFESS_COURSE("专业课"),
+		/**
+		 * 选考课-3
+		 */
+		CHOOSE_COURSE("考查课"),
+		/**
+		 * 毕业论文-4
+		 */
+		THESIS("毕业论文"),
+		/**
+		 * 实践课-5
+		 */
+		PRACTICE_COURSE("实践课");
+		
+		
+		private String value;
+
+		private CourseNatureEnum(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	/**
+	 * 考试时间标识.
+	 *
+	 */
+	public enum ExamTimeEnum {
+		/**
+		 * 星期六上午
+		 */
+		A("A"),
+		/**
+		 * 星期六下午午
+		 */
+		B("B"),
+		/**
+		 * 星期天上午
+		 */
+		C("C"),
+		/**
+		 * 星期天下午
+		 */
+		D("D"),
+		/**
+		 * 星期五上午
+		 */
+		X("X"),
+		/**
+		 * 星期五下午
+		 */
+		Y("Y");
+		
+		private String value;
+
+		private ExamTimeEnum(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 统考、省考枚举.
+	 *
+	 */
+	public enum NationExamType {
+		/**
+		 * 省考课程-0
+		 */
+		PROVINCE("PROVINCE"),
+		/**
+		 * 国考课程-1
+		 */
+		NATION("NATION");
+		
+		private String value;
+
+		private NationExamType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 考试计划发布稿状态
+	 */
+	public enum ExamPlanPubStatus {
+		/**
+		 * 草稿本-0
+		 */
+		DRAFT("草稿本"),
+		/**
+		 * 发布初稿-1
+		 */
+		FIRST_DRAFT("发布初稿"),
+		/**
+		 * 发布终稿-2
+		 */
+		FINAL_DRAFT("发布终稿");
+		
+		private String value;
+
+		private ExamPlanPubStatus(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 开考类型.
+	 * @author Lenovo
+	 *
+	 */
+	public enum ExamOpenType {
+		/**
+		 * 面向社会-0.
+		 */
+		FACE_SOCIETY("面向社会"),
+		/**
+		 * 全日制助学班-1.
+		 */
+		FULL_STUDY_AID("全日制助学班"),
+		/**
+		 * 专科衔接-2.
+		 */
+		JUNIOR_TRANSIT("专科衔接"),
+		/**
+		 * 本科衔接-3.
+		 */
+		UNDERGRADUATE_TRANSIT("本科衔接"),
+		/**
+		 * 全日制专科-4.
+		 */
+		FULL_JUNIOR("全日制专科"),
+		/**
+		 * 全日制专升本-5.
+		 */
+		FULL_SPECIAL_PROMOTION("全日制专升本"),
+		/**
+		 * 全日制本科-6.
+		 */
+		FULL_UNDERGRADUATE("全日制本科"),
+		/**
+		 * 非全日制专科-7.
+		 */
+		NON_FULL_JUNIOR("非全日制专科"),
+		/**
+		 * 非全日制专升本-8.
+		 */
+		NON_FULL_SPECIAL_PROMOTION("非全日制专升本");
+		
+		private String value;
+
+		private ExamOpenType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+}

+ 19 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/constants/EnrolSessionName.java

@@ -0,0 +1,19 @@
+package cn.hmsoft.ses.constants;
+
+/**
+ * @author haoguanghui
+ * 考生登录session常量
+ */
+public abstract class EnrolSessionName {
+
+	/*************************
+	 * 考生登录成功保存的Session值
+	 */
+	public final static String EnrolStdReg = "EnrolStdReg";
+	
+	/*************************
+	 * 年度码
+	 */
+	public final static String YearCode = "YearCode";
+	
+}

+ 24 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/constants/EnrolType.java

@@ -0,0 +1,24 @@
+package cn.hmsoft.ses.constants;
+
+/**
+ * @author haoguanghui
+ * 报名类型
+ */
+public abstract class EnrolType {
+
+	/*************************
+	 * 个人报名
+	 */
+	public final static Integer Personal_Enrol = 1;
+	
+	/*************************
+	 * 集体报名
+	 */
+	public final static Integer Group_Enrol = 2;
+	
+	
+	/*************************
+	 * 第一次报考
+	 */
+	public final static Integer First_ENROL = 1;
+}

+ 85 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/constants/KjConst.java

@@ -0,0 +1,85 @@
+package cn.hmsoft.ses.constants;
+
+/**
+ * 考籍常量类.
+ * @author zq
+ *
+ */
+public class KjConst {
+
+	/**
+	 * 论文成绩等级.
+	 */
+	public enum PaperScoreLevel {
+		
+	}
+	
+	/**
+	 * 校考成绩类型.
+	 *
+	 */
+	public enum CollegeScoreType {
+		/**
+		 * 实践课成绩-0
+		 */
+		PRACTICAL_SCORE("实践课成绩"),
+		/**
+		 * 网络助学成绩-1
+		 */
+		ASSIST_SCORE("网络助学成绩"),
+		/**
+		 * 专本衔接课成绩-2
+		 */
+		JOIN_SCORE("专本衔接课成绩"),
+		/**
+		 * 沟通课成绩-3
+		 */
+		COMMUNICATE_SCORE("沟通课成绩"),
+		/**
+		 * 毕业论文-4
+		 */
+		BY_PAPER_SCORE("毕业论文");
+		
+		private String value;
+
+		private CollegeScoreType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+
+	/**
+	 * 实践课审批状态.
+	 */
+	public enum CollegeScoreStatus {
+		/**
+		 * 新建-0
+		 * */
+		NEW("新建状态"), 
+		/**
+		 * 待主考学校审核-1
+		 * */
+		TO_SCHOOL_AUDIT("待主考学校审核"),
+		/**
+		 * 待省级审核-2
+		 * */
+		TO_PROVINCE_AUDIT("待省级审核"),
+		/**
+		 * 审核通过-3
+		 * */
+		AUDIT_FINISH("完成");
+		
+		private String value;
+
+		private CollegeScoreStatus(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+}

+ 95 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/constants/LogConst.java

@@ -0,0 +1,95 @@
+package cn.hmsoft.ses.constants;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 日志常量.
+ */
+public class LogConst {
+
+	public static final Map<String, String> OPER_URI = new HashMap<String, String>();
+	
+	static {
+		OPER_URI.put("/ses-enrol-v1//by/byCertificate/add.htm", "毕业证明书申请");
+		OPER_URI.put("/ses-enrol-v1//by/byCertificate/reApply.htm", "毕业证明书修改并重新申请");
+		OPER_URI.put("/ses-enrol-v1//by/byTurnOutApply/add.htm", "转省外申请");
+		OPER_URI.put("/ses-enrol-v1//by/byTurnOutApply/edit.htm", "转省外修改并重新申请");
+		OPER_URI.put("/ses-enrol-v1//by/byTurnOutApply/toAdd.htm", "跳转转省外申请页面");
+		OPER_URI.put("/ses-enrol-v1//pl/byApply/upload.htm", "上传毕业照片");
+		OPER_URI.put("/ses-enrol-v1//pl/byPaperApply/upload.htm", "上传毕业论文答辩照片");
+		OPER_URI.put("/ses-enrol-v1//std/checkCertNo18.htm", "身份证验证");
+		OPER_URI.put("/ses-enrol-v1//std/password.htm", "修改密码");
+		OPER_URI.put("/ses-enrol-v1//std/stdEnrol/add.htm", "课程报考");
+		OPER_URI.put("/ses-enrol-v1//std/stdEnrol/delete.htm", "删除报考课程");
+		OPER_URI.put("/ses-enrol-v1//std/stdEnrol/detail.htm", "可报考课程明细");
+		OPER_URI.put("/ses-enrol-v1//std/stdEnrol/editCourse.htm", "课程报考变更");
+		OPER_URI.put("/ses-enrol-v1//std/stdEnrol/editDetail.htm", "课程报考详情");
+		OPER_URI.put("/ses-enrol-v1//std/stdEnrol/existFacePic.htm", "照片校验");
+		OPER_URI.put("/ses-enrol-v1//std/stdEnrol/payUnion/makePayBill.htm", "缴费订单生成");
+		OPER_URI.put("/ses-enrol-v1//std/stdEnrol/payUnion/makePayBillBatch.htm", "批量缴费订单生成");
+		OPER_URI.put("/ses-enrol-v1//std/stdEnrol/payUnion/checkOrderIsSuccess.htm", "查检订单状态");
+		OPER_URI.put("/ses-enrol-v1//std/stdRegInfo/edit.htm", "考生信息修改");
+		OPER_URI.put("/ses-enrol-v1//std/stdRegInfo/editMajor.htm", "专业信息变更");
+		OPER_URI.put("/ses-enrol-v1//std/stdRegInfo/handleGenTicketNo.htm", "生成准考证");
+		OPER_URI.put("/ses-enrol-v1//std/stdRegInfo/uploadImg.htm", "照片上传");
+		OPER_URI.put("/ses-enrol-v1//std/updateMustUpdeCertNo.htm", "标识非法身份证件");
+		OPER_URI.put("/ses-enrol-v1//std/validateUploadPhtooUrl.htm", "校验是否允许上传照片");
+		OPER_URI.put("/ses-enrol-v1/by/byApply/apply.htm", "毕业申请");
+		OPER_URI.put("/ses-enrol-v1/by/byApply/reApply.htm", "毕业申请修改并重新申请");
+		OPER_URI.put("/ses-enrol-v1/by/byCourseReplRecord/deleteByCourse.htm", "删除顶替课程");
+		OPER_URI.put("/ses-enrol-v1/by/byCourseReplRecord/repl.htm", "课程顶替");
+		OPER_URI.put("/ses-enrol-v1/by/byCourseReplRecord/resetByScore.htm", "重置毕业成绩");
+		OPER_URI.put("/ses-enrol-v1/by/byPaperApply/apply.htm", "毕业论文答辩申请");
+		OPER_URI.put("/ses-enrol-v1/by/byPaperApply/reApply.htm", "毕业论文答辩修改并重新申请");
+		OPER_URI.put("/ses-enrol-v1/by/byTurnOutApply/add.htm", "转省外申请");
+		OPER_URI.put("/ses-enrol-v1/by/byTurnOutApply/edit.htm", "转省外修改并重新申请");
+		OPER_URI.put("/ses-enrol-v1/by/byTurnOutApply/toAdd.htm", "跳转转省外申请页面");
+		OPER_URI.put("/ses-enrol-v1/mk/mkCertEduApply/apply.htm", "学历免考申请");
+		OPER_URI.put("/ses-enrol-v1/mk/mkCertEduApply/back.htm", "学历免考撤回");
+		OPER_URI.put("/ses-enrol-v1/mk/mkCertEduApply/toApply.htm", "跳转学历免考申请页面");
+		OPER_URI.put("/ses-enrol-v1/mk/mkCertEduApply/upload.htm", "学历免考附件上传");
+		OPER_URI.put("/ses-enrol-v1/mk/mkCertNeduApply/apply.htm", "非学历免考申请");
+		OPER_URI.put("/ses-enrol-v1/mk/mkCertNeduApply/toApply.htm", "跳转非学历免考申请页面");
+		OPER_URI.put("/ses-enrol-v1/mk/mkCertNeduApply/upload.htm", "非学历免考附件上传");
+		OPER_URI.put("/ses-enrol-v1/pl/byApply/upload.htm", "毕业照片上传");
+		OPER_URI.put("/ses-enrol-v1/pl/byApply/uploadFile.htm", "毕业认证材料上传");
+		OPER_URI.put("/ses-enrol-v1/pl/byPaperApply/upload.htm", "毕业答辩照片上传");
+		OPER_URI.put("/ses-enrol-v1/pl/plMajorCourse/textBookListByCourse.htm", "专业课程查询");
+		OPER_URI.put("/ses-enrol-v1/std/checkCertNo18.htm", "身份证验证");
+		OPER_URI.put("/ses-enrol-v1/std/enrol/downTicket.htm", "准考证下载");
+		OPER_URI.put("/ses-enrol-v1/std/login.htm", "登陆");
+		OPER_URI.put("/ses-enrol-v1/std/loginForPhone.htm", "手机登陆");
+
+		OPER_URI.put("/ses-enrol-v1/std/logout.htm", "退出");
+		OPER_URI.put("/ses-enrol-v1/std/passwordNoLogin.htm", "密码修改");
+		OPER_URI.put("/ses-enrol-v1/std/stdEnrol/add.htm", "课程报考");
+		OPER_URI.put("/ses-enrol-v1/std/stdEnrol/delete.htm", "删除报考课程");
+		OPER_URI.put("/ses-enrol-v1/std/stdEnrol/detail.htm", "可报考课程明细");
+		OPER_URI.put("/ses-enrol-v1/std/stdEnrol/editCourse.htm", "课程报考变更");
+		OPER_URI.put("/ses-enrol-v1/std/stdEnrol/editDetail.htm", "课程报考详情");
+		OPER_URI.put("/ses-enrol-v1/std/stdEnrol/existFacePic.htm", "照片校验");
+		OPER_URI.put("/ses-enrol-v1/std/stdEnrol/payUnion/makePayBill.htm", "缴费订单生成");
+		OPER_URI.put("/ses-enrol-v1/std/stdEnrol/payUnion/makePayBillBatch.htm", "批量缴费订单生成");
+		OPER_URI.put("/ses-enrol-v1/std/stdEnrol/payUnion/checkOrderIsSuccess.htm", "查检订单状态");
+		OPER_URI.put("/ses-enrol-v1/std/stdInfoModifyApply/apply.htm", "考生信息变更申请");
+		OPER_URI.put("/ses-enrol-v1/std/stdInfoModifyApply/delete.htm", "考生信息变更申请删除");
+		OPER_URI.put("/ses-enrol-v1/std/stdInfoModifyApply/upload.htm", "考生信息变更资料上传");
+		OPER_URI.put("/ses-enrol-v1/std/stdRegInfo/edit.htm", "考生信息修改");
+		OPER_URI.put("/ses-enrol-v1/std/stdRegInfo/editMajor.htm", "专业信息变更");
+		OPER_URI.put("/ses-enrol-v1/std/stdRegInfo/handleGenTicketNo.htm", "生成准考证");
+		OPER_URI.put("/ses-enrol-v1/std/stdRegInfo/reg.htm", "注册");
+		OPER_URI.put("/ses-enrol-v1/std/stdRegInfo/uploadImg.htm", "照片上传");
+		OPER_URI.put("/ses-enrol-v1/std/validateUploadPhtooUrl.htm", "校验是否允许上传照片");
+		OPER_URI.put("/ses-enrol-v1/by/byApply/educertified.htm", "学历认证");
+		OPER_URI.put("/ses-enrol-v1//by/byApply/educertified.htm", "学历认证");
+
+		OPER_URI.put("/ses-enrol-v1/std/checkIsIdentfiy.htm", "身份认证");
+		OPER_URI.put("/ses-enrol-v1/std/checkPhotoCompliance.htm", "照片合规性验证");
+		OPER_URI.put("/ses-enrol-v1/std/setQuestion.htm", "设置密保问题");
+
+
+
+	}
+
+}

+ 49 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/constants/OrgConst.java

@@ -0,0 +1,49 @@
+package cn.hmsoft.ses.constants;
+
+/**
+ * 机构配置常量类
+ */
+public class OrgConst {
+
+	/**
+	 * 机构类型枚举
+	 */
+	public enum OrgType {
+		/**
+		 * 区招生考试院-0
+		 */
+		PROVINCE_EXAM("区招生考试院"),  
+		/**
+		 * 主考学校-1
+		 */
+		SCHOOL_EXAM("主考学校"), 
+		/**
+		 * 市自考办-2
+		 */
+		CITY_EXAM("市考试院"), 
+		/**
+		 * 助学机构-3
+		 */
+		ASSIST_EXAM("助学机构"),
+		/**
+		 * 考区-4
+		 */
+		EXAM_AREA("考区"),
+		/**
+		 * 学服中心-5
+		 */
+		STUDY_CENTER("学服中心");
+		
+		private String value;
+
+		private OrgType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+
+	}
+
+}

+ 258 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/constants/StdConst.java

@@ -0,0 +1,258 @@
+package cn.hmsoft.ses.constants;
+
+/**
+ * 学生相关常量.
+ */
+public class StdConst {
+	public enum Status {
+		IMPORT("导入状态"),
+		NEW("新注册"),//集体注册和考生注册状态
+		INFODONE("个人信息已完善"),//考生端编辑个人信息状态 
+		IMGDONE("已上传图片"),//考生端上传图片状态 ,管理端现场拍照状态
+		ALLDONE("已完善全部信息");//报名专业后生成准考证号的状态
+//		canENrol("可报考");
+		
+		private String value;
+
+		private Status(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+
+	/**
+	 * 学生来源、类型
+	 */
+	public enum StudentType {
+		NULL("空"),
+		SOCIAL("社会考生"),
+		ENTRUST("系统委托"),
+		ASSIST("助学班考生");
+		
+		private String value;
+
+		private StudentType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 学生报名状态.
+	 */
+	public enum StdEnrolStatus {
+		/**
+		 * 报名记录创建-0.
+		 */
+		NEW("创建"),
+		/**
+		 * 校验,保留状态-1
+		 */
+		verify("报名验证"),
+		/**
+		 * 报名审核不通过-2
+		 */
+		AUDIT_FAIL("审核不通过"),
+		/**
+		 * 报名审核通过、提交上级-3
+		 */
+		AUDIT_PASS("审核通过"),
+		/**
+		 * 缴费通过-4
+		 */
+		PAY_PASS("缴费通过"),
+		/**
+		 * 订卷-5
+		 */
+		SETVOLUME("订卷"),
+		/**
+		 * 已编排-6
+		 */
+		LAYOUT("已编排");
+		
+		private String value;
+
+		private StdEnrolStatus(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+
+	/**
+	 * 学生报名类型
+	 */
+	public enum StdEnrolType {
+		
+		/**
+		 * NULL-0
+		 * */
+		NULL("NULL"),
+		/**
+		 * 统考-个人报名时间设置-1
+		 * */
+		PERSONAL_REG("个人报名"),
+		/**
+		 * 统考-集体报名时间设置-2
+		 * */
+		COLLECT_REG("集体报名");
+		
+		private String value;
+
+		private StdEnrolType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 学生缴费状态
+	 */
+	public enum StdPayStatus {
+		/**
+		 * 报考科目-未缴费
+		 */
+		NO_PAY("未缴费"),
+		/**
+		 * 报考科目-已缴费
+		 */
+		ALREADY_PAY("已缴费");
+		
+		private String value;
+
+		private StdPayStatus(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 第一次缴费标志
+	 */
+	public enum StdEnrolFlag {
+		/**
+		 * 不用
+		 */
+		NUll("NULL"),
+		/**
+		 * 第一次报考标志
+		 */
+		FIRST_ENROL("第一次报考");
+		private String value;
+
+		private StdEnrolFlag(String value) {
+			this.value = value;
+		}
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	public enum StdInfoModifyStatus {
+		refuse("退回"),
+		locVerify("初审审批"),
+		provVerify("终审审批"),
+		archive("已处理并归档"),
+		;
+		
+		private String value;
+		
+		private StdInfoModifyStatus(String value) {
+			this.value = value;
+		}
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 操作类型
+	 */
+	public enum OperType {
+		
+		/**
+		 * 新增-0
+		 */
+		ADD("新增"),
+		/**
+		 * 修改-1
+		 */
+		UPDATE("修改"),
+		/**
+		 * 删除-2
+		 */
+		DELETE("删除"),
+		/**
+		 * 确认-3
+		 */
+		CONFIRM("确认"),
+		/**
+		 * 操作失败-4
+		 */
+		OPER_FAIL("操作失败");
+
+		private String value;
+
+		private OperType(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+	/**
+	 * 考生报考说明
+	 */
+	public enum StdEnrolRemark {
+		
+		/**
+		 * 报考课程-0
+		 */
+		ADD_REMARK("报考课程"),
+		/**
+		 * 修改报考课程-1
+		 */
+		UPDATE_REMARK("修改报考课程"),
+		/**
+		 * 删除报考课程-2
+		 */
+		DELETE_REMARK("删除报考课程"),
+		/**
+		 * 设置为已缴费-3
+		 */
+		PAY_REMARK("设置为已缴费"),
+		/**
+		 * 设置为未缴费-4
+		 */
+		UN_PAY_REMARK("设置为未缴费");
+		
+
+		private String value;
+
+		private StdEnrolRemark(String value) {
+			this.value = value;
+		}
+
+		public String toString() {
+			return this.value;
+		}
+	}
+	
+}

+ 102 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/constants/SysConst.java

@@ -0,0 +1,102 @@
+package cn.hmsoft.ses.constants;
+
+import cn.hmsoft.ses.common.AppConfig;
+import org.springframework.web.context.ContextLoader;
+import org.springframework.web.context.WebApplicationContext;
+
+import java.io.File;
+
+/**
+ * 系统常量.
+ */
+public class SysConst {
+	//web应用上下文.
+	private static WebApplicationContext WEBAPPLICATIONCONTEXT = null;
+	
+	//上传路径base
+	public static final String UPLOAD_BASE = "/home/upload/enrol";
+
+	public static final String IMG_BY_PREFIX = File.separator + "by" + File.separator;;
+	
+	public static String IMG_FACE_PREFIX =  File.separator + "face" + File.separator;
+	//外省准考证存放目录
+	public static String IMG_TICKET_PREFIX =  File.separator + "outicket" + File.separator;
+	
+	//非学历证书学习成果认证 上传文件目录
+	public static String IMG_NEDU_PREFIX =  File.separator + "nedu" + File.separator;
+	//学历历证书学习成果认证 上传文件目录
+	public static String IMG_EDU_PREFIX =  File.separator + "edu" + File.separator;
+	//前置学历
+	public static String IMG_PRE_EDU_PREFIX =  File.separator + "preedu" + File.separator;
+	
+	//考生信息修改申请
+	public static String IMG_SIMA_PREFIX =  File.separator + "sima" + File.separator;
+
+	//投诉申请
+	public static String IMG_FEEDBACK_PREFIX =  File.separator + "feedback" + File.separator;
+
+
+    /**
+     * 获取当前WEB应用上下文.
+     * @return 当前WEB应用上下文.
+     */
+    public static WebApplicationContext getCurrentWebApplicationContext() {
+    	if(WEBAPPLICATIONCONTEXT == null){
+    		WEBAPPLICATIONCONTEXT = ContextLoader.getCurrentWebApplicationContext();
+    	}
+    	return WEBAPPLICATIONCONTEXT;
+    }
+    
+    /**
+     * 获取配置对象.
+     * @return
+     */
+    public static AppConfig getAppConfig() {
+    	return getCurrentWebApplicationContext().getBean(AppConfig.class);
+    }
+   
+    /**
+     * 获取身份证上传路径
+     * @return
+     */
+    public static String getIdentifyImgPath() {
+    	return getAppConfig().getUploadBase() + File.separator + "img" + File.separator + "identity" + File.separator;
+    }
+    
+    /**
+     * 获取头像上传路径
+     * @return
+     */
+    public static String getFaceImgPath() {
+    	return getAppConfig().getUploadBase() + File.separator + "img" + File.separator + "face" + File.separator;
+    }
+    
+    /**
+     * 实践课上报路径-校考分数上报
+     * @return
+     */
+    public static String getPracticalPath(int year_code) {
+    	return getAppConfig().getUploadBase() + "SchoolScore" + File.separator + year_code + File.separator + "practical" + File.separator;
+    }
+    
+    /**
+     * 毕业论文成绩-主考学校上报
+     * @return
+     */
+    public static String getByPaperScorePath(int year_code) {
+    	return getAppConfig().getUploadBase() + "SchoolScore" + File.separator + year_code + File.separator + "paper" + File.separator;
+    }
+    
+    public static String getByPhotoPath(String ticketNo) {
+    	String first4 = ticketNo.substring(0, 4);
+    	String second3 = ticketNo.substring(4, 7);
+    	return File.separator + "ByPhoto" + File.separator + first4 + File.separator + second3 + File.separator;
+    }
+    
+    public static String getByPaperPhotoPath(String ticketNo) {
+    	String first4 = ticketNo.substring(0, 4);
+    	String second3 = ticketNo.substring(4, 7);
+    	return File.separator + "ByPaperPhoto" + File.separator + first4 + File.separator + second3 + File.separator;
+    }
+    
+}

+ 18 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/constants/SysConst2.java

@@ -0,0 +1,18 @@
+package cn.hmsoft.ses.constants;
+
+import java.io.File;
+
+/**
+ * 系统常量.
+ */
+public class SysConst2 {
+	//上传路径base
+	public static final String UPLOAD_BASE = "/home/upload/enrol";
+	//上传的身份证照片路径
+	public static final String IDENTIFY_IMG = UPLOAD_BASE + File.separator + "img" + File.separator + "identity" + File.separator;
+	//上传的头像路径
+	public static final String FACE_IMG = UPLOAD_BASE + File.separator + "img" + File.separator + "face" + File.separator;
+	
+	public static final String IDENTITY_IMG_PATH =  File.separator + "identity" + File.separator;
+	public static final String FACE_IMG_PATH =  File.separator + "face" + File.separator;
+}

+ 28 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/app/AppUpdate.java

@@ -0,0 +1,28 @@
+package cn.hmsoft.ses.control.app;
+
+import cn.hmsoft.ses.data.dao.sys.SysAppUpdateDao;
+import cn.hmsoft.ses.data.model.sys.SysAppUpdate;
+import cn.hmsoft.web.entity.Ajax;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class AppUpdate {
+
+    @Autowired
+    private SysAppUpdateDao sysAppUpdateDao;
+
+    @RequestMapping("/app/update")
+    public Ajax pageRegInfo(String version, String os) {
+        SysAppUpdate sys=sysAppUpdateDao.findApp(os);
+        int compareTo = version.compareTo(sys.getVersion());
+        if (compareTo < 0) {
+            return new Ajax(sys);
+        } else {
+            return new Ajax();
+        }
+
+    }
+
+}

+ 67 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByApplyAuditControl.java

@@ -0,0 +1,67 @@
+package cn.hmsoft.ses.control.by;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.data.model.by.ByApplyAudit;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.service.iface.by.IByApplyAuditService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 毕业审核表 控制器.
+ * 
+ * @author: zq
+ * @date: 2019-03-14 13:39:19
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class ByApplyAuditControl extends AjaxControl {
+
+    @Autowired
+    private IByApplyAuditService byApplyAuditService;
+	
+    @RequestMapping("by/byApplyAudit/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	order = "1";
+        }
+        return new Ajax(this.byApplyAuditService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    @RequestMapping("by/byApplyAudit/add")
+    public Ajax add(ByApplyAudit byApplyAudit) {
+        this.byApplyAuditService.insert(byApplyAudit);
+        return new Ajax();
+    }
+    
+    @RequestMapping("by/byApplyAudit/edit")
+    public Ajax edit(ByApplyAudit byApplyAudit) {
+        this.byApplyAuditService.edit(byApplyAudit);
+        return new Ajax();
+    }
+    
+    @RequestMapping("by/byApplyAudit/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.byApplyAuditService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("by/byApplyAudit/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.byApplyAuditService.find(id));
+    }
+    
+    @RequestMapping("by/byApplyAudit/listByApply")
+    public Ajax listByApply(Integer apply_id) {
+        return new Ajax(this.byApplyAuditService.authList(apply_id));
+    }
+    
+}

+ 1913 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByApplyControl.java

@@ -0,0 +1,1913 @@
+package cn.hmsoft.ses.control.by;
+
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.UUID;
+
+import javax.imageio.ImageIO;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.xcwlkj.dfs.model.vo.DownloadVO;
+import com.xcwlkj.dfs.model.vo.UploadItemVO;
+import com.xcwlkj.dfs.model.vo.UploadVO;
+import com.xcwlkj.dfs.util.XcDfsClient;
+
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.service.IFrameParamService;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.helper.DateHelper;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.common.StdConst.StudentType;
+import cn.hmsoft.ses.constants.ByConst.ByApplyType;
+import cn.hmsoft.ses.constants.ByConst.ByStatus;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.model.by.ByApply;
+import cn.hmsoft.ses.data.model.by.ByTimeConfig;
+import cn.hmsoft.ses.data.model.by.ByXueXin;
+import cn.hmsoft.ses.data.model.by.ByXueXinLog;
+import cn.hmsoft.ses.data.model.by.ByXueXinRequest;
+import cn.hmsoft.ses.data.model.by.ByXueXinResponse;
+import cn.hmsoft.ses.data.model.cf.CfOrganization;
+import cn.hmsoft.ses.data.model.pl.PlExamTime;
+import cn.hmsoft.ses.data.model.pl.PlMajor;
+import cn.hmsoft.ses.data.model.pl.PlMajorOldNew;
+import cn.hmsoft.ses.data.model.std.StdBlackList;
+import cn.hmsoft.ses.data.model.std.StdMajor;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.data.model.sys.SysOperateFail;
+import cn.hmsoft.ses.helper.YearCodeHelper;
+import cn.hmsoft.ses.service.iface.by.IByApplyService;
+import cn.hmsoft.ses.service.iface.by.IByDiaplmaService;
+import cn.hmsoft.ses.service.iface.by.IByTimeConfigService;
+import cn.hmsoft.ses.service.iface.by.IByXueXinLogService;
+import cn.hmsoft.ses.service.iface.by.IByXueXinService;
+import cn.hmsoft.ses.service.iface.cf.ICfOrganizationService;
+import cn.hmsoft.ses.service.iface.mk.IMkPreEduApplyService;
+import cn.hmsoft.ses.service.iface.pl.IPlExamTimeService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdRegInfoService;
+import cn.hmsoft.ses.service.iface.sys.ISysOperateFailService;
+import cn.hmsoft.ses.util.ImageUtil;
+import cn.hmsoft.ses.util.UdmpUtil;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ * 毕业申请表 控制器-考生端.
+ * 
+ * @author: zq
+ * @date: 2019-03-14 13:39:18
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class ByApplyControl extends AjaxControl {
+	@Autowired
+	private IStdRegInfoService stdRegInfoService;// 学生服务
+	@Autowired
+	private IPlMajorService plMajorService;// 专业服务
+	@Autowired
+	private IByApplyService byApplyService;// 毕业申请服务
+	@Autowired
+	private IPlExamTimeService examTimeService;// 时间批次服务
+	@Autowired
+	private IStdMajorService stdMajorService;// 学生注册服务
+	@Autowired
+	private IByTimeConfigService byTimeConfigService;// 毕业时间配置服务
+
+	@Autowired
+	private IMkPreEduApplyService mkPreEduApplyService;// 前置学历
+	@Autowired
+	private IByDiaplmaService byDiaplmaService;// 毕业证书号
+	@Autowired
+	private ICfOrganizationService cfOrganizationService;
+	@Autowired
+	private IByXueXinService byXueXinService;
+	@Autowired
+	private IByXueXinLogService byXueXinLogService;
+	@Autowired
+	private ISysOperateFailService sysOperateFailService;
+
+	@Autowired
+	private IFrameParamService frameParamService;
+
+	/**
+	 * 分页查询-考试毕业申请列表.
+	 * 
+	 * @param query
+	 * @param limit
+	 * @param start
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	@RequestMapping("by/byApply/page")
+	public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (login != null) {
+			return new Ajax(
+					this.byApplyService.page(login.getId(), query, start, limit, this.getQueryOrder(order, type)));
+		}
+		return new Ajax(new Pager());
+	}
+
+	/**
+	 * 毕业申请基础信息.
+	 * 
+	 * @return
+	 */
+	@RequestMapping("by/byApply/applybaseinfo")
+	public Ajax applyBaseInfo() {
+		boolean canApply = false;
+		ByTimeConfig byTimeConfig = null;
+		List<StdMajor> majorList = null;
+		// 学生注册信息
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (login != null) {
+			String yearCode = YearCodeHelper.getByCurrentYearCode();
+			List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+			if (examTimeList != null && examTimeList.size() > 0) {
+				Map<String, Object> map = new HashMap<String, Object>();
+				map.put("status", 1);// 启用的
+				map.put("student_type", login.getStd_source());// 学生类型
+				map.put("exam_time_id", examTimeList.get(0).getId());
+				List<ByTimeConfig> timeConfigList = this.byTimeConfigService.listByMap(map);
+				if (timeConfigList != null && timeConfigList.size() > 0) {
+					LocalDateTime now = null;
+					ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+					if (null != time && null != time.getApply_start_time()) {
+						now = time.getApply_start_time();
+					} else {
+						now = LocalDateTime.now();
+					}
+
+					// 毕业时间配置对象
+					byTimeConfig = timeConfigList.get(0);
+					canApply = DateHelper.isBetween(now, byTimeConfig.getApply_start_time(),
+							byTimeConfig.getApply_end_time());
+
+				} else {
+					LogHelper.error("毕业时间配置为空.");
+				}
+			} else {
+				LogHelper.error("年度码 " + yearCode + " 对应的时间批次查询为空.");
+			}
+			// 考生报考的专业信息
+			majorList = this.stdMajorService.findStdMajors(login.getId());
+		}
+		final Map<String, Object> retMap = new HashMap<String, Object>();
+		retMap.put("canApply", canApply);// 是否能申请
+		retMap.put("byTimeConfig", byTimeConfig);// 毕业申请时间配置
+		retMap.put("majorList", majorList);// 考生报考的专业信息,创建毕业申请会用到
+		return new Ajax(retMap);
+	}
+	
+	
+	private String isSysOperateFail(String account,String operate_type,Integer second){
+		SysOperateFail fail = this.sysOperateFailService.querySysOperateFailByAccount(account, operate_type, second);
+		if(null != fail){
+			if(fail.getFail_count()>=fail.getMax_count()){
+				return fail.getFail_remark();
+			}
+		}
+		
+		return null;
+	}
+
+	private void setSysOperateFail(String account,String operate_type,Integer max_count,Integer second,String fail_remark){
+		SysOperateFail fail = this.sysOperateFailService.querySysOperateFailByAccount(account, operate_type, second);
+		if(null == fail){
+			fail = new SysOperateFail();
+			fail.setAccount(account);
+			fail.setFail_count(1);
+			fail.setMax_count(max_count);
+			fail.setFail_remark(fail_remark);
+			fail.setOperate_type(operate_type);
+			
+			this.sysOperateFailService.insert(fail);
+		}else{
+			fail.setFail_count(fail.getFail_count()+1);
+			
+			LocalDateTime now = this.sysOperateFailService.getDataBaseTime().getOperate_time();
+			fail.setOperate_time(now);
+			
+			this.sysOperateFailService.edit(fail);
+		}
+	}
+
+	@RequestMapping("by/byApply/queryEduXLQrcode")
+	public Ajax queryEduXLQrcode(Integer std_id) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (null != std_id && login.getId().intValue() != std_id.intValue()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		if (StringUtils.isEmpty(login.getStd_name())) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("账号的姓名为空,请先完善账号信息。");
+			return ajax;
+		}
+
+		if (StringUtils.isEmpty(login.getCert_no())) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("账号的证件号为空,请先完善账号信息。");
+			return ajax;
+		}
+		
+		String error = this.isSysOperateFail(login.getCert_no(), "canXLTime", 30);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+		
+
+		String XXW_Resp = UdmpUtil.queryEduXLQrcode(login.getStd_name(), login.getCert_no().toUpperCase());
+
+		if (StringUtils.isEmpty(XXW_Resp)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("获取学信网学历认证二维码失败:返回报文为空。");
+			return ajax;
+		}
+
+		// 开始处理返回数据
+		JSONObject fromObject = null;
+		try {
+			fromObject = JSON.parseObject(XXW_Resp);
+		} catch (Exception e) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("获取学信网学历认证二维码失败:返回报文不是正确的JSON格式。");
+			return ajax;
+		}
+
+		// 返回码
+		Integer code = (Integer) fromObject.get("code");
+		if (null == code) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("获取学信网学历认证二维码失败:返回码为空。");
+			return ajax;
+		} else if (code.intValue() != 1) {
+			Ajax ajax = new Ajax();
+			String msg = (String) fromObject.get("msg");
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("获取学信网学历认证二维码失败:" + msg);
+			return ajax;
+		}
+
+		String bizSerialNum = (String) fromObject.get("bizSerialNum");
+		if (null == bizSerialNum) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("获取学信网学历认证二维码失败:流水号为空。");
+			return ajax;
+		}
+
+		// 插入毕业学历学籍信息表
+		ByXueXinLog byXueXin = new ByXueXinLog();
+		byXueXin.setStd_reg_id(login.getId());
+		byXueXin.setXm(login.getStd_name());
+		byXueXin.setZjhm(login.getCert_no());
+		byXueXin.setBizserialnum(bizSerialNum);
+		byXueXin.setStatus("认证中");
+		byXueXin.setCreate_oper(login.getId());
+		byXueXin.setXuexin_type("学历");
+
+		this.byXueXinLogService.insert(byXueXin);
+		
+		// 记录验证次数
+		this.setSysOperateFail(login.getCert_no(), "canXLTime", 5, 30, "学历认证累计超过5次,请30分钟之后再认证!");
+
+		return new Ajax(fromObject);
+	}
+
+	@RequestMapping("by/byApply/queryEduXJQrcode")
+	public Ajax queryEduXJQrcode(Integer std_id) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (null != std_id && login.getId().intValue() != std_id.intValue()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		if (StringUtils.isEmpty(login.getStd_name())) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("账号的姓名为空,请先完善账号信息。");
+			return ajax;
+		}
+
+		if (StringUtils.isEmpty(login.getCert_no())) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("账号的证件号为空,请先完善账号信息。");
+			return ajax;
+		}
+		
+		String error = this.isSysOperateFail(login.getCert_no(), "canXJTime", 30);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+
+		String XXW_Resp = UdmpUtil.queryEduXJQrcode(login.getStd_name(), login.getCert_no().toUpperCase());
+
+		if (StringUtils.isEmpty(XXW_Resp)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("获取学信网学籍认证二维码失败:返回报文为空。");
+			return ajax;
+		}
+
+		// 开始处理返回数据
+		JSONObject fromObject = null;
+		try {
+			fromObject = JSON.parseObject(XXW_Resp);
+		} catch (Exception e) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("获取学信网学籍认证二维码失败:返回报文不是正确的JSON格式。");
+			return ajax;
+		}
+
+		// 返回码
+		Integer code = (Integer) fromObject.get("code");
+		if (null == code) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("获取学信网学籍认证二维码失败:返回码为空。");
+			return ajax;
+		} else if (code.intValue() != 1) {
+			Ajax ajax = new Ajax();
+			String msg = (String) fromObject.get("msg");
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("获取学信网学籍认证二维码失败:" + msg);
+			return ajax;
+		}
+
+		String bizSerialNum = (String) fromObject.get("bizSerialNum");
+		if (null == bizSerialNum) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("获取学信网学籍认证二维码失败:流水号为空。");
+			return ajax;
+		}
+
+		// 插入毕业学历学籍信息表
+		ByXueXinLog byXueXin = new ByXueXinLog();
+		byXueXin.setStd_reg_id(login.getId());
+		byXueXin.setXm(login.getStd_name());
+		byXueXin.setZjhm(login.getCert_no());
+		byXueXin.setBizserialnum(bizSerialNum);
+		byXueXin.setStatus("认证中");
+		byXueXin.setCreate_oper(login.getId());
+		byXueXin.setXuexin_type("学籍");
+
+		this.byXueXinLogService.insert(byXueXin);
+		
+		// 记录验证次数
+		this.setSysOperateFail(login.getCert_no(), "canXJTime", 3, 30, "学籍认证累计超过3次,请30分钟之后再认证!");
+
+		return new Ajax(fromObject);
+	}
+
+	/**
+	 * 学历学籍认证成功回调接口
+	 * 
+	 * @return
+	 */
+	@RequestMapping("/edu/notice")
+	public ByXueXinResponse notice(@RequestBody ByXueXinRequest request) {
+		ByXueXinResponse response = new ByXueXinResponse();
+		if (Objects.isNull(request)) {
+			response.setResult("error");
+			LogHelper.info("处理学信网数据推送失败:请求信息为空");
+			return response;
+		}
+
+		LogHelper.info("处理学信网数据推送,表单数据:" + JSON.toJSONString(request));
+
+		if (StringUtils.isEmpty(request.getBizSerialNum())) {
+			response.setResult("error");
+			LogHelper.info("处理学信网数据推送失败:流水号为空");
+			return response;
+		}
+
+		if (null == request.getData()) {
+			response.setResult("error");
+			LogHelper.info("处理学信网数据推送失败:业务数据为空");
+			return response;
+		}
+
+		// 根据流水号获取学历认证信息
+		ByXueXinLog byXueXinLog = this.byXueXinLogService.queryByXueXinByBizSerialNum(request.getBizSerialNum());
+		if (null == byXueXinLog) {
+			response.setResult("error");
+			LogHelper.info("处理学信网数据推送失败:根据流水号" + request.getBizSerialNum() + "查询学历学籍认证表信息为空");
+			return response;
+		}
+		
+		String temp_cert_no = byXueXinLog.getZjhm();
+		
+		// 学信网返回的是15位身份证号时,使用18位对应的15位身份证号进行对比
+		if(null != request.getData().getZjhm() && request.getData().getZjhm().length() == 15){
+			if(temp_cert_no.length() == 18){
+				// 18位身份证对应的15位身份证号
+				temp_cert_no = temp_cert_no.substring(0, 6)+temp_cert_no.substring(8, 17);
+			}
+		}
+		
+					
+		if (temp_cert_no.equals(request.getData().getZjhm())
+				&& byXueXinLog.getXm().equals(request.getData().getXm())) {
+			byXueXinLog.setStatus("认证成功");
+		} else {
+			byXueXinLog.setStatus("认证失败");
+		}
+
+		
+		byXueXinLog.setYxmc(request.getData().getYxmc());
+		byXueXinLog.setZymc(request.getData().getZymc());
+		byXueXinLog.setCc(request.getData().getCc());
+		byXueXinLog.setXxxs(request.getData().getXxxs());
+		byXueXinLog.setXllb(request.getData().getXllb());
+		byXueXinLog.setRxnf(request.getData().getRxnf());
+		byXueXinLog.setRxrq(request.getData().getRxrq());
+		byXueXinLog.setYjbynf(request.getData().getYjbynf());
+		byXueXinLog.setYjbyrq(request.getData().getYjbyrq());
+		byXueXinLog.setBynf(request.getData().getBynf());
+		byXueXinLog.setByrq(request.getData().getByrq());
+		byXueXinLog.setBjyjl(request.getData().getBjyjl());
+				
+		this.byApplyService.notice(byXueXinLog,request);
+
+		response.setResult("success");
+		return response;
+	}
+
+	@RequestMapping("by/byApply/queryEduIsSuccess")
+	public Ajax queryEduIsSuccess(String bizSerialNum, Integer std_id) {
+		Ajax ajax = new Ajax();
+
+		if (StringUtils.isEmpty(bizSerialNum)) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("认证编号不能为空!");
+			return ajax;
+		}
+
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (null == std) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("未登录,请登录系统!");
+			return ajax;
+		}
+
+		if (null != std_id && std.getId().intValue() != std_id.intValue()) {
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		// 根据流水号获取学历认证信息
+		ByXueXinLog byXueXin = this.byXueXinLogService.queryByXueXinByBizSerialNum(bizSerialNum);
+		if (null == byXueXin) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("认证编号" + bizSerialNum + "不存在");
+			return ajax;
+		}
+
+		if (!"学历".equals(byXueXin.getXuexin_type())) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("认证类型不属于学历认证");
+			return ajax;
+		}
+
+		if ("认证中".equals(byXueXin.getStatus())) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("学历认证不通过,请上传前置学历证明材料或重新扫描二维码进行学历认证");
+			return ajax;
+		} else if ("认证失败".equals(byXueXin.getStatus())) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("学信网姓名和证件号码与本次发起学历认证的姓名和证件号码不匹配");
+			return ajax;
+		}
+
+		return ajax;
+
+	}
+	
+	@RequestMapping("by/byApply/queryEduXLIsSuccess")
+	public Ajax queryEduXLIsSuccess(String bizSerialNum, Integer std_id) {
+		Ajax ajax = new Ajax();
+
+		if (StringUtils.isEmpty(bizSerialNum)) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("认证编号不能为空!");
+			return ajax;
+		}
+
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (null == std) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("未登录,请登录系统!");
+			return ajax;
+		}
+
+		if (null != std_id && std.getId().intValue() != std_id.intValue()) {
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		// 根据流水号获取学历认证信息
+		ByXueXinLog byXueXin = this.byXueXinLogService.queryByXueXinByBizSerialNum(bizSerialNum);
+		if (null == byXueXin) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("认证编号" + bizSerialNum + "不存在");
+			return ajax;
+		}
+
+		if (!"学历".equals(byXueXin.getXuexin_type())) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("认证类型不属于学历认证");
+			return ajax;
+		}
+
+		if ("认证中".equals(byXueXin.getStatus())) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("学历认证不通过,请重新扫描二维码进行学历认证");
+			return ajax;
+		} else if ("认证失败".equals(byXueXin.getStatus())) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("学信网姓名和证件号码与本次发起学历认证的姓名和证件号码不匹配");
+			return ajax;
+		}
+
+		return ajax;
+
+	}
+
+	@RequestMapping("by/byApply/queryEduXJIsSuccess")
+	public Ajax queryEduXJIsSuccess(String bizSerialNum, Integer std_id) {
+		Ajax ajax = new Ajax();
+
+		if (StringUtils.isEmpty(bizSerialNum)) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("认证编号不能为空!");
+			return ajax;
+		}
+
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (null == std) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("未登录,请登录系统!");
+			return ajax;
+		}
+
+		if (null != std_id && std.getId().intValue() != std_id.intValue()) {
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		// 根据流水号获取学历认证信息
+		ByXueXinLog byXueXin = this.byXueXinLogService.queryByXueXinByBizSerialNum(bizSerialNum);
+		if (null == byXueXin) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("认证编号" + bizSerialNum + "不存在");
+			return ajax;
+		}
+
+		if (!"学籍".equals(byXueXin.getXuexin_type())) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("认证类型不属于学历认证");
+			return ajax;
+		}
+
+		if ("认证中".equals(byXueXin.getStatus())) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("学籍认证不通过,请在学信网手机APP上完成学籍认证或重新扫描二维码进行学籍认证。");
+			return ajax;
+		} else if ("认证失败".equals(byXueXin.getStatus())) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("学信网姓名和证件号码与本次发起学籍认证的姓名和证件号码不匹配");
+			return ajax;
+		}
+
+		return ajax;
+
+	}
+
+	@RequestMapping("by/byApply/queryEdu")
+	public Ajax queryEdu(Integer std_id, String edu_type) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (null != std_id && login.getId().intValue() != std_id.intValue()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		ByXueXin byXueXin = this.byXueXinService.queryEdu(login.getId(), edu_type);
+		return new Ajax(byXueXin);
+	}
+
+	/**
+	 * 获取毕业核实信息-申请详情.
+	 * 
+	 * @param stdId
+	 * @param majorId
+	 * @return
+	 */
+	@RequestMapping("by/byApply/educertified")
+	public Ajax educertified(Integer stdId, Integer majorId, Integer schoolId) {
+
+		final Map<String, Object> retMap = new HashMap<String, Object>();
+		Ajax ajax = new Ajax(retMap);
+
+		List<StdBlackList> blackList = null;
+		ByTimeConfig byTimeConfig = null;
+		boolean paperFailed = false;
+		boolean inBlackList = false;
+		boolean isNeedPreEduApply = false;
+		boolean isXueXinWPass = true;
+		List<Map<String, Object>> courseScoreList = null;
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+		PlMajor major = this.plMajorService.find(majorId);
+
+		this.checkMajorValidate(login.getId(), major);
+		if (login != null) {
+			String yearCode = YearCodeHelper.getByCurrentYearCode();
+			List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+			if (examTimeList != null && examTimeList.size() > 0) {
+				Map<String, Object> map = new HashMap<String, Object>();
+				map.put("status", 1);// 启用的
+				map.put("student_type", login.getStd_source());// 学生类型
+				map.put("exam_time_id", examTimeList.get(0).getId());
+				List<ByTimeConfig> timeConfigList = this.byTimeConfigService.listByMap(map);
+				if (timeConfigList != null && timeConfigList.size() > 0) {
+					// 毕业时间配置对象
+					byTimeConfig = timeConfigList.get(0);
+
+				} else {
+					LogHelper.error("毕业时间配置为空.");
+				}
+			}
+
+			// 在进入此方法之前,前置学历已经认证通过,这个方法不再认证
+			// 本科必须有前置学历认证
+			/*
+			 * FrameAssertUtil.isNotNull(major.getMajor_level(), "专业层次属性不能为空!");
+			 * if (major.getMajor_level() == EduLevel.B.ordinal()) {
+			 * List<MkPreEduApply> preEduList =
+			 * this.mkPreEduApplyService.findPreEduApplys(login.getId(), null);
+			 * if (preEduList == null || preEduList.size() == 0) {
+			 * isNeedPreEduApply = true; try { // 学信网验证 String XXW_Resp =
+			 * UdmpUtil.querXUEXinXL(login.getStd_name(), login.getCert_no());
+			 * if (!StringUtils.isEmpty(XXW_Resp)) {
+			 * if(XXW_Resp.indexOf("<zjhm>") != -1){ isNeedPreEduApply = false;
+			 * isXueXinWPass = true;
+			 * 
+			 * // 学历认证通过,更新学历认证信息表 updateByXueXin(XXW_Resp, login); }else{
+			 * ajax.setSuccess(false);
+			 * ajax.setErrorMsg("学信网前置学历认证接口异常:"+XXW_Resp); }
+			 * 
+			 * } } catch (Exception e) { ajax.setSuccess(false);
+			 * ajax.setErrorMsg("学信网前置学历认证接口异常。");
+			 * 
+			 * LogHelper.error(e); } }
+			 * 
+			 * 
+			 * isXueXinWPass = true; }else{ //专科无需认证 isXueXinWPass = true; }
+			 */
+
+			// 查询毕业对应的课程信息
+			courseScoreList = this.byApplyService.getCourseScoreList(null, major.getId(), login.getId(), schoolId,
+					login.getStd_source());
+			// 黑名单
+			// blackList =
+			// this.stdBlackListService.findByBlackLists(login.getTicket_no());
+		}
+		// 主考院校
+		Integer school_id = login.getSchool_id();
+		if (school_id != null) {
+			CfOrganization school_org = this.cfOrganizationService.find(school_id);
+			login.setSchool_name(school_org.getOrg_name());
+		}
+		// 省市县 老数据 考生
+		String enrol_county_city = login.getEnrol_county_city();
+		String belong_city_id = login.getBelong_city_id();
+		Map<String, Object> countryCityMap = new HashMap<String, Object>();
+		if (!StringUtils.isEmpty(enrol_county_city) && !StringUtils.isEmpty(belong_city_id)) {
+			countryCityMap = this.byApplyService.getCountryCityMap(enrol_county_city, belong_city_id);
+		}
+
+		retMap.put("countryCityMap", countryCityMap);
+		retMap.put("major", major);// 选择的毕业专业
+		retMap.put("stdRegInfo", login);// 当前考生信息
+		// retMap.put("isAllowGraduate", major.getIs_allow_graduate());//是否允许毕业
+		retMap.put("byTimeConfig", byTimeConfig);// 毕业申请时间配置
+		retMap.put("inBlackList", inBlackList);// 是否在黑名单
+		retMap.put("blackList", blackList);// 黑名单列表
+		retMap.put("isNeedPreEduApply", isNeedPreEduApply);// 是否需要前置学历认证
+		retMap.put("isXueXinWPass", isXueXinWPass);// 学信网验证
+		retMap.put("courseScoreList", courseScoreList);// 专业课程成绩
+		retMap.put("paperFailed", paperFailed);// 论文是
+		retMap.put("diaplmaNo", this.byDiaplmaService.buildDiaplmaNo(login.getId(), majorId));
+		return ajax;
+	}
+
+	@RequestMapping("by/byApply/checkPhoto")
+	public Ajax checkPhoto(Integer id, Integer std_id) {
+		final Map<String, Object> retMap = new HashMap<String, Object>();
+		Ajax ajax = new Ajax(retMap);
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(login, "未登录,请登录系统");
+
+		if (null != std_id && login.getId().intValue() != std_id.intValue()) {
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		StringBuffer sb = new StringBuffer();
+
+		String photo_url = login.getPhoto_path();
+
+		if (null != id) {
+			ByApply apply = this.byApplyService.find(id);
+			if (null != apply && !StringUtils.isEmpty(apply.getBy_photo_path())) {
+				photo_url = apply.getBy_photo_path();
+			}
+		}
+
+		// 校验照片不能够小于指定高宽
+		if (null != photo_url) {
+			// 计算宽高
+			BufferedImage bim = null;
+			FileOutputStream fos = null;
+
+			try {
+				if (photo_url.toLowerCase().lastIndexOf("jpg") == -1
+						&& photo_url.toLowerCase().lastIndexOf("jpeg") == -1) {
+					sb.append("照片文件类型必须是jpg/jpeg文件。\n");
+				}
+
+				// 从恒生文件服务器下载照片
+				DownloadVO vo = XcDfsClient.download(photo_url);
+
+				// 创建临时照片文件
+				File url = new File(SysConst.getAppConfig().getDownloadTemp() + File.separator + UUID.randomUUID());
+				fos = new FileOutputStream(url);
+
+				// 读取恒生照片流量
+				InputStream in = new ByteArrayInputStream(vo.getContent());
+
+				// 将恒生照片流写入临时照片文件
+				int len = 0;
+				byte[] buf = new byte[1024];
+				while ((len = in.read(buf)) != -1) {
+					fos.write(buf, 0, len);
+				}
+
+				fos.flush();
+				fos.close();
+
+				bim = ImageIO.read(url);
+
+				int imgWidth = bim.getWidth();
+				int imgHeight = bim.getHeight();
+
+				// 判断大小,宽不能小于90,大于480,毕业上报国家时可以压缩.
+				if (imgWidth != 480) {
+					sb.append("照片宽度必须是480。\n");
+				}
+
+				// 判断大小高度不能小于100,大于640,毕业上报国家时可以压缩
+				if (imgHeight != 640) {
+					sb.append("照片高度必须是640。\n");
+				}
+
+				if (url.length() < 20 * 1024) {
+					sb.append("照片大小不允许小于20KB。\n");
+				}
+
+				if (url.length() > 40 * 1024) {
+					sb.append("照片大小不允许大于40KB。\n");
+				}
+
+				String type = ImageUtil.getPicType(new FileInputStream(url));
+
+				if (!ImageUtil.TYPE_JPG.equals(type)) {
+					sb.append("照片类型必须是jpg格式(非jpg格式修改文件后缀为jpg无效)。\n");
+				}
+
+				url.delete();
+
+			} catch (Exception e) {
+				LogHelper.error(e);
+				if (null != fos) {
+					try {
+						fos.close();
+					} catch (IOException e1) {
+						LogHelper.error(e1);
+					}
+				}
+
+				sb.append(e.getMessage());
+
+			}
+		}
+
+		retMap.put("checkPhoto", sb.toString());
+
+		return ajax;
+	}
+
+	public void updateByXueXin(String XXW_Resp, StdRegInfo std) {
+		// 学历难返回参数不为空时,更新学历认证信息表
+		if (null != XXW_Resp) {
+			ByXueXin byXueXin = null;
+			// 根据考生ID获取学历认证信息
+			List<ByXueXin> list = this.byXueXinService.queryByXueXinByStdRegId(std.getId());
+
+			if (null != list && !list.isEmpty()) {
+				byXueXin = list.get(0);
+			} else {
+				byXueXin = new ByXueXin();
+			}
+
+			String flag_start = "<xm>";
+			String flag_end = "</xm>";
+
+			// 解析报文获取学历认证信息
+			if (XXW_Resp.indexOf(flag_start) != -1 && XXW_Resp.indexOf(flag_end) != -1) {
+				byXueXin.setXm(XXW_Resp.substring(XXW_Resp.indexOf(flag_start) + flag_start.length(),
+						XXW_Resp.indexOf(flag_end)));
+			}
+
+			flag_start = "<zjhm>";
+			flag_end = "</zjhm>";
+			if (XXW_Resp.indexOf(flag_start) != -1 && XXW_Resp.indexOf(flag_end) != -1) {
+				byXueXin.setZjhm(XXW_Resp.substring(XXW_Resp.indexOf(flag_start) + flag_start.length(),
+						XXW_Resp.indexOf(flag_end)));
+			}
+
+			flag_start = "<yxmc>";
+			flag_end = "</yxmc>";
+			if (XXW_Resp.indexOf(flag_start) != -1 && XXW_Resp.indexOf(flag_end) != -1) {
+				byXueXin.setYxmc(XXW_Resp.substring(XXW_Resp.indexOf(flag_start) + flag_start.length(),
+						XXW_Resp.indexOf(flag_end)));
+			}
+
+			flag_start = "<zymc>";
+			flag_end = "</zymc>";
+			if (XXW_Resp.indexOf(flag_start) != -1 && XXW_Resp.indexOf(flag_end) != -1) {
+				byXueXin.setZymc(XXW_Resp.substring(XXW_Resp.indexOf(flag_start) + flag_start.length(),
+						XXW_Resp.indexOf(flag_end)));
+			}
+
+			flag_start = "<byrq>";
+			flag_end = "</byrq>";
+			if (XXW_Resp.indexOf(flag_start) != -1 && XXW_Resp.indexOf(flag_end) != -1) {
+				byXueXin.setByrq(XXW_Resp.substring(XXW_Resp.indexOf(flag_start) + flag_start.length(),
+						XXW_Resp.indexOf(flag_end)));
+			}
+
+			byXueXin.setCreate_oper(std.getId());
+
+			LocalDateTime now = null;
+			ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+			if (null != time && null != time.getApply_start_time()) {
+				now = time.getApply_start_time();
+			} else {
+				now = LocalDateTime.now();
+			}
+
+			byXueXin.setCreate_date(now);
+
+			// 如果已经存在,则更新
+			if (null != byXueXin.getId()) {
+				this.byXueXinService.edit(byXueXin);
+			} else {
+				// 如果不存在,则插入
+				byXueXin.setStd_reg_id(std.getId());
+
+				this.byXueXinService.insert(byXueXin);
+			}
+
+		}
+
+	}
+
+	private void checkMajorValidate(Integer stdRegId, PlMajor major) {
+		Map<String, Object> param1 = new HashMap<String, Object>();
+		param1.put("status", ByStatus.ARCHIVED_5.ordinal());
+		param1.put("major_id", major.getId());
+		param1.put("std_id", stdRegId);
+		List<ByApply> applist = this.byApplyService.listByMap(param1, new QueryOrder("id"));
+		FrameAssertUtil.isEmpty(applist, "该专业已经毕业,不能重复申请!");
+		if (major.getIs_new_major() != null && major.getIs_new_major() == 1) {
+			Map<String, Object> param2 = new HashMap<String, Object>();
+			param2.put("new_major_id", major.getId());
+			List<PlMajorOldNew> oldNewList = this.byApplyService.listByMap(PlMajorOldNew.class, param2,
+					new QueryOrder("id"));
+			for (PlMajorOldNew on : oldNewList) {
+				Map<String, Object> param3 = new HashMap<String, Object>();
+				param3.put("status", ByStatus.ARCHIVED_5.ordinal());
+				param3.put("major_id", on.getOld_major_id());
+				param3.put("std_id", stdRegId);
+				List<ByApply> applist3 = this.byApplyService.listByMap(param3, new QueryOrder("id"));
+				FrameAssertUtil.isEmpty(applist3, "新专业对应老专业已经毕业,不能重复申请!");
+			}
+		}
+	}
+
+	/**
+	 * 毕业判定.
+	 * 
+	 * @param stdId
+	 * @author majorId
+	 * @return
+	 */
+	@RequestMapping("by/byApply/determine")
+	public Ajax edit(Integer stdId, Integer majorId) {
+		// 返回该考生,该专业 缺考的课程列表
+
+		return new Ajax();
+	}
+
+	/**
+	 * 提交新申请-提交到审批.
+	 * 
+	 * @param byApply
+	 * @return
+	 */
+	@RequestMapping("by/byApply/apply")
+	public Ajax apply(ByApply byApply) {
+		FrameAssertUtil.isNotEmpty(byApply.getMajor_id().toString(), "专业数据不能为空!");
+		// FrameAssertUtil.isNotEmpty(byApply.getBy_time_config_id().toString(),
+		// "毕业时间配置不能为空!");
+
+		StdRegInfo std = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		byApply.setStd_id(std.getId());
+		// 前端传值
+		byApply.setTicket_no(std.getTicket_no());
+
+		FrameAssertUtil.isNotEmpty(byApply.getTicket_no(), "准考证号不能为空!");
+		
+		boolean canApply = false;
+		ByTimeConfig byTimeConfig = null;
+
+		String yearCode = YearCodeHelper.getByCurrentYearCode();
+		List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+		Integer exam_time_id = null;
+
+		if (examTimeList != null && examTimeList.size() > 0) {
+			exam_time_id = examTimeList.get(0).getId();
+			Map<String, Object> map = new HashMap<String, Object>();
+			map.put("status", 1);// 启用的
+			map.put("student_type", std.getStd_source());// 学生类型
+			map.put("exam_time_id", exam_time_id);
+			List<ByTimeConfig> timeConfigList = this.byTimeConfigService.listByMap(map);
+			if (timeConfigList != null && timeConfigList.size() > 0
+					&& null != timeConfigList.get(0).getApply_start_time()
+					&& null != timeConfigList.get(0).getApply_end_time()) {
+				LocalDateTime now = null;
+				ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+				if (null != time && null != time.getApply_start_time()) {
+					now = time.getApply_start_time();
+				} else {
+					now = LocalDateTime.now();
+				}
+
+				// 毕业时间配置对象
+				byTimeConfig = timeConfigList.get(0);
+				canApply = DateHelper.isBetween(now, byTimeConfig.getApply_start_time(),
+						byTimeConfig.getApply_end_time());
+				if(!canApply){
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("不在本批次毕业申请时间范围之内,不允许提交毕业申请。");
+					return ajax;
+				}
+				
+			} else {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("当前毕业批次还未配置,不允许提交毕业申请。");
+				return ajax;
+			}
+		} else {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("当前年度码还未配置,不允许提交毕业申请。");
+			return ajax;
+		}
+		
+
+		LocalDateTime now = null;
+		ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+		if (null != time && null != time.getApply_start_time()) {
+			now = time.getApply_start_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+
+		byApply.setApply_date(now);
+
+		// 社会考生
+		if (std.getStd_source() == StudentType.SOCIAL.ordinal()) {
+			byApply.setCity_org_id(std.getExam_area_id());// 考区
+		}
+		// TODO 临时-需要后续改为json自动映射
+		if (StringHelper.isNotEmpty(byApply.getStd_birth_str())) {
+			if (byApply.getStd_birth_str().contains("-")) {
+				byApply.setStd_birth(DateHelper.parseDate(byApply.getStd_birth_str()));
+			} else {
+				byApply.setStd_birth(DateHelper.parseDateNoSplit(byApply.getStd_birth_str()));
+			}
+		}
+		byApply.setStatus(ByStatus.TO_FIRST_AUDIT_1.ordinal());// 待一级审核
+		byApply.setApply_type(ByApplyType.STD_APPLY.ordinal());// 考生端申请
+		byApply.setUpdate_time(now);
+
+		// 毕业申请
+		this.byApplyService.apply(byApply);
+		return new Ajax();
+	}
+
+	/**
+	 * 修改申请-再提交.
+	 * 
+	 * @param byApply
+	 * @return
+	 */
+	@RequestMapping("by/byApply/reApply")
+	public Ajax reApply(ByApply byApply) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		ByTimeConfig byTimeConfig = null;
+
+		String yearCode = YearCodeHelper.getByCurrentYearCode();
+		List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+		LocalDateTime now = null;
+		ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+		if (null != time && null != time.getApply_start_time()) {
+			now = time.getApply_start_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+
+		if (examTimeList != null && examTimeList.size() > 0) {
+			Map<String, Object> map = new HashMap<String, Object>();
+			map.put("status", 1);// 启用的
+			map.put("student_type", login.getStd_source());// 学生类型
+			map.put("exam_time_id", examTimeList.get(0).getId());
+			List<ByTimeConfig> timeConfigList = this.byTimeConfigService.listByMap(map);
+			if (timeConfigList != null && timeConfigList.size() > 0) {
+				// 毕业时间配置对象
+				byTimeConfig = timeConfigList.get(0);
+
+				// 修改重新提交必须在现场确认时间结束之前
+				if (null != byTimeConfig.getSch_chk_end_time() && now.isAfter(byTimeConfig.getSch_chk_end_time())) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("毕业申请确认时间已经结束,不允许修改毕业申请单并提交。");
+					return ajax;
+				}
+			}
+		}
+
+		ByApply dbApply = this.byApplyService.find(byApply.getId());
+		FrameAssertUtil.isNotNull(dbApply, "找不到毕业申请记录!");
+
+		if (dbApply.getExam_time_id().intValue() != examTimeList.get(0).getId().intValue()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("毕业申请单的批次与当前毕业批次不一致,不允许修改毕业申请单并提交。");
+			return ajax;
+		}
+
+		// BUG后台处理:状态时待考生确认时,考生先点击网上确认按钮,然后再点击申请毕业按钮,最后可以提交成功且状态为待初审单位确认,这个场景是有业务问题的
+		// 优化:如果申请单状态是待考生网上确认,且考生没有考生确认结果,则报错
+		if (dbApply.getStatus().intValue() == 7 && StringUtils.isEmpty(byApply.getStd_confirm())) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("毕业申请单状态是待考生网上确认,请点击【网上确认】按钮,完成网上确认。");
+			return ajax;
+		}
+
+		dbApply.setRemark(byApply.getRemark());
+		if (StringUtils.isEmpty(byApply.getStd_confirm())) {
+			dbApply.setStatus(ByStatus.TO_FIRST_AUDIT_1.ordinal());// 待一级审核
+		} else {
+			dbApply.setStatus(8);
+		}
+
+		dbApply.setIs_auth_back(0);// 恢复为0;1是驳回
+		dbApply.setIs_firstauth_pass(null);// 清空初审通过
+		dbApply.setIs_xuexin_pass(byApply.getIs_xuexin_pass());
+		dbApply.setStd_confirm(byApply.getStd_confirm());
+
+		PlMajor oldMajor = plMajorService.find(dbApply.getMajor_id());
+		PlMajor newMajor = plMajorService.find(byApply.getMajor_id());
+
+		// 如果专业有修改,且修改前后专业层次不一样,则更新毕业证号
+		if (oldMajor.getMajor_level().intValue() != newMajor.getMajor_level().intValue()) {
+			dbApply.setDiaplma_no(this.byDiaplmaService.buildDiaplmaNo(dbApply.getStd_id(), byApply.getMajor_id()));
+		}
+
+		if (byApply.getMajor_id() != null) {
+			dbApply.setMajor_id(byApply.getMajor_id());
+		}
+		if (byApply.getStd_source() != null) {
+			dbApply.setStd_source(byApply.getStd_source());
+		}
+		if (byApply.getSchool_id() != null) {
+			dbApply.setSchool_id(byApply.getSchool_id());
+		}
+		if (byApply.getBy_time_config_id() != null) {
+			dbApply.setBy_time_config_id(byApply.getBy_time_config_id());
+		}
+		if (byApply.getStd_sex() != null) {
+			dbApply.setStd_sex(byApply.getStd_sex());
+		}
+		if (byApply.getNative_prov() != null) {
+			dbApply.setNative_prov(byApply.getNative_prov());
+		}
+		if (byApply.getNative_city() != null) {
+			dbApply.setNative_city(byApply.getNative_city());
+		}
+		if (byApply.getNation() != null) {
+			dbApply.setNation(byApply.getNation());
+		}
+		if (byApply.getPolitical() != null) {
+			dbApply.setPolitical(byApply.getPolitical());
+		}
+		if (byApply.getPre_edu() != null) {
+			dbApply.setPre_edu(byApply.getPre_edu());
+		}
+		if (byApply.getWork_unit() != null) {
+			dbApply.setWork_unit(byApply.getWork_unit());
+		}
+		if (byApply.getAddress() != null) {
+			dbApply.setAddress(byApply.getAddress());
+		}
+		if (byApply.getPost_code() != null) {
+			dbApply.setPost_code(byApply.getPost_code());
+		}
+
+		if (byApply.getTelephone() != null) {
+			dbApply.setTelephone(byApply.getTelephone());
+		}
+
+		if (byApply.getOrder_org_id() != null) {
+			dbApply.setOrder_org_id(byApply.getOrder_org_id());
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getBy_file())) {
+			// 去掉域名
+			if (byApply.getBy_file().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setBy_file(byApply.getBy_file().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setBy_file(byApply.getBy_file());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getBy_file_two())) {
+			// 去掉域名
+			if (byApply.getBy_file_two().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setBy_file_two(byApply.getBy_file_two().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setBy_file_two(byApply.getBy_file_two());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getBy_file_three())) {
+			// 去掉域名
+			if (byApply.getBy_file_three().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setBy_file_three(
+						byApply.getBy_file_three().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setBy_file_three(byApply.getBy_file_three());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getBy_file_four())) {
+			// 去掉域名
+			if (byApply.getBy_file_four().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setBy_file_four(byApply.getBy_file_four().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setBy_file_four(byApply.getBy_file_four());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getBy_file_five())) {
+			// 去掉域名
+			if (byApply.getBy_file_five().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setBy_file_five(byApply.getBy_file_five().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setBy_file_five(byApply.getBy_file_five());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getFile_path())) {
+			// 去掉域名
+			if (byApply.getFile_path().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setFile_path(byApply.getFile_path().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setFile_path(byApply.getFile_path());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getScore_file())) {
+			// 去掉域名
+			if (byApply.getScore_file().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setScore_file(byApply.getScore_file().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setScore_file(byApply.getScore_file());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getScore_file_two())) {
+			// 去掉域名
+			if (byApply.getScore_file_two().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setScore_file_two(
+						byApply.getScore_file_two().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setScore_file_two(byApply.getScore_file_two());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getScore_file_three())) {
+			// 去掉域名
+			if (byApply.getScore_file_three().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setScore_file_three(
+						byApply.getScore_file_three().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setScore_file_three(byApply.getScore_file_three());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getScore_file_four())) {
+			// 去掉域名
+			if (byApply.getScore_file_four().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setScore_file_four(
+						byApply.getScore_file_four().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setScore_file_four(byApply.getScore_file_four());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getScore_file_five())) {
+			// 去掉域名
+			if (byApply.getScore_file_five().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setScore_file_five(
+						byApply.getScore_file_five().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setScore_file_five(byApply.getScore_file_five());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getCert_file())) {
+			// 去掉域名
+			if (byApply.getCert_file().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setCert_file(byApply.getCert_file().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setCert_file(byApply.getCert_file());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getCert_file_two())) {
+			// 去掉域名
+			if (byApply.getCert_file_two().indexOf(SysConst.getAppConfig().getUploadBase()) != -1) {
+				dbApply.setCert_file_two(
+						byApply.getCert_file_two().replace(SysConst.getAppConfig().getUploadBase(), ""));
+			} else {
+				dbApply.setCert_file_two(byApply.getCert_file_two());
+			}
+
+		}
+
+		if (StringHelper.isNotEmpty(byApply.getStd_by_photo())) {
+			// 去掉域名
+			if (byApply.getStd_by_photo().indexOf("https://zk1.gxeea.cn:8001/ses-upload/") != -1) {
+				dbApply.setStd_by_photo(byApply.getStd_by_photo().replace("https://zk1.gxeea.cn:8001/ses-upload/", ""));
+			} else {
+				dbApply.setStd_by_photo(byApply.getStd_by_photo());
+			}
+
+		}
+
+		if (byApply.getStd_birth_str() != null) {
+			if (byApply.getStd_birth_str().contains("-")) {
+				dbApply.setStd_birth(DateHelper.parseDate(byApply.getStd_birth_str()));
+			} else {
+				dbApply.setStd_birth(DateHelper.parseDateNoSplit(byApply.getStd_birth_str()));
+			}
+		}
+		if (StringHelper.isNotEmpty(byApply.getResumeJson())) {
+			dbApply.setResumeJson(byApply.getResumeJson());
+		}
+
+		dbApply.setUpdate_time(now);
+
+		this.byApplyService.reApply(dbApply);
+		return new Ajax();
+	}
+
+	/**
+	 * 修改申请-再提交.
+	 * 
+	 * @param byApply
+	 * @return
+	 */
+	@RequestMapping("by/byApply/confirmByApply")
+	public Ajax confirmByApply(ByApply byApply) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		ByTimeConfig byTimeConfig = null;
+
+		String yearCode = YearCodeHelper.getByCurrentYearCode();
+		List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+		if (examTimeList != null && examTimeList.size() > 0) {
+			Map<String, Object> map = new HashMap<String, Object>();
+			map.put("status", 1);// 启用的
+			map.put("student_type", login.getStd_source());// 学生类型
+			map.put("exam_time_id", examTimeList.get(0).getId());
+			List<ByTimeConfig> timeConfigList = this.byTimeConfigService.listByMap(map);
+			if (timeConfigList != null && timeConfigList.size() > 0) {
+				LocalDateTime now = null;
+				ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+				if (null != time && null != time.getApply_start_time()) {
+					now = time.getApply_start_time();
+				} else {
+					now = LocalDateTime.now();
+				}
+
+				// 毕业时间配置对象
+				byTimeConfig = timeConfigList.get(0);
+
+				// 修改重新提交必须在现场确认时间结束之前
+				if (null != byTimeConfig.getSch_chk_end_time() && now.isAfter(byTimeConfig.getSch_chk_end_time())) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("毕业申请确认时间已经结束,不允许修改毕业申请单并提交。");
+					return ajax;
+				}
+			}
+		}
+
+		ByApply dbApply = this.byApplyService.find(byApply.getId());
+		FrameAssertUtil.isNotNull(dbApply, "找不到毕业申请记录!");
+
+		if (dbApply.getStatus().intValue() != 7) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("毕业申请单的状态不是待考生网上确认,不允许操作。");
+			return ajax;
+		}
+
+		dbApply.setStd_confirm(byApply.getStd_confirm());
+		
+		// 默认取毕业证书领取单位
+		Integer org_id = dbApply.getOrder_org_id();
+		
+		//如果是助学考生,则取主考学校
+		if(3 == dbApply.getStd_source().intValue()){
+			org_id = dbApply.getSchool_id();
+		}
+
+		// 20231204 by卿玲 考生确认无误,根据配置状态修改成考生已确认
+		// 根据受理单位查询配置信息
+		FrameParam param = this.frameParamService.find(FrameParam.class, "param_name",
+				"ByConfirm_" + org_id);
+		// 该受理单位配置考生确认后,状态为考生已确认,后续由受理单位进行一键报送
+		if (null != param && "Active".equals(param.getProtect_status())) {
+			dbApply.setStatus(8);// 考生已确认
+		} else {
+			// 20230704 考生确认无误后,状态为待自治区审核
+			if("1".equals(dbApply.getStd_confirm())){
+				dbApply.setStatus(2);
+			}else{
+				// 确认有误,状态为考生已确认
+				dbApply.setStatus(8);// 考生已确认
+			}
+			
+		}
+
+		LocalDateTime now = null;
+
+		ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+		if (null != time && null != time.getApply_start_time()) {
+			now = time.getApply_start_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+
+		dbApply.setUpdate_time(now);
+
+		// 更新毕业申请状态
+		this.byApplyService.edit(dbApply);
+		return new Ajax();
+	}
+
+	// @RequestMapping("by/byApply/delete")
+	public Ajax delete(Integer[] ids) {
+		for (Integer id : ids) {
+			this.byApplyService.delete(id);
+		}
+		return new Ajax();
+	}
+
+	@RequestMapping("by/byApply/get")
+	public Ajax get(Integer id) {
+		return new Ajax(this.byApplyService.find(id));
+	}
+
+	@RequestMapping("by/byApply/getdetail")
+	public Ajax getDetail(Integer id) {
+		Map<String, Object> map = new HashMap<String, Object>();
+		ByApply detail = this.byApplyService.getDetail(id);
+		FrameAssertUtil.isNotNull(detail, "找不到毕业申请记录!");
+		List<Map<String, Object>> scoreMap = this.byApplyService.getCourseScoreList(id, detail.getMajor_id(),
+				detail.getStd_id(), detail.getSchool_id(), detail.getStd_source());
+		map.put("detail", detail);
+		map.put("scoreMap", scoreMap);
+		return new Ajax(map);
+	}
+
+	@RequestMapping("by/byApply/getResumeList")
+	public Ajax getResuleList(Integer id) {
+		return new Ajax(this.byApplyService.getResuleList(id));
+	}
+
+	@RequestMapping("by/byApply/listAll")
+	public Ajax listAll(String query, Integer limit, Integer start, String order, String type) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		HashMap<String, Object> rtnMap = new HashMap<String, Object>();
+
+		boolean canApply = false;
+		boolean canAudit = false;
+		ByTimeConfig byTimeConfig = null;
+
+		String yearCode = YearCodeHelper.getByCurrentYearCode();
+		List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+		Integer exam_time_id = null;
+
+		if (examTimeList != null && examTimeList.size() > 0) {
+			exam_time_id = examTimeList.get(0).getId();
+			Map<String, Object> map = new HashMap<String, Object>();
+			map.put("status", 1);// 启用的
+			map.put("student_type", login.getStd_source());// 学生类型
+			map.put("exam_time_id", exam_time_id);
+			List<ByTimeConfig> timeConfigList = this.byTimeConfigService.listByMap(map);
+			if (timeConfigList != null && timeConfigList.size() > 0
+					&& null != timeConfigList.get(0).getApply_start_time()
+					&& null != timeConfigList.get(0).getApply_end_time()) {
+				LocalDateTime now = null;
+				ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+				if (null != time && null != time.getApply_start_time()) {
+					now = time.getApply_start_time();
+				} else {
+					now = LocalDateTime.now();
+				}
+
+				// 毕业时间配置对象
+				byTimeConfig = timeConfigList.get(0);
+				canApply = DateHelper.isBetween(now, byTimeConfig.getApply_start_time(),
+						byTimeConfig.getApply_end_time());
+
+				canAudit = DateHelper.isBetween(now, byTimeConfig.getSch_chk_start_time(),
+						byTimeConfig.getSch_chk_end_time());
+
+			} else {
+				LogHelper.error("毕业时间配置为空.");
+			}
+		} else {
+			LogHelper.error("考试时间配置为空.");
+		}
+
+		// List<StdMajor> majorList =
+		// this.stdMajorService.findStdMajors(login.getId());
+		// 开考专业
+		HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		paraMap.put("is_net_exam", 1);// 网考
+		paraMap.put("status", 1);// 开考
+
+		List<PlMajor> majorList = this.plMajorService.listByMap(paraMap);
+
+		rtnMap.put("canApply", canApply);// 是否能申请
+		rtnMap.put("canAudit", canAudit);
+		rtnMap.put("uploadBase", SysConst.getAppConfig().getUploadServerUrl());
+
+		rtnMap.put("byTimeConfig", byTimeConfig);// 毕业申请时间配置
+		rtnMap.put("applyList", this.byApplyService.ListAll(login.getId(), exam_time_id));
+		rtnMap.put("majorList", majorList);
+
+		FrameParam param = this.frameParamService.find(FrameParam.class, "param_name", "ByApplyControl");
+		if (null != param && "Active".equals(param.getProtect_status())) {
+			rtnMap.put("ByApplyControl", param.getParam_value());
+		} else {
+			rtnMap.put("ByApplyControl", "");
+		}
+
+		FrameParam loginParam = this.frameParamService.find(FrameParam.class, "param_name", "by_apply_note");
+
+		// 高等教育自学考试毕业申请现场确认考生防疫须知
+		if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+			rtnMap.put("by_apply_note", loginParam.getParam_value());
+		} else {
+			rtnMap.put("by_apply_note", "");
+		}
+
+		loginParam = this.frameParamService.find(FrameParam.class, "param_name", "by_apply_note_title");
+
+		if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+			rtnMap.put("by_apply_note_title", loginParam.getParam_value());
+		} else {
+			rtnMap.put("by_apply_note_title", "广西高等教育自学考试毕业申请现场确认考生防疫须知");
+		}
+
+		return new Ajax(rtnMap);
+	}
+
+	@RequestMapping("by/byApply/getAll")
+	public Ajax getAll() {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		HashMap<String, Object> rtnMap = new HashMap<String, Object>();
+		rtnMap.put("applyList", this.byApplyService.getAll(login.getId()));
+		return new Ajax(rtnMap);
+	}
+
+	@RequestMapping("by/byApply/getOlaMajorInfoBynewMajorId")
+	public Ajax getOlaMajorInfoBynewMajorId(Integer major_id) {
+		// major_id = 316822;
+		List<Map<String, Object>> mapList = this.plMajorService.getOlaMajorInfoBynewMajorId(major_id);
+		// if (mapList != null && mapList.size() > 0) {
+		// Map<String, Object> map = mapList.get(0);
+		// return new Ajax(map);
+		// }
+		return new Ajax(mapList);
+	}
+
+	@RequestMapping("by/byApply/getNewMajorInfoByOldMajorId")
+	public Ajax getNewMajorInfoByOldMajorId(Integer major_id) {
+		List<Map<String, Object>> mapList = this.plMajorService.getNewMajorInfoByOldMajorId(major_id);
+		return new Ajax(mapList);
+	}
+
+	@RequestMapping("pl/byApply/upload")
+	public Ajax upload(MultipartFile file) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		StdRegInfo dbStd = this.stdRegInfoService.find(login.getId());
+		if (dbStd != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStd);
+		}
+
+		Ajax ajax = new Ajax();
+		// if (file.getSize() > 50 * 1024) {
+		// throw new BusinessException("上传照片不能超过50KB!");
+		// }
+		// 上传路径
+		String fileDir = SysConst.getAppConfig().getUploadBase() + SysConst.getByPhotoPath(dbStd.getTicket_no());
+		File dir = new File(fileDir);
+		if (!dir.exists()) {
+			dir.mkdirs();
+		}
+		File desFile = new File(fileDir + dbStd.getTicket_no() + ".jpg");
+		try {
+			file.transferTo(desFile);
+
+			// ----------------------------考生照片上传恒生文件服务器开始-------------------------
+			String by_photo_path = null;
+			String by_photo_id = null;
+			UploadVO uploadVO = XcDfsClient.uploadStream(desFile.getPath());
+			List<UploadItemVO> uploadItems = uploadVO.getList();
+			if (null != uploadItems && !uploadItems.isEmpty()) {
+				UploadItemVO vo = uploadItems.get(0);
+				by_photo_path = vo.getFilePath();
+				by_photo_id = vo.getId();
+
+			} else {
+				throw new BusinessException("毕业照片上传文件服务器失败,请联系系统管理员!");
+			}
+			// ----------------------------考生照片上传恒生文件服务器结束-------------------------
+
+			Map<String, String> map = new HashMap<String, String>();
+			// db存储路径,注意与文件系统存储的路径不同,db不存uploadbase路径!
+			map.put("file_path", SysConst.getByPhotoPath(dbStd.getTicket_no()) + dbStd.getTicket_no() + ".jpg");
+			map.put("by_photo_path", by_photo_path);
+			map.put("by_photo_id", by_photo_id);
+			map.put("file_name", file.getOriginalFilename());
+			ajax.setMap(map);
+		} catch (IllegalStateException e) {
+			LogHelper.error(e);
+		} catch (IOException e) {
+			LogHelper.error(e);
+		}
+		return ajax;
+	}
+
+	@RequestMapping("pl/byApply/orderOrgList")
+	public Ajax orderOrgList() {
+		List<CfOrganization> list = this.cfOrganizationService.orderOrgList();
+		return new Ajax(list);
+	}
+
+	@RequestMapping("by/byApply/uploadStdByPhoto")
+	public Ajax uploadStdByPhoto(MultipartFile file) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		String filePath = this.uploadFile(std, std.getTicket_no(), file);
+		return new Ajax(filePath);
+	}
+
+	private String uploadFile(StdRegInfo std, String pro_code, MultipartFile file) {
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		if (StringHelper.isNotEmpty(extension)) {
+			extension = extension.toLowerCase();
+		}
+
+		// 校验文件类型
+		if (!"jpg".equals(extension) && !"jpeg".equals(extension)) {
+			throw new BusinessException("上传图片必须是jpg/jpeg格式!");
+		}
+
+		String cert_no = std.getCert_no();
+		String rootPath = SysConst.getAppConfig().getUploadBase();
+
+		String error = null;
+		String rtnName = null;
+		String fileSeq = this.mkPreEduApplyService.getFileSeq();
+		try {
+			makeDir(rootPath);
+			rtnName = SysConst.IMG_BY_PREFIX + cert_no + "_" + new Date().getTime() + "_" + fileSeq + "." + extension;
+			String fullFileName = rootPath + rtnName;
+			File img = new File(fullFileName);
+			file.transferTo(img);
+
+			error = this.checkPhoto(img);
+			if (!StringUtils.isEmpty(error)) {
+				img.delete();
+			}
+
+		} catch (Exception e) {
+			LogHelper.error(e);
+			throw new BusinessException("文件上传错误,请检查文件");
+		}
+
+		if (!StringUtils.isEmpty(error)) {
+			throw new BusinessException(error);
+		}
+
+		return rtnName;
+	}
+
+	private String checkPhoto(File file) {
+
+		StringBuffer sb = new StringBuffer();
+
+		// 校验照片不能够小于指定高宽
+
+		// 计算宽高
+		BufferedImage bim = null;
+
+		try {
+			bim = ImageIO.read(file);
+
+			int imgWidth = bim.getWidth();
+			int imgHeight = bim.getHeight();
+
+			// 判断大小,宽不能小于90,大于480,毕业上报国家时可以压缩.
+			if (imgWidth != 480) {
+				sb.append("照片宽度必须是480。");
+			}
+
+			// 判断大小高度不能小于100,大于640,毕业上报国家时可以压缩
+			if (imgHeight != 640) {
+				sb.append("照片高度必须是640。");
+			}
+
+			if (file.length() < 20 * 1024) {
+				sb.append("照片大小不允许小于20KB。");
+			}
+
+			if (file.length() > 40 * 1024) {
+				sb.append("照片大小不允许大于40KB。");
+			}
+
+			String type = ImageUtil.getPicType(new FileInputStream(file));
+
+			if (!ImageUtil.TYPE_JPG.equals(type)) {
+				sb.append("照片类型必须是jpg格式(非jpg格式修改文件后缀为jpg无效)。");
+			}
+
+		} catch (IOException e) {
+			LogHelper.error(e);
+		}
+
+		return sb.toString();
+
+	}
+
+	@RequestMapping("pl/byApply/uploadFile")
+	public Ajax uploadFile(MultipartFile file) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		if (StringHelper.isNotEmpty(extension)) {
+			extension = extension.toLowerCase();
+		}
+
+		ImageUtil.validateUploadFileForBy(file);
+
+		String cert_no = std.getCert_no();
+		String rootPath = SysConst.getAppConfig().getUploadBase();
+		String rtnName = null;
+		;
+		String fileSeq = this.mkPreEduApplyService.getFileSeq();
+		try {
+			makeDir(rootPath);
+			rtnName = SysConst.IMG_BY_PREFIX + cert_no + "_" + new Date().getTime() + "_" + fileSeq + "." + extension;
+			String fullFileName = rootPath + rtnName;
+			file.transferTo(new File(fullFileName));
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new BusinessException("文件上传错误,请检查文件");
+		}
+		return new Ajax(rtnName);
+	}
+
+	/**
+	 * @param rootPath:目录路径
+	 *            创建目录
+	 */
+	private void makeDir(String rootPath) {
+		File dir = new File(rootPath + SysConst.IMG_EDU_PREFIX);
+		if (!dir.exists())
+			dir.mkdir();
+	}
+
+	@RequestMapping("by/byApply/downByApplyRegisterPdf")
+	public void downByApplyRegisterPdf(Integer id) {
+		StdRegInfo std = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+		String file_name = null;
+
+		ByApply apply = this.byApplyService.find(id);
+
+		if (null == apply) {
+			this.writeAlert("申请单信息为空,请重新刷新页面。");
+			return;
+		} else if (apply.getStd_id().intValue() != std.getId()) {
+			this.writeAlert("申请单对应考生与当前登录考生账号不一致,请重新登录。");
+			return;
+		}
+
+		file_name = std.getTicket_no() + std.getStd_name() + "-毕业生登记表.pdf";
+
+		try {
+			this.downloadFile(this.byApplyService.getByApplyRegisterPdf(id), file_name, true);
+		} catch (Exception e) {
+			this.writeAlert(e.getMessage());
+		}
+
+	}
+
+	@RequestMapping("by/byApply/downByPhoto")
+	public void downByPhoto(Integer id, Integer std_id) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(login, "未登录,请登录系统");
+
+		if (null != std_id && login.getId().intValue() != std_id.intValue()) {
+			this.writeAlert("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			return;
+		}
+
+		ByApply apply = this.byApplyService.find(id);
+
+		if (null == apply) {
+			this.writeAlert("申请单信息为空,请重新刷新页面。");
+			return;
+		} else if (apply.getStd_id().intValue() != login.getId()) {
+			this.writeAlert("申请单对应考生与当前登录考生账号不一致,请重新登录。");
+			return;
+		} else if (null == apply.getBy_photo_path() && null == login.getPhoto_path()) {
+			this.writeAlert("毕业照片或考生照片为空。");
+			return;
+		}
+
+		FileOutputStream fos = null;
+		String photo_path = null;
+		try {
+			if (StringUtils.isEmpty(apply.getBy_photo_path())) {
+				photo_path = login.getPhoto_path();
+			} else {
+				photo_path = apply.getBy_photo_path();
+			}
+
+			// 从恒生文件服务器下载照片
+			DownloadVO vo = XcDfsClient.download(photo_path);
+
+			// 创建临时照片文件
+			File url = new File(SysConst.getAppConfig().getDownloadTemp() + File.separator + UUID.randomUUID());
+			fos = new FileOutputStream(url);
+
+			// 读取恒生照片流量
+			InputStream in = new ByteArrayInputStream(vo.getContent());
+
+			// 将恒生照片流写入临时照片文件
+			int len = 0;
+			byte[] buf = new byte[1024];
+			while ((len = in.read(buf)) != -1) {
+				fos.write(buf, 0, len);
+			}
+
+			fos.flush();
+			fos.close();
+
+			String file_name = login.getTicket_no() + login.getStd_name() + "-毕业照片.jpg";
+
+			this.downloadFile(url, file_name, true);
+
+		} catch (Exception e) {
+			LogHelper.error(e);
+			if (null != fos) {
+				try {
+					fos.close();
+				} catch (IOException e1) {
+					LogHelper.error(e1);
+				}
+			}
+
+			this.writeAlert(e.getMessage());
+
+		}
+
+	}
+
+}

+ 358 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByCertificateControl.java

@@ -0,0 +1,358 @@
+package cn.hmsoft.ses.control.by;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.frame.constants.FrameParamConstants;
+import cn.hmsoft.frame.data.model.FrameDict;
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.service.IFrameParamService;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.helper.DateHelper;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.model.by.ByApply;
+import cn.hmsoft.ses.data.model.by.ByCertificate;
+import cn.hmsoft.ses.data.model.by.ByTimeConfig;
+import cn.hmsoft.ses.data.model.cf.CfOrganization;
+import cn.hmsoft.ses.data.model.pl.PlExamTime;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.helper.YearCodeHelper;
+import cn.hmsoft.ses.service.iface.by.IByApplyService;
+import cn.hmsoft.ses.service.iface.by.IByCertificateService;
+import cn.hmsoft.ses.service.iface.by.IByTimeConfigService;
+import cn.hmsoft.ses.service.iface.pl.IPlExamTimeService;
+import cn.hmsoft.ses.service.iface.std.IStdRegInfoService;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.xcwlkj.dfs.model.vo.UploadItemVO;
+import com.xcwlkj.dfs.model.vo.UploadVO;
+import com.xcwlkj.dfs.util.XcDfsClient;
+
+/**
+ *  控制器.
+ * 
+ * @author: shudonghui
+ * @date: 2020-04-01 20:53:58
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class ByCertificateControl extends AjaxControl {
+
+    @Autowired
+    private IByCertificateService byCertificateService;
+	@Autowired
+	private IStdRegInfoService stdRegInfoService;//学生服务
+	@Autowired
+	private IPlExamTimeService examTimeService;// 时间批次服务
+	@Autowired
+	private IByTimeConfigService byTimeConfigService;// 毕业时间配置服务
+	
+    @Autowired
+    private IByApplyService byApplyService;//毕业申请服务
+    @Autowired
+    private IFrameParamService frameParamService;
+    
+    @RequestMapping("by/byCertificate/page")
+    public Ajax page() {
+        StdRegInfo login = (StdRegInfo)this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+        HashMap<String, Object> rtnMap = new HashMap<String, Object>();
+
+		boolean canApply = false;
+		ByTimeConfig byTimeConfig = null;
+
+		String yearCode = YearCodeHelper.getByCurrentYearCode();
+		List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+
+		if (examTimeList != null && examTimeList.size() > 0) {
+			Map<String, Object> map = new HashMap<String, Object>();
+			map.put("status", 1);// 启用的
+			map.put("student_type", login.getStd_source());// 学生类型
+			map.put("exam_time_id", examTimeList.get(0).getId());
+			List<ByTimeConfig> timeConfigList = this.byTimeConfigService.listByMap(map);
+			if (timeConfigList != null && timeConfigList.size() > 0) {
+				// 毕业时间配置对象
+				byTimeConfig = timeConfigList.get(0);
+				
+				LocalDate now = null;
+    			ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+    			if (null != time && null != time.getBy_date()) {
+    				now = time.getBy_date();
+    			} else {
+    				now = LocalDate.now();
+    			}
+
+				if (null != byTimeConfig.getCertificate_start_time() && null != byTimeConfig.getCertificate_end_time()
+						&& (byTimeConfig.getCertificate_start_time().isBefore(now)|| byTimeConfig.getCertificate_start_time().isEqual(now))
+						&& (byTimeConfig.getCertificate_end_time().isAfter(now)|| byTimeConfig.getCertificate_end_time().isEqual(now))) {
+					canApply = true;
+				}
+
+			} else {
+				LogHelper.error("毕业证明书申请时间配置为空.");
+			}
+		}
+        
+		rtnMap.put("canApply", canApply);// 是否能申请
+		rtnMap.put("StdRegInfo", login);
+		rtnMap.put("byTimeConfig", byTimeConfig);// 毕业申请时间配置
+		rtnMap.put("applyList", this.byCertificateService.page(login.getId()));
+		rtnMap.put("dictData", getDictMap());
+		//rtnMap.put("ByCertificateControl", FrameParamConstants.GobalParamMap.get("ByCertificateControl"));
+		
+		FrameParam param = this.frameParamService.find(FrameParam.class,"param_name", "ByCertificateControl");
+		if(null != param && "Active".equals(param.getProtect_status())){
+    		rtnMap.put("ByCertificateControl", param.getParam_value());
+    	}
+
+		return new Ajax(rtnMap);
+    }
+    
+    /**
+	 * 获取数据字典缓存
+	 * 
+	 * @return
+	 */
+	private Map<String, Object> getDictMap() {
+		Map<String, Object> dictMap = null;
+		dictMap = new HashMap<String, Object>();
+
+		List<FrameDict> majorLevelArray = FrameDictUtil.getFrameDict("MajorLevel");
+		List<CfOrganization> orgArray = this.stdRegInfoService.CfOrganizationList("1");
+		dictMap.put("orgArray", orgArray);
+		dictMap.put("majorLevelArray", majorLevelArray);
+		return dictMap;
+	}
+
+    
+    @RequestMapping("by/byCertificate/add")
+    public Ajax add(ByCertificate byCertificate) {
+    	StdRegInfo login = (StdRegInfo)this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+ 		ByTimeConfig byTimeConfig = null;
+
+ 		String yearCode = YearCodeHelper.getByCurrentYearCode();
+ 		List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+
+ 		if (examTimeList != null && examTimeList.size() > 0) {
+ 			Map<String, Object> map = new HashMap<String, Object>();
+ 			map.put("status", 1);// 启用的
+ 			map.put("student_type", login.getStd_source());// 学生类型
+ 			map.put("exam_time_id", examTimeList.get(0).getId());
+ 			List<ByTimeConfig> timeConfigList = this.byTimeConfigService.listByMap(map);
+ 			if (timeConfigList != null && timeConfigList.size() > 0) {
+ 				// 毕业时间配置对象
+ 				byTimeConfig = timeConfigList.get(0);
+ 				
+ 				LocalDate now = null;
+     			ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+     			if (null != time && null != time.getBy_date()) {
+     				now = time.getBy_date();
+     			} else {
+     				now = LocalDate.now();
+     			}
+
+ 				if (!(null != byTimeConfig.getCertificate_start_time() && null != byTimeConfig.getCertificate_end_time()
+ 						&& (byTimeConfig.getCertificate_start_time().isBefore(now)|| byTimeConfig.getCertificate_start_time().isEqual(now))
+ 						&& (byTimeConfig.getCertificate_end_time().isAfter(now)|| byTimeConfig.getCertificate_end_time().isEqual(now)))) {
+ 					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("不在本批次毕业证明书申请时间范围之内,不允许提交毕业证明书申请。");
+					return ajax;
+ 				}
+
+ 			} else {
+ 				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("毕业证明书申请时间配置为空,不允许提交毕业证明书申请。");
+				return ajax;
+ 			}
+ 		}else{
+ 			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("当前年度码还未配置,不允许提交毕业证明书申请。");
+			return ajax;
+ 		}
+ 		
+    	/*if (byCertificate.getId()==null) {
+        	List<ByCertificate> byCertificates=byCertificateService.findByStdAndTime(byCertificate.getStd_id(),byCertificate.getExam_time_id());
+        	//for (ByCertificate certificate : byCertificates) {
+    			if (byCertificates.size()>0) {
+    			//	return new Ajax(new AppException(10000, "不能重复申请!"));
+    			}
+    		//}
+		}*/
+    	//StdRegInfo stdRegInfo=stdRegInfoService.find(byCertificate.getStd_id());
+
+    	
+//    	if (byCertificate.getId()==null&&StringHelper.isNotEmpty(byCertificate.getApp_id())) {
+//    		ByApply byApply=byApplyService.find(byCertificate.getApp_id());
+//        	byCertificate.setSchool_id(byApply.getSchool_id()!=null?byApply.getSchool_id():stdRegInfo.getSchool_id());
+//        	byCertificate.setStd_source(byApply.getStd_source());
+//        	byCertificate.setBy_photo(byApply.getBy_photo());
+//        	byCertificate.setBy_date(byApply.getApply_date().format(DateHelper.ShortDateFormatter));
+//        	byCertificate.setCert_no(stdRegInfo.getCert_no());
+//        	byCertificate.setDiaplma_no(byApply.getDiaplma_no());
+//        	byCertificate.setTicket_no(stdRegInfo.getTicket_no());
+//        	byCertificate.setMajor(plMajorService.find(byApply.getMajor_id()).getMajor_name());
+//        	byCertificate.setStd_name(stdRegInfo.getStd_name());
+//        	byCertificate.setSchool(cfOrganizationService.find(byCertificate.getSchool_id()).getOrg_name());
+//        	byCertificate.setMajor_level(plMajorService.find(byApply.getMajor_id()).getMajor_level());
+//		}
+//		if (byCertificate.getStd_source()==1) {
+//			byCertificate.setOrg_id(stdRegInfo.getExam_area_id());
+//		}else {
+//			byCertificate.setOrg_id(stdRegInfo.getSchool_id());
+//		}
+    	
+    	
+    	byCertificate.setStd_id(login.getId());
+    	
+		byCertificate.setApply_date(DateHelper.toLocalDate(new Date()));
+    	byCertificate.setStatus(1);
+		if (byCertificate.getId() != null) {
+			this.byCertificateService.edit(byCertificate);
+		} else {
+			// 手工申请时,毕业证书号存在时,不允许手工申请
+			if (null == byCertificate.getApp_id()) {
+				ByApply by = this.byApplyService.queryByApplyByDiaplmaNo(byCertificate.getDiaplma_no());
+				if (null != by) {
+					throw new BusinessException("毕业证号【" + byCertificate.getDiaplma_no() + "】在系统中存在对应的毕业信息," + "准考证号是【"
+							+ byCertificate.getTicket_no() + "】,请使用该准考证号账号申请毕业证明书。");
+				}
+			}
+
+			this.byCertificateService.insert(byCertificate);
+		}
+        return new Ajax();
+    }
+    
+    @RequestMapping("by/byCertificate/edit")
+	public Ajax edit(ByCertificate byCertificate) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+		byCertificate.setStd_id(login.getId());
+
+		this.byCertificateService.edit(byCertificate);
+		return new Ajax();
+	}
+    
+    @RequestMapping("by/byCertificate/delete")
+    public Ajax delete(Integer[] ids) {
+    	StdRegInfo login = (StdRegInfo)this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	for (Integer id : ids) {
+    		ByCertificate byCertificate = this.byCertificateService.find(id);
+    		if(null != byCertificate && null != login && login.getId().intValue() == byCertificate.getStd_id().intValue()){
+    			this.byCertificateService.delete(id);
+    		}
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("by/byCertificate/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.byCertificateService.find(id));
+    }   
+    
+    
+    
+    @RequestMapping("by/byCertificate/reApply")
+    public Ajax reapply(ByCertificate byCertificate) {
+    	ByCertificate dbyCertificate=this.byCertificateService.find(byCertificate.getId());
+    	FrameAssertUtil.isNotNull(dbyCertificate, "找不到毕业证明书申请记录!");
+    	String yearCode = YearCodeHelper.getByCurrentYearCode();
+    	List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+		
+		if(dbyCertificate.getExam_time_id().intValue() != examTimeList.get(0).getId().intValue()){
+    		Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("毕业证明书申请单的批次与当前批次不一致,不允许修改毕业证明书申请单并提交。");
+			return ajax;
+    	}
+		
+//    	dbyCertificate.setBy_photo(byCertificate.getBy_photo());
+    	
+    	StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+    	dbyCertificate.setStd_id(login.getId());
+		
+    	dbyCertificate.setStatus(1);
+        this.byCertificateService.edit(dbyCertificate);
+        return new Ajax();
+    }
+    
+    @RequestMapping("by/byCertificate/upload")
+    public Ajax upload(MultipartFile file) {
+    	StdRegInfo login = (StdRegInfo)this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	StdRegInfo dbStd = this.stdRegInfoService.find(login.getId());
+    	if (dbStd != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStd);
+		}
+    	
+    	Ajax ajax = new Ajax();
+//    	if (file.getSize() > 50 * 1024) {
+//    		throw new BusinessException("上传照片不能超过50KB!");
+//    	}
+    	//上传路径
+    	String fileDir = SysConst.getAppConfig().getUploadBase() + SysConst.getByPhotoPath(dbStd.getCert_no());
+		File dir = new File(fileDir);
+		if (!dir.exists()) {
+			dir.mkdirs();
+		}
+		File desFile = new File(fileDir + dbStd.getCert_no() + ".jpg");
+		try {
+			file.transferTo(desFile);
+			
+			// ----------------------------考生照片上传恒生文件服务器开始-------------------------
+			String by_photo_path = null;
+			String by_photo_id = null;
+			
+			UploadVO uploadVO = XcDfsClient.uploadStream(desFile.getPath());
+			List<UploadItemVO> uploadItems = uploadVO.getList();
+			if (null != uploadItems && !uploadItems.isEmpty()) {
+				UploadItemVO vo = uploadItems.get(0);
+				by_photo_path = vo.getFilePath();
+				by_photo_id = vo.getId();
+				
+			} else {
+				throw new BusinessException("照片上传文件服务器失败,请联系系统管理员!");
+			}
+			// ----------------------------考生照片上传恒生文件服务器结束-------------------------
+			
+			Map<String, String> map = new HashMap<String, String>();
+			//db存储路径,注意与文件系统存储的路径不同,db不存uploadbase路径!
+			map.put("file_path", SysConst.getByPhotoPath(dbStd.getCert_no()) + dbStd.getCert_no() + ".jpg");
+			
+			map.put("by_photo_path", by_photo_path);
+			map.put("by_photo_id", by_photo_id);
+			map.put("full_by_photo_path", SysConst.getAppConfig().getPhotoHttp()+by_photo_path);
+			
+			map.put("file_name", file.getOriginalFilename());
+			ajax.setMap(map);
+		} catch (IllegalStateException e) {
+			LogHelper.error(e);
+		} catch (IOException e) {
+			LogHelper.error(e);
+		} 
+    	return ajax;
+    }
+    
+   
+}

+ 288 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByCourseReplRecordControl.java

@@ -0,0 +1,288 @@
+package cn.hmsoft.ses.control.by;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.data.model.by.ByCourseReplDetail;
+import cn.hmsoft.ses.data.model.by.ByCourseReplRecord;
+import cn.hmsoft.ses.data.model.by.ByScore;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.service.iface.by.IByCourseReplDetailService;
+import cn.hmsoft.ses.service.iface.by.IByCourseReplRecordService;
+import cn.hmsoft.ses.service.iface.by.IByScoreService;
+import cn.hmsoft.ses.service.iface.kj.IKjUnifiedScoreDetailService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ * 考生课程顶替记录表 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:12
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class ByCourseReplRecordControl extends AjaxControl {
+
+    @Autowired
+    private IByCourseReplRecordService byCourseReplRecordService;
+    @Autowired
+    private IByCourseReplDetailService detailService;
+    @Autowired
+    private IKjUnifiedScoreDetailService scoreService;
+    @Autowired
+    private IByScoreService byScoreService;
+    
+
+    
+    
+    /**
+     * @param major_id:专业ID
+     * 课程顶替申请页面
+     */
+    @RequestMapping("by/byCourseReplRecord/detail")
+    public Ajax detail(Integer major_id) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	Map<String,Object> map = new HashMap<String,Object>();
+    	map.put("ruleList", this.detailService.listCourseReplDetail(major_id));//专业的顶替规则
+    	map.put("passList", this.scoreService.listStdScore(major_id, std.getId(), 1));//专业下已考及格课程
+    	map.put("failList", this.scoreService.listStdScore(major_id, std.getId(), 0));//未考课程和不及格课程
+    	map.put("hasList", this.byCourseReplRecordService.listCourseReplDetail(std.getId()));//专业下已完成的课程顶替
+        return new Ajax(map);
+    } 
+    
+    @RequestMapping("by/byCourseReplRecord/queryByScore")
+    public Ajax queryByScore(Integer by_apply_id) {
+        return new Ajax(this.byCourseReplRecordService.queryByScore(by_apply_id));
+    } 
+    
+    @RequestMapping("by/byCourseReplRecord/byReplScoreList")
+    public Ajax byReplScoreList(Integer std_id, Integer majorId, Integer courseId) {
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+        return new Ajax(this.byCourseReplRecordService.byReplScoreList(std.getId(), majorId, courseId));
+    } 
+    
+    @RequestMapping("by/byCourseReplRecord/byReplOldCourseList")
+    public Ajax byReplOldCourseList(Integer majorId, Integer courseId) {
+        return new Ajax(this.byCourseReplRecordService.byReplOldCourseList(majorId, courseId));
+    } 
+    
+    
+    
+    /**
+     * 课程顶替.
+     * @param major_id:专业ID
+     * @param new_course_id:未考课程和不及格课程ID,被顶替的课程
+     * @param score_ids:成绩表中已考课程的成绩表ID集合
+     * @param old_course_ids:成绩表中已考课程的课程表ID集合 顺序与成绩ID集合一致
+     */
+    @RequestMapping("by/byCourseReplRecord/repl")
+	public Ajax repl(Integer by_apply_id, Integer std_id, Integer major_id, String[] score_ids,String [] old_course_ids,Integer new_course_id) {
+		Ajax ajax = new Ajax();
+
+		StdRegInfo sessionStdRegInfo = (StdRegInfo) getRequest().getSession()
+				.getAttribute(EnrolSessionName.EnrolStdReg);
+
+		if (null != old_course_ids && old_course_ids.length > 0) {
+			// 根据成绩ID获取课程ID
+			
+			// 根据被顶替课程,查询是否配置顶替关系
+			Map<String, Object> map = new HashMap<String, Object>();
+			map.put("status", 1);
+			map.put("major_id", major_id);
+			map.put("repl_course_ids", new_course_id);
+
+			List<ByCourseReplDetail> detailList = this.detailService.listByMap(map);
+
+			if (null != detailList && !detailList.isEmpty()) {
+				// 数组转换成map,用于对比课程
+				Map<String, String> old_ids_map = new HashMap<String, String>();
+				for (int i = 0; i < old_course_ids.length; i++) {
+					if (null != old_course_ids[i]) {
+						old_ids_map.put(old_course_ids[i], old_course_ids[i]);
+					}
+
+				}
+
+				String temp_old_course_ids = null;
+				boolean iscan = false;
+				for (ByCourseReplDetail detail : detailList) {
+					if (null != detail.getOld_course_ids()) {
+						temp_old_course_ids = detail.getOld_course_ids();
+
+						// 对比课程顶替配置与前台选择的课程是否一致
+						String result = checkRepl(temp_old_course_ids, old_ids_map);
+
+						if (null == result) {
+							iscan = true;
+							break;
+						}
+					}
+				}
+
+				if (!iscan) {
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("专业课程顶替配置与选择的课程不匹配。");
+					return ajax;
+				}
+			} else {
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("专业课程没有配置课程顶替。");
+				return ajax;
+			}
+
+			ByScore byScore = new ByScore();
+			byScore.setBy_apply_id(by_apply_id);
+			byScore.setStd_reg_id(sessionStdRegInfo.getId());
+			byScore.setMajor_id(major_id);
+			byScore.setOld_course_id(new_course_id);
+
+
+			String checkInfo = null;
+			boolean is_course_score = false;
+			
+			if(old_course_ids.length == 1){
+				is_course_score = true;
+			}
+			
+			// 校验毕业成绩录入
+			for (int i = 0; i < old_course_ids.length; i++) {
+				if (null != old_course_ids[i]) {
+					byScore.setScore_id(Integer.valueOf(score_ids[i]));
+					
+					// 将顶替成绩录入毕业生成表
+					if (i == 0) {
+						checkInfo = this.byScoreService.byCourseRepl(byScore,sessionStdRegInfo.getId(), false, true,is_course_score);
+					} else {
+						checkInfo = this.byScoreService.byCourseRepl(byScore,sessionStdRegInfo.getId(), false, true,is_course_score);
+					}
+
+					if (null != checkInfo) {
+						ajax.setSuccess(false);
+						ajax.setErrorMsg(checkInfo);
+						return ajax;
+					}
+				}
+			}
+			
+			// 毕业成绩录入
+			for (int i = 0; i < old_course_ids.length; i++) {
+				if (null != old_course_ids[i]) {
+					byScore.setScore_id(Integer.valueOf(score_ids[i]));
+					
+					// 将顶替成绩录入毕业生成表
+					if (i == 0) {
+						this.byScoreService.byCourseRepl(byScore,sessionStdRegInfo.getId(), true,false,is_course_score);
+					} else {
+						this.byScoreService.byCourseRepl(byScore,sessionStdRegInfo.getId(), true,false,is_course_score);
+					}
+				}
+			}
+
+		} else {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请选择顶替课程。");
+			return ajax;
+		}
+
+		return ajax;
+	}
+    
+    
+	private String checkRepl(String course_ids, Map<String, String> old_course_ids) {
+		String result = null;
+		String[] temp_course_ids = course_ids.split(",");
+
+		// 数据库配置的课程数与前台选择的课程数要一致
+		if (temp_course_ids.length != old_course_ids.size()) {
+			result = "专业课程顶替配置课程数与选择的课程数不匹配。";
+			return result;
+		}
+
+		for (int i = 0; i < temp_course_ids.length; i++) {
+			// 前台选择的课程与数据库配置的课程顶替的课程一致
+			if (null != temp_course_ids[i] && !old_course_ids.containsKey(temp_course_ids[i])) {
+				result = "专业课程顶替配置与选择的课程不匹配。";
+				break;
+			}
+		}
+
+		return result;
+	}
+	
+	
+	/**
+	 * 删除毕业课程成绩
+	 * 
+	 * @param id
+	 * @return
+	 */
+	@RequestMapping("by/byCourseReplRecord/deleteByCourse")
+	public Ajax deleteByCourse(Integer id) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		this.byScoreService.deleteByCourse(id,std.getId());
+		return new Ajax();
+	}
+	
+	
+	/**
+	 * 重置毕业成绩
+	 * 
+	 * @param by_apply_id
+	 * @return
+	 */
+	@RequestMapping("by/byCourseReplRecord/resetByScore")
+	public Ajax resetByScore(Integer by_apply_id) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		this.byScoreService.resetByScore(by_apply_id,std.getId());
+		return new Ajax();
+	}
+    
+    
+    
+    /**
+     * @param major_id:专业ID
+     * @param rule_id:顶替规则ID
+     * @param score_ids:成绩表中已考课程的成绩表ID集合
+     * @param old_course_ids:未考课程和不及格课程ID集合
+     * 课程顶替保存
+     */
+    @RequestMapping("by/byCourseReplRecord/add")
+	public Ajax add(Integer major_id, Integer rule_id, String[] old_course_ids, String[] score_ids) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (this.byCourseReplRecordService.validate(rule_id, old_course_ids, score_ids)) {
+			this.byCourseReplRecordService.insertCourseReplRecord(std, major_id, rule_id, old_course_ids, score_ids);
+		} else {
+			throw new BusinessException("选择的课程和顶替规则不匹配,请重新选择!");
+		}
+		return new Ajax();
+	}
+    
+    @RequestMapping("by/byCourseReplRecord/edit")
+    public Ajax edit(ByCourseReplRecord byCourseReplRecord) {
+        this.byCourseReplRecordService.edit(byCourseReplRecord);
+        return new Ajax();
+    }
+    
+    @RequestMapping("by/byCourseReplRecord/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.byCourseReplRecordService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("by/byCourseReplRecord/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.byCourseReplRecordService.find(id));
+    }    
+}

+ 66 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByPaperApplyAuditControl.java

@@ -0,0 +1,66 @@
+package cn.hmsoft.ses.control.by;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.data.model.by.ByPaperApplyAudit;
+import cn.hmsoft.ses.service.iface.by.IByPaperApplyAuditService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ * 毕业论文答辩申请审核表 控制器.
+ * 
+ * @author: zq
+ * @date: 2019-03-14 13:39:19
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class ByPaperApplyAuditControl extends AjaxControl {
+
+	@Autowired
+	private IByPaperApplyAuditService byPaperApplyAuditService;
+
+	@RequestMapping("by/byPaperApplyAudit/page")
+	public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+		if (StringHelper.isEmpty(order)) {
+			order = "1";
+		}
+		return new Ajax(this.byPaperApplyAuditService.page(query, start, limit, this.getQueryOrder(order, type)));
+	}
+
+	@RequestMapping("by/byPaperApplyAudit/add")
+	public Ajax add(ByPaperApplyAudit byApplyAudit) {
+		this.byPaperApplyAuditService.insert(byApplyAudit);
+		return new Ajax();
+	}
+
+	@RequestMapping("by/byPaperApplyAudit/edit")
+	public Ajax edit(ByPaperApplyAudit byApplyAudit) {
+		this.byPaperApplyAuditService.edit(byApplyAudit);
+		return new Ajax();
+	}
+
+	@RequestMapping("by/byPaperApplyAudit/delete")
+	public Ajax delete(Integer[] ids) {
+		for (Integer id : ids) {
+			this.byPaperApplyAuditService.delete(id);
+		}
+		return new Ajax();
+	}
+
+	@RequestMapping("by/byPaperApplyAudit/get")
+	public Ajax get(Integer id) {
+		return new Ajax(this.byPaperApplyAuditService.find(id));
+	}
+
+	@RequestMapping("by/byPaperApplyAudit/listByApply")
+	public Ajax listByApply(Integer apply_id) {
+		return new Ajax(this.byPaperApplyAuditService.authList(apply_id));
+	}
+
+}

+ 582 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByPaperApplyControl.java

@@ -0,0 +1,582 @@
+package cn.hmsoft.ses.control.by;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import cn.hmsoft.frame.data.model.FrameDict;
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.service.IFrameParamService;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.helper.DateHelper;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.model.by.ByPaperApply;
+import cn.hmsoft.ses.data.model.by.ByTimeConfig;
+import cn.hmsoft.ses.data.model.cf.CfOrganization;
+import cn.hmsoft.ses.data.model.pl.PlExamTime;
+import cn.hmsoft.ses.data.model.pl.PlMajor;
+import cn.hmsoft.ses.data.model.std.StdMajor;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.helper.YearCodeHelper;
+import cn.hmsoft.ses.service.iface.by.IByPaperApplyService;
+import cn.hmsoft.ses.service.iface.by.IByTimeConfigService;
+import cn.hmsoft.ses.service.iface.cf.ICfOrganizationService;
+import cn.hmsoft.ses.service.iface.mk.IMkPreEduApplyService;
+import cn.hmsoft.ses.service.iface.pl.IPlExamTimeService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdRegInfoService;
+import cn.hmsoft.ses.util.ImageUtil;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ * 毕业论文申请申请表 控制器-考生端.
+ * 
+ */
+@RestController
+public class ByPaperApplyControl extends AjaxControl {
+	@Autowired
+	private IStdRegInfoService stdRegInfoService;// 学生服务
+	@Autowired
+	private IPlMajorService plMajorService;// 专业服务
+	@Autowired
+	private IByPaperApplyService byPaperApplyService;
+	@Autowired
+	private IPlExamTimeService examTimeService;// 时间批次服务
+	@Autowired
+	private IStdMajorService stdMajorService;// 学生注册服务
+	@Autowired
+	private IByTimeConfigService byTimeConfigService;// 毕业时间配置服务
+
+	@Autowired
+	private IMkPreEduApplyService mkPreEduApplyService;// 前置学历
+	
+	@Autowired
+	private ICfOrganizationService cfOrganizationService;
+    @Autowired
+    private IFrameParamService frameParamService;
+
+	@RequestMapping("by/byPaperApply/listAll")
+	public Ajax listAll(String query, Integer limit, Integer start, String order, String type) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		HashMap<String, Object> rtnMap = new HashMap<String, Object>();
+
+		boolean canApply = false;
+		ByTimeConfig byTimeConfig = null;
+
+		String yearCode = YearCodeHelper.getByCurrentYearCode();
+		List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+
+		if (examTimeList != null && examTimeList.size() > 0) {
+			Map<String, Object> map = new HashMap<String, Object>();
+			map.put("status", 1);// 启用的
+			map.put("student_type", login.getStd_source());// 学生类型
+			map.put("exam_time_id", examTimeList.get(0).getId());
+			List<ByTimeConfig> timeConfigList = this.byTimeConfigService.listByMap(map);
+			if (timeConfigList != null && timeConfigList.size() > 0) {
+				// 毕业时间配置对象
+				byTimeConfig = timeConfigList.get(0);
+				
+				LocalDate now = null;
+    			ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+    			if (null != time && null != time.getBy_date()) {
+    				now = time.getBy_date();
+    			} else {
+    				now = LocalDate.now();
+    			}
+
+				if (null != byTimeConfig.getPaper_start_time() && null != byTimeConfig.getPaper_end_time()
+						&& (byTimeConfig.getPaper_start_time().isBefore(now)|| byTimeConfig.getPaper_start_time().isEqual(now))
+						&& (byTimeConfig.getPaper_end_time().isAfter(now)|| byTimeConfig.getPaper_end_time().isEqual(now))) {
+					canApply = true;
+				}
+
+			} else {
+				LogHelper.error("毕业论文申请时间配置为空.");
+			}
+		}
+
+		// 开考专业
+		HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		paraMap.put("is_net_exam", 1);// 网考
+		paraMap.put("status", 1);// 开考
+
+		List<PlMajor> majorList = this.plMajorService.listByMap(paraMap);
+
+		rtnMap.put("canApply", canApply);// 是否能申请
+		rtnMap.put("byTimeConfig", byTimeConfig);// 毕业申请时间配置
+		rtnMap.put("applyList", this.byPaperApplyService.ListAll(login.getId()));
+		rtnMap.put("majorList", majorList);
+		//rtnMap.put("ByPaperApplyControl", FrameParamConstants.GobalParamMap.get("ByPaperApplyControl"));
+		
+		FrameParam param = this.frameParamService.find(FrameParam.class,"param_name", "ByPaperApplyControl");
+		if(null != param && "Active".equals(param.getProtect_status())){
+    		rtnMap.put("ByPaperApplyControl", param.getParam_value());
+    	}
+
+		return new Ajax(rtnMap);
+	}
+
+	/**
+	 * 毕业论文答辩申请核实信息-申请详情.
+	 * 
+	 * @param stdId
+	 * @param majorId
+	 * @return
+	 */
+	@RequestMapping("by/byPaperApply/getcheckinfo")
+	public Ajax getCheckInfo(Integer stdId, Integer majorId, Integer schoolId) {
+		final Map<String, Object> retMap = new HashMap<String, Object>();
+		Ajax ajax = new Ajax(retMap);
+
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+		PlMajor major = this.plMajorService.find(majorId);
+
+		// 主考院校
+		Integer school_id = login.getSchool_id();
+		if (school_id != null) {
+			CfOrganization school_org = this.cfOrganizationService.find(school_id);
+			login.setSchool_name(school_org.getOrg_name());
+		}
+
+		login.setRemark("");
+		
+		retMap.put("major", major);// 选择的毕业专业
+		retMap.put("stdRegInfo", login);// 当前考生信息
+
+		return ajax;
+	}
+
+	@RequestMapping("pl/byPaperApply/upload")
+	public Ajax upload(MultipartFile file) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		StdRegInfo dbStd = this.stdRegInfoService.find(login.getId());
+		if (dbStd != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStd);
+		}
+		
+		Ajax ajax = new Ajax();
+		// if (file.getSize() > 50 * 1024) {
+		// throw new BusinessException("上传照片不能超过50KB!");
+		// }
+		// 上传路径
+		String fileDir = SysConst.getAppConfig().getUploadBase() + SysConst.getByPaperPhotoPath(dbStd.getTicket_no());
+		File dir = new File(fileDir);
+		if (!dir.exists()) {
+			dir.mkdirs();
+		}
+		File desFile = new File(fileDir + dbStd.getTicket_no() + ".jpg");
+		try {
+			file.transferTo(desFile);
+
+			Map<String, String> map = new HashMap<String, String>();
+			// db存储路径,注意与文件系统存储的路径不同,db不存uploadbase路径!
+			map.put("file_path", SysConst.getByPaperPhotoPath(dbStd.getTicket_no()) + dbStd.getTicket_no() + ".jpg");
+			map.put("file_name", file.getOriginalFilename());
+			ajax.setMap(map);
+		} catch (IllegalStateException e) {
+			LogHelper.error(e);
+		} catch (IOException e) {
+			LogHelper.error(e);
+		}
+		return ajax;
+	}
+	
+	
+	/**
+	 * 提交新申请-提交到审批.
+	 * 
+	 * @param byApply
+	 * @return
+	 */
+	@RequestMapping("by/byPaperApply/apply")
+	public Ajax apply(ByPaperApply byApply) {
+		FrameAssertUtil.isNotEmpty(byApply.getMajor_id().toString(), "专业数据不能为空!");
+
+		StdRegInfo std = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		byApply.setStd_id(std.getId());
+		
+		ByTimeConfig byTimeConfig = null;
+		String yearCode = YearCodeHelper.getByCurrentYearCode();
+
+		List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+
+		if (examTimeList != null && examTimeList.size() > 0) {
+			Map<String, Object> map = new HashMap<String, Object>();
+			map.put("status", 1);// 启用的
+			map.put("student_type", std.getStd_source());// 学生类型
+			map.put("exam_time_id", examTimeList.get(0).getId());
+			List<ByTimeConfig> timeConfigList = this.byTimeConfigService.listByMap(map);
+			if (timeConfigList != null && timeConfigList.size() > 0) {
+				// 毕业时间配置对象
+				byTimeConfig = timeConfigList.get(0);
+				
+				LocalDate now = null;
+    			ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+    			if (null != time && null != time.getBy_date()) {
+    				now = time.getBy_date();
+    			} else {
+    				now = LocalDate.now();
+    			}
+
+				if (!(null != byTimeConfig.getPaper_start_time() && null != byTimeConfig.getPaper_end_time()
+						&& (byTimeConfig.getPaper_start_time().isBefore(now)|| byTimeConfig.getPaper_start_time().isEqual(now))
+						&& (byTimeConfig.getPaper_end_time().isAfter(now)|| byTimeConfig.getPaper_end_time().isEqual(now)))) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("不在本批次毕业论文答辩申请时间范围之内,不允许提交毕业论文答辩申请。");
+					return ajax;
+				}
+
+			} else {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("当前毕业批次还未配置,不允许提交毕业论文答辩申请。");
+				return ajax;
+			}
+		}else{
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("当前年度码还未配置,不允许提交毕业论文答辩申请。");
+			return ajax;
+		}
+		
+
+		if (examTimeList != null && examTimeList.size() > 0) {
+			byApply.setExam_time_id(examTimeList.get(0).getId());
+		}
+		
+		
+		// 前端传值
+		byApply.setTicket_no(std.getTicket_no());
+		
+		LocalDateTime now = null;
+		ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+		if (null != time && null != time.getApply_start_time()) {
+			now = time.getApply_start_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+		
+		byApply.setApply_date(now);
+		
+		if (StringHelper.isNotEmpty(byApply.getStd_birth_str())) {
+			if (byApply.getStd_birth_str().contains("-")) {
+				byApply.setStd_birth(DateHelper.parseDate(byApply.getStd_birth_str()));
+			} else {
+				byApply.setStd_birth(DateHelper.parseDateNoSplit(byApply.getStd_birth_str()));
+			}
+		}
+		
+		byApply.setStatus(1);// 待一级审核
+		byApply.setApply_type(0);// 考生端申请
+		
+		if (null != std.getStd_source()) {
+			FrameDict dict = FrameDictUtil.getFrameDict("StudentType", std.getStd_source()+"");
+			if(null != dict){
+				byApply.setStd_type(dict.getDict_text());
+			}
+		}
+		
+		
+		this.byPaperApplyService.apply(byApply);
+		return new Ajax();
+	}
+
+	/**
+	 * 修改申请-再提交.
+	 * 
+	 * @param byApply
+	 * @return
+	 */
+	@RequestMapping("by/byPaperApply/reApply")
+	public Ajax reApply(ByPaperApply byApply) {
+		ByPaperApply dbApply = this.byPaperApplyService.find(byApply.getId());
+		FrameAssertUtil.isNotNull(dbApply, "找不到毕业论文答辩申请记录!");
+		
+		String yearCode = YearCodeHelper.getByCurrentYearCode();
+    	List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+		
+		if(dbApply.getExam_time_id().intValue() != examTimeList.get(0).getId().intValue()){
+    		Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("毕业论文答辩申请单的批次与当前批次不一致,不允许修改毕业论文答辩申请单并提交。");
+			return ajax;
+    	}
+		
+		dbApply.setRemark(byApply.getRemark());
+		dbApply.setStatus(1);// 待一级审核
+		dbApply.setIs_auth_back(0);// 恢复为0;1是驳回
+		
+		if (byApply.getMajor_id() != null) {
+			dbApply.setMajor_id(byApply.getMajor_id());
+		}
+		
+		if (byApply.getStd_source() != null) {
+			dbApply.setStd_source(byApply.getStd_source());
+		}
+		
+		if (byApply.getSchool_id() != null) {
+			dbApply.setSchool_id(byApply.getSchool_id());
+		}
+		
+		if (byApply.getRemark() != null) {
+			dbApply.setRemark(byApply.getRemark());
+		}
+		
+		if (byApply.getStd_sex() != null) {
+			dbApply.setStd_sex(byApply.getStd_sex());
+		}
+		
+		if (byApply.getNation() != null) {
+			dbApply.setNation(byApply.getNation());
+		}
+		
+		if (byApply.getPre_edu() != null) {
+			dbApply.setPre_edu(byApply.getPre_edu());
+		}
+		if (byApply.getWork_unit() != null) {
+			dbApply.setWork_unit(byApply.getWork_unit());
+		}
+		if (byApply.getAddress() != null) {
+			dbApply.setAddress(byApply.getAddress());
+		}
+		if (byApply.getPost_code() != null) {
+			dbApply.setPost_code(byApply.getPost_code());
+		}
+		
+		if(byApply.getTelephone() != null){
+			dbApply.setTelephone(byApply.getTelephone());
+		}
+		
+		if(byApply.getPaper_title() != null){
+			dbApply.setPaper_title(byApply.getPaper_title());
+		}
+		
+		if(byApply.getStd_type() != null){
+			dbApply.setStd_type(byApply.getStd_type());
+		}
+		
+		if(byApply.getQq() != null){
+			dbApply.setQq(byApply.getQq());
+		}
+		
+		
+		if (byApply.getStd_birth_str() != null) {
+			if (byApply.getStd_birth_str().contains("-")) {
+				dbApply.setStd_birth(DateHelper.parseDate(byApply.getStd_birth_str()));
+			} else {
+				dbApply.setStd_birth(DateHelper.parseDateNoSplit(byApply.getStd_birth_str()));
+			}
+		}
+		
+		// 创建申请
+		this.byPaperApplyService.reApply(dbApply);
+		return new Ajax();
+	}
+	
+	
+	
+	
+	
+	
+	
+
+	/**
+	 * 分页查询-考试毕业申请列表.
+	 * 
+	 * @param query
+	 * @param limit
+	 * @param start
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	@RequestMapping("by/byPaperApply/page")
+	public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (login != null) {
+			return new Ajax(
+					this.byPaperApplyService.page(login.getId(), query, start, limit, this.getQueryOrder(order, type)));
+		}
+		return new Ajax(new Pager());
+	}
+
+	/**
+	 * 毕业申请基础信息.
+	 * 
+	 * @return
+	 */
+	@RequestMapping("by/byPaperApply/applybaseinfo")
+	public Ajax applyBaseInfo() {
+		boolean canApply = false;
+		ByTimeConfig byTimeConfig = null;
+		List<StdMajor> majorList = null;
+		// 学生注册信息
+		StdRegInfo login = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (login != null) {
+			String yearCode = YearCodeHelper.getByCurrentYearCode();
+			List<PlExamTime> examTimeList = examTimeService.list("year_code", yearCode);
+			if (examTimeList != null && examTimeList.size() > 0) {
+				Map<String, Object> map = new HashMap<String, Object>();
+				map.put("status", 1);// 启用的
+				map.put("student_type", login.getStd_source());// 学生类型
+				map.put("exam_time_id", examTimeList.get(0).getId());
+				List<ByTimeConfig> timeConfigList = this.byTimeConfigService.listByMap(map);
+				if (timeConfigList != null && timeConfigList.size() > 0) {
+					LocalDateTime now = null;
+        			ByTimeConfig time = this.byTimeConfigService.getDataBaseTime();
+        			if (null != time && null != time.getApply_start_time()) {
+        				now = time.getApply_start_time();
+        			} else {
+        				now = LocalDateTime.now();
+        			}
+        			
+					// 毕业时间配置对象
+					byTimeConfig = timeConfigList.get(0);
+					canApply = DateHelper.isBetween(now, byTimeConfig.getApply_start_time(),
+							byTimeConfig.getApply_end_time());
+
+				} else {
+					LogHelper.error("毕业时间配置为空.");
+				}
+			} else {
+				LogHelper.error("年度码 " + yearCode + " 对应的时间批次查询为空.");
+			}
+			// 考生报考的专业信息
+			majorList = this.stdMajorService.findStdMajors(login.getId());
+		}
+		final Map<String, Object> retMap = new HashMap<String, Object>();
+		retMap.put("canApply", canApply);// 是否能申请
+		retMap.put("byTimeConfig", byTimeConfig);// 毕业申请时间配置
+		retMap.put("majorList", majorList);// 考生报考的专业信息,创建毕业申请会用到
+		return new Ajax(retMap);
+	}
+
+	/**
+	 * 毕业判定.
+	 * 
+	 * @param stdId
+	 * @author majorId
+	 * @return
+	 */
+	@RequestMapping("by/byPaperApply/determine")
+	public Ajax edit(Integer stdId, Integer majorId) {
+		// 返回该考生,该专业 缺考的课程列表
+
+		return new Ajax();
+	}
+
+	
+
+	@RequestMapping("by/byPaperApply/delete")
+	public Ajax delete(Integer[] ids) {
+		for (Integer id : ids) {
+			this.byPaperApplyService.delete(id);
+		}
+		return new Ajax();
+	}
+
+	@RequestMapping("by/byPaperApply/get")
+	public Ajax get(Integer id) {
+		return new Ajax(this.byPaperApplyService.find(id));
+	}
+
+	@RequestMapping("by/byPaperApply/getdetail")
+	public Ajax getDetail(Integer id) {
+		Map<String, Object> map = new HashMap<String, Object>();
+		ByPaperApply detail = this.byPaperApplyService.getDetail(id);
+		FrameAssertUtil.isNotNull(detail, "找不到毕业申请记录!");
+		List<Map<String, Object>> scoreMap = this.byPaperApplyService.getCourseScoreList(id, detail.getMajor_id(),
+				detail.getStd_id(), detail.getSchool_id(), detail.getStd_source());
+		map.put("detail", detail);
+		map.put("scoreMap", scoreMap);
+		return new Ajax(map);
+	}
+
+	@RequestMapping("by/byPaperApply/getResumeList")
+	public Ajax getResuleList(Integer id) {
+		return new Ajax(this.byPaperApplyService.getResuleList(id));
+	}
+
+	@RequestMapping("by/byPaperApply/getOlaMajorInfoBynewMajorId")
+	public Ajax getOlaMajorInfoBynewMajorId(Integer major_id) {
+		// major_id = 316822;
+		List<Map<String, Object>> mapList = this.plMajorService.getOlaMajorInfoBynewMajorId(major_id);
+		// if (mapList != null && mapList.size() > 0) {
+		// Map<String, Object> map = mapList.get(0);
+		// return new Ajax(map);
+		// }
+		return new Ajax(mapList);
+	}
+
+	@RequestMapping("by/byPaperApply/getNewMajorInfoByOldMajorId")
+	public Ajax getNewMajorInfoByOldMajorId(Integer major_id) {
+		List<Map<String, Object>> mapList = this.plMajorService.getNewMajorInfoByOldMajorId(major_id);
+		return new Ajax(mapList);
+	}
+
+	@RequestMapping("pl/byPaperApply/orderOrgList")
+	public Ajax orderOrgList() {
+		List<CfOrganization> list = this.cfOrganizationService.orderOrgList();
+		return new Ajax(list);
+	}
+
+	@RequestMapping("pl/byPaperApply/uploadFile")
+	public Ajax uploadFile(MultipartFile file) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		if (StringHelper.isNotEmpty(extension)) {
+			extension = extension.toLowerCase();
+		}
+
+		ImageUtil.validateUploadFileExt(file);
+
+		String cert_no = std.getCert_no();
+		String rootPath = SysConst.getAppConfig().getUploadBase();
+		String rtnName = null;
+		;
+		String fileSeq = this.mkPreEduApplyService.getFileSeq();
+		try {
+			makeDir(rootPath);
+			rtnName = SysConst.IMG_BY_PREFIX + cert_no + "_" + new Date().getTime() + "_" + fileSeq + "." + extension;
+			String fullFileName = rootPath + rtnName;
+			file.transferTo(new File(fullFileName));
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new BusinessException("文件上传错误,请检查文件");
+		}
+		return new Ajax(rtnName);
+	}
+
+	/**
+	 * @param rootPath:目录路径
+	 *            创建目录
+	 */
+	private void makeDir(String rootPath) {
+		File dir = new File(rootPath + SysConst.IMG_EDU_PREFIX);
+		if (!dir.exists())
+			dir.mkdir();
+	}
+
+}

+ 208 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByTurnInApplyControl.java

@@ -0,0 +1,208 @@
+package cn.hmsoft.ses.control.by;
+
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.data.model.FrameRegionProvince;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.service.IFrameParamService;
+import cn.hmsoft.ses.constants.ByConst.TurnInStatus;
+import cn.hmsoft.ses.constants.ByConst.TurnType;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.data.dao.by.ByTurnInApplyDao;
+import cn.hmsoft.ses.data.model.by.ByTurnInApply;
+import cn.hmsoft.ses.data.model.by.ByTurnOutApply;
+import cn.hmsoft.ses.data.model.by.ByTurnTimeConfig;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.service.iface.by.IByTurnInApplyService;
+import cn.hmsoft.ses.service.iface.by.IByTurnTimeConfigService;
+import cn.hmsoft.ses.service.iface.by.IByTurnTimePlaceService;
+import cn.hmsoft.ses.service.iface.std.IStdMajorService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 外省考生转入表 参照了湖北的表:EG_T_KSZK 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:15
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class ByTurnInApplyControl extends AjaxControl {
+
+	@Autowired
+	private IByTurnInApplyService byTurnInApplyService;
+	@Autowired
+	private ByTurnInApplyDao dao;
+	@Autowired
+	private IByTurnTimeConfigService timeConfigService;
+	@Autowired
+	private IStdMajorService stdMajorService;
+	@Autowired
+	private IByTurnTimePlaceService placeService;
+	@Autowired
+	private IFrameParamService frameParamService;
+
+	/**
+	 * 外省转入-已申请列表 
+	 * timeLimit中的in_time来控制“申请转入”显示
+	 */
+	@RequestMapping("by/byTurnInApply/list")
+	public Ajax list() {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		Map<String, Object> map = new HashMap<String, Object>();
+		//map.put("timeLimit", this.timeConfigService.findTimeConfig(TurnType.TURN_IN.ordinal()));// 转考时间限制
+		map.put("auditTimeLimit", this.timeConfigService.findTimeConfig(5));// 转考审核
+		map.put("confirmTimeLimit", this.timeConfigService.findTimeConfig(8));// 转入待考生网上确认
+		map.put("applyList", this.byTurnInApplyService.listTurninApply(std.getId()));// 已申请记录
+		map.put("placeList", this.placeService.listTimePlace(std, TurnType.TURN_IN.ordinal())); //转考递交材料地点(status=1页面显示)
+		map.put("province", this.dao.list(FrameRegionProvince.class,"1","1"));// 已申请记录
+		
+		FrameParam param = this.frameParamService.find(FrameParam.class, "param_name", "ByTurnInApplyControl");
+		if(null != param && "Active".equals(param.getProtect_status())){
+			map.put("ByTurnInApplyControl", param.getParam_value());
+		}
+		
+		return new Ajax(map);
+	}
+
+	/**
+	 * 外省-转入申请页面
+	 */
+	@RequestMapping("by/byTurnInApply/toApply")
+	public Ajax toApply() {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("std", std);// 考生信息
+		map.put("ticketList", this.stdMajorService.listStdMajor(std.getId())); // 本省准考证列表
+		return new Ajax(map);
+	}
+
+	/**
+	 * 需要传递4个参数
+	 */
+	@RequestMapping("by/byTurnInApply/apply")
+	public Ajax apply(ByTurnInApply byTurnInApply) {
+		// 转考信息是否存在
+		ByTurnInApply apply = this.byTurnInApplyService.findTurnInApply(byTurnInApply);
+		if (apply == null) {
+			throw new BusinessException("外省转入信息与提交信息不匹配,请核对转入信息,有疑问请联系当地考办或主考学校!");
+		}
+		if ( apply.getStatus() != TurnInStatus.NO_PASS.ordinal() &&  apply.getStatus() != TurnInStatus.SAVE.ordinal()) {
+			throw new BusinessException("转考信息 审核未完成,请不要重复提交!");
+		}
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		this.byTurnInApplyService.apply(apply.getId(), std.getId());
+		return new Ajax();
+	}
+
+	@RequestMapping("by/byTurnInApply/edit")
+	public Ajax edit(ByTurnInApply byTurnInApply) {
+		this.byTurnInApplyService.edit(byTurnInApply);
+		return new Ajax();
+	}
+
+	//@RequestMapping("by/byTurnInApply/delete")
+	public Ajax delete(Integer[] ids) {
+		for (Integer id : ids) {
+			this.byTurnInApplyService.delete(id);
+		}
+		return new Ajax();
+	}
+
+	@RequestMapping("by/byTurnInApply/get")
+	public Ajax get(Integer id) {
+		return new Ajax(this.byTurnInApplyService.find(id));
+	}
+	
+	
+	/**
+	 * @param in_ticket_no:外省准考证
+	 *  转考:根据外省准考证,查询外省转入的成绩信息
+	 */
+	@RequestMapping("by/byTurnInApply/searchTurninOld")
+	public Ajax searchTurnInOld(String in_ticket_no) {
+		return new Ajax(this.byTurnInApplyService.searchTurnInOld(in_ticket_no));
+	}
+	
+	@RequestMapping("by/byTurnInApply/downApplyPdf")
+	public void downApplyPdf(Integer id) {
+		StdRegInfo std = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+		String file_name = null;
+
+		ByTurnInApply apply = this.byTurnInApplyService.find(id);
+
+		if (null == apply) {
+			this.writeAlert("申请单信息为空,请重新刷新页面。");
+			return;
+		} else if (apply.getStd_reg_id().intValue() != std.getId()) {
+			this.writeAlert("申请单对应考生与当前登录考生账号不一致,请重新登录。");
+			return;
+		}
+
+		file_name = "高等教育自学考试转考(转入)登记表(" + std.getTicket_no() + ").pdf";
+
+		try {
+			this.downloadFile(this.byTurnInApplyService.printTurnin(std, apply), file_name, true);
+		} catch (Exception e) {
+			this.writeAlert(e.getMessage());
+		}
+
+	}
+	
+	@RequestMapping("by/byTurnInApply/confirmByApply")
+	public Ajax confirmByApply(Integer id) {
+		Ajax ajax = new Ajax();
+
+		StdRegInfo std = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+		ByTurnInApply apply = this.byTurnInApplyService.find(id);
+
+		if (null == apply) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("申请单信息为空,请重新刷新页面。");
+			return ajax;
+
+		} else if (apply.getStd_reg_id().intValue() != std.getId()) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("申请单对应考生与当前登录考生账号不一致,请重新登录。");
+			return ajax;
+
+		}
+		
+		if (apply.getStatus().intValue() != 8) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("申请单状态不是待考生网上确认,不允许网上确认!");
+			return ajax;
+
+		}
+		
+		ByTurnTimeConfig config = this.timeConfigService.findTimeConfig(8);
+		if (config == null || !config.getIn_time()) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("不在转至外省网上确认时间范围之内,不允许网上确认!");
+			return ajax;
+		}
+		
+		if(!this.timeConfigService.isCurrYearCode(TurnType.TURN_IN.ordinal(), apply.getTime_config_id())){
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("申请单不是当前批次下的申请单,不允许网上确认!");
+			return ajax;
+		}
+		
+
+		apply.setStatus(4);
+		this.byTurnInApplyService.edit(apply);
+
+		return ajax;
+
+	}
+}

+ 72 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByTurnInScoreControl.java

@@ -0,0 +1,72 @@
+package cn.hmsoft.ses.control.by;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.data.model.by.ByTurnInScore;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.service.iface.by.IByTurnInScoreService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 外省考生转入成绩表 湖北表:EG_T_KSCJ 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:16
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class ByTurnInScoreControl extends AjaxControl {
+
+    @Autowired
+    private IByTurnInScoreService byTurnInScoreService;
+	
+    
+    /**
+     * @param out_ticket_no:外省准考证
+     * @param time_config_id:转考时间配置ID
+     * @return 考生转考的成绩列表
+     */
+    @RequestMapping("by/byTurnInScore/list")
+    public Ajax list(String out_ticket_no, Integer time_config_id ) {
+        return new Ajax(this.byTurnInScoreService.listTurnInScore(out_ticket_no, time_config_id));
+    }
+    
+    @RequestMapping("by/byTurnInScore/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	order = "1";
+        }
+        return new Ajax(this.byTurnInScoreService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    @RequestMapping("by/byTurnInScore/add")
+    public Ajax add(ByTurnInScore byTurnInScore) {
+        this.byTurnInScoreService.insert(byTurnInScore);
+        return new Ajax();
+    }
+    
+    @RequestMapping("by/byTurnInScore/edit")
+    public Ajax edit(ByTurnInScore byTurnInScore) {
+        this.byTurnInScoreService.edit(byTurnInScore);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("by/byTurnInScore/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.byTurnInScoreService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("by/byTurnInScore/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.byTurnInScoreService.find(id));
+    }    
+}

+ 505 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/by/ByTurnOutApplyControl.java

@@ -0,0 +1,505 @@
+package cn.hmsoft.ses.control.by;
+
+import java.io.File;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import cn.hmsoft.frame.data.model.FrameDict;
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.service.IFrameParamService;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.frame.util.FrameZoneUtil;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.constants.ByConst.TurnStatus;
+import cn.hmsoft.ses.constants.ByConst.TurnType;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.model.by.ByTurnOutApply;
+import cn.hmsoft.ses.data.model.by.ByTurnTimeConfig;
+import cn.hmsoft.ses.data.model.pl.PlMajor;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.service.iface.by.IByTurnOutApplyService;
+import cn.hmsoft.ses.service.iface.by.IByTurnOutScoreService;
+import cn.hmsoft.ses.service.iface.by.IByTurnTimeConfigService;
+import cn.hmsoft.ses.service.iface.by.IByTurnTimePlaceService;
+import cn.hmsoft.ses.service.iface.kj.IKjUnifiedScoreDetailService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdBreakDisciplineService;
+import cn.hmsoft.ses.service.iface.std.IStdMajorService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ * 本省考生转考申请表 省内转省外---kj_zhuanchushengqing 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:13
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class ByTurnOutApplyControl extends AjaxControl {
+
+	@Autowired
+	private IByTurnOutApplyService byTurnOutApplyService;
+	@Autowired
+	private IByTurnTimeConfigService timeConfigService;
+	
+	@Autowired
+	private IKjUnifiedScoreDetailService kjUnifiedScoreDetailService;// 成绩服务
+
+	@Autowired
+	private IByTurnTimePlaceService placeService;
+
+	@Autowired
+	private IPlMajorService plMajorService;
+	@Autowired
+	private IStdBreakDisciplineService breakService;
+	@Autowired
+	private IByTurnOutScoreService outScoreService;
+	@Autowired
+	private IFrameParamService frameParamService;
+
+	/**
+	 * @return 考生端-转至省外-列表 timeLimit 中的in_time控制是否在申请时间范围内
+	 */
+	@RequestMapping("by/byTurnOutApply/list")
+	public Ajax list() {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("timeLimit", this.timeConfigService.findTimeConfig(TurnType.TURN_OUT.ordinal()));// 转考时间限制
+		map.put("confirmLimit", this.timeConfigService.findTimeConfig(7));// 转出网上确认时间
+		map.put("auditTimeLimit", this.timeConfigService.findTimeConfig(4));// 转考地市时间
+		map.put("applyList", this.byTurnOutApplyService.listTurnoutApply(std.getId()));// 已申请记录
+		map.put("placeList", this.placeService.listTimePlace(std, TurnType.TURN_OUT.ordinal())); // 转考递交材料地点(status=1页面显示)
+		// map.put("ByTurnOutApplyControl",
+		// FrameParamConstants.GobalParamMap.get("ByTurnOutApplyControl"));
+
+		FrameParam param = this.frameParamService.find(FrameParam.class, "param_name", "ByTurnOutApplyControl");
+		if(null != param && "Active".equals(param.getProtect_status())){
+			map.put("ByTurnOutApplyControl", param.getParam_value());
+		}
+
+		return new Ajax(map);
+	}
+
+	/**
+	 * @return 转考申请界面
+	 */
+	@RequestMapping("by/byTurnOutApply/toAdd")
+	public Ajax toAdd() {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		Map<String, Object> map = new HashMap<String, Object>();
+		// ByTurnTimeConfig config =
+		// this.timeConfigService.findTimeConfig(TurnType.TURN_OUT.ordinal());
+		// if(config != null && config.getIn_time()) {
+
+		List<PlMajor> listStdMajor = this.plMajorService.listStdMajor(std.getId());
+
+		HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		// paraMap.put("is_net_exam", 1);// 网考
+		paraMap.put("status", 1);// 开考
+		List<PlMajor> majorArray = this.plMajorService.listByMap(paraMap);
+		for (PlMajor plMajor : majorArray) {
+			if (null != plMajor.getMajor_level() && 1 == plMajor.getMajor_level()) {
+				plMajor.setMajor_id(plMajor.getId());
+				plMajor.setFull_name(plMajor.getMajor_code() + "-" + plMajor.getMajor_name() + "-本科");
+			} else {
+				plMajor.setMajor_id(plMajor.getId());
+				plMajor.setFull_name(plMajor.getMajor_code() + "-" + plMajor.getMajor_name() + "-专科");
+			}
+
+		}
+		listStdMajor.addAll(majorArray);
+
+		HashSet<Integer> idSet = new HashSet<Integer>();
+		List<PlMajor> rtnMajorList = new ArrayList<PlMajor>();
+		for (PlMajor major : listStdMajor) {
+			if (idSet.add(major.getId())) {
+				rtnMajorList.add(major);
+			}
+
+		}
+
+		map.put("ticketList", rtnMajorList);
+
+		// map.put("ticketList",
+		// this.stdMajorService.listStdMajor(std.getId()));//准考证列表
+		map.put("provList", FrameZoneUtil.getProvinceArray(false));// 全国省份列表
+		// }
+		return new Ajax(map);
+	}
+
+	/**
+	 * @param std_major_id:专业表-ID
+	 * @return 考生可以转考的合格成绩 根据专业选择查询
+	 */
+	@RequestMapping("by/byTurnOutApply/courseList")
+	public Ajax courseList(Integer std_major_id) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		List<Map<String, Object>> courseList = this.kjUnifiedScoreDetailService.listStdScore(std.getId(), std_major_id);
+		List<FrameDict> courseNatureframeDict = FrameDictUtil.getFrameDict("CourseNature");
+		// 转换课程类型
+		for (Iterator iterator = courseList.iterator(); iterator.hasNext();) {
+			Map<String, Object> map = (Map<String, Object>) iterator.next();
+			String course_exam_type = ((BigDecimal) map.get("course_exam_type")).toString();
+			String text = null;
+
+			for (FrameDict frameDict : courseNatureframeDict) {
+				if (!StringUtils.isEmpty(course_exam_type) && course_exam_type.equals(frameDict.getDict_value())) {
+					text = frameDict.getDict_text();
+				}
+			}
+
+			map.put("course_exam_type", text);
+
+		}
+		return new Ajax(courseList);
+	}
+
+	@RequestMapping("by/byTurnOutApply/queryCourseListByApplyId")
+	public Ajax queryCourseListByApplyId(Integer id) {
+		List<Map<String, Object>> courseList = this.kjUnifiedScoreDetailService.queryCourseListByApplyId(id);
+		List<FrameDict> courseNatureframeDict = FrameDictUtil.getFrameDict("CourseNature");
+		// 转换课程类型
+		for (Iterator iterator = courseList.iterator(); iterator.hasNext();) {
+			Map<String, Object> map = (Map<String, Object>) iterator.next();
+			String course_exam_type = ((BigDecimal) map.get("course_exam_type")).toString();
+			String text = null;
+
+			for (FrameDict frameDict : courseNatureframeDict) {
+				if (!StringUtils.isEmpty(course_exam_type) && course_exam_type.equals(frameDict.getDict_value())) {
+					text = frameDict.getDict_text();
+				}
+			}
+
+			map.put("course_exam_type", text);
+
+		}
+		return new Ajax(courseList);
+	}
+
+	/**
+	 * @param byTurnOutApply
+	 * @return 保存转考申请
+	 */
+	@RequestMapping("by/byTurnOutApply/add")
+	public Ajax add(String filePath, ByTurnOutApply byTurnOutApply) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+		if (null == byTurnOutApply.getIn_ticket_no() || byTurnOutApply.getIn_ticket_no().length() != 12) {
+			throw new BusinessException("外省准考证号必须是12位!");
+		}
+
+		if(std.getTicket_no().equals(byTurnOutApply.getIn_ticket_no())){
+			throw new BusinessException("外省准考证号不能与我区准考证一样,请填写正确的外省准考证号!(注意:外省准考证号必须填写准确,否则转入地省级教育机构将无法受理转入)");
+		}
+		
+
+		List<Map<String, Object>> courseList = this.kjUnifiedScoreDetailService.listStdScore(std.getId(),
+				byTurnOutApply.getMajor_id());
+		if (courseList == null || courseList.size() == 0) {
+			throw new BusinessException("没有可转考的成绩!");
+		}
+		ByTurnTimeConfig config = this.timeConfigService.findTimeConfig(TurnType.TURN_OUT.ordinal());
+		if (config == null || !config.getIn_time()) {
+			throw new BusinessException("不在转至外省在线申请时间范围之内,不允许提交申请!");
+		}
+		// 判断考生是否在违纪时间范围内
+		boolean flag = this.breakService.isBreakStdForTurn(std.getTicket_no());
+		if (flag) {
+			throw new BusinessException("考生有违纪信息,不能转考!");
+		}
+		byTurnOutApply.setTime_config_id(config.getId());
+		byTurnOutApply.setStd_reg_id(std.getId());
+		ByTurnOutApply apply = this.byTurnOutApplyService.findTurnOutApply(byTurnOutApply, config.getId());
+		if (apply != null) {
+			throw new BusinessException("当前批次已有转出申请记录,请勿重复提交!");
+		}
+
+		byTurnOutApply.setTicket_path(filePath);
+
+		PlMajor major = this.plMajorService.find(byTurnOutApply.getMajor_id());
+		if (null != major) {
+			byTurnOutApply.setMajor_code(major.getMajor_code());
+			byTurnOutApply.setMajor_name(major.getMajor_name());
+		}
+
+		this.byTurnOutApplyService.insertTurnOutApply(byTurnOutApply, std, config);
+
+		return new Ajax();
+	}
+
+	@RequestMapping("by/byTurnOutApply/upload")
+	public Ajax upload(MultipartFile file) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		String filePath = uploadFile(std, std.getTicket_no(), file);
+		return new Ajax(filePath);
+	}
+
+	/**
+	 * @param file:外省准考证
+	 * @param pro_code:外省省份编码
+	 *            处理考生上传的外省准考证
+	 */
+	private String uploadFile(StdRegInfo std, String pro_code, MultipartFile file) {
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		if (StringHelper.isNotEmpty(extension)) {
+			extension = extension.toLowerCase();
+		}
+		String cert_no = std.getCert_no();
+		String rootPath = SysConst.getAppConfig().getUploadBase();
+		try {
+			makeDir(rootPath);
+			String fullFileName = rootPath + SysConst.IMG_TICKET_PREFIX + pro_code + "_" + cert_no + "." + extension;
+			file.transferTo(new File(fullFileName));
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new BusinessException("文件上传错误,请检查文件");
+		}
+		return SysConst.IMG_TICKET_PREFIX + pro_code + "_" + cert_no + "." + extension;
+	}
+
+	/**
+	 * @param rootPath:目录路径
+	 *            创建目录
+	 */
+	private void makeDir(String rootPath) {
+		File dir = new File(rootPath + SysConst.IMG_TICKET_PREFIX);
+		if (!dir.exists())
+			dir.mkdir();
+	}
+
+	@RequestMapping("by/byTurnOutApply/edit")
+	public Ajax edit(String filePath, ByTurnOutApply byTurnOutApply) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+		if (null == byTurnOutApply.getIn_ticket_no() || byTurnOutApply.getIn_ticket_no().length() != 12) {
+			throw new BusinessException("外省准考证号必须是12位!");
+		}
+		
+		if(std.getTicket_no().equals(byTurnOutApply.getIn_ticket_no())){
+			throw new BusinessException("外省准考证号不能与我区准考证一样,请填写正确的外省准考证号!(注意:外省准考证号必须填写准确,否则转入地省级教育机构将无法受理转入)");
+		}
+
+		List<Map<String, Object>> courseList = this.kjUnifiedScoreDetailService.listStdScore(std.getId(),
+				byTurnOutApply.getMajor_id());
+		if (courseList == null || courseList.size() == 0) {
+			throw new BusinessException("没有可转考的成绩!");
+		}
+
+		ByTurnOutApply apply = this.byTurnOutApplyService.find(byTurnOutApply.getId());
+
+		/*
+		 * // 地市打回,校验是否在地市审核时间范围之内 if(apply.getAudit_type().intValue() == 0){
+		 * ByTurnTimeConfig audit_config =
+		 * this.timeConfigService.findTimeConfig(4); if(audit_config == null) {
+		 * throw new BusinessException("不在转至外省地市审核时间范围之内,不允许修改申请信息!"); }
+		 * //状态设置为待现场确认 apply.setStatus(TurnStatus.FIRST_AUDIT.ordinal());
+		 * }else{ //区打回,校验是否在地市审核时间范围之内 ByTurnTimeConfig audit_config =
+		 * this.timeConfigService.findTimeConfig(6); if(audit_config == null) {
+		 * throw new BusinessException("不在转至外省考试院审核时间范围之内,不允许修改申请信息!"); }
+		 * 
+		 * //状态设置为省级审核 apply.setStatus(TurnStatus.PROVINCE_AUDIT.ordinal()); }
+		 */
+
+		// 区打回,校验是否在区审核时间范围之内
+		ByTurnTimeConfig audit_config = this.timeConfigService.findTimeConfig(6);
+		if (audit_config == null || !audit_config.getIn_time()) {
+			throw new BusinessException("不在转至外省考试院审核时间范围之内,不允许修改申请信息!");
+		}
+
+		// 状态设置为省级审核
+		apply.setStatus(TurnStatus.PROVINCE_AUDIT.ordinal());
+
+		ByTurnTimeConfig config = this.timeConfigService.findTimeConfig(TurnType.TURN_OUT.ordinal());
+
+		if (!StringUtils.isEmpty(filePath)) {
+			byTurnOutApply.setTicket_path(filePath);
+		}
+		apply.setMajor_id(byTurnOutApply.getMajor_id());
+		apply.setIn_prov_code(byTurnOutApply.getIn_prov_code());
+		apply.setIn_ticket_no(byTurnOutApply.getIn_ticket_no());
+		apply.setMajor_code(this.plMajorService.find(apply.getMajor_id()).getMajor_code());
+		apply.setTime_config_id(config.getId());
+		apply.setStd_mobile(byTurnOutApply.getStd_mobile());
+		// apply.setApply_time(LocalDateTime.now());
+
+		// this.byTurnOutApplyService.edit(apply);
+
+		PlMajor major = this.plMajorService.find(byTurnOutApply.getMajor_id());
+		if (null != major) {
+			byTurnOutApply.setMajor_code(major.getMajor_code());
+			byTurnOutApply.setMajor_name(major.getMajor_name());
+		}
+
+		this.byTurnOutApplyService.editTurnOutApply(apply, std, config);
+		return new Ajax();
+	}
+
+	// @RequestMapping("by/byTurnOutApply/delete")
+	public Ajax delete(Integer[] ids) {
+		for (Integer id : ids) {
+			this.byTurnOutApplyService.delete(id);
+		}
+		return new Ajax();
+	}
+
+	@RequestMapping("by/byTurnOutApply/get")
+	public Ajax get(Integer id) {
+		return new Ajax(this.byTurnOutApplyService.find(id));
+	}
+
+	/**
+	 * 申请之前-考生信息判断
+	 */
+	private void judgeStdInfo(StdRegInfo std) {
+		FrameAssertUtil.isNotNull(std, "请重新登录");
+		FrameDict occ = FrameDictUtil.getFrameDict("std_occupation", std.getStd_occupation());
+		FrameAssertUtil.isNotNull(occ, "请补充个人信息中的职业信息");
+		FrameDict family = FrameDictUtil.getFrameDict("std_family_reg", std.getStd_family_reg());
+		FrameAssertUtil.isNotNull(family, "请补充个人信息中的户籍信息");
+		FrameDict political = FrameDictUtil.getFrameDict("std_political_status", std.getPolitical_status());
+		FrameAssertUtil.isNotNull(political, "请补充个人信息中的政治面貌");
+		FrameDict nation = FrameDictUtil.getFrameDict("std_nation", "" + std.getStd_nation());
+		FrameAssertUtil.isNotNull(nation, "请补充个人信息中的民族信息");
+		if (StringHelper.isEmpty(std.getStd_birth())
+				|| (std.getStd_birth().length() != 8 && std.getStd_birth().length() != 10)) {
+			throw new BusinessException("个人信息中的生日不正确,请修正");
+		} else if (std.getStd_birth().length() == 8) {
+			String regex = "^(19|20)\\d{2}(1[0-2]|0?[1-9])(0?[1-9]|[1-2][0-9]|3[0-1])$";
+			if (!Pattern.matches(regex, std.getStd_birth())) {
+				throw new BusinessException("个人信息中的生日不正确,请修正");
+			}
+		} else if (std.getStd_birth().length() == 10) {
+			String regex = "^(19|20)\\d{2}-(1[0-2]|0?[1-9])-(0?[1-9]|[1-2][0-9]|3[0-1])$";
+			if (!Pattern.matches(regex, std.getStd_birth())) {
+				throw new BusinessException("个人信息中的生日不正确,请修正");
+			}
+		}
+
+	}
+
+	/**
+	 * @param byTurnOutApply
+	 * @param score_ids:选择的kj_unified_score_detail表ID集合
+	 * @return 最新-保存转考申请
+	 */
+	@RequestMapping("by/byTurnOutApply/addNew")
+	public Ajax addNew(ByTurnOutApply byTurnOutApply, Integer[] score_ids) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.hasValue(score_ids, "请选择转考课程");
+		ByTurnTimeConfig config = this.timeConfigService.findTimeConfig(TurnType.TURN_OUT.ordinal());
+		if (config == null || !config.getIn_time()) {
+			throw new BusinessException("请联系考试院开放转考!");
+		}
+		// 考生信息齐全判断
+		this.judgeStdInfo(std);
+		// 判断考生是否在违纪时间范围内
+		boolean flag = this.breakService.isBreakStdForTurn(std.getTicket_no());
+		if (flag) {
+			throw new BusinessException("考生有违纪信息,不能转考!");
+		}
+		byTurnOutApply.setTime_config_id(config.getId());
+		byTurnOutApply.setStd_reg_id(std.getId());
+		ByTurnOutApply apply = this.byTurnOutApplyService.findTurnOutApply(byTurnOutApply, config.getId());
+		if (apply != null) {
+			throw new BusinessException("当前批次已有转出申请记录,请勿重复提交!");
+		}
+		// 选择的转考课程,写入到转出省外成绩表
+		this.outScoreService.insertTurnoutScore(std, byTurnOutApply.getMajor_id(), score_ids, config.getId());
+		this.byTurnOutApplyService.insertTurnOutApplyNew(byTurnOutApply, std, config);
+		return new Ajax();
+	}
+
+	@RequestMapping("by/byTurnOutApply/downApplyPdf")
+	public void downApplyPdf(Integer id) {
+		StdRegInfo std = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+		String file_name = null;
+
+		ByTurnOutApply apply = this.byTurnOutApplyService.find(id);
+
+		if (null == apply) {
+			this.writeAlert("申请单信息为空,请重新刷新页面。");
+			return;
+		} else if (apply.getStd_reg_id().intValue() != std.getId()) {
+			this.writeAlert("申请单对应考生与当前登录考生账号不一致,请重新登录。");
+			return;
+		}
+
+		file_name = "高等教育自学考试转考(转出)登记表(" + std.getTicket_no() + ").pdf";
+
+		try {
+			this.downloadFile(this.byTurnOutApplyService.printTurnout(std, apply), file_name, true);
+		} catch (Exception e) {
+			this.writeAlert(e.getMessage());
+		}
+
+	}
+
+	@RequestMapping("by/byTurnOutApply/confirmByApply")
+	public Ajax confirmByApply(Integer id) {
+		Ajax ajax = new Ajax();
+
+		StdRegInfo std = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+		ByTurnOutApply apply = this.byTurnOutApplyService.find(id);
+
+		if (null == apply) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("申请单信息为空,请重新刷新页面。");
+			return ajax;
+
+		} else if (apply.getStd_reg_id().intValue() != std.getId()) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("申请单对应考生与当前登录考生账号不一致,请重新登录。");
+			return ajax;
+
+		}
+		
+		if (apply.getStatus().intValue() != 8) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("申请单状态不是待考生网上确认,不允许网上确认!");
+			return ajax;
+
+		}
+		
+		ByTurnTimeConfig config = this.timeConfigService.findTimeConfig(7);
+		if (config == null || !config.getIn_time()) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("不在转至外省网上确认时间范围之内,不允许网上确认!");
+			return ajax;
+		}
+		
+		if(!this.timeConfigService.isCurrYearCode(TurnType.TURN_OUT.ordinal(), apply.getTime_config_id())){
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("申请单不是当前批次下的申请单,不允许网上确认!");
+			return ajax;
+		}
+		
+
+		apply.setStatus(4);
+		this.byTurnOutApplyService.edit(apply);
+
+		return ajax;
+
+	}
+
+}

+ 78 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/cf/CfOrganizationControl.java

@@ -0,0 +1,78 @@
+package cn.hmsoft.ses.control.cf;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.data.model.cf.CfOrganization;
+import cn.hmsoft.ses.service.iface.cf.ICfOrganizationService;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ * 机构表 包括:主考学校、助学机构、区考办、市考办、省考办 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2018-10-18 14:13:22
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class CfOrganizationControl {
+
+    @Autowired
+    private ICfOrganizationService cfOrganizationService;
+	
+    @RequestMapping("cf/cfOrganization/page")
+    public Ajax pageCfOrganization(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.cfOrganizationService.pageCfOrganization(query, start, limit, order, type));
+    }
+    
+    /**
+     * @param org_type :机构类型
+     * 根据类型查询机构列表
+     */
+    @RequestMapping("std/cfOrganization/list")
+    public Ajax listCfOrganization(Integer org_type) {
+        return new Ajax(this.cfOrganizationService.listOrganization(org_type));
+    }
+    
+    @RequestMapping("std/cfOrganization/listOrderBy")
+    public Ajax listOrderBy(Integer org_type) {
+        return new Ajax(this.cfOrganizationService.listOrderBy(org_type));
+    }
+    
+    /**
+     * add by huangzibo 20210421 特殊处理毕业论文答辩申请:广西医科大学不允许在线申请
+     * @param org_type
+     * @return
+     */
+    @RequestMapping("std/cfOrganization/listOrderForByPage")
+    public Ajax listOrderForByPage(Integer org_type) {
+        return new Ajax(this.cfOrganizationService.listOrderForByPage(org_type));
+    }
+    
+    
+    
+    @RequestMapping("std/cfOrganization/get")
+    public Ajax getCfOrganizationById(Integer id) {
+        return new Ajax(this.cfOrganizationService.find(id));
+    }    
+    
+    @RequestMapping("std/cfOrganization/assistListAll")
+    public Ajax listAll(CfOrganization cfOrg) {
+    	return new Ajax(this.cfOrganizationService.assistlistAll(cfOrg));
+    }  
+    
+    @RequestMapping("std/cfOrganization/querySchoolListByMajorId")
+    public Ajax querySchoolListByMajorId(Integer major_id) {
+    	return new Ajax(this.cfOrganizationService.schoolListByMajorId(major_id));
+    }  
+    
+    
+}

+ 1102 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/AtgBizIfaceService.java

@@ -0,0 +1,1102 @@
+package cn.hmsoft.ses.control.ifaceservice;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.gov.api.domain.StuffInfoVO;
+import com.alibaba.gov.callbackapi.response.CallbackAtgBizAffairReceiveResponse;
+
+import cn.hmsoft.frame.data.model.FrameDict;
+import cn.hmsoft.frame.data.model.FrameRegionProvince;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.frame.util.FrameZoneUtil;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.ses.common.MkConst;
+import cn.hmsoft.ses.constants.ByConst.TurnType;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.control.service.InterfaceControl;
+import cn.hmsoft.ses.data.dao.mk.MkCertEduApplyDao;
+import cn.hmsoft.ses.data.dao.mk.MkCertNeduApplyCourseDao;
+import cn.hmsoft.ses.data.dao.mk.MkCertNeduApplyDao;
+import cn.hmsoft.ses.data.dao.pl.PlCourseDao;
+import cn.hmsoft.ses.data.dao.pl.PlMajorCourseDao;
+import cn.hmsoft.ses.data.dao.pl.PlMajorDao;
+import cn.hmsoft.ses.data.model.by.ByTurnOutApply;
+import cn.hmsoft.ses.data.model.by.ByTurnTimeConfig;
+import cn.hmsoft.ses.data.model.mk.MkCertEduApply;
+import cn.hmsoft.ses.data.model.mk.MkCertNeduApply;
+import cn.hmsoft.ses.data.model.mk.MkCertNeduApplyCourse;
+import cn.hmsoft.ses.data.model.mk.MkCertTimeConfig;
+import cn.hmsoft.ses.data.model.mk.MkCertType;
+import cn.hmsoft.ses.data.model.pl.PlCourse;
+import cn.hmsoft.ses.data.model.pl.PlMajor;
+import cn.hmsoft.ses.data.model.pl.PlMajorCourse;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.helper.DateHelper;
+import cn.hmsoft.ses.service.iface.by.IByTurnOutApplyService;
+import cn.hmsoft.ses.service.iface.by.IByTurnTimeConfigService;
+import cn.hmsoft.ses.service.iface.kj.IKjUnifiedScoreDetailService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertEduApplyService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTimeConfigService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTypeService;
+import cn.hmsoft.ses.service.iface.mk.IMkPreEduApplyService;
+import cn.hmsoft.ses.service.iface.pl.IPlCourseService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorCourseService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdBreakDisciplineService;
+import cn.hmsoft.ses.service.iface.std.IStdRegInfoService;
+import cn.hmsoft.ses.util.RegexUtil;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 一网通办系统 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:15
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class AtgBizIfaceService extends InterfaceControl {
+
+	@Autowired
+	private IMkCertTimeConfigService timeConfigService;
+
+	@Autowired
+	private IStdRegInfoService stdRegInfoService;
+
+	@Autowired
+	private IPlMajorCourseService plMajorCourseService;
+
+	@Autowired
+	private IPlMajorService plMajorService;
+
+	@Autowired
+	private IMkCertTimeConfigService mkTimeConfigService;
+
+	@Autowired
+	private IMkPreEduApplyService mkPreEduApplyService;
+	@Autowired
+	private IMkCertTypeService mkCertTypeService;
+	@Autowired
+	private IMkCertEduApplyService mkCertEduApplyService;
+	@Autowired
+	private IPlCourseService plCourse;
+	@Autowired
+	private IByTurnOutApplyService byTurnOutApplyService;
+	@Autowired
+	private IStdBreakDisciplineService breakService;
+	@Autowired
+	private IByTurnTimeConfigService byTurnTimeConfigService;
+	@Autowired
+	private IKjUnifiedScoreDetailService kjUnifiedScoreDetailService;// 成绩服务
+	@Autowired
+	private MkCertNeduApplyDao mkCertNeduApplyDao;
+	@Autowired
+	private PlCourseDao plCourseDao;
+	@Autowired
+	private MkCertEduApplyDao mkCertEduApplyDao;
+	@Autowired
+	private PlMajorDao plMajorDao;
+	@Autowired
+	private PlMajorCourseDao plMajorCourseDao;
+	@Autowired
+	private MkCertNeduApplyCourseDao mkCertNeduApplyCourseDao;
+
+	@ApiOperation("办件收件回调")
+	@PostMapping("/atgBizIfaceService/receive")
+	public CallbackAtgBizAffairReceiveResponse receive(@RequestBody CallbackAtgBizAffairReceiveRequest request) {
+		CallbackAtgBizAffairReceiveResponse receiveResponse = new CallbackAtgBizAffairReceiveResponse();
+		receiveResponse.setResultStatus("S");
+		
+		if (Objects.isNull(request)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("办件表单请求信息为空");
+			LogHelper.info("办件表单请求信息为空");
+			return receiveResponse;
+		}
+
+		LogHelper.info("处理一网通办系统办件下发,表单数据:" + request.getAffFormInfo());
+		LogHelper.hisomeLogger.info("处理一网通办系统办件下发,表单数据:" + request.getAffFormInfo());
+
+		if (StringUtils.isEmpty(request.getMatterCode())) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("办件表单的权力事项编码为空");
+			LogHelper.info("办件表单的权力事项编码为空");
+			return receiveResponse;
+		}
+
+		if (StringUtils.isEmpty(request.getProjId())) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("办件表单的统一办件单号为空");
+			LogHelper.info("办件表单的统一办件单号为空");
+			return receiveResponse;
+		}
+
+		Map<String, String> extInfo = request.getExtInfo();
+		String matterCategory = null;
+
+		if (null == extInfo) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("办件表单的事项编码为空");
+			LogHelper.info("办件表单的事项编码为空");
+			return receiveResponse;
+		} else if (StringUtils.isEmpty(extInfo.get("matterCategory"))) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("办件表单的事项编码为空");
+			LogHelper.info("办件表单的事项编码为空");
+			return receiveResponse;
+		}
+
+		matterCategory = extInfo.get("matterCategory");
+
+		if ("000705003000001".equals(matterCategory)) {
+			this.handleNEdu(receiveResponse, request);
+		} else if ("000705003000002".equals(matterCategory)) {
+			this.handleEdu(receiveResponse, request);
+		} else if ("000705004000001".equals(matterCategory)) {
+			this.handleTurnOut(receiveResponse, request);
+		} else {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("办件表单的权力事项编码不在学历免考、非学历免考以及转出外省范围之内,不受理该办件表单的权力事项编码");
+			LogHelper.info("办件表单的权力事项编码不在学历免考、非学历免考以及转出外省范围之内,不受理该办件表单的权力事项编码");
+			return receiveResponse;
+		}
+		
+		/*if(!"S".equals(receiveResponse.getResultStatus())){
+			// 起线程5秒后调用办结接口
+			AtgBizIfaceThread thread = new AtgBizIfaceThread();
+			thread.setFlow_no(request.getProjId());
+			thread.setReceiveResponse(receiveResponse);
+			thread.start();
+		}*/
+
+		return receiveResponse;
+	}
+
+	private void handleTurnOut(CallbackAtgBizAffairReceiveResponse receiveResponse,
+			CallbackAtgBizAffairReceiveRequest request) {
+		ByTurnTimeConfig config = this.byTurnTimeConfigService.findTimeConfig(TurnType.TURN_OUT.ordinal());
+		
+		if (config == null || !config.getIn_time()) {
+
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("不在转出开放时间范围之内,不受理转出业务");
+			LogHelper.info("不在转出开放时间范围之内,不受理转出业务");
+			return;
+		}
+		 
+
+		// 开始处理报文数据
+		JSONObject fromObject = null;
+		try {
+			fromObject = JSON.parseObject(request.getAffFormInfo());
+		} catch (Exception e) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("办件表单affFormInfo信息,不是正确的JSON格式");
+			LogHelper.info("办件表单affFormInfo信息,不是正确的JSON格式");
+			return;
+		}
+
+		String cert_no = (String) fromObject.get("self.ZJHM");
+
+		// 根据证件号获取考生信息
+		StdRegInfo dbStd = this.stdRegInfoService.queryStdByCertNo(cert_no);
+		if (null == dbStd) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("证件号" + cert_no + "在广西自考网上系统不存在,请先在广西自考网上系统注册后再办理");
+			LogHelper.info("证件号" + cert_no + "在广西自考网上系统不存在,请先在广西自考网上系统注册后再办理");
+			return;
+		}
+
+		String ticket_no = (String) fromObject.get("self.WSZKZH");
+
+		if (StringUtils.isEmpty(ticket_no)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("外省准考证不允许为空");
+			LogHelper.info("外省准考证不允许为空");
+			return;
+		} else if (ticket_no.length() != 12) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("外省准考证号必须是12位");
+			LogHelper.info("外省准考证号必须是12位");
+			return;
+		} else if (ticket_no.equals(dbStd.getTicket_no())) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("外省准考证号不能与我区准考证一样,请填写正确的外省准考证号!(注意:外省准考证号必须填写准确,否则转入地省级教育机构将无法受理转入)");
+			LogHelper.info("外省准考证号不能与我区准考证一样,请填写正确的外省准考证号!(注意:外省准考证号必须填写准确,否则转入地省级教育机构将无法受理转入)");
+			return;
+		}
+
+		String major_code = (String) fromObject.get("self.ZY11");
+
+		if (StringUtils.isEmpty(major_code)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("专业不允许为空");
+			LogHelper.info("专业不允许为空");
+			return;
+		}
+
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("major_code", major_code);
+		map.put("status", 1);// 开考
+
+		// 根据专业代码获取专业信息
+		List<PlMajor> majors = this.plMajorService.listByMap(map);
+		if (null == majors || majors.isEmpty()) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("专业在广西自考网上系统不存在");
+			LogHelper.info("专业在广西自考网上系统不存在");
+			return;
+		}
+
+		String mobile = (String) fromObject.get("self.LXDH");
+
+		if (StringUtils.isEmpty(mobile)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("联系电话不允许为空");
+			LogHelper.info("联系电话不允许为空");
+			return;
+		} else if (mobile.length() > 16) {
+			receiveResponse.setResultStatus("S");
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("联系电话不能超过16个字");
+			LogHelper.info("联系电话不能超过16个字");
+			return;
+		}
+
+		List<Map<String, Object>> courseList = this.kjUnifiedScoreDetailService.listStdScore(dbStd.getId(), null);
+		if (courseList == null || courseList.size() == 0) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("没有可转考的成绩");
+			LogHelper.info("没有可转考的成绩");
+			return;
+		}
+
+		String prov_code = (String) fromObject.get("self.ZZSF");
+
+		if (StringUtils.isEmpty(prov_code)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("转至省份不允许为空");
+			LogHelper.info("转至省份不允许为空");
+			return;
+		} else {
+			List<FrameRegionProvince> provinces = FrameZoneUtil.getProvinceArray(false);
+			boolean is_province = false;
+			for (FrameRegionProvince province : provinces) {
+				if (prov_code.equals(province.getProvince_id() + "")) {
+					is_province = true;
+					break;
+				}
+			}
+
+			if (!is_province) {
+				receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+				receiveResponse.setResultMsg("转至省份在广西自考网上系统不存在");
+				LogHelper.info("转至省份在广西自考网上系统不存在");
+				return;
+			}
+
+		}
+
+		// 判断考生是否在违纪时间范围内
+		boolean flag = this.breakService.isBreakStdForTurn(dbStd.getTicket_no());
+		if (flag) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("考生有违纪信息,不能转出");
+			LogHelper.info("考生有违纪信息,不能转出");
+			return;
+		}
+
+		ByTurnOutApply byTurnOutApply = new ByTurnOutApply();
+		byTurnOutApply.setTime_config_id(config.getId());
+		byTurnOutApply.setStd_reg_id(dbStd.getId());
+
+		ByTurnOutApply apply = this.byTurnOutApplyService.findTurnOutApply(byTurnOutApply, config.getId());
+		if (apply != null) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("当前批次已有转出申请记录,请勿重复提交");
+			LogHelper.info("当前批次已有转出申请记录,请勿重复提交");
+			return;
+		}
+
+		byTurnOutApply.setIn_prov_code(prov_code);
+		byTurnOutApply.setIn_ticket_no(ticket_no);
+		byTurnOutApply.setMajor_id(majors.get(0).getId());
+		byTurnOutApply.setMajor_code(majors.get(0).getMajor_code());
+		byTurnOutApply.setMajor_name(majors.get(0).getMajor_name());
+
+		byTurnOutApply.setZw_flow_no(request.getProjId());
+		byTurnOutApply.setStd_mobile(mobile);
+		
+		LocalDateTime now = null;
+		MkCertTimeConfig time = this.timeConfigService.getDataBaseTime();
+		if (null != time && null != time.getStart_time()) {
+			now = time.getStart_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+		
+		byTurnOutApply.setApply_time(now);
+
+		this.byTurnOutApplyService.insertTurnOutApply(byTurnOutApply, dbStd, config);
+
+		// 处理报文数据结束
+		receiveResponse.setResultStatus("S");
+		receiveResponse.setResultCode("GXZK000000");
+		LogHelper.info("受理一网通办转出申请成功");
+
+	}
+
+	private void handleEdu(CallbackAtgBizAffairReceiveResponse receiveResponse,
+			CallbackAtgBizAffairReceiveRequest request) {
+		// 批次信息
+		MkCertTimeConfig dbTimeConfig = this.mkTimeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+
+		LocalDateTime now = null;
+		MkCertTimeConfig time = this.timeConfigService.getDataBaseTime();
+		if (null != time && null != time.getStart_time()) {
+			now = time.getStart_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+
+		
+		if (!DateHelper.isBetween(now, dbTimeConfig.getStart_time(), dbTimeConfig.getEnd_time())) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("不在免考开放时间范围之内,不受理免考业务");
+			LogHelper.info("不在免考开放时间范围之内,不受理免考业务");
+			return;
+		}
+		 
+
+		// 开始处理报文数据
+		JSONObject fromObject = null;
+		try {
+			fromObject = JSON.parseObject(request.getAffFormInfo());
+		} catch (Exception e) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("办件表单affFormInfo信息,不是正确的JSON格式");
+			LogHelper.info("办件表单affFormInfo信息,不是正确的JSON格式");
+			return;
+		}
+
+		String cert_no = (String) fromObject.get("self.ZJHM");
+
+		// 根据证件号获取考生信息
+		StdRegInfo dbStd = this.stdRegInfoService.queryStdByCertNo(cert_no);
+		if (null == dbStd) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("证件号" + cert_no + "在广西自考网上系统不存在,请先在广西自考网上系统注册后再办理");
+			LogHelper.info("证件号" + cert_no + "在广西自考网上系统不存在,请先在广西自考网上系统注册后再办理");
+			return;
+		}
+
+		String cert_code = (String) fromObject.get("self.XLZS");
+
+		if (StringUtils.isEmpty(cert_code)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("学历证书不允许为空");
+			LogHelper.info("学历证书不允许为空");
+			return;
+		}
+
+		MkCertType mkCertType = this.mkCertTypeService.queryMkCertTypeByCertCode(cert_code);
+		if (null == mkCertType) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("学历证书在广西自考网上系统不存在");
+			LogHelper.info("学历证书在广西自考网上系统不存在");
+			return;
+		}
+
+		String major_code = (String) fromObject.get("self.ZY11");
+
+		if (StringUtils.isEmpty(major_code)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("专业不允许为空");
+			LogHelper.info("专业不允许为空");
+			return;
+		}
+
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("major_code", major_code);
+		map.put("status", 1);// 开考
+
+		// 根据专业代码获取专业信息
+		List<PlMajor> majors = this.plMajorService.listByMap(map);
+		if (null == majors || majors.isEmpty()) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("专业在广西自考网上系统不存在");
+			LogHelper.info("专业在广西自考网上系统不存在");
+			return;
+		}
+
+		List<Map<String, Object>> scores = this.mkCertEduApplyService.queryScoreByStdIdForMk(dbStd.getId());
+
+		// 考生没有合格的统考成绩,或者没有合格的合成成绩(不包括百分百合成成绩),不允许提交免考申请
+		if (null == scores || scores.isEmpty()) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("您的账号没有自学考试合格成绩,不允许申请免考。");
+			LogHelper.info("您的账号没有自学考试合格成绩,不允许申请免考。");
+			return;
+		}
+
+		// 免考课程
+		String course_code = (String) fromObject.get("self.MKKC");
+
+		if (StringUtils.isEmpty(course_code)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("免考课程不允许为空");
+			LogHelper.info("免考课程不允许为空");
+			return;
+		}
+
+		// 已考课程名称
+		String course_name = (String) fromObject.get("self.YKKCMC");
+
+		if (StringUtils.isEmpty(course_name)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("已考课程名称不允许为空");
+			LogHelper.info("已考课程名称不允许为空");
+			return;
+		} else if (course_name.length() > 128) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("已考课程名称不允许超过128个字");
+			LogHelper.info("已考课程名称不允许超过128个字");
+			return;
+		}
+
+		// 已考分数
+		String course_score = (String) fromObject.get("self.YKFS");
+
+		if (StringUtils.isEmpty(course_score)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("已考分数不允许为空");
+			LogHelper.info("已考分数不允许为空");
+			return;
+		} else if (course_score.length() > 50) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("已考分数不允许超过50个字");
+			LogHelper.info("已考分数不允许超过50个字");
+			return;
+		}
+
+		Integer[] courseIds = null;
+
+		List<PlMajorCourse> courses = this.plMajorCourseService.listMajorCourse(majors.get(0).getId(),
+				course_code.split(","));
+		if (null == courses || courses.isEmpty()) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("在当前的专业下面不存在该课程");
+			LogHelper.info("在当前的专业下面不存在该课程");
+			return;
+		} else if (courses.size() > 1) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("一条申请单只能选择一门课程");
+			LogHelper.info("一条申请单只能选择一门课程");
+			return;
+		} else {
+			courseIds = new Integer[courses.size()];
+			int i = 0;
+			for (PlMajorCourse course : courses) {
+				courseIds[i] = course.getId();
+				i++;
+			}
+		}
+
+		// 附件
+		List<StuffInfoVO> suffInfoList = request.getSuffInfoList();
+		if (null == suffInfoList || suffInfoList.isEmpty()) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("材料附件不允许为空");
+			LogHelper.info("材料附件不允许为空");
+			return;
+		}
+
+		String savePath = SysConst.getAppConfig().getUploadBase();
+		String file_name = null;
+
+		// 根据材料附件路径下载材料
+		File file = null;
+		String extension = null;
+		String fileSeq = null;
+		for (StuffInfoVO vo : suffInfoList) {
+			String[] attachPaths = vo.getAttachPath().split(";");
+			for (String attachPath : attachPaths) {
+				LogHelper.info("材料附件路径:" + attachPath);
+				extension = attachPath.substring(attachPath.lastIndexOf(".") + 1);
+				fileSeq = this.mkPreEduApplyService.getFileSeq();
+				file_name = SysConst.IMG_NEDU_PREFIX + cert_no + "_" + new Date().getTime() + "_" + fileSeq + "."
+						+ extension;
+				file = downLoadFromUrl(attachPath, file_name, savePath);
+				if (!file.exists()) {
+					receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+					receiveResponse.setResultMsg("材料附件下载失败");
+					LogHelper.info("材料附件下载失败");
+					return;
+				}
+			}
+		}
+
+		MkCertEduApply apply = new MkCertEduApply();
+		apply.setCert_type_id(mkCertType.getId());
+		apply.setStd_reg_id(dbStd.getId());
+		apply.setCert_no(apply.getCert_no());
+		apply.setStd_name(dbStd.getStd_name());
+		apply.setTicket_no(dbStd.getTicket_no());
+		apply.setZw_flow_no(request.getProjId());
+		apply.setFile_path(file_name);
+
+		apply.setTime_config_id(dbTimeConfig.getId());
+
+		String currentTIme = DateHelper.format(now);
+		apply.setCreate_time(currentTIme);
+
+		String errorMsg = saveApply(apply, courses.get(0).getId(), course_name, course_score, dbStd);
+		if (!StringUtils.isEmpty(errorMsg)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg(errorMsg);
+			LogHelper.info(errorMsg);
+			return;
+		}
+
+		// 处理报文数据结束
+		receiveResponse.setResultStatus("S");
+		receiveResponse.setResultCode("GXZK000000");
+		LogHelper.info("受理一网通办非学历免考申请成功");
+
+	}
+
+	private String saveApply(MkCertEduApply apply, Integer course_id, String course_name, String course_score,
+			StdRegInfo std) {
+		MkCertTimeConfig timeConfig = this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+		LocalDateTime now = null;
+		MkCertTimeConfig time = this.timeConfigService.getDataBaseTime();
+		if (null != time && null != time.getStart_time()) {
+			now = time.getStart_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+
+		String currentTIme = DateHelper.format(now);
+		StringBuilder errorMsg = new StringBuilder();
+
+		MkCertEduApply newApply = new MkCertEduApply();
+		newApply.setStd_cert_no(std.getCert_no());
+		newApply.setStd_name(std.getStd_name());
+		newApply.setStd_reg_id(std.getId());
+		newApply.setTime_config_id(timeConfig.getId());
+		newApply.setStatus(MkConst.EduApply.LOCAL_VERIFY.ordinal());
+		newApply.setCreate_time(currentTIme);
+
+		newApply.setTicket_no(apply.getTicket_no());
+		newApply.setCert_type_id(apply.getCert_type_id());
+		newApply.setCert_no(apply.getCert_no());
+		newApply.setTicket_no(apply.getTicket_no());
+		newApply.setTime_config_id(apply.getTime_config_id());
+		// newApply.setCert_course_name(plCourse.getCourse_code() + "-"
+		// +plCourse.getCourse_name());
+
+		newApply.setCert_course_id(course_id);
+		newApply.setDone_course_name(course_name);
+		newApply.setDone_course_score(course_score);
+		newApply.setFile_path(apply.getFile_path());
+		newApply.setMajor_id(apply.getMajor_id());
+		newApply.setZw_flow_no(apply.getZw_flow_no());
+		// this.mkCertEduApplyService.deleteByCourseId(course_id);
+
+		boolean isExist = this.mkCertEduApplyService.checkExist(course_id, std.getId(), newApply.getTime_config_id());
+		if (isExist) {
+			PlCourse plCourse = this.plCourse.find(course_id);
+			errorMsg.append("课程[" + plCourse.getCourse_name() + "] 已经申请过,不能重复提交申请;");
+			return errorMsg.toString();
+		}
+
+		// 根据专业和课程查询课程的属性
+		PlMajorCourse plMajorCourse = this.plMajorCourseService.findMajorCourse(apply.getMajor_id(), course_id);
+		// 专业课时进行校验
+		if (null != plMajorCourse && 2 == plMajorCourse.getCourse_nature().intValue()) {
+			// 根据考生获取 考生已存在的专业课程的免考成绩数+本批次已申请的免考的专业课程数+本次正在申请的免考的专业课程数
+			MkCertEduApply mkCertEduApply = this.mkCertEduApplyService.queryScoreCountByStdIdForMk(apply.getMajor_id(),
+					std.getId(), apply.getTime_config_id(), null);
+			if (null != mkCertEduApply) {
+				// 申请免考的专业课程不能超过30%
+				long course_count_max = Math.round(mkCertEduApply.getCourse_count() * 0.3);
+				if (mkCertEduApply.getMk_count() + mkCertEduApply.getScore_count() >= course_count_max) {
+					PlMajor plMajor = this.plMajorService.find(apply.getMajor_id());
+					errorMsg.append("您申请免考的专业【").append(plMajor.getMajor_code()).append("-")
+							.append(plMajor.getMajor_name()).append("】,已经申请免考的专业课程数量超过该专业的专业课程数量的30%,不允许提交当前课程的免考申请。");
+					return errorMsg.toString();
+				}
+			}
+		}
+
+		this.mkCertEduApplyService.insert(newApply);
+
+		return errorMsg.toString();
+	}
+
+	private void handleNEdu(CallbackAtgBizAffairReceiveResponse receiveResponse,
+			CallbackAtgBizAffairReceiveRequest request) {
+
+		// 批次信息
+		MkCertTimeConfig dbTimeConfig = this.mkTimeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+
+		LocalDateTime now = null;
+		MkCertTimeConfig time = this.timeConfigService.getDataBaseTime();
+		if (null != time && null != time.getStart_time()) {
+			now = time.getStart_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+
+		if (!DateHelper.isBetween(now, dbTimeConfig.getStart_time(), dbTimeConfig.getEnd_time())) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("不在免考开放时间范围之内,不受理免考业务");
+			LogHelper.info("不在免考开放时间范围之内,不受理免考业务");
+			return;
+		}
+		 
+
+		// 开始处理报文数据
+		JSONObject fromObject = null;
+		try {
+			fromObject = JSON.parseObject(request.getAffFormInfo());
+		} catch (Exception e) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("办件表单affFormInfo信息,不是正确的JSON格式");
+			LogHelper.info("办件表单affFormInfo信息,不是正确的JSON格式");
+			return;
+		}
+
+		String cert_no = (String) fromObject.get("self.ZJHM");
+
+		// 根据证件号获取考生信息
+		StdRegInfo dbStd = this.stdRegInfoService.queryStdByCertNo(cert_no);
+		if (null == dbStd) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("证件号" + cert_no + "在广西自考网上系统不存在,请先在广西自考网上系统注册后再办理");
+			LogHelper.info("证件号" + cert_no + "在广西自考网上系统不存在,请先在广西自考网上系统注册后再办理");
+			return;
+		}
+
+		String std_name = (String) fromObject.get("self.SQRXM");
+		if (StringUtils.isEmpty(std_name)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("姓名不允许为空");
+			LogHelper.info("姓名不允许为空");
+			return;
+		} else if (std_name.length() > 32) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("姓名不允许超过32个字");
+			LogHelper.info("姓名不允许超过32个字");
+			return;
+		}
+
+		String score = (String) fromObject.get("self.KSCJ");
+
+		if (StringUtils.isEmpty(score)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("考试成绩不允许为空");
+			LogHelper.info("考试成绩不允许为空");
+			return;
+		} else if (score.length() > 9) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("考试成绩不允许超过9个字");
+			LogHelper.info("考试成绩不允许超过9个字");
+			return;
+		} else if (!RegexUtil.isFloatNum(score)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("考试成绩输入不合法,请输入数字,如:99 。60(及格) 70(取中间值)90(优秀)");
+			LogHelper.info("考试成绩输入不合法,请输入数字,如:99 。60(及格) 70(取中间值)90(优秀)");
+			return;
+		}
+
+		String major_code = (String) fromObject.get("self.ZYBHHMC");
+
+		if (StringUtils.isEmpty(major_code)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("专业不允许为空");
+			LogHelper.info("专业不允许为空");
+			return;
+		}
+
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("major_code", major_code);
+		map.put("status", 1);// 开考
+
+		// 根据专业代码获取专业信息
+		List<PlMajor> majors = this.plMajorService.listByMap(map);
+		if (null == majors || majors.isEmpty()) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("专业在广西自考网上系统不存在");
+			LogHelper.info("专业在广西自考网上系统不存在");
+			return;
+		}
+
+		// 证书类别
+		String cert_type_catalog = (String) fromObject.get("self.ZSLB");
+
+		if (StringUtils.isEmpty(cert_type_catalog)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("证书类别不允许为空");
+			LogHelper.info("证书类别不允许为空");
+			return;
+		}
+
+		FrameDict dict = FrameDictUtil.getFrameDict("cert_level", cert_type_catalog);
+		if (null == dict) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("证书类别在广西自考网上系统不存在");
+			LogHelper.info("证书类别在广西自考网上系统不存在");
+			return;
+		}
+
+		// 证书类型
+		String cert_type_id = (String) fromObject.get("self.ZSLX");
+
+		if (StringUtils.isEmpty(cert_type_id)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("证书类别不允许为空");
+			LogHelper.info("证书类别不允许为空");
+			return;
+		}
+
+		dict = FrameDictUtil.getFrameDict("cert_level_" + cert_type_catalog, cert_type_id);
+		if (null == dict) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("证书类型在广西自考网上系统不存在");
+			LogHelper.info("证书类型在广西自考网上系统不存在");
+			return;
+		}
+
+		// 证书编号
+		String cert_number = (String) fromObject.get("self.ZSBH8");
+
+		if (StringUtils.isEmpty(cert_number)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("证书编号不允许为空");
+			LogHelper.info("证书编号不允许为空");
+			return;
+		} else if (cert_number.length() > 64) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("证书编号不允许超过64个字");
+			LogHelper.info("证书编号不允许超过64个字");
+			return;
+		}
+
+		// 考试时间
+		String exam_date = (String) fromObject.get("self.KSSJ95");
+
+		if (StringUtils.isEmpty(exam_date)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("考试时间不允许为空");
+			LogHelper.info("考试时间不允许为空");
+			return;
+		} else if (exam_date.length() > 50) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("考试时间不允许超过50个字");
+			LogHelper.info("考试时间不允许超过50个字");
+			return;
+		}
+
+		// 课程
+		String course_code = (String) fromObject.get("self.KC");
+
+		if (StringUtils.isEmpty(course_code)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("课程不允许为空");
+			LogHelper.info("课程不允许为空");
+			return;
+		}
+
+		String[] courseIds = null;
+		List<PlMajorCourse> courses = this.plMajorCourseService.listMajorCourse(majors.get(0).getId(),
+				course_code.split(";"));
+		if (null == courses || courses.isEmpty()) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("在当前的专业下面不存在该课程");
+			LogHelper.info("在当前的专业下面不存在该课程");
+			return;
+		} else {
+			if (courses.size() > 2) {
+				receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+				receiveResponse.setResultMsg(
+						"一条申请单只允许选择一门课程或同时选择00018-计算机应用基础和00019-计算机应用基础(实践)!或同时选择00051-管理系统中计算机应用和00052-管理系统中计算机应用(实践)");
+				LogHelper.info(
+						"一条申请单只允许选择一门课程或同时选择00018-计算机应用基础和00019-计算机应用基础(实践)!或同时选择00051-管理系统中计算机应用和00052-管理系统中计算机应用(实践)");
+				return;
+			} else if (courses.size() == 2) {
+				String course_code1 = null;
+				String course_code2 = null;
+				int i = 0;
+				for (PlMajorCourse course : courses) {
+					if (0 == i) {
+						course_code1 = course.getCourse_code();
+					} else {
+						course_code2 = course.getCourse_code();
+					}
+					i++;
+				}
+
+				if (!(("00018".equals(course_code1) && "00019".equals(course_code2))
+						|| ("00019".equals(course_code1) && "00018".equals(course_code2)))
+						&& !(("00051".equals(course_code1) && "00052".equals(course_code2))
+								|| ("00052".equals(course_code1) && "00051".equals(course_code2)))) {
+					receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+					receiveResponse.setResultMsg(
+							"一条申请单只允许选择一门课程或同时选择00018-计算机应用基础和00019-计算机应用基础(实践)或同时选择00051-管理系统中计算机应用和00052-管理系统中计算机应用(实践)");
+					LogHelper.info(
+							"一条申请单只允许选择一门课程或同时选择00018-计算机应用基础和00019-计算机应用基础(实践)或同时选择00051-管理系统中计算机应用和00052-管理系统中计算机应用(实践)");
+					return;
+				} else {
+					courseIds = new String[courses.size()];
+					i = 0;
+					for (PlMajorCourse course : courses) {
+						courseIds[i] = course.getId() + "";
+						i++;
+					}
+				}
+
+			} else {
+				courseIds = new String[courses.size()];
+				int i = 0;
+				for (PlMajorCourse course : courses) {
+					courseIds[i] = course.getId() + "";
+					i++;
+				}
+			}
+
+		}
+
+		// 附件
+		List<StuffInfoVO> suffInfoList = request.getSuffInfoList();
+		if (null == suffInfoList || suffInfoList.isEmpty()) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg("材料附件不允许为空");
+			LogHelper.info("材料附件不允许为空");
+			return;
+		}
+
+		String savePath = SysConst.getAppConfig().getUploadBase();
+		String file_name = null;
+
+		// 根据材料附件路径下载材料
+		File file = null;
+		String extension = null;
+		String fileSeq = null;
+		for (StuffInfoVO vo : suffInfoList) {
+			String[] attachPaths = vo.getAttachPath().split(";");
+			for (String attachPath : attachPaths) {
+				extension = attachPath.substring(attachPath.lastIndexOf(".") + 1);
+				fileSeq = this.mkPreEduApplyService.getFileSeq();
+				file_name = SysConst.IMG_NEDU_PREFIX + cert_no + "_" + new Date().getTime() + "_" + fileSeq + "."
+						+ extension;
+				file = downLoadFromUrl(attachPath, file_name, savePath);
+				if (!file.exists()) {
+					receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+					receiveResponse.setResultMsg("材料附件下载失败");
+					LogHelper.info("材料附件下载失败");
+					return;
+				}
+			}
+		}
+
+		MkCertNeduApply apply = new MkCertNeduApply();
+
+		apply.setStd_reg_id(dbStd.getId());
+		apply.setStd_cert_no(cert_no);
+		apply.setCert_no(cert_number);
+		apply.setScore(Integer.parseInt(score));
+		apply.setStd_name(std_name);
+		apply.setCert_type_catalog(Integer.parseInt(cert_type_catalog));
+		apply.setCert_type_id(Integer.parseInt(cert_type_id));
+		apply.setExam_date(exam_date);
+		apply.setFile_path(file_name);
+		apply.setZw_flow_no(request.getProjId());
+
+		apply.setMajor_id(majors.get(0).getId());
+
+		apply.setTime_config_id(dbTimeConfig.getId());
+
+		String info = this.apply(apply, courseIds);
+		if (!StringUtils.isEmpty(info)) {
+			receiveResponse.setResultCode("CHANNEL_IDEMPOTENT");
+			receiveResponse.setResultMsg(info);
+			LogHelper.info(info);
+			return;
+		}
+
+		// 处理报文数据结束
+		receiveResponse.setResultStatus("S");
+		receiveResponse.setResultCode("GXZK000000");
+		LogHelper.info("受理一网通办免考申请成功");
+	}
+
+	private String apply(MkCertNeduApply apply, String[] courseIds) {
+		LocalDateTime now = null;
+		MkCertTimeConfig time = this.timeConfigService.getDataBaseTime();
+		if (null != time && null != time.getStart_time()) {
+			now = time.getStart_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+		
+		apply.setStatus(MkConst.NEduApply.LOCAL_VERIFY.ordinal());
+		apply.setCreate_time(DateHelper.format(now));
+		// 检查是否已经提交过
+		for (String courseId : courseIds) {
+			if (null != courseId) {
+				boolean isExist = this.mkCertNeduApplyDao.checkExist(Integer.valueOf(courseId), apply.getStd_reg_id(),
+						apply.getTime_config_id());
+				if (isExist) {
+					PlCourse plCourse = this.plCourse.find(Integer.valueOf(courseId));
+					return "课程[" + plCourse.getCourse_name() + "] 已经申请过,不能重复提交申请。";
+				}
+
+				// 根据专业和课程查询课程的属性
+				PlMajorCourse plMajorCourse = this.plMajorCourseDao.findMajorByCourse(apply.getMajor_id(),
+						Integer.valueOf(courseId));
+				// 专业课时进行校验
+				if (null != plMajorCourse && 2 == plMajorCourse.getCourse_nature().intValue()) {
+					// 根据考生获取 考生已存在的专业课程的免考成绩数+本批次已申请的免考的专业课程数+本次正在申请的免考的专业课程数
+					MkCertEduApply mkCertEduApply = this.mkCertEduApplyDao.queryScoreCountByStdIdForMk(
+							apply.getMajor_id(), apply.getStd_reg_id(), apply.getTime_config_id(), null);
+					if (null != mkCertEduApply) {
+						// 申请免考的专业课程不能超过30%
+						long course_count_max = Math.round(mkCertEduApply.getCourse_count() * 0.3);
+						if (mkCertEduApply.getMk_count() + mkCertEduApply.getScore_count() >= course_count_max) {
+							PlMajor plMajor = this.plMajorDao.find(apply.getMajor_id());
+							StringBuffer errorMsg = new StringBuffer();
+							errorMsg.append("您申请免考的专业【").append(plMajor.getMajor_code()).append("-")
+									.append(plMajor.getMajor_name())
+									.append("】,已经申请免考的专业课程数量超过该专业的专业课程数量的30%,不允许提交当前课程的免考申请。");
+							return errorMsg.toString();
+						}
+					}
+				}
+			}
+
+		}
+
+		this.mkCertNeduApplyDao.insert(apply);
+
+		for (String courseId : courseIds) {
+			PlCourse plCourse = this.plCourseDao.find(courseId);
+			MkCertNeduApplyCourse applyCourse = new MkCertNeduApplyCourse();
+			applyCourse.setNedu_apply_id(apply.getId());
+			applyCourse.setCourse_id(plCourse.getId());
+			applyCourse.setCourse_code(plCourse.getCourse_code());
+			applyCourse.setCourse_name(plCourse.getCourse_name());
+			applyCourse.setStatus(MkConst.NStdApplyCourse.NEW.ordinal());
+			applyCourse.setOrg_id(apply.getOrg_id());
+			applyCourse.setStd_reg_id(apply.getStd_reg_id());
+			applyCourse.setStatus(MkConst.NEduApply.LOCAL_VERIFY.ordinal());
+			this.mkCertNeduApplyCourseDao.insert(applyCourse);
+		}
+
+		return null;
+	}
+
+	public File downLoadFromUrl(String urlStr, String fileName, String savePath) {
+		URL url = null;
+		HttpURLConnection conn = null;
+
+		InputStream inputStream = null;
+		FileOutputStream fos = null;
+
+		// 文件保存位置
+		File saveDir = new File(savePath);
+		if (!saveDir.exists()) {
+			saveDir.mkdirs();
+		}
+
+		File file = new File(saveDir + File.separator + fileName);
+
+		try {
+			url = new URL(urlStr);
+			conn = (HttpURLConnection) url.openConnection();
+			// 设置超时间为30秒
+			conn.setConnectTimeout(30 * 1000);
+			// 防止屏蔽程序抓取而返回403错误
+			conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
+
+			// 得到输入流
+			inputStream = conn.getInputStream();
+
+			// 获取自己数组
+			byte[] getData = readInputStream(inputStream);
+
+			fos = new FileOutputStream(file);
+			fos.write(getData);
+
+		} catch (Exception e) {
+			LogHelper.error(e);
+		} finally {
+			if (fos != null) {
+				try {
+					fos.close();
+				} catch (IOException e) {
+					LogHelper.error(e);
+				}
+			}
+			if (inputStream != null) {
+				try {
+					inputStream.close();
+				} catch (IOException e) {
+					LogHelper.error(e);
+				}
+			}
+		}
+
+		return file;
+	}
+
+	/**
+	 * 从输入流中获取字节数组
+	 * 
+	 * @param inputStream
+	 * @return
+	 */
+	public byte[] readInputStream(InputStream inputStream) {
+		byte[] buffer = new byte[1024];
+		int len = 0;
+		ByteArrayOutputStream bos = new ByteArrayOutputStream();
+		try {
+			while ((len = inputStream.read(buffer)) != -1) {
+				bos.write(buffer, 0, len);
+			}
+		} catch (IOException e) {
+			LogHelper.error(e);
+		} finally {
+			try {
+				bos.close();
+			} catch (IOException e) {
+				LogHelper.error(e);
+			}
+		}
+
+		return bos.toByteArray();
+	}
+
+}

+ 174 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/AtgBizIfaceThread.java

@@ -0,0 +1,174 @@
+package cn.hmsoft.ses.control.ifaceservice;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.util.StringUtils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.gov.api.client.AtgBusClient;
+import com.alibaba.gov.api.client.DefaultAtgBusClient;
+import com.alibaba.gov.api.domain.AtgBusSecretKey;
+import com.alibaba.gov.api.request.AtgBizAffairFinishRequest;
+import com.alibaba.gov.api.response.AtgBizAffairFinishResponse;
+import com.alibaba.gov.callbackapi.response.CallbackAtgBizAffairReceiveResponse;
+
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.ses.constants.SysConst;
+
+public class AtgBizIfaceThread extends Thread {
+
+	private String flow_no;
+	private CallbackAtgBizAffairReceiveResponse receiveResponse;
+
+	@Override
+	public void run() {
+
+		if (StringUtils.isEmpty(flow_no)) {
+			return;
+		}
+
+		try {
+			Thread.sleep(5000);
+		} catch (InterruptedException e) {
+			LogHelper.info(e);
+		}
+
+		LogHelper.info("开始处理办件办结,流水号:" + flow_no);
+
+		// 1. 初始化网关地址、秘钥信息
+		// String gatewayUrl = "控制台--我的系统--功能申请--选择对应环境 gatewayUrl";
+		String gatewayUrl = SysConst.getAppConfig().getAtg_gatewayUrl();
+		// String appId = "控制台--我的系统--功能申请--APPID";
+		String appId = SysConst.getAppConfig().getAtg_appid();
+		// String keyId = "控制台--我的系统--功能申请--选择对应环境 keyId";
+		String keyId = SysConst.getAppConfig().getAtg_keyId();
+		// String secretKey = "控制台--我的系统--功能申请--选择对应环境 secretKey;
+		String secretKey = SysConst.getAppConfig().getAtg_secretKey();
+
+		List<AtgBusSecretKey> secretKeys = new ArrayList<AtgBusSecretKey>();
+		AtgBusSecretKey atgBusSecretKey = new AtgBusSecretKey(keyId, secretKey);
+		secretKeys.add(atgBusSecretKey);
+
+		// 2. 初始化客户端
+		AtgBusClient atgBusClient = new DefaultAtgBusClient(gatewayUrl, appId, secretKeys);
+
+		// 3. 找到对应服务的request,拼装业务信息
+		AtgBizAffairFinishRequest atgBizAffairFinishRequest = new AtgBizAffairFinishRequest();
+
+		/**
+		 * 政务总线统一分配应用ID
+		 */
+		atgBizAffairFinishRequest.setAppId("12");
+
+		/**
+		 * 部门行政区划编码
+		 */
+		atgBizAffairFinishRequest.setAreaCode("000001");
+
+		/**
+		 * 受理部门编码
+		 */
+		atgBizAffairFinishRequest.setDeptCode("001");
+
+		/**
+		 * 受理部门名称
+		 */
+		atgBizAffairFinishRequest.setDeptName("广西招生考试院自考处");
+
+		/**
+		 * 扩展字段信息 (可选)
+		 */
+
+		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		/**
+		 * 办件受理时间
+		 */
+		atgBizAffairFinishRequest.setGmtService(dateFormat.format(new Date()));
+
+		/**
+		 * 备注
+		 */
+		atgBizAffairFinishRequest.setMemo(receiveResponse.getResultMsg());
+
+		/**
+		 * 办理人员姓名
+		 */
+		atgBizAffairFinishRequest.setOperatorName("广西招生考试院自考处");
+
+		/**
+		 * 办理人员编号
+		 */
+		atgBizAffairFinishRequest.setOperatorUid("广西招生考试院自考处");
+
+		/**
+		 * 办件统一赋码ID
+		 */
+		atgBizAffairFinishRequest.setProjId(flow_no);
+
+		/**
+		 * 办理结果
+		 */
+		atgBizAffairFinishRequest.setResult("07");
+
+		/**
+		 * 办件结果证照编号
+		 */
+		atgBizAffairFinishRequest.setResultCode("CHANNEL_IDEMPOTENT");
+
+		/**
+		 * 办件结果描述信息
+		 */
+		atgBizAffairFinishRequest.setResultDesc(receiveResponse.getResultMsg());
+
+		// 4. 请求开放服务,获取response
+		AtgBizAffairFinishResponse response = atgBusClient.execute(atgBizAffairFinishRequest);
+
+		if (StringUtils.isEmpty(response.getResultStatus())) {
+			if (!StringUtils.isEmpty(response.getBody())) {
+				// 开始处理报文数据
+				JSONObject fromObject = null;
+				try {
+					fromObject = JSON.parseObject(response.getBody());
+				} catch (Exception e) {
+					LogHelper.error("调用一网通办系统报错:返回报文body节点不是合法JSON格式");
+					throw new BusinessException("调用一网通办系统报错:返回报文body节点不是合法JSON格式");
+				}
+
+				String subMessage = (String) fromObject.get("subMessage");
+				if (!StringUtils.isEmpty(subMessage)) {
+					LogHelper.error("调用一网通办系统报错:" + subMessage);
+					throw new BusinessException("调用一网通办系统报错:" + subMessage);
+				}
+
+			}
+		} else if (!"S".equals(response.getResultStatus())) {
+			LogHelper.error("调用一网通办系统报错:" + response.getResultMsg());
+			throw new BusinessException("调用一网通办系统报错:" + response.getResultMsg());
+		}
+
+		LogHelper.info("结束处理办件办结,流水号:" + flow_no);
+
+	}
+
+	public String getFlow_no() {
+		return flow_no;
+	}
+
+	public void setFlow_no(String flow_no) {
+		this.flow_no = flow_no;
+	}
+
+	public CallbackAtgBizAffairReceiveResponse getReceiveResponse() {
+		return receiveResponse;
+	}
+
+	public void setReceiveResponse(CallbackAtgBizAffairReceiveResponse receiveResponse) {
+		this.receiveResponse = receiveResponse;
+	}
+
+}

+ 571 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/ByTurnInApplyIfaceService.java

@@ -0,0 +1,571 @@
+package cn.hmsoft.ses.control.ifaceservice;
+
+import cn.hmsoft.web.entity.Ajax;
+import net.sf.json.JSONObject;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.helper.JsonHelper;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.common.MkConst;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.control.service.InterfaceControl;
+import cn.hmsoft.ses.constants.ByConst.TurnInStatus;
+import cn.hmsoft.ses.constants.ByConst.TurnType;
+import cn.hmsoft.ses.data.model.by.ByTurnInApply;
+import cn.hmsoft.ses.data.model.by.ByTurnOutApply;
+import cn.hmsoft.ses.data.model.by.ByTurnTimeConfig;
+import cn.hmsoft.ses.data.model.mk.MkCertEduApply;
+import cn.hmsoft.ses.data.model.mk.MkCertNeduApply;
+import cn.hmsoft.ses.data.model.mk.MkCertTimeConfig;
+import cn.hmsoft.ses.data.model.pl.PlCourse;
+import cn.hmsoft.ses.data.model.pl.PlMajorCourse;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.helper.DateHelper;
+import cn.hmsoft.ses.service.iface.by.IByTurnInApplyService;
+import cn.hmsoft.ses.service.iface.by.IByTurnInScoreService;
+import cn.hmsoft.ses.service.iface.by.IByTurnOutApplyService;
+import cn.hmsoft.ses.service.iface.by.IByTurnTimeConfigService;
+import cn.hmsoft.ses.service.iface.by.IByTurnTimePlaceService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertEduApplyService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertNeduApplyService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTimeConfigService;
+import cn.hmsoft.ses.service.iface.pl.IPlCourseService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorCourseService;
+import cn.hmsoft.ses.service.iface.std.IStdMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdRegInfoService;
+import cn.hmsoft.ses.util.UdmpUtil;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.google.gson.JsonObject;
+import com.xcwlkj.log.utils.XclogUtil;
+
+
+/**
+ * 外省考生转入表 参照了湖北的表:EG_T_KSZK 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:15
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class ByTurnInApplyIfaceService extends InterfaceControl {
+
+	@Autowired
+	private IByTurnInApplyService byTurnInApplyService;
+	@Autowired
+	private IByTurnTimeConfigService timeConfigService;
+	@Autowired
+	private IStdMajorService stdMajorService;
+	@Autowired
+	private IByTurnTimePlaceService placeService;
+	@Autowired
+    private IByTurnInScoreService byTurnInScoreService;
+	@Autowired
+	private IStdRegInfoService stdRegInfoService;
+	@Autowired
+	private IByTurnOutApplyService byTurnOutApplyService;
+	
+	@Autowired
+    private IMkCertEduApplyService mkCertEduApplyService;
+	
+	@Autowired
+   	private IMkCertTimeConfigService certTimeConfigService;
+	
+	@Autowired
+    private IPlCourseService plCourse;
+	
+	@Autowired
+    private IPlMajorCourseService plMajorCourseService;
+	
+	@Autowired
+    private IMkCertNeduApplyService mkCertNeduApplyService;
+	
+	@Autowired
+	private IMkCertTimeConfigService mkTimeConfigService;
+	/**
+	 * 外省转入-已申请列表 
+	 * timeLimit中的in_time来控制“申请转入”显示
+	 */
+	@RequestMapping("ifaceService/byTurnInApply/list")
+	public Ajax list(String token) {
+		StdRegInfo std = this.checkStdInfo(token); 
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("timeLimit", this.timeConfigService.findTimeConfig(TurnType.TURN_IN.ordinal()));// 转考时间限制
+		map.put("applyList", this.byTurnInApplyService.listTurninApply(std.getId()));// 已申请记录
+		map.put("placeList", this.placeService.listTimePlace(std, TurnType.TURN_IN.ordinal())); //转考递交材料地点(status=1页面显示)
+		return new Ajax(map);
+	}
+
+	/**
+	 * 外省-转入申请页面
+	 */
+	@RequestMapping("ifaceService/byTurnInApply/toApply")
+	public Ajax toApply(String token) {
+		StdRegInfo std = this.checkStdInfo(token);
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("std", std);// 考生信息
+		map.put("ticketList", this.stdMajorService.listStdMajor(std.getId())); // 本省准考证列表
+		return new Ajax(map);
+	}
+
+	/**
+	 * 需要传递4个参数
+	 * @param byTurnInApply.ks_xm:考生姓名
+	 * @param byTurnInApply.ks_sfz:身份证
+	 * @param byTurnInApply.zk_in_zkz:本省准考证
+	 * @param byTurnInApply.ks_zkz:外省准考证
+	 */
+	@RequestMapping("ifaceService/byTurnInApply/apply")
+	public Ajax apply(String token, ByTurnInApply byTurnInApply) {
+		StdRegInfo std = this.checkStdInfo(token);
+		// 转考信息是否存在
+		ByTurnInApply apply = this.byTurnInApplyService.findTurnInApply(byTurnInApply);
+		if (apply == null) {
+			throw new BusinessException("外省转入信息与提交信息不匹配,请核对转入信息,有疑问请联系当地考办或主考学校!");
+		}
+		if ( apply.getStatus() != TurnInStatus.NO_PASS.ordinal() &&  apply.getStatus() != TurnInStatus.SAVE.ordinal()) {
+			throw new BusinessException("转考信息 审核未完成,请不要重复提交!");
+		}
+//		this.byTurnInApplyService.apply(apply.getId(), std.getId());
+		return new Ajax();
+	}
+
+	@RequestMapping("ifaceService/byTurnInApply/edit")
+	public Ajax edit(String token, ByTurnInApply byTurnInApply) {
+		this.checkStdInfo(token);
+		this.byTurnInApplyService.edit(byTurnInApply);
+		LogHelper.hisomeLogger.info(XclogUtil.m("处理转考申请文件上传,参数:{0}",JsonHelper.fromObject(byTurnInApply)));
+		return new Ajax();
+	}
+
+	@RequestMapping("ifaceService/byTurnInApply/delete")
+	public Ajax delete(String token,Integer[] ids) {
+		this.checkStdInfo(token);
+		for (Integer id : ids) {
+			this.byTurnInApplyService.delete(id);
+		}
+		return new Ajax();
+	}
+
+	@RequestMapping("ifaceService/byTurnInApply/get")
+	public Ajax get(String token,Integer id) {
+		this.checkStdInfo(token);
+		return new Ajax(this.byTurnInApplyService.find(id));
+	}
+	
+	@RequestMapping("ifaceService/byTurnInScore/list")
+    public Ajax list(String token,String out_ticket_no, Integer time_config_id ) {
+		this.checkStdInfo(token);
+        return new Ajax(this.byTurnInScoreService.listTurnInScore(out_ticket_no, time_config_id));
+    }
+	
+	@RequestMapping("ifaceService/receiveFormInfo")
+	public Ajax receiveFlowId(
+							String data//,
+//							String SBLSH_SHORT,//申办流水号
+//							String SXBM,//事项编码
+//							String XZQHDM,//事项所属区划编码
+//							String EXPRESSTYPE,//0:业务受理; 1:补齐补正; 2:即办件;3:收件后待受理业务;9:业务办理系统退回后修改再次提交;
+//							String BZSLBLRXM,//补正受理人姓名
+//							String BZCLQD,//补正受理清单
+//							String BZSJ//补正材料时间 yyyy-MM-dd HH:mm:ss
+							) {
+		Ajax ajax = new Ajax();
+		LogHelper.info("处理ZW数据接收,参数:"+data);
+		JSONObject dataJson = JSONObject.fromObject(data);
+		
+		LogHelper.hisomeLogger.info(XclogUtil.m("处理ZW数据接收,参数:{0}",dataJson.toString()));
+		
+		// 2023-08-09不再受理政务发起的免考和转考
+		ajax.setSuccess(false);
+		ajax.setErrorMsg("请登陆“广西招生考试院”官网或“广西自考”APP办理自考相关业务。");
+		return ajax;
+		
+		/*
+		String SXBM = (String)dataJson.get("SXBM");
+		String SBLSH_SHORT = (String)dataJson.get("SBLSH_SHORT");
+		
+		
+		String jsonStr = UdmpUtil.getInfo(SBLSH_SHORT, SXBM);
+		LogHelper.info("调用ZW的getInfo接口,返回的报文:"+jsonStr);
+		LogHelper.hisomeLogger.info(XclogUtil.m("调用ZW的getInfo接口,返回的报文:{0}",jsonStr));
+		
+		if(StringUtils.isEmpty(jsonStr)){
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("根据SBLSH_SHORT:"+SBLSH_SHORT+",SXBM:"+SXBM+"获取政务申请单,响应报文为空");
+			return ajax;
+		}
+		
+		String zw_sxbm_turnin = SysConst.getAppConfig().getZw_sxbm_turnin();
+		String zw_sxbm_turnout = SysConst.getAppConfig().getZw_sxbm_turnout();
+		String zw_sxbm_edu = SysConst.getAppConfig().getZw_sxbm_edu();
+		String zw_sxbm_nedu = SysConst.getAppConfig().getZw_sxbm_nedu();
+		
+		if (SXBM.equals(zw_sxbm_turnin)) {
+			//handleTurnIn(jsonStr);
+			String result = handleTurnInForZw(jsonStr);
+			
+			// 受理失败返回给政务
+			if (null != result) {
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(result);
+				return ajax;
+			}
+		}else if(SXBM.equals(zw_sxbm_turnout)){
+			handleTurnOut(jsonStr);
+		}else if(SXBM.equals(zw_sxbm_edu)){
+			handleEdu(jsonStr);
+		}else if(SXBM.equals(zw_sxbm_nedu)){
+			handleNEdu(jsonStr);
+		}
+		
+		return ajax;*/
+	}
+
+	private void handleNEdu(String jsonStr) {
+		JSONObject fromObject = JSONObject.fromObject(jsonStr);
+		String status = (String)fromObject.get("STATUS");
+		JSONObject DATA = (JSONObject)fromObject.get("DATA");
+		JSONObject SPSHENQIN = (JSONObject)DATA.get("SPSHENQIN");
+		JSONObject XML_DATA = (JSONObject)SPSHENQIN.get("XML_DATA");
+		JSONObject SPItemListDef = (JSONObject)XML_DATA.get("SPItemListDef");
+		JSONObject TableCols = (JSONObject)SPItemListDef.get("TableCols");
+		
+		String SBLSH_SHORT = (String)SPSHENQIN.get("SBLSH_SHORT");
+		
+		String major_id = (String)TableCols.get("major_id");
+		String std_cert_no = (String)TableCols.get("std_cert_no");
+		String std_name = (String)TableCols.get("std_name");
+		String cert_type_id = (String)TableCols.get("cert_type_id");
+		String cert_no = (String)TableCols.get("cert_no");
+		String exam_date = (String)TableCols.get("exam_date");
+		String score = (String)TableCols.get("score");
+		String cert_type_catalog = (String)TableCols.get("cert_type_catalog");
+		String file_path = (String)TableCols.get("file");
+		String courseIds = (String)TableCols.get("course_ids");
+		
+		StdRegInfo dbStd = this.stdRegInfoService.findStdByCertNo(std_cert_no);
+		
+		MkCertNeduApply apply = new MkCertNeduApply();
+		
+		apply.setStd_reg_id(dbStd.getId());
+		apply.setStd_cert_no(std_cert_no);
+		apply.setCert_no(cert_no);
+		apply.setScore(Integer.parseInt(score));
+		apply.setStd_name(std_name);
+		apply.setCert_type_catalog(Integer.parseInt(cert_type_catalog));
+		apply.setCert_type_id(Integer.parseInt(cert_type_id));
+		apply.setExam_date(exam_date);
+		apply.setFile_path(file_path);
+		apply.setZw_flow_no(SBLSH_SHORT);
+		
+		if(!StringUtils.isEmpty(major_id)){
+			apply.setMajor_id(Integer.valueOf(major_id));
+		}
+		
+		MkCertTimeConfig dbTimeConfig = this.mkTimeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+		apply.setTime_config_id(dbTimeConfig.getId());
+		this.mkCertNeduApplyService.apply(apply,courseIds.split(","));
+		
+	}
+
+
+	private void handleTurnOut(String jsonStr) {
+		JSONObject fromObject = JSONObject.fromObject(jsonStr);
+		String status = (String)fromObject.get("STATUS");
+		JSONObject DATA = (JSONObject)fromObject.get("DATA");
+		JSONObject SPSHENQIN = (JSONObject)DATA.get("SPSHENQIN");
+		JSONObject XML_DATA = (JSONObject)SPSHENQIN.get("XML_DATA");
+		JSONObject SPItemListDef = (JSONObject)XML_DATA.get("SPItemListDef");
+		JSONObject TableCols = (JSONObject)SPItemListDef.get("TableCols");
+		
+		String course_code = (String)TableCols.get("course_code");
+		String course_exam_type = (String)TableCols.get("course_exam_type");
+		String course_name = (String)TableCols.get("course_name");
+		String course_score = (String)TableCols.get("course_score");
+		String final_score = (String)TableCols.get("final_score");
+		
+		String SBLSH_SHORT = (String)SPSHENQIN.get("SBLSH_SHORT");
+		
+		String in_prov_code = (String)TableCols.get("in_prov_code");
+		String in_ticket_no = (String)TableCols.get("in_ticket_no");
+		String ks_sfz = (String)TableCols.get("ks_sfz");
+		if(StringUtils.isEmpty(ks_sfz) || "null" == ks_sfz){
+			ks_sfz = (String)SPSHENQIN.get("LXRSFZJHM");
+		}
+		
+		String major_id = (String)TableCols.get("major_id");
+		String file = (String)TableCols.get("file");
+		
+		StdRegInfo dbStd = this.stdRegInfoService.findStdByCertNo(ks_sfz);
+		ByTurnTimeConfig config = this.timeConfigService.findTimeConfig(TurnType.TURN_OUT.ordinal());
+		if (config == null || !config.getIn_time()) {
+			throw new BusinessException("请联系考试院开放转考!");
+		}else{
+			// by huangzibo 20210421 政务预受理系统审核通过,将申请单推送到自考系统,不受时间约束(但考生在政务门户网申请受时间约束)
+			config.setIn_time(true);
+		}
+		
+		ByTurnOutApply byTurnOutApply = new ByTurnOutApply();
+		
+		byTurnOutApply.setTime_config_id(config.getId());
+		byTurnOutApply.setStd_reg_id(dbStd.getId());
+		
+		byTurnOutApply.setIn_prov_code(in_prov_code);
+		byTurnOutApply.setIn_ticket_no(in_ticket_no);
+		byTurnOutApply.setMajor_id(Integer.parseInt(major_id));
+		byTurnOutApply.setTicket_path(file);
+		byTurnOutApply.setZw_flow_no(SBLSH_SHORT);
+		
+		byTurnOutApply.setStd_mobile(dbStd.getStd_mobile());
+		
+		this.byTurnOutApplyService.insertTurnOutApply(byTurnOutApply, dbStd, config);
+		
+ 
+		
+	}
+
+	private void handleEdu(String jsonStr) {
+		JSONObject fromObject = JSONObject.fromObject(jsonStr);
+		String status = (String)fromObject.get("STATUS");
+		if (!"200".equals(status)) {
+			return;
+		}
+		
+		LogHelper.info("handleEdu,status:"+status);
+		
+		JSONObject DATA = (JSONObject)fromObject.get("DATA");
+		JSONObject SPSHENQIN = (JSONObject)DATA.get("SPSHENQIN");
+		JSONObject XML_DATA = (JSONObject)SPSHENQIN.get("XML_DATA");
+		
+		String SBLSH_SHORT = (String)SPSHENQIN.get("SBLSH_SHORT");
+		
+		JSONObject SPItemListDef = (JSONObject)XML_DATA.get("SPItemListDef");
+		JSONObject TableCols = (JSONObject)SPItemListDef.get("TableCols");
+		String cert_type_id = (String)TableCols.get("cert_type_id");
+		
+		String course_ids_str = (String)TableCols.get("course_ids");
+		
+		LogHelper.info("handleEdu,course_ids_str:"+course_ids_str);
+		
+		String[] course_ids = course_ids_str.split(",");
+		Integer[] course_ids_integer = new Integer[course_ids.length];
+		for (int i = 0; i < course_ids_integer.length; i++) {
+			course_ids_integer[i] = Integer.parseInt(course_ids[i]);
+		}
+		String course_name = (String)TableCols.get("course_name");
+		String course_names_str = (String)TableCols.get("course_names");
+		String[] course_names = course_names_str.split(",");
+		
+		String course_scores_str = (String)TableCols.get("course_scores");
+		String[] course_scores = course_scores_str.split(",");
+		
+		String ks_sfz = (String)TableCols.get("ks_sfz");
+		
+		if(StringUtils.isEmpty(ks_sfz) || "null" == ks_sfz){
+			ks_sfz = (String)SPSHENQIN.get("LXRSFZJHM");
+		}
+		
+		String major_id = (String)TableCols.get("major_id");
+		String nexam_course_id = (String)TableCols.get("nexam_course_id");
+		
+		String File_path = (String)TableCols.get("File_path");
+		
+		StdRegInfo dbStd = this.stdRegInfoService.findStdByCertNo(ks_sfz);
+		
+		MkCertEduApply apply = new MkCertEduApply();
+		apply.setCert_type_id(Integer.parseInt(cert_type_id));
+		apply.setStd_reg_id(dbStd.getId());
+		apply.setCert_no(apply.getCert_no());
+		apply.setStd_name(dbStd.getStd_name());
+		apply.setTicket_no(dbStd.getTicket_no());
+		apply.setFile_path(File_path);
+		apply.setZw_flow_no(SBLSH_SHORT);
+		
+		//批次信息
+    	MkCertTimeConfig dbTimeConfig = this.certTimeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+    	
+    	LogHelper.info("handleEdu-dbTimeConfig,id:"+dbTimeConfig.getId());
+		apply.setTime_config_id(dbTimeConfig.getId());
+    	
+    	String errorMsg = saveApply(apply,new Integer[3] ,course_ids_integer, course_names, course_scores, dbStd);
+    	LogHelper.info("handleEdu,errorMsg:"+errorMsg);
+		
+	}
+	
+	private String saveApply(MkCertEduApply apply,Integer[] apply_ids, Integer[] course_ids, String[] course_names, String[] course_scores,
+			StdRegInfo std) {
+		MkCertTimeConfig timeConfig = this.certTimeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+		LocalDateTime now = null;
+		MkCertTimeConfig time = this.certTimeConfigService.getDataBaseTime();
+		if (null != time && null != time.getStart_time()) {
+			now = time.getStart_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+		
+		String currentTIme = DateHelper.format(now);
+		StringBuilder errorMsg = new StringBuilder();
+		for (int i = 0; i < course_ids.length; i++) {
+    		Integer apply_id = apply_ids.length > 1 ?apply_ids[0]:null;
+    		Integer course_id = course_ids[i];
+    		String course_name = course_names[i];
+    		String course_score = course_scores[i];
+//    		PlCourse plCourse = this.plCourse.find(course_id);
+    		
+    		//验证是否重复提交  course_id timeConfig
+
+    		MkCertEduApply newApply = new MkCertEduApply();
+    		newApply.setStd_cert_no(std.getCert_no());
+    		newApply.setStd_name(std.getStd_name());
+    		newApply.setStd_reg_id(std.getId());
+    		newApply.setTime_config_id(timeConfig.getId());
+    		newApply.setStatus(MkConst.EduApply.LOCAL_VERIFY.ordinal());
+    		newApply.setCreate_time(currentTIme);
+    		
+    		newApply.setTicket_no(apply.getTicket_no());
+    		newApply.setCert_type_id(apply.getCert_type_id());
+    		newApply.setCert_no(apply.getCert_no());
+    		newApply.setTicket_no(apply.getTicket_no());
+    		newApply.setTime_config_id(apply.getTime_config_id());
+//    		newApply.setCert_course_name(plCourse.getCourse_code() + "-" +plCourse.getCourse_name());
+    		
+    		newApply.setCert_course_id(course_id);
+    		newApply.setDone_course_name(course_name);
+    		newApply.setDone_course_score(course_score);
+    		newApply.setFile_path(apply.getFile_path());
+    		newApply.setZw_flow_no(apply.getZw_flow_no());
+//    		this.mkCertEduApplyService.deleteByCourseId(course_id);
+    		if (apply_id == null) {
+    			LogHelper.info("saveApply,apply_id is null");
+        		boolean isExist = this.mkCertEduApplyService.checkExist(course_id,std.getId(),newApply.getTime_config_id());
+        		if (isExist) {
+        			PlCourse plCourse = this.plCourse.find(course_id);
+        			errorMsg.append("课程["+plCourse.getCourse_name()+"] 已经申请过,不能重复提交申请;");
+        			LogHelper.info("saveApply: errorMsg"+errorMsg);
+        			continue;
+    			}
+    			this.mkCertEduApplyService.insert(newApply);
+			}else{
+				LogHelper.info("saveApply,apply_id is not null");
+				MkCertEduApply dbApply = this.mkCertEduApplyService.find(apply_id);
+				dbApply.setDone_course_name(course_name);
+				dbApply.setDone_course_score(course_score);
+				dbApply.setStatus(MkConst.EduApply.LOCAL_VERIFY.ordinal());
+				LogHelper.info("saveApply,this.mkCertEduApplyService.edit(dbApply)");
+				this.mkCertEduApplyService.edit(dbApply);
+			}
+		}
+		return errorMsg.toString();
+	}
+
+	
+	private void handleTurnIn(String jsonStr) {
+		JSONObject fromObject = JSONObject.fromObject(jsonStr);
+		String status = (String)fromObject.get("STATUS");
+		if (!"200".equals(status)) {
+			return;
+		}
+		JSONObject DATA = (JSONObject)fromObject.get("DATA");
+		JSONObject SPSHENQIN = (JSONObject)DATA.get("SPSHENQIN");
+		JSONObject XML_DATA = (JSONObject)SPSHENQIN.get("XML_DATA");
+		JSONObject SPItemListDef = (JSONObject)XML_DATA.get("SPItemListDef");
+		JSONObject TableCols = (JSONObject)SPItemListDef.get("TableCols");
+		String ks_xm = (String)TableCols.get("ks_xm");
+		String ks_sfz = (String)TableCols.get("ks_sfz");
+		if(StringUtils.isEmpty(ks_sfz) || "null" == ks_sfz){
+			ks_sfz = (String)SPSHENQIN.get("LXRSFZJHM");
+		}
+		
+		String ks_zkz = (String)TableCols.get("ks_zkz");
+		String zk_in_zkz = (String)TableCols.get("zk_in_zkz");
+		String SBLSH_SHORT = (String)SPSHENQIN.get("SBLSH_SHORT");
+		
+		StdRegInfo dbStd = this.stdRegInfoService.findStdByCertNo(ks_sfz);
+		
+		ByTurnInApply byTurnInApply = new ByTurnInApply();
+		byTurnInApply.setKs_xm(ks_xm);
+		byTurnInApply.setKs_sfz(ks_sfz);
+		byTurnInApply.setKs_zkz(ks_zkz);
+		byTurnInApply.setZk_in_zkz(zk_in_zkz);
+		ByTurnInApply apply = this.byTurnInApplyService.findTurnInApply(byTurnInApply );
+//		if (apply == null) {
+//			throw new BusinessException("外省转入信息与提交信息不匹配,请核对转入信息,有疑问请联系当地考办或主考学校!");
+//		}
+//		if ( apply.getStatus() != TurnInStatus.NO_PASS.ordinal() &&  apply.getStatus() != TurnInStatus.SAVE.ordinal()) {
+//			throw new BusinessException("转考信息 审核未完成,请不要重复提交!");
+//		}
+		this.byTurnInApplyService.apply(apply.getId(), dbStd.getId(),SBLSH_SHORT);
+		
+	}
+	
+	/**
+	 * 根据20210914最新需求:本来外省转入省内,不需要申请,但政务那边手机APP无法下架,现在的需求为:
+	 * 1 不在自考开放时间内,政务发起的,直接在政务预受理系统直接结单
+	 * 2 在自考开放时间内,政务发起的,自考处的人员根据考生的身份证号查询自考系统是否有对应的转入申请单,如果没有,直接在政务预受理系统直接结单;
+	 *  如果有,则预受理通过,程序进入这个方法,将更新政务的流水号,以便审核时回写政务状态。
+	 * @param jsonStr
+	 */
+	private String handleTurnInForZw(String jsonStr) {
+		JSONObject fromObject = JSONObject.fromObject(jsonStr);
+		
+		JSONObject DATA = (JSONObject)fromObject.get("DATA");
+		JSONObject SPSHENQIN = (JSONObject)DATA.get("SPSHENQIN");
+		JSONObject XML_DATA = (JSONObject)SPSHENQIN.get("XML_DATA");
+		JSONObject SPItemListDef = (JSONObject)XML_DATA.get("SPItemListDef");
+		JSONObject TableCols = (JSONObject)SPItemListDef.get("TableCols");
+		String ks_sfz = (String)TableCols.get("ks_sfz");
+		if(StringUtils.isEmpty(ks_sfz) || "null" == ks_sfz){
+			ks_sfz = (String)SPSHENQIN.get("LXRSFZJHM");
+		}
+		
+		if(StringUtils.isEmpty(ks_sfz)){
+			return "政务申请单中的身份证号为空,不受理。";
+		}
+		
+		String SBLSH_SHORT = (String)SPSHENQIN.get("SBLSH_SHORT");
+		
+		StdRegInfo dbStd = this.stdRegInfoService.findStdByCertNo(ks_sfz);
+		
+		if(null == dbStd){
+			return "身份证号【"+ks_sfz+"】的广西自考系统不存在,不受理。";
+		}
+		
+		ByTurnInApply byTurnInApply = new ByTurnInApply();
+		byTurnInApply.setKs_sfz(ks_sfz);
+		ByTurnInApply apply = this.byTurnInApplyService.findTurnInApply(byTurnInApply );
+		if(null == apply){
+			return "身份证号【"+ks_sfz+"】在广西自考系统不存在外省转入省内申请单,不受理。";
+		}else if("4".equals(apply.getStatus()) || "5".equals(apply.getStatus())){
+			return "身份证号【"+ks_sfz+"】在广西自考系统的外省转入省内申请单已经审批完成,不受理。";
+		}
+		
+		// 更新政务流水到转入申请表
+		apply.setZw_flow_no(SBLSH_SHORT);
+		this.byTurnInApplyService.edit(apply);
+		
+		return null;
+	}
+	
+	@RequestMapping("ifaceService/plMajor/listMajorCourse")
+	public Ajax listMajorCourse(Integer major_id,String token) {
+		StdRegInfo std = this.checkStdInfo(token); 
+		List<PlMajorCourse> majorList = this.plMajorCourseService.listMajorCourse(major_id);
+		return new Ajax(majorList);
+	}
+	
+
+}

+ 250 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/ByTurnOutApplyIfaceService.java

@@ -0,0 +1,250 @@
+package cn.hmsoft.ses.control.ifaceservice;
+
+import java.io.File;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.mchange.v2.io.DirectoryDescentUtils;
+import com.xcwlkj.log.utils.XclogUtil;
+
+import cn.hmsoft.frame.data.model.FrameDict;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.frame.util.FrameZoneUtil;
+import cn.hmsoft.helper.JsonHelper;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.constants.ByConst.TurnStatus;
+import cn.hmsoft.ses.constants.ByConst.TurnType;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.control.service.InterfaceControl;
+import cn.hmsoft.ses.data.model.by.ByTurnOutApply;
+import cn.hmsoft.ses.data.model.by.ByTurnTimeConfig;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.service.iface.by.IByTurnOutApplyService;
+import cn.hmsoft.ses.service.iface.by.IByTurnTimeConfigService;
+import cn.hmsoft.ses.service.iface.by.IByTurnTimePlaceService;
+import cn.hmsoft.ses.service.iface.kj.IKjUnifiedScoreDetailService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdMajorService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ * 本省考生转考申请表 省内转省外---kj_zhuanchushengqing 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:13
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class ByTurnOutApplyIfaceService extends InterfaceControl {
+
+	@Autowired
+	private IByTurnOutApplyService byTurnOutApplyService;
+	@Autowired
+	private IByTurnTimeConfigService timeConfigService;
+	@Autowired
+	private IStdMajorService stdMajorService;
+	@Autowired
+	private IKjUnifiedScoreDetailService kjUnifiedScoreDetailService;//成绩服务
+
+	@Autowired
+	private IByTurnTimePlaceService placeService;
+	
+	@Autowired
+	private IPlMajorService plMajorService ;
+
+
+	/**
+	 * @return 考生端-转至省外-列表
+	 *  timeLimit 中的in_time控制是否在申请时间范围内
+	 */
+	@RequestMapping("ifaceService/byTurnOutApply/list")
+	public Ajax list(String token) {
+		StdRegInfo std = this.checkStdInfo(token);
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("timeLimit", this.timeConfigService.findTimeConfig(TurnType.TURN_OUT.ordinal()));// 转考时间限制
+		map.put("applyList", this.byTurnOutApplyService.listTurnoutApply(std.getId()));// 已申请记录
+		map.put("placeList", this.placeService.listTimePlace(std, TurnType.TURN_OUT.ordinal())); //转考递交材料地点(status=1页面显示)
+		return new Ajax(map);
+	}
+
+	/**
+	 * @return 转考申请界面
+	 */
+	@RequestMapping("ifaceService/byTurnOutApply/toAdd")
+	public Ajax toAdd(String token) {
+		StdRegInfo std = this.checkStdInfo(token);
+		Map<String,Object> map = new HashMap<String,Object>();
+		ByTurnTimeConfig config = this.timeConfigService.findTimeConfig(TurnType.TURN_OUT.ordinal());
+		if(config != null && config.getIn_time()) {
+			map.put("ticketList", this.stdMajorService.listStdMajor(std.getId()));//准考证列表
+			map.put("provList", FrameZoneUtil.getProvinceArray(false));//全国省份列表
+		}
+		return new Ajax(map);
+	}
+	
+	/**
+	 * @param std_major_id:学生报考专业表-ID
+	 * @return 考生可以转考的合格成绩
+	 * 根据专业选择查询
+	 */
+	@RequestMapping("ifaceService/byTurnOutApply/courseList")
+	public Ajax courseList(String token, Integer std_major_id) {
+		StdRegInfo std = this.checkStdInfo(token);
+		List<Map<String, Object>> courseList = this.kjUnifiedScoreDetailService.listStdScore(std.getId(), std_major_id);
+		List<FrameDict> courseNatureframeDict = FrameDictUtil.getFrameDict("CourseNature");
+		//转换课程类型
+		for (Iterator iterator = courseList.iterator(); iterator.hasNext();) {
+			Map<String, Object> map = (Map<String, Object>) iterator.next();
+			String course_exam_type = ((BigDecimal)map.get("course_exam_type")).toString();
+			String text = null;
+			
+			for (FrameDict frameDict : courseNatureframeDict) {
+				if (!StringUtils.isEmpty(course_exam_type) && course_exam_type.equals(frameDict.getDict_value())) {
+					text = frameDict.getDict_text();
+				}
+			}
+			
+			map.put("course_exam_type", text);
+			
+		}
+		return new Ajax(courseList);
+	}
+	
+
+	/**
+	 * @param byTurnOutApply
+	 * @param token 
+	 * @return 保存转考申请
+	 */
+	@RequestMapping("ifaceService/byTurnOutApply/add")
+	public Ajax add(String token, String filePath, ByTurnOutApply byTurnOutApply) {
+		StdRegInfo std = this.checkStdInfo(token);
+		List<Map<String, Object>> courseList = this.kjUnifiedScoreDetailService.listStdScore(std.getId(),
+				byTurnOutApply.getMajor_id());
+		if (courseList == null || courseList.size() == 0) {
+			throw new BusinessException("没有可转考的成绩!");
+		}
+		ByTurnTimeConfig config = this.timeConfigService.findTimeConfig(TurnType.TURN_OUT.ordinal());
+		if (config == null || !config.getIn_time()) {
+			throw new BusinessException("请联系考试院开放转考!");
+		}
+		byTurnOutApply.setTime_config_id(config.getId());
+		byTurnOutApply.setStd_reg_id(std.getId());
+		ByTurnOutApply apply = this.byTurnOutApplyService.findTurnOutApply(byTurnOutApply, config.getId());
+		if (apply != null) {
+			throw new BusinessException("已经申请,请不要重复申请!");
+		}
+		byTurnOutApply.setTicket_path(filePath);
+//		this.byTurnOutApplyService.insertTurnOutApply(byTurnOutApply, std, config);
+		return new Ajax();
+	}
+	
+	@RequestMapping("ifaceService/byTurnOutApply/upload")
+	public Ajax upload(String token, MultipartFile file){
+		StdRegInfo std = this.checkStdInfo(token);
+		LogHelper.hisomeLogger.info(XclogUtil.tb(std.getTicket_no(),"处理转考申请文件上传,参数:[{"+std.getCert_no() + "_" +file.getName()+"}]"));
+
+		//LogHelper.hisomeLogger.info(XclogUtil.m("处理转考申请文件上传,参数:{0}{1}",std.getTicket_no(), file.getName()));
+		String filePath = uploadFile(std, std.getTicket_no(), file);
+		
+		LogHelper.hisomeLogger.info(XclogUtil.te(1,"受理成功,附件路径:[{"+filePath+"}]"));
+		return new Ajax(filePath);
+	}
+
+	/**
+	 * @param file:外省准考证
+	 * @param pro_code:外省省份编码
+	 *  处理考生上传的外省准考证
+	 */
+	private String uploadFile(StdRegInfo std, String pro_code, MultipartFile file) {
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		if (StringHelper.isNotEmpty(extension)) {
+			extension = extension.toLowerCase();
+		}
+		String cert_no = std.getCert_no();
+		String rootPath = SysConst.getAppConfig().getUploadBase();
+		try {
+			makeDir(rootPath);
+			String fullFileName = rootPath + SysConst.IMG_TICKET_PREFIX + pro_code + "_" + cert_no + "." + extension;
+			file.transferTo(new File(fullFileName));
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new BusinessException("文件上传错误,请检查文件");
+		}
+		return SysConst.IMG_TICKET_PREFIX + pro_code + "_" + cert_no + "." + extension;
+	}
+
+	/**
+	 * @param rootPath:目录路径
+	 * 创建目录
+	 */
+	private void makeDir(String rootPath) {
+		File dir = new File(rootPath + SysConst.IMG_TICKET_PREFIX);
+		if (!dir.exists())
+			dir.mkdir();
+	}
+
+	@RequestMapping("ifaceService/byTurnOutApply/edit")
+	public Ajax edit(String token ,String filePath, ByTurnOutApply byTurnOutApply) {
+		StdRegInfo std = this.checkStdInfo(token);
+		List<Map<String, Object>> courseList = this.kjUnifiedScoreDetailService.listStdScore(std.getId(),
+				byTurnOutApply.getStd_major_id());
+		if (courseList == null || courseList.size() == 0) {
+			throw new BusinessException("没有可转考的成绩!");
+		}
+		ByTurnOutApply apply = this.byTurnOutApplyService.find(byTurnOutApply.getId());
+
+		ByTurnTimeConfig config = this.timeConfigService.findTimeConfig(TurnType.TURN_OUT.ordinal());
+		
+		if (!StringUtils.isEmpty(filePath)) {
+			byTurnOutApply.setTicket_path(filePath);
+		}
+		apply.setMajor_id(byTurnOutApply.getMajor_id());
+		apply.setIn_prov_code(byTurnOutApply.getIn_prov_code());
+		apply.setIn_ticket_no(byTurnOutApply.getIn_ticket_no());
+		apply.setMajor_code(this.plMajorService.find(apply.getMajor_id()).getMajor_code());
+		apply.setStatus(TurnStatus.FIRST_AUDIT.ordinal());
+		apply.setTime_config_id(config.getId());
+		
+		ByTurnOutApply temp = this.byTurnOutApplyService.getDataBaseTime();
+		if(null != temp){
+			apply.setApply_time(temp.getApply_time());
+		}
+		
+		LogHelper.hisomeLogger.info(XclogUtil.m("处理转考申请,参数:{0}", JsonHelper.fromObject(apply)));
+		this.byTurnOutApplyService.edit(apply);
+		return new Ajax();
+	}
+
+	@RequestMapping("ifaceService/byTurnOutApply/delete")
+	public Ajax delete(Integer[] ids, String token) {
+		StdRegInfo std = this.checkStdInfo(token);
+		for (Integer id : ids) {
+			this.byTurnOutApplyService.delete(id);
+		}
+		return new Ajax();
+	}
+
+	@RequestMapping("ifaceService/byTurnOutApply/get")
+	public Ajax get(Integer id, String token) {
+		StdRegInfo std = this.checkStdInfo(token);
+		return new Ajax(this.byTurnOutApplyService.find(id));
+	}
+}

+ 339 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/CallbackAtgBizAffairReceiveRequest.java

@@ -0,0 +1,339 @@
+package cn.hmsoft.ses.control.ifaceservice;
+
+import java.util.List;
+import java.util.Map;
+import com.alibaba.gov.api.domain.ApplicantVO;
+import com.alibaba.gov.api.domain.HallVO;
+import com.alibaba.gov.api.domain.StuffInfoVO;
+
+import java.io.Serializable;
+
+/**
+ * ALIPAY Atg API: callback.atg.biz.affair.receive request.
+ * 
+ * @author auto create
+ * @since 1.0, 2023-11-13 11:10:01
+ */
+public class CallbackAtgBizAffairReceiveRequest implements Serializable {
+
+	private static final long serialVersionUID = 8413985823593182898L;
+
+	
+
+	/** 
+	* 办件表单信息
+	 */
+	private String affFormInfo;
+
+	/** 
+	* 办件类型
+	 */
+	private String affairType;
+
+	/** 
+	* 政务总线统一分配应用ID(必选)
+	 */
+	private String appId;
+
+	/** 
+	* 申请者信息
+	 */
+	private ApplicantVO applicantVO;
+
+	/** 
+	* 申报来源
+	 */
+	private String applyOrigin;
+
+	/** 
+	* 审批性质
+	 */
+	private String approveType;
+
+	/** 
+	* 收件部门所属行政区划编码
+	 */
+	private String areaCode;
+
+	/** 
+	* 业务类型
+	 */
+	private String bizType;
+
+	/** 
+	* 事项终审部门所属编码
+	 */
+	private String deptCode;
+
+	/** 
+	* 执行部门统一社会信用代码
+	 */
+	private String execDeptOrgCode;
+
+	/** 
+	* 扩展字段信息 (可选)
+	 */
+	private Map<String,String> extInfo;
+
+	/** 
+	* 申报时间
+	 */
+	private long gmtApply;
+
+	/** 
+	* 大厅信息
+	 */
+	private HallVO hallVO;
+
+	/** 
+	* 受理主单号
+	 */
+	private String mainCode;
+
+	/** 
+	* 权力事项编码(必选)
+	 */
+	private String matterCode;
+
+	/** 
+	* 备注(可选)
+	 */
+	private String memo;
+
+	/** 
+	* 办件统一赋码ID (必选)
+	 */
+	private String projId;
+
+	/** 
+	* 申报项目具体名称
+	 */
+	private String projectName;
+
+	/** 
+	* 项目性质
+	 */
+	private String projectNature;
+
+	/** 
+	* 收件部门所属编码
+	 */
+	private String recvDeptCode;
+
+	/** 
+	* 收件部门名称
+	 */
+	private String recvDeptName;
+
+	/** 
+	* 创建用户ID
+	 */
+	private String recvUserId;
+
+	/** 
+	* 创建用户名称
+	 */
+	private String recvUserName;
+
+	/** 
+	* 创建用户类型
+	 */
+	private String recvUserType;
+
+	/** 
+	* 联办业务标识
+	 */
+	private String relBizId;
+
+	/** 
+	* 办件材料信息
+	 */
+	private List<StuffInfoVO> suffInfoList;
+
+	
+
+	public void setAffFormInfo(String affFormInfo) {
+		this.affFormInfo = affFormInfo;
+	}
+	public String getAffFormInfo() {
+		return this.affFormInfo;
+	}
+
+	public void setAffairType(String affairType) {
+		this.affairType = affairType;
+	}
+	public String getAffairType() {
+		return this.affairType;
+	}
+
+	public void setAppId(String appId) {
+		this.appId = appId;
+	}
+	public String getAppId() {
+		return this.appId;
+	}
+
+	public void setApplicantVO(ApplicantVO applicantVO) {
+		this.applicantVO = applicantVO;
+	}
+	public ApplicantVO getApplicantVO() {
+		return this.applicantVO;
+	}
+
+	public void setApplyOrigin(String applyOrigin) {
+		this.applyOrigin = applyOrigin;
+	}
+	public String getApplyOrigin() {
+		return this.applyOrigin;
+	}
+
+	public void setApproveType(String approveType) {
+		this.approveType = approveType;
+	}
+	public String getApproveType() {
+		return this.approveType;
+	}
+
+	public void setAreaCode(String areaCode) {
+		this.areaCode = areaCode;
+	}
+	public String getAreaCode() {
+		return this.areaCode;
+	}
+
+	public void setBizType(String bizType) {
+		this.bizType = bizType;
+	}
+	public String getBizType() {
+		return this.bizType;
+	}
+
+	public void setDeptCode(String deptCode) {
+		this.deptCode = deptCode;
+	}
+	public String getDeptCode() {
+		return this.deptCode;
+	}
+
+	public void setExecDeptOrgCode(String execDeptOrgCode) {
+		this.execDeptOrgCode = execDeptOrgCode;
+	}
+	public String getExecDeptOrgCode() {
+		return this.execDeptOrgCode;
+	}
+
+	public void setExtInfo(Map<String,String> extInfo) {
+		this.extInfo = extInfo;
+	}
+	public Map<String,String> getExtInfo() {
+		return this.extInfo;
+	}
+
+	public void setGmtApply(long gmtApply) {
+		this.gmtApply = gmtApply;
+	}
+	public long getGmtApply() {
+		return this.gmtApply;
+	}
+
+	public void setHallVO(HallVO hallVO) {
+		this.hallVO = hallVO;
+	}
+	public HallVO getHallVO() {
+		return this.hallVO;
+	}
+
+	public void setMainCode(String mainCode) {
+		this.mainCode = mainCode;
+	}
+	public String getMainCode() {
+		return this.mainCode;
+	}
+
+	public void setMatterCode(String matterCode) {
+		this.matterCode = matterCode;
+	}
+	public String getMatterCode() {
+		return this.matterCode;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+	public String getMemo() {
+		return this.memo;
+	}
+
+	public void setProjId(String projId) {
+		this.projId = projId;
+	}
+	public String getProjId() {
+		return this.projId;
+	}
+
+	public void setProjectName(String projectName) {
+		this.projectName = projectName;
+	}
+	public String getProjectName() {
+		return this.projectName;
+	}
+
+	public void setProjectNature(String projectNature) {
+		this.projectNature = projectNature;
+	}
+	public String getProjectNature() {
+		return this.projectNature;
+	}
+
+	public void setRecvDeptCode(String recvDeptCode) {
+		this.recvDeptCode = recvDeptCode;
+	}
+	public String getRecvDeptCode() {
+		return this.recvDeptCode;
+	}
+
+	public void setRecvDeptName(String recvDeptName) {
+		this.recvDeptName = recvDeptName;
+	}
+	public String getRecvDeptName() {
+		return this.recvDeptName;
+	}
+
+	public void setRecvUserId(String recvUserId) {
+		this.recvUserId = recvUserId;
+	}
+	public String getRecvUserId() {
+		return this.recvUserId;
+	}
+
+	public void setRecvUserName(String recvUserName) {
+		this.recvUserName = recvUserName;
+	}
+	public String getRecvUserName() {
+		return this.recvUserName;
+	}
+
+	public void setRecvUserType(String recvUserType) {
+		this.recvUserType = recvUserType;
+	}
+	public String getRecvUserType() {
+		return this.recvUserType;
+	}
+
+	public void setRelBizId(String relBizId) {
+		this.relBizId = relBizId;
+	}
+	public String getRelBizId() {
+		return this.relBizId;
+	}
+
+	public void setSuffInfoList(List<StuffInfoVO> suffInfoList) {
+		this.suffInfoList = suffInfoList;
+	}
+	public List<StuffInfoVO> getSuffInfoList() {
+		return this.suffInfoList;
+	}
+
+}
+
+	

+ 243 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/MkCertEduApplyIfaceService.java

@@ -0,0 +1,243 @@
+package cn.hmsoft.ses.control.ifaceservice;
+
+import java.io.File;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.xcwlkj.log.utils.XclogUtil;
+
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.helper.JsonHelper;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.common.MkConst;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.control.service.InterfaceControl;
+import cn.hmsoft.ses.constants.ByConst.TurnType;
+import cn.hmsoft.ses.data.model.by.ByTurnTimeConfig;
+import cn.hmsoft.ses.data.model.mk.MkCertEduApply;
+import cn.hmsoft.ses.data.model.mk.MkCertMajorCourse;
+import cn.hmsoft.ses.data.model.mk.MkCertTimeConfig;
+import cn.hmsoft.ses.data.model.mk.MkPreEduApply;
+import cn.hmsoft.ses.data.model.pl.PlCourse;
+import cn.hmsoft.ses.data.model.pl.PlMajor;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.helper.DateHelper;
+import cn.hmsoft.ses.service.iface.by.IByTurnTimeConfigService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertCourseService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertEduApplyService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertMajorCourseService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTimeConfigService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTypeService;
+import cn.hmsoft.ses.service.iface.mk.IMkPreEduApplyService;
+import cn.hmsoft.ses.service.iface.pl.IPlCourseService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdMajorService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+
+/**
+ *  控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-03-17 14:18:02
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class MkCertEduApplyIfaceService extends InterfaceControl {
+
+    @Autowired
+    private IMkCertEduApplyService mkCertEduApplyService;
+    
+    @Autowired
+    private IMkCertCourseService mkCertCourseService;
+    
+    @Autowired
+    private IMkPreEduApplyService mkPreEduApplyService;
+    
+    @Autowired
+   	private IMkCertTimeConfigService timeConfigService;
+    
+	@Autowired
+	private IStdMajorService stdMajorService;
+	
+	@Autowired
+    private IPlCourseService plCourse;
+	
+	@Autowired
+	private IPlMajorService plMajorService;
+	
+	@Autowired
+	private IMkCertTypeService mkCertTypeService;
+	
+	@Autowired
+	private IMkCertMajorCourseService mkCertMajorCourseService;
+	
+	@RequestMapping("ifaceService/login")
+    public Ajax login(StdRegInfo stdRegInfo) {
+		LogHelper.hisomeLogger.info(XclogUtil.tb("login","开始受理政务接口登陆,参数:cert_no:"+stdRegInfo.getCert_no()));
+		// 2023-08-09不再受理政务发起的免考和转考
+		//throw new BusinessException("请登陆“广西招生考试院”官网或“广西自考”APP办理自考相关业务。");
+		
+		Ajax ajax = null;
+		try {
+			ajax = super.login(stdRegInfo);
+			LogHelper.hisomeLogger.info(XclogUtil.te(1,"受理成功"));
+		} catch (BusinessException e) {
+			LogHelper.hisomeLogger.error(XclogUtil.te(2,"受理失败"+e.getMessage()));
+			throw e;
+		}
+		
+		return ajax;
+	}
+
+    @RequestMapping("ifaceService/mkCertEduApply/listByStd")
+    public Ajax listByStd(String token) {
+		StdRegInfo dbStd = this.checkStdInfo(token);
+    	HashMap<String,Object> rtnMap = new HashMap<String,Object>();
+        rtnMap.put("timeLimit", this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal()));
+        rtnMap.put("applyList", this.mkCertEduApplyService.listByStd(dbStd.getId()));// 已申请记
+        return new Ajax(rtnMap);
+    }
+    
+    @RequestMapping("ifaceService/mkCertEduApply/toApply")
+    public Ajax toApply(String token) {
+    	StdRegInfo dbStd = this.checkStdInfo(token);
+    	
+		Map<String, Object> rtnMap = new HashMap<String, Object>();
+		
+		List<PlMajor> listStdMajor = this.plMajorService.listStdMajor(dbStd.getId());
+		
+		HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		//paraMap.put("is_net_exam", 1);// 网考
+		paraMap.put("status", 1);// 开考
+		List<PlMajor> majorArray = this.plMajorService.listByMap(paraMap);
+		listStdMajor.addAll(majorArray);
+		
+		HashSet<Integer> idSet = new HashSet<Integer>();
+		List<PlMajor> rtnMajorList = new ArrayList<PlMajor>();
+		for (PlMajor major : listStdMajor) {
+			if (idSet.add(major.getId())) {
+				rtnMajorList.add(major);
+			}
+			
+		}
+		
+		rtnMap.put("majorList", rtnMajorList);
+		//学历证书
+		rtnMap.put("certTypeList", this.mkCertTypeService.list("cert_catalog", MkConst.CertCatalog.EDU.ordinal()));
+        return new Ajax(rtnMap);
+    }
+    
+    
+    @RequestMapping("ifaceService/mkCertEduApply/listCourse")
+    public Ajax listCourse(String token,Integer major_id) {
+    	StdRegInfo dbStd = this.checkStdInfo(token);
+    	MkCertTimeConfig timeConfig = this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+        return new Ajax(this.mkCertMajorCourseService.listByMajorId(major_id, timeConfig.getId()));
+    }
+    
+    @RequestMapping("ifaceService/mkCertEduApply/apply")
+    public Ajax apply(String token,MkCertEduApply apply,Integer[] apply_ids,Integer[] course_ids,String[] course_names,String [] course_scores) {
+    	StdRegInfo dbStd = this.checkStdInfo(token);
+    	apply.setTicket_no(dbStd.getTicket_no());
+    	
+    	if (StringUtils.isEmpty(apply.getFile_path())) {
+			throw new BusinessException("上传附件不能为空.请上传!");
+		}
+    	
+    	//批次信息
+    	MkCertTimeConfig dbTimeConfig = this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+    	apply.setTime_config_id(dbTimeConfig.getId());
+    	LogHelper.hisomeLogger.info(XclogUtil.m("处理免考申请,参数:{0}{1}{2}{3}", JsonHelper.fromObject(apply),JsonHelper.fromObject(course_ids),JsonHelper.fromObject(course_names),JsonHelper.fromObject(course_scores)));
+    	String errorMsg = saveApply(apply,apply_ids, course_ids, course_names, course_scores, dbStd);
+    	Ajax rtnAjax = new Ajax();
+    	if (errorMsg.length() != 0) {
+    		rtnAjax.setErrorMsg(errorMsg);
+    		rtnAjax.setSuccess(false);
+		}
+        return rtnAjax;
+    }
+
+	private String saveApply(MkCertEduApply apply,Integer[] apply_ids, Integer[] course_ids, String[] course_names, String[] course_scores,
+			StdRegInfo std) {
+		
+		MkCertTimeConfig timeConfig = this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+		
+		LocalDateTime now = null;
+		MkCertTimeConfig time = this.timeConfigService.getDataBaseTime();
+		if (null != time && null != time.getStart_time()) {
+			now = time.getStart_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+		
+		String currentTIme = DateHelper.format(now);
+		StringBuilder errorMsg = new StringBuilder();
+		for (int i = 0; i < course_ids.length; i++) {
+    		Integer apply_id = apply_ids.length > 1 ?apply_ids[0]:null;
+    		Integer course_id = course_ids[i];
+    		String course_name = course_names[i];
+    		String course_score = course_scores[i];
+//    		PlCourse plCourse = this.plCourse.find(course_id);
+    		
+    		//验证是否重复提交  course_id timeConfig
+
+    		MkCertEduApply newApply = new MkCertEduApply();
+    		newApply.setStd_cert_no(std.getCert_no());
+    		newApply.setStd_name(std.getStd_name());
+    		newApply.setStd_reg_id(std.getId());
+    		newApply.setTime_config_id(timeConfig.getId());
+    		newApply.setStatus(MkConst.EduApply.LOCAL_VERIFY.ordinal());
+    		newApply.setCreate_time(currentTIme);
+    		
+    		newApply.setTicket_no(apply.getTicket_no());
+    		newApply.setCert_type_id(apply.getCert_type_id());
+    		newApply.setCert_no(apply.getCert_no());
+    		newApply.setTicket_no(apply.getTicket_no());
+    		newApply.setTime_config_id(apply.getTime_config_id());
+//    		newApply.setCert_course_name(plCourse.getCourse_code() + "-" +plCourse.getCourse_name());
+    		
+    		newApply.setCert_course_id(course_id);
+    		newApply.setDone_course_name(course_name);
+    		newApply.setDone_course_score(course_score);
+    		newApply.setFile_path(apply.getFile_path());
+//    		this.mkCertEduApplyService.deleteByCourseId(course_id);
+    		if (apply_id == null) {
+        		boolean isExist = this.mkCertEduApplyService.checkExist(course_id,std.getId(),newApply.getTime_config_id());
+        		if (isExist) {
+        			PlCourse plCourse = this.plCourse.find(course_id);
+        			errorMsg.append("课程["+plCourse.getCourse_name()+"] 已经申请过,不能重复提交申请;");
+        			continue;
+    			}
+    			this.mkCertEduApplyService.insert(newApply);
+			}else{
+				MkCertEduApply dbApply = this.mkCertEduApplyService.find(apply_id);
+				dbApply.setCert_type_id(apply.getCert_type_id());
+				dbApply.setDone_course_name(course_name);
+				dbApply.setDone_course_score(course_score);
+				dbApply.setFile_path(apply.getFile_path());
+				dbApply.setStatus(MkConst.EduApply.LOCAL_VERIFY.ordinal());
+				this.mkCertEduApplyService.edit(dbApply);
+			}
+		}
+		return errorMsg.toString();
+	}
+   
+}

+ 194 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/ifaceservice/MkCertNeduApplyIfaceService.java

@@ -0,0 +1,194 @@
+package cn.hmsoft.ses.control.ifaceservice;
+
+import java.io.File;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.xcwlkj.log.utils.XclogUtil;
+
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.helper.JsonHelper;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.constants.ByConst.TurnType;
+import cn.hmsoft.ses.common.MkConst;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.control.service.InterfaceControl;
+import cn.hmsoft.ses.data.model.mk.MkCertNeduApply;
+import cn.hmsoft.ses.data.model.mk.MkCertTimeConfig;
+import cn.hmsoft.ses.data.model.mk.MkCertType;
+import cn.hmsoft.ses.data.model.pl.PlMajor;
+import cn.hmsoft.ses.data.model.std.StdMajor;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.service.iface.by.IByTurnTimeConfigService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertNeduApplyCourseService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertNeduApplyService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTimeConfigService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTypeService;
+import cn.hmsoft.ses.service.iface.mk.IMkPreEduApplyService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdMajorService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ *  控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-03-05 15:29:16
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class MkCertNeduApplyIfaceService extends InterfaceControl{
+	
+	@Autowired
+    private IMkCertTypeService mkCertTypeService;
+    @Autowired
+    private IMkCertNeduApplyService mkCertNeduApplyService;
+    @Autowired
+    private IMkCertNeduApplyCourseService mkCertNeduApplyControl;
+    @Autowired
+	private IMkCertTimeConfigService timeConfigService;
+	@Autowired
+	private IStdMajorService stdMajorService;
+	@Autowired
+    private IMkPreEduApplyService mkPreEduApplyService;
+	@Autowired
+	private IPlMajorService plMajorService;
+
+    
+    @RequestMapping("ifaceService/mkCertNeduApply/list")
+    public Ajax list(String token) {
+    	StdRegInfo std = this.checkStdInfo(token);
+        HashMap<String,Object> rtnMap = new HashMap<String,Object>();
+        rtnMap.put("timeLimit", this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal()));
+        rtnMap.put("applyList", this.mkCertNeduApplyService.listAll(std.getId()));// 已申请记
+        return new Ajax(rtnMap);
+    }
+    
+    
+    @RequestMapping("ifaceService/mkCertNeduApply/toApply")
+    public Ajax toApply(String token) {
+    	StdRegInfo std = this.checkStdInfo(token);
+    	HashMap<String,Object> rtnMap = new HashMap<String,Object>();
+    	List<StdMajor> stdMajor = this.stdMajorService.listStdMajor(std.getId());
+    	for (StdMajor stdm : stdMajor) {
+    		stdm.setId(stdm.getMajor_id());
+		}
+    	HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		paraMap.put("is_net_exam", 1);// 网考
+		paraMap.put("status", 1);// 开考
+		List<PlMajor> majorArray = this.plMajorService.listByMap(paraMap);
+    	
+		HashSet<Integer> majorId =  new HashSet<Integer>();
+		for (PlMajor plMajor : majorArray) {
+			StdMajor newMjoar = new StdMajor();
+			newMjoar.setId(plMajor.getId());
+			newMjoar.setMajor_code(plMajor.getMajor_code());
+			newMjoar.setFull_name(plMajor.getMajor_code() + "-" + plMajor.getMajor_name());
+			if(majorId.add(plMajor.getId()))
+				stdMajor.add(newMjoar);
+		}
+		
+        rtnMap.put("majorList", stdMajor);
+//        rtnMap.put("certTypeCatalogList",FrameDictUtil.getFrameDict("certTypeCatalog"));
+        rtnMap.put("certTypeCatalogList",FrameDictUtil.getFrameDict("cert_level"));
+        return new Ajax(rtnMap);
+    }
+    
+    @RequestMapping("ifaceService/mkCertNeduApply/queryCertTypeBylevel")
+    public Ajax toAqueryCertTypeBylevelpply(String cert_level) {
+    	if (StringUtils.isEmpty(cert_level)) {
+			throw new BusinessException("证书层次不能为空");
+		}
+    	return new Ajax(FrameDictUtil.getFrameDict("cert_level_"+cert_level));
+    }
+    
+    
+    @RequestMapping("ifaceService/mkCertNeduApply/upload")
+	public Ajax upload(String token,MultipartFile file){
+    	StdRegInfo std = this.checkStdInfo(token);
+    	LogHelper.hisomeLogger.info(XclogUtil.tb(std.getTicket_no(),"开始处理免考申请文件上传,参数:[{"+std.getCert_no() + "_" +file.getName()+"}]"));
+
+    	//LogHelper.hisomeLogger.info(XclogUtil.m("处理免考申请文件上传,参数:{0}{1}", std.getTicket_no(),file.getName()));
+		String filePath = uploadFile(std, std.getTicket_no(), file);
+
+		LogHelper.hisomeLogger.info(XclogUtil.te(1,"受理成功,附件路径:[{"+filePath+"}]"));
+		
+		return new Ajax(filePath);
+	}
+
+	/**
+	 * @param file:外省准考证
+	 * @param pro_code:外省省份编码
+	 *  处理考生上传的外省准考证
+	 */
+	private String uploadFile(StdRegInfo std, String pro_code, MultipartFile file) {
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		if (StringHelper.isNotEmpty(extension)) {
+			extension = extension.toLowerCase();
+		}
+		String cert_no = std.getCert_no();
+		String rootPath = SysConst.getAppConfig().getUploadBase();
+		String rtnName;
+		String fileSeq = this.mkPreEduApplyService.getFileSeq();
+		try {
+			makeDir(rootPath);
+			rtnName = SysConst.IMG_NEDU_PREFIX +  cert_no + "_"+ new Date().getTime() + "_"+ fileSeq +"." + extension;
+			String fullFileName = rootPath + rtnName;
+			file.transferTo(new File(fullFileName));
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new BusinessException("文件上传错误,请检查文件");
+		}
+		return rtnName;
+	}
+	
+    
+    @RequestMapping("ifaceService/mkCertNeduApply/apply")
+    public Ajax apply(String token, MkCertNeduApply mkCertNeduApply, String[] courseIds) {
+    	StdRegInfo std = this.checkStdInfo(token);
+    	MkCertTimeConfig dbTimeConfig = this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+    	//ORG_ID
+    	mkCertNeduApply.setStd_reg_id(std.getId());
+    	mkCertNeduApply.setTime_config_id(dbTimeConfig.getId());
+    	LogHelper.hisomeLogger.info(XclogUtil.m("处理免考申请,参数:{0}{1}", JsonHelper.fromObject(mkCertNeduApply),JsonHelper.fromObject(courseIds)));
+        this.mkCertNeduApplyService.apply(mkCertNeduApply,courseIds);
+        return new Ajax();
+    }
+    
+    /**
+	 * @param rootPath:目录路径
+	 * 创建目录
+	 */
+	private void makeDir(String rootPath) {
+		File dir = new File(rootPath + SysConst.IMG_NEDU_PREFIX);
+		if (!dir.exists())
+			dir.mkdir();
+	}
+    
+    @RequestMapping("ifaceService/mkCertNeduApply/get")
+    public Ajax get(Integer id) {
+    	HashMap<String,Object> rtnMap = new HashMap<String,Object>();
+    	MkCertNeduApply neduApply = this.mkCertNeduApplyService.find(id);
+    	MkCertType certType = mkCertTypeService.find(neduApply.getCert_type_id());
+    	neduApply.setCert_type_catalog(certType.getCert_type());
+        rtnMap.put("entity", neduApply);
+        rtnMap.put("certTypeCatalogList",FrameDictUtil.getFrameDict("certTypeCatalog"));
+        return new Ajax(rtnMap);
+    }  
+    
+}

+ 334 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/kj/KjUnifiedScoreDetailControl.java

@@ -0,0 +1,334 @@
+ 
+package cn.hmsoft.ses.control.kj;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.ses.constants.ByConst.MajorLevel;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.data.model.kj.KjCollegeScoreDetail;
+import cn.hmsoft.ses.data.model.kj.KjUnifiedScoreDetail;
+import cn.hmsoft.ses.data.model.pl.PlExamTime;
+import cn.hmsoft.ses.data.model.pl.PlMajor;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.helper.YearCodeHelper;
+import cn.hmsoft.ses.service.iface.kj.IKjCollegeScoreDetailService;
+import cn.hmsoft.ses.service.iface.kj.IKjUnifiedScoreDetailService;
+import cn.hmsoft.ses.service.iface.pl.IPlExamTimeService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ *  统考成绩明细控制器.
+ * 
+ * @author: zhanqiang
+ * @date: 2019-04-24 10:58:54
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class KjUnifiedScoreDetailControl extends AjaxControl {
+
+    @Autowired
+    private IKjUnifiedScoreDetailService kjUnifiedScoreDetailService;
+    
+    @Autowired
+    private IKjCollegeScoreDetailService kjCollegeScoreDetailService;
+    
+    
+    
+    @Autowired
+	private IPlMajorService plMajorService;
+    
+    @Autowired
+	private IPlExamTimeService plExamTimeService;
+	
+    /**
+     * 历史成绩查询.
+     * @param std_id 考生ID
+     * @param major_id 专业ID
+     * @param isPass 是否及格
+     * @param isShowPaper 是否显示毕业论文成绩
+     * @return
+     */
+    @RequestMapping("kj/kjUnifiedScoreDetail/listByStd")
+    public Ajax listByStd(Integer std_id, Integer major_id, Integer isPass, Integer isShowPaper) {
+    	StdRegInfo std = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	FrameAssertUtil.isNotNull(std, "请重新登录");
+        return new Ajax(this.kjUnifiedScoreDetailService.listByStd(std.getId(),null, major_id, isPass));
+    }
+    
+    /**
+     * 校考成绩查询
+     * @param std_id
+     * @param year_code
+     * @return
+     */
+	@RequestMapping("kj/kjUnifiedScoreDetail/queryCollegeScoreByStd")
+	public Ajax queryCollegeScoreByStd(Integer std_id, Integer year_code) {
+		StdRegInfo std = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(std, "请重新登录");
+		return new Ajax(this.kjCollegeScoreDetailService.queryCollegeScoreByStd(std.getId(), year_code));
+	}
+	
+	/**
+	 * 统考成绩查询
+	 * @param std_id
+	 * @param exam_time_id
+	 * @param isPass
+	 * @return
+	 */
+	@RequestMapping("kj/kjUnifiedScoreDetail/listAllByStd")
+	public Ajax listAllByStd(Integer std_id, Integer exam_time_id, Integer isPass) {
+		StdRegInfo std = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(std, "请重新登录");
+		if (exam_time_id == null) {
+			List<PlExamTime> timeList = this.plExamTimeService.list("year_code", YearCodeHelper.getCurrentYearCode());
+			exam_time_id = timeList.get(0).getId();
+		}
+		
+		return new Ajax(this.kjUnifiedScoreDetailService.listStdAllScore(std.getId(), exam_time_id, isPass));
+	}
+	
+	/**
+	 * 毕业预测
+	 * @param std_id
+	 * @param exam_time_id
+	 * @return
+	 */
+	@RequestMapping("kj/kjUnifiedScoreDetail/byForecast")
+	public Ajax byForecast(Integer std_id, Integer major_id) {
+		StdRegInfo std = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(std, "请重新登录");
+		
+		List<KjUnifiedScoreDetail> list = this.kjUnifiedScoreDetailService.byForecast(std.getId(), major_id);
+		
+		return new Ajax(list);
+	}
+	
+	/**
+	 * 成绩查询
+	 * @param std_id
+	 * @param exam_time_id
+	 * @return
+	 */
+	@RequestMapping("kj/kjUnifiedScoreDetail/queryScore")
+	public Ajax queryScore(Integer std_id, Integer exam_time_id, Integer score_type) {
+		StdRegInfo std = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(std, "请重新登录");
+		
+		Integer year_code = null;
+		if(null != exam_time_id){
+			PlExamTime time = this.plExamTimeService.find(exam_time_id);
+			if(null != time){
+				year_code = time.getYear_code();
+			}
+		}
+		
+		List<KjUnifiedScoreDetail> list = null;
+		List<KjUnifiedScoreDetail> kjUnifiedScoreList = null;
+		List<KjCollegeScoreDetail> kjCollegeScoreList = null;
+		
+		if(null == score_type || score_type.intValue() == 0){
+			// 历史成绩(统考成绩)
+			kjUnifiedScoreList = this.kjUnifiedScoreDetailService.listByStd(std.getId(),year_code, null, null);
+		}
+		
+		if(null == score_type || score_type.intValue() == 1){
+			// 校考成绩
+			kjCollegeScoreList = this.kjCollegeScoreDetailService.queryCollegeScoreByStd(std.getId(), year_code);
+		}
+		
+		
+		if(null == kjUnifiedScoreList || kjUnifiedScoreList.isEmpty()){
+			list = new ArrayList<KjUnifiedScoreDetail>();
+		}else{
+			list = kjUnifiedScoreList;
+		}
+		
+		if(null != kjCollegeScoreList && !kjCollegeScoreList.isEmpty()){
+			KjUnifiedScoreDetail kjUnifiedScoreDetail = null;
+			
+			for(KjCollegeScoreDetail detail:kjCollegeScoreList){
+				kjUnifiedScoreDetail = new KjUnifiedScoreDetail();
+				kjUnifiedScoreDetail.setYear_code(detail.getYear_code());
+				kjUnifiedScoreDetail.setTicket_no(detail.getTicket_no());
+				kjUnifiedScoreDetail.setCourse_code(detail.getCourse_code());
+				kjUnifiedScoreDetail.setCourse_name(detail.getCourse_name());
+				kjUnifiedScoreDetail.setFinal_score(detail.getScore());
+				// 校考
+				kjUnifiedScoreDetail.setScore_source(16);
+				// 主考学校
+				kjUnifiedScoreDetail.setOrg_name(detail.getOrg_name());
+				
+				if(null != detail.getYear_code()){
+					String yearCode = String.valueOf(detail.getYear_code());
+					String year = null;
+					String month = null;
+					if(yearCode.length() == 6){
+						year = yearCode.substring(0,4);
+						month = yearCode.substring(4,yearCode.length());
+						String exam_year_month = null;
+						if("04".equals(month)){
+							exam_year_month = "上半年";
+						}else if("10".equals(month)){
+							exam_year_month = "下半年";
+						}else{
+							exam_year_month = month+"月";
+						}
+						
+						kjUnifiedScoreDetail.setExam_year_month(year+"年"+exam_year_month);
+						
+					}else{
+						kjUnifiedScoreDetail.setExam_year_month(yearCode);
+					}
+					
+				}
+				
+				
+				
+				
+				list.add(kjUnifiedScoreDetail);
+			}
+		}
+		
+		return new Ajax(list);
+	}
+	
+	/**
+	 * 成绩查询
+	 * @param std_id
+	 * @return
+	 */
+	@RequestMapping("kj/kjUnifiedScoreDetail/queryScoreByYearCode")
+	public Ajax queryScoreByYearCode(Integer std_id) {
+		StdRegInfo std = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(std, "请重新登录");
+		
+		Integer year_code = Integer.valueOf(YearCodeHelper.getCurrentYearCode());;
+		
+		
+		List<KjUnifiedScoreDetail> list = null;
+		
+		/************************************************获取当前批次成绩******************************************************/
+		// 历史成绩(统考成绩)
+		List<KjUnifiedScoreDetail> kjUnifiedScoreList = this.kjUnifiedScoreDetailService.listByStd(std.getId(),year_code, null, null);
+		
+		// 校考成绩
+		List<KjCollegeScoreDetail> kjCollegeScoreList = this.kjCollegeScoreDetailService.queryCollegeScoreByStd(std.getId(), year_code);
+		
+		if(null == kjUnifiedScoreList || kjUnifiedScoreList.isEmpty()){
+			list = new ArrayList<KjUnifiedScoreDetail>();
+		}else{
+			list = kjUnifiedScoreList;
+		}
+		
+		if(null != kjCollegeScoreList && !kjCollegeScoreList.isEmpty()){
+			KjUnifiedScoreDetail kjUnifiedScoreDetail = null;
+			
+			for(KjCollegeScoreDetail detail:kjCollegeScoreList){
+				kjUnifiedScoreDetail = new KjUnifiedScoreDetail();
+				kjUnifiedScoreDetail.setYear_code(detail.getYear_code());
+				kjUnifiedScoreDetail.setTicket_no(detail.getTicket_no());
+				kjUnifiedScoreDetail.setCourse_code(detail.getCourse_code());
+				kjUnifiedScoreDetail.setCourse_name(detail.getCourse_name());
+				kjUnifiedScoreDetail.setFinal_score(detail.getScore());
+				// 校考
+				kjUnifiedScoreDetail.setScore_source(16);
+				// 主考学校
+				kjUnifiedScoreDetail.setOrg_name(detail.getOrg_name());
+				
+				list.add(kjUnifiedScoreDetail);
+			}
+		}
+		
+		/************************************************获取上批次成绩******************************************************/
+		Integer preYearCode = this.plExamTimeService.getPreYearCode(year_code);
+		// 历史成绩(统考成绩)
+		List<KjUnifiedScoreDetail> preKjUnifiedScoreList = this.kjUnifiedScoreDetailService.listByStd(std.getId(),preYearCode, null, null);
+		
+		// 校考成绩
+		List<KjCollegeScoreDetail> preKjCollegeScoreList = this.kjCollegeScoreDetailService.queryCollegeScoreByStd(std.getId(), preYearCode);
+		
+		if(null != preKjUnifiedScoreList && !preKjUnifiedScoreList.isEmpty()){
+			list.addAll(preKjUnifiedScoreList);
+		}
+		
+		if(null != preKjCollegeScoreList && !preKjCollegeScoreList.isEmpty()){
+			KjUnifiedScoreDetail kjUnifiedScoreDetail = null;
+			
+			for(KjCollegeScoreDetail detail:preKjCollegeScoreList){
+				kjUnifiedScoreDetail = new KjUnifiedScoreDetail();
+				kjUnifiedScoreDetail.setYear_code(detail.getYear_code());
+				kjUnifiedScoreDetail.setTicket_no(detail.getTicket_no());
+				kjUnifiedScoreDetail.setCourse_code(detail.getCourse_code());
+				kjUnifiedScoreDetail.setCourse_name(detail.getCourse_name());
+				kjUnifiedScoreDetail.setFinal_score(detail.getScore());
+				// 校考
+				kjUnifiedScoreDetail.setScore_source(16);
+				// 主考学校
+				kjUnifiedScoreDetail.setOrg_name(detail.getOrg_name());
+				
+				list.add(kjUnifiedScoreDetail);
+			}
+		}
+		
+		
+		return new Ajax(list);
+	}
+	
+	@RequestMapping("kj/kjUnifiedScoreDetail/queryYearCode")
+	public Ajax yearCode() {
+		return new Ajax(YearCodeHelper.getCurrentYearCode());
+	}
+    
+    @RequestMapping("kj/kjUnifiedScoreDetail/init")
+    public Ajax init() {
+    	StdRegInfo std = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	Map<String, Object> rtnMap = new HashMap<String, Object>();
+    	List<PlMajor> listStdMajor = this.plMajorService.listStdMajor(std.getId());
+    	HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		//paraMap.put("is_net_exam", 1);// 网考
+		paraMap.put("status", 1);// 开考
+		List<PlMajor> majorArray = this.plMajorService.listByMap(paraMap);
+		boolean exist = false;
+		if (listStdMajor.size() > 0) {
+			PlMajor plMajor = listStdMajor.get(0);
+			for (PlMajor major : majorArray) {
+				
+				String majorLevel = major.getMajor_level() == MajorLevel.A.ordinal()?"【专科】":"【本科】";
+				major.setMajor_name(major.getMajor_code() + "-" + major.getMajor_name()+majorLevel);
+				
+				if(major.getId().intValue() == plMajor.getId().intValue()){
+					exist = true;
+					break;
+				}
+			}
+		}
+		if(!exist){
+			listStdMajor.addAll(majorArray);
+			rtnMap.put("majorList", listStdMajor);
+		}else{
+			rtnMap.put("majorList", majorArray);
+		}
+		
+		
+    	return new Ajax(rtnMap);
+    }
+    
+     
+    
+    @RequestMapping("kj/kjUnifiedScoreDetail/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.kjUnifiedScoreDetailService.find(id));
+    }    
+}

+ 67 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertCourseControl.java

@@ -0,0 +1,67 @@
+package cn.hmsoft.ses.control.mk;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.data.model.mk.MkCertCourse;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.service.iface.mk.IMkCertCourseService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *  控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-03-05 15:29:14
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class MkCertCourseControl extends AjaxControl {
+
+    @Autowired
+    private IMkCertCourseService mkCertCourseService;
+
+    @RequestMapping("mk/mkCertCourse/listByCertTypeId")
+    public Ajax listByCertTypeId(Integer cert_type_id) {
+        return new Ajax(this.mkCertCourseService.listByCertTypeId(cert_type_id));
+    }
+    
+    @RequestMapping("mk/mkCertCourse/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.mkCertCourseService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    @RequestMapping("mk/mkCertCourse/add")
+    public Ajax add(MkCertCourse mkCertCourse) {
+        this.mkCertCourseService.insert(mkCertCourse);
+        return new Ajax();
+    }
+    
+    @RequestMapping("mk/mkCertCourse/edit")
+    public Ajax edit(MkCertCourse mkCertCourse) {
+        this.mkCertCourseService.edit(mkCertCourse);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertCourse/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.mkCertCourseService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("mk/mkCertCourse/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.mkCertCourseService.find(id));
+    }    
+}

+ 410 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertEduApplyControl.java

@@ -0,0 +1,410 @@
+package cn.hmsoft.ses.control.mk;
+
+import java.io.File;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.service.IFrameParamService;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.common.MkConst;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.model.mk.MkCertEduApply;
+import cn.hmsoft.ses.data.model.mk.MkCertTimeConfig;
+import cn.hmsoft.ses.data.model.pl.PlCourse;
+import cn.hmsoft.ses.data.model.pl.PlMajor;
+import cn.hmsoft.ses.data.model.pl.PlMajorCourse;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.helper.DateHelper;
+import cn.hmsoft.ses.service.iface.mk.IMkCertEduApplyService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertMajorCourseService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTimeConfigService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTypeService;
+import cn.hmsoft.ses.service.iface.mk.IMkPreEduApplyService;
+import cn.hmsoft.ses.service.iface.pl.IPlCourseService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorCourseService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorService;
+import cn.hmsoft.ses.util.ImageUtil;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ *  控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-03-17 14:18:02
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class MkCertEduApplyControl extends AjaxControl {
+
+    @Autowired
+    private IMkCertEduApplyService mkCertEduApplyService;
+    
+    @Autowired
+    private IMkPreEduApplyService mkPreEduApplyService;
+    
+    @Autowired
+   	private IMkCertTimeConfigService timeConfigService;
+    
+	@Autowired
+    private IPlCourseService plCourse;
+	
+	@Autowired
+	private IPlMajorService plMajorService;
+	
+	@Autowired
+	private IMkCertTypeService mkCertTypeService;
+	
+	@Autowired
+	private IMkCertMajorCourseService mkCertMajorCourseService;
+	
+    @Autowired
+    private IFrameParamService frameParamService;
+    @Autowired
+    private IPlMajorCourseService plMajorCourseService;
+
+	
+//	MkConst.TimeConfig.免考申请.ordinal()
+    @RequestMapping("mk/mkCertEduApply/listByStd")
+    public Ajax listByStd() {
+    	StdRegInfo sessionStdRegInfo = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	HashMap<String,Object> rtnMap = new HashMap<String,Object>();
+        rtnMap.put("timeLimit", this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal()));
+        //免考现场审核时间
+        rtnMap.put("authTimeLimit", this.timeConfigService.findTimeConfig(4));
+        //免考审定结果公布时间
+        rtnMap.put("pushTimeLimit", this.timeConfigService.findTimeConfig(3));
+        rtnMap.put("applyList", this.mkCertEduApplyService.listByStd(sessionStdRegInfo.getId()));// 已申请记
+        //rtnMap.put("MkCertEduApplyControl", FrameParamConstants.GobalParamMap.get("MkCertEduApplyControl"));
+        
+        FrameParam param = this.frameParamService.find(FrameParam.class,"param_name", "MkCertEduApplyControl");
+        if(null != param && "Active".equals(param.getProtect_status())){
+    		rtnMap.put("MkCertEduApplyControl", param.getParam_value());
+    	}
+    	
+        return new Ajax(rtnMap);
+    }
+    
+    @RequestMapping("mk/mkCertEduApply/toApply")
+    public Ajax toApply() {
+    	StdRegInfo std = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	
+		Map<String, Object> rtnMap = new HashMap<String, Object>();
+		
+		List<PlMajor> listStdMajor = this.plMajorService.listStdMajor(std.getId());
+		
+		HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		//paraMap.put("is_net_exam", 1);// 网考
+		paraMap.put("status", 1);// 开考
+		List<PlMajor> majorArray = this.plMajorService.listByMap(paraMap);
+		for (PlMajor plMajor : majorArray) {
+			if(null != plMajor.getMajor_level() && 1 == plMajor.getMajor_level()){
+				plMajor.setMajor_name(plMajor.getMajor_code() + "-" + plMajor.getMajor_name()+"-本科");
+			}else{
+				plMajor.setMajor_name(plMajor.getMajor_code() + "-" + plMajor.getMajor_name()+"-专科");
+			}
+			
+		}
+		listStdMajor.addAll(majorArray);
+		
+		HashSet<Integer> idSet = new HashSet<Integer>();
+		List<PlMajor> rtnMajorList = new ArrayList<PlMajor>();
+		for (PlMajor major : listStdMajor) {
+			if (idSet.add(major.getId())) {
+				rtnMajorList.add(major);
+			}
+			
+		}
+		
+		rtnMap.put("majorList", rtnMajorList);
+		//学历证书
+		rtnMap.put("certTypeList", this.mkCertTypeService.list("cert_catalog", MkConst.CertCatalog.EDU.ordinal()));
+        return new Ajax(rtnMap);
+    }
+    
+    
+    @RequestMapping("mk/mkCertEduApply/listCourse")
+    public Ajax listCourse(Integer major_id) {
+    	MkCertTimeConfig timeConfig = this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+        return new Ajax(this.mkCertMajorCourseService.listByMajorId(major_id, timeConfig.getId()));
+    }
+    
+    @RequestMapping("mk/mkCertEduApply/apply")
+    public Ajax apply(MkCertEduApply apply,Integer[] apply_ids,Integer[] course_ids,String[] course_names,String [] course_scores) {
+    	Ajax rtnAjax = new Ajax();
+    	StdRegInfo std = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	apply.setTicket_no(std.getTicket_no());
+    	
+    	//批次信息
+    	MkCertTimeConfig dbTimeConfig = this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+    	apply.setTime_config_id(dbTimeConfig.getId());
+    	Integer apply_id = null;
+    	if(null == apply_ids){
+    		apply_id = null;
+    	}else{
+    		apply_id = apply_ids.length > 1 ?apply_ids[0]:null;
+    	}
+    	
+    	LocalDateTime now = null;
+		MkCertTimeConfig time = this.timeConfigService.getDataBaseTime();
+		if (null != time && null != time.getStart_time()) {
+			now = time.getStart_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+    	
+    	if(null == apply_id && !DateHelper.isBetween(now, dbTimeConfig.getStart_time(), dbTimeConfig.getEnd_time())){
+    		rtnAjax.setErrorMsg("不在免考时间范围之内,不允许操作!");
+    		rtnAjax.setSuccess(false);
+    		return rtnAjax;
+    	}
+    	
+    	if(null != apply_id){
+    		MkCertEduApply mkapply= this.mkCertEduApplyService.find(apply_id);
+    		if(null != mkapply && mkapply.getTime_config_id().intValue() != dbTimeConfig.getId().intValue()){
+    			rtnAjax.setErrorMsg("申请单的批次,不是当前批次,不允许操作!");
+        		rtnAjax.setSuccess(false);
+        		return rtnAjax;
+    		}
+    	}
+    	
+    	List<Map<String, Object>> scores = this.mkCertEduApplyService.queryScoreByStdIdForMk(std.getId());
+    	
+    	// 考生没有合格的统考成绩,或者没有合格的合成成绩(不包括百分百合成成绩),不允许提交免考申请
+    	if(null == scores || scores.isEmpty()){
+    		rtnAjax.setErrorMsg("您的账号没有自学考试合格成绩,不允许申请免考。");
+    		rtnAjax.setSuccess(false);
+    		return rtnAjax;
+    	}
+    	
+    	if(null == apply.getMajor_id()){
+    		rtnAjax.setErrorMsg("您申请免考的专业为空或专业不存在,请核对后再提交。");
+    		rtnAjax.setSuccess(false);
+    		return rtnAjax;
+    	}
+    	
+    	String errorMsg = saveApply(apply,apply_ids, course_ids, course_names, course_scores, std);
+    	
+    	if (errorMsg.length() != 0) {
+    		rtnAjax.setErrorMsg(errorMsg);
+    		rtnAjax.setSuccess(false);
+		}
+    	
+        return rtnAjax;
+    }
+
+	private String saveApply(MkCertEduApply apply,Integer[] apply_ids, Integer[] course_ids, String[] course_names, String[] course_scores,
+			StdRegInfo std) {
+		MkCertTimeConfig timeConfig = this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+		LocalDateTime now = null;
+		MkCertTimeConfig time = this.timeConfigService.getDataBaseTime();
+		if (null != time && null != time.getStart_time()) {
+			now = time.getStart_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+		
+		String currentTIme = DateHelper.format(now);
+		StringBuilder errorMsg = new StringBuilder();
+		for (int i = 0; i < course_ids.length; i++) {
+    		Integer apply_id = apply_ids.length > 1 ?apply_ids[0]:null;
+    		Integer course_id = course_ids[i];
+    		String course_name = course_names[i];
+    		String course_score = course_scores[i];
+//    		PlCourse plCourse = this.plCourse.find(course_id);
+    		
+    		//验证是否重复提交  course_id timeConfig
+
+    		MkCertEduApply newApply = new MkCertEduApply();
+    		newApply.setStd_cert_no(std.getCert_no());
+    		newApply.setStd_name(std.getStd_name());
+    		newApply.setStd_reg_id(std.getId());
+    		newApply.setTime_config_id(timeConfig.getId());
+    		newApply.setStatus(MkConst.EduApply.LOCAL_VERIFY.ordinal());
+    		newApply.setCreate_time(currentTIme);
+    		
+    		newApply.setTicket_no(apply.getTicket_no());
+    		newApply.setCert_type_id(apply.getCert_type_id());
+    		newApply.setCert_no(apply.getCert_no());
+    		newApply.setTicket_no(apply.getTicket_no());
+    		newApply.setTime_config_id(apply.getTime_config_id());
+//    		newApply.setCert_course_name(plCourse.getCourse_code() + "-" +plCourse.getCourse_name());
+    		
+    		newApply.setCert_course_id(course_id);
+    		newApply.setDone_course_name(course_name);
+    		newApply.setDone_course_score(course_score);
+    		newApply.setFile_path(apply.getFile_path());
+    		newApply.setMajor_id(apply.getMajor_id());
+//    		this.mkCertEduApplyService.deleteByCourseId(course_id);
+    		if (apply_id == null) {
+        		boolean isExist = this.mkCertEduApplyService.checkExist(course_id,std.getId(),newApply.getTime_config_id());
+        		if (isExist) {
+        			PlCourse plCourse = this.plCourse.find(course_id);
+        			errorMsg.append("课程["+plCourse.getCourse_name()+"] 已经申请过,不能重复提交申请;");
+        			continue;
+    			}
+        		
+        		//根据专业和课程查询课程的属性
+            	PlMajorCourse plMajorCourse = this.plMajorCourseService.findMajorCourse(apply.getMajor_id(), course_id);
+            	// 专业课时进行校验
+            	if(null != plMajorCourse && 2 == plMajorCourse.getCourse_nature().intValue()){
+            		// 根据考生获取 考生已存在的专业课程的免考成绩数+本批次已申请的免考的专业课程数+本次正在申请的免考的专业课程数
+                	MkCertEduApply mkCertEduApply = this.mkCertEduApplyService.queryScoreCountByStdIdForMk(apply.getMajor_id(), std.getId(), apply.getTime_config_id(),null);
+                	if(null != mkCertEduApply){
+                		// 申请免考的专业课程不能超过30%
+                		long course_count_max = Math.round(mkCertEduApply.getCourse_count()*0.3);
+            			if (mkCertEduApply.getMk_count() + mkCertEduApply.getScore_count() >= course_count_max) {
+            				PlMajor plMajor = this.plMajorService.find(apply.getMajor_id());
+							errorMsg.append("您申请免考的专业【").append(plMajor.getMajor_code()).append("-")
+									.append(plMajor.getMajor_name())
+									.append("】,已经申请免考的专业课程数量超过该专业的专业课程数量的30%,不允许提交当前课程的免考申请。");
+							continue;
+            			}
+                	}
+            	}
+            	
+    			this.mkCertEduApplyService.insert(newApply);
+			}else{
+				
+				//根据专业和课程查询课程的属性
+            	PlMajorCourse plMajorCourse = this.plMajorCourseService.findMajorCourse(apply.getMajor_id(), course_id);
+            	// 专业课时进行校验
+            	if(null != plMajorCourse && 2 == plMajorCourse.getCourse_nature().intValue()){
+            		// 根据考生获取 考生已存在的专业课程的免考成绩数+本批次已申请的免考的专业课程数+本次正在申请的免考的专业课程数
+                	MkCertEduApply mkCertEduApply = this.mkCertEduApplyService.queryScoreCountByStdIdForMk(apply.getMajor_id(), std.getId(), apply.getTime_config_id(),apply_id);
+                	if(null != mkCertEduApply){
+                		// 申请免考的专业课程不能超过30%
+                		long course_count_max = Math.round(mkCertEduApply.getCourse_count()*0.3);
+            			if (mkCertEduApply.getMk_count() + mkCertEduApply.getScore_count() >= course_count_max) {
+            				PlMajor plMajor = this.plMajorService.find(apply.getMajor_id());
+							errorMsg.append("您申请免考的专业【").append(plMajor.getMajor_code()).append("-")
+									.append(plMajor.getMajor_name())
+									.append("】,已经申请免考的专业课程数量超过该专业的专业课程数量的30%,不允许提交当前课程的免考申请。");
+							continue;
+            			}
+                	}
+            	}
+            	
+				MkCertEduApply dbApply = this.mkCertEduApplyService.find(apply_id);
+				dbApply.setCert_type_id(apply.getCert_type_id());
+				dbApply.setDone_course_name(course_name);
+				dbApply.setDone_course_score(course_score);
+				dbApply.setFile_path(apply.getFile_path());
+				dbApply.setStatus(MkConst.EduApply.LOCAL_VERIFY.ordinal());
+				dbApply.setMajor_id(apply.getMajor_id());
+				this.mkCertEduApplyService.edit(dbApply);
+			}
+		}
+		return errorMsg.toString();
+	}
+ 
+	
+	/**
+	 * @param file:外省准考证
+	 * @param pro_code:外省省份编码
+	 *  处理考生上传的外省准考证
+	 */
+	
+	@RequestMapping("mk/mkCertEduApply/upload")
+	public Ajax uploadFile( MultipartFile file) {
+		StdRegInfo std = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		if (StringHelper.isNotEmpty(extension)) {
+			extension = extension.toLowerCase();
+		}
+		
+		ImageUtil.validateUploadFileExt(file);
+		
+		String cert_no = std.getCert_no();
+		String rootPath = SysConst.getAppConfig().getUploadBase();
+		String rtnName = null;;
+		String fileSeq = this.mkPreEduApplyService.getFileSeq();
+		try {
+			makeDir(rootPath);
+			rtnName = SysConst.IMG_EDU_PREFIX +  cert_no + "_"+ new Date().getTime() + "_"+ fileSeq +"." + extension;
+			String fullFileName = rootPath + rtnName;
+			file.transferTo(new File(fullFileName));
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new BusinessException("文件上传错误,请检查文件");
+		}
+		return new Ajax(rtnName);
+	}
+	
+	/**
+	 * @param rootPath:目录路径
+	 * 创建目录
+	 */
+	private void makeDir(String rootPath) {
+		File dir = new File(rootPath + SysConst.IMG_EDU_PREFIX);
+		if (!dir.exists())
+			dir.mkdir();
+	}
+
+	@RequestMapping("mk/mkCertEduApply/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        return new Ajax(this.mkCertEduApplyService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    //@RequestMapping("mk/mkCertEduApply/add")
+    public Ajax add(MkCertEduApply mkCertEduApply) {
+        this.mkCertEduApplyService.insert(mkCertEduApply);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertEduApply/edit")
+    public Ajax edit(MkCertEduApply mkCertEduApply) {
+        this.mkCertEduApplyService.edit(mkCertEduApply);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertEduApply/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.mkCertEduApplyService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("mk/mkCertEduApply/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.mkCertEduApplyService.find(id));
+    } 
+    
+    @RequestMapping("mk/mkCertEduApply/back")
+    public Ajax back(Integer id) {
+    	MkCertEduApply dbApply = this.mkCertEduApplyService.find(id);
+    	if (dbApply.getStatus() != MkConst.EduApply.LOCAL_VERIFY.ordinal()) {
+			throw new BusinessException("当前不是初审状态无法退回申请");
+		}
+    	
+    	//批次信息
+    	MkCertTimeConfig dbTimeConfig = this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+    	if(null != dbApply && dbApply.getTime_config_id().intValue() != dbTimeConfig.getId().intValue()){
+    		throw new BusinessException("申请单的批次,不是当前批次,不允许操作!");
+		}
+    	
+    	dbApply.setStatus(MkConst.EduApply.NEW.ordinal());
+    	dbApply.setVerify1_remark("考生撤回申请单");
+    	
+    	this.mkCertEduApplyService.edit(dbApply);
+    	return new Ajax();
+    }    
+ 
+}

+ 62 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertMajorCourseControl.java

@@ -0,0 +1,62 @@
+package cn.hmsoft.ses.control.mk;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.data.model.mk.MkCertMajorCourse;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.service.iface.mk.IMkCertMajorCourseService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *  控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-03-05 15:29:15
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class MkCertMajorCourseControl extends AjaxControl {
+
+    @Autowired
+    private IMkCertMajorCourseService mkCertMajorCourseService;
+	
+    @RequestMapping("mk/mkCertMajorCourse/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.mkCertMajorCourseService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    //@RequestMapping("mk/mkCertMajorCourse/add")
+    public Ajax add(MkCertMajorCourse mkCertMajorCourse) {
+        this.mkCertMajorCourseService.insert(mkCertMajorCourse);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertMajorCourse/edit")
+    public Ajax edit(MkCertMajorCourse mkCertMajorCourse) {
+        this.mkCertMajorCourseService.edit(mkCertMajorCourse);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertMajorCourse/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.mkCertMajorCourseService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("mk/mkCertMajorCourse/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.mkCertMajorCourseService.find(id));
+    }    
+}

+ 295 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertNeduApplyControl.java

@@ -0,0 +1,295 @@
+package cn.hmsoft.ses.control.mk;
+
+import java.io.File;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.common.MkConst;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.model.mk.MkCertNeduApply;
+import cn.hmsoft.ses.data.model.mk.MkCertTimeConfig;
+import cn.hmsoft.ses.data.model.mk.MkCertType;
+import cn.hmsoft.ses.data.model.pl.PlMajor;
+import cn.hmsoft.ses.data.model.std.StdMajor;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.helper.DateHelper;
+import cn.hmsoft.ses.service.iface.mk.IMkCertEduApplyService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertNeduApplyCourseService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertNeduApplyService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTimeConfigService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTypeService;
+import cn.hmsoft.ses.service.iface.mk.IMkPreEduApplyService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdMajorService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ *  控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-03-05 15:29:16
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class MkCertNeduApplyControl extends AjaxControl {
+	
+	@Autowired
+    private IMkCertTypeService mkCertTypeService;
+    @Autowired
+    private IMkCertNeduApplyService mkCertNeduApplyService;
+    @Autowired
+    private IMkCertNeduApplyCourseService mkCertNeduApplyCourseService;
+    @Autowired
+	private IMkCertTimeConfigService timeConfigService;
+	@Autowired
+	private IStdMajorService stdMajorService;
+	@Autowired
+    private IMkPreEduApplyService mkPreEduApplyService;
+	
+	@Autowired
+	private IPlMajorService plMajorService;
+	@Autowired
+    private IMkCertEduApplyService mkCertEduApplyService;
+
+    
+    @RequestMapping("mk/mkCertNeduApply/list")
+    public Ajax list() {
+    	StdRegInfo sessionStdRegInfo = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+        HashMap<String,Object> rtnMap = new HashMap<String,Object>();
+        rtnMap.put("timeLimit", this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal()));
+        //免考现场审核时间
+        rtnMap.put("authTimeLimit", this.timeConfigService.findTimeConfig(4));
+        
+        //免考审定结果公布时间
+        rtnMap.put("pushTimeLimit", this.timeConfigService.findTimeConfig(3));
+        
+        rtnMap.put("applyList", this.mkCertNeduApplyService.listAll(sessionStdRegInfo.getId()));// 已申请记
+        return new Ajax(rtnMap);
+    }
+    
+//    
+    @RequestMapping("mk/mkCertNeduApply/toApply")
+    public Ajax toApply() {
+    	StdRegInfo sessionStdRegInfo = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	HashMap<String,Object> rtnMap = new HashMap<String,Object>();
+    	List<StdMajor> stdMajor = this.stdMajorService.listStdMajor(sessionStdRegInfo.getId());
+    	for (StdMajor stdm : stdMajor) {
+    		stdm.setId(stdm.getMajor_id());
+		}
+    	HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		//paraMap.put("is_net_exam", 1);// 网考
+		paraMap.put("status", 1);// 开考
+		List<PlMajor> majorArray = this.plMajorService.listByMap(paraMap);
+    	
+		HashSet<Integer> majorId =  new HashSet<Integer>();
+		for (PlMajor plMajor : majorArray) {
+			StdMajor newMjoar = new StdMajor();
+			newMjoar.setId(plMajor.getId());
+			if(null != plMajor.getMajor_level() && 1 == plMajor.getMajor_level()){
+				newMjoar.setFull_name(plMajor.getMajor_code() + "-" + plMajor.getMajor_name()+"-本科");
+			}else{
+				newMjoar.setFull_name(plMajor.getMajor_code() + "-" + plMajor.getMajor_name()+"-专科");
+			}
+			
+			if(majorId.add(plMajor.getId()))
+				stdMajor.add(newMjoar);
+		}
+		
+        rtnMap.put("majorList", stdMajor);
+//        rtnMap.put("certTypeCatalogList",FrameDictUtil.getFrameDict("certTypeCatalog"));
+        rtnMap.put("certTypeCatalogList",FrameDictUtil.getFrameDict("cert_level"));
+        return new Ajax(rtnMap);
+    }
+    
+    @RequestMapping("mk/mkCertNeduApply/queryCertTypeBylevel")
+    public Ajax toAqueryCertTypeBylevelpply(String cert_level) {
+    	if (StringUtils.isEmpty(cert_level)) {
+			throw new BusinessException("证书层次不能为空");
+		}
+    	return new Ajax(FrameDictUtil.getFrameDict("cert_level_"+cert_level));
+    }
+    
+    
+    
+    @RequestMapping("mk/mkCertNeduApply/upload")
+	public Ajax upload(MultipartFile file){
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		String filePath = uploadFile(std, std.getTicket_no(), file);
+		return new Ajax(filePath);
+	}
+
+	/**
+	 * @param file:外省准考证
+	 * @param pro_code:外省省份编码
+	 *  处理考生上传的外省准考证
+	 */
+	private String uploadFile(StdRegInfo std, String pro_code, MultipartFile file) {
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		if (StringHelper.isNotEmpty(extension)) {
+			extension = extension.toLowerCase();
+		}
+		String cert_no = std.getCert_no();
+		String rootPath = SysConst.getAppConfig().getUploadBase();
+		String rtnName;
+		String fileSeq = this.mkPreEduApplyService.getFileSeq();
+		try {
+			makeDir(rootPath);
+			rtnName = SysConst.IMG_NEDU_PREFIX +  cert_no + "_"+ new Date().getTime() + "_"+ fileSeq +"." + extension;
+			String fullFileName = rootPath + rtnName;
+			file.transferTo(new File(fullFileName));
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new BusinessException("文件上传错误,请检查文件");
+		}
+		return rtnName;
+	}
+	
+    
+    @RequestMapping("mk/mkCertNeduApply/apply")
+    public Ajax apply(MkCertNeduApply mkCertNeduApply, String[] courseIds) {
+    	StdRegInfo sessionStdRegInfo = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	Ajax rtnAjax = new Ajax();
+    	//批次信息
+    	MkCertTimeConfig dbTimeConfig = this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+    	
+    	LocalDateTime now = null;
+		MkCertTimeConfig time = this.timeConfigService.getDataBaseTime();
+		if (null != time && null != time.getStart_time()) {
+			now = time.getStart_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+		
+    	if(null == mkCertNeduApply.getId() && !DateHelper.isBetween(now, dbTimeConfig.getStart_time(), dbTimeConfig.getEnd_time())){
+    		rtnAjax.setErrorMsg("不在免考时间范围之内,不允许操作!");
+    		rtnAjax.setSuccess(false);
+    		return rtnAjax;
+    	}
+    	
+    	if(null != mkCertNeduApply.getId()){
+    		MkCertNeduApply mkapply= this.mkCertNeduApplyService.find(mkCertNeduApply.getId());
+    		if(null != mkapply && mkapply.getTime_config_id().intValue() != dbTimeConfig.getId().intValue()){
+    			rtnAjax.setErrorMsg("申请单的批次,不是当前批次,不允许操作!");
+        		rtnAjax.setSuccess(false);
+        		return rtnAjax;
+    		}
+    	}
+    	
+    	List<Map<String, Object>> scores = this.mkCertEduApplyService.queryScoreByStdIdForMk(sessionStdRegInfo.getId());
+    	
+    	// 考生没有合格的统考成绩,或者没有合格的合成成绩(不包括百分百合成成绩),不允许提交免考申请
+    	if(null == scores || scores.isEmpty()){
+    		rtnAjax.setErrorMsg("您的账号没有自学考试合格成绩,不允许申请免考。");
+    		rtnAjax.setSuccess(false);
+    		return rtnAjax;
+    	}
+    	
+    	//ORG_ID
+    	mkCertNeduApply.setStd_reg_id(sessionStdRegInfo.getId());
+    	
+    	if(StringUtils.isEmpty(mkCertNeduApply.getStd_name())){
+    		mkCertNeduApply.setStd_name(sessionStdRegInfo.getStd_name());
+    	}
+    	
+    	mkCertNeduApply.setTime_config_id(dbTimeConfig.getId());
+        this.mkCertNeduApplyService.apply(mkCertNeduApply,courseIds);
+        return rtnAjax;
+    }
+    
+    @RequestMapping("mk/mkCertNeduApply/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.mkCertNeduApplyService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    @RequestMapping("mk/mkCertNeduApply/back")
+    public Ajax back(Integer id) {
+    	MkCertNeduApply mkCertNeduApply = this.mkCertNeduApplyService.find(id);
+    	if (mkCertNeduApply.getStatus() != MkConst.EduApply.LOCAL_VERIFY.ordinal()) {
+			throw new BusinessException("当前不是待现场验证状态无法撤回申请");
+		}
+    	
+    	if(null != mkCertNeduApply.getId()){
+    		//批次信息
+        	MkCertTimeConfig dbTimeConfig = this.timeConfigService.findTimeConfig(MkConst.TimeConfig.免考申请.ordinal());
+        	
+    		MkCertNeduApply mkapply= this.mkCertNeduApplyService.find(mkCertNeduApply.getId());
+    		if(null != mkapply && mkapply.getTime_config_id().intValue() != dbTimeConfig.getId().intValue()){
+    			throw new BusinessException("申请单的批次,不是当前批次,不允许操作!");
+    		}
+    	}
+    	
+    	mkCertNeduApply.setStatus(MkConst.EduApply.NEW.ordinal());
+    	mkCertNeduApply.setVerify_remark1("考生撤回申请单");
+    	this.mkCertNeduApplyService.edit(mkCertNeduApply);
+    	
+    	this.mkCertNeduApplyCourseService.updateStatusByApplyId(id,MkConst.EduApply.NEW.ordinal());
+    	
+    	return new Ajax();
+    }
+    
+    /**
+	 * @param rootPath:目录路径
+	 * 创建目录
+	 */
+	private void makeDir(String rootPath) {
+		File dir = new File(rootPath + SysConst.IMG_NEDU_PREFIX);
+		if (!dir.exists())
+			dir.mkdir();
+	}
+
+    //@RequestMapping("mk/mkCertNeduApply/add")
+    public Ajax add(MkCertNeduApply mkCertNeduApply) {
+        this.mkCertNeduApplyService.insert(mkCertNeduApply);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertNeduApply/edit")
+    public Ajax edit(MkCertNeduApply mkCertNeduApply) {
+        this.mkCertNeduApplyService.edit(mkCertNeduApply);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertNeduApply/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.mkCertNeduApplyService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("mk/mkCertNeduApply/get")
+    public Ajax get(Integer id) {
+    	HashMap<String,Object> rtnMap = new HashMap<String,Object>();
+    	MkCertNeduApply neduApply = this.mkCertNeduApplyService.find(id);
+    	/*MkCertType certType = mkCertTypeService.find(neduApply.getCert_type_id());
+    	if(null !=certType) {
+    		neduApply.setCert_type_catalog(certType.getCert_type());
+    	}*/
+    	
+        rtnMap.put("entity", neduApply);
+        rtnMap.put("certTypeCatalogList",FrameDictUtil.getFrameDict("certTypeCatalog"));
+        return new Ajax(rtnMap);
+    }    
+}

+ 75 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertNeduApplyCourseControl.java

@@ -0,0 +1,75 @@
+package cn.hmsoft.ses.control.mk;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.data.model.mk.MkCertNeduApplyCourse;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.service.iface.mk.IMkCertNeduApplyCourseService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *  控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-03-05 15:29:17
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class MkCertNeduApplyCourseControl extends AjaxControl {
+
+    @Autowired
+    private IMkCertNeduApplyCourseService mkCertNeduApplyCourseService;
+	
+    @RequestMapping("mk/mkCertNeduApplyCourse/listByCertTypeId")
+    public Ajax listByCertTypeId(String cert_type_id) {
+    	return new Ajax(this.mkCertNeduApplyCourseService.list("cert_id", cert_type_id));
+    }
+    
+    @RequestMapping("mk/mkCertNeduApplyCourse/listByStd")
+    public Ajax listByStd() {
+    	StdRegInfo std = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	return new Ajax(this.mkCertNeduApplyCourseService.listByStd(std.getId()));
+    }
+    
+    @RequestMapping("mk/mkCertNeduApplyCourse/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.mkCertNeduApplyCourseService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    //@RequestMapping("mk/mkCertNeduApplyCourse/add")
+    public Ajax add(MkCertNeduApplyCourse mkCertNeduApplyCourse) {
+        this.mkCertNeduApplyCourseService.insert(mkCertNeduApplyCourse);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertNeduApplyCourse/edit")
+    public Ajax edit(MkCertNeduApplyCourse mkCertNeduApplyCourse) {
+        this.mkCertNeduApplyCourseService.edit(mkCertNeduApplyCourse);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertNeduApplyCourse/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.mkCertNeduApplyCourseService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("mk/mkCertNeduApplyCourse/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.mkCertNeduApplyCourseService.find(id));
+    }    
+}

+ 62 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertTimeConfigControl.java

@@ -0,0 +1,62 @@
+package cn.hmsoft.ses.control.mk;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.data.model.mk.MkCertTimeConfig;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTimeConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * �������������� 控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-04-11 10:44:55
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class MkCertTimeConfigControl extends AjaxControl {
+
+    @Autowired
+    private IMkCertTimeConfigService mkCertTimeConfigService;
+	
+    @RequestMapping("mk/mkCertTimeConfig/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.mkCertTimeConfigService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    //@RequestMapping("mk/mkCertTimeConfig/add")
+    public Ajax add(MkCertTimeConfig mkCertTimeConfig) {
+        this.mkCertTimeConfigService.insert(mkCertTimeConfig);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertTimeConfig/edit")
+    public Ajax edit(MkCertTimeConfig mkCertTimeConfig) {
+        this.mkCertTimeConfigService.edit(mkCertTimeConfig);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertTimeConfig/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.mkCertTimeConfigService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("mk/mkCertTimeConfig/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.mkCertTimeConfigService.find(id));
+    }    
+}

+ 80 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkCertTypeControl.java

@@ -0,0 +1,80 @@
+package cn.hmsoft.ses.control.mk;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.data.model.mk.MkCertType;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *  控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-03-05 15:29:12
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class MkCertTypeControl extends AjaxControl {
+
+    @Autowired
+    private IMkCertTypeService mkCertTypeService;
+    
+    /**证书 分类
+     * @param cert_type
+     * @return
+     */
+    @RequestMapping("mk/mkCertType/listByType")
+    public Ajax listByType(String cert_type) {
+    	return new Ajax(this.mkCertTypeService.list("cert_type", cert_type));
+    }
+    
+    /**学历 非学历证书 查询 
+     * @param cert_type
+     * @return
+     */
+    @RequestMapping("mk/mkCertType/listByIsEdu")
+    public Ajax listByIsEdu(String is_edu) {
+    	return new Ajax(this.mkCertTypeService.list("is_edu", is_edu));
+    }
+	
+    @RequestMapping("mk/mkCertType/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.mkCertTypeService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    //@RequestMapping("mk/mkCertType/add")
+    public Ajax add(MkCertType mkCertType) {
+        this.mkCertTypeService.insert(mkCertType);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertType/edit")
+    public Ajax edit(MkCertType mkCertType) {
+        this.mkCertTypeService.edit(mkCertType);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkCertType/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.mkCertTypeService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("mk/mkCertType/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.mkCertTypeService.find(id));
+    }    
+}

+ 203 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/mk/MkPreEduApplyControl.java

@@ -0,0 +1,203 @@
+package cn.hmsoft.ses.control.mk;
+
+import java.io.File;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import cn.hmsoft.frame.data.model.FrameDict;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.common.MkConst;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.model.mk.MkCertTimeConfig;
+import cn.hmsoft.ses.data.model.mk.MkCertType;
+import cn.hmsoft.ses.data.model.mk.MkPreEduApply;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.helper.DateHelper;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTimeConfigService;
+import cn.hmsoft.ses.service.iface.mk.IMkCertTypeService;
+import cn.hmsoft.ses.service.iface.mk.IMkPreEduApplyService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ *  控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-03-15 14:36:00
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class MkPreEduApplyControl extends AjaxControl {
+
+    @Autowired
+    private IMkPreEduApplyService mkPreEduApplyService;
+    
+    @Autowired
+	private IMkCertTimeConfigService timeConfigService;
+    
+    @Autowired
+    private IMkCertTypeService mkCertTypeService;
+	
+    @RequestMapping("mk/mkPreEduApply/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        return new Ajax(this.mkPreEduApplyService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    @RequestMapping("mk/mkPreEduApply/listByStd")
+    public Ajax listByStd() {
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);;
+        HashMap<String,Object> rtnMap = new HashMap<String,Object>();
+        rtnMap.put("timeLimit", this.timeConfigService.findTimeConfig(MkConst.TimeConfig.前置学历申请.ordinal()));
+    	rtnMap.put("applyList",this.mkPreEduApplyService.listByStd(std.getId()));
+        return new Ajax(rtnMap);
+    }
+    
+    @RequestMapping("mk/mkPreEduApply/toApply")
+    public Ajax toApply() {
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);;
+ 
+        return new Ajax(this.initData());
+    }
+    
+	private HashMap initData() {
+		// 学历层次
+		List<FrameDict> certLevelArray = FrameDictUtil.getFrameDict("CertLevel");
+		// 学历类型
+		List<MkCertType> certTypeArray = this.mkCertTypeService.list("is_edu", 1);
+		// 学历证书分类
+		List<FrameDict> certTypeCatalogArray = FrameDictUtil.getFrameDict("certTypeCatalog");
+
+		HashMap<String, Object> rtnMap = new HashMap<String, Object>();
+		rtnMap.put("certLevelArray", certLevelArray);
+		rtnMap.put("certTypeArray", certTypeArray);
+		rtnMap.put("certTypeCatalogArray", certTypeCatalogArray);
+		return rtnMap;
+	}
+    
+    @RequestMapping("mk/mkPreEduApply/upload")
+	public Ajax upload(MultipartFile file){
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		String filePath = uploadFile(std, std.getTicket_no(), file);
+		return new Ajax(filePath);
+	}
+
+	/**
+	 * @param file:外省准考证
+	 * @param pro_code:外省省份编码
+	 *  处理考生上传的外省准考证
+	 */
+	private String uploadFile(StdRegInfo std, String pro_code, MultipartFile file) {
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		if (StringHelper.isNotEmpty(extension)) {
+			extension = extension.toLowerCase();
+		}
+		String cert_no = std.getCert_no();
+		String rootPath = SysConst.getAppConfig().getUploadBase();
+		String rtnName;
+		String fileSeq = this.mkPreEduApplyService.getFileSeq();
+		try {
+			makeDir(rootPath);
+			rtnName = SysConst.IMG_PRE_EDU_PREFIX +  cert_no + "_"+ new Date().getTime() + "_"+ fileSeq +"." + extension;
+			String fullFileName = rootPath + rtnName;
+			file.transferTo(new File(fullFileName));
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new BusinessException("文件上传错误,请检查文件");
+		}
+		return rtnName;
+	}
+	
+	@RequestMapping("mk/mkPreEduApply/apply")
+    public Ajax apply(MkPreEduApply mkPreEduApply) {
+		Ajax ajax = new Ajax();
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		//id为空 新增
+		if (StringUtils.isEmpty(mkPreEduApply.getId())) {
+			//数据重复性炎症
+			HashMap<String, Object> paraMap = new HashMap<String, Object>();
+			paraMap.put("std_reg_id", std.getId());
+			paraMap.put("cert_type_id", mkPreEduApply.getCert_type_id());
+			paraMap.put("cert_no", mkPreEduApply.getCert_no());
+			
+			List<MkPreEduApply> dbApplyList = this.mkPreEduApplyService.listByMap(paraMap);
+			if (dbApplyList.size() > 0) {
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("该证件已经提交过,无需重复提交申请!");
+			}
+			
+			if (!StringUtils.isEmpty(mkPreEduApply.getIn_school_date())) 
+				mkPreEduApply.setIn_school_date(mkPreEduApply.getIn_school_date().substring(0, 10));
+			if (!StringUtils.isEmpty(mkPreEduApply.getOut_school_date())) 
+				mkPreEduApply.setOut_school_date(mkPreEduApply.getOut_school_date().substring(0, 10));
+			
+			mkPreEduApply.setStd_reg_id(std.getId());
+			mkPreEduApply.setStatus(MkConst.PreEduApply.LOCAL_VERIFY.ordinal());
+			mkPreEduApply.setIs_verify(0);
+			mkPreEduApply.setApply_time(DateHelper.format(LocalDateTime.now()));
+			
+			MkCertTimeConfig timeConfig = this.timeConfigService.findTimeConfig(MkConst.TimeConfig.前置学历申请.ordinal());
+			mkPreEduApply.setTime_config_id(timeConfig.getId());
+			
+	        this.mkPreEduApplyService.insert(mkPreEduApply);
+		} else {
+			mkPreEduApply.setApply_time(DateHelper.format(LocalDateTime.now()));
+			mkPreEduApply.setStatus(MkConst.PreEduApply.LOCAL_VERIFY.ordinal());
+			this.mkPreEduApplyService.edit(mkPreEduApply);
+		}
+	
+        return ajax;
+    }
+
+    //@RequestMapping("mk/mkPreEduApply/add")
+    public Ajax add(MkPreEduApply mkPreEduApply) {
+        this.mkPreEduApplyService.insert(mkPreEduApply);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkPreEduApply/edit")
+    public Ajax edit(MkPreEduApply mkPreEduApply) {
+        this.mkPreEduApplyService.edit(mkPreEduApply);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("mk/mkPreEduApply/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.mkPreEduApplyService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("mk/mkPreEduApply/get")
+    public Ajax get(Integer id) {
+    	HashMap initDatamap = this.initData();
+    	initDatamap.put("entity", this.mkPreEduApplyService.find(id));
+        return new Ajax(initDatamap);
+    }    
+    
+    /**
+	 * @param rootPath:目录路径
+	 * 创建目录
+	 */
+	private void makeDir(String rootPath) {
+		File dir = new File(rootPath + SysConst.IMG_PRE_EDU_PREFIX);
+		if (!dir.exists())
+			dir.mkdir();
+	}
+}

+ 148 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/pay/PayBillUnionControl.java

@@ -0,0 +1,148 @@
+package cn.hmsoft.ses.control.pay;
+
+import cn.hmsoft.frame.data.model.FrameDict;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.data.model.pay.PayBillUnion;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.service.iface.pay.IPayBillUnionService;
+import cn.hmsoft.ses.service.iface.pl.IPlCourseService;
+import cn.hmsoft.ses.service.iface.std.IStdEnrolService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 控制器.
+ *
+ * @author: yangwei
+ * @date: 2019-02-22 16:19:34
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class PayBillUnionControl extends AjaxControl {
+
+    @Autowired
+    private IPayBillUnionService payBillUnionService;
+    @Autowired
+    private IStdEnrolService stdEnrolService;
+
+    @Autowired
+    private IPlCourseService courseService;
+
+    @RequestMapping("pay/payBillUnion/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+            //TODO 修改为排序字段
+            order = "1";
+        }
+        return new Ajax(this.payBillUnionService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+
+    //@RequestMapping("pay/payBillUnion/add")
+    public Ajax add(PayBillUnion payBillUnion) {
+        this.payBillUnionService.insert(payBillUnion);
+        return new Ajax();
+    }
+
+    //@RequestMapping("pay/payBillUnion/edit")
+    public Ajax edit(PayBillUnion payBillUnion) {
+        this.payBillUnionService.edit(payBillUnion);
+        return new Ajax();
+    }
+
+    //@RequestMapping("pay/payBillUnion/delete")
+    public Ajax delete(Integer[] ids) {
+        for (Integer id : ids) {
+            this.payBillUnionService.delete(id);
+        }
+        return new Ajax();
+    }
+
+    @RequestMapping("pay/payBillUnion/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.payBillUnionService.find(id));
+    }
+
+    @RequestMapping("pay/payBillUnion/listByStd")
+    public Ajax listByStd(Integer std_id) {
+    	StdRegInfo login = (StdRegInfo)this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	
+        List<FrameDict> payBillUnion_Status = FrameDictUtil.getFrameDict("payBillUnion_Status");
+        List<FrameDict> payBillUnion_BizType = FrameDictUtil.getFrameDict("payBillUnion_BizType");
+        List<FrameDict> payBillUnion_PayChannel = FrameDictUtil.getFrameDict("payBillUnion_PayChannel");
+
+        List<PayBillUnion> payList = this.payBillUnionService.list("customer_id", login.getId());
+        for (PayBillUnion payBillUnion : payList) {
+            for (FrameDict status : payBillUnion_Status) {
+                if (status.getDict_value().equals(payBillUnion.getBill_status())) {
+                    payBillUnion.setBill_status(status.getDict_text());
+                }
+
+            }
+
+            for (FrameDict bizType : payBillUnion_BizType) {
+                if (bizType.getDict_value().equals(payBillUnion.getBusiness_type())) {
+                    payBillUnion.setBusiness_type(bizType.getDict_text());
+                }
+
+            }
+
+            for (FrameDict payChannel : payBillUnion_PayChannel) {
+                if (payChannel.getDict_value().equals(payBillUnion.getChannel_type())) {
+                    payBillUnion.setChannel_type(payChannel.getDict_text());
+                }
+
+            }
+        }
+        return new Ajax(payList);
+    }
+
+    /**
+     * 查询报考的支付明细
+     *
+     * @param enrol_id
+     * @return
+     */
+    @RequestMapping("pay/payBillUnion/listByEnrol")
+    public Ajax listByEnrol(Integer enrol_id) {
+        List<FrameDict> payBillUnion_Status = FrameDictUtil.getFrameDict("payBillUnion_Status");
+        List<FrameDict> payBillUnion_BizType = FrameDictUtil.getFrameDict("payBillUnion_BizType");
+        List<FrameDict> payBillUnion_PayChannel = FrameDictUtil.getFrameDict("payBillUnion_PayChannel");
+        List<PayBillUnion> payList = this.payBillUnionService.list("business_id", enrol_id);
+        for (PayBillUnion payBillUnion : payList) {
+            for (FrameDict status : payBillUnion_Status) {
+                if (status.getDict_value().equals(payBillUnion.getBill_status())) {
+                    payBillUnion.setBill_status(status.getDict_text());
+                }
+
+            }
+
+            for (FrameDict bizType : payBillUnion_BizType) {
+                if (bizType.getDict_value().equals(payBillUnion.getBusiness_type())) {
+                    payBillUnion.setBusiness_type(bizType.getDict_text());
+                }
+
+            }
+
+            for (FrameDict payChannel : payBillUnion_PayChannel) {
+                if (payChannel.getDict_value().equals(payBillUnion.getChannel_type())) {
+                    payBillUnion.setChannel_type(payChannel.getDict_text());
+                }
+
+            }
+        }
+        return new Ajax(payList);
+    }
+
+
+   
+
+}

+ 420 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/pay/PayInvoicingControl.java

@@ -0,0 +1,420 @@
+package cn.hmsoft.ses.control.pay;
+
+import java.io.File;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.service.IFrameParamService;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.constants.CfConst.CfOperateTimeType;
+import cn.hmsoft.ses.data.model.cf.CfOperateTime;
+import cn.hmsoft.ses.data.model.pay.PayInvoicing;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.data.model.sys.SysOperateFail;
+import cn.hmsoft.ses.helper.YearCodeHelper;
+import cn.hmsoft.ses.service.iface.cf.ICfOperateTimeService;
+import cn.hmsoft.ses.service.iface.pay.IPayInvoicingService;
+import cn.hmsoft.ses.service.iface.sys.ISysOperateFailService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+@RestController
+public class PayInvoicingControl extends AjaxControl {
+
+	@Autowired
+	private IPayInvoicingService payInvoicingService;
+	@Autowired
+	private ICfOperateTimeService timeService;
+	@Autowired
+    private IFrameParamService frameParamService;
+	@Autowired
+	private ISysOperateFailService sysOperateFailService;
+	
+	@RequestMapping("pay/payInvoicing/init")
+	public Ajax listStdEnrol() {
+		Map<String, Object> map = new HashMap<String, Object>();
+		CfOperateTime time = this.timeService.getOperateTimeByOperType(CfOperateTimeType.INVOICING.ordinal());
+		if(null != time){
+			map.put("year", time.getExam_year());
+			
+			if("4".equals(time.getExam_month())){
+				map.put("month", "上半年");
+			}else if("10".equals(time.getExam_month())){
+				map.put("month", "下半年");
+			}else{
+				map.put("month", time.getExam_month()+"月");
+			}
+			
+			map.put("timeControl", time);
+		}else{
+			map.put("year", YearCodeHelper.getExamYear());
+			
+			if("4".equals(YearCodeHelper.getExamMonth())){
+				map.put("month", "上半年");
+			}else if("10".equals(YearCodeHelper.getExamMonth())){
+				map.put("month", "下半年");
+			}else{
+				map.put("month", YearCodeHelper.getExamMonth()+"月");
+			}
+			
+			map.put("timeControl", this.timeService.getOperateTime(CfOperateTimeType.INVOICING.ordinal(),null));
+		}
+		
+		
+		map.put("inTime", this.timeService.isInTimeByOperType(CfOperateTimeType.INVOICING.ordinal())); // 是否在发票申请时间范围内
+
+		FrameParam param = this.frameParamService.find(FrameParam.class,"param_name", "PayInvoicingControl");
+		if(null != param && "Active".equals(param.getProtect_status())){
+    		map.put("PayInvoicingControl", param.getParam_value());
+    	}
+    	
+		return new Ajax(map);
+	}
+
+	@RequestMapping("pay/payInvoicing/queryPayInvoicing")
+	public Ajax queryPayInvoicing(Integer std_id) {
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(stdRegInfo, "请重新登录");
+
+		if (stdRegInfo != null & !stdRegInfo.getId().equals(std_id)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		return new Ajax(this.payInvoicingService.queryPayInvoicing(std_id));
+	}
+
+	@RequestMapping("pay/payInvoicing/queryBillNo")
+	public Ajax queryBillNo(Integer std_id, String year_code) {
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(stdRegInfo, "请重新登录");
+
+		if (stdRegInfo != null & !stdRegInfo.getId().equals(std_id)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		if (StringUtils.isEmpty(year_code)) {
+			year_code = YearCodeHelper.getCurrentYearCode();
+		}
+		
+		return new Ajax(this.payInvoicingService.queryBillNo(stdRegInfo.getId(), year_code));
+	}
+
+	@RequestMapping("pay/payInvoicing/invoicing")
+	public Ajax invoicing(Integer std_id,String std_name,String cert_no,String payerPartyType, String[] billnos) {
+		Ajax rtnAjax = new Ajax();
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (null == stdRegInfo) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg("请重新登录");
+			return rtnAjax;
+		}
+
+		if (stdRegInfo != null & !stdRegInfo.getId().equals(std_id)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+		
+		if (StringUtils.isEmpty(std_name)) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg("请填写开票名称");
+			return rtnAjax;
+		}
+		
+		if (StringUtils.isEmpty(cert_no)) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg("请填写社会信用统一代码");
+			return rtnAjax;
+		}
+		
+		if (StringUtils.isEmpty(payerPartyType)) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg("请选择交款人类型");
+			return rtnAjax;
+		}
+
+		if (null == billnos || billnos.length == 0) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg("请选择订单信息");
+			return rtnAjax;
+		}
+		
+		// 1分钟内不允许再次申请
+		String error = this.isSysOperateFail(stdRegInfo.getId()+"", "invoicing", 1);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+		
+
+		String result = this.payInvoicingService.invoicing(stdRegInfo, billnos, std_name, cert_no, payerPartyType);
+		
+		// 记录申请次数
+		this.setSysOperateFail(stdRegInfo.getId()+"", "invoicing", 1, 1, "请1分钟之后再重新申请!");
+					
+		if (null != result) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg(result);
+			return rtnAjax;
+		}
+
+		return rtnAjax;
+	}
+
+	@RequestMapping("pay/payInvoicing/checkDownInvoicing")
+	public Ajax checkDownInvoicing(Integer std_id, String bill_no) {
+		Ajax ajax = new Ajax();
+
+		if (null == bill_no) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("订单编号为空。");
+			return ajax;
+		}
+
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (null == stdRegInfo) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请重新登录。");
+			return ajax;
+		}
+
+		if (stdRegInfo != null & !stdRegInfo.getId().equals(std_id)) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			return ajax;
+		}
+
+		PayInvoicing payInvoicing = this.payInvoicingService.find(bill_no);
+
+		if (null == payInvoicing) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("订单号对应的发票申请单为空。");
+			return ajax;
+		}
+
+		if (!"受理完成".equals(payInvoicing.getStatus())) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("发票申请单未受理完成。");
+			return ajax;
+		}
+
+		if (null == payInvoicing.getPath()) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("电子发票路径为空。");
+			return ajax;
+		}
+
+		// 根据订单号查询报考信息
+		List<PayInvoicing> list = this.payInvoicingService.queryStdEnrolByNo(bill_no);
+		if (null != list && !list.isEmpty()) {
+			PayInvoicing pay = list.get(0);
+			if (null != pay && !stdRegInfo.getId().equals(pay.getStd_reg_id())) {
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("订单号" + bill_no + "不是当前登录账号的订单,无法下载电子发票。");
+				return ajax;
+
+			}
+		}
+		
+		String savePath = SysConst.getAppConfig().getUploadBase() + "invoicing/";
+		
+		File tempFile = new File(savePath + payInvoicing.getPath());
+
+		// 本地已经下载电子发票
+		if (tempFile.exists()) {
+			int file_size = (int) tempFile.length();
+			// 文件大小小于20k,说明文件坏了,重新去服务器下载
+			if (file_size <= 20000) {
+				// 电子发票URL路径
+				String path = SysConst.getAppConfig().getInvoicing_viewPath() + payInvoicing.getPath();
+
+				// 到远程服务器下载电子发票
+				tempFile = this.payInvoicingService.downLoadFromUrl(path, payInvoicing.getPath(), savePath);
+				if (tempFile.exists()) {
+					file_size = (int) tempFile.length();
+					// 文件大小小于20k,说明文件坏了,
+					if (file_size <= 20000) {
+						ajax.setSuccess(false);
+						ajax.setErrorMsg("电子发票下载失败,请联系系统管理员。(如开票未超过24小时,电子发票正在开票中,请稍后再试。)");
+						return ajax;
+					}
+					
+				} else {
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("电子发票下载失败,请联系系统管理员。");
+					return ajax;
+				}
+			}
+
+		} else {
+			// 电子发票URL路径
+			String path = SysConst.getAppConfig().getInvoicing_viewPath() + payInvoicing.getPath();
+
+			// 到远程服务器下载电子发票
+			tempFile = this.payInvoicingService.downLoadFromUrl(path, payInvoicing.getPath(), savePath);
+			if (tempFile.exists()) {
+				int file_size = (int) tempFile.length();
+				// 文件大小小于20k,说明文件坏了,
+				if (file_size <= 20000) {
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("电子发票下载失败,请联系系统管理员。(如开票未超过24小时,电子发票正在开票中,请稍后再试。)");
+					return ajax;
+				}
+				
+			} else {
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("电子发票下载失败,请联系系统管理员。");
+				return ajax;
+			}
+		}
+		
+
+		return ajax;
+	}
+
+	@RequestMapping("pay/payInvoicing/downInvoicing")
+	public void downInvoicing(Integer std_id, String bill_no) {
+		if (null == bill_no) {
+			throw new BusinessException("订单编号为空。");
+		}
+
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (null == stdRegInfo) {
+			throw new BusinessException("请重新登录。");
+		}
+
+		if (stdRegInfo != null & !stdRegInfo.getId().equals(std_id)) {
+			throw new BusinessException("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+		}
+
+		PayInvoicing payInvoicing = this.payInvoicingService.find(bill_no);
+
+		if (null == payInvoicing) {
+			throw new BusinessException("订单号对应的发票申请单为空。");
+		}
+
+		if (!"受理完成".equals(payInvoicing.getStatus())) {
+			throw new BusinessException("发票申请单未受理完成。");
+		}
+
+		if (null == payInvoicing.getPath()) {
+			throw new BusinessException("电子发票路径为空。");
+		}
+
+		// 根据订单号查询报考信息
+		List<PayInvoicing> list = this.payInvoicingService.queryStdEnrolByNo(bill_no);
+		if (null != list && !list.isEmpty()) {
+			PayInvoicing pay = list.get(0);
+			if (null != pay && !stdRegInfo.getId().equals(pay.getStd_reg_id())) {
+				throw new BusinessException("订单号" + bill_no + "不是当前登录账号的订单,无法下载电子发票。");
+			}
+		}
+
+		String savePath = SysConst.getAppConfig().getUploadBase() + "invoicing/";
+		
+		File tempFile = new File(savePath + payInvoicing.getPath());
+
+		// 本地已经下载电子发票
+		if (tempFile.exists()) {
+			int file_size = (int) tempFile.length();
+			// 文件大小小于20k,说明文件坏了,重新去服务器下载
+			if (file_size <= 20000) {
+				// 电子发票URL路径
+				String path = SysConst.getAppConfig().getInvoicing_viewPath() + payInvoicing.getPath();
+
+				// 到远程服务器下载电子发票
+				tempFile = this.payInvoicingService.downLoadFromUrl(path, payInvoicing.getPath(), savePath);
+				if (tempFile.exists()) {
+					file_size = (int) tempFile.length();
+					// 文件大小小于20k,说明文件坏了,
+					if (file_size <= 20000) {
+						throw new BusinessException("电子发票下载失败,请联系系统管理员。(如开票未超过24小时,电子发票正在开票中,请稍后再试)");
+					}
+					
+					this.downloadFile(tempFile, "", false);
+				} else {
+					throw new BusinessException("电子发票下载失败,请联系系统管理员");
+				}
+			} else {
+				// 本地电子发票正常,直接下载
+				this.downloadFile(tempFile, "", false);
+			}
+
+		} else {
+			// 电子发票URL路径
+			String path = SysConst.getAppConfig().getInvoicing_viewPath() + payInvoicing.getPath();
+
+			// 到远程服务器下载电子发票
+			tempFile = this.payInvoicingService.downLoadFromUrl(path, payInvoicing.getPath(), savePath);
+			if (tempFile.exists()) {
+				int file_size = (int) tempFile.length();
+				// 文件大小小于20k,说明文件坏了,
+				if (file_size <= 20000) {
+					throw new BusinessException("电子发票下载失败,请联系系统管理员。(如开票未超过24小时,电子发票正在开票中,请稍后再试)");
+				}
+				
+				this.downloadFile(tempFile, "", false);
+			} else {
+				throw new BusinessException("电子发票下载失败,请联系系统管理员。");
+			}
+		}
+	}
+	
+	private String isSysOperateFail(String account,String operate_type,Integer second){
+		SysOperateFail fail = this.sysOperateFailService.querySysOperateFailByAccount(account, operate_type, second);
+		if(null != fail){
+			if(fail.getFail_count()>=fail.getMax_count()){
+				return fail.getFail_remark();
+			}
+		}
+		
+		return null;
+	}
+	
+	private void setSysOperateFail(String account,String operate_type,Integer max_count,Integer second,String fail_remark){
+		SysOperateFail fail = this.sysOperateFailService.querySysOperateFailByAccount(account, operate_type, second);
+		if(null == fail){
+			fail = new SysOperateFail();
+			fail.setAccount(account);
+			fail.setFail_count(1);
+			fail.setMax_count(max_count);
+			fail.setFail_remark(fail_remark);
+			fail.setOperate_type(operate_type);
+			
+			this.sysOperateFailService.insert(fail);
+		}else{
+			fail.setFail_count(fail.getFail_count()+1);
+			
+			LocalDateTime now = this.sysOperateFailService.getDataBaseTime().getOperate_time();
+			fail.setOperate_time(now);
+			
+			this.sysOperateFailService.edit(fail);
+		}
+	}
+
+}

+ 62 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/pay/PayNoticeUnionControl.java

@@ -0,0 +1,62 @@
+package cn.hmsoft.ses.control.pay;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.data.model.pay.PayNoticeUnion;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.service.iface.pay.IPayNoticeUnionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *  控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-02-24 14:43:03
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class PayNoticeUnionControl extends AjaxControl {
+
+    @Autowired
+    private IPayNoticeUnionService payNoticeUnionService;
+	
+    @RequestMapping("pay/payNoticeUnion/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.payNoticeUnionService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    //@RequestMapping("pay/payNoticeUnion/add")
+    public Ajax add(PayNoticeUnion payNoticeUnion) {
+        this.payNoticeUnionService.insert(payNoticeUnion);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("pay/payNoticeUnion/edit")
+    public Ajax edit(PayNoticeUnion payNoticeUnion) {
+        this.payNoticeUnionService.edit(payNoticeUnion);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("pay/payNoticeUnion/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.payNoticeUnionService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("pay/payNoticeUnion/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.payNoticeUnionService.find(id));
+    }    
+}

+ 73 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/pl/PlCountryMajorControl.java

@@ -0,0 +1,73 @@
+package cn.hmsoft.ses.control.pl;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.data.model.pl.PlCountryMajor;
+import cn.hmsoft.ses.service.iface.pl.IPlCountryMajorService;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 国家平台的专业数据 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-10-21 15:49:12
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class PlCountryMajorControl extends AjaxControl {
+
+    @Autowired
+    private IPlCountryMajorService plCountryMajorService;
+	
+    @RequestMapping("pl/plCountryMajor/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.plCountryMajorService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    //@RequestMapping("pl/plCountryMajor/add")
+    public Ajax add(PlCountryMajor plCountryMajor) {
+        this.plCountryMajorService.insert(plCountryMajor);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("pl/plCountryMajor/edit")
+    public Ajax edit(PlCountryMajor plCountryMajor) {
+        this.plCountryMajorService.edit(plCountryMajor);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("pl/plCountryMajor/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.plCountryMajorService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("pl/plCountryMajor/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.plCountryMajorService.find(id));
+    }   
+    
+    
+    /**
+     * @param is_new_major:是否新专业
+     * @return 查询国家专业列表
+     */
+    @RequestMapping("pl/plCountryMajor/list")
+    public Ajax list(Integer is_new_major) {
+    	is_new_major = (StringHelper.isEmpty(is_new_major) ? 1 : is_new_major);
+        return new Ajax(this.plCountryMajorService.listCountryMajor(is_new_major));
+    }  
+}

+ 65 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/pl/PlExamAreaCourseControl.java

@@ -0,0 +1,65 @@
+package cn.hmsoft.ses.control.pl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.ses.data.model.pl.PlExamAreaCourse;
+import cn.hmsoft.ses.service.iface.pl.IPlExamAreaCourseService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ * 课程考区关系对应表 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2018-12-10 15:54:10
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class PlExamAreaCourseControl extends AjaxControl {
+
+	@Autowired
+	private IPlExamAreaCourseService plExamAreaCourseService;
+
+
+	/**
+	 * @param course_id:课程ID
+	 * @param exam_time_id:考试时间ID:可为空,为空,取当前的时间
+	 * 根据课程ID,查询考区列表
+	 * 考区列表如果为空,则试用于全部考区
+	 */
+	@RequestMapping("pl/plExamAreaCourse/list")
+	public Ajax list(Integer course_id, Integer exam_time_id) {
+		List<PlExamAreaCourse> list = this.plExamAreaCourseService.listExamArea(course_id, exam_time_id);
+		return new Ajax(list);
+	}
+
+
+	//@RequestMapping("pl/plExamAreaCourse/edit")
+	public Ajax edit(PlExamAreaCourse plExamAreaCourse) {
+		this.plExamAreaCourseService.edit(plExamAreaCourse);
+		return new Ajax();
+	}
+
+	/**
+	 * @param ids:课程考区指定ID集合
+	 * 删除课程考区指定
+	 */
+	//@RequestMapping("pl/plExamAreaCourse/delete")
+	public Ajax delete(Integer[] ids) {
+		for (Integer id : ids) {
+			this.plExamAreaCourseService.delete(id);
+		}
+		return new Ajax();
+	}
+
+	@RequestMapping("pl/plExamAreaCourse/get")
+	public Ajax get(Integer id) {
+		return new Ajax(this.plExamAreaCourseService.find(id));
+	}
+}

+ 132 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/pl/PlExamTimeControl.java

@@ -0,0 +1,132 @@
+package cn.hmsoft.ses.control.pl;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.helper.DateHelper;
+import cn.hmsoft.ses.data.model.pl.ExamDate;
+import cn.hmsoft.ses.data.model.pl.PlExamTime;
+import cn.hmsoft.ses.helper.YearCodeHelper;
+import cn.hmsoft.ses.service.iface.pl.IPlExamTimeService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ * 考试时间设置表 参照湖北考试三天 控制器.
+ * 
+ * @author: yangwei
+ * @date: 2018-10-17 13:47:57
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class PlExamTimeControl extends AjaxControl {
+
+    @Autowired
+    private IPlExamTimeService plExamTimeService;
+    
+    /**
+     * 查询具体考试时间ID对应的具体考试日期列表.
+     * @param exam_time_id
+     * @return
+     */
+    @RequestMapping("pl/plExamTime/getdatelist")
+    public Ajax getExamDateList(Integer exam_time_id) {
+    	final List<ExamDate> dateList = new ArrayList<ExamDate>();
+    	final PlExamTime examTime = this.plExamTimeService.find(exam_time_id);
+    	if (examTime != null) {
+    		if (examTime.getExam_first_day() != null) {
+    			dateList.add(new ExamDate("FIRSTDAY", DateHelper.format(examTime.getExam_first_day())));
+    		}
+    		if (examTime.getExam_second_day() != null) {
+    			dateList.add(new ExamDate("SECONDDAY", DateHelper.format(examTime.getExam_second_day())));
+    		}
+    		if (examTime.getExam_third_day() != null) {
+    			dateList.add(new ExamDate("THIRDDAY", DateHelper.format(examTime.getExam_third_day())));
+    		}
+    	}
+    	return new Ajax(dateList);
+    }
+    
+    /**
+     * 考试时间-yyyy年-MM月
+     */
+    @RequestMapping("pl/plExamTime/listtime")
+    public Ajax listPlExamTime() {
+    	List<PlExamTime> list = this.plExamTimeService.listPlExamTime();
+    	if(null != list && !list.isEmpty()){
+    		String year_code = YearCodeHelper.getCurrentYearCode();
+    		for(PlExamTime time:list){
+    			if(year_code.equals(String.valueOf(time.getYear_code()))){
+    				time.setCurrentYearCode(true);
+    				break;
+    			}
+    		}
+    		
+    	}
+    	
+    	return new Ajax(list);
+    }
+    
+    
+    /**
+     * @return 返回格式:yyyyMM
+     */
+    @RequestMapping("pl/plExamTime/list")
+    public Ajax listExamTime() {
+    	return new Ajax( this.plExamTimeService.listExamTime());
+    }
+    
+    
+    
+   // @RequestMapping("pl/plExamTime/add")
+    public Ajax addPlExamTime(final PlExamTime plExamTime) {
+    	Map<String, Object> map = new HashMap<String, Object>();
+    	map.put("exam_year", plExamTime.getExam_year());
+    	map.put("exam_month", plExamTime.getExam_month());
+    	List<PlExamTime> existList = this.plExamTimeService.listByMap(map);
+    	FrameAssertUtil.isEmpty(existList, "考试时间" + plExamTime.getExam_year() + "年" + plExamTime.getExam_month() + "月已经存在!");
+        this.plExamTimeService.insert(plExamTime);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("pl/plExamTime/edit")
+    public Ajax editPlExamTime(final PlExamTime plExamTime) {
+        this.plExamTimeService.edit(plExamTime);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("pl/plExamTime/delete")
+    public Ajax deletePlExamTime(final Integer id) {
+        this.plExamTimeService.delete(id);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("pl/plExamTime/deleteBatch")
+    public Ajax deletePlExamTime(final Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.plExamTimeService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("pl/plExamTime/get")
+    public Ajax getPlExamTimeById(final Integer id) {
+        return new Ajax(this.plExamTimeService.find(id));
+    }    
+    
+    
+    @RequestMapping("pl/plExamTime/getCurrentYearCode")
+    public Ajax getCurrentYearCode(final Integer id) {
+        return new Ajax(YearCodeHelper.getCurrentYearCode());
+    }  
+    
+}

+ 180 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/pl/PlMajorControl.java

@@ -0,0 +1,180 @@
+package cn.hmsoft.ses.control.pl;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.data.model.pl.PlCourse;
+import cn.hmsoft.ses.data.model.pl.PlMajor;
+import cn.hmsoft.ses.data.model.pl.PlMajorCourse;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.service.iface.pl.IPlCourseService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorCourseService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ * 专业信息表控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2018-10-16 15:40:22
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class PlMajorControl extends AjaxControl{
+
+	@Autowired
+	private IPlMajorService plMajorService;
+	
+	@Autowired
+	private IPlCourseService plCourseService;
+	
+	@Autowired
+    private IPlMajorCourseService plMajorCourseService;
+	
+
+
+	/**
+	 * @param major_level: 专业层次
+	 * @param nation_exam :是否统考
+	 * 分页查询所有的专业信息
+	 */
+	@RequestMapping("pl/plMajor/page")
+	public Ajax pagePlMajor(String query, Integer limit, Integer start, String order, String type, Integer major_level,
+			Integer nation_exam) {
+		if (StringHelper.isEmpty(order)) {
+			order = "create_time";
+		}
+		if(StringHelper.isEmpty(type)) {
+			type = "DESC";
+		}
+		return new Ajax(this.plMajorService.pagePlMajor(query, start, limit, order, type,major_level,nation_exam));
+	}
+
+
+	/**
+	 * @param plMajor:专业ID为必传项
+	 *  修改专业,包括停办证时间
+	 */
+	//@RequestMapping("pl/plMajor/edit")
+	public Ajax editPlMajor(PlMajor plMajor) {
+		plMajor.setCreate_time(LocalDateTime.now());
+		this.plMajorService.edit(plMajor);
+		return new Ajax();
+	}
+
+	/**
+	 * @param ids
+	 * 	批量删除专业接口--预留接口,专业新增后,不允许在删除
+	 */
+	//@RequestMapping("pl/plMajor/delete")
+	public Ajax deletePlMajor(Integer[] ids) {
+		for (Integer id : ids) {
+			this.plMajorService.delete(id);
+		}
+		return new Ajax();
+	}
+	
+	
+	/**
+	 * @param id:专业ID
+	 * 根据专业查询专业关联的课程和教材
+	 */
+	@RequestMapping("pl/plMajor/find")
+	public Ajax findCouseByMajor(Integer id) {
+		Map<String,Object> map = new HashMap<String,Object>();
+		map.put("major", this.plMajorService.findMajor(id));
+		map.put("courseList", this.plMajorService.findCourseAndBook(id));
+		return new Ajax(map);
+	}
+	
+	/**
+	 * @param ids:专业ID数组
+	 * 根据专业ID下载专业相关的课程教材,提供打印
+	 * 可以根据ids来选择只打印某些某些专业下的课程教材
+	 */
+	@RequestMapping("pl/plMajor/download")
+	public void downloadMajorCouse(String[] ids) {
+		try {
+			String fileName = "专业课程.pdf";
+			this.downloadFile(this.plMajorService.makeCourseBook(ids), fileName,true);
+		}catch(Exception e){
+			this.writeAlert(e.getMessage());
+		}
+	}
+	
+	/**
+	 * @param ids:需要排除的专业ID集合,以逗号分隔
+	 * 返回专业列表
+	 */
+	@RequestMapping("pl/plMajor/list")
+	public Ajax listMajor(String ids) {
+		List<PlMajor> majorList = this.plMajorService.listMajor(ids);
+		return new Ajax(majorList);
+	}
+	
+	@RequestMapping("pl/plMajor/listMajorCourse")
+	public Ajax listMajorCourse(Integer major_id) {
+		List<PlMajorCourse> majorList = this.plMajorCourseService.listMajorCourse(major_id);
+		return new Ajax(majorList);
+	}
+	
+	/**专业查询 -专业列表
+	 * @param major_level
+	 * @return
+	 */
+	@RequestMapping("pl/plMajor/listByMajorLevel")
+	public Ajax listByMajorLevel(Integer major_level ,Integer is_new_major) {
+		HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		paraMap.put("status", 1);
+		if (major_level != null) {
+			paraMap.put("major_level", major_level);
+		}
+		
+		if(is_new_major != null){
+			paraMap.put("is_new_major", is_new_major);
+		}
+		
+		List<PlMajor> majorList = this.plMajorService.listByMap(paraMap);
+		return new Ajax(majorList);
+	}
+	
+	
+	/***专业查询 -查询专业课程
+	 * @param major_id
+	 * @return
+	 */
+	@RequestMapping("pl/plMajor/listCourseByMajor")
+	public Ajax listCourseByMajor(Integer major_id) {
+		return new Ajax(this.plMajorCourseService.listMajorFullCourse(major_id));
+	}
+	
+	
+	
+	
+	/**
+	 * 查询考生报考的专业列表
+	 */
+	@RequestMapping("pl/plMajor/stdMajor")
+	public Ajax stuMajor() {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		List<PlMajor> list = this.plMajorService.listStdMajor(std.getId());
+		return new Ajax(list);
+	}
+	
+	@RequestMapping("pl/plMajor/get")
+	public Ajax get(Integer major_id) {
+		return new Ajax(this.plMajorService.find(major_id));
+	}
+
+}

+ 53 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/pl/PlMajorCourseControl.java

@@ -0,0 +1,53 @@
+package cn.hmsoft.ses.control.pl;
+
+import cn.hmsoft.ses.service.iface.pl.IPlCourseService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorCourseService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 专业课程对应表 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2018-10-17 10:03:45
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class PlMajorCourseControl extends AjaxControl{
+
+    @Autowired
+    private IPlMajorCourseService plMajorCourseService;
+
+    @Autowired
+    private IPlCourseService plCourseService;
+
+     
+    
+    /**
+     * @param major_id:专业ID
+     * @param content: 要查询的内容
+     * 根据专业查找课程和教材信息
+     */
+    @RequestMapping("pl/plMajorCourse/textBookListByCourse")
+    public Ajax textBookListByCourse(Integer course_id) {
+        return new Ajax(this.plMajorCourseService.listCourseTextbook(course_id));
+    }
+
+    @RequestMapping("pl/plMajorCourse/CourseList")
+    public Ajax pagePlCourse(String query) {
+        return new Ajax(this.plCourseService.listCourse(query));
+    }
+    
+
+    
+    @RequestMapping("pl/plMajorCourse/get")
+    public Ajax getPlMajorCourseById(final Integer id) {
+        return new Ajax(this.plMajorCourseService.find(id));
+    } 
+    
+}

+ 191 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/service/InterfaceControl.java

@@ -0,0 +1,191 @@
+package cn.hmsoft.ses.control.service;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import cn.hmsoft.frame.exception.AppException;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.helper.JsonHelper;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.service.iface.std.IStdRegInfoService;
+import cn.hmsoft.web.entity.Ajax;
+
+@RestController
+public class InterfaceControl {
+	private static Map<String, String> IgnorErrorMap = new HashMap<String, String>();
+	
+	@Autowired
+    private IStdRegInfoService stdRegInfoService;
+	
+	private static HashMap<String,StdRegInfo> CACHE_STD_MAP = new HashMap<String,StdRegInfo>();
+	
+	private static ConcurrentHashMap<String,Date> CACHE_LOGIN_TIME_MAP = new ConcurrentHashMap<String,Date>();
+	
+	private static int sessionTimeOut = 20 * 60 * 1000;
+	
+	private static boolean thread_is_running = false;
+	
+	private static void startThread(){
+		Thread thread = new Thread() {
+			public void run() {
+				while(true){
+					try {
+						sleep(60 * 1000);
+						System.out.println("thread run:"+ new Date().getTime());
+						for (String key : CACHE_LOGIN_TIME_MAP.keySet()) {
+							Date loginDate = CACHE_LOGIN_TIME_MAP.get(key);
+							long nowTime = new Date().getTime();
+							long loginTime = loginDate.getTime();
+							long internalTime = nowTime - loginTime;
+							if (internalTime >= sessionTimeOut) {
+								CACHE_LOGIN_TIME_MAP.remove(key);
+								CACHE_STD_MAP.remove(key);
+							} 
+						}
+					} catch (InterruptedException e) {
+						e.printStackTrace();
+					}
+				}
+			}
+		};
+		thread.start();
+	}
+
+//	@RequestMapping("ifaceService/login")
+    public Ajax login(StdRegInfo stdRegInfo) {
+    	System.out.println("thread_is_running:"+thread_is_running);
+    	if (!thread_is_running) {
+			startThread();
+			thread_is_running = true;
+			System.out.println("thread_is_running:"+thread_is_running);
+		}
+    	StdRegInfo dbStdRegInfo = this.stdRegInfoService.findStdByCertNo(stdRegInfo.getCert_no());
+    	System.out.println("证件号:"+stdRegInfo.getCert_no());
+    	FrameAssertUtil.isNotNull(dbStdRegInfo, "登录失败,证件号错误!");
+    	String token = UUID.randomUUID().toString().replaceAll("-", "");
+    	
+    	CACHE_STD_MAP.put(token, dbStdRegInfo);
+    	CACHE_LOGIN_TIME_MAP.put(token, new Date());
+    	
+    	HashMap<String, Object> rtnMap = new HashMap<String, Object>();
+		rtnMap.put("token", token);
+		rtnMap.put("stdInfo", dbStdRegInfo);
+    	return new Ajax(rtnMap);
+    }
+
+	protected StdRegInfo checkStdInfo(String token) {
+		FrameAssertUtil.isNotNull(token, "登录超时,请重新登录!");
+		StdRegInfo std = CACHE_STD_MAP.get(token);
+		FrameAssertUtil.isNotNull(std, "登录超时,请重新登录!");
+		return std;
+	}
+	
+	@ExceptionHandler(value = { Exception.class })
+	public void handle(HttpServletResponse response, Exception ex) {
+		String error_name = ex.getClass().getName();
+		Ajax ajax = null;
+		if (ex instanceof AppException)
+			ajax = new Ajax((AppException) ex);
+		else
+			ajax = new Ajax();
+
+		// Ajax请求失败
+		ajax.setSuccess(false);
+		//ex.printStackTrace();
+		if (error_name.equals("org.springframework.web.bind.MissingServletRequestParameterException") || error_name.equals("java.lang.IllegalStateException") ) {
+			// mvc提交时候参数错误
+			ajax.setErrorMsg("提交参数缺失,请联系系统管理员");
+		} else if (error_name.equals("org.springframework.web.method.annotation.MethodArgumentTypeMismatchException")) {
+			ajax.setErrorMsg("提交参数格式错误,请联系系统管理员");
+
+		} else if (error_name.equalsIgnoreCase("org.springframework.validation.BindException")) {
+			ajax.setErrorMsg("提交参数格式错误,请联系系统管理员");
+		} else if (IgnorErrorMap.containsKey(error_name)) {
+			//
+			return;
+		} else if (error_name.equals("cn.hmsoft.frame.exception.auth.LoginAuthException") || error_name.equals("cn.hmsoft.frame.exception.web.LoginTimeoutException")) {
+			// 错误类型
+			ajax.setLogin(false);
+		} else if (error_name.contains("cn.hmsoft.jdbc.exception")) {
+			//JdbcException j = (JdbcException)ex;
+			//LogHelper.error(j.getMessage());
+			ajax.setErrorMsg("数据库操作出现错误,请联系系统管理员");
+			// jdbc错误,如果不是调试期间,显示统一错误
+			LogHelper.error(ex);
+		} else if (error_name.contains("cn.hmsoft.")) {
+			// ex.printStackTrace();
+		} else if (error_name.equals("Exception")) {
+			LogHelper.error(ex);
+		} else {
+			LogHelper.error(ex);
+		}
+		if (StringHelper.isEmpty(ajax.getErrorMsg()))
+			ajax.setErrorMsg("出现系统错误,请联系系统管理员");
+		writeJson(JsonHelper.fromObject(ajax));
+	}
+	
+	
+	/************************************************
+	 * 直接输出text字符串
+	 */
+	protected void writeText(String message) {
+		HttpServletResponse response = this.getResponse();
+		try {
+			response.setHeader("Content-type", "text/html;charset=utf-8");
+			response.getOutputStream().write(message.getBytes("utf-8"));
+			response.getOutputStream().flush();
+			response.getOutputStream().close();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/************************************************
+	 * 直接输出JSON字符串
+	 */
+	protected void writeJson(String message) {
+		HttpServletResponse response = this.getResponse();
+		try {
+			response.setHeader("Content-type", "text/json;charset=utf-8");
+			response.getOutputStream().write(message.getBytes("utf-8"));
+			response.getOutputStream().flush();
+			response.getOutputStream().close();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	protected void writeAlert(String msg) {
+		String value = "<script>alert('" + msg + "');window.close();window.history.back();</script>";
+		writeText(value);
+	}
+	
+	/*******************
+	 * 获取Request(单例)
+	 */
+	protected HttpServletRequest getRequest() {
+		return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+	}
+
+	/*******************
+	 * 获取Response(单例)
+	 */
+	protected HttpServletResponse getResponse() {
+		return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+	}
+
+}

+ 145 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdAppFeedbackControl.java

@@ -0,0 +1,145 @@
+package cn.hmsoft.ses.control.std;
+
+import cn.hmsoft.frame.constants.FrameParamConstants;
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.service.IFrameParamService;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.model.std.StdAppFeedback;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.service.iface.std.IStdAppFeedbackService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ *  控制器.
+ * 
+ * @author: shudonghui
+ * @date: 2021-09-29 15:19:48
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdAppFeedbackControl extends AjaxControl {
+
+    @Autowired
+    private IStdAppFeedbackService stdAppFeedbackService;
+    @Autowired
+    private IFrameParamService frameParamService;
+
+    @RequestMapping("std/stdAppFeedback/list")
+    public Ajax list(String type) {
+        StdRegInfo login = (StdRegInfo)this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+        return new Ajax(this.stdAppFeedbackService.list(login.getId(),type));
+    }
+
+//    @RequestMapping("std/stdAppFeedback/page")
+//    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+//        if (StringHelper.isEmpty(order)) {
+//        	//TODO 修改为排序字段
+//        	order = "1";
+//        }
+//        return new Ajax(this.stdAppFeedbackService.page(query, start, limit, this.getQueryOrder(order, type)));
+//    }
+    
+    @RequestMapping("std/stdAppFeedback/add")
+    public Ajax add(StdAppFeedback stdAppFeedback) {
+        StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+        if (!StringUtils.isEmpty(stdAppFeedback.getStd_id()) && std != null &&!std.getId().equals(stdAppFeedback.getStd_id())) {
+            Ajax ajax = new Ajax();
+            ajax.setSuccess(false);
+            ajax.setErrorCode(246);
+            ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+            getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+            return ajax;
+        }
+        stdAppFeedback.setStd_id(std.getId());
+        Integer count=this.stdAppFeedbackService.val(stdAppFeedback);
+        
+        Integer max_count = 10;
+        String count_str = null;
+        
+        FrameParam param = this.frameParamService.find(FrameParam.class,"param_name", "feedback_max_count");
+        if(null != param && "Active".equals(param.getProtect_status())){
+    		count_str = param.getParam_value();
+    	}
+    	
+        if(null != count_str){
+        	max_count = Integer.valueOf(count_str);
+        }
+        
+        if (count>=max_count){
+            Ajax ajax = new Ajax();
+            ajax.setSuccess(false);
+            ajax.setErrorMsg("您本月内提交的咨询/投诉申请单过多,暂时无法再提交。");
+            return ajax;
+        }
+        this.stdAppFeedbackService.insert(stdAppFeedback);
+        return new Ajax();
+    }
+    
+//    @RequestMapping("std/stdAppFeedback/edit")
+//    public Ajax edit(StdAppFeedback stdAppFeedback) {
+//        this.stdAppFeedbackService.edit(stdAppFeedback);
+//        return new Ajax();
+//    }
+//
+//    @RequestMapping("std/stdAppFeedback/delete")
+//    public Ajax delete(Integer[] ids) {
+//    	for (Integer id : ids) {
+//    		this.stdAppFeedbackService.delete(id);
+//    	}
+//        return new Ajax();
+//    }
+    
+    @RequestMapping("std/stdAppFeedback/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.stdAppFeedbackService.find(id));
+    }
+
+    @RequestMapping("std/stdAppFeedback/upload")
+    public Ajax upload(MultipartFile file){
+        StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+        String filePath = uploadFile(std, std.getTicket_no(), file);
+        return new Ajax(filePath);
+    }
+
+    private String uploadFile(StdRegInfo std, String pro_code, MultipartFile file) {
+        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+        if (StringHelper.isNotEmpty(extension)) {
+            extension = extension.toLowerCase();
+        }
+
+        // 校验文件类型
+        if (!"jpg".equals(extension) && !"jpeg".equals(extension) && !"png".equals(extension)&& !"gif".equals(extension)&& !"bmp".equals(extension)) {
+            throw new BusinessException("上传图片必须是JPG/JPEG/PNG/格式!");
+        }
+
+        String cert_no = std.getCert_no();
+        String rootPath = SysConst.getAppConfig().getUploadBase();
+        String rtnName;
+        try {
+            new File(rootPath+SysConst.IMG_FEEDBACK_PREFIX).mkdir();
+            rtnName =SysConst.IMG_FEEDBACK_PREFIX+cert_no + "_"+ new Date().getTime() + "_"+ UUID.randomUUID() +"." + extension;
+            String fullFileName = rootPath + rtnName;
+            file.transferTo(new File(fullFileName));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new BusinessException("文件上传错误,请检查文件");
+        }
+        return rtnName;
+    }
+}

+ 73 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdBreakDisciplineControl.java

@@ -0,0 +1,73 @@
+package cn.hmsoft.ses.control.std;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.ses.data.model.std.StdBreakDiscipline;
+import cn.hmsoft.ses.service.iface.std.IStdBreakDisciplineService;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ * 违纪信息表 只是做记录,不做处罚。 控制器.
+ * 
+ * @author: yangwei
+ * @date: 2018-10-16 20:34:54
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdBreakDisciplineControl {
+
+    @Autowired
+    private IStdBreakDisciplineService stdBreakDisciplineService;
+	
+    @RequestMapping("std/stdBreakDiscipline/page")
+    public Ajax pageStdBreakDiscipline(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+//        	order = "1";
+        }
+        Pager pageStdBreakDiscipline = this.stdBreakDisciplineService.pageStdBreakDiscipline(query, start, limit, order, type);
+        return new Ajax(pageStdBreakDiscipline);
+    }
+    
+    //@RequestMapping("std/stdBreakDiscipline/add")
+    public Ajax addStdBreakDiscipline(final StdBreakDiscipline stdBreakDiscipline) {
+        this.stdBreakDisciplineService.insert(stdBreakDiscipline);
+        return new Ajax();
+    }
+    
+   // @RequestMapping("std/stdBreakDiscipline/edit")
+    public Ajax editStdBreakDiscipline(final StdBreakDiscipline stdBreakDiscipline) {
+        this.stdBreakDisciplineService.edit(stdBreakDiscipline);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("std/stdBreakDiscipline/delete")
+    public Ajax deleteStdBreakDiscipline(final Integer id) {
+        this.stdBreakDisciplineService.delete(id);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("std/stdBreakDiscipline/deleteBatch")
+    public Ajax deleteStdBreakDiscipline(final Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.stdBreakDisciplineService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("std/stdBreakDiscipline/get")
+    public Ajax getStdBreakDisciplineById(final Integer id) {
+        return new Ajax(this.stdBreakDisciplineService.find(id));
+    }
+    
+    @RequestMapping("std/stdBreakDiscipline/find")
+    public Ajax findStdBreakDiscipline(String ticket_no) {
+        return new Ajax(this.stdBreakDisciplineService.listBystd(ticket_no));
+    }
+}

+ 62 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdBreakDisciplineItemControl.java

@@ -0,0 +1,62 @@
+package cn.hmsoft.ses.control.std;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.data.model.std.StdBreakDisciplineItem;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.service.iface.std.IStdBreakDisciplineItemService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 违规考生违规事项表 控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-05-08 09:59:17
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdBreakDisciplineItemControl extends AjaxControl {
+
+    @Autowired
+    private IStdBreakDisciplineItemService stdBreakDisciplineItemService;
+	
+    @RequestMapping("std/stdBreakDisciplineItem/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.stdBreakDisciplineItemService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    //@RequestMapping("std/stdBreakDisciplineItem/add")
+    public Ajax add(StdBreakDisciplineItem stdBreakDisciplineItem) {
+        this.stdBreakDisciplineItemService.insert(stdBreakDisciplineItem);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("std/stdBreakDisciplineItem/edit")
+    public Ajax edit(StdBreakDisciplineItem stdBreakDisciplineItem) {
+        this.stdBreakDisciplineItemService.edit(stdBreakDisciplineItem);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("std/stdBreakDisciplineItem/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.stdBreakDisciplineItemService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("std/stdBreakDisciplineItem/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.stdBreakDisciplineItemService.find(id));
+    }    
+}

+ 62 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdBreakDisciplineRuleControl.java

@@ -0,0 +1,62 @@
+package cn.hmsoft.ses.control.std;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.data.model.std.StdBreakDisciplineRule;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.service.iface.std.IStdBreakDisciplineRuleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *  控制器.
+ * 
+ * @author: yangwei
+ * @date: 2019-05-08 09:59:17
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdBreakDisciplineRuleControl extends AjaxControl {
+
+    @Autowired
+    private IStdBreakDisciplineRuleService stdBreakDisciplineRuleService;
+	
+    @RequestMapping("std/stdBreakDisciplineRule/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.stdBreakDisciplineRuleService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    //@RequestMapping("std/stdBreakDisciplineRule/add")
+    public Ajax add(StdBreakDisciplineRule stdBreakDisciplineRule) {
+        this.stdBreakDisciplineRuleService.insert(stdBreakDisciplineRule);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("std/stdBreakDisciplineRule/edit")
+    public Ajax edit(StdBreakDisciplineRule stdBreakDisciplineRule) {
+        this.stdBreakDisciplineRuleService.edit(stdBreakDisciplineRule);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("std/stdBreakDisciplineRule/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.stdBreakDisciplineRuleService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("std/stdBreakDisciplineRule/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.stdBreakDisciplineRuleService.find(id));
+    }    
+}

+ 2070 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdEnrolControl.java

@@ -0,0 +1,2070 @@
+package cn.hmsoft.ses.control.std;
+
+import cn.hmsoft.frame.data.model.FrameDict;
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.helper.JsonHelper;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.pay.data.model.PayBill;
+import cn.hmsoft.pay.data.model.PayChannelInfo;
+import cn.hmsoft.pay.impl.weixin.WeiXinPayUtil;
+import cn.hmsoft.pay.util.PayUtil;
+import cn.hmsoft.ses.constants.CfConst;
+import cn.hmsoft.ses.constants.CfConst.CfOperateTimeType;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.StdConst;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.control.util.FrameIdCardUtil;
+import cn.hmsoft.ses.data.dao.pay.PayBillUnionDao;
+import cn.hmsoft.ses.data.dao.pl.PlExamTimeDao;
+import cn.hmsoft.ses.data.model.cf.CfOrganization;
+import cn.hmsoft.ses.data.model.pay.PayBillUnion;
+import cn.hmsoft.ses.data.model.pay.PayNoticeUnion;
+import cn.hmsoft.ses.data.model.pl.*;
+import cn.hmsoft.ses.data.model.std.StdEnrol;
+import cn.hmsoft.ses.data.model.std.StdMajor;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.data.model.sys.SysOperateFail;
+import cn.hmsoft.ses.data.model.sys.SysVerificationCode;
+import cn.hmsoft.ses.helper.YearCodeHelper;
+import cn.hmsoft.ses.msgque.Thread.SendEpayOrderThread;
+import cn.hmsoft.ses.msgque.model.dto.EpayCancelMsgDTO;
+import cn.hmsoft.ses.msgque.model.dto.EpayOrderInfoMsgDTO;
+import cn.hmsoft.ses.service.iface.cf.ICfOperateTimeService;
+import cn.hmsoft.ses.service.iface.cf.ICfOrganizationService;
+import cn.hmsoft.ses.service.iface.pay.IPayBillUnionService;
+import cn.hmsoft.ses.service.iface.pay.IPayNoticeUnionService;
+import cn.hmsoft.ses.service.iface.pl.*;
+import cn.hmsoft.ses.service.iface.std.IStdBreakDisciplineService;
+import cn.hmsoft.ses.service.iface.std.IStdEnrolService;
+import cn.hmsoft.ses.service.iface.std.IStdMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdRegInfoService;
+import cn.hmsoft.ses.service.iface.sys.ISysOperateFailService;
+import cn.hmsoft.ses.service.iface.sys.ISysVerificationCodeService;
+import cn.hmsoft.ses.util.HttpResult;
+import cn.hmsoft.ses.util.PatternUtil;
+import cn.hmsoft.ses.util.UnionPayUtil;
+import cn.hmsoft.ses.util.unionpay.NoticePayUnion;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+import com.xcwlkj.log.utils.XclogUtil;
+import org.apache.http.client.ClientProtocolException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * 考生报考信息 考生的所有报考信息。kw_baokaoxinxi 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2018-10-19 16:46:20
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdEnrolControl extends AjaxControl{
+
+    @Autowired
+    private IStdEnrolService stdEnrolService;
+    @Autowired
+    private IPlMergePublishPlanService publishPlanService;
+    @Autowired
+    private IPlCourseService courseService;
+
+    @Autowired
+    private ICfOperateTimeService timeService;
+    @Autowired
+    private IPayBillUnionService payBillUnionService;
+    @Autowired
+    private IPayNoticeUnionService payNoticeUnionService;
+    @Autowired
+    private IStdBreakDisciplineService breakService;
+    @Autowired
+    private IPlMajorCourseService mcService;
+    @Autowired
+    private IPlMajorService plMajorService;
+    @Autowired
+	private IStdMajorService stdMajorService;
+    
+    @Autowired
+	private IStdRegInfoService stdRegInfoService;
+    
+    @Autowired
+    private ICfOrganizationService cfOrganizationService;
+    
+    @Autowired
+	private PayBillUnionDao payBillUnionDao;
+    
+    @Autowired
+	private PlExamTimeDao plExamTimeDao;
+    
+    @Autowired
+	private ISysVerificationCodeService sysVerificationCodeService;
+    
+    @Autowired
+	private ISysOperateFailService sysOperateFailService;
+    
+	private final static String MERCHANT_ID ="12977";
+    /**
+     *  考生已经报考课程列表
+     */
+    @RequestMapping("std/stdEnrol/list")
+	public Ajax listStdEnrol() {
+    	Map<String,Object> map = new HashMap<String,Object>();
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		map.put("year", YearCodeHelper.getExamYear());
+		
+		String exam_year_month = null;
+		if("04".equals(YearCodeHelper.getExamMonth())){
+			exam_year_month = "上半年";
+		}else if("10".equals(YearCodeHelper.getExamMonth())){
+			exam_year_month = "下半年";
+		}else{
+			exam_year_month = YearCodeHelper.getExamMonth()+"月";
+		}
+		
+		map.put("month", exam_year_month);
+		map.put("timeControl",this.timeService.getOperateTime(CfOperateTimeType.PERSONAL_REG.ordinal(), null));
+		map.put("payControl",this.timeService.getOperateTime(CfOperateTimeType.enrolPay.ordinal(), null));
+		map.put("courseList", this.stdEnrolService.listEnrolCourse(std.getId()));
+		map.put("inTime", this.timeService.isInTime(CfOperateTimeType.PERSONAL_REG.ordinal(),null)); //是否在报考时间范围内
+		map.put("payTime", this.timeService.isInTime(CfOperateTimeType.enrolPay.ordinal(),null)); //是否在报考缴费时间范围内
+		map.put("ticketTimeControl",this.timeService.getOperateTime(CfOperateTimeType.ticketDownload.ordinal(), null));
+		map.put("inTicketTime", this.timeService.isInTime(CfOperateTimeType.ticketDownload.ordinal(),null)); //是否在准考证下载时间范围内
+		map.put("isOtherCity", this.stdEnrolService.queryIsOtherCity(std.getId())); //是否报考多地市
+		
+		
+        FrameParam loginParam = this.plExamTimeDao.find(FrameParam.class, "param_name", "ticket_promise_one");
+
+        // 广西壮族自治区高等教育自学考试防疫承诺书公告路径
+        if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+        	map.put("ticket_promise_one", loginParam.getParam_value());
+        } else {
+           
+            map.put("ticket_promise_one", "");
+        }
+        
+        loginParam = this.plExamTimeDao.find(FrameParam.class, "param_name", "ticket_promise_one_title");
+
+        if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+        	  map.put("ticket_promise_one_title", loginParam.getParam_value());
+        } else {
+           
+            map.put("ticket_promise_one_title", "广西高等教育自学考试防疫须知");
+        }
+        
+        loginParam = this.plExamTimeDao.find(FrameParam.class, "param_name", "ticket_promise_two");
+
+        // 广西壮族自治区高等教育自学考试防疫承诺书公告路径
+        if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+        	map.put("ticket_promise_two", loginParam.getParam_value());
+        } else {
+            
+            map.put("ticket_promise_two", "");
+        }
+        
+        
+		loginParam = this.plExamTimeDao.find(FrameParam.class, "param_name", "ticket_promise_two_title");
+
+		if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+			map.put("ticket_promise_two_title", loginParam.getParam_value());
+		} else {
+
+			map.put("ticket_promise_two_title", "考生个人健康管理承诺书");
+		}
+		
+		loginParam = this.plExamTimeDao.find(FrameParam.class, "param_name", "enrolControl");
+
+		if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+			map.put("enrolControl", loginParam.getParam_value());
+		} else {
+			map.put("enrolControl", "");
+		}
+		
+		loginParam = this.plExamTimeDao.find(FrameParam.class, "param_name", "ticketControl");
+
+		if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+			map.put("ticketControl", loginParam.getParam_value());
+		} else {
+			map.put("ticketControl", "");
+		}
+		
+		return new Ajax(map);
+	}
+    
+    
+    /**
+     * 报考课程选择:
+     * 包括:本专业下未报课程、非本专业其他课程
+     */
+    @RequestMapping("std/stdEnrol/detail")
+	public Ajax detailStdEnrol() {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("majorCouse", this.publishPlanService.listPublishCouse(std.getMajor_id(), 1));
+		map.put("otherCouse", this.publishPlanService.listPublishCouse(std.getMajor_id(), 2));
+		return new Ajax(map);
+	}
+    
+    /**
+     * @param course_id:课程ID
+     * 查询:课程考试信息和课程信息
+     */
+    @RequestMapping("std/stdEnrol/editDetail")
+	public Ajax editDetailStdEnrol(Integer course_id) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(std, "未登录");
+		Map<String, Object> map = new HashMap<String, Object>();
+		StdEnrol enrol = this.stdEnrolService.findEnrolCourseDate(std.getId(), course_id, YearCodeHelper.getCurrentYearCode());
+		if(enrol != null) {
+			PlMergePublishPlan plan = this.publishPlanService.getExamDate(enrol.getExam_batch());
+			map.put("examDate", this.getDateTime(plan != null ? plan.getFull_exam_date() : "")); // 考试日期
+			map.put("enrolArea", enrol.getEnrol_agent_id());//考区
+		}
+		map.put("courseInfo", this.courseService.find(course_id)); //课程信息
+		PlMajorCourse mCourse = this.mcService.findMajorCourse(std.getMajor_id(), course_id);
+		map.put("majorFlag", (mCourse == null ? 0 : 1)); //本专业 和非本专业标志(0:非本专业 1:本专业)
+		return new Ajax(map);
+	}
+    
+    
+    /** 查询专业下可考课程
+     * @param major_id
+     * @return
+     */
+    @RequestMapping("std/stdEnrol/queryCourseEnrolByMajor")
+	public Ajax queryCourseEnrolByMajor(Integer major_id,Integer exam_time_id) {
+    	PlMajor plMajor = this.plMajorService.find(major_id);
+    	if(null != plMajor && !StringUtils.isEmpty(plMajor.getStop_exam_time())){
+    		if (!StringUtils.isEmpty(exam_time_id)) {
+    			PlExamTime plExamTime = this.plExamTimeDao.find(exam_time_id);
+    			LocalDate yearCode_date = LocalDate.parse(plExamTime.getYear_code()+"30", DateTimeFormatter.ofPattern("yyyyMMdd"));
+    			
+    			LocalDate date = LocalDate.parse(plMajor.getStop_exam_time(), DateTimeFormatter.ofPattern("yyyyMMdd"));
+        		// 专业已经停考,则不展示
+        		if(yearCode_date.isAfter(date)){
+        			 throw new BusinessException("专业【"+plMajor.getMajor_code()+"-"+plMajor.getMajor_name()+"】已经停考,无法查询考试计划");
+        		}
+    		}
+    		
+    	}
+    	
+		return new Ajax(this.publishPlanService.listPublishCouse(major_id, exam_time_id,1));
+	}
+    
+    @RequestMapping("std/stdEnrol/existStdEnrolPayed")
+	public Ajax existStdEnrolPayed() {
+    	Ajax ajax = new Ajax();
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	boolean exist = this.stdEnrolService.existStdEnrolPayed(std.getId(),YearCodeHelper.getCurrentYearCode());
+    	if(!exist){
+    		ajax.setSuccess(false);
+    	}
+    	
+		return ajax;
+	}
+    
+    /**查询年度专业
+     * @return
+     */
+    @RequestMapping("std/stdEnrol/queryMajor")
+	public Ajax queryMajor() {
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	List<StdMajor> stdMajor = null;
+    	if(null != std){
+    		stdMajor = this.stdMajorService.listStdMajor(std.getId());
+        	
+        	for (StdMajor std_major : stdMajor) {
+        		std_major.setId(std_major.getMajor_id());
+    		}
+    	}else{
+    		stdMajor = new ArrayList<StdMajor>();
+    	}
+    	
+    	HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		//paraMap.put("is_allow_graduate", 1);
+		paraMap.put("status", 1);// 开考
+
+		List<PlMajor> majorList = this.plMajorService.listByMap(paraMap);
+		HashSet<Integer> majorId =  new HashSet<Integer>();
+		for (PlMajor plMajor : majorList) {
+			StdMajor newMjoar = new StdMajor();
+			newMjoar.setId(plMajor.getId());
+			newMjoar.setFull_name(plMajor.getMajor_code() + "-" + plMajor.getMajor_name());
+			if(majorId.add(plMajor.getId()))
+				stdMajor.add(newMjoar);
+		}
+		
+    	Map<String,Object> map = new HashMap<String,Object>();
+    	map.put("timeControl", this.timeService.getOperateTime(CfConst.CfOperateTimeType.eamxTimePlanQuery.ordinal(), null));
+    	map.put("majorList", stdMajor);
+    	map.put("year", YearCodeHelper.getExamYear());
+		map.put("month", YearCodeHelper.getExamMonth());
+		return new Ajax(map);
+	}    
+    /**
+     * 保存报考课程
+     */
+    @RequestMapping("std/stdEnrol/add")
+	public Ajax addStdEnrol(Integer[] courseIds, Integer[] examIds,Integer std_id,String paytype) {
+    	
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(std, "未登录,请登录系统");
+		
+		if (null != std_id && std.getId().intValue() != std_id.intValue()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+		
+		if (StringUtils.isEmpty(std.getCert_no())) {
+			 throw new BusinessException("证件号不能为空,请完善证件信息再报考(自助完善或到各市考办办理)!");
+		}
+		
+		// 20220106 身份证号15位不允许报考,必须现场升位以后才允许报考 by huangzibo 确认:蓝剑
+		if (null != std.getCert_no() && std.getCert_no().length() == 15) {
+			 throw new BusinessException("身份证号是15位,请到达各市考办进行身份证升位后再报考!");
+		}
+		
+		if (std.getCert_no().length() == 18 && !FrameIdCardUtil.validateIdCard18(std.getCert_no().trim())) {
+			throw new BusinessException("身份证[" + std.getCert_no() + "]不合法,请完善证件信息再报考(自助完善或到各市考办办理)!");
+		}
+		
+		if (StringUtils.isEmpty(std.getStd_name())) {
+			throw new BusinessException("姓名不能为空,请完善姓名再报考(自助完善或到各市考办办理)!");
+		} else {
+			if (!PatternUtil.checkStdName(std.getStd_name().trim())) {
+				throw new BusinessException("姓名不是合法的中文姓名,请完善姓名再报考(自助完善或到各市考办办理)!");
+			}
+		}
+		
+		//是否超过报考时间
+		 boolean inTime = this.timeService.isInTime(CfOperateTimeType.PERSONAL_REG.ordinal(),null);
+		 if(!inTime) {
+			 throw new BusinessException("不在报考时间范围内,不能报考!");
+		 }
+		//判断考生是否有违纪信息
+		boolean result = this.breakService.isBreakStd(std.getTicket_no());
+		if(result) {
+			throw new BusinessException("考生有违纪信息,本批次不允许报考!");
+		}
+		
+		// 查询授限制报考的课程
+		FrameParam param = this.plExamTimeDao.find(FrameParam.class, "param_name", "enrol_limit");
+		
+		for (Integer courseId : courseIds) {
+//			List<StdEnrol> list = this.stdEnrolService.listEnrolCourse(std.getId(), courseId,
+//					YearCodeHelper.getCurrentYearCode());
+//			if (list != null && list.size() > 0) {
+//				throw new BusinessException(
+//						courseService.find(list.get(0).getCourse_id()).getCourse_name() + ",课程已经报考,请不要重复报考");
+//			}
+			StdEnrol enrol = this.stdEnrolService.findEnrolCourse(std.getId(),courseId,YearCodeHelper.getCurrentYearCode());
+			if(enrol != null) {
+				String time = this.publishPlanService.findExamTime(courseId, YearCodeHelper.getCurrentYearCode());
+				throw new BusinessException(time+"已经报考了其他课程,可进入课程报考缴费查看。");
+			}
+			
+			// 202404批次(包括)以后注册的考生,指定课程不允许考生报考
+			if (null != std.getExam_time_id() && std.getExam_time_id().compareTo("351") >= 0) {
+				if (null != param && "Active".equals(param.getProtect_status())
+						&& param.getParam_value().indexOf(courseId + "") != -1) {
+					throw new BusinessException(param.getParam_desc());
+				}
+			}
+			
+		}
+		
+		//不能同时同一时间段内的课程
+		boolean timeFlag = this.stdEnrolService.isDifferentTime(courseIds);
+		if(timeFlag) {
+			throw new BusinessException("同一时间内选择了2门课程,请不要重复选择!");
+		}
+		//同一天,不可以跨市
+		boolean flag = this.stdEnrolService.isDifferentCity(std.getId(), courseIds, examIds);
+		if(!flag) {
+			throw new BusinessException("同一天考试,选择的考区需在一个市内");
+		}
+		
+		if (StringUtils.isEmpty(std.getTicket_no())) {
+			throw new BusinessException("准考证号为空,不允许报考。请完善个人信息并生成准考证号后再报考!");
+		}
+		
+		// 获取考生信息(可能缓存的数据不是最新的)
+		StdRegInfo dbStd = this.stdRegInfoService.find(std.getId());
+
+		// 考生信息不为空时,处理
+		if (null != dbStd) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStd);
+		}
+		
+		this.stdEnrolService.insertStdEnrol(dbStd, courseIds, examIds,paytype);
+		return new Ajax();
+	}
+    
+    @RequestMapping("std/stdEnrol/editCourse")
+	public Ajax editCourse(Integer enrol_id, Integer courseId, Integer examId,Integer std_id,Integer otherCity,String paytype) {
+    	if(enrol_id == null){
+    		throw new BusinessException("enrol_id 参数不能为空");
+    	}
+    	if(courseId == null){
+    		throw new BusinessException("courseId 参数不能为空");
+    	}
+    	if(examId == null){
+    		throw new BusinessException("examId 参数不能为空");
+    	}
+    	
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	FrameAssertUtil.isNotNull(std, "未登录,请登录系统");
+    	
+    	if (null != std_id && std.getId().intValue() != std_id.intValue()) {
+    		Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+    	
+    	boolean inTime = this.timeService.isInTime(CfOperateTimeType.PERSONAL_REG.ordinal(),null);
+    	if (!inTime) {
+			throw new BusinessException("不在报考允许时间范围内,无法操作");
+		}
+    	
+     
+    	//已经付费 验证费用是否一致
+    	StdEnrol dbEnrol = this.stdEnrolService.find(enrol_id);
+//    	if (dbEnrol.getStatus() >= StdConst.StdEnrolStatus.PAY_PASS.ordinal()) {
+    		PlCourse dbCourse = this.courseService.find(dbEnrol.getCourse_id());
+        	PlCourse newCourse = this.courseService.find(courseId);
+        	if (!dbCourse.getFee_code().equals(newCourse.getFee_code())) {
+        		throw new BusinessException("变更的课程与原课程费用不一致,无法变更,请取消报考后重新报考");
+    		}
+        	
+//		}
+        	
+    	// 校验报考对应的考生ID与会话考生ID一致
+    	if(!std.getId().equals(dbEnrol.getStd_reg_id())){
+    		Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("当前登录考生账号与报考课程对应考生不一致, 无法操作。");
+    		return ajax;
+    	}
+    	
+    	
+    	// 获取考生信息(可能缓存的数据不是最新的)
+		StdRegInfo dbStd = this.stdRegInfoService.find(std.getId());
+
+		// 考生信息不为空时,处理
+		if (null != dbStd) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStd);
+		}
+		
+		this.stdEnrolService.editCourse(enrol_id, courseId, examId, dbStd, dbEnrol, otherCity, paytype);
+		
+    	return new Ajax();
+    }
+    
+    /**
+     * 检查同一天是否有其他课程考试,且跨市
+     * @param enrol_id
+     * @param courseId
+     * @param examId
+     * @param std_id
+     * @return
+     */
+    @RequestMapping("std/stdEnrol/checkOtherCity")
+	public Ajax checkOtherCity(Integer enrol_id, Integer courseId, Integer examId, Integer std_id) {
+		if (enrol_id == null) {
+			throw new BusinessException("enrol_id 参数不能为空");
+		}
+		if (courseId == null) {
+			throw new BusinessException("courseId 参数不能为空");
+		}
+		if (examId == null) {
+			throw new BusinessException("examId 参数不能为空");
+		}
+
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		
+		StdEnrol dbEnrol = this.stdEnrolService.find(enrol_id);
+		String exam_batch = null;
+		// 获取同一天的其他报考课程
+		if ("A".equals(dbEnrol.getExam_batch())) {
+			exam_batch = "B";
+		} else if ("B".equals(dbEnrol.getExam_batch())) {
+			exam_batch = "A";
+		} else if ("C".equals(dbEnrol.getExam_batch())) {
+			exam_batch = "D";
+		} else if ("D".equals(dbEnrol.getExam_batch())) {
+			exam_batch = "C";
+		} else if ("X".equals(dbEnrol.getExam_batch())) {
+			exam_batch = "Y";
+		} else {
+			exam_batch = "X";
+		}
+
+		List<StdEnrol> enrolList = this.stdEnrolService.listEnrolByExamBatch(exam_batch, std.getId(),YearCodeHelper.getCurrentYearCode());
+		
+		// 存在同一天考试的其他课程,
+		if (null != enrolList && !enrolList.isEmpty()) {
+			// 同一天,不可以跨市
+			Integer courseIds[] = new Integer[1];
+			courseIds[0] = courseId;
+			Integer examIds[] = new Integer[1];
+			examIds[0] = examId;
+			boolean flag = this.stdEnrolService.isDifferentCityEdit(std.getId(), courseIds, examIds, courseId);
+			if (!flag) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(true);
+				ajax.setErrorCode(247);
+				return ajax;
+			}else{
+				// 同一天考试的其他课程,不跨市,
+				return new Ajax();
+			}
+		} else {
+			// 不存在同一天考试的其他课程,
+			return new Ajax();
+		}
+
+	}
+    
+    
+    
+    @RequestMapping("/std/stdEnrol/pay/check")
+	public Ajax check(int enrol_id) {
+		StdEnrol enrol = this.stdEnrolService.find(enrol_id);
+		return new Ajax(enrol);
+	}
+    
+    @RequestMapping("std/stdEnrol/pay/channel/list")
+	public Ajax listChannel() {
+//		String value = EnrolCacheHelper.instance().getAgentWithAgentId(this.getStdReg().getAgent_id())
+//				.getAgent_merchant_id();
+    	//Map<String, List<PayChannelInfo>> gobalPayChannelInfoMap = PayModuleConfig.GobalPayChannelInfoMap;
+		List<PayChannelInfo> list = PayUtil.listMerantChannel(this.MERCHANT_ID);
+		return new Ajax(list);
+	}
+    
+	/***************************************
+	 * 扫描微信二维码
+	 */
+	@RequestMapping("std/stdEnrol/pay/weixin/qrcode/image")
+	public void wxImage(int enrol_id) throws Exception {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		//TODO
+		StdEnrol enrol = this.stdEnrolService.find(enrol_id);;
+//		String merchant_id  ="12977";
+		int fee = Integer.parseInt(enrol.getFee_price());
+		try {
+			PayBill bill = WeiXinPayUtil.makePayBill(this.MERCHANT_ID,
+					WeiXinPayUtil.ChannelId, fee, std.getId() + "", enrol.getId() + "");
+			if (bill != null) {
+				WeiXinPayUtil.makeQrCode(bill.getBill_param(), this.getResponse().getOutputStream());
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new BusinessException("未能正常生成支付二维码,请联系系统管理员!");
+		}
+	}
+	
+	@RequestMapping("std/stdEnrol/order")
+	public void jumpEnrol(String channel_id, int enrol_id) {
+		StdEnrol enrol = this.stdEnrolService.find(enrol_id);
+//		String merchant_id  ="12977";
+		if (StringUtils.isEmpty(enrol.getFee_price())) {
+			enrol.setFee_price("1");
+		}
+		String value = PayUtil.order(
+				this.MERCHANT_ID,
+				channel_id, enrol.getStd_reg_id() + "", Integer.parseInt(enrol.getFee_price()), enrol.getId() + "");
+		this.writeText(value);
+	}
+    
+    @RequestMapping("std/stdEnrol/edit")
+    public Ajax editStdEnrol(StdEnrol stdEnrol) {
+        //this.stdEnrolService.edit(stdEnrol);
+        return new Ajax();
+    }
+    
+    @RequestMapping("std/stdEnrol/delete")
+    public Ajax deleteStdEnrol(Integer[] ids,Integer std_id) {
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	FrameAssertUtil.isNotNull(std, "请重新登录");
+    	
+    	if (null != std_id && std.getId().intValue() != std_id.intValue()) {
+    		Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+    	
+    	
+    	boolean inTime = this.timeService.isInTime(CfOperateTimeType.PERSONAL_REG.ordinal(),null);
+    	if (!inTime) {
+			throw new BusinessException("不在报考允许时间范围内,无法操作");
+		}
+    	
+    	//  校验报考ID属于会话考生的报考ID
+    	for (Integer id : ids) {
+    		StdEnrol stdEnrol = this.stdEnrolService.find(id);
+    		if(null != stdEnrol && stdEnrol.getStd_reg_id().intValue() != std.getId()){
+    			throw new BusinessException("待删除的报考记录与当前考生不一致,请重新登陆!");
+    		}
+    	}
+    	
+    	for (Integer id : ids) {
+    		List<PayBillUnion> billList = this.payBillUnionDao.list("business_id", id);
+    		for (PayBillUnion bill : billList) {
+    			
+				try {
+					HttpResult queryOrder = UnionPayUtil.queryOrder(bill.getBill_no());
+					Map<String, String> rtnMap = JsonHelper.toMap(queryOrder.getResponse());
+					String orderStatus = rtnMap.get("orderStatus");
+	    			if ("suss".equals(orderStatus)) {
+	    				Ajax rtnAjax = new Ajax();
+	    				rtnAjax.setSuccess(false);
+	    				rtnAjax.setErrorMsg("该报考已经缴费,无法删除!");
+	    				return rtnAjax;
+	    			}
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+    			
+			}
+    		
+    		this.stdEnrolService.deleteStdEnrol(id, std);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("std/stdEnrol/get")
+    public Ajax getStdEnrolById(Integer id) {
+        return new Ajax(this.stdEnrolService.find(id));
+    }  
+    
+    @RequestMapping("std/stdEnrol/existFacePic")
+    public Ajax existFacePic() {
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	StdRegInfo dbStd = this.stdRegInfoService.find(std.getId());
+    	
+    	Ajax ajax = new Ajax();
+    	
+		String isRemotePhoto = SysConst.getAppConfig().getIsRemotePhoto();
+		// 恒生文件服务器
+		if("1".equals(isRemotePhoto)){
+			if(StringUtils.isEmpty(dbStd.getPhoto_path())){
+				ajax.setSuccess(false);
+			}
+		}else{
+			// 本地文件服务器
+			String faceFilePath = SysConst.getAppConfig().getUploadBase() + dbStd.getPhoto_url();
+			File faceFile = new File(faceFilePath);
+			
+			if(!faceFile.exists()){
+				ajax.setSuccess(false);
+			}
+		}
+		
+    	return ajax;
+    }    
+    
+    /**
+     * 获取缴费短信信息
+     * @param channel
+     * @param std_id
+     * @param paytype
+     * @param payModel
+     * @return
+     */
+	@RequestMapping("std/stdEnrol/payUnion/makePayBillForPhoneCode")
+	public Ajax makePayBillForPhoneCode(String channel, Integer std_id, String paytype, Integer payModel) {
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(stdRegInfo, "请重新登录");
+
+		if (null != std_id && stdRegInfo.getId().intValue() != std_id.intValue()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		// 生成订单之前验证刷新缴费状态
+		boolean inTime = this.timeService.isInTime(CfOperateTimeType.enrolPay.ordinal(), null);
+		if (!inTime) {
+			throw new BusinessException("不在报考缴费允许时间范围内,无法操作。");
+		}
+
+		StdRegInfo dbStdRegInfo = this.stdRegInfoService.find(stdRegInfo.getId());
+		if (dbStdRegInfo != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStdRegInfo);
+		}
+
+		Map<String, String> paramMap = new HashMap<String, String>();
+		paramMap.put("ticketNo", dbStdRegInfo.getTicket_no());
+		paramMap.put("stdName", dbStdRegInfo.getStd_name());
+		paramMap.put("bindphone", dbStdRegInfo.getBindphone());
+
+		FrameParam loginParam = this.payBillUnionDao.find(FrameParam.class, "param_name", "payNeedPhoneCode");
+		if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+			paramMap.put("payNeedPhoneCode", "true");
+		} else {
+			paramMap.put("payNeedPhoneCode", "false");
+		}
+
+		return new Ajax(paramMap);
+	} 
+    
+    /** 支付平台支付前置事件
+     * @param id
+     * @param channel 支付方式
+     * @return
+     */
+    @RequestMapping("std/stdEnrol/payUnion/makePayBill")
+    public Ajax makePayBill4payUnion(Integer id, String channel,Integer std_id,String paytype,Integer payModel,String code) {
+    	StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	FrameAssertUtil.isNotNull(stdRegInfo, "请重新登录");
+    	
+    	if (null != std_id && stdRegInfo.getId().intValue() != std_id.intValue()) {
+    		Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+    	
+    	FrameAssertUtil.isNotNull(id, "报考ID不能为空");
+    	
+    	//生成订单之前验证刷新缴费状态
+    	boolean inTime = this.timeService.isInTime(CfOperateTimeType.enrolPay.ordinal(),null);
+    	if (!inTime) {
+			throw new BusinessException("不在报考缴费允许时间范围内,无法操作。");
+		}
+    	
+    	StdEnrol stdEnrol = this.stdEnrolService.find(id);
+    	if (stdEnrol == null) {
+    		Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("不存在该报考信息");
+    		return ajax;
+		}
+    	if(StringUtils.isEmpty(stdEnrol.getFee_price())){
+    		Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("报考费用未设置无法缴费");
+    		return ajax;
+    	}
+    	
+    	  // 校验报考对应的考生ID与会话考生ID一致
+    	if(!stdRegInfo.getId().equals(stdEnrol.getStd_reg_id())){
+    		Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("当前登录考生账号与报考课程对应考生不一致,无法缴费。");
+    		return ajax;
+    	}
+    	  
+    	
+    	//  三分钟之内,生成的未缴费订单多于3条记录,则不允许再生成订单
+    	List<PayBillUnion> pays = this.payBillUnionService.queryThreeMinPayBillUnionByBusinessId(id);
+    	if(null != pays && pays.size()>3){
+    		Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("您的报考在三分钟之内生成的未缴费订单过多,请稍后再试!(如生成二维码多次超时,请稍后再试)");
+    		return ajax;
+    	}
+    	
+    	
+    	// 根据考生ID和报考ID获取已生成的订单信息,已缴费成功排在前面,然后最新时间排前面,只获取5条记录
+    	List<PayBillUnion> bill = this.payBillUnionService.queryPayBillUnionByBssIdAndCuid(id,stdRegInfo.getId());
+    	
+    	if(null != bill && !bill.isEmpty()){
+    		// 校验是否已经缴费通过
+    		for (PayBillUnion payBillUnion : bill) {
+    			if ("success".equals(payBillUnion.getBill_status()) ){
+            		Ajax ajax = new Ajax();
+            		ajax.setSuccess(false);
+            		ajax.setErrorMsg("该报考已经缴费,不能重复缴费,请点击刷新按钮!");
+            		return ajax;
+        		}
+    		}
+    		
+    		// 没有缴费通过,刷新最近5条订单是否已经完成
+    		for (PayBillUnion payBillUnion : bill) {
+    			try {
+    				UnionPayUtil.freshPay(payBillUnion.getBill_no());
+    			} catch (Exception e) {
+        			LogHelper.error(e);
+    			}
+    		}
+    		
+    	}
+    	
+    	HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		paraMap.put("business_id", id);
+		paraMap.put("customer_id", stdRegInfo.getId());
+		paraMap.put("bill_status", "success");
+		
+		// 获取缴费成功的订单
+    	bill = this.payBillUnionService.listByMap(paraMap);
+    	
+    	if(null != bill && !bill.isEmpty()){
+    		for (PayBillUnion payBillUnion : bill) {
+        		if ("success".equals(payBillUnion.getBill_status()) ){
+            		Ajax ajax = new Ajax();
+            		ajax.setSuccess(false);
+            		ajax.setErrorMsg("该报考已经缴费,不能重复缴费,请点击刷新按钮!");
+            		return ajax;
+        		}
+    		}
+    	}
+    	
+    	//费用
+    	int fee =  new Double(stdEnrol.getFee_price()).intValue();
+		//生成订单编号
+		String bill_no = this.genBillNo(stdRegInfo.getTicket_no());
+		PayBillUnion payBillUnion = new PayBillUnion();
+		payBillUnion.setBill_amount(fee);
+		payBillUnion.setBill_no(bill_no);
+		payBillUnion.setCustomer_id(String.valueOf(stdRegInfo.getId()));
+		payBillUnion.setBusiness_id(String.valueOf(stdEnrol.getId()));
+
+		LocalDateTime now = null;
+		StdEnrol time = this.stdEnrolService.getDataBaseTime();
+		if (null != time && null != time.getCreate_time()) {
+			now = time.getCreate_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+
+		payBillUnion.setBill_time(now);
+
+		payBillUnion.setBusiness_type(UnionPayUtil.BUSINESS_TYPE);
+		payBillUnion.setChannel_type(UnionPayUtil.CHANNEL_TYPE);
+		payBillUnion.setBill_status(UnionPayUtil.PAY_STATUS_REQUEST);
+		payBillUnion.setPaytype(paytype==null?"0":paytype);
+		payBillUnionService.insert(payBillUnion);
+		//APP 直接返回
+		if (paytype != null && "1".equals(paytype) && payModel != null && (payModel == 1 || payModel == 2)) {
+			HashMap<String, Object> paramMap = new HashMap<>();
+			paramMap.put("bill_no", bill_no);
+			paramMap.put("price", fee);
+			paramMap.put("ticketNo", stdRegInfo.getTicket_no());
+			paramMap.put("stdName", stdRegInfo.getStd_name());
+			paramMap.put("bindphone", stdRegInfo.getBindphone());
+			
+			FrameParam loginParam = this.payBillUnionDao.find(FrameParam.class, "param_name", "payNeedPhoneCode");
+			if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+				paramMap.put("payNeedPhoneCode", "true");
+			}else{
+				paramMap.put("payNeedPhoneCode", "false");
+			}
+			
+			return new Ajax(paramMap);
+		} else {
+			FrameParam loginParam = this.payBillUnionDao.find(FrameParam.class, "param_name", "payNeedPhoneCode");
+			if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+				if (StringUtils.isEmpty(code)) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("请输入验证码!");
+					return ajax;
+				}
+
+				StdRegInfo dbStdRegInfo = this.stdRegInfoService.find(stdRegInfo.getId());
+				if (dbStdRegInfo != null) {
+					// 解密考生敏感信息
+					this.stdRegInfoService.DecryptStd(dbStdRegInfo);
+				}
+
+				String error = this.isSysOperateFail(dbStdRegInfo.getBindphone(), "canPayTime", 10);
+				if (null != error) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg(error);
+					return ajax;
+				}
+
+				// 根据手机号码和短信验证码获取短信信息
+				List<SysVerificationCode> codes = this.sysVerificationCodeService
+						.querySysVerificationCodeByCode(dbStdRegInfo.getBindphone(), code);
+
+				// 验证验证码有效性
+				if (null == codes || codes.isEmpty()) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("验证码错误或验证码已失效,请重新发送验证码!");
+
+					// 记录验证失败信息
+					this.setSysOperateFail(dbStdRegInfo.getBindphone(), "canPayTime", 5, 10,
+							"缴费短信验证失败累计超过5次,请10分钟之后再尝试!");
+
+					return ajax;
+				}
+
+				// 验证通过,更新验证码表
+				SysVerificationCode sysVerificationCode = codes.get(0);
+				sysVerificationCode.setStatus(1);
+				this.sysVerificationCodeService.edit(sysVerificationCode);
+			}
+		}
+
+    	//订单号
+    	HttpResult qrCode = null;
+    	long begin = System.currentTimeMillis();
+    	try {
+
+        	PlCourse dbCourse = this.courseService.find(stdEnrol.getCourse_id());
+        	LogHelper.hisomeLogger.info(XclogUtil.tb(bill_no,"开始提交银联支付订单费用:[{"+String.valueOf(fee)+"}],参数:[{"+stdRegInfo.getTicket_no() + "_" +dbCourse.getCourse_name()+"}]"));
+			
+    		LogHelper.info("-------------------------------------开始UnionPayUtil.getQrCode----------------------------------------------------");
+        	
+    		// 20200105 统一支付平台将单位从元调整成分优化
+    		fee = fee*100;
+    		
+        	qrCode = UnionPayUtil.getQrCode(payBillUnion.getBill_no(), String.valueOf(fee), stdRegInfo.getTicket_no() + "_" +dbCourse.getCourse_name(),now);
+			HashMap<String, String> paramMap = qrCode.getMap();
+			paramMap.put("ticketNo", stdRegInfo.getTicket_no());
+			paramMap.put("stdName", stdRegInfo.getStd_name());
+			paramMap.put("bindphone", stdRegInfo.getBindphone());
+			
+			FrameParam loginParam = this.payBillUnionDao.find(FrameParam.class, "param_name", "payNeedPhoneCode");
+			if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+				paramMap.put("payNeedPhoneCode", "true");
+			}else{
+				paramMap.put("payNeedPhoneCode", "false");
+			}
+			
+			if (qrCode.getStatusCode() != 200) {
+				LogHelper.hisomeLogger.error(XclogUtil.te(2,"请求支付平台接口异常,返回码:"+qrCode.getStatusCode()));
+			}else {
+				LogHelper.hisomeLogger.info(XclogUtil.te(1,"提交银联支付订单成功"));
+			}
+		} catch (Exception e) {
+			LogHelper.error(e);
+			LogHelper.hisomeLogger.error(XclogUtil.te(2,"提交银联支付订单异常!"+e.getMessage()));
+			throw new BusinessException(e.getMessage());
+		}finally{
+			LogHelper.info("paytype:"+paytype+",订单号:"+bill_no+",获取二维码耗时:"+(System.currentTimeMillis()-begin));
+			LogHelper.info("-------------------------------------结束UnionPayUtil.getQrCode----------------------------------------------------");
+		}
+    	
+        return new Ajax(qrCode);
+    }   
+    
+    /**
+     * 订单号生成:12位准考证号+13位当前时间+2位数据库序列=27位订单号
+     * @param ticket_no
+     * @return
+     */
+	private synchronized String genBillNo(String ticket_no) {
+		StringBuffer bill_no = new StringBuffer();
+		bill_no.append(ticket_no);
+		bill_no.append(new Date().getTime());
+		String seq = this.stdEnrolService.getSeqBillNo();
+		String formatSting = new DecimalFormat("00").format(Integer.parseInt(seq));
+		bill_no.append(formatSting);
+
+		return bill_no.toString();
+	}
+	
+	/**
+	 * 提供给综合管理平台检查报考是否已经支付
+	 * @param orderNum
+	 * @return
+	 */
+	@RequestMapping("std/stdEnrol/payUnion/checkOrderForManagement")
+	public Ajax checkOrderForManagement(String orderNum) {
+
+    	Ajax ajax = new Ajax();
+    	long begin = System.currentTimeMillis();
+    	
+		try {
+			LogHelper.hisomeLogger.info(XclogUtil.tb(orderNum,"开始查询银联支付结果"));
+			
+    		LogHelper.info("-------------------------------------开始UnionPayUtil.checkOrderForManagement----------------------------------------------------");
+
+			Map<String, String> resMap = UnionPayUtil.queryOrderIsSuccess(orderNum);
+			String orderStatus = resMap.get("orderStatus");
+			if ("suss".equals(orderStatus)) {
+				NoticePayUnion notice = new NoticePayUnion();
+				notice.setCode(resMap.get("code"));
+				notice.setSign(resMap.get("sign"));
+				notice.setOrderNum(resMap.get("orderNum"));
+				notice.setTradeTime(resMap.get("tradeTime"));
+				notice.setOrderDate(resMap.get("orderDate"));
+				notice.setOrderStatus(resMap.get("orderStatus"));
+				notice.setOrderDesc(resMap.get("orderDesc"));
+				notice.setSystemName(resMap.get("systemName"));
+				notice.setMessage(resMap.get("message"));
+				
+				// 必须 先记录日志,再调用this.notice4payUnion(notice,true); 否则记录日志报错误。tb和te需配套使用
+				LogHelper.hisomeLogger.info(XclogUtil.te(1,"查询银联支付结果成功:支付成功"));
+				
+				this.notice4payUnion(notice,true);
+				
+			}else{
+				LogHelper.hisomeLogger.error(XclogUtil.te(2,"查询银联支付结果成功:支付失败"));
+				ajax.setErrorMsg("订单未支付成功!");
+				ajax.setSuccess(false);
+			}
+
+		} catch (Exception e) {
+			LogHelper.error(e);
+			LogHelper.hisomeLogger.error(XclogUtil.te(2,"查询银联支付结果异常!"+e.getMessage()));
+			throw new BusinessException("查询订单状态异常");
+		}finally{
+			LogHelper.info("订单号:"+orderNum+",查询订单是否成功耗时:"+(System.currentTimeMillis()-begin));
+			LogHelper.info("-------------------------------------结束UnionPayUtil.checkOrderForManagement----------------------------------------------------");
+		}
+		
+		return ajax;
+	
+	}
+    
+    @RequestMapping("std/stdEnrol/payUnion/checkOrderIsSuccess")
+	public Ajax queryOrderIsSuccess(String orderNum,Integer std_id) {
+    	Ajax ajax = new Ajax();
+    	
+		if (StringUtils.isEmpty(orderNum)) {
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("订单号不能为空!");
+			return ajax;
+		}
+    	
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	if(null == std){
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("未登录,请登录系统!");
+    		return ajax;
+    	}
+    	
+		if (null != std_id && std.getId().intValue() != std_id.intValue()) {
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+		
+    	long begin = System.currentTimeMillis();
+    	
+		try {
+			LogHelper.hisomeLogger.info(XclogUtil.tb(orderNum,"开始查询银联支付结果"));
+			
+    		LogHelper.info("-------------------------------------开始UnionPayUtil.queryOrderIsSuccess----------------------------------------------------");
+
+			Map<String, String> resMap = UnionPayUtil.queryOrderIsSuccess(orderNum);
+			String orderStatus = resMap.get("orderStatus");
+			if ("suss".equals(orderStatus)) {
+				NoticePayUnion notice = new NoticePayUnion();
+				notice.setCode(resMap.get("code"));
+				notice.setSign(resMap.get("sign"));
+				notice.setOrderNum(resMap.get("orderNum"));
+				notice.setTradeTime(resMap.get("tradeTime"));
+				notice.setOrderDate(resMap.get("orderDate"));
+				notice.setOrderStatus(resMap.get("orderStatus"));
+				notice.setOrderDesc(resMap.get("orderDesc"));
+				notice.setSystemName(resMap.get("systemName"));
+				notice.setMessage(resMap.get("message"));
+				
+				// 必须 先记录日志,再调用this.notice4payUnion(notice,true); 否则记录日志报错误。tb和te需配套使用
+				LogHelper.hisomeLogger.info(XclogUtil.te(1,"查询银联支付结果成功:支付成功"));
+				
+				this.notice4payUnion(notice,true);
+				
+			}else{
+				LogHelper.hisomeLogger.error(XclogUtil.te(2,"查询银联支付结果成功:支付失败"));
+				ajax.setErrorMsg("订单未支付成功!");
+				ajax.setSuccess(false);
+			}
+
+		} catch (Exception e) {
+			LogHelper.error(e);
+			LogHelper.hisomeLogger.error(XclogUtil.te(2,"查询银联支付结果异常!"+e.getMessage()));
+			throw new BusinessException("查询订单状态异常");
+		}finally{
+			LogHelper.info("订单号:"+orderNum+",查询订单是否成功耗时:"+(System.currentTimeMillis()-begin));
+			LogHelper.info("-------------------------------------结束UnionPayUtil.queryOrderIsSuccess----------------------------------------------------");
+		}
+		
+		return ajax;
+	}
+    
+    @RequestMapping("std/stdEnrol/payUnion/checkOrderIsSuccessForDel")
+	public Ajax checkOrderIsSuccessForDel(Integer business_id,Integer std_id) {
+		Ajax ajax = new Ajax();
+		
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	FrameAssertUtil.isNotNull(std, "请重新登录");
+    	
+    	if (null != std_id && std.getId().intValue() != std_id.intValue()) {
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+    	
+		if (null == business_id) {
+			// 报考ID为空,不允许删除
+			ajax.setErrorMsg("报考ID为空,不允许删除。");
+			ajax.setSuccess(true);
+			return ajax;
+		}
+		
+    	boolean inTime = this.timeService.isInTime(CfOperateTimeType.PERSONAL_REG.ordinal(),null);
+    	if (!inTime) {
+    		ajax.setErrorMsg("不在报考允许时间范围内,无法操作");
+			ajax.setSuccess(true);
+			return ajax;
+		}
+    	
+		// 校验报考ID属于会话考生的报考ID
+		StdEnrol stdEnrol = this.stdEnrolService.find(business_id);
+		if (null != stdEnrol && stdEnrol.getStd_reg_id().intValue() != std.getId()) {
+			ajax.setErrorMsg("待删除的报考记录与当前考生不一致,请重新登陆!");
+			ajax.setSuccess(true);
+			return ajax;
+		}
+    	
+		try {
+			// 根据报考ID获取订单号
+			List<PayBillUnion> pays = this.payBillUnionService.queryPayBillUnionByBusinessId(business_id);
+
+			if (null == pays || pays.isEmpty()) {
+				// 课程报考未生成订单,允许删除
+				ajax.setErrorMsg("课程报考未生成订单!");
+				ajax.setSuccess(false);
+				return ajax;
+			}
+			
+
+			for (PayBillUnion payBillUnion : pays) {
+				if (null != payBillUnion && "success".equals(payBillUnion.getBill_status())) {
+					// 订单支付成功, 不允许删除
+					ajax.setErrorMsg("课程报考已缴费成功, 不允许删除!请刷新列表!");
+					ajax.setSuccess(true);
+					return ajax;
+				}
+				
+				if (null != payBillUnion && null != payBillUnion.getIs_three_minutes() && payBillUnion.getIs_three_minutes().intValue() == 1) {
+					// 3分钟内存在订单, 不允许删除
+					ajax.setErrorMsg("课程报考存在三分钟之内的订单,请稍后再取消!");
+					ajax.setSuccess(true);
+					return ajax;
+				}
+
+				
+				if (null != payBillUnion && null != payBillUnion.getBill_no()) {
+					LogHelper.hisomeLogger.info(XclogUtil.tb(payBillUnion.getBill_no(), "开始查询银联支付结果"));
+					Map<String, String> resMap = UnionPayUtil.queryOrderIsSuccess(payBillUnion.getBill_no());
+					LogHelper.hisomeLogger.info(XclogUtil.te(1,"查询银联支付结果成功"));
+					String orderStatus = resMap.get("orderStatus");
+					if ("suss".equals(orderStatus)) {
+						NoticePayUnion notice = new NoticePayUnion();
+						notice.setCode(resMap.get("code"));
+						notice.setSign(resMap.get("sign"));
+						notice.setOrderNum(resMap.get("orderNum"));
+						notice.setTradeTime(resMap.get("tradeTime"));
+						notice.setOrderDate(resMap.get("orderDate"));
+						notice.setOrderStatus(resMap.get("orderStatus"));
+						notice.setOrderDesc(resMap.get("orderDesc"));
+						notice.setSystemName(resMap.get("systemName"));
+						notice.setMessage(resMap.get("message"));
+						this.notice4payUnion(notice, true);
+
+						// 订单支付完成,不允许删除
+						ajax.setErrorMsg("课程报考已缴费成功, 不允许删除。");
+						ajax.setSuccess(true);
+						return ajax;
+
+					}
+
+				}
+
+			}
+
+		} catch (Exception e) {
+			LogHelper.error(e);
+			LogHelper.hisomeLogger.error(XclogUtil.te(2,"查询银联支付结果异常!"+e.getMessage()));
+			// 查询订单状态异常,不允许删除
+			ajax.setErrorMsg("查询订单状态异常, 不允许删除。");
+			ajax.setSuccess(true);
+			return ajax;
+		}
+
+		// 报考课程未缴费,允许删除
+		ajax.setErrorMsg("报考课程未缴费,允许删除。");
+		ajax.setSuccess(false);
+		return ajax;
+	}
+    
+    
+    @RequestMapping("std/stdEnrol/payUnion/makePayBillBatch")
+    public Ajax makePayBill4payUnionBatch(Integer[] ids, String channel, Integer std_id, String paytype, Integer payModel) {
+    	StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	FrameAssertUtil.isNotNull(stdRegInfo, "请重新登录");
+    	
+    	if (null != std_id && stdRegInfo.getId().intValue() != std_id.intValue()) {
+    		Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+    	
+    	boolean inTime = this.timeService.isInTime(CfOperateTimeType.enrolPay.ordinal(),null);
+		if (!inTime) {
+			// 报考时间未开放,受理测试缴费
+
+			StdEnrol stdEnrol = null;
+
+			// 是否测试缴费。默认为否,如果选中的订单在数据表中的is_test全部都是1,则为测试缴费报考
+			boolean is_test = false;
+			boolean is_all_test = true;
+
+			for (int i = 0; i < ids.length; i++) {
+				// 根据选择中的报考ID获取报考记录
+				stdEnrol = this.stdEnrolService.find(ids[i]);
+
+				// is_test为空,或者不等于1 表示不是测试缴费
+				if (null != stdEnrol && (null == stdEnrol.getIs_test() || 1 != stdEnrol.getIs_test().intValue())) {
+					is_all_test = false;
+				}
+				
+				 // 校验报考对应的考生ID与会话考生ID一致
+		    	if(!stdRegInfo.getId().equals(stdEnrol.getStd_reg_id())){
+		    		Ajax ajax = new Ajax();
+		    		ajax.setSuccess(false);
+		    		ajax.setErrorMsg("当前登录考生账号与报考课程对应考生不一致,无法缴费。");
+		    		return ajax;
+		    	}
+			}
+
+			// 全部订单都是测试报考,则标识是测试缴费
+			if (is_all_test) {
+				is_test = true;
+			}
+
+			// 非测试缴费,返回无法操作,测试缴费可继续操作
+			if (!is_test) {
+				throw new BusinessException("不在报考缴费允许时间范围内,无法操作。");
+			}
+
+		}
+    	
+    	int sumFeePrice = 0;
+    	StringBuilder business_ids = new StringBuilder();
+    	StringBuilder orderDesc = new StringBuilder();
+    	HttpResult qrCode = null;
+    	String bill_no = this.genBillNo(stdRegInfo.getTicket_no());
+    	for (int i = 0; i < ids.length; i++) {
+    		Integer enrol_id = ids[i];
+    		StdEnrol stdEnrol = this.stdEnrolService.find(enrol_id);
+    		
+    		if (stdEnrol == null) {
+        		Ajax ajax = new Ajax();
+        		ajax.setSuccess(false);
+        		ajax.setErrorMsg("不存在该报考信息,请点击刷新按钮!");
+        		return ajax;
+    		}
+    		
+    		PlCourse dbCourse = courseService.find(stdEnrol.getCourse_id());
+    		String fee_price = stdEnrol.getFee_price();
+    				
+    		if(StringUtils.isEmpty(fee_price)){
+    			Ajax ajax = new Ajax();
+    			ajax.setSuccess(false);
+    			ajax.setErrorMsg("报考费用未设置无法缴费");
+    			return ajax;
+    		}
+    		
+    		//  三分钟之内,生成的未缴费订单多于3条记录,则不允许再生成订单
+        	List<PayBillUnion> pays = this.payBillUnionService.queryThreeMinPayBillUnionByBusinessId(enrol_id);
+        	if(null != pays && pays.size()>3){
+        		Ajax ajax = new Ajax();
+        		ajax.setSuccess(false);
+        		ajax.setErrorMsg("您的报考在三分钟之内生成的未缴费订单过多,请稍后再试!(如生成二维码多次超时,请稍后再试)");
+        		return ajax;
+        	}
+        	
+        	HashMap<String, Object> paraMap = new HashMap<String, Object>();
+    		paraMap.put("business_id", enrol_id);
+    		paraMap.put("customer_id", stdRegInfo.getId());
+    		paraMap.put("bill_status", "success");
+    		
+    		// 获取缴费成功的订单
+    		List<PayBillUnion> bill = this.payBillUnionService.listByMap(paraMap);
+        	
+        	if(null != bill && !bill.isEmpty()){
+        		for (PayBillUnion payBillUnion : bill) {
+            		if ("success".equals(payBillUnion.getBill_status()) ){
+                		Ajax ajax = new Ajax();
+                		ajax.setSuccess(false);
+                		ajax.setErrorMsg("该报考已经缴费,不能重复缴费,请点击刷新按钮!");
+                		return ajax;
+            		}
+        		}
+        	}
+    		
+    		sumFeePrice += new Double(fee_price).intValue();
+    		
+    		if (i == 0) {
+    			orderDesc.append(dbCourse.getCourse_name());
+    			business_ids.append(stdEnrol.getId());
+			}else{
+				orderDesc.append(","+dbCourse.getCourse_name());
+				business_ids.append(","+stdEnrol.getId());
+			}
+    	}
+    	
+    
+    	
+		LocalDateTime now = null;
+		StdEnrol time = this.stdEnrolService.getDataBaseTime();
+		if (null != time && null != time.getCreate_time()) {
+			now = time.getCreate_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+    	
+    	for (int i = 0; i < ids.length; i++) {
+    		Integer enrol_id = ids[i];
+    		StdEnrol stdEnrol = this.stdEnrolService.find(enrol_id);
+    		String fee_price = stdEnrol.getFee_price();
+    		
+        	PayBillUnion payBillUnion = new PayBillUnion();
+        	payBillUnion.setBill_amount(new Double(fee_price).intValue());
+        	payBillUnion.setBill_no(bill_no);
+        	payBillUnion.setCustomer_id(String.valueOf(stdRegInfo.getId()));
+        	payBillUnion.setBusiness_id(String.valueOf(stdEnrol.getId()));
+        	
+        	payBillUnion.setBill_time(now);
+        	payBillUnion.setBusiness_type(UnionPayUtil.BUSINESS_TYPE);
+        	payBillUnion.setChannel_type(UnionPayUtil.CHANNEL_TYPE);
+        	payBillUnion.setBill_status(UnionPayUtil.PAY_STATUS_REQUEST);
+        	
+        	payBillUnion.setIs_batch_pay(1);
+        	payBillUnion.setBusiness_ids(business_ids.toString());
+        	payBillUnion.setRemark("合并支付");
+			payBillUnion.setPaytype(paytype==null?"0":paytype);
+        	payBillUnionService.insert(payBillUnion);
+		}
+		//APP 直接返回
+		if (paytype != null && "1".equals(paytype) && payModel != null && (payModel == 1 || payModel == 2)) {
+			HashMap<String, Object> paramMap = new HashMap<>();
+			paramMap.put("bill_no", bill_no);
+			paramMap.put("price", sumFeePrice);
+			paramMap.put("ticketNo", stdRegInfo.getTicket_no());
+			paramMap.put("stdName", stdRegInfo.getStd_name());
+			paramMap.put("bindphone", stdRegInfo.getBindphone());
+			
+			FrameParam loginParam = this.payBillUnionDao.find(FrameParam.class, "param_name", "payNeedPhoneCode");
+			if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+				paramMap.put("payNeedPhoneCode", "true");
+			}else{
+				paramMap.put("payNeedPhoneCode", "false");
+			}
+			
+			return new Ajax(paramMap);
+		}
+
+		
+    	long begin = System.currentTimeMillis();
+    	
+    	try {
+    		LogHelper.hisomeLogger.info(XclogUtil.tb(bill_no,"开始提交银联支付订单费用:[{"+String.valueOf(sumFeePrice)+"}],参数:[{"+orderDesc.toString()+"}]"));
+    		 
+    		LogHelper.info("-------------------------------------开始UnionPayUtil.getQrCode----------------------------------------------------");
+    		
+    		// 20200105 统一支付平台将单位从元调整成分优化
+    		sumFeePrice = sumFeePrice*100;
+    		
+	    	qrCode = UnionPayUtil.getQrCode(bill_no, String.valueOf(sumFeePrice), orderDesc.toString(),now);
+			HashMap<String, String> paramMap = qrCode.getMap();
+			paramMap.put("ticketNo", stdRegInfo.getTicket_no());
+			paramMap.put("stdName", stdRegInfo.getStd_name());
+			paramMap.put("bindphone", stdRegInfo.getBindphone());
+			
+			FrameParam loginParam = this.payBillUnionDao.find(FrameParam.class, "param_name", "payNeedPhoneCode");
+			if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+				paramMap.put("payNeedPhoneCode", "true");
+			}else{
+				paramMap.put("payNeedPhoneCode", "false");
+			}
+			
+			if (qrCode.getStatusCode() != 200) {
+				LogHelper.hisomeLogger.error(XclogUtil.te(2,"请求支付平台接口异常,返回码:"+qrCode.getStatusCode()));
+			}else {
+				LogHelper.hisomeLogger.info(XclogUtil.te(1,"提交银联支付订单成功"));
+			}
+			
+    	} catch (Exception e) {
+    		LogHelper.error(e);
+    		LogHelper.hisomeLogger.error(XclogUtil.te(2,"提交银联支付订单异常!"+e.getMessage()));
+			throw new BusinessException(e.getMessage());
+		}finally{
+			LogHelper.info("paytype:"+paytype+",订单号:"+bill_no+",获取二维码耗时:"+(System.currentTimeMillis()-begin));
+			LogHelper.info("-------------------------------------结束UnionPayUtil.getQrCode----------------------------------------------------");
+		}
+	   
+        return new Ajax(qrCode);
+    }    
+    
+    
+    @RequestMapping("pay/payBillUnion/getappPay")
+	public Ajax getappPay(String orderNum, Integer payMode, Integer std_id,String code) {
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(stdRegInfo, "请重新登录");
+		FrameAssertUtil.isNotNull(orderNum, "订单号不能为空");
+
+		if (!StringUtils.isEmpty(std_id) && stdRegInfo != null && !stdRegInfo.getId().equals(std_id)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+		
+		
+		FrameParam loginParam = this.payBillUnionDao.find(FrameParam.class, "param_name", "payNeedPhoneCode");
+		if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+			if (StringUtils.isEmpty(code)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入验证码!");
+				return ajax;
+			}
+
+			StdRegInfo dbStdRegInfo = this.stdRegInfoService.find(stdRegInfo.getId());
+			if (dbStdRegInfo != null) {
+				// 解密考生敏感信息
+				this.stdRegInfoService.DecryptStd(dbStdRegInfo);
+			}
+			
+			String error = this.isSysOperateFail(dbStdRegInfo.getBindphone(), "canPayTime", 10);
+			if (null != error) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(error);
+				return ajax;
+			}
+
+			// 根据手机号码和短信验证码获取短信信息
+			List<SysVerificationCode> codes = this.sysVerificationCodeService
+					.querySysVerificationCodeByCode(dbStdRegInfo.getBindphone(), code);
+
+			// 验证验证码有效性
+			if (null == codes || codes.isEmpty()) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("验证码错误或验证码已失效,请重新发送验证码!");
+
+				// 记录验证失败信息
+				this.setSysOperateFail(dbStdRegInfo.getBindphone(), "canPayTime", 5, 10, "缴费短信验证失败累计超过5次,请10分钟之后再尝试!");
+
+				return ajax;
+			}
+
+			// 验证通过,更新验证码表
+			SysVerificationCode sysVerificationCode = codes.get(0);
+			sysVerificationCode.setStatus(1);
+			this.sysVerificationCodeService.edit(sysVerificationCode);
+		}
+
+		List<PayBillUnion> payList = this.payBillUnionService.list("bill_no", orderNum);
+		FrameAssertUtil.hasValue(payList, "订单不存在");
+
+		boolean inTime = this.timeService.isInTime(CfOperateTimeType.enrolPay.ordinal(), null);
+		if (!inTime) {
+			// 报考时间未开放,受理测试缴费
+
+			StdEnrol stdEnrol = null;
+
+			// 是否测试缴费。默认为否,如果选中的订单在数据表中的is_test全部都是1,则为测试缴费报考
+			boolean is_test = false;
+			boolean is_all_test = true;
+
+			for (PayBillUnion payBillUnion : payList) {
+				// 根据选择中的报考ID获取报考记录
+				stdEnrol = this.stdEnrolService.find(payBillUnion.getBusiness_id());
+
+				// is_test为空,或者不等于1 表示不是测试缴费
+				if (null != stdEnrol && (null == stdEnrol.getIs_test() || 1 != stdEnrol.getIs_test().intValue())) {
+					is_all_test = false;
+				}
+
+				// 校验报考对应的考生ID与会话考生ID一致
+				if (!stdRegInfo.getId().equals(stdEnrol.getStd_reg_id())) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("当前登录考生账号与报考课程对应考生不一致,无法缴费。");
+					return ajax;
+				}
+			}
+
+			// 全部订单都是测试报考,则标识是测试缴费
+			if (is_all_test) {
+				is_test = true;
+			}
+
+			// 非测试缴费,返回无法操作,测试缴费可继续操作
+			if (!is_test) {
+				throw new BusinessException("不在报考缴费允许时间范围内,无法操作。");
+			}
+
+		}
+
+		int sumFeePrice = 0;
+		StringBuilder orderDesc = new StringBuilder();
+		HttpResult qrCode = null;
+
+		for (PayBillUnion payBillUnion : payList) {
+			StdEnrol stdEnrol = this.stdEnrolService.find(payBillUnion.getBusiness_id());
+
+			if (stdEnrol == null) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("不存在该报考信息,请点击刷新按钮!");
+				return ajax;
+			}
+
+			PlCourse dbCourse = courseService.find(stdEnrol.getCourse_id());
+			String fee_price = stdEnrol.getFee_price();
+
+			if (StringUtils.isEmpty(fee_price)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("报考费用未设置无法缴费");
+				return ajax;
+			}
+
+			// 三分钟之内,生成的未缴费订单多于3条记录,则不允许再生成订单
+			List<PayBillUnion> pays = this.payBillUnionService.queryThreeMinPayBillUnionByBusinessId(stdEnrol.getId());
+			if (null != pays && pays.size() > 3) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("您的报考在三分钟之内生成的未缴费订单过多,请稍后再试!");
+				return ajax;
+			}
+
+			HashMap<String, Object> paraMap = new HashMap<String, Object>();
+			paraMap.put("business_id", payBillUnion.getBusiness_id());
+			paraMap.put("customer_id", stdRegInfo.getId());
+			paraMap.put("bill_status", "success");
+
+			// 获取缴费成功的订单
+			List<PayBillUnion> bills = this.payBillUnionService.listByMap(paraMap);
+
+			if (null != bills && !bills.isEmpty()) {
+				for (PayBillUnion bill : bills) {
+					if ("success".equals(bill.getBill_status())) {
+						Ajax ajax = new Ajax();
+						ajax.setSuccess(false);
+						ajax.setErrorMsg("该报考已经缴费,不能重复缴费,请点击刷新按钮!");
+						return ajax;
+					}
+				}
+			}
+
+			sumFeePrice += new Double(fee_price).intValue();
+			if (orderDesc.length() == 0) {
+				orderDesc.append(dbCourse.getCourse_name());
+			} else {
+				orderDesc.append("," + dbCourse.getCourse_name());
+			}
+		}
+
+		LocalDateTime now = null;
+		StdEnrol time = this.stdEnrolService.getDataBaseTime();
+		if (null != time && null != time.getCreate_time()) {
+			now = time.getCreate_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+
+		long begin = System.currentTimeMillis();
+
+		try {
+			LogHelper.hisomeLogger.info(XclogUtil.tb(orderNum,
+					"开始提交银联支付订单费用:[{" + String.valueOf(sumFeePrice) + "}],参数:[{" + orderDesc.toString() + "}]"));
+			
+			LogHelper.info(
+					"-------------------------------------开始UnionPayUtil.getAppPay----------------------------------------------------");
+
+			qrCode = UnionPayUtil.getAppPay(orderNum, String.valueOf(sumFeePrice * 100), orderDesc.toString(), payMode,
+					now);
+			if (qrCode.getStatusCode() != 200) {
+				LogHelper.error("请求支付平台接口异常,返回码:" + qrCode.getStatusCode());
+				LogHelper.hisomeLogger.error(XclogUtil.te(2, "请求支付平台接口异常,返回码:" + qrCode.getStatusCode()));
+			} else {
+				Map<String, String> paramMap =  JsonHelper.toMap(qrCode.getResponse());
+				if(null == paramMap || !"1".equals(paramMap.get("code"))){
+					LogHelper.error("提交银联支付订单异常:" + (null == paramMap ? "响应信息为空" : paramMap.get("message")));
+					LogHelper.hisomeLogger.error(
+							XclogUtil.te(2, "提交银联支付订单异常:" + (null == paramMap ? "响应信息为空" : paramMap.get("message"))));
+				}else{
+					LogHelper.hisomeLogger.info(XclogUtil.te(1, "提交银联支付订单成功"));
+				}
+			}
+			
+		} catch (Exception e) {
+			LogHelper.error(e);
+			LogHelper.hisomeLogger.error(XclogUtil.te(2, "提交银联支付订单异常:" + e.getMessage()));
+			throw new BusinessException(e.getMessage());
+		} finally {
+			LogHelper.info("订单号:"+orderNum+",获取APP支付信息耗时:"+(System.currentTimeMillis()-begin));
+			LogHelper.info(
+					"-------------------------------------结束UnionPayUtil.getAppPay----------------------------------------------------");
+		}
+
+		return new Ajax(qrCode);
+	}
+    
+    
+    /** 支付成功回调接口
+     * @return
+     */
+    @RequestMapping("std/stdEnrol/payUnion/notice")
+    public void notice4payUnion(@RequestBody NoticePayUnion notice, boolean isUSerSend){
+    	LogHelper.hisomeLogger.info(XclogUtil.m("收到银联支付结果通知,订单号:[{0}],参数:[{1}]", notice.getOrderNum(),JsonHelper.fromObject(notice)));
+    	LogHelper.hisomeLogger.info(XclogUtil.tb(notice.getOrderNum(),"开始处理支付结果"));
+    	StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	PayNoticeUnion noticeUnion = new PayNoticeUnion();
+    	noticeUnion.setCode(notice.getCode());
+    	noticeUnion.setOrder_amount(notice.getOrderAmount());
+    	noticeUnion.setOrder_date(notice.getOrderDate());
+    	noticeUnion.setOrder_desc(notice.getOrderDesc());
+    	noticeUnion.setOrder_num(notice.getOrderNum());
+    	noticeUnion.setOrder_status(notice.getOrderStatus());
+    	noticeUnion.setSystem_name(notice.getSystemName());
+    	noticeUnion.setTrade_time(notice.getTradeTime());
+    	noticeUnion.setMessage(notice.getMessage());
+    	noticeUnion.setSign(notice.getSign());
+    	
+    	payNoticeUnionService.insert(noticeUnion);
+    	
+    	String orderNum = notice.getOrderNum();
+    	PayBillUnion payBillUnion = new PayBillUnion();
+    	payBillUnion.setBill_no(orderNum);
+    	List<PayBillUnion> list = payBillUnionService.list("bill_no", orderNum);
+    	
+    	// 页面请求是否成功标识 
+    	boolean isSuccess = false;
+    	// 报考是否有删除标识 ,用于计算删除报考的退款金额
+    	boolean delEnrol = false;
+    	
+    	if (list.size() > 0) {
+    		LocalDateTime now = null;
+        	StdEnrol time = this.stdEnrolService.getDataBaseTime();
+    		if (null != time && null != time.getCreate_time()) {
+    			now = time.getCreate_time();
+    		} else {
+    			now = LocalDateTime.now();
+    		}
+    		
+    		PayBillUnion payBill = list.get(0);
+    		
+    		// 订单总金额
+    		BigDecimal total_fee_price = new BigDecimal(0);
+    		// 订单号对应的报考表的金额总数
+    		BigDecimal enrol_fee_price = new BigDecimal(0);
+    		// 报考表的报考金额
+    		BigDecimal fee_price = new BigDecimal(0);
+    		
+    		// 订单退款金额
+    		BigDecimal cancel_amout = new BigDecimal(0);
+        	// 退款考生ID
+        	Integer std_id = 0;
+        	if(!StringUtils.isEmpty(payBill.getCustomer_id())){
+        		std_id = Integer.parseInt(payBill.getCustomer_id());
+        	}
+        	
+        	EpayOrderInfoMsgDTO dto = new EpayOrderInfoMsgDTO();
+        	dto.setPayType(payBill.getPaytype());
+        	dto.setPayTime(notice.getTradeTime());
+        	dto.setOrderNo(orderNum);
+        	
+    		// 遍历订单表pay_bill_union的订单,修改报考表状态
+    		for (PayBillUnion bill : list) {
+    			// 最新订单回写时间
+    			bill.setReply_last_time(now);
+    			// 第一次回写订单,则更新订单第一次回写时间和订单状态
+    			if(!"success".equals(bill.getBill_status())){
+    				bill.setReply_time(now);
+        			bill.setBill_status(UnionPayUtil.PAY_STATUS_SUCCESS);
+    			}
+    			
+    			// 更新订单表的回写时间和订单状态
+				this.payBillUnionService.edit(bill);
+				
+				// 计算订单在自考系统对应的总金额
+				if(null != bill.getBill_amount()){
+					total_fee_price = total_fee_price.add(new BigDecimal(bill.getBill_amount()));
+				}
+				
+				// 报考ID
+				String business_id = bill.getBusiness_id();
+				//根据报考ID获取报考表信息
+	        	StdEnrol dbEnrol = this.stdEnrolService.find(Integer.parseInt(business_id));
+	        	
+	        	//  报考表存在对应的报表信息
+	        	if(dbEnrol != null){
+	        		// 获取报考对应的金额
+    				if(!StringUtils.isEmpty(fee_price)){
+						fee_price = new BigDecimal(dbEnrol.getFee_price()); 
+					}else{
+						fee_price = new BigDecimal(0);
+					}
+    				
+    				// 计算报考表的报考总金额
+    				enrol_fee_price = enrol_fee_price.add(fee_price);
+    				
+    				// 如果报考缴费状态已经是缴费状态,则不再更新报考表(避免编排后有其他场景进入该场景将报考状态从编排状态修改成缴费状态)
+    				if(null != dbEnrol.getFee_status() && dbEnrol.getFee_status().intValue() == 1){
+    					// 报考已经缴费,如果报考已缴费的订单号与当前订单号不一样,则计算报考退款总金额
+    					if(!orderNum.equals(dbEnrol.getFee_no())){
+    						// 计算退款总金额
+    						cancel_amout = cancel_amout.add(fee_price);
+    					}
+    					
+    					LogHelper.info("课程报考的缴费状态已经是已缴费,本次不处理");
+    					continue;
+    				}else{
+    					// 报考表的报考状态不是未缴费,则更新报考表的订单号、缴费状态和报考状态
+    					dbEnrol.setFee_no(notice.getOrderNum());
+        				dbEnrol.setStatus(StdConst.StdEnrolStatus.PAY_PASS.ordinal());
+        				dbEnrol.setFee_status(StdConst.StdPayStatus.ALREADY_PAY.ordinal());
+        				this.stdEnrolService.editStdEnrol(dbEnrol, stdRegInfo);
+    				}
+    				
+    				// 订单报考考区(取最后报考记录的考区)
+            		dto.setEnrol_agent_id(dbEnrol.getEnrol_agent_id());
+    				
+    			}else{
+    				// 报考表不存在对应的报表信息(如报考已被删除)
+    				
+    				// 标识报考被删除,用于计算被删除的报考的金额
+    				delEnrol = true;
+    				
+    				bill.setReply_remark("订单回写时报考记录已经被删除。");
+    				// 更新订单表回写备注
+	        		payBillUnionService.edit(bill);
+    			}
+	        	
+			}
+    		
+    		isSuccess = true;
+    		
+    		// 订单总金额
+    		dto.setOrderAmount(total_fee_price.stripTrailingZeros().toPlainString());
+    		
+    		// 有删除的报考,则计算删除的报考的总金额,并累加到订单退款金额
+        	if (delEnrol) {
+        		// 计算退款总金额 : 删除的报考的总金额=订单总金额-订单号对应的报考表的金额总数
+        		cancel_amout = cancel_amout.add(total_fee_price.subtract(enrol_fee_price));
+			}
+        	
+        	// 订单回写时,同步已支付订单、取消订单消息队列
+			this.SendEpayOrder(std_id, dto, cancel_amout, now);
+		}
+    	
+    	LogHelper.hisomeLogger.info(XclogUtil.te(1,"受理成功"));
+    	
+    	if (!isUSerSend) {
+	    	String rtnMsg = isSuccess?"SUCCESS":"FAILED";
+	    	HttpServletResponse response = this.getResponse();
+	    	OutputStream outPutStream = null;
+	    	try{
+	    		outPutStream = response.getOutputStream();
+	        	response.setHeader("content-type", "text/html;charset=UTF-8");
+	        	byte[] dataByteArr = rtnMsg.getBytes("UTF-8");
+	            outPutStream.write(dataByteArr);
+	            outPutStream.flush();
+	            outPutStream.close();
+	    	}catch(Exception e){
+	    		LogHelper.error(e);
+	    		throw new BusinessException(e.getMessage());
+	    	}
+    	
+    	}
+    	 
+    	
+    }
+    
+    /**
+     * 订单回写,同步已支付订单、取消订单消息队列
+     * @param cancel_amout
+     * @param std_id
+     * @param now
+     */
+    private void SendEpayOrder(Integer std_id, EpayOrderInfoMsgDTO dto, BigDecimal cancel_amout,LocalDateTime now){
+    	// 消息队列启用时(订单回写的应用配置启用,自考网上系统不配置启用),
+    	if("true".equals(SysConst.getAppConfig().getXc_mq())){
+    		LogHelper.info("-------------------------------------订单回写,同步已支付订单、取消订单消息队列开始----------------------------------------------------");
+    		
+    		// 获取考生信息
+			StdRegInfo dbStd = this.stdRegInfoService.find(std_id);
+			
+			// 考生信息不为空时,处理
+			if(null != dbStd){
+				// 解密考生敏感信息
+				this.stdRegInfoService.DecryptStd(dbStd);
+				
+				SendEpayOrderThread thread = new SendEpayOrderThread();
+				
+				// 构造订单消息信息
+				EpayOrderInfoMsgDTO epayOrderInfoMsgDTO = this.buidEpayOrderInfoMsgDTO(dbStd, dto, now);
+				thread.setEpayOrderInfoMsgDTO(epayOrderInfoMsgDTO);
+				LogHelper.info("已支付订单号:"+epayOrderInfoMsgDTO.getOrderNo()+"  已支付订单金额:"+epayOrderInfoMsgDTO.getOrderAmount());
+				
+				// 取消订单金额 大于0,构造取消订单消息信息
+				if(cancel_amout.compareTo(new BigDecimal(0)) > 0){
+					EpayCancelMsgDTO epayCancelMsgDTO = this.buidEpayCancelMsgDTO(dbStd, dto, cancel_amout, now);
+					thread.setEpayCancelMsgDTO(epayCancelMsgDTO);
+					LogHelper.info("取消订单号:"+epayCancelMsgDTO.getOrderNo()+"  取消订单金额:"+cancel_amout.stripTrailingZeros().toPlainString());
+				}
+	    		
+	    		thread.start();
+			}
+    		
+			LogHelper.info("-------------------------------------订单回写,同步已支付订单、取消订单消息队列结束----------------------------------------------------");
+    	}
+    }
+    
+    
+    /**
+	 * 构造已支付订单消息信息
+	 * @param dbStd
+	 * @param now
+	 * @return
+	 */
+	private EpayOrderInfoMsgDTO buidEpayOrderInfoMsgDTO(StdRegInfo dbStd, EpayOrderInfoMsgDTO dto,LocalDateTime now) {
+		// 考生订单信息推送
+		EpayOrderInfoMsgDTO epayOrderInfoMsgDTO = new EpayOrderInfoMsgDTO();
+		epayOrderInfoMsgDTO.setRequestType("1");
+		// 订单编号
+		epayOrderInfoMsgDTO.setOrderNo(dto.getOrderNo());
+		// 支付流水号
+		epayOrderInfoMsgDTO.setOrderSeqno(dto.getOrderNo());
+		
+		epayOrderInfoMsgDTO.setPayType(dto.getPayType());
+		// 金额
+		epayOrderInfoMsgDTO.setOrderAmount(dto.getOrderAmount());
+		// 姓名
+		epayOrderInfoMsgDTO.setStudentName(dbStd.getStd_name());
+		// 证件号
+		epayOrderInfoMsgDTO.setIDNo((null == dbStd.getCert_no() ? dbStd.getTicket_no() : dbStd.getCert_no()));
+		// 系统名称
+		epayOrderInfoMsgDTO.setSystemName(SysConst.getAppConfig().getPay_union_systemName());
+		
+		DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+		
+		// 发送时间
+		epayOrderInfoMsgDTO.setRequestTime(now.format(df));
+		// 支付时间
+		epayOrderInfoMsgDTO.setPayTime(dto.getPayTime());
+		
+		String year_code = YearCodeHelper.getCurrentYearCode();
+		
+		// 考试计划标识码
+		epayOrderInfoMsgDTO.setKsjhdm(year_code.substring(0, 4)+"1004"+year_code.substring(4, 6));
+		// 考试计划名称
+		epayOrderInfoMsgDTO.setKsjhmc(year_code.substring(0, 4)+"年高等自学考试"+year_code.substring(4, 6)+"月份考试");
+		
+		Integer org_id = (null == dto.getEnrol_agent_id()?dbStd.getExam_area_id():dto.getEnrol_agent_id());
+		// 根据报考考区ID获取考区信息
+		CfOrganization org = this.cfOrganizationService.find(org_id);
+		if(null != org && !StringUtils.isEmpty(org.getOrg_code_bz())){
+			// 考区机构代码
+			epayOrderInfoMsgDTO.setSsglgdm(org.getOrg_code_bz());
+			// 考区名称
+			epayOrderInfoMsgDTO.setGlkqmc(org.getOrg_name_bz());
+		}else{
+			//  考区为空,则默认传南宁市直
+			// 考区机构代码
+			epayOrderInfoMsgDTO.setSsglgdm("D4501");
+			// 考区名称
+			epayOrderInfoMsgDTO.setGlkqmc("南宁市招生考试");
+		}
+		
+		// TODO 科目类型 5-40元科目(自考)6-70元科目(自考)
+		epayOrderInfoMsgDTO.setSub_type("5");
+		
+		// 支付端口类型:0-PC、1-APP
+		epayOrderInfoMsgDTO.setPayType(dto.getPayType());
+		
+		DateTimeFormatter datefm = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+		// 清算时间
+		epayOrderInfoMsgDTO.setCheckouttate(now.format(datefm));
+
+		return epayOrderInfoMsgDTO;
+	}
+    
+	/**
+	 * 构造取消订单消息信息
+	 * @param dbStd
+	 * @param cancel_amout
+	 * @param now
+	 * @return
+	 */
+	private EpayCancelMsgDTO buidEpayCancelMsgDTO(StdRegInfo dbStd, EpayOrderInfoMsgDTO dto, BigDecimal cancel_amout,LocalDateTime now) {
+		// 取消订单金额不等于0,构造取消订单消息信息
+		EpayCancelMsgDTO epayCancelMsgDTO = new EpayCancelMsgDTO();
+		epayCancelMsgDTO.setRequestType("1");
+		epayCancelMsgDTO.setOrderNo(dto.getOrderNo());
+		epayCancelMsgDTO.setOrderAmount(cancel_amout.stripTrailingZeros().toPlainString());
+		epayCancelMsgDTO.setStudentName(dbStd.getStd_name());
+		epayCancelMsgDTO.setIDNo(dbStd.getCert_no());
+		// 系统名称
+		epayCancelMsgDTO.setSystemName(SysConst.getAppConfig().getPay_union_systemName());
+
+		DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+		DateTimeFormatter datefm = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+		epayCancelMsgDTO.setRequestTime(now.format(df));
+		
+		// 清算时间
+		epayCancelMsgDTO.setCheckouttate(now.format(datefm));
+				
+		epayCancelMsgDTO.setRemark("重复缴费或报考已删除退款");
+
+		return epayCancelMsgDTO;
+	}
+    
+    
+    private String getDateTime(String full_exam_date) {
+		String date = "";
+		if (full_exam_date.contains("A")) {
+			FrameDict frameDict = FrameDictUtil.getFrameDict("ExamTime","A");
+			date = full_exam_date.replace("A", frameDict.getDict_text()+"(09:00-11:30)");
+		} else if (full_exam_date.contains("B")) {
+			FrameDict frameDict = FrameDictUtil.getFrameDict("ExamTime","B");
+			date = full_exam_date.replace("B", frameDict.getDict_text()+"(14:30-17:00)");
+		} else if (full_exam_date.contains("C")) {
+			FrameDict frameDict = FrameDictUtil.getFrameDict("ExamTime","C");
+			date = full_exam_date.replace("C", frameDict.getDict_text()+"(09:00-11:30)");
+		} else if (full_exam_date.contains("D")) {
+			FrameDict frameDict = FrameDictUtil.getFrameDict("ExamTime","D");
+			date = full_exam_date.replace("D", frameDict.getDict_text()+"(14:30-17:00)");
+		} else if (full_exam_date.contains("X")) {
+			FrameDict frameDict = FrameDictUtil.getFrameDict("ExamTime","X");
+			date = full_exam_date.replace("X", frameDict.getDict_text()+"(09:00-11:30)");
+		} else if (full_exam_date.contains("Y")) {
+			FrameDict frameDict = FrameDictUtil.getFrameDict("ExamTime","Y");
+			date = full_exam_date.replace("Y", frameDict.getDict_text()+"(14:30-17:00)");
+		}
+		return date;
+	}
+    
+    
+    //@RequestMapping("std/stdEnrol/freshPay")
+   	public Ajax freshPay(String ticket_no) {
+       	Ajax ajax = new Ajax();
+       
+       	List<StdRegInfo> list = this.stdRegInfoService.list("ticket_no", ticket_no);
+       	 
+   	    if (list.size()>0) {
+       		StdRegInfo stdRegInfo = list.get(0);
+       		 List<PayBillUnion> nillList = this.payBillUnionDao.list("customer_id", String.valueOf(stdRegInfo.getId()));
+       		HashSet<String> setBillNo = new HashSet<String>();
+       		List<String> distinctBillNo = new ArrayList<String>();
+       		 for (PayBillUnion payBillUnion : nillList) {
+       			if (!"success".equals(payBillUnion.getBill_status())) {
+       				if(setBillNo.add(payBillUnion.getBill_no())){
+       					distinctBillNo.add(payBillUnion.getBill_no());
+       				}
+       			}
+			}
+       		
+       		// StringBuilder builder = new StringBuilder();
+       		 for (String billNo : distinctBillNo) {
+       			try {
+					UnionPayUtil.freshPay(billNo);
+				} catch (ClientProtocolException e) {
+					e.printStackTrace();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+       		
+		}else{
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("无准考证号对应考生信息");
+		}
+   	 
+   		return ajax;
+   	}
+    
+    @RequestMapping("std/stdEnrol/validatePicLocalExist")
+   	public Ajax validatePicLocalExist(String path) {
+    	String faceFilePath = SysConst.getAppConfig().getUploadBase() + path;
+    	File faceFile = new File(faceFilePath);
+		if(!faceFile.exists()){
+			new BusinessException(path+":不存在");
+		}
+       	return new Ajax();
+    }
+       	
+    private String isSysOperateFail(String account,String operate_type,Integer second){
+		SysOperateFail fail = this.sysOperateFailService.querySysOperateFailByAccount(account, operate_type, second);
+		if(null != fail){
+			if(fail.getFail_count()>=fail.getMax_count()){
+				return fail.getFail_remark();
+			}
+		}
+		
+		return null;
+	}
+    
+    private void setSysOperateFail(String account,String operate_type,Integer max_count,Integer second,String fail_remark){
+		SysOperateFail fail = this.sysOperateFailService.querySysOperateFailByAccount(account, operate_type, second);
+		if(null == fail){
+			fail = new SysOperateFail();
+			fail.setAccount(account);
+			fail.setFail_count(1);
+			fail.setMax_count(max_count);
+			fail.setFail_remark(fail_remark);
+			fail.setOperate_type(operate_type);
+			
+			this.sysOperateFailService.insert(fail);
+		}else{
+			fail.setFail_count(fail.getFail_count()+1);
+			
+			LocalDateTime now = this.sysOperateFailService.getDataBaseTime().getOperate_time();
+			fail.setOperate_time(now);
+			
+			this.sysOperateFailService.edit(fail);
+		}
+	}
+    
+}

+ 1219 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdInfoModifyApplyControl.java

@@ -0,0 +1,1219 @@
+package cn.hmsoft.ses.control.std;
+
+import cn.hmsoft.frame.constants.FrameParamConstants;
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.helper.JsonHelper;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.helper.SecureHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.StdConst;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.control.util.FrameIdCardUtil;
+import cn.hmsoft.ses.data.dao.std.StdRegInfoDao;
+import cn.hmsoft.ses.data.model.std.StdCompareFeature;
+import cn.hmsoft.ses.data.model.std.StdEnrol;
+import cn.hmsoft.ses.data.model.std.StdInfoModifyApply;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.helper.DateHelper;
+import cn.hmsoft.ses.helper.YearCodeHelper;
+import cn.hmsoft.ses.service.iface.std.IStdEnrolService;
+import cn.hmsoft.ses.service.iface.std.IStdInfoModifyApplyService;
+import cn.hmsoft.ses.service.iface.std.IStdRegInfoLogService;
+import cn.hmsoft.ses.service.iface.std.IStdRegInfoService;
+import cn.hmsoft.ses.service.impl.std.StdCompareFeatureDao;
+import cn.hmsoft.ses.util.HttpResult;
+import cn.hmsoft.ses.util.HttpUtil;
+import cn.hmsoft.ses.util.IdentifyCardOrcUtil;
+import cn.hmsoft.ses.util.PhotoUtil;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.xcwlkj.dfs.model.vo.DownloadVO;
+import com.xcwlkj.dfs.model.vo.UploadItemVO;
+import com.xcwlkj.dfs.model.vo.UploadVO;
+import com.xcwlkj.dfs.util.XcDfsClient;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.servlet.http.HttpSession;
+
+/**
+ * 控制器.
+ *
+ * @author: yangwei
+ * @date: 2019-06-13 09:36:25
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdInfoModifyApplyControl extends AjaxControl {
+
+    @Autowired
+    private IStdInfoModifyApplyService stdInfoModifyApplyService;
+
+    @Autowired
+    private IStdRegInfoService stdRegInfoService;
+    @Autowired
+    private IStdEnrolService stdEnrolService;
+    
+
+    @Autowired
+    private StdRegInfoDao stdRegInfoDao;
+    @Autowired
+    private IStdRegInfoLogService logService;
+    @Autowired
+    private StdCompareFeatureDao stdCompareFeatureDao ;
+    
+
+    @RequestMapping("std/stdInfoModifyApply/listByStd")
+    public Ajax listByStd() {
+        StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+        Map<String, Object> map = new HashMap<String, Object>();
+       
+        List<StdInfoModifyApply> dbList = this.stdInfoModifyApplyService.queryStdInfoModifyApplyByStdId(std.getId());
+        for (StdInfoModifyApply vo : dbList) {
+            Integer status = vo.getStatus();
+            if (status == StdConst.StdInfoModifyStatus.refuse.ordinal()) {
+                vo.setStatus_text(StdConst.StdInfoModifyStatus.refuse.toString());
+            }
+            if (status == StdConst.StdInfoModifyStatus.locVerify.ordinal()) {
+                vo.setStatus_text(StdConst.StdInfoModifyStatus.locVerify.toString());
+            }
+            if (status == StdConst.StdInfoModifyStatus.provVerify.ordinal()) {
+                vo.setStatus_text(StdConst.StdInfoModifyStatus.provVerify.toString());
+            }
+            if (status == StdConst.StdInfoModifyStatus.archive.ordinal()) {
+                vo.setStatus_text(StdConst.StdInfoModifyStatus.archive.toString());
+            }
+
+        }
+
+        map.put("applyList", dbList);
+
+        // 获取考生信息变更申请开关
+        FrameParam loginParam = this.stdRegInfoDao.find(FrameParam.class, "param_name", "stdInfoModifyApplyControl");
+
+        // 开关打开,则不允许新增申请考生信息变更,提醒内容为Param_value
+        if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+            map.put("stdInfoModifyApplyControl", loginParam.getParam_value());
+        } else {
+            //开关关闭,同允许新增申请考生信息变更
+            map.put("stdInfoModifyApplyControl", "");
+        }
+
+        return new Ajax(map);
+    }
+    
+    public static void main(String[] args) {
+    	String std_name = "龙云";
+    	Pattern pattern = Pattern.compile(
+				"^((?![\\u3000-\\u303F])[\\u2E80-\uFE4F]|\\·)*(?![\\u3000-\\u303F])[\\u2E80-\\uFE4F](\\·)*$");
+		Matcher name = pattern.matcher(std_name);
+		
+		System.out.println(name.matches());
+	}
+
+    @RequestMapping("std/stdInfoModifyApply/apply")
+    public Ajax apply(StdInfoModifyApply apply) {
+        StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+        
+		// 校验会话的ID与修改的ID一致性
+		if (null != std && std.getId().intValue() != apply.getStd_id().intValue()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(1);
+			ajax.setErrorMsg("检测到考生与会话考生不一致,请重新登陆!");
+			return ajax;
+		}
+		
+		StdRegInfo temp_std = (StdRegInfo) getRequest().getSession().getAttribute("certification_std");
+		// 校验验证通过的考生是否与修改密码的考生一致
+		if(null != temp_std && temp_std.getId().intValue() != std.getId().intValue()){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("考生ID非法,请重新验证身份信息!");
+			return ajax;
+		}
+		
+		String std_name = apply.getStd_name();
+		if (!StringUtils.isEmpty(std_name) && !std_name.equals(std.getStd_name())) {
+			Pattern pattern = Pattern.compile(
+					"^((?![\\u3000-\\u303F])[\\u2E80-\uFE4F]|\\·)*(?![\\u3000-\\u303F])[\\u2E80-\\uFE4F](\\·)*$");
+			Matcher name = pattern.matcher(std_name);
+			if (!name.matches()) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorCode(1);
+				ajax.setErrorMsg("请输入正确中文姓名且长度在15个字范围内!");
+				return ajax;
+			}
+		}
+		
+		Integer modify_content = apply.getModify_content();
+		
+		if (modify_content == 2 || modify_content == 4 || modify_content == 5) {
+			if (null != apply.getCert_no() && !FrameIdCardUtil.validateIdCard18(apply.getCert_no())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("身份证[" + apply.getCert_no() + "]不合法,不允许变更。");
+				return ajax;
+			}
+
+			StdRegInfo dbStdCertNo = this.stdRegInfoService.findStdByCertNo(apply.getCert_no());
+			// 身份证已使用且不是当前账号
+			if (dbStdCertNo != null && dbStdCertNo.getId().intValue() != std.getId().intValue()) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("身份证号:" + apply.getCert_no() + "在系统中已经存在,不允许变更。");
+				return ajax;
+			}
+
+		}
+
+        if (!StringUtils.isEmpty(apply.getFace_file_path())) {
+            // 变更照片或身份证、照片或姓名、照片,校验考生照片
+            if (apply.getModify_content() == 3 || apply.getModify_content() == 4 || apply.getModify_content() == 6) {
+                String rootPath = SysConst.getAppConfig().getUploadBase();
+                String rtnName = null;
+
+                makeDir(rootPath);
+                rtnName = apply.getFace_file_path();
+
+                String fullFileName = rootPath + rtnName;
+
+                // 获取照片合规检查开关
+                FrameParam loginParam = this.stdRegInfoDao.find(FrameParam.class, "param_name", "photoCompliance");
+
+                // 照片合规检查开关 开启时校验照片合规性
+                if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+                    // ----------------------------照片水印校验开始-------------------------
+                    String response = PhotoUtil.verifyWatermark(fullFileName);
+
+                    // 校验成功
+                    if ("0".equals(response)) {
+                        apply.setPhoto_compliance("1");
+                    } else {
+                        throw new BusinessException(response);
+                    }
+                    // ----------------------------照片水印校验结束-------------------------
+                } else {
+                    apply.setPhoto_compliance("1");
+                }
+
+            }
+
+        }
+
+        if (apply.getId() == null) {
+            apply.setStd_id(std.getId());
+//        	apply.setStd_name(std.getStd_name());
+//        	apply.setCert_no(std.getCert_no());
+            apply.setTicket_no(std.getTicket_no());
+            apply.setStatus(StdConst.StdInfoModifyStatus.locVerify.ordinal());
+            
+            LocalDateTime now = null;
+            StdEnrol time = this.stdEnrolService.getDataBaseTime();
+            if (null != time && null != time.getCreate_time()) {
+                now = time.getCreate_time();
+            } else {
+                now = LocalDateTime.now();
+            }
+            
+            apply.setApply_time(DateHelper.LongDateFormatter.format(now));
+
+            // 旧考生关键信息
+            apply.setOld_cert_no(std.getCert_no());
+            apply.setOld_std_name(std.getStd_name());
+            apply.setOld_photo_url(std.getPhoto_url());
+            apply.setOld_photo_path(std.getPhoto_path());
+            apply.setOld_photo_id(std.getPhoto_id());
+
+            Integer id = this.stdInfoModifyApplyService.insert(apply);
+            this.stdInfoModifyApplyService.updateStdNameById(apply.getStd_name(), id);
+            this.stdInfoModifyApplyService.updateOldStdNameById(apply.getOld_std_name(), id);
+
+            
+        } else {
+            if (apply.getModify_content() == 1 || apply.getModify_content() == 3) {
+                apply.setCert_no("");
+            }
+            if (apply.getModify_content() == 2 || apply.getModify_content() == 4) {
+                apply.setStd_name("");
+            }
+            if (apply.getModify_content() == 3) {
+                apply.setCert_no("");
+                apply.setStd_name("");
+            }
+            if (apply.getModify_content() == 1 || apply.getModify_content() == 2 || apply.getModify_content() == 5) {
+                apply.setFace_file_path("");
+            }
+
+            if (apply.getModify_content() == 6) {
+                apply.setCert_no("");
+            }
+
+            apply.setStatus(StdConst.StdInfoModifyStatus.locVerify.ordinal());
+
+            // 旧考生关键信息
+            apply.setOld_cert_no(std.getCert_no());
+            apply.setOld_std_name(std.getStd_name());
+            apply.setOld_photo_url(std.getPhoto_url());
+            apply.setOld_photo_path(std.getPhoto_path());
+            apply.setOld_photo_id(std.getPhoto_id());
+
+            this.stdInfoModifyApplyService.edit(apply);
+            this.stdInfoModifyApplyService.updateStdNameById(apply.getStd_name(), apply.getId());
+            this.stdInfoModifyApplyService.updateOldStdNameById(apply.getOld_std_name(), apply.getId());
+
+        }
+        
+        // 手机APP在线身份认证通过,则直接归档
+        if(null != temp_std){
+        	getRequest().getSession().removeAttribute("certification_std");
+			this.updateStdInfo2Archive(apply.getId(), "在线身份认证通过");
+		}
+
+        return new Ajax(apply);
+    }
+
+    @RequestMapping("std/stdInfoModifyApply/gpEdit")
+    public Ajax gpEdit(Integer id) {
+        StdInfoModifyApply apply = this.stdInfoModifyApplyService.find(id);
+        StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+        // 校验会话的ID与修改的ID一致性
+        if (null != apply && apply.getStd_id().intValue() != std.getId().intValue()) {
+            Ajax ajax = new Ajax();
+            ajax.setSuccess(false);
+            ajax.setErrorMsg("检测到考生与会话考生不一致,请重新登陆!");
+            return ajax;
+        }
+        
+
+        HashMap<String, Object> rtnMap = new HashMap<String, Object>();
+        rtnMap.put("apply", apply);
+
+        StdRegInfo stdRegInfo = this.stdRegInfoService.find(std.getId());
+        if (stdRegInfo != null) {
+            // 解密考生敏感信息
+            this.stdRegInfoService.DecryptStd(stdRegInfo);
+        }
+
+        rtnMap.put("std", stdRegInfo);
+        rtnMap.put("url", SysConst.getAppConfig().getUploadServerUrl());
+        return new Ajax(rtnMap);
+    }
+
+    @RequestMapping("std/stdInfoModifyApply/upload")
+    public Ajax upload(MultipartFile file) {
+        StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+        String filePath = uploadFile(std, std.getTicket_no(), file);
+        return new Ajax(filePath);
+    }
+
+    private String uploadFile(StdRegInfo std, String pro_code, MultipartFile file) {
+        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+        if (StringHelper.isNotEmpty(extension)) {
+            extension = extension.toLowerCase();
+        }
+
+        // 校验文件类型
+        if (!"jpg".equals(extension) && !"jpeg".equals(extension) && !"png".equals(extension) && !"gif".equals(extension) && !"bmp".equals(extension)) {
+            throw new BusinessException("上传图片必须是JPG/JPEG/PNG/格式!");
+        }
+
+        String cert_no = std.getCert_no();
+        String rootPath = SysConst.getAppConfig().getUploadBase();
+        String rtnName;
+        String fileSeq = this.stdInfoModifyApplyService.getFileSeq();
+        try {
+            makeDir(rootPath);
+            rtnName = SysConst.IMG_SIMA_PREFIX + cert_no + "_" + new Date().getTime() + "_" + fileSeq + "." + extension;
+            String fullFileName = rootPath + rtnName;
+            file.transferTo(new File(fullFileName));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new BusinessException("文件上传错误,请检查文件");
+        }
+        return rtnName;
+    }
+
+    /**
+     * @param rootPath:目录路径 创建目录
+     */
+    private void makeDir(String rootPath) {
+        File dir = new File(rootPath + SysConst.IMG_SIMA_PREFIX);
+        if (!dir.exists())
+            dir.mkdir();
+    }
+
+
+    //@RequestMapping("std/stdInfoModifyApply/add")
+    public Ajax add(StdInfoModifyApply stdInfoModifyApply) {
+        this.stdInfoModifyApplyService.insert(stdInfoModifyApply);
+        return new Ajax();
+    }
+
+    //@RequestMapping("std/stdInfoModifyApply/edit")
+    public Ajax edit(StdInfoModifyApply stdInfoModifyApply) {
+        this.stdInfoModifyApplyService.update(stdInfoModifyApply);
+        return new Ajax();
+    }
+
+    @RequestMapping("std/stdInfoModifyApply/delete")
+    public Ajax delete(Integer[] ids) {
+        StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+        for (Integer id : ids) {
+            this.stdInfoModifyApplyService.deleteStdInfoModifyApplyById(std.getId(), id);
+        }
+
+        return new Ajax();
+    }
+
+    @RequestMapping("std/stdInfoModifyApply/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.stdInfoModifyApplyService.find(id));
+    }
+
+
+    /**
+     * 校验身份证件合法性
+     *
+     * @param stdRegInfo
+     * @return
+     */
+    @RequestMapping("std/stdInfoModifyApply/checkIdentifyCard")
+	public Ajax checkIdentifyCard(StdRegInfo stdRegInfo) {
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	 // 校验会话的ID与修改的ID一致性
+        if (null != std && std.getId().intValue() != stdRegInfo.getId().intValue()) {
+            Ajax ajax = new Ajax();
+            ajax.setSuccess(false);
+            ajax.setErrorCode(1);
+            ajax.setErrorMsg("检测到考生与会话考生不一致,请重新登陆!");
+            return ajax;
+        }
+        
+        HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		paraMap.put("std_reg_id", std.getId());
+		paraMap.put("fee_status", "1");
+		paraMap.put("year_code", YearCodeHelper.getCurrentYearCode());
+		
+		List<StdEnrol> enrolList = this.stdEnrolService.listByMap(paraMap);
+		boolean exist4enrol = false;
+		for (StdEnrol enrol : enrolList) {
+			if (enrol.getStatus() >=4) {
+				exist4enrol = true;
+				break;
+			}
+		}
+		
+		// 存在报考缴费数据,判断是否在不允许变更的时间范围之内
+		if(exist4enrol){
+			 // 获取考生信息变更申请开关
+	        FrameParam loginParam = this.stdRegInfoDao.find(FrameParam.class, "param_name", "stdInfoModifyApplyControl");
+
+	        // 开关打开,则不允许新增申请考生信息变更,提醒内容为Param_value
+	        if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+	        	Ajax ajax = new Ajax();
+	            ajax.setSuccess(false);
+	            ajax.setErrorCode(2);
+	            ajax.setErrorMsg(loginParam.getParam_value());
+	            return ajax;
+	        } 
+		}
+		
+        try {
+            // 调用身份证接口
+            JsonObject identfiy = IdentifyCardOrcUtil.identifyCard(stdRegInfo.getCert_no(), stdRegInfo.getStd_name());
+
+            if (null == identfiy) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,返回报文为空。");
+                return ajax;
+            }
+
+            int code = identfiy.get("code").getAsInt();
+
+            if (code == 1) {
+                if (identfiy.get("data").isJsonArray()) {
+                    // 读取返回的数组
+                    JsonArray identifyCards = identfiy.get("data").getAsJsonArray();
+
+                    // 遍历返回的数组
+                    if (null != identifyCards && identifyCards.size() > 0) {
+                        JsonElement identifyCard = null;
+                        JsonObject data = null;
+                        for (int i = 0; i < identifyCards.size(); i++) {
+                            identifyCard = identifyCards.get(i);
+                            if (null != identifyCard) {
+                                data = identifyCard.getAsJsonObject();
+                            }
+
+                            if (null != data) {
+                                // 姓名
+                                String xm = data.get("xm").getAsString();
+                                // 身份证号
+                                String sfzh = data.get("sfzh").getAsString();
+
+                                // 校验身份证件号与姓名一致
+                                if (stdRegInfo.getCert_no().equals(sfzh) && stdRegInfo.getStd_name().equals(xm)) {
+                                    // 校验身份证件号与姓名一致 则返回
+                                    return new Ajax();
+                                }else {
+                                	Ajax ajax = new Ajax();
+                                    ajax.setSuccess(false);
+                                    ajax.setErrorMsg("身份证认证失败。");
+                                    return ajax;
+                                    
+                                }
+                            }else {
+                            	Ajax ajax = new Ajax();
+                                ajax.setSuccess(false);
+                                ajax.setErrorMsg("身份证认证失败。");
+                                return ajax;
+                            }
+                        }
+
+                        Ajax ajax = new Ajax();
+                        ajax.setSuccess(false);
+                        ajax.setErrorMsg("身份证认证失败。");
+                        return ajax;
+
+                    } else {
+                    	Ajax ajax = new Ajax();
+                        ajax.setSuccess(false);
+                        ajax.setErrorMsg("身份证认证失败,身份证号在公安系统不存在。");
+                        return ajax;
+                    }
+                } else  if (identfiy.get("data").isJsonObject()) {
+                    JsonObject data = identfiy.get("data").getAsJsonObject();
+                    // 姓名
+                    String xm = data.get("XM").getAsString();
+                    // 身份证号
+                    String sfzh = data.get("GMSFHM").getAsString();
+
+                    // 校验身份证件号与姓名一致
+                    if (stdRegInfo.getCert_no().equals(sfzh) && stdRegInfo.getStd_name().equals(xm)) {
+                        // 校验身份证件号与姓名一致 则返回
+                        return new Ajax();
+                    }else {
+                    	Ajax ajax = new Ajax();
+                        ajax.setSuccess(false);
+                        ajax.setErrorMsg("身份证认证失败。");
+                        return ajax;
+                    }
+                }else {
+                	Ajax ajax = new Ajax();
+                    ajax.setSuccess(false);
+                    ajax.setErrorMsg("身份证认证失败,身份证号在公安系统不存在。");
+                    return ajax;
+                }
+
+            } else if (code == 2) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,身份证号在公安系统不存在。");
+                return ajax;
+            } else if (code == 3) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,查询超时。");
+                return ajax;
+            } else if (code == 4) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,查询出错。");
+                return ajax;
+            } else if (code == 5) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,解释出错(报文格式不对)。");
+                return ajax;
+            } else if (code == 6) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,禁止访问(无权限)。");
+                return ajax;
+            } else if (code == 7) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,查询条件匹配为误(无法构造查询条件)。");
+                return ajax;
+            } else if (code == 8) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,禁止访问(服务已停用)。");
+                return ajax;
+            } else if (code == 9) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,禁止访问(服务已过期)。");
+                return ajax;
+            } else if (code == 10) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,禁止访问(服务不在开放时段内)。");
+                return ajax;
+            } else if (code == 11) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,禁止访问(访问人信息为空或不全)。");
+                return ajax;
+            } else if (code == -49) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,查询出错:非工作时间,服务器被拒绝。");
+                return ajax;
+            } else if (code == -50) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,查询出错:公民身份号码或姓名为空。");
+                return ajax;
+            } else if (code == -51) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,查询出错:公民身份号码或姓名超长。");
+                return ajax;
+            } else if (code == 201) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,查询出错:参数提交方式有误,或有参数为空。");
+                return ajax;
+            } else if (code == 0) {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,查询出错:接口连接异常。");
+                return ajax;
+            } else {
+            	Ajax ajax = new Ajax();
+                ajax.setSuccess(false);
+                ajax.setErrorMsg("身份证认证失败,错误码:" + code+"。");
+                return ajax;
+            }
+
+        } catch (Exception e) {
+            LogHelper.error(e);
+            Ajax ajax = new Ajax();
+            ajax.setSuccess(false);
+            ajax.setErrorMsg("身份证认证接口异常。");
+            return ajax;
+        }
+    }
+
+    /**
+     * 实名认证 身份证认证通过,照片审核通过才进行实名认证 且实名认证未通过
+     *
+     * @param dbStd
+     * @return
+     */
+    @RequestMapping("std/stdInfoModifyApply/doCertification")
+	public Ajax doCertification(StdRegInfo dbStd, String face_image_url) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		// 校验会话的ID与修改的ID一致性
+		if (null != std && std.getId().intValue() != dbStd.getId().intValue()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(1);
+			ajax.setErrorMsg("检测到考生与会话考生不一致,请重新登陆!");
+			return ajax;
+		}
+	
+
+		FrameParam doCertificationParam = stdRegInfoDao.find(FrameParam.class, "param_name", "doCertification");
+		Integer doCertification = Integer.valueOf(doCertificationParam.getParam_value());
+		
+		StdRegInfo stdRegInfo = stdRegInfoDao.find(std.getId());
+		Integer certification = stdRegInfo.getCertification();
+		if (certification >= doCertification) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			
+			ajax.setErrorMsg("在线身份认证" + doCertification + "次已用完。");
+			ajax.setEntity("doCertificationFial");
+			return ajax;
+		}
+
+		// 证件号验证
+		String cert_no = dbStd.getCert_no();
+		String result_info = null;
+    	StdCompareFeature stdCompareFeature = new StdCompareFeature();
+    	stdCompareFeature.setStd_reg_id(std.getId());
+    	
+
+		
+		if (cert_no.length() == 18) {
+			
+			String pass_score = null;
+
+			FrameParam loginParam = stdRegInfoDao.find(FrameParam.class, "param_name", "featureScore");
+			pass_score = loginParam.getParam_value();
+
+			// 区内考生
+
+			if (cert_no.startsWith("45")) {
+				// 获取 广西区内身份证照片
+				JsonObject identfiy = IdentifyCardOrcUtil.identifyCardImage(dbStd.getCert_no().toUpperCase(),
+						dbStd.getStd_name());
+
+				if (identfiy.get("code").getAsInt() == 1) {
+					String feature1 = null;
+					String feature2 = null;
+					JsonObject data = identfiy.get("data").getAsJsonObject();
+					String photoData = data.get("photoData").getAsString();
+
+					if (null != photoData) {
+						long time = new Date().getTime();
+
+						String fileName = SysConst.getAppConfig().getDownloadTemp() + SysConst.IMG_FACE_PREFIX
+								+ dbStd.getCert_no() + "_" + time + ".jpg";
+						// base64 to image
+						File tempFile = IdentifyCardOrcUtil.base64StringToImage(photoData, fileName);
+
+						// ----------------------------特征值获取开始-------------------------
+						Map<String, String> result = PhotoUtil.getExtractFeature(fileName);
+						// 删除临时照片
+						if (null != tempFile && tempFile.exists()) {
+							tempFile.delete();
+						}
+						// 成功
+						if ("0".equals(result.get("code").toString())) {
+							feature2 = result.get("msg");
+						} else {
+							Ajax ajax = new Ajax();
+							ajax.setSuccess(false);
+							result_info = "身份证照片特征值获取失败:"+result.get("msg");
+							stdCompareFeature.setResponse(result_info);
+							this.setStdCompareFeature(stdCompareFeature);
+							ajax.setErrorMsg(result_info);
+							return ajax;
+						}
+
+						// ----------------------------特征值获取结束-------------------------
+						String std_fullFileName;
+						File std_photo = null;
+						if (!StringUtils.isEmpty(face_image_url)) {
+							String rootPath = SysConst.getAppConfig().getUploadBase();
+							std_fullFileName = rootPath + face_image_url;
+							std_photo = new File(std_fullFileName);
+						} else {
+
+							// 下载考生照片
+							FileOutputStream fos = null;
+							time = new Date().getTime();
+							std_fullFileName = SysConst.getAppConfig().getDownloadTemp() + SysConst.IMG_FACE_PREFIX
+									+ dbStd.getCert_no() + "_" + time + ".jpg";
+							try {
+								// 从恒生文件服务器下载照片
+								DownloadVO vo = XcDfsClient.download(stdRegInfoDao.find(dbStd.getId()).getPhoto_path());
+								// 创建临时照片文件
+								std_photo = new File(std_fullFileName);
+								fos = new FileOutputStream(std_photo);
+
+								// 读取恒生照片流量
+								InputStream in = new ByteArrayInputStream(vo.getContent());
+
+								// 将恒生照片流写入临时照片文件
+								int len = 0;
+								byte[] buf = new byte[1024];
+								while ((len = in.read(buf)) != -1) {
+									fos.write(buf, 0, len);
+								}
+
+								fos.flush();
+								fos.close();
+
+							} catch (Exception e) {
+								if (null != fos) {
+									try {
+										fos.close();
+									} catch (IOException e1) {
+										LogHelper.error(e1);
+									}
+								}
+
+								LogHelper.error(e);
+
+								// 失败
+								Ajax ajax = new Ajax();
+								ajax.setSuccess(false);
+								result_info = "照片下载失败。";
+								stdCompareFeature.setResponse(result_info+e.getMessage());
+								this.setStdCompareFeature(stdCompareFeature);
+								ajax.setErrorMsg(result_info);
+								return ajax;
+							}
+
+						}
+
+						// ----------------------------特征值获取开始-------------------------
+						result = PhotoUtil.getExtractFeature(std_fullFileName);
+						if (StringUtils.isEmpty(face_image_url) && null != std_photo && std_photo.exists()) {
+							std_photo.delete();
+						}
+						// 成功
+						if ("0".equals(result.get("code").toString())) {
+							feature1 = result.get("msg");
+						} else {
+							Ajax ajax = new Ajax();
+							ajax.setSuccess(false);
+							result_info = "照片特征值获取失败:"+result.get("msg");
+							stdCompareFeature.setResponse(result_info);
+							this.setStdCompareFeature(stdCompareFeature);
+							ajax.setErrorMsg(result_info);
+							return ajax;
+						}
+
+						// ----------------------------特征值获取结束-------------------------
+
+						// ----------------------------特征值对比开始-------------------------
+						Map<String, String> map = PhotoUtil.compareFeature(feature1, feature2);
+						String score = null;
+						// 成功
+						if ("0".equals(map.get("code"))) {
+							score = map.get("msg");
+
+							BigDecimal pass_scoreDecimal = new BigDecimal(pass_score);
+							BigDecimal scoreDecimal = new BigDecimal(score);
+							
+							// 设置照片比对次数(不管是否成功)
+							doCertificationFialExt(std.getId());
+
+							// 特征值比较得分小于设置的分数,对比不通过
+							if (scoreDecimal.compareTo(pass_scoreDecimal) < 0) {
+								Ajax ajax = new Ajax();
+								ajax.setSuccess(false);
+								result_info = "照片对比不一致。";
+								stdCompareFeature.setResponse(result_info+"得分:"+scoreDecimal.toString());
+								this.setStdCompareFeature(stdCompareFeature);
+								ajax.setErrorMsg(result_info);
+								return ajax;
+							} else {
+								// 设置验证通过的考生信息到临时会话中,在认证通过时校验
+								HttpSession session = getSession();
+								session.setAttribute("certification_std", std);
+								
+								result_info = "实名认证成功";
+								stdCompareFeature.setResponse(result_info);
+								this.setStdCompareFeature(stdCompareFeature);
+								
+								return new Ajax(result_info);
+							}
+
+						} else {
+							Ajax ajax = new Ajax();
+							ajax.setSuccess(false);
+							result_info = "照片对比失败:"+map.get("msg");
+							stdCompareFeature.setResponse(result_info);
+							this.setStdCompareFeature(stdCompareFeature);
+							ajax.setErrorMsg(result_info);
+							return ajax;
+						}
+					}else{
+						Ajax ajax = new Ajax();
+						ajax.setSuccess(false);
+						result_info = "获取 广西区内身份证照片失败:身份证照片数据为空。";
+						stdCompareFeature.setResponse(result_info);
+						this.setStdCompareFeature(stdCompareFeature);
+						ajax.setErrorMsg(result_info);
+						return ajax;
+					}
+
+				} else {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					result_info = "获取 广西区内身份证照片失败,错误码:"+identfiy.get("code").getAsInt() ;
+					stdCompareFeature.setResponse(result_info);
+					this.setStdCompareFeature(stdCompareFeature);
+					ajax.setErrorMsg(result_info);
+					return ajax;
+				}
+			} else {
+				// 区外考生
+
+				// 下载考生照片
+				String fullFileName;
+				File photo = null;
+				if (!StringUtils.isEmpty(face_image_url)) {
+					String rootPath = SysConst.getAppConfig().getUploadBase();
+					fullFileName = rootPath + face_image_url;
+					photo = new File(fullFileName);
+				} else {
+
+					// 下载考生照片
+					FileOutputStream fos = null;
+					long time = new Date().getTime();
+					fullFileName = SysConst.getAppConfig().getDownloadTemp() + SysConst.IMG_FACE_PREFIX
+							+ dbStd.getCert_no() + "_" + time + ".jpg";
+					try {
+						// 从恒生文件服务器下载照片
+						DownloadVO vo = XcDfsClient.download(stdRegInfoDao.find(dbStd.getId()).getPhoto_path());
+						// 创建临时照片文件
+						photo = new File(fullFileName);
+						fos = new FileOutputStream(photo);
+
+						// 读取恒生照片流量
+						InputStream in = new ByteArrayInputStream(vo.getContent());
+
+						// 将恒生照片流写入临时照片文件
+						int len = 0;
+						byte[] buf = new byte[1024];
+						while ((len = in.read(buf)) != -1) {
+							fos.write(buf, 0, len);
+						}
+
+						fos.flush();
+						fos.close();
+
+					} catch (Exception e) {
+						if (null != fos) {
+							try {
+								fos.close();
+							} catch (IOException e1) {
+								LogHelper.error(e1);
+							}
+						}
+
+						LogHelper.error(e);
+
+						// 失败
+						Ajax ajax = new Ajax();
+						ajax.setSuccess(false);
+						result_info = "下载照片失败。";
+						stdCompareFeature.setResponse(result_info+e.getMessage());
+						this.setStdCompareFeature(stdCompareFeature);
+						ajax.setErrorMsg(result_info);
+						return ajax;
+					}
+
+				}
+
+				String imgString = IdentifyCardOrcUtil.imageToBase64Str(photo);
+
+				String url = SysConst.getAppConfig().getCertificationUrl();
+				String account = SysConst.getAppConfig().getCertificationAccount();
+				String playKey = SysConst.getAppConfig().getCertificationPlayKey();
+
+				Map<String, String> paraMap = new HashMap<String, String>();
+				paraMap.put("account", account);
+				paraMap.put("name", dbStd.getStd_name());
+				paraMap.put("idNumber", cert_no);
+				paraMap.put("databaseImageContent", imgString);
+				String sign = SecureHelper.md5(SecureHelper.md5(account + cert_no) + playKey);
+				paraMap.put("sign", sign);
+
+				HttpResult httpResult = null;
+				String response = null;
+				JsonObject json = null;
+
+				try {
+
+					httpResult = HttpUtil.doPostJson(url, JsonHelper.fromObject(paraMap));
+					int statusCode = httpResult.getStatusCode();
+					if (200 == statusCode) {
+						response = httpResult.getResponse();
+						if (null != response) {
+							json = new JsonParser().parse(response).getAsJsonObject();
+							int code = json.get("code").getAsInt();
+							if (code == 200) {
+								// 成功返回
+								String faceID = json.get("data").getAsJsonObject().get("faceID").getAsString();
+
+								// 设置照片比对次数(不管是否成功)
+								doCertificationFialExt(std.getId());
+								
+								// 认证通过
+								if ("4000".equals(faceID)) {
+									String score = json.get("data").getAsJsonObject().get("facescore").getAsString();
+									BigDecimal pass_scoreDecimal = new BigDecimal(pass_score);
+									BigDecimal scoreDecimal = new BigDecimal(score);
+									scoreDecimal = scoreDecimal.multiply(new BigDecimal(100));
+									
+									// 特征值比较得分小于设置的分数,对比不通过
+									if (scoreDecimal.compareTo(pass_scoreDecimal) < 0) {
+
+										Ajax ajax = new Ajax();
+										ajax.setSuccess(false);
+										result_info = "照片对比不一致。";
+										stdCompareFeature.setResponse(result_info+"得分:"+scoreDecimal.toString());
+										this.setStdCompareFeature(stdCompareFeature);
+										ajax.setErrorMsg(result_info);
+										return ajax;
+									} else {
+										// 设置验证通过的考生信息到临时会话中,在认证通过时校验
+										HttpSession session = getSession();
+										session.setAttribute("certification_std", std);
+										result_info = "实名认证成功。";
+										stdCompareFeature.setResponse(result_info);
+										this.setStdCompareFeature(stdCompareFeature);
+										return new Ajax(result_info);
+									}
+								} else {
+									
+									Ajax ajax = new Ajax();
+									ajax.setSuccess(false);
+									result_info = "照片对比失败,对比结果码:"+faceID;
+									stdCompareFeature.setResponse(result_info);
+									this.setStdCompareFeature(stdCompareFeature);
+									ajax.setErrorMsg(result_info);
+									return ajax;
+								}
+
+							} else {
+								Ajax ajax = new Ajax();
+								ajax.setSuccess(false);
+								result_info = "照片对比失败,错误码:" + code + "。";
+								stdCompareFeature.setResponse(result_info);
+								this.setStdCompareFeature(stdCompareFeature);
+								ajax.setErrorMsg(result_info);
+								return ajax;
+							}
+						}
+
+					} else {
+						Ajax ajax = new Ajax();
+						ajax.setSuccess(false);
+						result_info = "照片对比失败,状态码:" + statusCode + "。";
+						stdCompareFeature.setResponse(result_info);
+						this.setStdCompareFeature(stdCompareFeature);
+						ajax.setErrorMsg(result_info);
+						return ajax;
+					}
+
+				} catch (Exception e) {
+					LogHelper.error(e);
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					result_info = "照片对比失败," + e.getMessage();
+					stdCompareFeature.setResponse(result_info);
+					this.setStdCompareFeature(stdCompareFeature);
+					ajax.setErrorMsg("照片对比失败");
+					return ajax;
+				}
+
+				if (StringUtils.isEmpty(face_image_url) && null != photo && photo.exists()) {
+					photo.delete();
+				}
+				
+				
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				result_info = "照片对比失败。";
+				stdCompareFeature.setResponse(result_info);
+				this.setStdCompareFeature(stdCompareFeature);
+				ajax.setErrorMsg(result_info);
+				return ajax;
+			}
+
+		}else{
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			result_info = "照片比对失败:非18位身份证号。";
+			ajax.setErrorMsg(result_info);
+			this.setStdCompareFeature(stdCompareFeature);
+			return ajax;
+		}
+		
+	}
+    
+    private void setStdCompareFeature(StdCompareFeature stdCompareFeature){
+    	this.stdCompareFeatureDao.insert(stdCompareFeature);
+    }
+
+    //@RequestMapping("std/stdInfoModifyApply/updateStdInfo2Archive")
+    public Ajax updateStdInfo2Archive(Integer apply_id, String verify_remark2) {
+    	StdInfoModifyApply dbApply = this.stdInfoModifyApplyService.find(apply_id);
+		
+        StdRegInfo dbStd = this.stdRegInfoService.find(dbApply.getStd_id());
+        if (null != dbStd) {
+            //解密考生信息
+            this.stdRegInfoService.DecryptStd(dbStd);
+        }
+
+        Integer modify_content = dbApply.getModify_content();
+        
+        if (modify_content == 1) {
+            dbStd.setStd_name(dbApply.getStd_name());
+        } else if (modify_content == 2) {
+            dbStd.setCert_no(dbApply.getCert_no());
+        } else if (modify_content == 3) {
+            dbStd.setPhoto_url(dbApply.getFace_file_path());
+
+            String fullFileName = SysConst.getAppConfig().getUploadBase() + dbApply.getFace_file_path();
+
+            // ----------------------------特征值获取开始-------------------------
+			/*Map<String, String> result = PhotoUtil.getExtractFeature(fullFileName);
+
+			// 成功
+			if ("0".equals(result.get("code").toString())) {
+				dbStd.setFeature(result.get("msg"));
+
+			} else {
+				// 失败
+				throw new BusinessException(result.get("msg"));
+			}*/
+
+            // ----------------------------特征值获取结束-------------------------
+
+            // ----------------------------考生照片上传恒生文件服务器开始-------------------------
+            UploadVO uploadVO = XcDfsClient.uploadStream(fullFileName);
+            List<UploadItemVO> uploadItems = uploadVO.getList();
+            if (null != uploadItems && !uploadItems.isEmpty()) {
+                UploadItemVO vo = uploadItems.get(0);
+                dbStd.setPhoto_path(vo.getFilePath());
+                dbStd.setPhoto_id(vo.getId());
+            } else {
+                throw new BusinessException("考生照片上传文件服务器失败,请联系系统管理员!");
+            }
+            // ----------------------------考生照片上传恒生文件服务器结束-------------------------
+
+            // 更新照片,更新照片合规校验标识 和特征值
+            dbStd.setPhoto_compliance(dbApply.getPhoto_compliance());
+
+        } else if (modify_content == 4) {
+            dbStd.setCert_no(dbApply.getCert_no());
+            dbStd.setPhoto_url(dbApply.getFace_file_path());
+
+            String fullFileName = SysConst.getAppConfig().getUploadBase() + dbApply.getFace_file_path();
+
+            // ----------------------------特征值获取开始-------------------------
+			/*Map<String, String> result = PhotoUtil.getExtractFeature(fullFileName);
+
+			// 成功
+			if ("0".equals(result.get("code").toString())) {
+				dbStd.setFeature(result.get("msg"));
+
+			} else {
+				// 失败
+				throw new BusinessException(result.get("msg"));
+			}
+	    	*/
+            // ----------------------------特征值获取结束-------------------------
+
+            // ----------------------------考生照片上传恒生文件服务器开始-------------------------
+            UploadVO uploadVO = XcDfsClient
+                    .uploadStream(fullFileName);
+            List<UploadItemVO> uploadItems = uploadVO.getList();
+            if (null != uploadItems && !uploadItems.isEmpty()) {
+                UploadItemVO vo = uploadItems.get(0);
+                dbStd.setPhoto_path(vo.getFilePath());
+                dbStd.setPhoto_id(vo.getId());
+            } else {
+                throw new BusinessException("考生照片上传文件服务器失败,请联系系统管理员!");
+            }
+            // ----------------------------考生照片上传恒生文件服务器结束-------------------------
+
+            // 更新照片,更新照片合规校验标识 和特征值
+            dbStd.setPhoto_compliance(dbApply.getPhoto_compliance());
+
+        } else if (modify_content == 5) {
+            dbStd.setCert_no(dbApply.getCert_no());
+            dbStd.setStd_name(dbApply.getStd_name());
+        } else if (modify_content == 6) {
+            dbStd.setStd_name(dbApply.getStd_name());
+            dbStd.setPhoto_url(dbApply.getFace_file_path());
+
+            String fullFileName = SysConst.getAppConfig().getUploadBase() + dbApply.getFace_file_path();
+
+            // ----------------------------特征值获取开始-------------------------
+			/*Map<String, String> result = PhotoUtil.getExtractFeature(fullFileName);
+
+			// 成功
+			if ("0".equals(result.get("code").toString())) {
+				dbStd.setFeature(result.get("msg"));
+
+			} else {
+				// 失败
+				throw new BusinessException(result.get("msg"));
+			}*/
+
+            // ----------------------------特征值获取结束-------------------------
+
+            // ----------------------------考生照片上传恒生文件服务器开始-------------------------
+            UploadVO uploadVO = XcDfsClient
+                    .uploadStream(fullFileName);
+            List<UploadItemVO> uploadItems = uploadVO.getList();
+            if (null != uploadItems && !uploadItems.isEmpty()) {
+                UploadItemVO vo = uploadItems.get(0);
+                dbStd.setPhoto_path(vo.getFilePath());
+                dbStd.setPhoto_id(vo.getId());
+            } else {
+                throw new BusinessException("考生照片上传文件服务器失败,请联系系统管理员!");
+            }
+            // ----------------------------考生照片上传恒生文件服务器结束-------------------------
+
+            // 更新照片,更新照片合规校验标识 和特征值
+            dbStd.setPhoto_compliance(dbApply.getPhoto_compliance());
+
+        }
+        if (!org.springframework.util.StringUtils.isEmpty(dbStd.getCert_no()) && dbStd.getCert_no().length() == 18) {
+            dbStd.setStd_birth(dbStd.getCert_no().substring(6, 10) + "" + dbStd.getCert_no().substring(10, 12) + "" + dbStd.getCert_no().substring(12, 14));
+            dbStd.setStd_sex((Integer.valueOf(dbStd.getCert_no().charAt(16)) & 1) == 1 ? "1" : "2");
+        } else {
+            dbStd.setStd_birth("");
+            dbStd.setStd_sex("");
+        }
+
+        // 加密考生信息
+        this.stdRegInfoService.EncryptStd(dbStd);
+		dbStd.setIs_certification("1");
+        stdRegInfoService.update(dbStd);
+        //添加日志
+        this.logService.insertStdRegLog(dbStd, StdConst.OperType.UPDATE.ordinal());
+        return this.archive(apply_id, verify_remark2);
+    }
+
+    private Ajax archive(Integer apply_id, String verify_remark2) {
+        StdInfoModifyApply dbApply = this.stdInfoModifyApplyService.find(apply_id);
+       
+        dbApply.setStatus(StdConst.StdInfoModifyStatus.archive.ordinal());
+        
+        LocalDateTime now = null;
+        StdEnrol time = this.stdEnrolService.getDataBaseTime();
+        if (null != time && null != time.getCreate_time()) {
+            now = time.getCreate_time();
+        } else {
+            now = LocalDateTime.now();
+        }
+        
+        dbApply.setVerify_time2(cn.hmsoft.helper.DateHelper.LongDateFormatter.format(now));
+       
+        if (!StringUtils.isEmpty(verify_remark2)) {
+            dbApply.setVerify_remark2(verify_remark2);
+        }
+
+        this.stdInfoModifyApplyService.update(dbApply);
+        return new Ajax();
+    }
+    
+    private boolean doCertificationFialExt(Integer id) {
+		StdRegInfo stdRegInfo = stdRegInfoDao.find(id);
+		Integer certification = stdRegInfo.getCertification();
+		certification++;
+		stdRegInfo.setCertification(certification);
+		this.stdRegInfoService.update(stdRegInfo);
+		return true;
+	}
+
+}

+ 74 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdMajorControl.java

@@ -0,0 +1,74 @@
+package cn.hmsoft.ses.control.std;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.data.model.std.StdMajor;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.service.iface.std.IStdMajorService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ * 学生和专业对应表 控制器.
+ * 
+ * @author: yangwei
+ * @date: 2018-10-17 10:39:13
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdMajorControl extends AjaxControl{
+
+    @Autowired
+    private IStdMajorService stdMajorService;
+	
+    
+    /**
+     * @return 考生报考的专业
+     */
+    @RequestMapping("std/stdMajor/list")
+    public Ajax list() {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		List<StdMajor> list = this.stdMajorService.listStdMajor(std.getId());
+        return new Ajax(list);
+    }
+    
+    
+    //@RequestMapping("std/stdMajor/add")
+    public Ajax addStdMajor(final StdMajor stdMajor) {
+        this.stdMajorService.insert(stdMajor);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("std/stdMajor/edit")
+    public Ajax editStdMajor(final StdMajor stdMajor) {
+        this.stdMajorService.edit(stdMajor);
+        return new Ajax();
+    }
+    
+   // @RequestMapping("std/stdMajor/delete")
+    public Ajax deleteStdMajor(final Integer id) {
+        this.stdMajorService.delete(id);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("std/stdMajor/deleteBatch")
+    public Ajax deleteStdMajor(final Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.stdMajorService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("std/stdMajor/get")
+    public Ajax getStdMajorById(final Integer id) {
+        return new Ajax(this.stdMajorService.find(id));
+    }    
+}

+ 312 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdQueryControl.java

@@ -0,0 +1,312 @@
+package cn.hmsoft.ses.control.std;
+
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.ses.constants.CfConst.CfOperateTimeType;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.StdConst;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.dao.std.StdEnrolDao;
+import cn.hmsoft.ses.data.model.pl.PlExamTime;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.data.model.std.StdTicket;
+import cn.hmsoft.ses.helper.YearCodeHelper;
+import cn.hmsoft.ses.service.iface.cf.ICfOperateTimeService;
+import cn.hmsoft.ses.service.iface.pl.IPlExamTimeService;
+import cn.hmsoft.ses.service.iface.std.IStdEnrolService;
+import cn.hmsoft.ses.service.iface.std.IStdTicketService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 考生报考信息 考生的所有报考信息。kw_baokaoxinxi 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2018-10-19 16:46:20
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdQueryControl extends AjaxControl{
+
+	@Autowired
+    private IStdEnrolService stdEnrolService;
+
+    @Autowired
+    private IPlExamTimeService plExamTimeService;
+    @Autowired
+    private ICfOperateTimeService operateTimeService;
+    @Autowired
+    private IStdTicketService stdTicketService;
+    
+    @Autowired
+    private StdEnrolDao stdEnrolDao;
+    
+    
+    private Integer getTimeControlType(Integer special_flag){
+    	//统考 0 --> 20  机考  1--> 19
+    	Integer timeControlType = 0;
+    	switch (special_flag) {
+		case 1:
+			timeControlType = 20;
+			break;
+		case 2:
+			timeControlType = 19;
+			break;
+		default:
+			break;
+		}
+		return timeControlType;
+    }
+	
+    /**
+     *  查询课程考试地点
+     */
+    /**
+     * @param special_flag
+     * @return
+     */
+    @RequestMapping("std/enrol/examCourseSeatedList")
+	public Ajax examCourseSeatedList(Integer special_flag) {
+    	Integer temp_special_flag = special_flag;
+    	if(null == temp_special_flag){
+    		temp_special_flag = 1;
+    	}
+    	
+    	Map<String,Object> map = new HashMap<String,Object>();
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		//报考课程考务查询时间
+		map.put("timeControl", this.stdEnrolService.getTimeControl(getTimeControlType(temp_special_flag)));
+		map.put("isInTimeControl", this.stdEnrolService.isInTimeControl(getTimeControlType(temp_special_flag)));
+		map.put("courseList", this.stdEnrolService.listEnrolCourseSeated(
+				YearCodeHelper.getCurrentYearCode(), 
+				std.getId(), 
+				special_flag, //统考机考
+				StdConst.StdEnrolStatus.LAYOUT.ordinal()));
+		return new Ajax(map);
+	}
+    
+    /**科目考试地点
+     * @param course_id
+     * @param enrol_id
+     * @return
+     */
+    @RequestMapping("std/enrol/examCourseLocation")
+	public Ajax examCourseLocation(Integer course_id, Integer enrol_id) {
+    	Map<String,Object> map = new HashMap<String,Object>();
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		Map<String, Object> examCourseLocationMap = this.stdEnrolService.getExamCourseLocation(enrol_id,course_id);
+		examCourseLocationMap.put("ticket_no", std.getTicket_no());
+		map.put("examCourseLocation", examCourseLocationMap);
+		return new Ajax(map);
+	}
+    
+    @RequestMapping("std/enrol/examCourseLocationTimeControl")
+	public Ajax examCourseLocationTimeControl(Integer special_flag){
+    	Map<String,Object> map = new HashMap<String,Object>();
+		//报考课程考务查询时间
+		map.put("timeControl", this.stdEnrolService.getTimeControl(getTimeControlType(special_flag)));
+		return new Ajax(map);
+    }
+    
+    /**查询所有的已缴费科目考点信息
+     * @param special_flag
+     * @return
+     */
+    @RequestMapping("std/enrol/examCourseLocationAll")
+    public Ajax examCourseLocationAll(Integer special_flag){
+    	Integer temp_special_flag = special_flag;
+    	if(null == temp_special_flag){
+    		temp_special_flag = 1;
+    	}
+    	
+    	boolean isInTimeControl = this.stdEnrolService.isInTimeControl(getTimeControlType(temp_special_flag));
+    	// 时间未开放,不允许查询
+		if(!isInTimeControl){
+			LogHelper.error("不在考试考场查询时间内,暂不允许查询");
+			throw new BusinessException("不在考试考场查询时间内,暂不允许查询");
+		}else{
+			// 20220405 蓝剑
+			// 准考证下载已开放,按客户要求柳州市直暂时不允许下载准考证,提醒:因系统调整原因,柳州市考区考生准考证打印功能暂时关闭,开放时间另行通知,谢谢您的理解和支持。
+			FrameParam loginParam = this.stdEnrolDao.find(FrameParam.class, "param_name", "special_downTicket");
+
+			if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+				StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+				boolean exist = this.stdEnrolService.existStdEnrolByStdAndAgent(std.getId(),
+						YearCodeHelper.getCurrentYearCode(), loginParam.getParam_value());
+				if (exist) {
+					throw new BusinessException(loginParam.getParam_desc());
+				}
+			}
+			
+			StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+	    	//查询所有状态为6的所有科目信息
+	    	List<Map<String, Object>> listEnrolCourseSeated = this.stdEnrolService.listEnrolCourseSeated(
+					YearCodeHelper.getCurrentYearCode(), 
+					std.getId(), 
+					special_flag, //统考机考
+					StdConst.StdEnrolStatus.LAYOUT.ordinal());
+	    	List<Map<String, Object>> rtnList = new ArrayList<Map<String, Object>>();
+	    	//迭代所有科目信息的考点信息
+	    	for (Map<String, Object> map : listEnrolCourseSeated) {
+	    		Integer course_id = Integer.parseInt(map.get("course_id") + "");
+	    		Integer enrol_id = Integer.parseInt(map.get("enrol_id") + "");
+	    		Map<String, Object> examCourseLocationMap = this.stdEnrolService.getExamCourseLocation(enrol_id,course_id);
+	    		if(null != examCourseLocationMap){
+	    			examCourseLocationMap.put("ticket_no", std.getTicket_no());
+	    			rtnList.add(examCourseLocationMap);
+	    		}
+	    		
+			}
+	    	return new Ajax(rtnList);
+		}
+    }
+    
+    /**下载考试科目地点PDF
+     * @param course_id
+     * @param enrol_id
+     */
+    @RequestMapping("std/enrol/downExamCourseLocation")
+	public void downExamCourseLocation(Integer[] course_ids, Integer[] enrol_ids,Integer special_flag) {
+    	try {
+    		boolean isInTimeControl = this.stdEnrolService.isInTimeControl(getTimeControlType(special_flag));
+    		if(!isInTimeControl){
+    			LogHelper.error("不在考试考场查询时间内,暂不允许下载");
+    			throw new BusinessException("不在考试考场查询时间内,暂不允许下载");
+    		}
+    		
+    		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    		
+    		//fileName无效 目前前端生成文件名
+			String fileName = "考场通知单.pdf";
+			this.downloadFile(this.stdEnrolService.downExamCourseLocation(course_ids, enrol_ids, std ), fileName,true);
+		}catch(Exception e){
+			this.writeAlert(e.getMessage());
+		}
+	}
+    
+    /**准考证下载
+     * @param course_id
+     * @param enrol_id
+     */
+    @RequestMapping("std/enrol/downTicket")
+  	public void downTicket() {
+		try {
+			boolean isInTime = this.operateTimeService.isInTime(CfOperateTimeType.ticketDownload.ordinal(), null);
+			if (!isInTime) {
+				LogHelper.error("不在下载时间内,暂不允许下载准考证");
+				throw new BusinessException("不在下载时间内,暂不允许下载准考证");
+			}
+			
+			// 20220405 蓝剑 准考证下载已开放,按客户要求柳州市直暂时不允许下载准考证,提醒:因系统调整原因,柳州市考区考生准考证打印功能暂时关闭,开放时间另行通知,谢谢您的理解和支持。
+			FrameParam loginParam = this.stdEnrolDao.find(FrameParam.class, "param_name", "special_downTicket");
+
+			if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+				StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+				boolean exist = this.stdEnrolService.existStdEnrolByStdAndAgent(std.getId(),
+						YearCodeHelper.getCurrentYearCode(),loginParam.getParam_value());
+				if (exist) {
+					this.downloadFile(this.stdEnrolService.specialDownTicket(std,loginParam.getParam_desc()), "准考证.pdf", true);
+					return;
+				}
+			}
+	        
+
+			StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+			List<PlExamTime> timeList = this.plExamTimeService.list("year_code", YearCodeHelper.getCurrentYearCode());
+			Integer exam_time_id = timeList.get(0).getId();
+
+			// 查询准考证表
+			StdTicket stdTicket = this.stdTicketService.queryStdTicketByTicket(exam_time_id, std.getTicket_no());
+
+			// 准考证为空,则生成准考证
+			if (null == stdTicket || null == stdTicket.getTicket_file()) {
+				this.downloadFile(this.stdEnrolService.downTicket(std), "准考证.pdf", true);
+			} else {
+				// 准考证不为空,则直接下载已生成的准考证
+				String path = SysConst.getAppConfig().getUploadBase();
+
+				File tempFile = new File(path + stdTicket.getTicket_file());
+				this.downloadFile(tempFile, "准考证.pdf", false);
+			}
+
+		}catch(Exception e){
+  			this.writeAlert(e.getMessage());
+  		}
+  	}
+    
+	protected void downloadFile(File file, String file_name, boolean delete) {
+		HttpServletResponse response = this.getResponse();
+		BufferedInputStream br = null;
+		OutputStream outStream = null;
+		try {
+
+			if (!file.exists()) {
+				LogHelper.error("File not found!");
+				response.sendError(404, "File not found!");
+			}
+
+			br = new BufferedInputStream(new FileInputStream(file));
+			byte[] buf = new byte[1024];
+			int len = 0;
+
+			String fName = new String(file_name.getBytes(), "ISO-8859-1");
+
+			response.reset();
+			response.setContentType("application/octet-stream");
+			response.setHeader("Content-Disposition", "attachment; filename=" + fName);
+			outStream = response.getOutputStream();
+			while ((len = br.read(buf)) > 0){
+				outStream.write(buf, 0, len);
+			}
+
+			if (null != file && delete) {
+				try {
+					file.delete();
+				} catch (Exception e) {
+					LogHelper.error(e);
+				}
+			}
+
+		} catch (Exception e) {
+			LogHelper.error(e);
+		} finally {
+			if (null != br) {
+				try {
+					br.close();
+				} catch (Exception e) {
+					LogHelper.error(e);
+				}
+
+			}
+
+			if (null != outStream) {
+				try {
+					outStream.close();
+				} catch (Exception e) {
+					LogHelper.error(e);
+				}
+
+			}
+		}
+
+	}
+    
+       
+}

+ 350 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdRefundControl.java

@@ -0,0 +1,350 @@
+package cn.hmsoft.ses.control.std;
+
+import java.io.File;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import cn.hmsoft.frame.data.model.FrameDict;
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.service.IFrameParamService;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.constants.CfConst.CfOperateTimeType;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.model.std.StdRefund;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.helper.YearCodeHelper;
+import cn.hmsoft.ses.service.iface.cf.ICfOperateTimeService;
+import cn.hmsoft.ses.service.iface.std.IStdInfoModifyApplyService;
+import cn.hmsoft.ses.service.iface.std.IStdRefundService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+@RestController
+public class StdRefundControl extends AjaxControl {
+
+	@Autowired
+	private IStdRefundService stdRefundService;
+	@Autowired
+	private ICfOperateTimeService timeService;
+	@Autowired
+	private IStdInfoModifyApplyService stdInfoModifyApplyService;
+	@Autowired
+    private IFrameParamService frameParamService;
+
+	@RequestMapping("std/refund/init")
+	public Ajax init() {
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put("year", YearCodeHelper.getExamYear());
+		map.put("month", YearCodeHelper.getExamMonth());
+		map.put("timeControl", this.timeService.getOperateTime(CfOperateTimeType.REFUND.ordinal(), null));
+		map.put("inTime", this.timeService.isInTime(CfOperateTimeType.REFUND.ordinal(), null));
+		map.put("replenishTimeControl", this.timeService.getOperateTime(CfOperateTimeType.REFUND_REPLENISH.ordinal(), null));
+		map.put("inReplenishTime", this.timeService.isInTime(CfOperateTimeType.REFUND_REPLENISH.ordinal(), null));
+	
+		
+		 FrameParam param = this.frameParamService.find(FrameParam.class,"param_name", "RefundApplyControl");
+		 if(null != param && "Active".equals(param.getProtect_status())){
+	    		map.put("RefundApplyControl", param.getParam_value());
+	    	}
+		
+		List<FrameDict> refundTypeArray = FrameDictUtil.getFrameDict("RefundType");
+		map.put("refundTypeArray", refundTypeArray);
+		
+
+		return new Ajax(map);
+	}
+	
+
+	@RequestMapping("std/refund/queryStdRefund")
+	public Ajax queryStdRefund(Integer std_id) {
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(stdRegInfo, "请重新登录");
+
+		if (stdRegInfo != null & !stdRegInfo.getId().equals(std_id)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		return new Ajax(this.stdRefundService.queryStdRefund(std_id));
+	}
+	
+	@RequestMapping("std/refund/initForApp")
+	public Ajax initForApp(Integer std_id) {
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(stdRegInfo, "请重新登录");
+		
+		if (stdRegInfo != null & !stdRegInfo.getId().equals(std_id)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+		
+		
+		Map<String, Object> map = new HashMap<String, Object>();
+		
+		String year_code = YearCodeHelper.getCurrentYearCode();
+		
+		List<StdRefund> list = this.stdRefundService.queryBillNoForCourse(stdRegInfo.getId(), year_code);
+		map.put("list", list);
+		
+		List<FrameDict> refundTypeArray = FrameDictUtil.getFrameDict("RefundType");
+		map.put("refundTypeArray", refundTypeArray);
+
+		return new Ajax(map);
+	}
+
+	@RequestMapping("std/refund/queryBillNo")
+	public Ajax queryBillNo(Integer std_id, String year_code) {
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(stdRegInfo, "请重新登录");
+
+		if (stdRegInfo != null & !stdRegInfo.getId().equals(std_id)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		if (StringUtils.isEmpty(year_code)) {
+			year_code = YearCodeHelper.getCurrentYearCode();
+		}
+
+		return new Ajax(this.stdRefundService.queryBillNo(stdRegInfo.getId(), year_code));
+	}
+	
+	@RequestMapping("std/refund/queryParam")
+	public Ajax find(String param_name) {
+		FrameParam frameParam = this.frameParamService.find(FrameParam.class, "param_name", param_name);
+		return new Ajax(frameParam);
+	}
+	
+	@RequestMapping("std/refund/queryBillNoForCourse")
+	public Ajax queryBillNoForCourse(Integer std_id, String year_code) {
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(stdRegInfo, "请重新登录");
+
+		if (stdRegInfo != null & !stdRegInfo.getId().equals(std_id)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		if (StringUtils.isEmpty(year_code)) {
+			year_code = YearCodeHelper.getCurrentYearCode();
+		}
+
+		return new Ajax(this.stdRefundService.queryBillNoForCourse(stdRegInfo.getId(), year_code));
+	}
+
+	@RequestMapping("std/refund/apply")
+	public Ajax apply(StdRefund stdRefund, String[] billnos) {
+		Ajax rtnAjax = new Ajax();
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (null == stdRegInfo) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg("请重新登录");
+			return rtnAjax;
+		}
+
+		if (!stdRegInfo.getId().equals(stdRefund.getStd_reg_id())) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		if (null == billnos || billnos.length == 0) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg("请选择订单信息");
+			return rtnAjax;
+		}
+
+		String result = this.stdRefundService.apply(stdRegInfo, billnos, stdRefund);
+		if (null != result) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg(result);
+			return rtnAjax;
+		}
+
+		return rtnAjax;
+	}
+	
+	
+	@RequestMapping("std/refund/delete")
+	public Ajax delete(Integer id, Integer std_id) {
+		Ajax rtnAjax = new Ajax();
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (null == stdRegInfo) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg("请重新登录");
+			return rtnAjax;
+		}
+
+		if (stdRegInfo != null && stdRegInfo.getId().intValue() != std_id.intValue()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+		
+		// 是否超过报考时间
+		boolean inTime = this.timeService.isInTime(CfOperateTimeType.REFUND.ordinal(), null);
+		if (!inTime) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg("不在退款申请时间范围内,不允许删除!");
+			return rtnAjax;
+		}
+
+		StdRefund stdRefund = this.stdRefundService.find(id);
+
+		if (null == stdRefund) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg("退款申请单不存在,无法删除。");
+			return rtnAjax;
+		} else if (std_id.intValue() != stdRefund.getStd_reg_id().intValue()) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg("退款申请单不属于当前账号,不允许删除。");
+			return rtnAjax;
+		}else{
+			String year_code = YearCodeHelper.getByCurrentYearCode();
+			if(!year_code.equals(stdRefund.getYear_code())){
+				rtnAjax.setSuccess(false);
+				rtnAjax.setErrorMsg("退款申请单的批次不是"+year_code+",不允许删除。");
+				return rtnAjax;
+			}
+		}
+
+		this.stdRefundService.delete(id);
+
+		return rtnAjax;
+	}
+	
+	@RequestMapping("std/refund/applyForCourse")
+	public Ajax applyForCourse(StdRefund stdRefund, Integer[] course_ids) {
+		Ajax rtnAjax = new Ajax();
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (null == stdRegInfo) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg("请重新登录");
+			return rtnAjax;
+		}
+
+		if (!stdRegInfo.getId().equals(stdRefund.getStd_reg_id())) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		// 申请时校验,补充证明材料不校验
+		if(!"1".equals(stdRefund.getIs_replenish())){
+			if (null == course_ids || course_ids.length == 0) {
+				rtnAjax.setSuccess(false);
+				rtnAjax.setErrorMsg("请选择课程信息");
+				return rtnAjax;
+			}
+		}
+		
+
+		String result = this.stdRefundService.applyForCourse(stdRegInfo, course_ids, stdRefund);
+		if (null != result) {
+			rtnAjax.setSuccess(false);
+			rtnAjax.setErrorMsg(result);
+			return rtnAjax;
+		}
+
+		return rtnAjax;
+	}
+
+	@RequestMapping("std/refund/upload")
+	public Ajax upload(MultipartFile file) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		String filePath = uploadFile(std, std.getTicket_no(), file);
+		return new Ajax(filePath);
+	}
+	
+	@RequestMapping("std/refund/get")
+    public Ajax get(Integer id,Integer std_id) {
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(stdRegInfo, "请重新登录");
+
+		if (stdRegInfo != null & !stdRegInfo.getId().equals(std_id)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+		
+        return new Ajax(this.stdRefundService.queryStdRefundById(id));
+    } 
+
+	private String uploadFile(StdRegInfo std, String pro_code, MultipartFile file) {
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		if (StringHelper.isNotEmpty(extension)) {
+			extension = extension.toLowerCase();
+		}
+
+		// 校验文件类型
+		if (!"jpg".equals(extension) && !"jpeg".equals(extension) && !"png".equals(extension)
+				&& !"gif".equals(extension) && !"bmp".equals(extension)) {
+			throw new BusinessException("上传图片必须是JPG/JPEG/PNG/格式!");
+		}
+
+		String cert_no = std.getCert_no();
+		String rootPath = SysConst.getAppConfig().getUploadBase();
+		String rtnName;
+		String fileSeq = this.stdInfoModifyApplyService.getFileSeq();
+		try {
+			makeDir(rootPath);
+			rtnName = SysConst.IMG_SIMA_PREFIX + cert_no + "_" + new Date().getTime() + "_" + fileSeq + "." + extension;
+			String fullFileName = rootPath + rtnName;
+			file.transferTo(new File(fullFileName));
+		} catch (Exception e) {
+			LogHelper.error(e);
+			throw new BusinessException("文件上传错误,请检查文件");
+		}
+		return rtnName;
+	}
+
+	/**
+	 * @param rootPath:目录路径
+	 *            创建目录
+	 */
+	private void makeDir(String rootPath) {
+		File dir = new File(rootPath + SysConst.IMG_SIMA_PREFIX);
+		if (!dir.exists())
+			dir.mkdir();
+	}
+
+}

+ 4887 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdRegInfoControl.java

@@ -0,0 +1,4887 @@
+package cn.hmsoft.ses.control.std;
+
+import cn.hmsoft.frame.constants.FrameParamConstants;
+import cn.hmsoft.frame.data.model.FrameDict;
+import cn.hmsoft.frame.data.model.FrameParam;
+import cn.hmsoft.frame.exception.web.BusinessException;
+import cn.hmsoft.frame.service.IFrameParamService;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.frame.util.FrameDictUtil;
+import cn.hmsoft.frame.util.FrameParamUtil;
+import cn.hmsoft.helper.DateHelper;
+import cn.hmsoft.helper.JsonHelper;
+import cn.hmsoft.helper.LogHelper;
+import cn.hmsoft.helper.SecureHelper;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.constants.StdConst;
+import cn.hmsoft.ses.constants.StdConst.OperType;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.control.util.FrameIdCardUtil;
+import cn.hmsoft.ses.data.dao.std.StdAppLogintokenDao;
+import cn.hmsoft.ses.data.dao.std.StdIdentityCardDao;
+import cn.hmsoft.ses.data.dao.std.StdRegInfoDao;
+import cn.hmsoft.ses.data.model.cf.CfOrganization;
+import cn.hmsoft.ses.data.model.gxzk.CjJigechengjiOld;
+import cn.hmsoft.ses.data.model.pl.PlExamTime;
+import cn.hmsoft.ses.data.model.pl.PlMajor;
+import cn.hmsoft.ses.data.model.pl.PlMajorRecord;
+import cn.hmsoft.ses.data.model.std.StdAppLogintoken;
+import cn.hmsoft.ses.data.model.std.StdEnrol;
+import cn.hmsoft.ses.data.model.std.StdIdentityCard;
+import cn.hmsoft.ses.data.model.std.StdMajor;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.data.model.std.StdReportForm;
+import cn.hmsoft.ses.data.model.std.StdReportFormPlanCity;
+import cn.hmsoft.ses.data.model.sys.SysEmailInfo;
+import cn.hmsoft.ses.data.model.sys.SysOperateFail;
+import cn.hmsoft.ses.data.model.sys.SysSmsInfo;
+import cn.hmsoft.ses.data.model.sys.SysVerificationCode;
+import cn.hmsoft.ses.data.model.sys.SysVerificationEmailCode;
+import cn.hmsoft.ses.helper.YearCodeHelper;
+import cn.hmsoft.ses.service.iface.cf.ICfOrganizationService;
+import cn.hmsoft.ses.service.iface.gxzk.ICjJigechengjiOldService;
+import cn.hmsoft.ses.service.iface.pl.IPlExamTimeService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorRecordService;
+import cn.hmsoft.ses.service.iface.pl.IPlMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdEnrolService;
+import cn.hmsoft.ses.service.iface.std.IStdMajorService;
+import cn.hmsoft.ses.service.iface.std.IStdRegInfoLogService;
+import cn.hmsoft.ses.service.iface.std.IStdRegInfoService;
+import cn.hmsoft.ses.service.iface.std.IStdReportFormService;
+import cn.hmsoft.ses.service.iface.sys.ISysEmailInfoService;
+import cn.hmsoft.ses.service.iface.sys.ISysOperateFailService;
+import cn.hmsoft.ses.service.iface.sys.ISysSmsInfoService;
+import cn.hmsoft.ses.service.iface.sys.ISysVerificationCodeService;
+import cn.hmsoft.ses.service.iface.sys.ISysVerificationEmailCodeService;
+import cn.hmsoft.ses.util.*;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.xcwlkj.dfs.model.vo.UploadItemVO;
+import com.xcwlkj.dfs.model.vo.UploadVO;
+import com.xcwlkj.dfs.util.XcDfsClient;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.List;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * 学生注册
+ * 
+ * @author: yangwei
+ * @date: 2018-10-16 10:23:05
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdRegInfoControl extends AjaxControl {
+
+	private static final String String = null;
+
+	@Autowired
+	private IStdRegInfoService stdRegInfoService;
+	
+	@Autowired
+	private StdRegInfoDao stdRegInfoDao;
+	
+	@Autowired
+	private StdAppLogintokenDao stdAppLogintokenDao;
+
+	@Autowired
+	private IStdMajorService stdMajorService;
+
+	@Autowired
+	private IPlMajorService plMajorService;
+
+	@Autowired
+	private ICfOrganizationService cfOrganizationService;
+
+	@Autowired
+	private IPlMajorRecordService iPlMajorRecordService;
+	@Autowired
+	private IStdRegInfoLogService regLogService;
+
+	@Autowired
+	private IStdEnrolService stdEnrolService;
+
+	@Autowired
+	private IPlExamTimeService examTimeService;
+
+	@Autowired
+	private ICjJigechengjiOldService cjJigechengjiOldService;
+	
+	@Autowired
+	private StdIdentityCardDao stdIdentityCardDao;
+	
+	@Autowired
+	private ISysSmsInfoService sysSmsInfoService;
+	
+	@Autowired
+	private ISysVerificationCodeService sysVerificationCodeService;
+	
+	@Autowired
+	private ISysEmailInfoService sysEmailInfoService;
+	
+	@Autowired
+	private ISysVerificationEmailCodeService sysVerificationEmailCodeService;
+	
+	@Autowired
+	private ISysOperateFailService sysOperateFailService;
+	
+	@Autowired
+    private IFrameParamService frameParamService;
+	
+	@Autowired
+    private IStdReportFormService stdReportFormService;
+	
+	private static int SOCIAL_ID = 99999999;
+
+	private static HashMap<String, Object> cacheMap = new HashMap<String, Object>();
+
+	static {
+		System.setProperty("java.awt.headless", "true");
+	}
+
+	//@RequestMapping("/std/stdRegInfo/page")
+	public Ajax pageRegInfo(String query, Integer limit, Integer start, String order, String type,
+			StdRegInfo stdRegInfo) {
+		return new Ajax(this.stdRegInfoService.pageStdRegInfo(query, start, limit, order, type));
+	}
+
+	@RequestMapping("/std/stdRegInfo/getSocialMajorList")
+	public Ajax getSocialMajorList() {
+		// 社会考生专业
+		List<PlMajorRecord> socialMajorArray = this.iPlMajorRecordService.getSocialMajorList();
+		return new Ajax(socialMajorArray);
+	}
+
+	@RequestMapping("/std/stdRegInfo/getStdMajor")
+	public Ajax getStdMajor() {
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		StdRegInfo dbStd = this.stdRegInfoService.find(stdRegInfo.getId());
+		PlMajor stdMajor = this.plMajorService.find(dbStd.getMajor_id());
+		return new Ajax(stdMajor);
+	}
+
+	/**
+	 * 查询 开考且网报专业
+	 * 
+	 * @return
+	 */
+	@RequestMapping("/std/stdRegInfo/getNetMajorList")
+	public Ajax getNetMajorList() {
+		// StdRegInfo stdRegInfo =
+		// (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		// StdRegInfo dbStd = this.stdRegInfoService.find(stdRegInfo.getId());
+		// PlMajor stdMajor = this.plMajorService.find(dbStd.getMajor_id());
+
+		HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		paraMap.put("is_net_exam", 1);// 网考
+		paraMap.put("status", 1);// 开考
+
+		List<PlMajor> majorList = this.plMajorService.listByMap(paraMap);
+
+		// 考生专业和 可报考专业合并 初始化专业下拉使用
+		/*
+		 * boolean notExistStdMajor = true; Integer stdMajorId =
+		 * stdMajor.getId(); for (PlMajor plMajor : majorList) { if (stdMajorId
+		 * == plMajor.getId()) { notExistStdMajor = false; } }
+		 * 
+		 * if(notExistStdMajor){ majorList.add(0, stdMajor); }
+		 */
+
+		return new Ajax(majorList);
+	}
+
+	/**
+	 * 获取数据字典缓存
+	 * 
+	 * @return
+	 */
+	@SuppressWarnings("unchecked")
+	private Map<String, Object> getDictMap() {
+		Map<String, Object> dictMap = null;
+		if (cacheMap.get("dictData") == null) {
+			dictMap = new HashMap<String, Object>();
+			cacheMap.put("dictData", dictMap);
+
+			HashMap<String, Object> paraMap = new HashMap<String, Object>();
+			paraMap.put("is_net_exam", 1);// 网考
+			paraMap.put("status", 1);// 开考
+			List<PlMajor> majorArray = this.plMajorService.listByMap(paraMap);
+			
+			HashMap<String, Object> byMajorParaMap = new HashMap<String, Object>();
+			byMajorParaMap.put("is_allow_graduate", 1);// 允许毕业
+			byMajorParaMap.put("status", 1);// 开考
+			List<PlMajor> byMajorArray = this.plMajorService.listByMap(byMajorParaMap);
+			if (null != byMajorArray) {
+				for (PlMajor pm : byMajorArray) {
+					if (null != pm.getMajor_level() && 1 == pm.getMajor_level().intValue()) {
+						pm.setMajor_full_name(pm.getMajor_code() + "|" + pm.getMajor_name() + "-本科");
+					} else {
+						pm.setMajor_full_name(pm.getMajor_code() + "|" + pm.getMajor_name() + "-专科");
+					}
+				}
+			}
+
+			// 名族
+			List<FrameDict> stdNationArray = FrameDictUtil.getFrameDict("std_nation");
+			// 职业
+			List<FrameDict> stdOccupationArray = FrameDictUtil.getFrameDict("std_occupation");
+			List<FrameDict> stdFamilyRegArray = FrameDictUtil.getFrameDict("std_family_reg");
+			List<FrameDict> stdPoliticalStatusArray = FrameDictUtil.getFrameDict("std_political_status");
+			List<FrameDict> StdSexTypeArray = FrameDictUtil.getFrameDict("StdSexType");
+			List<FrameDict> certTypeArray = FrameDictUtil.getFrameDict("CERT_TYPE");
+			List<FrameDict> StdHealthyArray = FrameDictUtil.getFrameDict("std_healthy");
+			List<FrameDict> StdEduArray = FrameDictUtil.getFrameDict("std_edu");
+			List<FrameDict> majorLevelArray = FrameDictUtil.getFrameDict("MajorLevel");
+
+			List<CfOrganization> orgArray = this.stdRegInfoService.CfOrganizationList("1");
+			CfOrganization org = new CfOrganization();
+			org.setId(SOCIAL_ID);
+			org.setOrg_code("001");
+			org.setOrg_name("社会考生");
+			orgArray.add(0, org);
+			List<CfOrganization> examAreaOrgArray = this.stdRegInfoService.CfOrganizationList("4");
+
+			dictMap.put("majorArray", majorArray);
+			dictMap.put("byMajorArray", byMajorArray);
+			dictMap.put("nationArray", stdNationArray);
+			dictMap.put("occupationArray", stdOccupationArray);
+			dictMap.put("familyRegArray", stdFamilyRegArray);
+			dictMap.put("politicalStatusArray", stdPoliticalStatusArray);
+			dictMap.put("sexArray", StdSexTypeArray);
+			dictMap.put("certTypeArray", certTypeArray);
+			dictMap.put("healthyArray", StdHealthyArray);
+			dictMap.put("eduArray", StdEduArray);
+			dictMap.put("orgArray", orgArray);
+			dictMap.put("examAreaOrgArray", examAreaOrgArray);
+			dictMap.put("majorLevelArray", majorLevelArray);
+		} else {
+			dictMap = (HashMap<String, Object>) cacheMap.get("dictData");
+		}
+		return dictMap;
+	}
+
+	@RequestMapping({ "/std/stdRegInfo/freshFrameParamsCache" })
+	public Ajax freshFrameParamsCache() {
+		FrameParamUtil.ReloadFrameParams();
+		return new Ajax();
+	}
+	@RequestMapping("/std/stdRegInfo/freshCache")
+	public Ajax freshCache() {
+		// 刷新字典缴存
+		FrameDictUtil.allDict(true);
+		cacheMap.put("dictData", null);
+		cacheMap.put("dictData", getDictMap());
+		
+		/*HashMap dictMap = new HashMap<String, Object>();
+
+		// List<PlMajor> majorArray = plMajorService.all();
+		// List<PlMajorRecord> majorArray =
+		// iPlMajorRecordService.getNSocialMajorList();
+		HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		paraMap.put("is_net_exam", 1);// 网考
+		paraMap.put("status", 1);// 开考
+		List<PlMajor> majorArray = this.plMajorService.listByMap(paraMap);
+
+		// 名族
+		List<FrameDict> stdNationArray = FrameDictUtil.getFrameDict("std_nation");
+		// 职业
+		List<FrameDict> stdOccupationArray = FrameDictUtil.getFrameDict("std_occupation");
+		List<FrameDict> stdFamilyRegArray = FrameDictUtil.getFrameDict("std_family_reg");
+		List<FrameDict> stdPoliticalStatusArray = FrameDictUtil.getFrameDict("std_political_status");
+		List<FrameDict> StdSexTypeArray = FrameDictUtil.getFrameDict("StdSexType");
+		List<FrameDict> StdHealthyArray = FrameDictUtil.getFrameDict("std_healthy");
+		List<FrameDict> StdEduArray = FrameDictUtil.getFrameDict("std_edu");
+		List<FrameDict> majorLevelArray = FrameDictUtil.getFrameDict("MajorLevel");
+
+		List<CfOrganization> orgArray = this.stdRegInfoService.CfOrganizationList("1");
+		CfOrganization org = new CfOrganization();
+		org.setId(SOCIAL_ID);
+		org.setOrg_code("001");
+		org.setOrg_name("社会考生");
+		orgArray.add(0, org);
+		List<CfOrganization> examAreaOrgArray = this.stdRegInfoService.CfOrganizationList("4");
+
+		dictMap.put("majorArray", majorArray);
+		dictMap.put("nationArray", stdNationArray);
+		dictMap.put("occupationArray", stdOccupationArray);
+		dictMap.put("familyRegArray", stdFamilyRegArray);
+		dictMap.put("politicalStatusArray", stdPoliticalStatusArray);
+		dictMap.put("sexArray", StdSexTypeArray);
+		dictMap.put("healthyArray", StdHealthyArray);
+		dictMap.put("eduArray", StdEduArray);
+		dictMap.put("orgArray", orgArray);
+		dictMap.put("examAreaOrgArray", examAreaOrgArray);
+		dictMap.put("majorLevelArray", majorLevelArray);
+
+		cacheMap.put("dictData", dictMap);*/
+		return new Ajax();
+	}
+
+	@RequestMapping("/std/stdRegInfo/initForBindPhone")
+	public Ajax initForBindPhone(Integer std_id) {
+
+		Map<String, Object> map = new HashMap<String, Object>();
+
+		StdRegInfo sessionStdRegInfo = (StdRegInfo) getRequest().getSession()
+				.getAttribute(EnrolSessionName.EnrolStdReg);
+		
+		// 校验会话的ID与修改的ID一致性
+		if(!sessionStdRegInfo.getId().equals(std_id)){
+			Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生与会话考生不一致,请重新登陆!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+		
+		List<Map<String,Object>> provinces = this.stdRegInfoService.queryBzmbGbXzqhdm("000000");
+		map.put("provinces", provinces);
+		
+		map.put("year_code", YearCodeHelper.getCurrentYearCode());
+		
+		return new Ajax(map);
+	}
+	
+	@RequestMapping("/std/stdRegInfo/initForReportForm")
+	public Ajax initForReportForm(Integer std_id) {
+
+		Map<String, Object> map = new HashMap<String, Object>();
+
+		StdRegInfo sessionStdRegInfo = (StdRegInfo) getRequest().getSession()
+				.getAttribute(EnrolSessionName.EnrolStdReg);
+		
+		// 校验会话的ID与修改的ID一致性
+		if(!sessionStdRegInfo.getId().equals(std_id)){
+			Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生与会话考生不一致,请重新登陆!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+		
+		List<Map<String,Object>> provinces = this.stdRegInfoService.queryBzmbGbXzqhdm("000000");
+		map.put("provinces", provinces);
+		
+		String year_code = YearCodeHelper.getCurrentYearCode();
+		map.put("year_code", year_code);
+		map.put("exam_year", year_code.substring(0, 4));
+		map.put("exam_month", year_code.substring(4, 6));
+		
+		FrameParam param = this.frameParamService.find(FrameParam.class,"param_name", "ticket_promise_one");
+		if(null != param && "Active".equals(param.getProtect_status())){
+    		map.put("ticket_promise_one", param.getParam_value());
+    	}else{
+    		map.put("ticket_promise_one", "");
+    	}
+		
+		param = this.frameParamService.find(FrameParam.class,"param_name", "std_report_form");
+		if(null != param && "Active".equals(param.getProtect_status())){
+    		map.put("days", param.getParam_value());
+    	}else{
+    		map.put("days", "");
+    	}
+    	
+    	StdReportForm stdReportForm = this.stdReportFormService.queryStdReportFormByTicketNo(Integer.valueOf(YearCodeHelper.getCurrentYearCode()), sessionStdRegInfo.getTicket_no());
+		
+    	map.put("stdReportForm", stdReportForm);
+    	
+    	if(null != stdReportForm){
+        	List<StdReportFormPlanCity> plans = this.stdReportFormService.queryStdReportFormPlanCityByReportFormId(stdReportForm.getId());
+        	if(null != plans && !plans.isEmpty()){
+        		for(StdReportFormPlanCity plan:plans){
+        			List<Map<String, Object>> citys = this.stdRegInfoService.queryBzmbGbXzqhdm(plan.getPlan_province());
+        			plan.setCitys(citys);
+        			
+        			List<Map<String, Object>> countys = this.stdRegInfoService.queryBzmbGbXzqhdm(plan.getPlan_city());
+        			plan.setCountys(countys);
+        			
+        		}
+        	}
+        	
+        	map.put("plans", plans);
+    	}else{
+    		map.put("plans", null);
+    	}
+    	
+		return new Ajax(map);
+	}
+	
+	@RequestMapping("/std/stdRegInfo/queryBzmbGbXzqhdm")
+	public Ajax queryBzmbGbXzqhdm(Integer std_id, String parent_id) {
+
+		Map<String, Object> map = new HashMap<String, Object>();
+
+		StdRegInfo sessionStdRegInfo = (StdRegInfo) getRequest().getSession()
+				.getAttribute(EnrolSessionName.EnrolStdReg);
+
+		// 校验会话的ID与修改的ID一致性
+		if (!sessionStdRegInfo.getId().equals(std_id)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(246);
+			ajax.setErrorMsg("检测到考生与会话考生不一致,请重新登陆!");
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+			return ajax;
+		}
+
+		List<Map<String, Object>> data = this.stdRegInfoService.queryBzmbGbXzqhdm(parent_id);
+		map.put("data", data);
+
+		return new Ajax(map);
+	}
+	
+	
+	@RequestMapping("/std/stdRegInfo/init")
+	public Ajax init(StdRegInfo stdRegInfo) {
+
+		Map<String, Object> dictMap = this.getDictMap();
+
+		Map<String, Object> map = new HashMap<String, Object>();
+
+		map.put("dict", dictMap);
+
+		Map<String, Object> configMap = new HashMap<String, Object>();
+		
+		
+		String uploadServerUrl = SysConst.getAppConfig().getUploadServerUrl();
+		
+		
+		configMap.put("uploadServerUrl", uploadServerUrl);
+		
+		configMap.put("photoHttp", SysConst.getAppConfig().getPhotoHttp());
+		configMap.put("isRemotePhoto", SysConst.getAppConfig().getIsRemotePhoto());
+		
+		map.put("config", configMap);
+
+		StdRegInfo sessionStdRegInfo = (StdRegInfo) getRequest().getSession()
+				.getAttribute(EnrolSessionName.EnrolStdReg);
+		StdRegInfo dbStd = stdRegInfoService.find(sessionStdRegInfo.getId());
+		if (dbStd != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStd);
+			
+			// 漏洞问题处理 4.1.8[中风险]敏感信息(全局)-服务端,只处理密码和邮箱。身份证、手机等要用于办理业务
+			dbStd.setStd_pass(null);
+			dbStd.setBind_email(null);
+			dbStd.setStd_email(null);
+						
+			map.put("stdRegInfo", dbStd);
+			map.put("stdMajor", plMajorService.findMajor(dbStd.getMajor_id()));
+			
+			// 20220722 信息采集年度码(如果当前批次与该值不一样,则考生第一次登录时需填写批次信息采集)
+			if(null == dbStd.getYear_code()){
+				map.put("isBindPhoneOrSetQuestion", "0");
+			}else{
+				if(!YearCodeHelper.getCurrentYearCode().equals(dbStd.getYear_code()+"")){
+					map.put("isBindPhoneOrSetQuestion", "0");
+				}else{
+					map.put("isBindPhoneOrSetQuestion", "1");
+				}
+			}
+			
+			String is_std_report_form = "false";
+			// 填写自学考试考生赴考报备表开关
+			FrameParam param = this.frameParamService.find(FrameParam.class,"param_name", "std_report_form");
+			if (null != param && "Active".equals(param.getProtect_status())) {
+				// 根据考生查询是否已经缴费
+				List<StdEnrol> list = this.stdEnrolService.listEnrolByStdId(sessionStdRegInfo.getId(),
+						YearCodeHelper.getCurrentYearCode());
+				// 已缴费,则校验是否在填写报备表时间范围之内
+				if (null != list && !list.isEmpty()) {
+					StdReportForm stdReportForm = this.stdReportFormService.queryStdReportFormByTicketNo(
+							Integer.valueOf(YearCodeHelper.getCurrentYearCode()), sessionStdRegInfo.getTicket_no());
+					// 没有填写报备表,则需要填写
+					if (null == stdReportForm) {
+						LocalDateTime now = null;
+						StdEnrol time = this.stdEnrolService.getDataBaseTime();
+						if (null != time && null != time.getCreate_time()) {
+							now = time.getCreate_time();
+						} else {
+							now = LocalDateTime.now();
+						}
+
+						PlExamTime dbTime = this.examTimeService.queryPlExamTime(YearCodeHelper.getCurrentYearCode());
+
+						LocalDate start_date = dbTime.getExam_first_day();
+						LocalDate end_date = null;
+						if(null != dbTime.getExam_third_day()){
+							end_date = dbTime.getExam_third_day();
+						}else{
+							end_date = dbTime.getExam_second_day();
+						}
+
+						// 填写开始时间
+						LocalDateTime start_time = start_date.atTime(0, 0, 0);
+						// 填写结束时间
+						LocalDateTime end_time = end_date.atTime(0, 0, 0);
+
+						// 天数
+						int days = Integer.valueOf(param.getParam_value());
+
+						// 填写开始时间设定在考试开始时间+天数
+						start_time = start_time.plusDays(-days);
+						// 填写结束时间设定在考试结束时间
+						end_time = end_time.plusDays(1);
+
+						//now = start_time.plusDays(1);
+						if (DateHelper.isBetween(now, start_time, end_time)) {
+							is_std_report_form = "true";
+						}
+					}
+				}
+
+			}
+
+	    	map.put("std_report_form", is_std_report_form);
+	    	
+			
+			/*// 账号已经绑定手机号,则设置绑定标识
+			if(!StringUtils.isEmpty(dbStd.getBindphone())){
+				map.put("isBindPhoneOrSetQuestion", "1");
+			}else{
+				List<StdRegInfo> stds = this.stdRegInfoService.queryPasswordQuestion(dbStd);
+				
+				if(null != stds && !stds.isEmpty()){
+					// 账号已经设置密保,则设置绑定标识
+					map.put("isBindPhoneOrSetQuestion", "1");
+				}else{
+					// 账号没有绑定手机号,也没有设置密保,则设置未绑定标识
+					map.put("isBindPhoneOrSetQuestion", "0");
+				}
+			}*/
+			
+		}
+
+		String belong_city = dbStd.getBelong_city();
+		String enrol_county_city = dbStd.getEnrol_county_city();
+		Map<String, Object> county_cityMap = stdRegInfoService.getCityCounty(belong_city, enrol_county_city);
+
+		map.put("county_city", county_cityMap);
+		
+		List<Map<String,Object>> std_citys = this.stdRegInfoService.queryCity();
+		map.put("std_citys", std_citys);
+		
+		if(!StringUtils.isEmpty(dbStd.getStd_city())){
+			List<Map<String,Object>> std_countys = this.stdRegInfoService.queryCityCounty(dbStd.getStd_city());
+			map.put("std_countys", std_countys);
+		}
+		
+		
+		List<Map<String,Object>> provinces = this.stdRegInfoService.queryBzmbGbXzqhdm("000000");
+		map.put("provinces", provinces);
+		
+		if(!StringUtils.isEmpty(dbStd.getProvince())){
+			List<Map<String,Object>> citys = this.stdRegInfoService.queryBzmbGbXzqhdm(dbStd.getProvince());
+			map.put("citys", citys);
+		}
+		
+		if(!StringUtils.isEmpty(dbStd.getCity())){
+			List<Map<String,Object>> countys = this.stdRegInfoService.queryBzmbGbXzqhdm(dbStd.getCity());
+			map.put("countys", countys);
+		}
+		
+
+		//map.put("FrameParam", SpringConfig.GobalDao.all(FrameParam.class));
+		map.put("FrameParam", FrameParamConstants.GobalParamMap);
+		
+		return new Ajax(map);
+	}
+	
+	
+	@RequestMapping("std/stdRegInfo/checkStdReportForm")
+    public Ajax existFacePic() {
+    	StdRegInfo sessionStdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	
+    	Ajax ajax = new Ajax();
+    	
+		// 填写自学考试考生赴考报备表开关
+		FrameParam param = this.frameParamService.find(FrameParam.class,"param_name", "std_report_form");
+		if (null != param && "Active".equals(param.getProtect_status())) {
+			// 根据考生查询是否已经缴费
+			List<StdEnrol> list = this.stdEnrolService.listEnrolByStdId(sessionStdRegInfo.getId(),
+					YearCodeHelper.getCurrentYearCode());
+			// 已缴费,则校验是否在填写报备表时间范围之内
+			if (null != list && !list.isEmpty()) {
+				StdReportForm stdReportForm = this.stdReportFormService.queryStdReportFormByTicketNo(
+						Integer.valueOf(YearCodeHelper.getCurrentYearCode()), sessionStdRegInfo.getTicket_no());
+				// 没有填写报备表,则需要填写
+				if (null == stdReportForm) {
+					ajax.setSuccess(false);
+				}
+			}
+		}
+		
+    	return ajax;
+    }    
+	
+
+	@RequestMapping("/std/stdRegInfo/queryCity")
+	public Ajax queryCity() {
+		return new Ajax(this.stdRegInfoService.queryCity());
+	}
+	
+	@RequestMapping("/std/stdRegInfo/queryCityCounty")
+	public Ajax queryCityCounty(String std_city) {
+		return new Ajax(this.stdRegInfoService.queryCityCounty(std_city));
+	}
+	
+	@RequestMapping("/std/assistListAll")
+	public Ajax listAll(CfOrganization cfOrg) {
+		return new Ajax(this.cfOrganizationService.assistlistAll(cfOrg));
+	}
+
+	@RequestMapping("/std/stdRegInfo/validateIdCardForPhotoReview")
+	public Ajax validateIdCardForPhotoReview() {
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (stdRegInfo != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(stdRegInfo);
+		}
+		
+		String cert_no = stdRegInfo.getCert_no();
+		Ajax ajax = new Ajax();
+		if (StringUtils.isEmpty(cert_no)) {
+			ajax.setSuccess(false);
+			ajax.setErrorCode(-1);
+			ajax.setErrorMsg("证件号为空,无法完成照片合规检查!");
+
+			return ajax;
+		}
+		
+		if (cert_no.length() != 18) {
+			ajax.setSuccess(false);
+			ajax.setErrorCode(-1);
+			ajax.setErrorMsg("证件号不是18位身份证号,无法完成照片合规检查!");
+
+			return ajax;
+
+		}
+
+		if (!cert_no.startsWith("45")) {
+			ajax.setSuccess(false);
+			ajax.setErrorCode(-2);
+			ajax.setErrorMsg("非区内身份证号,无法完成照片合规检查,请进入考生信息变更申请,提交变更考生照片!");
+
+			return ajax;
+
+		}
+
+		return new Ajax();
+	}
+	
+	@RequestMapping("/std/stdRegInfo/reg")
+	public Ajax reg(StdRegInfo stdRegInfo) {
+		if(null == stdRegInfo || StringUtils.isEmpty(stdRegInfo.getCert_no())){
+			throw new BusinessException("请填写证件号。");
+		}
+		
+		if(null == stdRegInfo || StringUtils.isEmpty(stdRegInfo.getStd_name())){
+			throw new BusinessException("请填写姓名。");
+		}else if(!StringUtils.isEmpty(stdRegInfo.getStd_name())){
+			if (!PatternUtil.checkStdName(stdRegInfo.getStd_name().trim())) {
+				throw new BusinessException("请输入正确中文姓名且长度在15个字范围内!");
+			}
+		}
+		
+		// 证件号验证
+		String cert_no = stdRegInfo.getCert_no();
+		
+		if (null == stdRegInfo.getCert_type()) {
+			throw new BusinessException("请选择证件类型。");
+		}
+		
+		if (null != stdRegInfo.getCert_type() && stdRegInfo.getCert_type().intValue() != 1) {
+			throw new BusinessException("请使用身份证号注册;使用非身份证件号注册,请到自考办现场进行注册。");
+		}
+		
+		if (stdRegInfo.getCert_type() == 1 && !FrameIdCardUtil.validateIdCard18(cert_no)) {
+			throw new BusinessException("身份证[" + cert_no + "]不合法,请重新填写!");
+		}
+		
+		String error = this.isSysOperateFail(stdRegInfo.getCert_no(), "canRegTime", 30);
+		if(null != error){
+			throw new BusinessException(error);
+		}
+		
+		if (this.stdRegInfoService.existStdRegInfoByCertNo(cert_no)) {
+			// 设置注册失败次数
+			this.setSysOperateFail(stdRegInfo.getCert_no(), "canRegTime", 5, 30, "注册失败累计超过5次,请30分钟之后再尝试!");
+			
+			throw new BusinessException("证件号[" + cert_no + "]已经存在,请使用该证件号登录!");
+		}else{
+			// 校验18位身份证对应的15位身份证号是否已经存在
+			String temp_cert_no = cert_no.substring(0, 6)+cert_no.substring(8, 17);
+			if (this.stdRegInfoService.existStdRegInfoByCertNo(temp_cert_no)) {
+				// 设置注册失败次数
+				this.setSysOperateFail(stdRegInfo.getCert_no(), "canRegTime", 5, 30, "注册失败累计超过5次,请30分钟之后再尝试!");
+				
+				throw new BusinessException("证件号[" + cert_no + "]对应的15位身份证号已经存在,请使用15位身份证号进入忘记密码页面找回密码!");
+			}
+			
+		}
+		
+		
+		if(null != stdRegInfo.getStd_name()){
+			stdRegInfo.setStd_name(stdRegInfo.getStd_name().trim());
+		}
+		
+		// 调用身份证件认证接口校验身份证合法性(校验不通过,业务继续,校验结果记录到考生信息表中)
+		//checkIdentifyCard(stdRegInfo);
+		
+		// 考生来源
+		// int std_source = stdRegInfo.getSchool_id().intValue() == SOCIAL_ID?
+		// StdConst.StudentType.SOCIAL.ordinal():StdConst.StudentType.ASSIST.ordinal();
+		// stdRegInfo.setStd_source(std_source);
+		stdRegInfo.setStatus(StdConst.Status.NEW.ordinal());
+		
+		LocalDateTime now = null;
+		StdEnrol time = this.stdEnrolService.getDataBaseTime();
+		if (null != time && null != time.getCreate_time()) {
+			now = time.getCreate_time();
+		} else {
+			now = LocalDateTime.now();
+		}
+		stdRegInfo.setReg_time(DateHelper.format(now));
+		stdRegInfo.setIs_new_stu(1);
+		stdRegInfo.setStd_source(1);
+		
+		
+		HashMap<String, Object> paraMapTime = new HashMap<String, Object>();
+		paraMapTime.put("year_code", YearCodeHelper.getCurrentYearCodeForTicketNo());
+		List<PlExamTime> dbTime = this.examTimeService.listByMap(paraMapTime);
+		PlExamTime currentTime = null;
+		if (dbTime.size() > 0) {
+			currentTime = dbTime.get(0);
+		}else{
+			throw new BusinessException("无当前批次信息,请联系系统管理员");
+		}
+		String exam_time_id = currentTime.getId().toString();
+    	stdRegInfo.setExam_time_id(exam_time_id);
+		// 密码截取
+		stdRegInfo.setStd_pass(cutPasssword(stdRegInfo.getStd_pass()));
+		
+		// 注册时清空准考证号,防止攻击直接生成准考证号
+		stdRegInfo.setTicket_no(null);
+		stdRegInfo.setPhoto_path(null);
+		stdRegInfo.setMajor_id(null);
+		
+		// 保存考生信息
+		this.stdRegInfoService.save(stdRegInfo);
+
+		return new Ajax();
+	}
+
+	
+	/**
+	 * 校验身份证件合法性
+	 * @param stdRegInfo
+	 */
+	private String checkIdentifyCard(StdRegInfo stdRegInfo) {
+		try {
+			// 调用身份证接口
+			JsonObject identfiy = IdentifyCardOrcUtil.identifyCard(stdRegInfo.getCert_no(), stdRegInfo.getStd_name());
+
+			if (null == identfiy) {
+				return "身份证认证失败,返回报文为空。";
+			}
+
+			int code = identfiy.get("code").getAsInt();
+
+			if (code == 1) {
+				if(identfiy.get("data").isJsonArray()){
+					// 读取返回的数组
+					JsonArray identifyCards = identfiy.get("data").getAsJsonArray();
+
+					// 遍历返回的数组
+					if (null != identifyCards && identifyCards.size() > 0) {
+						JsonElement identifyCard = null;
+						JsonObject data = null;
+						for (int i = 0; i < identifyCards.size(); i++) {
+							identifyCard = identifyCards.get(i);
+							if (null != identifyCard) {
+								data = identifyCard.getAsJsonObject();
+							}
+
+							if (null != data) {
+								// 姓名
+								String xm = data.get("xm").getAsString();
+								// 身份证号
+								String sfzh = data.get("sfzh").getAsString();
+
+								// 校验身份证件号与姓名一致
+								if (stdRegInfo.getCert_no().equals(sfzh) && stdRegInfo.getStd_name().equals(xm)) {
+									// 校验身份证件号与姓名一致 则返回
+									return "success";
+								}
+							}
+						}
+
+					} else {
+						return "身份证认证失败,身份证号在公安系统不存在,请进入个人中心变更身份信息。";
+					}
+				}else{
+					JsonObject data = identfiy.get("data").getAsJsonObject();
+					// 姓名
+					String xm = data.get("XM").getAsString();
+					// 身份证号
+					String sfzh = data.get("GMSFHM").getAsString();
+
+					// 校验身份证件号与姓名一致
+					if (stdRegInfo.getCert_no().equals(sfzh) && stdRegInfo.getStd_name().equals(xm)) {
+						// 校验身份证件号与姓名一致 则返回
+						return "success";
+					}
+				}
+				
+			} else if (code == 2) {
+				return "身份证认证失败,身份证号在公安系统不存在。";
+			} else if (code == 3) {
+				return "身份证认证失败,查询超时。";
+			} else if (code == 4) {
+				return "身份证认证失败,查询出错。";
+			} else if (code == 5) {
+				return "身份证认证失败,解释出错(报文格式不对)。";
+			} else if (code == 6) {
+				return "身份证认证失败,禁止访问(无权限)。";
+			} else if (code == 7) {
+				return "身份证认证失败,查询条件匹配为误(无法构造查询条件)。";
+			} else if (code == 8) {
+				return "身份证认证失败,禁止访问(服务已停用)。";
+			} else if (code == 9) {
+				return "身份证认证失败,禁止访问(服务已过期)。";
+			} else if (code == 10) {
+				return "身份证认证失败,禁止访问(服务不在开放时段内)。";
+			} else if (code == 11) {
+				return "身份证认证失败,禁止访问(访问人信息为空或不全)。";
+			} else if (code == -49) {
+				return "身份证认证失败,查询出错:非工作时间,服务器被拒绝。";
+			} else if (code == -50) {
+				return "身份证认证失败,查询出错:公民身份号码或姓名为空。";
+			} else if (code == -51) {
+				return "身份证认证失败,查询出错:公民身份号码或姓名超长。";
+			} else if (code == 201) {
+				return "身份证认证失败,查询出错:参数提交方式有误,或有参数为空。";
+			} else if (code == 0) {
+				return "身份证认证失败,查询出错:接口连接异常,请稍后再试。";
+			} else {
+				return "身份证认证失败,错误码:"+code;
+			}
+
+		} catch (Exception e) {
+			LogHelper.error(e);
+			return "身份证认证接口异常,请联系系统管理员";
+		}
+
+		return null;
+	}
+	
+	private String verifyCertificate(StdRegInfo stdRegInfo) {
+		try {
+			// 调用身份证接口
+			JsonObject identfiy = IdentifyCardOrcUtil.verifyCertificate(stdRegInfo.getCert_no(),
+					stdRegInfo.getStd_name(), stdRegInfo.getCert_type());
+
+			if (null == identfiy) {
+				return "港澳台身份认证失败,返回报文为空。";
+			}
+
+			int code = identfiy.get("code").getAsInt();
+
+			if (code == 1) {
+
+				JsonObject data = identfiy.get("data").getAsJsonObject();
+				// 响应码
+				String data_code = data.get("code").getAsString();
+				// 响应信息
+				String msg = data.get("msg").getAsString();
+
+				// 验证通过
+				if ("70000".equals(data_code)) {
+					return "success";
+				} else {
+					return msg;
+				}
+
+			} else {
+				return "港澳台身份认证失败,错误码:" + code;
+			}
+
+		} catch (Exception e) {
+			LogHelper.error(e);
+			return "港澳台身份证认证接口异常,请联系系统管理员";
+		}
+
+	}
+	
+	@RequestMapping("/std/setQuestion")
+	public Ajax setQuestion(StdRegInfo stdRegInfo, String validateCode) {
+		String sessionVcode = (String) getSession().getAttribute("vCode");
+		if (StringUtils.isEmpty(validateCode)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请填写校验码!");
+			return ajax;
+		}
+		
+		if (!validateCode.equalsIgnoreCase(sessionVcode)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("校验码不正确,请重新填写校验码!");
+			return ajax;
+		}
+		
+		if (StringUtils.isEmpty(stdRegInfo.getQuestion())) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请填写问题!");
+			return ajax;
+		}
+		
+		if (StringUtils.isEmpty(stdRegInfo.getAnswer())) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请填写答案!");
+			return ajax;
+		}
+		
+		StdRegInfo seStd = (StdRegInfo)getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		
+		stdRegInfo.setId(seStd.getId());
+		List<StdRegInfo> stdList = this.stdRegInfoService.queryPasswordQuestion(stdRegInfo);
+		
+		if (null != stdList && !stdList.isEmpty()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("您的账号已经设置密保问题,无法再重新设置!");
+			return ajax;
+		}else{
+			// 设置密保问题
+			this.stdRegInfoService.setPasswordQuestion(stdRegInfo);
+		}
+		
+		return new Ajax();
+	}
+
+	@RequestMapping("/std/login")
+	public Ajax login(StdRegInfo stdRegInfo, String validateCode) {
+		boolean is_remove = true;
+		
+		try {
+			String sessionVcode = (String) getSession().getAttribute("vCode");
+			if (StringUtils.isEmpty(validateCode)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请填写校验码!");
+				return ajax;
+			}
+
+			if (!validateCode.equalsIgnoreCase(sessionVcode)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("校验码不正确,请重新填写校验码!");
+				return ajax;
+			}
+
+			String error = this.isSysOperateFail(stdRegInfo.getCert_no(), "canLoginTime", 5);
+			if (null != error) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(error);
+				return ajax;
+			}
+
+			// StdRegInfo dbStdRegInfo =
+			// this.stdRegInfoService.login(stdRegInfo);
+			List<StdRegInfo> stdList = this.stdRegInfoService.loginByCertNo(stdRegInfo);
+			
+			if (stdList.size() == 0) {
+				// 记录登录失败信息
+				this.setSysOperateFail(stdRegInfo.getCert_no(), "canLoginTime", 5, 5, "登录失败累计超过5次,请5分钟之后再登录!");
+			} else {
+				StdRegInfo seStd = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+				for (Iterator iterator = stdList.iterator(); iterator.hasNext();) {
+					StdRegInfo std = (StdRegInfo) iterator.next();
+					if (seStd != null && !seStd.getId().equals(std.getId())) {
+						throw new BusinessException("请注销之前的登录用户或关闭浏览器重新登录!");
+					}
+				}
+
+			}
+			
+			if (stdList.size() == 0) {
+				throw new BusinessException("登录失败,账号或密码错误!(注意证件号字母x大小写)");
+			}
+
+			if (stdList.size() == 1) {
+				StdRegInfo dbStdRegInfo = stdList.get(0);
+				
+				getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, dbStdRegInfo);
+				// 只返回考生必须的字段给前台,避免考生信息暴露
+				StdRegInfo std = new StdRegInfo();
+				std.setId(dbStdRegInfo.getId());
+				std.setTicket_no(dbStdRegInfo.getTicket_no());
+
+				std.setBindphone(dbStdRegInfo.getBindphone());
+				std.setQuestion(dbStdRegInfo.getQuestion());
+				std.setYear_code(dbStdRegInfo.getYear_code());
+				std.setStd_mobile(dbStdRegInfo.getStd_mobile());
+				std.setCurrent_year_code(Integer.valueOf(YearCodeHelper.getCurrentYearCode()));
+				std.setStd_name(dbStdRegInfo.getStd_name());
+				std.setProvince(dbStdRegInfo.getProvince());
+				//std.setCity(dbStdRegInfo.getCity());
+				//std.setCounty(dbStdRegInfo.getCounty());
+				
+				return new Ajax(std);
+				//return new Ajax(dbStdRegInfo);
+			} else {
+				boolean is_one = true;
+
+				// 账号有多个且都没有准考证号
+				for (StdRegInfo std : stdList) {
+					if (null != std && null != std.getTicket_no()) {
+						is_one = false;
+						break;
+					}
+				}
+
+				if (is_one) {
+					StdRegInfo dbStdRegInfo = stdList.get(0);
+					
+					// 如果账号有多个且都没有准考证号,取第一个账号登陆
+					getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, dbStdRegInfo);
+					//return new Ajax(dbStdRegInfo);
+					// 只返回考生必须的字段给前台,避免考生信息暴露
+					StdRegInfo std = new StdRegInfo();
+					std.setId(dbStdRegInfo.getId());
+					std.setTicket_no(dbStdRegInfo.getTicket_no());
+
+					std.setBindphone(dbStdRegInfo.getBindphone());
+					std.setQuestion(dbStdRegInfo.getQuestion());
+					std.setYear_code(dbStdRegInfo.getYear_code());
+					std.setStd_mobile(dbStdRegInfo.getStd_mobile());
+					std.setCurrent_year_code(Integer.valueOf(YearCodeHelper.getCurrentYearCode()));
+					std.setStd_name(dbStdRegInfo.getStd_name());
+					std.setProvince(dbStdRegInfo.getProvince());
+					//std.setCity(dbStdRegInfo.getCity());
+					//std.setCounty(dbStdRegInfo.getCounty());
+					
+					return new Ajax(std);
+				} else {
+					is_remove = false;
+
+					List<StdRegInfo> tepm_list = new ArrayList<StdRegInfo>();
+					for (StdRegInfo temp_std : stdList) {
+						if (null != temp_std ) {
+							// 只返回考生必须的字段给前台,避免考生信息暴露
+							StdRegInfo std = new StdRegInfo();
+							std.setId(temp_std.getId());
+							std.setTicket_no(temp_std.getTicket_no());
+							std.setYear_code(temp_std.getYear_code());
+							std.setStd_mobile(temp_std.getStd_mobile());
+							std.setCurrent_year_code(Integer.valueOf(YearCodeHelper.getCurrentYearCode()));
+							std.setStd_name(temp_std.getStd_name());
+							std.setProvince(temp_std.getProvince());
+							//std.setCity(temp_std.getCity());
+							//std.setCounty(temp_std.getCounty());
+							
+							tepm_list.add(std);
+						}
+					}
+
+					return new Ajax(tepm_list);
+					//return new Ajax(stdList);
+				}
+
+			}
+		} finally {
+			if(is_remove){
+				// 防止校验码重复使用,被人攻击
+				this.getSession().removeAttribute("vCode");
+			}
+		}
+	}
+	
+	@RequestMapping("/std/loginForPhone")
+	public Ajax loginForPhone(StdRegInfo stdRegInfo, String code, String validateCode) {
+		boolean is_remove = true;
+		
+		try {
+			String sessionVcode = (String) getSession().getAttribute("vCode");
+			if (StringUtils.isEmpty(validateCode)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请填写校验码!");
+				return ajax;
+			}
+
+			if (!StringUtils.isEmpty(validateCode) && !validateCode.equalsIgnoreCase(sessionVcode)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("校验码错误,请重新填写!");
+				return ajax;
+			}
+
+			if (StringUtils.isEmpty(code)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请填写短信验证码!");
+				return ajax;
+			}
+
+			if (null == stdRegInfo || StringUtils.isEmpty(stdRegInfo.getCert_no())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请填写手机号码!");
+				return ajax;
+			}
+
+			String error = this.isSysOperateFail(stdRegInfo.getCert_no(), "canLoginTime", 5);
+			if (null != error) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(error);
+				return ajax;
+			}
+
+			List<StdRegInfo> stdList = this.stdRegInfoService.findStdByStdPhone(stdRegInfo.getCert_no(),
+					stdRegInfo.getId());
+			
+			if (stdList.size() == 0) {
+				// 记录登录失败信息
+				this.setSysOperateFail(stdRegInfo.getCert_no(), "canLoginTime", 5, 5, "登录失败累计超过5次,请5分钟之后再登录!");
+			} else {
+				StdRegInfo seStd = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+				for (Iterator iterator = stdList.iterator(); iterator.hasNext();) {
+					StdRegInfo std = (StdRegInfo) iterator.next();
+					if (seStd != null && !seStd.getId().equals(std.getId())) {
+						throw new BusinessException("请注销之前的登录用户或关闭浏览器重新登录!");
+					}
+				}
+
+			}
+
+			// 根据手机号码和短信验证码获取短信信息
+			List<SysVerificationCode> codes = this.sysVerificationCodeService
+					.querySysVerificationCodeByCode(stdRegInfo.getCert_no(), code);
+
+			// 验证验证码有效性
+			if (null == codes || codes.isEmpty()) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("验证码错误或验证码已失效,请重新发送验证码!");
+
+				// 记录验证失败信息
+				this.setSysOperateFail(stdRegInfo.getCert_no(), "canLoginTime", 5, 5, "登录失败累计超过5次,请5分钟之后再登录!");
+
+				return ajax;
+			}
+
+			if (stdList.size() == 1) {
+				// 如果手机号码对应的账号只有一个,则更新验证码,如果有多个账号,选择账号后第二次进入再更新验证码
+				// 验证通过,更新验证码表
+				SysVerificationCode sysVerificationCode = codes.get(0);
+				sysVerificationCode.setStatus(1);
+				this.sysVerificationCodeService.edit(sysVerificationCode);
+				
+				StdRegInfo dbStdRegInfo = stdList.get(0);
+
+				getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, dbStdRegInfo);
+				// 只返回考生必须的字段给前台,避免考生信息暴露
+				StdRegInfo std = new StdRegInfo();
+				std.setId(dbStdRegInfo.getId());
+				std.setTicket_no(dbStdRegInfo.getTicket_no());
+
+				std.setBindphone(dbStdRegInfo.getBindphone());
+				
+				std.setYear_code(dbStdRegInfo.getYear_code());
+				std.setStd_mobile(dbStdRegInfo.getStd_mobile());
+				std.setCurrent_year_code(Integer.valueOf(YearCodeHelper.getCurrentYearCode()));
+				std.setStd_name(dbStdRegInfo.getStd_name());
+				std.setProvince(dbStdRegInfo.getProvince());
+				
+
+				return new Ajax(std);
+			} else {
+				boolean is_one = true;
+
+				// 账号有多个且都没有准考证号
+				for (StdRegInfo std : stdList) {
+					if (null != std && null != std.getTicket_no()) {
+						is_one = false;
+						break;
+					}
+				}
+
+				if (is_one) {
+					StdRegInfo dbStdRegInfo = stdList.get(0);
+					
+					// 如果账号有多个且都没有准考证号,取第一个账号登陆
+					getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, dbStdRegInfo);
+					
+					// 只返回考生必须的字段给前台,避免考生信息暴露
+					StdRegInfo std = new StdRegInfo();
+					std.setId(dbStdRegInfo.getId());	
+					std.setTicket_no(dbStdRegInfo.getTicket_no());
+
+					std.setBindphone(dbStdRegInfo.getBindphone());
+					
+					std.setYear_code(dbStdRegInfo.getYear_code());
+					std.setStd_mobile(dbStdRegInfo.getStd_mobile());
+					std.setCurrent_year_code(Integer.valueOf(YearCodeHelper.getCurrentYearCode()));
+					std.setStd_name(dbStdRegInfo.getStd_name());
+					std.setProvince(dbStdRegInfo.getProvince());
+					
+					return new Ajax(std);
+				} else {
+					is_remove = false;
+					
+					List<StdRegInfo> tepm_list = new ArrayList<StdRegInfo>();
+					for (StdRegInfo temp_std : stdList) {
+						if (null != temp_std ) {
+							// 只返回考生必须的字段给前台,避免考生信息暴露
+							StdRegInfo std = new StdRegInfo();
+							std.setId(temp_std.getId());	
+							std.setTicket_no(temp_std.getTicket_no());
+							
+							std.setYear_code(temp_std.getYear_code());
+							std.setStd_mobile(temp_std.getStd_mobile());
+							std.setCurrent_year_code(Integer.valueOf(YearCodeHelper.getCurrentYearCode()));
+							std.setStd_name(temp_std.getStd_name());
+							std.setProvince(temp_std.getProvince());
+							
+							
+							tepm_list.add(std);
+						}
+					}
+					
+					return new Ajax(tepm_list);
+				}
+			}
+		} finally {
+			if(is_remove){
+				// 防止校验码重复使用,被人攻击
+				this.getSession().removeAttribute("vCode");
+			}
+		}
+	}
+	
+	
+	
+	private boolean isSendSmsExt(){
+		HttpSession session = getSession();
+		Object sessionCanLoginTime = session.getAttribute("canSendTime");
+		if(sessionCanLoginTime !=null){
+			long canLoginTime =  (long)sessionCanLoginTime;
+			if(new Date().getTime() <canLoginTime){
+				return false;
+			}else{
+				session.removeAttribute("canSendTime");
+				return true;
+			}
+		}else{
+			long currentTime = new Date().getTime();
+			long canBindTime = currentTime + 1000*60*1;
+			session.setAttribute("canSendTime", canBindTime);
+			return true;
+		}
+		
+	}
+	
+	private void removeSendSmsExt(){
+		HttpSession session = getSession();
+		Object sessionCanLoginTime = session.getAttribute("canSendTime");
+		if(sessionCanLoginTime !=null){
+			session.removeAttribute("canSendTime");
+		}
+	}
+	
+	
+	private boolean isIdentifyCardFialExt(){
+		HttpSession session = getSession();
+		Object sessionCanLoginTime = session.getAttribute("canIdentifyCardTime");
+		if(sessionCanLoginTime !=null){
+			long canLoginTime =  (long)sessionCanLoginTime;
+			if(new Date().getTime() <canLoginTime){
+				return false;
+			}else{
+				session.removeAttribute("canIdentifyCardTime");
+				return true;
+			}
+		}else{
+			long currentTime = new Date().getTime();
+			long canBindTime = currentTime + 1000*60*1;
+			session.setAttribute("canIdentifyCardTime", canBindTime);
+			return true;
+		}
+		
+	}
+	
+
+	@RequestMapping("/std/logout")
+	public Ajax logout(String token) {
+		//[高风险]安全退出无效-服务端 退出如APP传token,更新数据库中获取token失效,
+		if(!StringUtils.isEmpty(token)){
+			StdAppLogintoken stdAppLogintoken = this.stdAppLogintokenDao.find("token", token);
+			if(null != stdAppLogintoken && "1".equals(stdAppLogintoken.getStatus())){
+				stdAppLogintoken.setStatus("0");
+				this.stdAppLogintokenDao.updateStdAppLogintokenStatus(stdAppLogintoken);
+			}
+		}
+		
+		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+		return new Ajax();
+	}
+
+	@RequestMapping("/std/password")
+	public Ajax password(String std_pass_old, String std_pass_new) {
+		std_pass_old = cutPasssword(std_pass_old);
+		std_pass_new = cutPasssword(std_pass_new);
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		StdRegInfo dbStdRegInfo = this.stdRegInfoService.find(stdRegInfo.getId());
+		if (dbStdRegInfo != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStdRegInfo);
+		}
+		
+		if(!dbStdRegInfo.getStd_pass().equals(std_pass_old)){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("旧密码不正确,请重新输入!");
+			return ajax;
+		}
+		dbStdRegInfo.setStd_pass(std_pass_new);
+		this.stdRegInfoService.update(dbStdRegInfo);
+		getRequest().getSession().removeAttribute(EnrolSessionName.EnrolStdReg);
+		return new Ajax();
+	}
+	
+	@RequestMapping("/std/sendSmsForLogin")
+	public Ajax sendSmsForLogin(String std_mobile, String validateCode) {
+		try {
+			if(!StringUtils.isEmpty(validateCode)){
+				String sessionVcode = (String) getSession().getAttribute("vCode");
+				if (!validateCode.equalsIgnoreCase(sessionVcode)) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("校验码错误,请重新填写!");
+					return ajax;
+				}
+			}
+			
+
+			if (null == std_mobile) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入手机号!");
+				return ajax;
+			}
+
+			// 1分钟内不允许再次发送短信
+			String error = this.isSysOperateFail(std_mobile, "sendSmsForLogin", 1);
+			if (null != error) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(error);
+				return ajax;
+			}
+			
+			error = this.isSysOperateFail(std_mobile, "canLoginTime", 5);
+			if (null != error) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(error);
+				return ajax;
+			}
+
+			List<StdRegInfo> stds = this.stdRegInfoService.findStdByStdPhone(std_mobile, null);
+			
+			if (null == stds || stds.isEmpty()) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("手机号未绑定!");
+
+				removeSendSmsExt();
+
+				// 记录校验失败次数
+				this.setSysOperateFail(std_mobile, "canLoginTime", 5, 5, "登录失败累计超过5次,请5分钟之后再登录!");
+
+				return ajax;
+			}
+
+			int code = (int) ((Math.random() * 9 + 1) * 100000);
+
+			String smstext = "您正在登陆广西自学考试网上系统,验证码:" + code + ",如非本人操作,请忽略本短信。(广西自学考试)";
+
+			JsonObject reslut = SmsSendUtil.sendSms(std_mobile, smstext);
+			if (null == reslut || null == reslut.get("flag") || !"succeed".equals(reslut.get("flag").getAsString())) {
+				String info = (null == reslut.get("msg")?"验证码发送失败,请稍后重试!":reslut.get("msg").getAsString());
+
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(info);
+
+				removeSendSmsExt();
+
+				return ajax;
+			}
+
+			// 插入短信验证码表
+			SysSmsInfo sms = new SysSmsInfo();
+			sms.setPhone(std_mobile);
+			sms.setContent(smstext);
+			this.sysSmsInfoService.insert(sms);
+
+			// 插入短信验证码表
+			SysVerificationCode sysCode = new SysVerificationCode();
+			sysCode.setPhone(std_mobile);
+			sysCode.setCode(code + "");
+			sysCode.setStatus(0);
+			this.sysVerificationCodeService.insert(sysCode);
+			
+			// 记录发短信次数
+			this.setSysOperateFail(std_mobile, "sendSmsForLogin", 1, 1, "请1分钟之后再重新发送验证码!");
+
+			return new Ajax();
+		} finally {
+			this.getSession().removeAttribute("vCode");
+		}
+	}
+	
+	@RequestMapping("/std/sendSmsForPay")
+	public Ajax sendSmsForPay(String orderNum) {
+		
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		StdRegInfo dbStdRegInfo = this.stdRegInfoService.find(stdRegInfo.getId());
+		if (dbStdRegInfo != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStdRegInfo);
+		}
+		
+		if (StringUtils.isEmpty(dbStdRegInfo.getBindphone())) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("您的账号未绑定手机号码,请先完成手机号码绑定。");
+			return ajax;
+		}
+		
+
+		// 1分钟内不允许再次发送短信
+		String error = this.isSysOperateFail(dbStdRegInfo.getBindphone(), "sendSmsForPay", 1);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+
+
+		int code = (int) ((Math.random() * 9 + 1) * 100000);
+
+		String smstext = "您正在广西自学考试网上系统报考缴费,验证码:" + code + ",如非本人操作,请忽略本短信。(广西自学考试)";
+
+		JsonObject reslut = SmsSendUtil.sendSms(dbStdRegInfo.getBindphone(), smstext);
+		if (null == reslut || null == reslut.get("flag") || !"succeed".equals(reslut.get("flag").getAsString())) {
+			String info = (null == reslut.get("msg") ? "验证码发送失败,请稍后重试!" : reslut.get("msg").getAsString());
+
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(info);
+
+			return ajax;
+		}
+
+		// 插入短信验证码表
+		SysSmsInfo sms = new SysSmsInfo();
+		sms.setPhone(dbStdRegInfo.getBindphone());
+		sms.setContent(smstext);
+		this.sysSmsInfoService.insert(sms);
+
+		// 插入短信验证码表
+		SysVerificationCode sysCode = new SysVerificationCode();
+		sysCode.setPhone(dbStdRegInfo.getBindphone());
+		sysCode.setCode(code + "");
+		sysCode.setStatus(0);
+		this.sysVerificationCodeService.insert(sysCode);
+
+		// 记录发短信次数
+		this.setSysOperateFail(dbStdRegInfo.getBindphone(), "sendSmsForPay", 1, 1, "请1分钟之后再重新发送验证码!");
+
+		return new Ajax();
+	}
+	
+	@RequestMapping("/std/sendSmsForFindPassword")
+	public Ajax sendSmsForFindPassword(String std_name,String cert_no, String std_mobile) {
+		if (null == std_name) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入姓名!");
+			return ajax;
+		} else {
+			if (!PatternUtil.checkStdName(std_name.trim())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入正确中文姓名且长度在15个字范围内!");
+				return ajax;
+			}
+		}
+		
+		if(null == cert_no){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入证件号!");
+			return ajax;
+		}
+		
+		if(null == std_mobile){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入手机号!");
+			return ajax;
+		}
+		
+		// 1分钟内不允许再次发送短信
+		String error = this.isSysOperateFail(std_mobile, "sendSmsForFindPassword", 1);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+				
+		
+		error = this.isSysOperateFail(cert_no, "canResetTime", 30);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+		
+		
+		List<StdRegInfo> stds = this.stdRegInfoService.findStdByCertNoAndStdPhone(std_name,cert_no,null);
+		StdRegInfo dbStdRegInfo = null;
+		
+		if (null == stds || stds.isEmpty()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("身份信息输入有误,请重新输入!");
+
+			// 记录校验失败次数
+			this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+
+			return ajax;
+		}else{
+			boolean isbindphone = false;
+			for(StdRegInfo std:stds){
+				if(null != std.getBindphone()){
+					isbindphone = true;
+					break;
+				}
+			}
+			
+			if(!isbindphone){
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("账号未绑定手机,请使用其他方式修改密码!");
+
+				// 记录校验失败次数
+				this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+
+				return ajax;
+			}
+			
+			
+			isbindphone = false;
+			for(StdRegInfo std:stds){
+				if(null != std.getBindphone()&&std_mobile.equals(std.getBindphone())){
+					isbindphone = true;
+					dbStdRegInfo = std;
+					break;
+				}
+			}
+			
+			if(!isbindphone){
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("账号未绑定该手机号!");
+
+				// 记录校验失败次数
+				this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+
+				return ajax;
+			}
+			
+			
+		}
+		
+		
+		int code = (int)((Math.random()*9+1)*100000);
+		
+		String smstext = "您正在广西自学考试网上系统修改密码,验证码:"+code+",如非本人操作,请忽略本短信。(广西自学考试)";
+		
+		JsonObject reslut = SmsSendUtil.sendSms(std_mobile, smstext);
+		if (null == reslut || null == reslut.get("flag") || !"succeed".equals(reslut.get("flag").getAsString())) {
+			String info = (null == reslut.get("msg")?"验证码发送失败,请稍后重试!":reslut.get("msg").getAsString());
+
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(info);
+			
+			return ajax;
+		}
+		
+		//插入短信验证码表
+		SysSmsInfo sms = new SysSmsInfo();
+		sms.setPhone(std_mobile);
+		sms.setContent(smstext);
+		this.sysSmsInfoService.insert(sms);
+		
+		//插入短信验证码表
+		SysVerificationCode sysCode = new SysVerificationCode();
+		sysCode.setPhone(std_mobile);
+		sysCode.setCode(code+"");
+		sysCode.setStatus(0);
+		this.sysVerificationCodeService.insert(sysCode);
+		
+		// 设置验证通过的考生信息到临时会话中,在修改密码时校验
+		HttpSession session = getSession();
+		session.setAttribute("temp_std", dbStdRegInfo);
+		
+		// 记录发短信次数
+		this.setSysOperateFail(std_mobile, "sendSmsForFindPassword", 1, 1, "请1分钟之后再重新发送验证码!");
+		
+		return new Ajax();
+	}
+	
+	@RequestMapping("/std/checkSms")
+	public Ajax checkSms(String std_name,String cert_no, String std_mobile,String code) {
+		if (StringUtils.isEmpty(std_name)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入姓名!");
+			return ajax;
+		} else {
+			if (!PatternUtil.checkStdName(std_name.trim())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入正确中文姓名且长度在15个字范围内!");
+				return ajax;
+			}
+		}
+		
+		if(StringUtils.isEmpty(cert_no)){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入证件号!");
+			return ajax;
+		}
+		
+		
+		if(StringUtils.isEmpty(code)){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入验证码!");
+			return ajax;
+		}
+		
+		String error = this.isSysOperateFail(cert_no, "canResetTime", 30);
+
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+		
+		List<StdRegInfo> stds = this.stdRegInfoService.findStdByCertNoAndStdPhone(std_name,cert_no,std_mobile);
+		
+		// 如果手机号为空,检查 账号是否绑定手机
+		if (StringUtils.isEmpty(std_mobile)) {
+			boolean isbindphone = false;
+			for (StdRegInfo std : stds) {
+				if (null != std.getBindphone()) {
+					isbindphone = true;
+					break;
+				}
+			}
+
+			if (!isbindphone) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("账号未绑定手机!");
+
+				return ajax;
+			} else {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入手机号!");
+				return ajax;
+			}
+
+		}
+		
+		StdRegInfo dbStdRegInfo = null;
+		
+		if (null == stds || stds.isEmpty()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("身份或手机号输入有误,请重新输入!");
+
+			// 记录校验失败次数
+			this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+
+			return ajax;
+		}else{
+			boolean isbindphone = false;
+			for(StdRegInfo std:stds){
+				if(null != std.getBindphone()){
+					isbindphone = true;
+					dbStdRegInfo = std;
+					break;
+				}
+			}
+			
+			
+			if(!isbindphone){
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("账号未绑定该手机号!");
+
+				// 记录校验失败次数
+				this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+
+				return ajax;
+			}
+		}
+		
+		//根据手机号码和短信验证码获取短信信息
+		List<SysVerificationCode> codes = this.sysVerificationCodeService.querySysVerificationCodeByCode(std_mobile, code);
+		
+		// 验证验证码有效性
+		if (null == codes || codes.isEmpty()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("验证码错误或验证码已失效,请重新发送验证码!");
+			
+			//记录验证失败信息
+			this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+			
+			return ajax;
+		}
+		
+		// 验证通过,更新验证码表
+		SysVerificationCode sysVerificationCode = codes.get(0);
+		sysVerificationCode.setStatus(1);
+		this.sysVerificationCodeService.edit(sysVerificationCode);
+		
+		// 只返回考生必须的字段给前台,避免考生信息暴露
+		StdRegInfo std = null;
+		if(null != dbStdRegInfo){
+			std = new StdRegInfo();
+			std.setId(dbStdRegInfo.getId());	
+		}
+		
+		return new Ajax(std);
+	}
+	
+	
+	
+	@RequestMapping("/std/sendMailForFindPassword")
+	public Ajax sendMailForFindPassword(String std_name,String cert_no, String std_email) {
+		if(null == std_name){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入姓名!");
+			return ajax;
+		}else{
+			if (!PatternUtil.checkStdName(std_name.trim())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入正确中文姓名且长度在15个字范围内!");
+				return ajax;
+			}
+		}
+		
+		if(null == cert_no){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入证件号!");
+			return ajax;
+		}
+		
+		if(null == std_email){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入电子邮箱!");
+			return ajax;
+		}else{
+		   String regex_email = "^(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w+)+)$";
+		   if(!Pattern.matches(regex_email, std_email)){
+			    Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入正确的电子邮箱!");
+				return ajax;
+		   }
+		}
+		
+		// 1分钟内不允许再次发送
+		String error = this.isSysOperateFail(cert_no, "sendMailForFindPassword", 1);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+				
+		
+		error = this.isSysOperateFail(cert_no, "canResetTime", 30);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+		
+		
+		List<StdRegInfo> stds = this.stdRegInfoService.findStdByCertNoAndStdMail(std_name,cert_no,std_email);
+		StdRegInfo dbStdRegInfo = null;
+		
+		if (null == stds || stds.isEmpty()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("身份或电子邮件输入有误,请重新输入!");
+
+			// 记录校验失败次数
+			this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+
+			return ajax;
+		}else{
+			boolean isbindmail = false;
+			for(StdRegInfo std:stds){
+				if(null != std.getBind_email()){
+					isbindmail = true;
+					dbStdRegInfo = std;
+					break;
+				}
+			}
+			
+			if(!isbindmail){
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("账号未绑定该电子邮箱!");
+
+				// 记录校验失败次数
+				this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+
+				return ajax;
+			}
+		}
+		
+		int code = (int)((Math.random()*9+1)*100000);
+		
+		String subject = "广西自学考试网上系统邮件验证码";
+		String text = "您正在广西自学考试网上系统修改密码,验证码:"+code+",如非本人操作,请忽略本邮件。(广西自学考试)";
+		
+		// 线程发送邮件
+		MailThread  mail = new MailThread();
+		mail.setEmail(std_email);
+		mail.setSubject(subject);
+		mail.setText(text);
+        mail.start();
+		
+		/*try {
+			
+			SendEmailUtil.sendEmail(std_email, subject, text);
+		} catch (Exception e) {
+			LogHelper.error(e);
+			
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("邮件发送失败,请稍后重试!");
+			
+			//清空1分钟内不允许再次发送短信
+			removeSendSmsExt();
+			
+			return ajax;
+		}*/
+		
+		//插入邮件验证码表
+		SysEmailInfo email = new SysEmailInfo();
+		email.setEmail(std_email);
+		email.setContent(text);
+		this.sysEmailInfoService.insert(email);
+		
+		//插入短信验证码表
+		SysVerificationEmailCode sysCode = new SysVerificationEmailCode();
+		sysCode.setEmail(std_email);
+		sysCode.setCode(code+"");
+		sysCode.setStatus(0);
+		this.sysVerificationEmailCodeService.insert(sysCode);
+		
+		// 设置验证通过的考生信息到临时会话中,在修改密码时校验
+		HttpSession session = getSession();
+		session.setAttribute("temp_std", dbStdRegInfo);
+		
+		// 记录发次数
+		this.setSysOperateFail(cert_no, "sendMailForFindPassword", 1, 1, "请1分钟之后再重新发送验证码!");
+		
+		return new Ajax();
+	}
+	
+	@RequestMapping("/std/checkMail")
+	public Ajax checkMail(String std_name,String cert_no, String std_email,String code) {
+		if(StringUtils.isEmpty(std_name)){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入姓名!");
+			return ajax;
+		}else{
+			if (!PatternUtil.checkStdName(std_name.trim())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入正确中文姓名且长度在15个字范围内!");
+				return ajax;
+			}
+		}
+		
+		if(StringUtils.isEmpty(cert_no)){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入证件号!");
+			return ajax;
+		}
+		
+		
+		if(StringUtils.isEmpty(code)){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入验证码!");
+			return ajax;
+		}
+		
+		String error = this.isSysOperateFail(cert_no, "canResetTime", 30);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+		
+		List<StdRegInfo> stds = this.stdRegInfoService.findStdByCertNoAndStdMail(std_name,cert_no,std_email);
+		
+		// 如果电子 邮件为空,检查 账号是否绑定邮箱
+		if (StringUtils.isEmpty(std_email)) {
+			boolean isbindmail = false;
+			for (StdRegInfo std : stds) {
+				if (null != std.getBind_email()) {
+					isbindmail = true;
+					break;
+				}
+			}
+
+			if (!isbindmail) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("账号未绑定电子邮箱!");
+
+				return ajax;
+			} else {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入电子邮箱!");
+				return ajax;
+			}
+
+		}
+		
+		StdRegInfo dbStdRegInfo = null;
+		
+		if (null == stds || stds.isEmpty()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("身份或电子邮箱输入有误!");
+
+			// 记录校验失败次数
+			this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+
+			return ajax;
+		}else{
+			boolean isbindmail = false;
+			for(StdRegInfo std:stds){
+				if(null != std.getBind_email()){
+					isbindmail = true;
+					dbStdRegInfo = std;
+					break;
+				}
+			}
+			
+			
+			if(!isbindmail){
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("账号未绑定该电子邮箱!");
+
+				// 记录校验失败次数
+				this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+
+				return ajax;
+			}
+		}
+		
+		//根据手机号码和短信验证码获取短信信息
+		List<SysVerificationEmailCode> codes = this.sysVerificationEmailCodeService.querySysVerificationEmailCodeByCode(std_email, code);
+		
+		// 验证验证码有效性
+		if (null == codes || codes.isEmpty()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("验证码错误或验证码已失效,请重新发送邮件!");
+			
+			//记录验证失败信息
+			this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+			
+			return ajax;
+		}
+		
+		// 验证通过,更新验证码表
+		SysVerificationEmailCode sysVerificationCode = codes.get(0);
+		sysVerificationCode.setStatus(1);
+		this.sysVerificationEmailCodeService.edit(sysVerificationCode);
+		
+		// 只返回考生必须的字段给前台,避免考生信息暴露
+		StdRegInfo std = null;
+		if(null != dbStdRegInfo){
+			std = new StdRegInfo();
+			std.setId(dbStdRegInfo.getId());	
+		}
+		
+		return new Ajax(std);
+	}
+	
+	
+	private String isSysOperateFail(String account,String operate_type,Integer second){
+		SysOperateFail fail = this.sysOperateFailService.querySysOperateFailByAccount(account, operate_type, second);
+		if(null != fail){
+			if(fail.getFail_count()>=fail.getMax_count()){
+				return fail.getFail_remark();
+			}
+		}
+		
+		return null;
+	}
+	
+	private void setSysOperateFail(String account,String operate_type,Integer max_count,Integer second,String fail_remark){
+		SysOperateFail fail = this.sysOperateFailService.querySysOperateFailByAccount(account, operate_type, second);
+		if(null == fail){
+			fail = new SysOperateFail();
+			fail.setAccount(account);
+			fail.setFail_count(1);
+			fail.setMax_count(max_count);
+			fail.setFail_remark(fail_remark);
+			fail.setOperate_type(operate_type);
+			
+			this.sysOperateFailService.insert(fail);
+		}else{
+			fail.setFail_count(fail.getFail_count()+1);
+			
+			LocalDateTime now = this.sysOperateFailService.getDataBaseTime().getOperate_time();
+			fail.setOperate_time(now);
+			
+			this.sysOperateFailService.edit(fail);
+		}
+	}
+	
+	
+	@RequestMapping("/std/sendSms")
+	public Ajax sendSms(String std_pass, String std_mobile) {
+		if(null == std_mobile){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入手机号!");
+			return ajax;
+		}
+		
+		std_pass = cutPasssword(std_pass);
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		StdRegInfo std = this.stdRegInfoService.find(stdRegInfo.getId());
+		
+		if (std != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(std);
+		}
+		
+		if(!std.getStd_pass().equals(std_pass)){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("密码不正确请重新输入!");
+			return ajax;
+		}
+		
+		// 1分钟内不允许再次发送短信
+		String error = this.isSysOperateFail(std_mobile, "sendSms", 1);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+					
+		
+		// 当前账号已经绑定该手机号,不允许重复绑定
+		if(std_mobile.equals(std.getBindphone())){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("您的账号已经绑定该手机号码,不需要重复绑定!");
+			return ajax;
+		}
+	
+		
+		int code = (int)((Math.random()*9+1)*100000);
+		
+		String smstext = "您正在广西自学考试网上系统绑定手机,验证码:"+code+",如非本人操作,请忽略本短信。(广西自学考试)";
+		
+		JsonObject reslut = SmsSendUtil.sendSms(std_mobile, smstext);
+		if (null == reslut || null == reslut.get("flag") || !"succeed".equals(reslut.get("flag").getAsString())) {
+			String info = (null == reslut.get("msg")?"验证码发送失败,请稍后重试!":reslut.get("msg").getAsString());
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(info);
+			
+			return ajax;
+		}
+		
+		//插入短信验证码表
+		SysSmsInfo sms = new SysSmsInfo();
+		sms.setPhone(std_mobile);
+		sms.setContent(smstext);
+		this.sysSmsInfoService.insert(sms);
+		
+		//插入短信验证码表
+		SysVerificationCode sysCode = new SysVerificationCode();
+		sysCode.setPhone(std_mobile);
+		sysCode.setCode(code+"");
+		sysCode.setStatus(0);
+		this.sysVerificationCodeService.insert(sysCode);
+		
+		// 记录发短信次数
+		this.setSysOperateFail(std_mobile, "sendSms", 1, 1, "请1分钟之后再重新发送验证码!");
+		
+		return new Ajax();
+	}
+	
+	
+	@RequestMapping("/std/sendEmail")
+	public Ajax sendEmail(String std_pass, String std_email) {
+		if(null == std_email){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入电子邮箱!");
+			return ajax;
+		}
+		
+		// 1分钟内不允许再次发送
+		String error = this.isSysOperateFail(std_email, "sendEmail", 1);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+		
+		std_pass = cutPasssword(std_pass);
+		
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		StdRegInfo std = this.stdRegInfoService.find(stdRegInfo.getId());
+		if (std != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(std);
+		}
+		
+		if(!std.getStd_pass().equals(std_pass)){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("密码不正确请重新输入!");
+			return ajax;
+		}else{
+			// 当前账号已经绑定该手机号,不允许重复绑定
+			if(std_email.equals(std.getBind_email())){
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("您的账号已经绑定该电子邮箱,不需要重复绑定!");
+				return ajax;
+			}
+			
+			
+			int code = (int)((Math.random()*9+1)*100000);
+			
+			String subject = "广西自学考试网上系统邮件验证码";
+			String text = "您正在广西自学考试网上系统绑定电子邮箱,验证码:"+code+",如非本人操作,请忽略本邮件。(广西自学考试)";
+			
+			// 线程发送邮件
+			MailThread  mail = new MailThread();
+			mail.setEmail(std_email);
+			mail.setSubject(subject);
+			mail.setText(text);
+	        mail.start();
+			
+			//插入邮件验证码表
+			SysEmailInfo sms = new SysEmailInfo();
+			sms.setEmail(std_email);
+			sms.setContent(text);
+			this.sysEmailInfoService.insert(sms);
+			
+			//插入邮件验证码表
+			SysVerificationEmailCode sysCode = new SysVerificationEmailCode();
+			sysCode.setEmail(std_email);
+			sysCode.setCode(code+"");
+			sysCode.setStatus(0);
+			this.sysVerificationEmailCodeService.insert(sysCode);
+			
+			// 记录发短信次数
+			this.setSysOperateFail(std_email, "sendEmail", 1, 1, "请1分钟之后再重新发送验证码!");
+			
+			return new Ajax();
+		}
+		
+		
+	}
+	
+	@RequestMapping("/std/sendSmsForLoginBindPhone")
+	public Ajax sendSmsForLoginBindPhone(String std_mobile, String validateCode) {
+		try {
+			if(!StringUtils.isEmpty(validateCode)){
+				String sessionVcode = (String) getSession().getAttribute("vCode");
+				if (!validateCode.equalsIgnoreCase(sessionVcode)) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("校验码错误,请重新填写!");
+					return ajax;
+				}
+			}
+			
+
+			if (null == std_mobile) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入手机号!");
+				return ajax;
+			}
+
+			/*StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+			StdRegInfo std = this.stdRegInfoService.find(stdRegInfo.getId());
+			if (std != null) {
+				// 解密考生敏感信息
+				this.stdRegInfoService.DecryptStd(std);
+			}
+
+			// 当前账号已经绑定该手机号,不允许重复绑定
+			if (std_mobile.equals(std.getBindphone())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("您的账号已经绑定该手机号码,不需要重复绑定!");
+				return ajax;
+			}*/
+
+			// 1分钟内不允许再次发送短信
+			String error = this.isSysOperateFail(std_mobile, "sendSmsForLoginBindPhone", 1);
+			if (null != error) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(error);
+				return ajax;
+			}
+						
+
+			int code = (int) ((Math.random() * 9 + 1) * 100000);
+
+			String smstext = "您正在广西自学考试网上系统绑定手机,验证码:" + code + ",如非本人操作,请忽略本短信。(广西自学考试)";
+
+			JsonObject reslut = SmsSendUtil.sendSms(std_mobile, smstext);
+			if (null == reslut || null == reslut.get("flag") || !"succeed".equals(reslut.get("flag").getAsString())) {
+				String info = (null == reslut.get("msg")?"验证码发送失败,请稍后重试!":reslut.get("msg").getAsString());
+
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(info);
+
+				// 清空1分钟内不允许再次发送短信
+				removeSendSmsExt();
+
+				return ajax;
+			}
+
+			// 插入短信验证码表
+			SysSmsInfo sms = new SysSmsInfo();
+			sms.setPhone(std_mobile);
+			sms.setContent(smstext);
+			this.sysSmsInfoService.insert(sms);
+
+			// 插入短信验证码表
+			SysVerificationCode sysCode = new SysVerificationCode();
+			sysCode.setPhone(std_mobile);
+			sysCode.setCode(code + "");
+			sysCode.setStatus(0);
+			this.sysVerificationCodeService.insert(sysCode);
+			
+			// 记录发短信次数
+			this.setSysOperateFail(std_mobile, "sendSmsForLoginBindPhone", 1, 1, "请1分钟之后再重新发送验证码!");
+
+			return new Ajax();
+		} finally {
+			this.getSession().removeAttribute("vCode");
+		}
+	}
+	
+	@RequestMapping("/std/bindPhone")
+	public Ajax bindPhone(String std_pass, String std_mobile,String code) {
+		if(null == std_mobile){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入手机号!");
+			return ajax;
+		}
+		
+		if(null == std_pass){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入密码!");
+			return ajax;
+		}
+		
+		if(null == code){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入验证码!");
+			return ajax;
+		}
+		
+		std_pass = cutPasssword(std_pass);
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if(!stdRegInfo.getStd_pass().equals(std_pass)){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("密码不正确请重新输入!");
+			return ajax;
+		}
+		
+		String error = this.isSysOperateFail(stdRegInfo.getCert_no(), "canBindPhoneTime", 5);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+		
+		String year_code = YearCodeHelper.getCurrentYearCode();
+		
+		List<StdRegInfo> stds = this.stdRegInfoService.findStdByStdPhone(std_mobile, null);
+		if(null != stds && !stds.isEmpty()){
+			for(StdRegInfo std:stds){
+				if (stdRegInfo.getId().intValue() != std.getId().intValue() && null != std.getYear_code()
+						&& year_code.equals(std.getYear_code().toString())) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("手机号" + std_mobile + "已绑定,不允许重复绑定!");
+					return ajax;
+				}
+			}
+		}
+		
+		
+		
+		//根据手机号码和短信验证码获取短信信息
+		List<SysVerificationCode> codes = this.sysVerificationCodeService.querySysVerificationCodeByCode(std_mobile, code);
+		
+		// 验证验证码有效性
+		if (null == codes || codes.isEmpty()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("验证码错误或验证码已失效,请重新发送验证码!");
+			
+			//记录验证失败信息
+			this.setSysOperateFail(stdRegInfo.getCert_no(), "canBindPhoneTime", 5, 5, "绑定手机失败累计超过5次,请5分钟之后再尝试!");
+			
+			return ajax;
+		}
+		
+		// 验证通过,更新验证码表
+		SysVerificationCode sysVerificationCode = codes.get(0);
+		sysVerificationCode.setStatus(1);
+		this.sysVerificationCodeService.edit(sysVerificationCode);
+		
+		// 验证通过,更新绑定手机号码到考生表
+		StdRegInfo std = new StdRegInfo();
+		std.setId(stdRegInfo.getId());
+		std.setBindphone(std_mobile);
+		std.setStd_mobile(std_mobile);
+		
+		// 加密考生敏感信息
+		this.stdRegInfoService.EncryptStd(std);
+		
+		this.stdRegInfoService.edit(std);
+		
+		// 更新到缓存中
+		stdRegInfo.setBindphone(std_mobile);
+		stdRegInfo.setStd_mobile(std_mobile);
+		
+		stdRegInfo.setBindphone_en(std.getBindphone_en());
+		stdRegInfo.setStd_mobile_en(std.getStd_mobile_en());
+		
+		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, stdRegInfo);
+		
+		// 添加日志
+		this.regLogService.insertStdRegLog(stdRegInfo, OperType.UPDATE.ordinal());
+		
+		return new Ajax();
+	}
+	
+	@RequestMapping("/std/bindEmail")
+	public Ajax bindEmail(String std_pass, String std_email,String code) {
+		if(null == std_email){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入电子邮箱!");
+			return ajax;
+		}
+		
+		if(null == std_pass){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入密码!");
+			return ajax;
+		}
+		
+		if(null == code){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请输入验证码!");
+			return ajax;
+		}
+		
+		std_pass = cutPasssword(std_pass);
+		StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if(!stdRegInfo.getStd_pass().equals(std_pass)){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("密码不正确请重新输入!");
+			return ajax;
+		}
+		
+		String error = this.isSysOperateFail(stdRegInfo.getCert_no(), "canBindEmailTime", 5);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+		
+		//根据邮箱和邮件验证码获取短信信息
+		List<SysVerificationEmailCode> codes = this.sysVerificationEmailCodeService.querySysVerificationEmailCodeByCode(std_email, code);
+		
+		// 验证验证码有效性
+		if (null == codes || codes.isEmpty()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("验证码错误或验证码已失效,请重新发送验证码!");
+			
+			//记录验证失败信息
+			this.setSysOperateFail(stdRegInfo.getCert_no(), "canBindEmailTime", 5, 5, "绑定邮箱失败累计超过5次,请5分钟之后再尝试!");
+			
+			return ajax;
+		}
+		
+		// 验证通过,更新验证码表
+		SysVerificationEmailCode sysVerificationEmailCode = codes.get(0);
+		sysVerificationEmailCode.setStatus(1);
+		this.sysVerificationEmailCodeService.edit(sysVerificationEmailCode);
+		
+		// 验证通过,更新绑定手机号码到考生表
+		StdRegInfo std = new StdRegInfo();
+		std.setId(stdRegInfo.getId());
+		std.setBind_email(std_email);
+		//std.setStd_email(std_email);
+		
+		// 加密考生敏感信息
+		this.stdRegInfoService.EncryptStd(std);
+		
+		this.stdRegInfoService.edit(std);
+		
+		// 更新到缓存中
+		stdRegInfo.setBind_email(std_email);
+		//stdRegInfo.setStd_email(std_email);
+		
+		stdRegInfo.setBind_email_en(std.getBind_email_en());
+		//stdRegInfo.setStd_email_en(std.getStd_email_en());
+		
+		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, stdRegInfo);
+		
+		// 添加日志
+		this.regLogService.insertStdRegLog(stdRegInfo, OperType.UPDATE.ordinal());
+		
+		return new Ajax();
+	}
+	
+	@RequestMapping("/std/bindPhoneForLogin")
+	public Ajax bindPhoneForLogin(StdRegInfo regInfo,String validateCode, String code) {
+		try {
+			if (null == code) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入验证码!");
+				return ajax;
+			}
+			
+			/*String sessionVcode = (String) getSession().getAttribute("vCode");
+			
+			if(StringUtils.isEmpty(sessionVcode)){
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请刷新校验码并重新填写!");
+				return ajax;
+			}
+
+			
+			if (!validateCode.equalsIgnoreCase(sessionVcode)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("校验码不正确,请重新填写!");
+				return ajax;
+			}*/
+
+			if (null == regInfo.getStd_mobile()) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入手机号!");
+				return ajax;
+			}
+			
+			
+			StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+
+			String error = this.isSysOperateFail(stdRegInfo.getCert_no(), "canBindTime", 5);
+			if (null != error) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(error);
+				return ajax;
+			}
+			
+			String year_code = YearCodeHelper.getCurrentYearCode();
+			
+			List<StdRegInfo> stds = this.stdRegInfoService.findStdByStdPhone(regInfo.getStd_mobile(), null);
+			if(null != stds && !stds.isEmpty()){
+				for(StdRegInfo std:stds){
+					if(null != std.getYear_code() && year_code.equals(std.getYear_code().toString())){
+						Ajax ajax = new Ajax();
+						ajax.setSuccess(false);
+						ajax.setErrorMsg("手机号"+regInfo.getStd_mobile()+"已登记,不允许重复登记!");
+						return ajax;
+					}
+				}
+			}
+			
+		
+			// 根据手机号码和短信验证码获取短信信息
+			List<SysVerificationCode> codes = this.sysVerificationCodeService.querySysVerificationCodeByCode(regInfo.getStd_mobile(),
+					code);
+
+			// 验证验证码有效性
+			if (null == codes || codes.isEmpty()) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("验证码错误或验证码已失效,请重新发送验证码!");
+
+				// 记录验证失败信息
+				this.setSysOperateFail(stdRegInfo.getCert_no(), "canBindTime", 5, 5, "绑定手机失败累计超过5次,请5分钟之后再尝试!");
+
+				return ajax;
+			}
+
+			// 验证通过,更新验证码表
+			SysVerificationCode sysVerificationCode = codes.get(0);
+			sysVerificationCode.setStatus(1);
+			this.sysVerificationCodeService.edit(sysVerificationCode);
+
+			// 验证通过,更新绑定手机号码到考生表
+			StdRegInfo std = new StdRegInfo();
+
+			std.setId(stdRegInfo.getId());
+			std.setBindphone(regInfo.getStd_mobile());
+			std.setStd_mobile(regInfo.getStd_mobile());
+			std.setProvince(regInfo.getProvince());
+			std.setCity(regInfo.getCity());
+			std.setCounty(regInfo.getCounty());
+			std.setStd_address(regInfo.getStd_address());
+			std.setYear_code(Integer.valueOf(year_code));
+			
+			// 加密考生敏感信息
+			this.stdRegInfoService.EncryptStd(std);
+
+			this.stdRegInfoService.edit(std);
+			
+			// 更新到缓存中
+			stdRegInfo.setBindphone(regInfo.getStd_mobile());
+			stdRegInfo.setStd_mobile(regInfo.getStd_mobile());
+			
+			stdRegInfo.setBindphone_en(std.getBindphone_en());
+			stdRegInfo.setStd_mobile_en(std.getStd_mobile_en());
+			
+			stdRegInfo.setProvince(std.getProvince());
+			stdRegInfo.setCity(std.getCity());
+			stdRegInfo.setCounty(std.getCounty());
+			stdRegInfo.setStd_address(std.getStd_address());
+			stdRegInfo.setStd_address_en(std.getStd_address_en());
+
+			
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, stdRegInfo);
+
+			// 添加日志
+			this.regLogService.insertStdRegLog(stdRegInfo, OperType.UPDATE.ordinal());
+
+			return new Ajax();
+		} finally {
+			this.getSession().removeAttribute("vCode");
+		}
+	}
+	
+	
+	@RequestMapping("/std/addStdeRportForm")
+	public Ajax addStdeRportForm(StdReportForm stdReportForm, String validateCode, Integer std_id) {
+		try {
+
+			String sessionVcode = (String) getSession().getAttribute("vCode");
+
+			if (StringUtils.isEmpty(sessionVcode)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请刷新校验码并重新填写!");
+				return ajax;
+			}
+
+			if (!validateCode.equalsIgnoreCase(sessionVcode)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("校验码不正确,请重新填写!");
+				return ajax;
+			}
+
+			StdRegInfo sessionStdRegInfo = (StdRegInfo) getRequest().getSession()
+					.getAttribute(EnrolSessionName.EnrolStdReg);
+			if (!StringUtils.isEmpty(std_id) && sessionStdRegInfo != null & !sessionStdRegInfo.getId().equals(std_id)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorCode(246);
+				ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+				getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+				return ajax;
+			}
+
+			StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+
+			// 校验会话的ID与修改的ID一致性
+			if (!sessionStdRegInfo.getId().equals(stdRegInfo.getId())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorCode(246);
+				ajax.setErrorMsg("检测到考生与会话考生不一致,请重新登陆!");
+				getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+				return ajax;
+			}
+			
+			// 填写自学考试考生赴考报备表开关
+			FrameParam param = this.frameParamService.find(FrameParam.class, "param_name", "std_report_form");
+			if (null != param && "Active".equals(param.getProtect_status())) {
+				// 根据考生查询是否已经缴费
+				List<StdEnrol> list = this.stdEnrolService.listEnrolByStdId(sessionStdRegInfo.getId(),
+						YearCodeHelper.getCurrentYearCode());
+				// 已缴费,则校验是否在填写报备表时间范围之内
+				if (null != list && !list.isEmpty()) {
+
+					LocalDateTime now = null;
+					StdEnrol time = this.stdEnrolService.getDataBaseTime();
+					if (null != time && null != time.getCreate_time()) {
+						now = time.getCreate_time();
+					} else {
+						now = LocalDateTime.now();
+					}
+
+					PlExamTime dbTime = this.examTimeService.queryPlExamTime(YearCodeHelper.getCurrentYearCode());
+
+					LocalDate start_date = dbTime.getExam_first_day();
+					LocalDate end_date = null;
+					if(null != dbTime.getExam_third_day()){
+						end_date = dbTime.getExam_third_day();
+					}else{
+						end_date = dbTime.getExam_second_day();
+					}
+
+					// 填写开始时间
+					LocalDateTime start_time = start_date.atTime(0, 0, 0);
+					// 填写结束时间
+					LocalDateTime end_time = end_date.atTime(0, 0, 0);
+
+					// 天数
+					int days = Integer.valueOf(param.getParam_value());
+
+					// 填写开始时间设定在考试开始时间+天数
+					start_time = start_time.plusDays(-days);
+					// 填写结束时间设定在考试结束时间
+					end_time = end_time.plusDays(1);
+
+					//now = start_time.plusDays(1);
+					if (!DateHelper.isBetween(now, start_time, end_time)) {
+						Ajax ajax = new Ajax();
+						ajax.setSuccess(false);
+						ajax.setErrorMsg("未在"+YearCodeHelper.getCurrentYearCode().substring(0, 4)+"年"+YearCodeHelper.getCurrentYearCode().substring(4, 6)+"月报备表填写时间范围之内,暂不允许提交!");
+						return ajax;
+					}
+
+				}else{
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("您本批次没有报考缴费,不允许提交!");
+					return ajax;
+				}
+
+			}else{
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("本批次报备表填写时间未开放,不允许提交!");
+				return ajax;
+			}
+						
+
+			if (StringUtils.isEmpty(stdReportForm.getStd_name())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入姓名!");
+				return ajax;
+			}
+
+			if (StringUtils.isEmpty(stdReportForm.getTicket_no())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入准考证号!");
+				return ajax;
+			}
+
+			if (StringUtils.isEmpty(stdReportForm.getStd_mobile())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入手机号!");
+				return ajax;
+			}
+
+			if (StringUtils.isEmpty(stdReportForm.getAlready_in_city())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请选择您当前是否已在考点所在城市!");
+				return ajax;
+			}
+
+			if (StringUtils.isEmpty(stdReportForm.getCurrent_province())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请选择当前所在地区省(市、自治区)!");
+				return ajax;
+			}
+
+			if (StringUtils.isEmpty(stdReportForm.getCurrent_city())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请选择当前所在地区市!");
+				return ajax;
+			}
+
+			if (StringUtils.isEmpty(stdReportForm.getCurrent_county())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请选择当前所在地区区(县)!");
+				return ajax;
+			}
+
+			if (StringUtils.isEmpty(stdReportForm.getCurrent_address())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请填写当前所在地区详细地址!");
+				return ajax;
+			}
+
+			if ("否".equals(stdReportForm.getAlready_in_city())) {
+				if (StringUtils.isEmpty(stdReportForm.getTravel_date())) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("请填写预计出行至报考考区的时间!");
+					return ajax;
+				}
+
+				if (StringUtils.isEmpty(stdReportForm.getArrive_province())) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("请选择抵达考区后入住地区省(市、自治区)!");
+					return ajax;
+				}
+
+				if (StringUtils.isEmpty(stdReportForm.getArrive_city())) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("请选择抵达考区后入住地区市!");
+					return ajax;
+				}
+
+				if (StringUtils.isEmpty(stdReportForm.getArrive_county())) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("请选择抵达考区后入住地区区(县)!");
+					return ajax;
+				}
+
+				if (StringUtils.isEmpty(stdReportForm.getArrive_address())) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("请填写抵达考区后入住地区详细地址!");
+					return ajax;
+				}
+			}else{
+				if (!StringUtils.isEmpty(stdReportForm.getTravel_date())) {
+					stdReportForm.setTravel_date(null);
+				}
+
+				if (!StringUtils.isEmpty(stdReportForm.getArrive_province())) {
+					stdReportForm.setArrive_province(null);
+				}
+
+				if (!StringUtils.isEmpty(stdReportForm.getArrive_city())) {
+					stdReportForm.setArrive_city(null);
+					
+				}
+
+				if (!StringUtils.isEmpty(stdReportForm.getArrive_county())) {
+					stdReportForm.setArrive_county(null);
+				}
+
+				if (!StringUtils.isEmpty(stdReportForm.getArrive_address())) {
+					stdReportForm.setArrive_address(null);
+					
+				}
+			}
+
+			if (StringUtils.isEmpty(stdReportForm.getIs_plan_city())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请选择考前14天期间,是否计划去或去过除当前所在地及考区所在地外的市!");
+				return ajax;
+			}
+
+			List<StdReportFormPlanCity> citys = null;
+
+			if ("是".equals(stdReportForm.getIs_plan_city())) {
+				if (StringHelper.isEmpty(stdReportForm.getPlanJson())) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("请填写计划或去过的地区!");
+					return ajax;
+				}
+
+				citys = JsonHelper.fromJson(stdReportForm.getPlanJson(), StdReportFormPlanCity.class);
+				int i = 0;
+				for (StdReportFormPlanCity city : citys) {
+					if (StringUtils.isEmpty(city.getPlan_province())) {
+						Ajax ajax = new Ajax();
+						ajax.setSuccess(false);
+						ajax.setErrorMsg("请选择第" + (i + 1) + "行的省(市、自治区)!");
+						return ajax;
+					}
+
+					if (StringUtils.isEmpty(city.getPlan_city())) {
+						Ajax ajax = new Ajax();
+						ajax.setSuccess(false);
+						ajax.setErrorMsg("请选择第" + (i + 1) + "行的市!");
+						return ajax;
+					}
+
+					if (StringUtils.isEmpty(city.getPlan_county())) {
+						Ajax ajax = new Ajax();
+						ajax.setSuccess(false);
+						ajax.setErrorMsg("请选择第" + (i + 1) + "行的区(县)!");
+						return ajax;
+					}
+
+					i++;
+				}
+			}
+
+			if (StringUtils.isEmpty(stdReportForm.getIs_high_risk())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请选择是否有中高风险地区所在市(县、区)旅居史!");
+				return ajax;
+			}
+
+			if (StringUtils.isEmpty(stdReportForm.getIs_quarantine())) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请选择是否处于隔离或居家观察中!");
+				return ajax;
+			}
+
+			String error = this.isSysOperateFail(stdRegInfo.getCert_no(), "canBindTime", 5);
+			if (null != error) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(error);
+				return ajax;
+			}
+			
+			if(StringUtils.isEmpty(stdReportForm.getYear_code())){
+				stdReportForm.setYear_code(Integer.valueOf(YearCodeHelper.getCurrentYearCode()));
+			}
+
+			StdReportForm reportForm = this.stdReportFormService
+					.queryStdReportFormByTicketNo(stdReportForm.getYear_code(), stdReportForm.getTicket_no());
+			if (null != reportForm) {
+				this.stdReportFormService.delete(reportForm.getId());
+				this.stdReportFormService.deleteStdReportFormPlanCityByReportFormId(reportForm.getId());
+			}
+
+			stdReportForm.setId(null);
+			Integer report_form_id = this.stdReportFormService.addStdReportForm(stdReportForm);
+
+
+			if (null != citys) {
+				for (StdReportFormPlanCity city : citys) {
+					city.setId(null);
+					city.setReport_form_id(report_form_id);
+					this.stdReportFormService.addStdReportFormPlanCity(city);
+				}
+			}
+
+			return new Ajax();
+		} finally {
+			this.getSession().removeAttribute("vCode");
+		}
+	}	
+
+	/**
+	 * 无登录修改密码
+	 * 
+	 * @return
+	 */
+	@RequestMapping("/std/passwordNoLogin")
+	public Ajax passwordNoLogin(String id, String validate_code, String std_pass1, String std_pass2) {
+		Ajax ajax = new Ajax();
+		
+		StdRegInfo temp_std = (StdRegInfo) getRequest().getSession().getAttribute("temp_std");
+		
+		// 校验验证通过的考生是否与修改密码的考生一致
+		if(null == temp_std || !java.lang.String.valueOf(temp_std.getId()).equals(id)){
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("考生ID非法,请重新验证考生信息!");
+			return ajax;
+		}else{
+			if (!std_pass1.equalsIgnoreCase(std_pass2)) {
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("两次输入密码不一致,请重新输入!");
+			} else {
+				StdRegInfo dbStdRegInfo = this.stdRegInfoService.find(id);
+				// 解密考生敏感信息
+				this.stdRegInfoService.DecryptStd(dbStdRegInfo);
+				
+				List<StdRegInfo> stds = stdRegInfoService.queryStdByNameAndCertno(dbStdRegInfo.getStd_name(),
+						dbStdRegInfo.getCert_no());
+				
+				if (null != stds) {
+					for (StdRegInfo std : stds) {
+						std.setStd_pass(this.cutPasssword(std_pass1));
+						this.stdRegInfoService.update(std);
+					}
+					
+					getRequest().getSession().removeAttribute("temp_std");
+				}
+			}
+			
+			return ajax;
+		}
+	}
+
+	/**
+	 * 发送手机验证码
+	 * 
+	 * @param std_id
+	 * @return
+	 */
+	@RequestMapping("/std/sendPhoneVcode")
+	public Ajax sendPhoneVcode(String std_id) {
+		//StdRegInfo dbStdRegInfo = this.stdRegInfoService.find(std_id);
+		//String std_mobile = dbStdRegInfo.getStd_mobile();
+		String phoneVcode = this.genPhoneVcode();
+		// System.out.println("验证码:"+phoneVcode);
+
+		this.setSessionPhoneVcode(phoneVcode);
+
+		return new Ajax(phoneVcode);
+	}
+
+	private void setSessionPhoneVcode(String phoneVcode) {
+		HttpSession session = this.getRequest().getSession();
+		List<String> vcodeList = (ArrayList<String>) session.getAttribute("phoneVCode");
+		if (vcodeList == null || vcodeList.size() == 0) {
+			vcodeList = new ArrayList<String>();
+		}
+		vcodeList.add(phoneVcode);
+		session.setAttribute("phoneVCode", vcodeList);
+	}
+
+	/**
+	 * 生成手机验证码 5位数
+	 * 
+	 * @return
+	 */
+	private String genPhoneVcode() {
+		String code = String.valueOf((int) ((Math.random() * 9 + 1) * 10000));
+		return code;
+	}
+
+	@RequestMapping("/std/findStdByCertNo")
+	public Ajax findStdByCertNo(String cert_no,String std_name,String ticket_no) {
+		String error = this.isSysOperateFail(cert_no, "canResetTime", 30);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+		
+		StdRegInfo dbStdRegInfo = this.stdRegInfoService.findStdByCertNo(cert_no,std_name,ticket_no);
+		
+		// 记录二次校验失败次数
+		if(null == dbStdRegInfo || null == dbStdRegInfo.getId()){
+			this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+		}
+
+		// 设置验证通过的考生信息到临时会话中,在修改密码时校验
+		HttpSession session = getSession();
+		
+		// 只返回考生必须的字段给前台,避免考生信息暴露
+		StdRegInfo std = null;
+		if(null != dbStdRegInfo){
+			std = new StdRegInfo();
+			std.setId(dbStdRegInfo.getId());	
+			std.setTicket_no(dbStdRegInfo.getTicket_no());
+			std.setBindphone(dbStdRegInfo.getBindphone());
+			if(null != dbStdRegInfo.getQuestion()){
+				std.setQuestion("Question");
+			}
+			
+		}else{
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("身份验证失败,请重新输入!");
+			return ajax;
+		}
+		
+		session.setAttribute("temp_std", dbStdRegInfo);
+		
+		return new Ajax(std);
+	}
+	
+	@RequestMapping("/std/checkQuestion")
+	public Ajax checkQuestion(String cert_no,String std_name,String question,String answer) {
+		String error = this.isSysOperateFail(cert_no, "canResetTime", 30);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("二次验证失败累计超过5次,请30分钟之后再尝试!");
+			return ajax;
+		}
+		
+		StdRegInfo dbStdRegInfo = this.stdRegInfoService.checkQuestion(cert_no,std_name,question,answer);
+		
+		// 记录二次校验失败次数
+		if(null == dbStdRegInfo || null == dbStdRegInfo.getId()){
+			this.setSysOperateFail(cert_no, "canResetTime", 5, 30, "身份验证失败累计超过5次,请30分钟之后再尝试!");
+			
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("验证失败!");
+			return ajax;
+		}
+		
+		// 设置验证通过的考生信息到临时会话中,在修改密码时校验
+		HttpSession session = getSession();
+		
+		// 只返回考生必须的字段给前台,避免考生信息暴露
+		StdRegInfo std = null;
+		if(null != dbStdRegInfo){
+			std = new StdRegInfo();
+			std.setId(dbStdRegInfo.getId());	
+			std.setTicket_no(dbStdRegInfo.getTicket_no());
+		}
+				
+		session.setAttribute("temp_std", dbStdRegInfo);
+		
+		return new Ajax(std);
+	}
+
+	// 密码截取
+	private String cutPasssword(String password) {
+		if (StringHelper.isNotEmpty(password) && password.length() >= 8) {
+			return password.toUpperCase().substring(0, 8);
+		} else {
+			throw new BusinessException("密码不能为空!");
+		}
+	}
+
+	/**
+	 * 考生信息保存 (不包括图片)
+	 * 
+	 * @param stdRegInfo
+	 * @return
+	 */
+	@RequestMapping("/std/stdRegInfo/edit")
+	public Ajax editStdRegInfo(StdRegInfo stdRegInfo,Integer std_id) {
+		StdRegInfo sessionStdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (!StringUtils.isEmpty(std_id) && sessionStdRegInfo != null &!sessionStdRegInfo.getId().equals(std_id)) {
+    		Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+		
+		// 校验会话的ID与修改的ID一致性
+		if(!sessionStdRegInfo.getId().equals(stdRegInfo.getId())){
+			Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生与会话考生不一致,请重新登陆!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+		
+		StdRegInfo dbStd = this.stdRegInfoService.find(sessionStdRegInfo.getId());
+		if(null != dbStd){
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStd);
+		}
+		
+		 //20220424 蓝剑 考生不允许选择助学考生,主考学校网络助学、专本衔接考生备案审核通过时才更新
+        // 更新考生来源时,如果旧考生来源不是助学考生,要更新成助学考生,不允许。
+		if (!(null != dbStd.getStd_source() && dbStd.getStd_source().intValue() == 3)
+				&& null != stdRegInfo.getStd_source() && stdRegInfo.getStd_source().intValue() == 3) {
+			throw new BusinessException("考生来源不允许选择助学考生,助学考生由主考院校考生备案后统一修改。");
+		}
+		
+		// 关键信息有修改时,校验是否允许修改
+		if (!dbStd.getStd_name().equals(stdRegInfo.getStd_name()) || !dbStd.getCert_no().equals(stdRegInfo.getCert_no())
+				|| (null !=stdRegInfo.getCert_type() && !stdRegInfo.getCert_type().equals(dbStd.getCert_type()))) {
+			
+			boolean existScore = this.cjJigechengjiOldService.existScore(dbStd.getId());
+			if(existScore){
+				throw new BusinessException("存在历史成绩,不允许直接修改姓名、证件号以及证件类型!请进入个人中心->考生信息变更,提交申请单。");
+			}
+			
+			HashMap<String, Object> paraMapTime = new HashMap<String, Object>();
+			paraMapTime.put("year_code", YearCodeHelper.getCurrentYearCode());
+			List<PlExamTime> dbTime = this.examTimeService.listByMap(paraMapTime);
+			PlExamTime currentTime = null;
+			if (dbTime.size() > 0) {
+				currentTime = dbTime.get(0);
+			}else{
+				throw new BusinessException("无当前批次信息");
+			}
+			
+			HashMap<String, Object> paraMap = new HashMap<String, Object>();
+			paraMap.put("std_reg_id", dbStd.getId());
+			paraMap.put("exam_time_id", currentTime.getId());
+			paraMap.put("fee_status", "1");
+			List<StdEnrol> enrolList = this.stdEnrolService.listByMap(paraMap);
+			for (StdEnrol enrol : enrolList) {
+				if (enrol.getStatus() >=4) {
+					throw new BusinessException("当前批次内存在报考信息,不允许直接修改姓名、证件号以及证件类型!请进入个人中心->考生信息变更,提交申请单。");
+				}
+			}
+			
+			if(null != stdRegInfo.getStd_name()){
+				stdRegInfo.setStd_name(stdRegInfo.getStd_name().trim());
+			}
+			
+			if(null != stdRegInfo.getCert_no()){
+				stdRegInfo.setCert_no(stdRegInfo.getCert_no().trim());
+			    String std_birth = !StringUtils.isEmpty(stdRegInfo.getCert_no())&&stdRegInfo.getCert_no().length() == 18?
+			    		stdRegInfo.getCert_no().substring(6,10) + "" + stdRegInfo.getCert_no().substring(10,12) + "" + stdRegInfo.getCert_no().substring(12,14):"";
+				dbStd.setStd_birth(std_birth);
+			}
+			
+		}
+		
+		
+		//身份证号变更
+		if(!StringUtils.isEmpty(stdRegInfo.getCert_no()) && 
+				!stdRegInfo.getCert_no().trim().equals(dbStd.getCert_no())){
+			//验证合法
+			if ((stdRegInfo.getCert_type() == null || stdRegInfo.getCert_type() == 1) && !StringUtils.isEmpty(stdRegInfo.getCert_no()) && !FrameIdCardUtil.validateIdCard18(stdRegInfo.getCert_no().trim())) {
+				throw new BusinessException("身份证[" + stdRegInfo.getCert_no() + "]不合法,请重新填写!");
+			}
+			
+			String cert_no_en = AesUtil.Encrypt(stdRegInfo.getCert_no().trim());
+			//验证重复
+			List<StdRegInfo> list = this.stdRegInfoService.list("cert_no_en", cert_no_en);
+			for (StdRegInfo vo : list) {
+				if (!vo.getId().equals(sessionStdRegInfo.getId())) {
+					throw new BusinessException("证件号:"+stdRegInfo.getCert_no()+"已有其他用户注册,无法更新");
+				}
+			}
+			
+		}
+		
+		//准考证号变更
+		if(!StringUtils.isEmpty(stdRegInfo.getTicket_no()) && 
+				!stdRegInfo.getTicket_no().trim().equals(dbStd.getTicket_no())){
+			throw new BusinessException("准考证号已经生成,不允许修改。");
+		}
+		
+		String photo_url = dbStd.getPhoto_url();
+		if (!StringUtils.isEmpty(photo_url)) {
+			stdRegInfo.setStatus(StdConst.Status.IMGDONE.ordinal());
+		} else {
+			stdRegInfo.setStatus(StdConst.Status.INFODONE.ordinal());
+		}
+
+		// 如果是社会考生 置空 主考院校和助学班
+		if (null != stdRegInfo.getStd_source() && stdRegInfo.getStd_source() == StdConst.StudentType.SOCIAL.ordinal()) {
+			stdRegInfo.setSchool_id(null);
+			stdRegInfo.setAssist_id(null);
+		}
+		
+		stdRegInfo.setPhoto_url(dbStd.getPhoto_url());
+		stdRegInfo.setPhoto_path(dbStd.getPhoto_path());
+		stdRegInfo.setPhoto_id(dbStd.getPhoto_id());
+		stdRegInfo.setCert_no_must_update(0);
+		
+		// 绑定手机号不允许更新
+		stdRegInfo.setBindphone(null);
+		
+		// 绑定邮箱不允许更新
+		stdRegInfo.setBind_email(null);
+		
+		// 身份认证不允许更新
+		stdRegInfo.setIs_identfiy(null);
+		
+		// 加密考生敏感信息
+		this.stdRegInfoService.EncryptStd(stdRegInfo);
+		String std_name = stdRegInfo.getStd_name();
+		
+		if (!std_name.equals(dbStd.getStd_name())) {
+			if (!PatternUtil.checkStdName(std_name.trim())) {
+				throw new BusinessException("请输入正确中文姓名且长度在15个字范围内!");
+			}
+		}
+		
+		
+		this.stdRegInfoService.update(stdRegInfo);
+	
+		stdRegInfo.setBindphone(dbStd.getBindphone());
+		stdRegInfo.setBind_email(dbStd.getBind_email());
+		stdRegInfo.setIs_identfiy(dbStd.getIs_identfiy());
+		
+		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, stdRegInfo);
+		// 添加日志
+		this.regLogService.insertStdRegLog(stdRegInfo, OperType.UPDATE.ordinal());
+		return new Ajax(stdRegInfo);
+	}
+
+	@RequestMapping("/std/stdRegInfo/editMajor")
+	public Ajax editMajor(StdRegInfo stdRegInfo,Integer std_id) {
+		StdRegInfo sessionStdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (!StringUtils.isEmpty(std_id) && sessionStdRegInfo != null &!sessionStdRegInfo.getId().equals(std_id)) {
+    		Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+		
+		// 校验会话的ID与修改的ID一致性
+		if(!sessionStdRegInfo.getId().equals(stdRegInfo.getId())){
+			Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生与会话考生不一致,请重新登陆!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+		
+		StdRegInfo dbStdRegInfo = this.stdRegInfoService.find(sessionStdRegInfo.getId());
+		if (dbStdRegInfo != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStdRegInfo);
+		}
+		
+		PlMajor dbMajor = this.plMajorService.find(stdRegInfo.getMajor_id());
+		if(null != dbMajor){
+			// 专业I信息
+			dbStdRegInfo.setMajor_id(dbMajor.getId());
+			dbStdRegInfo.setMajor_code(dbMajor.getMajor_code());
+		}
+
+		
+		// 社会考生
+		// if (dbStdRegInfo.getStd_source() ==
+		// StdConst.StudentType.SOCIAL.ordinal()) {
+		// dbStdRegInfo.setSchool_id(stdRegInfo.getSchool_id());
+		// }
+
+		// 考点信息
+		dbStdRegInfo.setExam_area_id(stdRegInfo.getExam_area_id());
+
+		// 生成准考证号
+//		if (StringUtils.isEmpty(dbStdRegInfo.getTicket_no()) && !StringUtils.isEmpty(dbStdRegInfo.getPhoto_url())) {
+//			dbStdRegInfo.setTicket_no(this.stdRegInfoService.genTicketNo(dbStdRegInfo));
+//		}
+		dbStdRegInfo.setStatus(StdConst.Status.ALLDONE.ordinal());
+
+		this.editStdMajor(dbStdRegInfo, dbMajor);
+
+		this.stdRegInfoService.update(dbStdRegInfo);
+		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, dbStdRegInfo);
+		HashMap<String, Object> rtnMap = new HashMap<String, Object>();
+		rtnMap.put("stdMajor", dbMajor);
+		rtnMap.put("stdReg", dbStdRegInfo);
+		return new Ajax(rtnMap);
+	}
+	
+	
+	/**准考证 生成确定
+	 * @param std_id
+	 * @return
+	 */
+	@RequestMapping("/std/stdRegInfo/handleGenTicketNo")
+	public Ajax handleGenTicketNo(Integer std_id,boolean handleConfirm) {
+		Ajax ajax = new Ajax();
+		StdRegInfo sessionStdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (!StringUtils.isEmpty(std_id) && sessionStdRegInfo != null &!sessionStdRegInfo.getId().equals(std_id)) {
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+		
+		synchronized (std_id) {
+			StdRegInfo dbStdRegInfo = this.stdRegInfoService.find(sessionStdRegInfo.getId());
+			if (dbStdRegInfo != null) {
+				// 解密考生敏感信息
+				this.stdRegInfoService.DecryptStd(dbStdRegInfo);
+			}
+			// 使用新的准考证生成规则 
+			// 具备生成准考证号条件
+			if (StringUtils.isEmpty(dbStdRegInfo.getTicket_no()) && 
+					!StringUtils.isEmpty(dbStdRegInfo.getPhoto_path()) &&  
+					!StringUtils.isEmpty(dbStdRegInfo.getStd_city())&&
+					!StringUtils.isEmpty(dbStdRegInfo.getStd_county())) {
+				if(handleConfirm){
+					dbStdRegInfo.setTicket_no(this.stdRegInfoService.getTicketNoByCity(dbStdRegInfo));
+					this.stdRegInfoService.update(dbStdRegInfo);
+					// 添加日志
+					this.regLogService.insertStdRegLog(dbStdRegInfo, OperType.UPDATE.ordinal());
+					
+					//更新准考证到会话
+					StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+					std.setTicket_no(dbStdRegInfo.getTicket_no());
+					getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, std);
+					
+					
+					ajax.setEntity(dbStdRegInfo.getTicket_no());
+				}
+				ajax.setSuccess(true);
+			}else{
+				if (!StringUtils.isEmpty(dbStdRegInfo.getTicket_no())) {
+					ajax.setErrorMsg("准考证已生成!");
+				}
+				if (StringUtils.isEmpty(dbStdRegInfo.getPhoto_path())) {
+					ajax.setErrorMsg("未上传考生照片!");
+				}
+				if (StringUtils.isEmpty(dbStdRegInfo.getStd_city()) ||
+								StringUtils.isEmpty(dbStdRegInfo.getStd_county())) {
+					ajax.setErrorMsg("请选择报考地市!");
+				}
+				ajax.setSuccess(false);
+			}
+		}
+		
+		// 具备生成准考证号条件
+		/*if (StringUtils.isEmpty(dbStdRegInfo.getTicket_no()) && 
+				!StringUtils.isEmpty(dbStdRegInfo.getPhoto_url()) &&  
+				!StringUtils.isEmpty(dbStdRegInfo.getStd_source())) {
+			if(handleConfirm){
+				dbStdRegInfo.setTicket_no(this.stdRegInfoService.genTicketNo(dbStdRegInfo));
+				this.stdRegInfoService.edit(dbStdRegInfo);
+				ajax.setEntity(dbStdRegInfo.getTicket_no());
+			}
+			ajax.setSuccess(true);
+		}else{
+			ajax.setSuccess(false);
+		}*/
+		 
+		return ajax;
+	}
+	
+
+	/**
+	 * 更新std_major关系表数据
+	 * 
+	 * @param dbStdRegInfo
+	 * @param dbMajor
+	 */
+	private void editStdMajor(StdRegInfo dbStdRegInfo, PlMajor dbMajor) {
+		List<StdMajor> dbStdMajorList = stdMajorService.list("std_reg_id", dbStdRegInfo.getId());
+		for (StdMajor dbStdMajor : dbStdMajorList) {
+			stdMajorService.delete(dbStdMajor.getId());
+		}
+
+		StdMajor stdMajor = new StdMajor();
+		stdMajor.setStd_reg_id(dbStdRegInfo.getId());
+		stdMajor.setCert_no(dbStdRegInfo.getCert_no());
+		stdMajor.setFull_name(dbMajor.getMajor_full_name());
+		stdMajor.setMajor_code(dbMajor.getMajor_code());
+		stdMajor.setMajor_id(dbMajor.getId());
+		stdMajor.setMajor_name(dbMajor.getMajor_name());
+		stdMajor.setStd_name(dbStdRegInfo.getStd_name());
+		stdMajor.setTicket_no(dbStdRegInfo.getTicket_no());
+
+		stdMajorService.insert(stdMajor);
+	}
+	
+	/**
+	 * 身份证认证
+	 * @param stdRegInfo
+	 * @param std_id
+	 * @return
+	 */
+	@RequestMapping("/std/stdRegInfo/identifyCard")
+	public Ajax identifyCard(StdRegInfo stdRegInfo,Integer std_id) {
+		StdRegInfo sessionStdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (!StringUtils.isEmpty(std_id) && sessionStdRegInfo != null &!sessionStdRegInfo.getId().equals(std_id)) {
+    		Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+		
+		// 校验会话的ID与修改的ID一致性
+		if(!sessionStdRegInfo.getId().equals(stdRegInfo.getId())){
+			Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorCode(246);
+    		ajax.setErrorMsg("检测到考生与会话考生不一致,请重新登陆!");
+    		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+    		return ajax;
+		}
+		
+		StdRegInfo dbStd = this.stdRegInfoService.find(sessionStdRegInfo.getId());
+		if (dbStd != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStd);
+		}
+		
+		if(null != dbStd && null != dbStd.getIs_identfiy() && dbStd.getIs_identfiy().intValue() == 1){
+			Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("身份证已认证,不允许重复认证。");
+    		return ajax;
+		}
+		
+		if(null == dbStd || StringUtils.isEmpty(dbStd.getCert_no())){
+			Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("证件号为空,无法进行身份证认证。");
+    		return ajax;
+		}
+		
+		if(null == dbStd || StringUtils.isEmpty(dbStd.getStd_name())){
+			Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("姓名为空,无法进行身份证认证。");
+    		return ajax;
+		}
+		
+		// 证件号验证
+		String cert_no = dbStd.getCert_no();
+		
+		if (null != cert_no && cert_no.length() == 15) {
+			Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("15位证件号,请到达各市考办进行身份证升位和身份认证!");
+    		return ajax;
+		}
+		
+		if (null != cert_no && cert_no.length() == 18 && !FrameIdCardUtil.validateIdCard18(cert_no)) {
+			Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("身份证[" + cert_no + "]不合法,无法进行身份证认证,请进入个人中心申请变更身份信息。");
+    		return ajax;
+		}
+		
+		 //List<StdRegInfo> stds = this.stdRegInfoService.queryStdByCertno(cert_no);
+		 
+		/* if(null != stds && !stds.isEmpty()){
+			 for(StdRegInfo std:stds){
+				 // 系统已经存在其他的账号的证件类型是身份证,认证失败
+				 if(null != std && null != std.getCert_type() && std.getCert_type().intValue() == 1 && dbStd.getId().intValue() != std.getId().intValue()){
+					 throw new BusinessException("身份证[" + cert_no + "],系统已经存在证件类型是身份证的其他账号,身份证认证失败!");
+				 }
+			 }
+		 }*/
+		 
+		// 1分钟内不允许再次验证
+		if (!isIdentifyCardFialExt()) {
+			Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("请1分钟之后再重新进行身份认证!");
+    		return ajax;
+		}
+		 
+		StdRegInfo temp_std = new StdRegInfo();
+		temp_std.setCert_no(cert_no);
+		temp_std.setStd_name(dbStd.getStd_name());
+		
+		if (null != cert_no && cert_no.length() == 18) {
+		//  身份证认证
+			String result = this.checkIdentifyCard(temp_std);
+			
+			if(null == result){
+				//身份认证失败
+				Ajax ajax = new Ajax();
+	    		ajax.setSuccess(false);
+	    		ajax.setErrorMsg("身份证认证不通过,请进入个人中心申请变更身份信息。");
+	    		return ajax;
+				
+			}else if(!"success".equals(result)){
+				// 身份认证失败
+				Ajax ajax = new Ajax();
+	    		ajax.setSuccess(false);
+	    		ajax.setErrorMsg(result);
+	    		return ajax;
+	    		
+			}else{
+				// 身份认证成功
+				// 设置身份认证成功标识
+				dbStd.setIs_identfiy(1);
+				
+				// 设置证件类型为身份证
+				dbStd.setCert_type(1);
+				
+				// 保存认证信息
+				this.stdRegInfoService.update(dbStd);
+				
+				// 更新考生会话信息
+				getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, dbStd);
+				
+				// 添加日志
+				this.regLogService.insertStdRegLog(dbStd, OperType.UPDATE.ordinal());
+				
+				return new Ajax(dbStd);
+			}
+		}else if(null != cert_no && (cert_no.toUpperCase().startsWith("H")||cert_no.toUpperCase().startsWith("M") || (null != dbStd.getCert_type() && dbStd.getCert_type().intValue() == 8))){
+			// 港澳台考生身份认证
+			String result = this.verifyCertificate(dbStd);
+
+			if (null == result) {
+				// 身份认证失败
+				Ajax ajax = new Ajax();
+	    		ajax.setSuccess(false);
+	    		ajax.setErrorMsg("港澳台身身份认证不通过。");
+	    		return ajax;
+	    		
+			} else if (!"success".equals(result)) {
+				// 身份认证失败
+				Ajax ajax = new Ajax();
+	    		ajax.setSuccess(false);
+	    		ajax.setErrorMsg(result);
+	    		return ajax;
+			} else {
+				// 港澳台身份认证成功
+				// 设置身份认证成功标识
+				dbStd.setIs_identfiy(1);
+				
+				// 保存认证信息
+				this.stdRegInfoService.update(dbStd);
+				
+				// 更新考生会话信息
+				getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, dbStd);
+				
+				// 添加日志
+				this.regLogService.insertStdRegLog(dbStd, OperType.UPDATE.ordinal());
+				
+				return new Ajax(dbStd);
+			}
+		}else{
+			Ajax ajax = new Ajax();
+    		ajax.setSuccess(false);
+    		ajax.setErrorMsg("证件号不是身份证或港澳居民往来内地通行证或台湾居民往来内地通行证,无法进行身份认证!");
+    		return ajax;
+		}
+		
+	}
+	
+
+	/*@RequestMapping("/std/stdRegInfo/delete")
+	public Ajax deleteStdRegInfo(Integer id) {
+		this.stdRegInfoService.delete(id);
+		return new Ajax();
+	}*/
+
+	@RequestMapping("/std/stdRegInfo/get")
+	public Ajax getStdRegInfo() {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		
+		StdRegInfo stdRegInfo = this.stdRegInfoService.find(std.getId());
+		if(null != stdRegInfo){
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(stdRegInfo);
+		}
+		
+		return new Ajax(stdRegInfo);
+	}
+
+	/**
+	 * @param file
+	 * @return
+	 */
+	@RequestMapping("/std/stdRegInfo/uploadImgForPhotoReview")
+	public Ajax uploadImguploadImgForPhotoReview(MultipartFile file) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		StdRegInfo dbStdRegInfo = this.stdRegInfoService.find(std.getId());
+		if (dbStdRegInfo != null) {
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStdRegInfo);
+		}
+		
+		String fileSeq = this.stdRegInfoService.getFileSeq();
+		String feature1 = null;
+		String feature2 = null;
+		String pass_score = null;
+
+		FrameParam loginParam = this.stdRegInfoDao.find(FrameParam.class, "param_name", "featureScore");
+		if (null == loginParam || "InActive".equals(loginParam.getProtect_status())) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(-1);
+			ajax.setErrorMsg("照片合规检查功能未开放,不允许进行照片合规检查操作。");
+			return ajax;
+		}
+
+		pass_score = loginParam.getParam_value();
+
+		String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+		// 转换小写
+		extension = extension.toLowerCase();
+
+		// 校验文件类型
+		if (!"jpg".equals(extension) && !"jpeg".equals(extension) && !"png".equals(extension)
+				&& !"gif".equals(extension) && !"bmp".equals(extension)) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("上传图片必须是JPG/JPEG/PNG/格式!");
+			return ajax;
+		}
+
+		String cert_no = dbStdRegInfo.getCert_no();
+
+		String rootPath = SysConst.getAppConfig().getUploadBase();
+		// 创建文件夹
+		makeDir(rootPath);
+
+		long time = new Date().getTime();
+
+		String fullFileName = rootPath + SysConst.IMG_FACE_PREFIX + cert_no + "_" + time + "_" + fileSeq + "."
+				+ extension;
+		File desfile = new File(fullFileName);
+		try {
+			file.transferTo(desfile);
+		} catch (IOException e) {
+			LogHelper.error(e);
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(-1);
+			ajax.setErrorMsg("保存上传文件失败。");
+			return ajax;
+		}
+
+		// ----------------------------照片水印校验开始-------------------------
+		String response = PhotoUtil.verifyWatermark(fullFileName);
+
+		// 校验成功
+		if ("0".equals(response)) {
+			dbStdRegInfo.setPhoto_compliance("1");
+		} else {
+			// 校验失败
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(-1);
+			ajax.setErrorMsg(response);
+			return ajax;
+		}
+
+		// ----------------------------照片水印校验结束-------------------------
+
+		// ----------------------------特征值获取开始-------------------------
+		Map<String, String> result = PhotoUtil.getExtractFeature(fullFileName);
+
+		// 成功
+		if ("0".equals(result.get("code").toString())) {
+			feature1 = result.get("msg");
+			//dbStdRegInfo.setFeature(feature1);
+		} else {
+			// 失败
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(-1);
+			ajax.setErrorMsg(result.get("msg"));
+			return ajax;
+		}
+
+		// ----------------------------特征值获取结束-------------------------
+
+		// ----------------------------获取 广西区内身份证照片获取开始-------------------------
+		// 获取 广西区内身份证照片
+		JsonObject identfiy = IdentifyCardOrcUtil.identifyCardImage(dbStdRegInfo.getCert_no().toUpperCase(),
+				dbStdRegInfo.getStd_name());
+
+		if (identfiy.get("code").getAsInt() == 1) {
+
+			JsonObject data = identfiy.get("data").getAsJsonObject();
+			String photoData = data.get("photoData").getAsString();
+
+			if (null != photoData) {
+				time = new Date().getTime();
+				fileSeq = this.stdRegInfoService.getFileSeq();
+				String fileName = SysConst.getAppConfig().getDownloadTemp()
+						+ dbStdRegInfo.getCert_no() + "_" + time + "_" + fileSeq + ".jpg";
+
+				// 不存在则创建文件夹
+				makeDir(SysConst.getAppConfig().getDownloadTemp());
+
+				// base64 to image
+				File tempFile = IdentifyCardOrcUtil.base64StringToImage(photoData, fileName);
+
+				// ----------------------------特征值获取开始-------------------------
+				result = PhotoUtil.getExtractFeature(fileName);
+
+				// 成功
+				if ("0".equals(result.get("code").toString())) {
+					feature2 = result.get("msg");
+				} else {
+					// 失败
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorCode(-1);
+					ajax.setErrorMsg(result.get("msg"));
+					return ajax;
+				}
+
+				// ----------------------------特征值获取结束-------------------------
+
+				// ----------------------------特征值对比开始-------------------------
+				Map<String, String> map = PhotoUtil.compareFeature(feature1, feature2);
+				String score = null;
+				// 成功
+				if ("0".equals(map.get("code"))) {
+					score = map.get("msg");
+
+					BigDecimal pass_scoreDecimal = new BigDecimal(pass_score);
+					BigDecimal scoreDecimal = new BigDecimal(score);
+
+					// 特征值比较得分小于设置的分数,对比不通过
+					if (scoreDecimal.compareTo(pass_scoreDecimal) < 0) {
+						Ajax ajax = new Ajax();
+						ajax.setSuccess(false);
+						ajax.setErrorCode(-1);
+						ajax.setErrorMsg("上传的照片与身份证照片不匹配,请考生提交考生信息变更申请,变更考生照片,并到达现场审核。");
+						return ajax;
+					}
+
+				} else {
+					// 失败
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorCode(-1);
+					ajax.setErrorMsg(map.get("msg"));
+					return ajax;
+				}
+
+				// ----------------------------特征值对比结束-------------------------
+
+				// 删除临时照片
+				if (null != tempFile && tempFile.exists()) {
+					tempFile.delete();
+				}
+
+			} else {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorCode(-1);
+				ajax.setErrorMsg("身份证照片为空,照片合规检查失败。");
+				return ajax;
+			}
+
+		} else {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorCode(-1);
+			ajax.setErrorMsg("获取身份证照片失败,错误码:" + identfiy.get("code").getAsInt() + ",照片合规检查失败。");
+			return ajax;
+		}
+
+		// ----------------------------获取 广西区内身份证照片获取结束-------------------------
+
+		// ----------------------------考生照片上传恒生文件服务器开始-------------------------
+		UploadVO uploadVO = XcDfsClient.uploadStream(desfile.getPath());
+		List<UploadItemVO> uploadItems = uploadVO.getList();
+		if (null != uploadItems && !uploadItems.isEmpty()) {
+			UploadItemVO vo = uploadItems.get(0);
+			dbStdRegInfo.setPhoto_path(vo.getFilePath());
+			dbStdRegInfo.setPhoto_id(vo.getId());
+		} else {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("考生照片上传文件服务器失败,请联系系统管理员!");
+			return ajax;
+		}
+		// ----------------------------考生照片上传恒生文件服务器结束-------------------------
+
+		dbStdRegInfo.setPhoto_url(SysConst.IMG_FACE_PREFIX + cert_no + "_" + time + "_" + fileSeq + "." + extension);
+		if (dbStdRegInfo.getMajor_id() != null) {
+			dbStdRegInfo.setStatus(StdConst.Status.ALLDONE.ordinal());
+		}
+
+		this.stdRegInfoService.update(dbStdRegInfo);
+		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, dbStdRegInfo);
+		// 添加日志
+		this.regLogService.insertStdRegLog(dbStdRegInfo, OperType.UPDATE.ordinal());
+
+		return new Ajax(dbStdRegInfo);
+	}
+	
+	
+	@RequestMapping("/std/stdRegInfo/uploadImg")
+	public Ajax upload(MultipartFile file) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		StdRegInfo dbStdRegInfo = this.stdRegInfoService.find(std.getId());
+		
+		if(null != dbStdRegInfo){
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStdRegInfo);
+		}
+		
+		String fileSeq = this.stdRegInfoService.getFileSeq();
+		try {
+			String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+			// 转换小写
+			extension = extension.toLowerCase();
+			
+			// 校验文件类型
+			if (!"jpg".equals(extension) && !"jpeg".equals(extension) && !"png".equals(extension)&& !"gif".equals(extension)&& !"bmp".equals(extension)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("上传图片必须是JPG/JPEG/PNG/格式!");
+				return ajax;
+			}
+			
+			HashMap<String, Object> paraMap = new HashMap<String, Object>();
+			paraMap.put("std_reg_id", std.getId());
+			paraMap.put("fee_status", "1");
+			paraMap.put("year_code", YearCodeHelper.getCurrentYearCode());
+			
+			List<StdEnrol> enrolList = this.stdEnrolService.listByMap(paraMap);
+			boolean exist4enrol = false;
+			for (StdEnrol enrol : enrolList) {
+				if (enrol.getStatus() >=4) {
+					exist4enrol = true;
+					break;
+				}
+			}
+			
+			// 存在报考缴费数据,判断是否在不允许变更的时间范围之内
+			if(exist4enrol){
+				 // 获取考生信息变更申请开关
+		        FrameParam loginParam = this.stdRegInfoDao.find(FrameParam.class, "param_name", "stdInfoModifyApplyControl");
+
+		        // 开关打开,则不允许新增申请考生信息变更,提醒内容为Param_value
+		        if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+		        	Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg(loginParam.getParam_value());
+					return ajax;
+		        } 
+			}
+			
+			boolean existScore = this.cjJigechengjiOldService.existScore(std.getId());
+			if(existScore){
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("存在历史成绩,无法上传图片,请提交考生信息变更申请。");
+				return ajax;
+			}
+			
+			String cert_no = dbStdRegInfo.getCert_no();
+			// String rootPath = getRootPath();
+			String rootPath = SysConst.getAppConfig().getUploadBase();
+			// 创建文件夹
+			makeDir(rootPath);
+
+			long time = new Date().getTime();
+
+			String fullFileName = rootPath + SysConst.IMG_FACE_PREFIX + cert_no + "_" + time + "_" + fileSeq + "."
+					+ extension;
+			File desfile = new File(fullFileName);
+			file.transferTo(desfile);
+			
+			// 获取照片合规检查开关 
+			FrameParam loginParam = this.stdRegInfoDao.find(FrameParam.class, "param_name", "photoCompliance");
+			
+			// 照片合规检查开关 开启时校验照片合规性
+			if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+				// ----------------------------照片水印校验开始-------------------------
+				String response = PhotoUtil.verifyWatermark(fullFileName);
+
+				// 校验成功
+				if ("0".equals(response)) {
+					dbStdRegInfo.setPhoto_compliance("1");
+				} else {
+					// 校验失败
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorCode(-1);
+					ajax.setErrorMsg(response);
+					return ajax;
+				}
+
+				// ----------------------------照片水印校验结束-------------------------
+			}
+			
+			// ----------------------------特征值获取开始-------------------------
+			/*Map<String, String> result = PhotoUtil.getExtractFeature(fullFileName);
+
+			// 成功
+			if ("0".equals(result.get("code").toString())) {
+				dbStdRegInfo.setFeature(result.get("msg"));
+			} else {
+				// 失败
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorCode(-1);
+				ajax.setErrorMsg(result.get("msg"));
+				return ajax;
+			}*/
+
+			// ----------------------------特征值获取结束-------------------------
+			
+			
+			// ----------------------------考生照片上传恒生文件服务器开始-------------------------
+			UploadVO uploadVO = XcDfsClient.uploadStream(desfile.getPath());
+			List<UploadItemVO> uploadItems = uploadVO.getList();
+			if (null != uploadItems && !uploadItems.isEmpty()) {
+				UploadItemVO vo = uploadItems.get(0);
+				dbStdRegInfo.setPhoto_path(vo.getFilePath());
+				dbStdRegInfo.setPhoto_id(vo.getId());
+			} else {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("考生照片上传文件服务器失败,请联系系统管理员!");
+				return ajax;
+			}
+			// ----------------------------考生照片上传恒生文件服务器结束-------------------------
+			
+			dbStdRegInfo
+					.setPhoto_url(SysConst.IMG_FACE_PREFIX + cert_no + "_" + time + "_" + fileSeq + "." + extension);
+			if (dbStdRegInfo.getMajor_id() != null) {
+				dbStdRegInfo.setStatus(StdConst.Status.ALLDONE.ordinal());
+			}
+			
+			// 生成准考证号
+//			if (StringUtils.isEmpty(dbStdRegInfo.getTicket_no()) && dbStdRegInfo.getStd_source() != null) {
+//				dbStdRegInfo.setTicket_no(this.stdRegInfoService.genTicketNo(dbStdRegInfo));
+//			}
+			
+			this.stdRegInfoService.update(dbStdRegInfo);
+			getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, dbStdRegInfo);
+			// 添加日志
+			this.regLogService.insertStdRegLog(dbStdRegInfo, OperType.UPDATE.ordinal());
+		} catch (IllegalStateException | IOException e) {
+			e.printStackTrace();
+		}
+		return new Ajax(dbStdRegInfo);
+	}
+
+	@RequestMapping("/std/stdRegInfo/getOrgBySocialMajor")
+	public Ajax getOrgBySocialMajor(String major_id) {
+		List<CfOrganization> orgList = this.cfOrganizationService.getOrgBySocialMajor(major_id);
+		return new Ajax(orgList);
+	}
+
+	// private String getRootPath(){
+	// boolean isWindowSystem = CommonToolUtil.isWindowSystem();
+	// String rootPath = "";
+	// if(isWindowSystem){
+	// rootPath = "d:\\img\\";
+	// }else{
+	// rootPath = SysConst.UPLOAD_BASE + File.separator;
+	// }
+	// return rootPath;
+	// }
+
+	private boolean makeDir(String rootPath) {
+		// 创建目录
+		boolean suc = false;
+		File dir = new File(rootPath + SysConst.IMG_FACE_PREFIX);
+		if (!dir.exists()) {
+			suc = dir.mkdir();
+		}
+		return suc;
+	}
+
+	/**
+	 * 生成验证码图片
+	 * 
+	 * @param major_id
+	 * @throws IOException
+	 */
+	@RequestMapping("/std/validateCode")
+	public void validateCode(String major_id) throws IOException {
+		HttpServletResponse response = this.getResponse();
+		HttpServletRequest request = this.getRequest();
+
+		// 响应头信息
+		response.setHeader("Pragma", "No-Cache");
+		response.setHeader("Cache-Control", "no-cache");
+		response.setDateHeader("Expries", 0);
+
+		// 随机数生成类
+		Random random = new Random();
+
+		// 定义验证码的位数
+		int size = 4;
+
+		// 定义变量保存生成的验证码
+		String vCode = "";
+		char c;
+		// 产生验证码
+		/*
+		for (int i = 0; i < size; i++) {
+			// 产生一个26以内的随机整数
+			int number = random.nextInt(26);
+			// 如果生成的是偶数,则随机生成一个数字
+			if (number % 2 == 0) {
+				c = (char) ('0' + (char) ((int) (Math.random() * 10)));
+				// 如果生成的是奇数,则随机生成一个字母
+			} else {
+				c = (char) ((char) ((int) (Math.random() * 26)) + 'A');
+			}
+			vCode = vCode + c;
+		}
+		*/
+
+		// 转换小写
+//		vCode = vCode.toLowerCase();
+		
+		//四位随机数字
+		vCode = String.valueOf((int)((Math.random()*9+1)*1000));
+		
+		// 压力测试使用
+		//vCode = "1234";
+
+		// 保存生成的5位验证码
+		request.getSession().setAttribute("vCode", vCode);
+
+		// 验证码图片的生成
+		// 定义图片的宽度和高度
+		int width = (int) Math.ceil(size * 20);
+		int height = 30;
+		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+		// 获取图片的上下文
+		Graphics gr = image.getGraphics();
+		// 设定图片背景颜色
+		gr.setColor(Color.WHITE);
+		gr.fillRect(0, 0, width, height);
+		// 设定图片边框
+		gr.setColor(Color.GRAY);
+		gr.drawRect(0, 0, width - 1, height - 1);
+		// 画十条干扰线
+		for (int i = 0; i < 5; i++) {
+			int x1 = random.nextInt(width);
+			int y1 = random.nextInt(height);
+			int x2 = random.nextInt(width);
+			int y2 = random.nextInt(height);
+			gr.setColor(randomColor());
+			gr.drawLine(x1, y1, x2, y2);
+		}
+		// 设置字体,画验证码
+		gr.setColor(randomColor());
+		gr.setFont(randomFont());
+		gr.drawString(vCode, 10, 22);
+		// 图像生效
+		gr.dispose();
+		// 输出到页面
+		ImageIO.write(image, "JPEG", response.getOutputStream());
+	}
+
+	@RequestMapping("/std/stdRegInfo/checkValidateCode")
+	public Ajax checkValidateCode(String validateCode) throws IOException {
+		String sessionVcode = (String) getSession().getAttribute("vCode");
+		Ajax ajax = new Ajax();
+		if (!StringUtils.isEmpty(validateCode) && validateCode.equalsIgnoreCase(sessionVcode)) {
+			ajax.setSuccess(true);
+		} else {
+			ajax.setSuccess(false);
+		}
+		return ajax;
+	}
+	
+	@RequestMapping("/std/stdRegInfo/queryPubKey")
+	public Ajax queryPubKey() {
+		String pubKey = SysConst.getAppConfig().getPubKey();
+		return new Ajax(pubKey);
+	}
+
+	private String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312" };
+	private Random r = new Random();
+
+	// 生成随机的颜色
+	private Color randomColor() {
+		int red = r.nextInt(150);
+		int green = r.nextInt(150);
+		int blue = r.nextInt(150);
+		return new Color(red, green, blue);
+	}
+
+	// 生成随机的字体
+	private Font randomFont() {
+		int index = r.nextInt(fontNames.length);
+		String fontName = fontNames[index];// 生成随机的字体名称
+		int style = r.nextInt(4);
+		int size = r.nextInt(3) + 24; // 生成随机字号, 24 ~ 28
+		return new Font(fontName, style, size);
+	}
+
+	@RequestMapping("/xuexin/login")
+	public Ajax xuexinLogin() throws IOException {
+		return new Ajax();
+	}
+
+	@RequestMapping("/xuexin/queryXL")
+	public Ajax queryXL(String xm, String zjhm) throws IOException {
+		XueXinUtil.queryXL(xm, zjhm);
+		return new Ajax();
+	}
+
+	@RequestMapping("/std/getWyUrl")
+	public Ajax getWyUrl() {
+		return new Ajax(SysConst.getAppConfig().getPay_union_unionPay_url());
+	}
+
+	@RequestMapping("/std/queryMajorByLevel")
+	public Ajax queryMajorByLevel(Integer major_level) {
+		HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		paraMap.put("is_net_exam", 1);// 网考
+		paraMap.put("status", 1);// 开考
+		paraMap.put("major_level", major_level);// 开考
+		List<PlMajor> majorArray = this.plMajorService.listByMap(paraMap);
+		return new Ajax(majorArray);
+	}
+
+	@RequestMapping("/std/validateUploadPhtooUrl")
+	public Ajax validateUploadPhtooUrl() {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		HashMap<String, Object> paraMapTime = new HashMap<String, Object>();
+		paraMapTime.put("year_code", YearCodeHelper.getCurrentYearCode());
+		List<PlExamTime> dbTime = this.examTimeService.listByMap(paraMapTime);
+		PlExamTime currentTime = null;
+		if (dbTime.size() > 0) {
+			currentTime = dbTime.get(0);
+		}else{
+			throw new BusinessException("无当前批次信息");
+		}
+		//检查考生上传图片登记表里面是否有记录
+		/*List<Map<java.lang.String, Object>> std_can_upload_face = this.stdRegInfoDao.listMapBySql(" select * from std_can_upload_face where status = 1 and ( ticket_no = ? or cert_no = ? or std_id = ?)", 
+				std.getTicket_no(),std.getCert_no(),std.getId());
+		if (std_can_upload_face.size() > 0 ) {
+			HashMap<String, Object> rtnMap = new HashMap<String, Object>();
+			rtnMap.put("existEnrol", false);
+			rtnMap.put("existCjold", false);
+			return new Ajax(rtnMap);
+		}*/
+		
+		HashMap<String, Object> paraMap = new HashMap<String, Object>();
+		paraMap.put("std_reg_id", std.getId());
+		paraMap.put("fee_status", "1");
+		paraMap.put("exam_time_id", currentTime.getId());
+
+		List<StdEnrol> enrolList = this.stdEnrolService.listByMap(paraMap);
+		boolean existScore = this.cjJigechengjiOldService.existScore(std.getId());
+//
+//		List<CjJigechengjiOld> dbCjOldList1 = StringUtils.isEmpty(std.getOld_ticket_no1()) ? new ArrayList()
+//				: this.cjJigechengjiOldService.listByStd(std.getOld_ticket_no1());
+//
+//		List<CjJigechengjiOld> dbCjOldList2 = StringUtils.isEmpty(std.getOld_ticket_no2()) ? new ArrayList()
+//				: this.cjJigechengjiOldService.listByStd(std.getOld_ticket_no2());
+//
+//		dbCjOldList.addAll(dbCjOldList1);
+//		dbCjOldList.addAll(dbCjOldList2);
+		
+		
+
+		HashMap<String, Object> rtnMap = new HashMap<String, Object>();
+		boolean exist4enrol = false;
+		for (StdEnrol enrol : enrolList) {
+			if (enrol.getStatus() >=4) {
+				exist4enrol = true;
+			}
+		}
+		if (exist4enrol) {
+			rtnMap.put("existEnrol", true);
+		} else {
+			rtnMap.put("existEnrol", false);
+		}
+ 
+		rtnMap.put("existCjold", existScore);
+
+		return new Ajax(rtnMap);
+	}
+	
+	@RequestMapping("/std/checkOldTicketNo")
+	public Ajax checkOldTicketNo(String ticket_no_old) {
+		// 1分钟内不允许再次请求
+		String error = this.isSysOperateFail(ticket_no_old, "checkOldTicketNo", 1);
+		if (null != error) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg(error);
+			return ajax;
+		}
+		
+		CjJigechengjiOld JigechengjiOld = this.cjJigechengjiOldService.checkOldTicketNo(ticket_no_old);
+		if (JigechengjiOld  == null) {
+			return new Ajax(JigechengjiOld);
+		}else{
+			List<StdRegInfo> list = this.stdRegInfoService.list("old_ticket_no1", ticket_no_old);
+			List<StdRegInfo> list2 = this.stdRegInfoService.list("old_ticket_no2", ticket_no_old);
+			
+			if (null != list && !list.isEmpty()) {
+				for (StdRegInfo std : list) {
+					if (std != null) {
+						// 解密考生敏感信息
+						this.stdRegInfoService.DecryptStd(std);
+					}
+				}
+			}
+
+			if (null != list2 && !list2.isEmpty()) {
+				for (StdRegInfo std : list2) {
+					if (std != null) {
+						// 解密考生敏感信息
+						this.stdRegInfoService.DecryptStd(std);
+					}
+				}
+			}
+			
+			list.addAll(list2);
+			
+			// 记录次数
+			this.setSysOperateFail(ticket_no_old, "checkOldTicketNo", 1, 1, "请1分钟之后再重新验证!");
+			
+			if (list.size()>0) {
+				 Ajax ajax = new Ajax();
+				 ajax.setSuccess(false);
+				 ajax.setErrorMsg("该老准考证号已经存在考生无需新注册,准考证号:"+list.get(0).getTicket_no()+" 身份证号"+list.get(0).getCert_no());
+				 return ajax;
+				
+			}else{
+				return new Ajax(JigechengjiOld);
+			}
+		}
+		
+	}
+	
+	@RequestMapping("/std/checkCertNo18")
+	public Ajax checkCertNo18() {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		StdRegInfo dbStd = this.stdRegInfoDao.find(std.getId());
+		if(null != dbStd){
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStd);
+		}
+		
+		String cert_no = dbStd.getCert_no();
+		Ajax ajax = new Ajax();
+		if ((std.getCert_type() ==null || dbStd.getCert_type() == 1) && !FrameIdCardUtil.validateIdCard18(cert_no)) {
+			return ajax;
+		}else{
+			ajax.setSuccess(false);
+			return ajax;
+		}
+		
+	}
+	
+	@RequestMapping("/std/checkPhotoCompliance")
+	public Ajax checkPhotoCompliance() {
+		Ajax ajax = new Ajax();
+		FrameParam loginParam = this.stdRegInfoDao.find(FrameParam.class, "param_name", "photoComplianceForEnrol");
+		if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+			StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+			StdRegInfo dbStd = this.stdRegInfoDao.find(std.getId());
+
+			if (null != dbStd.getPhoto_compliance() && dbStd.getPhoto_compliance().equals("1")) {
+				ajax.setSuccess(true);
+			} else {
+				ajax.setSuccess(false);
+			}
+		}
+		return ajax;
+
+	}
+	
+	@RequestMapping("/std/checkIsIdentfiy")
+	public Ajax checkIsIdentfiy() {
+		Ajax ajax = new Ajax();
+		FrameParam loginParam = this.stdRegInfoDao.find(FrameParam.class, "param_name", "photoComplianceForEnrol");
+		if (null != loginParam && "Active".equals(loginParam.getProtect_status())) {
+			StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+			StdRegInfo dbStd = this.stdRegInfoDao.find(std.getId());
+
+			if (null != dbStd.getIs_identfiy() && dbStd.getIs_identfiy().intValue() == 1) {
+				ajax.setSuccess(true);
+			} else {
+				ajax.setSuccess(false);
+			}
+		}
+		return ajax;
+
+	}
+	
+	@RequestMapping("/std/updateMustUpdeCertNo")
+	public Ajax updateMustUpdeCertNo() {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		StdRegInfo dbStd = this.stdRegInfoDao.find(std.getId());
+		if(null != dbStd){
+			// 解密考生敏感信息
+			this.stdRegInfoService.DecryptStd(dbStd);
+		}
+		
+		String cert_no = dbStd.getCert_no();
+		if ((std.getCert_type() ==null || dbStd.getCert_type() == 1) && !FrameIdCardUtil.validateIdCard18(cert_no)) {
+			dbStd.setCert_no_must_update(1);
+			this.stdRegInfoDao.update(dbStd);
+		}
+	 
+		return new Ajax();
+	}
+	
+	
+	@RequestMapping("/std/identifyOrc")
+	public Ajax identifyOrc(String file, String validateCode) {
+		try {
+			String sessionVcode = (String) getSession().getAttribute("vCode");
+			if (StringUtils.isEmpty(validateCode)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请填写校验码!");
+				getSession().removeAttribute("vCode");
+				return ajax;
+			}
+
+			if (!validateCode.equalsIgnoreCase(sessionVcode)) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("校验码不正确,请重新填写!");
+				getSession().removeAttribute("vCode");
+				return ajax;
+			}
+
+			/*JsonObject inte = IdentifyCardOrcUtil.interfaceAuth();
+			if (inte.get("code").getAsInt() != 200) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("接口鉴权错误!");
+				return ajax;
+			}*/
+
+			JsonObject identfiy = IdentifyCardOrcUtil.identifyCardRec(file, 2, 1);
+			if (identfiy.get("code").getAsInt() != 200) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("图像识别错误,错误码:" + identfiy.get("code"));
+				return ajax;
+			} else {
+				JsonObject data = identfiy.get("data").getAsJsonObject();
+				if (data.get("imageConfig").getAsInt() != 1) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("请上传身份证正面!");
+					return ajax;
+				} else {
+					HashMap<String, Object> rtnMap = new HashMap<String, Object>();
+					StdIdentityCard card = new StdIdentityCard();
+
+					rtnMap.put("cert_no", data.get("number").getAsString());
+					card.setId_number(data.get("number").getAsString());
+
+					rtnMap.put("std_sex", data.get("sex").getAsString().equals("女") ? 2 : 1);
+					card.setSex(data.get("sex").getAsString());
+
+					rtnMap.put("std_nation", data.get("nationality").getAsString());
+					card.setNationality(data.get("nationality").getAsString());
+
+					for (FrameDict frameDict : FrameDictUtil.getFrameDict("std_nation")) {
+						if (frameDict.getDict_text().equals(data.get("nationality").getAsString())) {
+							rtnMap.put("std_nation", frameDict.getDict_value());
+						}
+					}
+
+					rtnMap.put("std_birth", data.get("birth").getAsString());
+					card.setBirth(data.get("birth").getAsString());
+
+					rtnMap.put("std_name", data.get("name").getAsString());
+					card.setName(data.get("name").getAsString());
+
+					rtnMap.put("std_address", data.get("address").getAsString());
+					card.setAddress(data.get("address").getAsString());
+
+					// 记录图像识别成功
+					this.stdIdentityCardDao.insert(card);
+
+					return new Ajax(rtnMap);
+				}
+			}
+		} finally {
+			this.getSession().removeAttribute("vCode");
+		}
+
+	}
+	/*
+	APP 注册
+	 */
+	@RequestMapping("/std/sendSmsForReg")
+	public Ajax sendSmsForReg(String std_mobile, String validateCode) {
+		try {
+			if(!StringUtils.isEmpty(validateCode)){
+				String sessionVcode = (String) getSession().getAttribute("vCode");
+				if (!validateCode.equalsIgnoreCase(sessionVcode)) {
+					Ajax ajax = new Ajax();
+					ajax.setSuccess(false);
+					ajax.setErrorMsg("校验码错误,请重新填写!");
+					return ajax;
+				}
+			}
+			
+			if (null == std_mobile) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("请输入手机号!");
+				return ajax;
+			}
+
+			// 1分钟内不允许再次发送短信
+			String error = this.isSysOperateFail(std_mobile, "sendSmsForReg", 1);
+			if (null != error) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(error);
+				return ajax;
+			}
+			
+			
+			List<StdRegInfo> stds = this.stdRegInfoService.findStdByStdPhone(std_mobile, null);
+
+			if (null != stds && !stds.isEmpty()) {
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("手机号已注册绑定,请通过身份信息和手机号找回密码!");
+				return ajax;
+			}
+
+
+			int code = (int) ((Math.random() * 9 + 1) * 100000);
+
+			String smstext = "您正在注册广西自学考试网上系统账号,验证码:" + code + ",如非本人操作,请忽略本短信。(广西自学考试)";
+			JsonObject reslut = SmsSendUtil.sendSms(std_mobile, smstext);
+			if (null == reslut || null == reslut.get("flag") || !"succeed".equals(reslut.get("flag").getAsString())) {
+				String info = (null == reslut.get("msg")?"验证码发送失败,请稍后重试!":reslut.get("msg").getAsString());
+
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(info);
+
+				return ajax;
+			}
+
+			// 插入短信验证码表
+			SysSmsInfo sms = new SysSmsInfo();
+			sms.setPhone(std_mobile);
+			sms.setContent(smstext);
+			this.sysSmsInfoService.insert(sms);
+
+			// 插入短信验证码表
+			SysVerificationCode sysCode = new SysVerificationCode();
+			sysCode.setPhone(std_mobile);
+			sysCode.setCode(code + "");
+			sysCode.setStatus(0);
+			this.sysVerificationCodeService.insert(sysCode);
+			
+			// 记录发短信次数
+			this.setSysOperateFail(std_mobile, "sendSmsForReg", 1, 1, "请1分钟之后再重新发送验证码!");
+
+			return new Ajax();
+		} finally {
+			this.getSession().removeAttribute("vCode");
+		}
+	}
+
+	@RequestMapping("/std/stdRegInfo/regForApp")
+	public Ajax regApp(StdRegInfo stdRegInfo,String code) {
+		if(null == stdRegInfo || StringUtils.isEmpty(stdRegInfo.getCert_no())){
+			throw new BusinessException("请填写证件号。");
+		}
+		
+		if (null == stdRegInfo || StringUtils.isEmpty(stdRegInfo.getStd_name())) {
+			throw new BusinessException("请填写姓名。");
+		} else if (!StringUtils.isEmpty(stdRegInfo.getStd_name())) {
+			if (!PatternUtil.checkStdName(stdRegInfo.getStd_name().trim())) {
+				throw new BusinessException("请输入正确中文姓名且长度在15个字范围内!");
+			}
+		}
+		
+		if(null == stdRegInfo.getCert_type()){
+			stdRegInfo.setCert_type(1);
+		}
+		
+		// 证件号验证
+		String cert_no = stdRegInfo.getCert_no();
+		
+		if (null == stdRegInfo.getCert_type()) {
+			throw new BusinessException("请选择证件类型。");
+		}
+		
+		if (null != stdRegInfo.getCert_type() && stdRegInfo.getCert_type().intValue() != 1) {
+			throw new BusinessException("请使用身份证号注册;使用非身份证件号注册,请到自考办现场进行注册。");
+		}
+		
+		if (stdRegInfo.getCert_type() == 1 && !FrameIdCardUtil.validateIdCard18(cert_no)) {
+			throw new BusinessException("身份证[" + cert_no + "]不合法,请重新填写。非身份证号,请到自考办现场注册。");
+		}
+		
+		String error = this.isSysOperateFail(cert_no, "canRegTime", 30);
+		if(null != error){
+			throw new BusinessException(error);
+		}
+		
+		if (this.stdRegInfoService.existStdRegInfoByCertNo(cert_no)) {
+			// 设置注册失败次数
+			this.setSysOperateFail(stdRegInfo.getCert_no(), "canRegTime", 5, 30, "注册失败累计超过5次,请30分钟之后再尝试!");
+			
+			throw new BusinessException("证件号[" + cert_no + "]已经存在,请使用该证件号登录!");
+		}else{
+			// 校验18位身份证对应的15位身份证号是否已经存在
+			String temp_cert_no = cert_no.substring(0, 6)+cert_no.substring(8, 17);
+			if (this.stdRegInfoService.existStdRegInfoByCertNo(temp_cert_no)) {
+				// 设置注册失败次数
+				this.setSysOperateFail(stdRegInfo.getCert_no(), "canRegTime", 5, 30, "注册失败累计超过5次,请30分钟之后再尝试!");
+				
+				throw new BusinessException("证件号[" + cert_no + "]对应的15位身份证号已经存在,请使用15位身份证号进入忘记密码页面找回密码!");
+			}
+			
+		}
+		
+		// 根据手机号码和短信验证码获取短信信息
+		List<SysVerificationCode> codes = this.sysVerificationCodeService
+				.querySysVerificationCodeByCode(stdRegInfo.getStd_mobile(), code);
+
+		// 验证验证码有效性
+		if (null == codes || codes.isEmpty()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("短信验证码错误或已失效,请重新发送短信验证码!");
+
+			// 设置注册失败次数
+			this.setSysOperateFail(cert_no, "canRegTime", 5, 30, "注册失败累计超过5次,请30分钟之后再尝试!");
+
+			return ajax;
+		}
+		
+		
+		if(null != stdRegInfo.getStd_name()){
+			stdRegInfo.setStd_name(stdRegInfo.getStd_name().trim());
+		}
+		
+		// 调用身份证件认证接口校验身份证合法性(校验不通过,业务继续,校验结果记录到考生信息表中)
+		//checkIdentifyCard(stdRegInfo);
+
+		// 生日
+		String std_birth = (null != cert_no && cert_no.length() == 18
+				? cert_no.substring(6, 10) + "" + cert_no.substring(10, 12) + "" + cert_no.substring(12, 14) : "");
+		stdRegInfo.setStd_birth(std_birth);
+
+		// 性别
+		String std_sex = (null != cert_no && cert_no.length() == 18
+				? ((Integer.parseInt(cert_no.substring(16, 17)) % 2) == 1 ? "1" : "2") : "");
+		stdRegInfo.setStd_sex(std_sex);
+				
+		
+		stdRegInfo.setStatus(StdConst.Status.NEW.ordinal());
+		
+		LocalDateTime now = null;
+        StdEnrol time = this.stdEnrolService.getDataBaseTime();
+        if (null != time && null != time.getCreate_time()) {
+            now = time.getCreate_time();
+        } else {
+            now = LocalDateTime.now();
+        }
+        
+		stdRegInfo.setReg_time(DateHelper.format(now));
+		stdRegInfo.setIs_new_stu(1);
+		stdRegInfo.setStd_source(1);
+		
+		HashMap<String, Object> paraMapTime = new HashMap<String, Object>();
+		paraMapTime.put("year_code", YearCodeHelper.getCurrentYearCodeForTicketNo());
+		List<PlExamTime> dbTime = this.examTimeService.listByMap(paraMapTime);
+		PlExamTime currentTime = null;
+		if (dbTime.size() > 0) {
+			currentTime = dbTime.get(0);
+		}else{
+			throw new BusinessException("无当前批次信息,请联系系统管理员");
+		}
+		String exam_time_id = currentTime.getId().toString();
+    	stdRegInfo.setExam_time_id(exam_time_id);
+		// 密码截取
+		stdRegInfo.setStd_pass(cutPasssword(stdRegInfo.getStd_pass()));
+		
+		//APP登录同时绑定手要号码
+		stdRegInfo.setBindphone(stdRegInfo.getStd_mobile());
+		stdRegInfo.setStd_dh(stdRegInfo.getStd_mobile());
+		
+		// 注册时清空准考证号,防止攻击直接生成准考证号
+		stdRegInfo.setTicket_no(null);
+		stdRegInfo.setPhoto_path(null);
+		stdRegInfo.setMajor_id(null);
+		
+		// 保存考生信息
+		this.stdRegInfoService.save(stdRegInfo);
+
+		return new Ajax();
+		
+	}
+
+	/**
+	 * 身份证认证
+	 * @param stdRegInfo
+	 * @return
+	 */
+	public Ajax identifyCardApp(StdRegInfo stdRegInfo) {
+
+		// 证件号验证
+		String cert_no = stdRegInfo.getCert_no();
+
+		// 1分钟内不允许再次验证
+		if (!isIdentifyCardFialExt()) {
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("请1分钟之后再重新进行身份认证!");
+			return ajax;
+		}
+
+		StdRegInfo temp_std = new StdRegInfo();
+		temp_std.setCert_no(cert_no);
+		temp_std.setStd_name(stdRegInfo.getStd_name());
+
+		if (null != cert_no && cert_no.length() == 18) {
+			//  身份证认证
+			String result = this.checkIdentifyCard(temp_std);
+
+			if(null == result){
+				//身份认证失败
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("身份证认证不通过,请进入个人中心申请变更身份信息。");
+				//return ajax;
+				return new Ajax(stdRegInfo);
+
+			}else if(!"success".equals(result)){
+				// 身份认证失败
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(result);
+				//return ajax;
+				return new Ajax(stdRegInfo);
+			}else{
+				// 身份认证成功
+				// 设置身份认证成功标识
+				stdRegInfo.setIs_identfiy(1);
+
+				// 设置证件类型为身份证
+				stdRegInfo.setCert_type(1);
+
+				// 保存认证信息
+				//this.stdRegInfoService.edit(dbStd);
+
+				// 更新考生会话信息
+				//getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, dbStd);
+
+				// 添加日志
+				//this.regLogService.insertStdRegLog(stdRegInfo, OperType.ADD.ordinal());
+
+				return new Ajax(stdRegInfo);
+			}
+		}else if(null != cert_no && (cert_no.toUpperCase().startsWith("H")||cert_no.toUpperCase().startsWith("M") )){
+			// 港澳台考生身份认证
+			String result = this.verifyCertificate(stdRegInfo);
+
+			if (null == result) {
+				// 身份认证失败
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg("港澳台身身份认证不通过。");
+				//return ajax;
+				return new Ajax(stdRegInfo);
+
+			} else if (!"success".equals(result)) {
+				// 身份认证失败
+				Ajax ajax = new Ajax();
+				ajax.setSuccess(false);
+				ajax.setErrorMsg(result);
+				return ajax;
+			} else {
+				// 港澳台身份认证成功
+				// 设置身份认证成功标识
+				stdRegInfo.setIs_identfiy(1);
+				// 设置证件类型为身份证
+				stdRegInfo.setCert_type(8);
+
+				// 保存认证信息
+				//this.stdRegInfoService.edit(stdRegInfo);
+
+				// 更新考生会话信息
+				//getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, stdRegInfo);
+
+				// 添加日志
+				//this.regLogService.insertStdRegLog(stdRegInfo, OperType.ADD.ordinal());
+
+				return new Ajax(stdRegInfo);
+			}
+		}else{
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("证件号不是身份证或港澳居民往来内地通行证或台湾居民往来内地通行证,无法进行身份认证!");
+			//return ajax;
+			return new Ajax(stdRegInfo);
+		}
+
+	}
+
+	@RequestMapping("/std/getLoginToken")
+	public Ajax getLoginToken(String uuid) {
+		StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		String token=SecureHelper.des3Encrypt(std.getId().toString()+ "@"+uuid+ "@"+ LocalDateTime.now().plusDays(7).toInstant(ZoneOffset.of("+8")).toEpochMilli(), SecureHelper.getSecureKey(uuid));
+		
+		//[高风险]安全退出无效-服务端 将token保存数据库中
+		StdAppLogintoken temp = this.stdAppLogintokenDao.find("token", token);
+		if(null == temp){
+			StdAppLogintoken stdAppLogintoken = new StdAppLogintoken();
+			stdAppLogintoken.setToken(token);
+			stdAppLogintoken.setStatus("1");
+			
+			this.stdAppLogintokenDao.insert(stdAppLogintoken);
+		}else{
+			temp.setStatus("1");
+			this.stdAppLogintokenDao.updateStdAppLogintokenStatus(temp);
+		}
+		
+		
+		return new Ajax(token);
+	}
+
+	@RequestMapping("/std/loginForAuthentication")
+	public Ajax loginForAuthentication(String uuid, String token) {
+		if (uuid == null || token == null) {
+			throw new BusinessException("请使用账号或手机重新登录!");
+		}
+		
+//		String std_id = SecureHelper.des3Decrypt(token, SecureHelper.getSecureKey(uuid));
+//		if (StringUtils.isEmpty(std_id) ) {
+//			throw new BusinessException("请使用账号或手机重新登录!");
+//		}
+		String source = null;
+		try {
+			source = SecureHelper.des3Decrypt(token, SecureHelper.getSecureKey(uuid));
+		} catch (Exception e) {
+		}
+		if (StringHelper.isEmpty(source))
+			throw new BusinessException("请使用账号或手机重新登录!");
+		if (source.split("@").length != 3)
+			throw new BusinessException("请使用账号或手机重新登录!");
+		if (!source.split("@")[1].equals(uuid))
+			throw new BusinessException("请使用账号或手机重新登录!");
+		if(System.currentTimeMillis()>Long.parseLong(source.split("@")[2]))
+			throw new BusinessException("请使用账号或手机重新登录!");
+		
+		// [高风险]安全退出无效-服务端 从数据库中获取token,判断token是否已经安全退出,如果已经安全退出,则需要重新登录
+		StdAppLogintoken temp = this.stdAppLogintokenDao.find("token", token);
+		if (null != temp && !"1".equals(temp.getStatus())) {
+			throw new BusinessException("请使用账号或手机重新登录!");
+		}
+
+		StdRegInfo dbStdRegInfo = this.stdRegInfoDao.queryStdById(Integer.valueOf(source.split("@")[0]));
+		if (dbStdRegInfo == null ) {
+			throw new BusinessException("请使用账号或手机重新登录!");
+		}
+		
+		
+		StdRegInfo seStd = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (seStd != null && !seStd.getId().equals(dbStdRegInfo.getId())) {
+			throw new BusinessException("请注销之前的登录用户或关闭浏览器重新登录!");
+		}
+		stdRegInfoService.DecryptStd(dbStdRegInfo);
+		getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, dbStdRegInfo);
+		StdRegInfo std = new StdRegInfo();
+		std.setId(dbStdRegInfo.getId());
+		std.setTicket_no(dbStdRegInfo.getTicket_no());
+
+		std.setBindphone(dbStdRegInfo.getBindphone());
+
+		return new Ajax(std);
+	}
+	
+
+}

+ 60 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdRegInfoLogControl.java

@@ -0,0 +1,60 @@
+package cn.hmsoft.ses.control.std;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.data.model.std.StdRegInfoLog;
+import cn.hmsoft.ses.service.iface.std.IStdRegInfoLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 考生操作日志表 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-07-02 15:52:07
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdRegInfoLogControl extends AjaxControl {
+
+    @Autowired
+    private IStdRegInfoLogService stdRegInfoLogService;
+	
+    @RequestMapping("std/stdRegInfoLog/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "1";
+        }
+        return new Ajax(this.stdRegInfoLogService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+    //@RequestMapping("std/stdRegInfoLog/add")
+    public Ajax add(StdRegInfoLog stdRegInfoLog) {
+        this.stdRegInfoLogService.insert(stdRegInfoLog);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("std/stdRegInfoLog/edit")
+    public Ajax edit(StdRegInfoLog stdRegInfoLog) {
+        this.stdRegInfoLogService.edit(stdRegInfoLog);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("std/stdRegInfoLog/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.stdRegInfoLogService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("std/stdRegInfoLog/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.stdRegInfoLogService.find(id));
+    }    
+}

+ 72 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdScoreControl.java

@@ -0,0 +1,72 @@
+package cn.hmsoft.ses.control.std;
+
+import cn.hmsoft.web.entity.Ajax;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.data.model.std.StdScore;
+import cn.hmsoft.ses.service.iface.std.IStdScoreService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 考生成绩表 cj_jigechengji 控制器.
+ * 
+ * @author: haoguanghui
+ * @date: 2018-10-22 11:58:59
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdScoreControl extends AjaxControl {
+
+    @Autowired
+    private IStdScoreService stdScoreService;
+    
+	
+    /**
+     * @param status :成绩合格标志
+     * 考生成绩列表
+     */
+    @RequestMapping("std/stdScore/page")
+	public Ajax page(String query, Integer limit, Integer start, String order, String type, Integer status) {
+		StdRegInfo std = (StdRegInfo) this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		if (StringHelper.isEmpty(order)) {
+			order = "course_code";
+		}
+		if(std==null) {
+			std = new StdRegInfo();
+			std.setId(1);
+		}
+		return new Ajax(
+				this.stdScoreService.page(query, start, limit, this.getQueryOrder(order, type), status, std.getId()));
+	}
+    
+    //@RequestMapping("std/stdScore/add")
+    public Ajax add(StdScore stdScore) {
+        this.stdScoreService.insert(stdScore);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("std/stdScore/edit")
+    public Ajax edit(StdScore stdScore) {
+        this.stdScoreService.edit(stdScore);
+        return new Ajax();
+    }
+    
+    //@RequestMapping("std/stdScore/delete")
+    public Ajax delete(Integer[] ids) {
+    	for (Integer id : ids) {
+    		this.stdScoreService.delete(id);
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("std/stdScore/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.stdScoreService.find(id));
+    }    
+}

+ 120 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdScoreReviewControl.java

@@ -0,0 +1,120 @@
+package cn.hmsoft.ses.control.std;
+
+import cn.hmsoft.ses.constants.CfConst.CfOperateTimeType;
+import cn.hmsoft.frame.util.FrameAssertUtil;
+import cn.hmsoft.ses.constants.EnrolSessionName;
+import cn.hmsoft.ses.data.model.pl.PlExamTime;
+import cn.hmsoft.ses.data.model.std.StdRegInfo;
+import cn.hmsoft.ses.data.model.std.StdScoreReview;
+import cn.hmsoft.ses.helper.YearCodeHelper;
+import cn.hmsoft.ses.service.iface.cf.ICfOperateTimeService;
+import cn.hmsoft.ses.service.iface.pl.IPlExamTimeService;
+import cn.hmsoft.ses.service.iface.std.IStdScoreReviewCourseService;
+import cn.hmsoft.ses.service.iface.std.IStdScoreReviewService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDate;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.servlet.http.HttpSession;
+
+/**
+ *  控制器.
+ * 
+ * @author: shudonghui
+ * @date: 2021-09-29 15:19:42
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdScoreReviewControl extends AjaxControl {
+
+    @Autowired
+    private IStdScoreReviewService stdScoreReviewService;
+    
+    @Autowired
+    private ICfOperateTimeService timeService;
+
+    @Autowired
+    private IPlExamTimeService examTimeService;
+
+
+    @RequestMapping("std/stdScoreReview/page")
+    public Ajax page() {
+        StdRegInfo login = (StdRegInfo)this.getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+        HashMap<String, Object> map = new HashMap<String, Object>();
+        List<PlExamTime> timeList = this.examTimeService.list("year_code", YearCodeHelper.getCurrentYearCode());
+        Integer exam_time_id = null;
+        if(null != timeList && !timeList.isEmpty()){
+        	exam_time_id = timeList.get(0).getId();
+        }
+       
+        map.put("exam_time_id",exam_time_id);
+        map.put("timeControl",this.timeService.getOperateTime(CfOperateTimeType.SCOREREVIEW.ordinal(), exam_time_id));
+        map.put("inTime", this.timeService.isInTime(CfOperateTimeType.SCOREREVIEW.ordinal(),exam_time_id)); //是否在报考时间范围内
+        map.put("applyList", this.stdScoreReviewService.page(login.getId()));
+
+        return new Ajax(map);
+    }
+    
+    @RequestMapping("std/stdScoreReview/add")
+    public Ajax add(StdScoreReview stdScoreReview,Integer exam_time_id) {
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(std, "未登录,请登录系统");
+		
+        stdScoreReview.setYear_code(YearCodeHelper.getCurrentYearCode());
+        stdScoreReview.setStd_id(std.getId());
+        stdScoreReview.setStatus("待受理");
+        stdScoreReview.setFee_status("待缴费");
+        
+        this.stdScoreReviewService.insert(stdScoreReview);
+        
+        // 设置保存的申请单信息,用于添加申请单对应的课程
+    	HttpSession session = getSession();
+		session.setAttribute("temp_StdScoreReview", stdScoreReview);
+		
+        return new Ajax(stdScoreReview);
+    }
+    
+    @RequestMapping("std/stdScoreReview/edit")
+    public Ajax edit(StdScoreReview stdScoreReview) {
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+		FrameAssertUtil.isNotNull(std, "未登录,请登录系统");
+		
+		stdScoreReview.setStd_id(std.getId());
+		stdScoreReview.setStatus("待受理");
+        stdScoreReview.setFee_status("待缴费");
+        
+        this.stdScoreReviewService.edit(stdScoreReview);
+        return new Ajax();
+    }
+    
+    @RequestMapping("std/stdScoreReview/delete")
+    public Ajax delete(Integer[] ids) {
+    	StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+    	for (Integer id : ids) {
+    		StdScoreReview score = this.stdScoreReviewService.find(id);
+    		if(null != std && null != score && std.getId().intValue() == score.getStd_id().intValue()){
+    			this.stdScoreReviewService.delete(id);
+    		}
+    	}
+        return new Ajax();
+    }    
+    
+    @RequestMapping("std/stdScoreReview/get")
+    public Ajax get(Integer id) {
+        return new Ajax(this.stdScoreReviewService.find(id));
+    }
+
+    @RequestMapping("std/stdScoreReview/val")
+    public Ajax val(String ids,Integer exam_time_id) {
+        return new Ajax();
+    }
+
+}

+ 77 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdScoreReviewCourseControl.java

@@ -0,0 +1,77 @@
+package cn.hmsoft.ses.control.std;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hmsoft.ses.data.model.std.StdScoreReview;
+import cn.hmsoft.ses.data.model.std.StdScoreReviewCourse;
+import cn.hmsoft.ses.service.iface.std.IStdScoreReviewCourseService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+/**
+ *  控制器.
+ * 
+ * @author: shudonghui
+ * @date: 2021-09-29 15:19:45
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class StdScoreReviewCourseControl extends AjaxControl {
+
+    @Autowired
+    private IStdScoreReviewCourseService stdScoreReviewCourseService;
+	
+    @RequestMapping("std/stdScoreReviewCourse/page")
+    public Ajax page(Integer p_id) {
+        return new Ajax(this.stdScoreReviewCourseService.page(p_id));
+    }
+    
+
+    @RequestMapping("std/stdScoreReviewCourse/add")
+    public Ajax add(StdScoreReviewCourse stdScoreReviewCourse) {
+    	if(null == stdScoreReviewCourse || null == stdScoreReviewCourse.getP_id()){
+    		Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("申请单信息为空,成绩复核申请失败!");
+			return ajax;
+    	}
+    	
+    	StdScoreReview temp_ScoreReview = (StdScoreReview) getRequest().getSession().getAttribute("temp_StdScoreReview");
+    	// 校验验申请单一致
+		if(null == temp_ScoreReview || temp_ScoreReview.getId().intValue() != stdScoreReviewCourse.getP_id()){
+			Ajax ajax = new Ajax();
+			ajax.setSuccess(false);
+			ajax.setErrorMsg("申请单ID非法,成绩复核申请失败!");
+			return ajax;
+		}
+    			
+        this.stdScoreReviewCourseService.insert(stdScoreReviewCourse);
+        
+        getRequest().getSession().removeAttribute("temp_StdScoreReview");
+        
+        return new Ajax();
+    }
+//
+//    @RequestMapping("std/stdScoreReviewCourse/edit")
+//    public Ajax edit(StdScoreReviewCourse stdScoreReviewCourse) {
+//        this.stdScoreReviewCourseService.edit(stdScoreReviewCourse);
+//        return new Ajax();
+//    }
+//
+//    @RequestMapping("std/stdScoreReviewCourse/delete")
+//    public Ajax delete(Integer[] ids) {
+//    	for (Integer id : ids) {
+//    		this.stdScoreReviewCourseService.delete(id);
+//    	}
+//        return new Ajax();
+//    }
+//
+//    @RequestMapping("std/stdScoreReviewCourse/get")
+//    public Ajax get(Integer id) {
+//        return new Ajax(this.stdScoreReviewCourseService.find(id));
+//    }
+}

+ 725 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/std/StdScoreReviewPayControl.java

@@ -0,0 +1,725 @@
+//package cn.hmsoft.ses.control.std;
+//
+//import cn.hmsoft.frame.exception.web.BusinessException;
+//import cn.hmsoft.frame.util.FrameAssertUtil;
+//import cn.hmsoft.helper.JsonHelper;
+//import cn.hmsoft.helper.LogHelper;
+//import cn.hmsoft.ses.constants.CfConst.CfOperateTimeType;
+//import cn.hmsoft.ses.constants.EnrolSessionName;
+//import cn.hmsoft.ses.constants.SysConst;
+//import cn.hmsoft.ses.data.dao.cf.CfFeeScaleDao;
+//import cn.hmsoft.ses.data.model.cf.CfFeeScale;
+//import cn.hmsoft.ses.data.model.cf.CfOrganization;
+//import cn.hmsoft.ses.data.model.pay.PayBillUnion;
+//import cn.hmsoft.ses.data.model.pay.PayNoticeUnion;
+//import cn.hmsoft.ses.data.model.pl.PlExamTime;
+//import cn.hmsoft.ses.data.model.std.StdEnrol;
+//import cn.hmsoft.ses.data.model.std.StdRegInfo;
+//import cn.hmsoft.ses.data.model.std.StdScoreReview;
+//import cn.hmsoft.ses.helper.YearCodeHelper;
+//import cn.hmsoft.ses.msgque.Thread.SendEpayOrderThread;
+//import cn.hmsoft.ses.msgque.model.dto.EpayCancelMsgDTO;
+//import cn.hmsoft.ses.msgque.model.dto.EpayOrderInfoMsgDTO;
+//import cn.hmsoft.ses.service.iface.cf.ICfOperateTimeService;
+//import cn.hmsoft.ses.service.iface.pay.IPayBillUnionService;
+//import cn.hmsoft.ses.service.iface.pay.IPayNoticeUnionService;
+//import cn.hmsoft.ses.service.iface.pl.IPlExamTimeService;
+//import cn.hmsoft.ses.service.iface.std.IStdScoreReviewService;
+//import cn.hmsoft.ses.util.HttpResult;
+//import cn.hmsoft.ses.util.UnionPayUtil;
+//import cn.hmsoft.ses.util.unionpay.NoticePayUnion;
+//import cn.hmsoft.web.control.AjaxControl;
+//import cn.hmsoft.web.entity.Ajax;
+//import com.xcwlkj.log.utils.XclogUtil;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.util.StringUtils;
+//import org.springframework.web.bind.annotation.RequestBody;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RestController;
+//
+//import javax.servlet.http.HttpServletResponse;
+//import java.io.OutputStream;
+//import java.math.BigDecimal;
+//import java.text.DecimalFormat;
+//import java.time.LocalDate;
+//import java.time.LocalDateTime;
+//import java.time.format.DateTimeFormatter;
+//import java.util.Date;
+//import java.util.HashMap;
+//import java.util.List;
+//import java.util.Map;
+//
+///**
+// *  控制器.
+// *
+// * @author: shudonghui
+// * @date: 2021-09-29 15:19:42
+// * @version: 1.0
+// * @email: shudonghui@qmth.com.cn
+// * @Company: www.hmsoft.cn
+// */
+//@RestController
+//public class StdScoreReviewPayControl extends AjaxControl {
+//
+//    @Autowired
+//    private IStdScoreReviewService stdScoreReviewService;
+//
+//    @Autowired
+//    private IPayBillUnionService payBillUnionService;
+//
+//    @Autowired
+//    private ICfOperateTimeService timeService;
+//
+//    @Autowired
+//    private IPlExamTimeService examTimeService;
+//
+//    @Autowired
+//    private CfFeeScaleDao feeScaleDao;
+//
+//    @Autowired
+//    private IPayNoticeUnionService payNoticeUnionService;
+//
+////    @Autowired
+////    private IStdEnrolService stdEnrolService;
+//
+//
+//    /** 支付平台支付前置事件
+//     * @param id
+//     * @param channel 支付方式
+//     * @return
+//     */
+//    @RequestMapping("std/scoreReview/payUnion/makePayBill")
+//    public Ajax makePayBill4payUnion(Integer id, String channel,Integer std_id,String paytype) {
+//        StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+//        FrameAssertUtil.isNotNull(stdRegInfo, "请重新登录");
+//
+//        if (!StringUtils.isEmpty(std_id) && stdRegInfo != null &&!stdRegInfo.getId().equals(std_id)) {
+//            Ajax ajax = new Ajax();
+//            ajax.setSuccess(false);
+//            ajax.setErrorCode(246);
+//            ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+//            getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+//            return ajax;
+//        }
+//
+//        FrameAssertUtil.isNotNull(id, "报考ID不能为空");
+//
+//        //生成订单之前验证刷新缴费状态
+//        boolean inTime = this.timeService.isInTime(CfOperateTimeType.enrolPay.ordinal(),null);
+//        if (!inTime) {
+//            throw new BusinessException("不在报考缴费允许时间范围内,无法操作。");
+//        }
+//
+//        StdScoreReview scoreReview = this.stdScoreReviewService.find(id);
+//        if (scoreReview == null) {
+//            Ajax ajax = new Ajax();
+//            ajax.setSuccess(false);
+//            ajax.setErrorMsg("不存在该报考信息");
+//            return ajax;
+//        }
+//
+//        // 校验报考对应的考生ID与会话考生ID一致
+//        if(!stdRegInfo.getId().equals(scoreReview.getStd_id())){
+//            Ajax ajax = new Ajax();
+//            ajax.setSuccess(false);
+//            ajax.setErrorMsg("当前登录考生账号与报考课程对应考生不一致,无法缴费。");
+//            return ajax;
+//        }
+//
+//
+//        //  三分钟之内,生成的未缴费订单多于3条记录,则不允许再生成订单
+//        List<PayBillUnion> pays = this.payBillUnionService.list("business_id", id);
+//        PayBillUnion payBillUnion = null;
+//        if(null != pays && pays.size()==1){
+//            payBillUnion = pays.get(0);
+//        }
+//
+//
+//        LocalDateTime now = null;
+//        StdEnrol time = this.stdEnrolService.getDataBaseTime();
+//        if (null != time && null != time.getCreate_time()) {
+//            now = time.getCreate_time();
+//        } else {
+//            now = LocalDateTime.now();
+//        }
+//        if (null != payBillUnion) {
+//            // 校验是否已经缴费通过
+//            if ("success".equals(payBillUnion.getBill_status())) {
+//                Ajax ajax = new Ajax();
+//                ajax.setSuccess(false);
+//                ajax.setErrorMsg("该报考已经缴费,不能重复缴费,请点击刷新按钮!");
+//                return ajax;
+//            } else {
+//                // 没有缴费通过,刷新最近5条订单是否已经完成
+//                try {
+//                    UnionPayUtil.freshPay(payBillUnion.getBill_no());
+//                } catch (Exception e) {
+//                    LogHelper.error(e);
+//                }
+//            }
+//
+//            payBillUnion.setBill_time(now);
+//            this.payBillUnionService.edit(payBillUnion);
+//        }else {
+//            //费用
+//            //int fee =  new Double(stdEnrol.getFee_price()).intValue();
+//            CfFeeScale feeScale = this.feeScaleDao.getFeeScale("42");
+//            int fee=new Double(feeScale.getPrice()).intValue();
+//            //订单号
+//            HttpResult qrCode = null;
+//            long begin = System.currentTimeMillis();            //生成订单编号
+//            String bill_no = this.genBillNo(stdRegInfo.getTicket_no());
+//            payBillUnion = new PayBillUnion();
+//            payBillUnion.setBill_amount(fee);
+//            payBillUnion.setBill_no(bill_no);
+//            payBillUnion.setCustomer_id(String.valueOf(stdRegInfo.getId()));
+//            payBillUnion.setBusiness_id(String.valueOf(id));
+//
+//            payBillUnion.setBill_time(now);
+//
+//            payBillUnion.setBusiness_type(UnionPayUtil.BUSINESS_TYPE);
+//            payBillUnion.setChannel_type(UnionPayUtil.CHANNEL_TYPE);
+//            payBillUnion.setBill_status(UnionPayUtil.PAY_STATUS_REQUEST);
+//            payBillUnion.setPaytype(paytype==null?"0":paytype);
+//            payBillUnionService.insert(payBillUnion);
+//
+//        }
+//
+//
+//        HttpResult qrCode;
+//        long begin = System.currentTimeMillis();
+//        try {
+//
+//            LogHelper.hisomeLogger.info(XclogUtil.tb(payBillUnion.getBill_no(),"开始提交银联支付订单费用:[{"+String.valueOf(payBillUnion.getBill_amount())+"}],参数:[{"+stdRegInfo.getTicket_no() +"}]"));
+//
+//            LogHelper.info("-------------------------------------开始UnionPayUtil.getQrCode----------------------------------------------------");
+//
+//            // 20200105 统一支付平台将单位从元调整成分优化
+//
+//            qrCode = UnionPayUtil.getQrCode(payBillUnion.getBill_no(), String.valueOf(payBillUnion.getBill_amount()*100), stdRegInfo.getTicket_no(),now);
+//            HashMap<String, String> paramMap = qrCode.getMap();
+//            paramMap.put("ticketNo", stdRegInfo.getTicket_no());
+//            paramMap.put("stdName", stdRegInfo.getStd_name());
+//
+//            if (qrCode.getStatusCode() != 200) {
+//                LogHelper.hisomeLogger.error(XclogUtil.te(2,"请求支付平台接口异常,返回码:"+qrCode.getStatusCode()));
+//            }else {
+//                LogHelper.hisomeLogger.info(XclogUtil.te(1,"提交银联支付订单成功"));
+//            }
+//        } catch (Exception e) {
+//            LogHelper.error(e);
+//            LogHelper.hisomeLogger.error(XclogUtil.te(2,"提交银联支付订单异常!"+e.getMessage()));
+//            throw new BusinessException(e.getMessage());
+//        }finally{
+//            LogHelper.info("获取耗时:"+(System.currentTimeMillis()-begin));
+//            LogHelper.info("-------------------------------------结束UnionPayUtil.getQrCode----------------------------------------------------");
+//        }
+//
+//        return new Ajax(qrCode);
+//    }
+//
+//    /**
+//     * 订单号生成:12位准考证号+13位当前时间+3位数据库序列=28位订单号
+//     * @param ticket_no
+//     * @return
+//     */
+//    private synchronized String genBillNo(String ticket_no) {
+//        StringBuffer bill_no = new StringBuffer();
+//        bill_no.append(ticket_no);
+//        bill_no.append(new Date().getTime());
+//        String seq = this.stdEnrolService.getSeqBillNo();
+//        String formatSting = new DecimalFormat("000").format(Integer.parseInt(seq));
+//        bill_no.append(formatSting);
+//
+//        return bill_no.toString();
+//    }
+//
+//
+//
+//    @RequestMapping("std/scoreReview/payUnion/checkOrderIsSuccess")
+//    public Ajax queryOrderIsSuccess(String orderNum,Integer std_id) {
+//        Ajax ajax = new Ajax();
+//
+//        StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+//        if(null == std){
+//            ajax.setSuccess(false);
+//            ajax.setErrorCode(246);
+//            ajax.setErrorMsg("未登录,请登录系统!");
+//            return ajax;
+//        }
+//
+//        if (!StringUtils.isEmpty(std_id) && std != null &&!std.getId().equals(std_id)) {
+//            ajax.setSuccess(false);
+//            ajax.setErrorCode(246);
+//            ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+//            getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+//            return ajax;
+//        }
+//
+//        long begin = System.currentTimeMillis();
+//
+//        try {
+//            LogHelper.hisomeLogger.info(XclogUtil.tb(orderNum,"开始查询银联支付结果"));
+//
+//            LogHelper.info("-------------------------------------开始UnionPayUtil.queryOrderIsSuccess----------------------------------------------------");
+//
+//            Map<String, String> resMap = UnionPayUtil.queryOrderIsSuccess(orderNum);
+//            String orderStatus = resMap.get("orderStatus");
+//            if ("suss".equals(orderStatus)) {
+//                NoticePayUnion notice = new NoticePayUnion();
+//                notice.setCode(resMap.get("code"));
+//                notice.setSign(resMap.get("sign"));
+//                notice.setOrderNum(resMap.get("orderNum"));
+//                notice.setTradeTime(resMap.get("tradeTime"));
+//                notice.setOrderDate(resMap.get("orderDate"));
+//                notice.setOrderStatus(resMap.get("orderStatus"));
+//                notice.setOrderDesc(resMap.get("orderDesc"));
+//                notice.setSystemName(resMap.get("systemName"));
+//                notice.setMessage(resMap.get("message"));
+//
+//                // 必须 先记录日志,再调用this.notice4payUnion(notice,true); 否则记录日志报错误。tb和te需配套使用
+//                LogHelper.hisomeLogger.info(XclogUtil.te(1,"查询银联支付结果成功:支付成功"));
+//
+//                this.notice4payUnion(notice,true);
+//
+//            }else{
+//                LogHelper.hisomeLogger.error(XclogUtil.te(2,"查询银联支付结果成功:支付失败"));
+//                ajax.setErrorMsg("订单未支付成功!");
+//                ajax.setSuccess(false);
+//            }
+//
+//        } catch (Exception e) {
+//            LogHelper.error(e);
+//            LogHelper.hisomeLogger.error(XclogUtil.te(2,"查询银联支付结果异常!"+e.getMessage()));
+//            throw new BusinessException("查询订单状态异常");
+//        }finally{
+//            LogHelper.info("查询订单是否成功耗时:"+(System.currentTimeMillis()-begin));
+//            LogHelper.info("-------------------------------------结束UnionPayUtil.queryOrderIsSuccess----------------------------------------------------");
+//        }
+//
+//        return ajax;
+//    }
+//
+//    @RequestMapping("std/scoreReview/payUnion/checkOrderIsSuccessForDel")
+//    public Ajax checkOrderIsSuccessForDel(Integer business_id,Integer std_id) {
+//        Ajax ajax = new Ajax();
+//
+//        StdRegInfo std = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+//        FrameAssertUtil.isNotNull(std, "请重新登录");
+//
+//        if (!StringUtils.isEmpty(std_id) && std != null &&!std.getId().equals(std_id)) {
+//            ajax.setSuccess(false);
+//            ajax.setErrorCode(246);
+//            ajax.setErrorMsg("检测到考生登录异常,请不要在同一个浏览器登录多个用户,请务必退出后重新登录!");
+//            getRequest().getSession().setAttribute(EnrolSessionName.EnrolStdReg, null);
+//            return ajax;
+//        }
+//
+//        if (null == business_id) {
+//            // 报考ID为空,不允许删除
+//            ajax.setErrorMsg("报考ID为空,不允许删除。");
+//            ajax.setSuccess(true);
+//            return ajax;
+//        }
+//
+//        boolean inTime = this.timeService.isInTime(CfOperateTimeType.PERSONAL_REG.ordinal(),null);
+//        if (!inTime) {
+//            ajax.setErrorMsg("不在报考允许时间范围内,无法操作");
+//            ajax.setSuccess(true);
+//            return ajax;
+//        }
+//
+//        // 校验报考ID属于会话考生的报考ID
+//        StdScoreReview scoreReview = this.stdScoreReviewService.find(business_id);
+//        if (null != scoreReview && scoreReview.getStd_id().intValue() != std.getId()) {
+//            ajax.setErrorMsg("待删除的报考记录与当前考生不一致,请重新登陆!");
+//            ajax.setSuccess(true);
+//            return ajax;
+//        }
+//
+//        try {
+//            // 根据报考ID获取订单号
+//            List<PayBillUnion> pays = this.payBillUnionService.queryPayBillUnionByBusinessId(business_id);
+//
+//            if (null == pays || pays.isEmpty()) {
+//                // 课程报考未生成订单,允许删除
+//                ajax.setErrorMsg("未生成订单!");
+//                ajax.setSuccess(false);
+//                return ajax;
+//            }
+//
+//
+//            for (PayBillUnion payBillUnion : pays) {
+//                if (null != payBillUnion && "success".equals(payBillUnion.getBill_status())) {
+//                    // 订单支付成功, 不允许删除
+//                    ajax.setErrorMsg("已缴费成功, 不允许删除!请刷新列表!");
+//                    ajax.setSuccess(true);
+//                    return ajax;
+//                }
+//
+//                if (null != payBillUnion && null != payBillUnion.getIs_three_minutes() && payBillUnion.getIs_three_minutes().intValue() == 1) {
+//                    // 3分钟内存在订单, 不允许删除
+//                    ajax.setErrorMsg("存在三分钟之内的订单,请稍后再取消!");
+//                    ajax.setSuccess(true);
+//                    return ajax;
+//                }
+//
+//
+//                if (null != payBillUnion && null != payBillUnion.getBill_no()) {
+//                    LogHelper.hisomeLogger.info(XclogUtil.tb(payBillUnion.getBill_no(), "开始查询银联支付结果"));
+//                    Map<String, String> resMap = UnionPayUtil.queryOrderIsSuccess(payBillUnion.getBill_no());
+//                    LogHelper.hisomeLogger.info(XclogUtil.te(1,"查询银联支付结果成功"));
+//                    String orderStatus = resMap.get("orderStatus");
+//                    if ("suss".equals(orderStatus)) {
+//                        NoticePayUnion notice = new NoticePayUnion();
+//                        notice.setCode(resMap.get("code"));
+//                        notice.setSign(resMap.get("sign"));
+//                        notice.setOrderNum(resMap.get("orderNum"));
+//                        notice.setTradeTime(resMap.get("tradeTime"));
+//                        notice.setOrderDate(resMap.get("orderDate"));
+//                        notice.setOrderStatus(resMap.get("orderStatus"));
+//                        notice.setOrderDesc(resMap.get("orderDesc"));
+//                        notice.setSystemName(resMap.get("systemName"));
+//                        notice.setMessage(resMap.get("message"));
+//                        this.notice4payUnion(notice, true);
+//
+//                        // 订单支付完成,不允许删除
+//                        ajax.setErrorMsg("课程报考已缴费成功, 不允许删除。");
+//                        ajax.setSuccess(true);
+//                        return ajax;
+//
+//                    }
+//
+//                }
+//
+//            }
+//
+//        } catch (Exception e) {
+//            LogHelper.error(e);
+//            LogHelper.hisomeLogger.error(XclogUtil.te(2,"查询银联支付结果异常!"+e.getMessage()));
+//            // 查询订单状态异常,不允许删除
+//            ajax.setErrorMsg("查询订单状态异常, 不允许删除。");
+//            ajax.setSuccess(true);
+//            return ajax;
+//        }
+//
+//        // 报考课程未缴费,允许删除
+//        ajax.setErrorMsg("报考课程未缴费,允许删除。");
+//        ajax.setSuccess(false);
+//        return ajax;
+//    }
+//
+//
+//
+//
+//    /** 支付成功回调接口
+//     * @return
+//     */
+//    @RequestMapping("std/scoreReview/payUnion/notice")
+//    public void notice4payUnion(@RequestBody NoticePayUnion notice, boolean isUSerSend){
+//        LogHelper.hisomeLogger.info(XclogUtil.m("收到银联支付结果通知,订单号:[{0}],参数:[{1}]", notice.getOrderNum(), JsonHelper.fromObject(notice)));
+//        LogHelper.hisomeLogger.info(XclogUtil.tb(notice.getOrderNum(),"开始处理支付结果"));
+//        StdRegInfo stdRegInfo = (StdRegInfo) getRequest().getSession().getAttribute(EnrolSessionName.EnrolStdReg);
+//        PayNoticeUnion noticeUnion = new PayNoticeUnion();
+//        noticeUnion.setCode(notice.getCode());
+//        noticeUnion.setOrder_amount(notice.getOrderAmount());
+//        noticeUnion.setOrder_date(notice.getOrderDate());
+//        noticeUnion.setOrder_desc(notice.getOrderDesc());
+//        noticeUnion.setOrder_num(notice.getOrderNum());
+//        noticeUnion.setOrder_status(notice.getOrderStatus());
+//        noticeUnion.setSystem_name(notice.getSystemName());
+//        noticeUnion.setTrade_time(notice.getTradeTime());
+//        noticeUnion.setMessage(notice.getMessage());
+//        noticeUnion.setSign(notice.getSign());
+//
+//        payNoticeUnionService.insert(noticeUnion);
+//
+//        String orderNum = notice.getOrderNum();
+//        PayBillUnion payBillUnion = new PayBillUnion();
+//        payBillUnion.setBill_no(orderNum);
+//        List<PayBillUnion> list = payBillUnionService.list("bill_no", orderNum);
+//
+//        // 页面请求是否成功标识
+//        boolean isSuccess = false;
+//        // 报考是否有删除标识 ,用于计算删除报考的退款金额
+//        boolean delEnrol = false;
+//
+//        if (list.size() > 0) {
+//            LocalDateTime now = null;
+//            StdEnrol time = this.stdEnrolService.getDataBaseTime();
+//            if (null != time && null != time.getCreate_time()) {
+//                now = time.getCreate_time();
+//            } else {
+//                now = LocalDateTime.now();
+//            }
+//
+//            PayBillUnion payBill = list.get(0);
+//
+//            // 订单总金额
+//            BigDecimal total_fee_price = new BigDecimal(0);
+//            // 订单号对应的报考表的金额总数
+//            BigDecimal enrol_fee_price = new BigDecimal(0);
+//            // 报考表的报考金额
+//            BigDecimal fee_price = new BigDecimal(0);
+//
+//            // 订单退款金额
+//            BigDecimal cancel_amout = new BigDecimal(0);
+//            // 退款考生ID
+//            Integer std_id = 0;
+//            if(!StringUtils.isEmpty(payBill.getCustomer_id())){
+//                std_id = Integer.parseInt(payBill.getCustomer_id());
+//            }
+//
+//            EpayOrderInfoMsgDTO dto = new EpayOrderInfoMsgDTO();
+//            dto.setPayType(payBill.getPaytype());
+//            dto.setPayTime(notice.getTradeTime());
+//            dto.setOrderNo(orderNum);
+//
+//            // 遍历订单表pay_bill_union的订单,修改报考表状态
+//            for (PayBillUnion bill : list) {
+//                // 最新订单回写时间
+//                bill.setReply_last_time(now);
+//                // 第一次回写订单,则更新订单第一次回写时间和订单状态
+//                if(!"success".equals(bill.getBill_status())){
+//                    bill.setReply_time(now);
+//                    bill.setBill_status(UnionPayUtil.PAY_STATUS_SUCCESS);
+//                }
+//
+//                // 更新订单表的回写时间和订单状态
+//                this.payBillUnionService.edit(bill);
+//
+//                // 计算订单在自考系统对应的总金额
+//                if(null != bill.getBill_amount()){
+//                    total_fee_price = total_fee_price.add(new BigDecimal(bill.getBill_amount()));
+//                }
+//
+//                // 报考ID
+//                String business_id = bill.getBusiness_id();
+//                //根据报考ID获取报考表信息
+//                //StdEnrol dbEnrol = this.stdEnrolService.find(Integer.parseInt(business_id));
+//                StdScoreReview scoreReview = this.stdScoreReviewService.find(business_id);
+//                //  报考表存在对应的报表信息
+//                if(scoreReview != null){
+//                    // 获取报考对应的金额
+//                    if(!StringUtils.isEmpty(fee_price)){
+//                        fee_price = new BigDecimal(dbEnrol.getFee_price());
+//                    }else{
+//                        fee_price = new BigDecimal(0);
+//                    }
+//
+//                    // 计算报考表的报考总金额
+//                    enrol_fee_price = enrol_fee_price.add(fee_price);
+//
+//                    // 如果报考缴费状态已经是缴费状态,则不再更新报考表(避免编排后有其他场景进入该场景将报考状态从编排状态修改成缴费状态)
+//                    if(null != dbEnrol.getFee_status() && dbEnrol.getFee_status().intValue() == 1){
+//                        // 报考已经缴费,如果报考已缴费的订单号与当前订单号不一样,则计算报考退款总金额
+//                        if(!orderNum.equals(dbEnrol.getFee_no())){
+//                            // 计算退款总金额
+//                            cancel_amout = cancel_amout.add(fee_price);
+//                        }
+//
+//                        LogHelper.info("课程报考的缴费状态已经是已缴费,本次不处理");
+//                        continue;
+//                    }else{
+//                        // 报考表的报考状态不是未缴费,则更新报考表的订单号、缴费状态和报考状态
+//                        dbEnrol.setFee_no(notice.getOrderNum());
+//                        dbEnrol.setStatus(StdConst.StdEnrolStatus.PAY_PASS.ordinal());
+//                        dbEnrol.setFee_status(StdConst.StdPayStatus.ALREADY_PAY.ordinal());
+//                        this.stdEnrolService.editStdEnrol(dbEnrol, stdRegInfo);
+//                    }
+//
+//                    // 订单报考考区(取最后报考记录的考区)
+//                    dto.setEnrol_agent_id(dbEnrol.getEnrol_agent_id());
+//
+//                }else{
+//                    // 报考表不存在对应的报表信息(如报考已被删除)
+//
+//                    // 标识报考被删除,用于计算被删除的报考的金额
+//                    delEnrol = true;
+//
+//                    bill.setReply_remark("订单回写时报考记录已经被删除。");
+//                    // 更新订单表回写备注
+//                    payBillUnionService.edit(bill);
+//                }
+//
+//            }
+//
+//            isSuccess = true;
+//
+//            // 订单总金额
+//            dto.setOrderAmount(total_fee_price.stripTrailingZeros().toPlainString());
+//
+//            // 有删除的报考,则计算删除的报考的总金额,并累加到订单退款金额
+//            if (delEnrol) {
+//                // 计算退款总金额 : 删除的报考的总金额=订单总金额-订单号对应的报考表的金额总数
+//                cancel_amout = cancel_amout.add(total_fee_price.subtract(enrol_fee_price));
+//            }
+//
+//            // 订单回写时,同步已支付订单、取消订单消息队列
+//            this.SendEpayOrder(std_id, dto, cancel_amout, now);
+//        }
+//
+//        LogHelper.hisomeLogger.info(XclogUtil.te(1,"受理成功"));
+//
+//        if (!isUSerSend) {
+//            String rtnMsg = isSuccess?"SUCCESS":"FAILED";
+//            HttpServletResponse response = this.getResponse();
+//            OutputStream outPutStream = null;
+//            try{
+//                outPutStream = response.getOutputStream();
+//                response.setHeader("content-type", "text/html;charset=UTF-8");
+//                byte[] dataByteArr = rtnMsg.getBytes("UTF-8");
+//                outPutStream.write(dataByteArr);
+//                outPutStream.flush();
+//                outPutStream.close();
+//            }catch(Exception e){
+//                LogHelper.error(e);
+//                throw new BusinessException(e.getMessage());
+//            }
+//
+//        }
+//
+//
+//    }
+//
+//    /**
+//     * 订单回写,同步已支付订单、取消订单消息队列
+//     * @param cancel_amout
+//     * @param std_id
+//     * @param now
+//     */
+//    private void SendEpayOrder(Integer std_id, EpayOrderInfoMsgDTO dto, BigDecimal cancel_amout,LocalDateTime now){
+//        // 消息队列启用时(订单回写的应用配置启用,自考网上系统不配置启用),
+//        if("true".equals(SysConst.getAppConfig().getXc_mq())){
+//            LogHelper.info("-------------------------------------订单回写,同步已支付订单、取消订单消息队列开始----------------------------------------------------");
+//
+//            // 获取考生信息
+//            StdRegInfo dbStd = this.stdRegInfoService.find(std_id);
+//
+//            // 考生信息不为空时,处理
+//            if(null != dbStd){
+//                // 解密考生敏感信息
+//                this.stdRegInfoService.DecryptStd(dbStd);
+//
+//                SendEpayOrderThread thread = new SendEpayOrderThread();
+//
+//                // 构造订单消息信息
+//                EpayOrderInfoMsgDTO epayOrderInfoMsgDTO = this.buidEpayOrderInfoMsgDTO(dbStd, dto, now);
+//                thread.setEpayOrderInfoMsgDTO(epayOrderInfoMsgDTO);
+//                LogHelper.info("已支付订单号:"+epayOrderInfoMsgDTO.getOrderNo()+"  已支付订单金额:"+epayOrderInfoMsgDTO.getOrderAmount());
+//
+//                // 取消订单金额 大于0,构造取消订单消息信息
+//                if(cancel_amout.compareTo(new BigDecimal(0)) > 0){
+//                    EpayCancelMsgDTO epayCancelMsgDTO = this.buidEpayCancelMsgDTO(dbStd, dto, cancel_amout, now);
+//                    thread.setEpayCancelMsgDTO(epayCancelMsgDTO);
+//                    LogHelper.info("取消订单号:"+epayCancelMsgDTO.getOrderNo()+"  取消订单金额:"+cancel_amout.stripTrailingZeros().toPlainString());
+//                }
+//
+//                thread.start();
+//            }
+//
+//            LogHelper.info("-------------------------------------订单回写,同步已支付订单、取消订单消息队列结束----------------------------------------------------");
+//        }
+//    }
+//
+//
+//    /**
+//     * 构造已支付订单消息信息
+//     * @param dbStd
+//     * @param now
+//     * @return
+//     */
+//    private EpayOrderInfoMsgDTO buidEpayOrderInfoMsgDTO(StdRegInfo dbStd, EpayOrderInfoMsgDTO dto,LocalDateTime now) {
+//        // 考生订单信息推送
+//        EpayOrderInfoMsgDTO epayOrderInfoMsgDTO = new EpayOrderInfoMsgDTO();
+//        epayOrderInfoMsgDTO.setRequestType("1");
+//        // 订单编号
+//        epayOrderInfoMsgDTO.setOrderNo(dto.getOrderNo());
+//        // 支付流水号
+//        epayOrderInfoMsgDTO.setOrderSeqno(dto.getOrderNo());
+//
+//        epayOrderInfoMsgDTO.setPayType(dto.getPayType());
+//        // 金额
+//        epayOrderInfoMsgDTO.setOrderAmount(dto.getOrderAmount());
+//        // 姓名
+//        epayOrderInfoMsgDTO.setStudentName(dbStd.getStd_name());
+//        // 证件号
+//        epayOrderInfoMsgDTO.setIDNo(dbStd.getCert_no());
+//        // 系统名称
+//        epayOrderInfoMsgDTO.setSystemName(SysConst.getAppConfig().getPay_union_systemName());
+//
+//        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+//
+//        // 发送时间
+//        epayOrderInfoMsgDTO.setRequestTime(now.format(df));
+//        // 支付时间
+//        epayOrderInfoMsgDTO.setPayTime(dto.getPayTime());
+//
+//        String year_code = YearCodeHelper.getCurrentYearCode();
+//
+//        // 考试计划标识码
+//        epayOrderInfoMsgDTO.setKsjhdm(year_code.substring(0, 4)+"1004"+year_code.substring(4, 6));
+//        // 考试计划名称
+//        epayOrderInfoMsgDTO.setKsjhmc(year_code.substring(0, 4)+"年高等自学考试"+year_code.substring(4, 6)+"月份考试");
+//
+//        Integer org_id = (null == dto.getEnrol_agent_id()?dbStd.getExam_area_id():dto.getEnrol_agent_id());
+//        // 根据报考考区ID获取考区信息
+//        CfOrganization org = this.cfOrganizationService.find(org_id);
+//        if(null != org){
+//            // 考区机构代码
+//            epayOrderInfoMsgDTO.setSsglgdm(org.getOrg_code_bz());
+//            // 考区名称
+//            epayOrderInfoMsgDTO.setGlkqmc(org.getOrg_name_bz());
+//        }else{
+//            //  考区为空,则默认传南宁市直
+//            // 考区机构代码
+//            epayOrderInfoMsgDTO.setSsglgdm("D4501");
+//            // 考区名称
+//            epayOrderInfoMsgDTO.setGlkqmc("南宁市招生考试");
+//        }
+//
+//        // TODO 科目类型 5-40元科目(自考)6-70元科目(自考)
+//        epayOrderInfoMsgDTO.setSub_type("5");
+//
+//        // 支付端口类型:0-PC、1-APP
+//        epayOrderInfoMsgDTO.setPayType(dto.getPayType());
+//
+//        DateTimeFormatter datefm = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+//        // 清算时间
+//        epayOrderInfoMsgDTO.setCheckouttate(now.format(datefm));
+//
+//        return epayOrderInfoMsgDTO;
+//    }
+//
+//    /**
+//     * 构造取消订单消息信息
+//     * @param dbStd
+//     * @param cancel_amout
+//     * @param now
+//     * @return
+//     */
+//    private EpayCancelMsgDTO buidEpayCancelMsgDTO(StdRegInfo dbStd, EpayOrderInfoMsgDTO dto, BigDecimal cancel_amout, LocalDateTime now) {
+//        // 取消订单金额不等于0,构造取消订单消息信息
+//        EpayCancelMsgDTO epayCancelMsgDTO = new EpayCancelMsgDTO();
+//        epayCancelMsgDTO.setRequestType("1");
+//        epayCancelMsgDTO.setOrderNo(dto.getOrderNo());
+//        epayCancelMsgDTO.setOrderAmount(cancel_amout.stripTrailingZeros().toPlainString());
+//        epayCancelMsgDTO.setStudentName(dbStd.getStd_name());
+//        epayCancelMsgDTO.setIDNo(dbStd.getCert_no());
+//        // 系统名称
+//        epayCancelMsgDTO.setSystemName(SysConst.getAppConfig().getPay_union_systemName());
+//
+//        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+//        DateTimeFormatter datefm = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+//        epayCancelMsgDTO.setRequestTime(now.format(df));
+//
+//        // 清算时间
+//        epayCancelMsgDTO.setCheckouttate(now.format(datefm));
+//
+//        epayCancelMsgDTO.setRemark("重复缴费或报考已删除退款");
+//
+//        return epayCancelMsgDTO;
+//    }
+//
+//
+//}

+ 92 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/sys/SysAppNewsControl.java

@@ -0,0 +1,92 @@
+package cn.hmsoft.ses.control.sys;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrderType;
+import cn.hmsoft.ses.service.iface.cf.ICfOperateTimeService;
+import cn.hmsoft.ses.service.iface.sys.ISysAppNewsService;
+import cn.hmsoft.web.control.AjaxControl;
+import cn.hmsoft.web.entity.Ajax;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *  控制器.
+ * 
+ * @author: shudonghui
+ * @date: 2021-09-29 09:32:45
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@RestController
+public class SysAppNewsControl extends AjaxControl {
+
+    @Autowired
+    private ISysAppNewsService sysAppNewsService;
+    @Autowired
+   	private ICfOperateTimeService cfOperateTimeService;
+	
+    @RequestMapping("sys/sysAppNews/page")
+    public Ajax page(String query, Integer limit, Integer start, String order, String type) {
+        if (StringHelper.isEmpty(order)) {
+        	//TODO 修改为排序字段
+        	order = "published_at";
+            type= QueryOrderType.DESC.toString();
+        }
+        return new Ajax(this.sysAppNewsService.page(query, start, limit, this.getQueryOrder(order, type)));
+    }
+    
+	@RequestMapping("sys/sysAppNews/queryOperateTimeByTypeByExamTimeId")
+	public Ajax queryOperateTimeByTypeByExamTimeId(Integer exam_time_id) {
+		return new Ajax(this.cfOperateTimeService.queryOperateTimeByTypeByExamTimeId(exam_time_id));
+	}
+
+    
+//    @RequestMapping("sys/sysAppNews/add")
+//    public Ajax add(SysAppNews sysAppNews) {
+//        this.sysAppNewsService.insert(sysAppNews);
+//        return new Ajax();
+//    }
+//
+//    @RequestMapping("sys/sysAppNews/edit")
+//    public Ajax edit(SysAppNews sysAppNews) {
+//        this.sysAppNewsService.edit(sysAppNews);
+//        return new Ajax();
+//    }
+//
+//    @RequestMapping("sys/sysAppNews/delete")
+//    public Ajax delete(Integer[] ids) {
+//    	for (Integer id : ids) {
+//    		this.sysAppNewsService.delete(id);
+//    	}
+//        return new Ajax();
+//    }
+//
+//    @RequestMapping("sys/sysAppNews/get")
+//    public Ajax get(Integer id) {
+//        return new Ajax(this.sysAppNewsService.find(id));
+//    }
+
+    @RequestMapping("sys/sysAppServe/list")
+    public Ajax list(Integer id) {
+        return new Ajax(this.sysAppNewsService.listServe());
+    }
+
+    @RequestMapping("sys/sysAppNews/content")
+    public Ajax getContent(Integer id) {
+        return new Ajax(this.sysAppNewsService.getContent(id));
+    }
+
+    @RequestMapping("sys/sysAppServe/page")
+    public Ajax sysAppServepage(String query, Integer limit, Integer start, String order, String type) {
+    	if(StringUtils.isEmpty(order)){
+    		order = "serve_order";
+			type = "asc";
+    	}
+    	
+        return new Ajax(this.sysAppNewsService.pageServe(query, start, limit, this.getQueryOrder(order, type)));
+    }
+}

+ 715 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/util/FrameIdCardUtil.java

@@ -0,0 +1,715 @@
+package cn.hmsoft.ses.control.util;
+
+
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+
+/**************************
+ * 
+ * @note 身份证工具
+ * @author revisit@126.com
+ * @Company: www.hmsoft.cn
+ * @create 2017年8月15日 下午8:55:11
+ * @version 4.0.0
+ */
+public class FrameIdCardUtil {
+	/** 中国公民身份证号码最小长度。 */
+	public static final int CHINA_ID_MIN_LENGTH = 15;
+
+	/** 中国公民身份证号码最大长度。 */
+	public static final int CHINA_ID_MAX_LENGTH = 18;
+
+	/** 省、直辖市代码表 */
+	public static final String cityCode[] = { "11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43", "44",
+			"45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71", "81", "82", "91" };
+
+	/** 每位加权因子 */
+	public static final int power[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
+
+	/** 第18位校检码 */
+	public static final String verifyCode[] = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
+	/** 最低年限 */
+	public static final int MIN = 1930;
+	public static Map<String, String> cityCodes = new HashMap<String, String>();
+	/** 台湾身份首字母对应数字 */
+	public static Map<String, Integer> twFirstCode = new HashMap<String, Integer>();
+	/** 香港身份首字母对应数字 */
+	public static Map<String, Integer> hkFirstCode = new HashMap<String, Integer>();
+	static {
+		cityCodes.put("11", "北京");
+		cityCodes.put("12", "天津");
+		cityCodes.put("13", "河北");
+		cityCodes.put("14", "山西");
+		cityCodes.put("15", "内蒙古");
+		cityCodes.put("21", "辽宁");
+		cityCodes.put("22", "吉林");
+		cityCodes.put("23", "黑龙江");
+		cityCodes.put("31", "上海");
+		cityCodes.put("32", "江苏");
+		cityCodes.put("33", "浙江");
+		cityCodes.put("34", "安徽");
+		cityCodes.put("35", "福建");
+		cityCodes.put("36", "江西");
+		cityCodes.put("37", "山东");
+		cityCodes.put("41", "河南");
+		cityCodes.put("42", "湖北");
+		cityCodes.put("43", "湖南");
+		cityCodes.put("44", "广东");
+		cityCodes.put("45", "广西");
+		cityCodes.put("46", "海南");
+		cityCodes.put("50", "重庆");
+		cityCodes.put("51", "四川");
+		cityCodes.put("52", "贵州");
+		cityCodes.put("53", "云南");
+		cityCodes.put("54", "西藏");
+		cityCodes.put("61", "陕西");
+		cityCodes.put("62", "甘肃");
+		cityCodes.put("63", "青海");
+		cityCodes.put("64", "宁夏");
+		cityCodes.put("65", "新疆");
+		cityCodes.put("71", "台湾");
+		cityCodes.put("81", "香港");
+		cityCodes.put("82", "澳门");
+		cityCodes.put("91", "国外");
+		twFirstCode.put("A", 10);
+		twFirstCode.put("B", 11);
+		twFirstCode.put("C", 12);
+		twFirstCode.put("D", 13);
+		twFirstCode.put("E", 14);
+		twFirstCode.put("F", 15);
+		twFirstCode.put("G", 16);
+		twFirstCode.put("H", 17);
+		twFirstCode.put("J", 18);
+		twFirstCode.put("K", 19);
+		twFirstCode.put("L", 20);
+		twFirstCode.put("M", 21);
+		twFirstCode.put("N", 22);
+		twFirstCode.put("P", 23);
+		twFirstCode.put("Q", 24);
+		twFirstCode.put("R", 25);
+		twFirstCode.put("S", 26);
+		twFirstCode.put("T", 27);
+		twFirstCode.put("U", 28);
+		twFirstCode.put("V", 29);
+		twFirstCode.put("X", 30);
+		twFirstCode.put("Y", 31);
+		twFirstCode.put("W", 32);
+		twFirstCode.put("Z", 33);
+		twFirstCode.put("I", 34);
+		twFirstCode.put("O", 35);
+		hkFirstCode.put("A", 1);
+		hkFirstCode.put("B", 2);
+		hkFirstCode.put("C", 3);
+		hkFirstCode.put("R", 18);
+		hkFirstCode.put("U", 21);
+		hkFirstCode.put("Z", 26);
+		hkFirstCode.put("X", 24);
+		hkFirstCode.put("W", 23);
+		hkFirstCode.put("O", 15);
+		hkFirstCode.put("N", 14);
+	}
+
+	/**
+	 * 将15位身份证号码转换为18位
+	 * 
+	 * @param idCard
+	 *            15位身份编码
+	 * @return 18位身份编码
+	 */
+	public static String conver15CardTo18(String idCard) {
+		String idCard18 = "";
+		if (idCard.length() != CHINA_ID_MIN_LENGTH) {
+			return null;
+		}
+		if (isNum(idCard)) {
+			// 获取出生年月日
+			String birthday = idCard.substring(6, 12);
+			Date birthDate = null;
+			try {
+				birthDate = new SimpleDateFormat("yyMMdd").parse(birthday);
+			} catch (ParseException e) {
+				e.printStackTrace();
+			}
+			Calendar cal = Calendar.getInstance();
+			if (birthDate != null)
+				cal.setTime(birthDate);
+			// 获取出生年(完全表现形式,如:2010)
+			String sYear = String.valueOf(cal.get(Calendar.YEAR));
+			idCard18 = idCard.substring(0, 6) + sYear + idCard.substring(8);
+			// 转换字符数组
+			char[] cArr = idCard18.toCharArray();
+			if (cArr != null) {
+				int[] iCard = converCharToInt(cArr);
+				int iSum17 = getPowerSum(iCard);
+				// 获取校验位
+				String sVal = getCheckCode18(iSum17);
+				if (sVal.length() > 0) {
+					idCard18 += sVal;
+				} else {
+					return null;
+				}
+			}
+		} else {
+			return null;
+		}
+		return idCard18;
+	}
+
+	/**
+	 * 验证身份证是否合法
+	 */
+	public static boolean validateCard(String idCard) {
+		String card = idCard.trim();
+		if (validateIdCard18(card)) {
+			return true;
+		}
+		if (validateIdCard15(card)) {
+			return true;
+		}
+		String[] cardval = validateIdCard10(card);
+		if (cardval != null) {
+			if (cardval[2].equals("true")) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * 验证18位身份编码是否合法
+	 * 
+	 * @param idCard
+	 *            身份编码
+	 * @return 是否合法
+	 */
+	public static boolean validateIdCard18(String idCard) {
+		boolean bTrue = false;
+		if(StringUtils.isEmpty(idCard)){
+			return bTrue;
+		}
+		
+		if (idCard.length() == CHINA_ID_MAX_LENGTH) {
+			// 前17位
+			String code17 = idCard.substring(0, 17);
+			// 第18位
+			String code18 = idCard.substring(17, CHINA_ID_MAX_LENGTH);
+			if (isNum(code17)) {
+				char[] cArr = code17.toCharArray();
+				if (cArr != null) {
+					int[] iCard = converCharToInt(cArr);
+					int iSum17 = getPowerSum(iCard);
+					// 获取校验位
+					String val = getCheckCode18(iSum17);
+					if (val.length() > 0) {
+						if (val.equalsIgnoreCase(code18)) {
+							bTrue = true;
+						}
+					}
+				}
+			}
+		}
+		return bTrue;
+	}
+
+	/**
+	 * 验证15位身份编码是否合法
+	 * 
+	 * @param idCard
+	 *            身份编码
+	 * @return 是否合法
+	 */
+	public static boolean validateIdCard15(String idCard) {
+		if (idCard.length() != CHINA_ID_MIN_LENGTH) {
+			return false;
+		}
+		if (isNum(idCard)) {
+			String proCode = idCard.substring(0, 2);
+			if (cityCodes.get(proCode) == null) {
+				return false;
+			}
+			String birthCode = idCard.substring(6, 12);
+			Date birthDate = null;
+			try {
+				birthDate = new SimpleDateFormat("yy").parse(birthCode.substring(0, 2));
+			} catch (ParseException e) {
+				e.printStackTrace();
+			}
+			Calendar cal = Calendar.getInstance();
+			if (birthDate != null)
+				cal.setTime(birthDate);
+			if (!valiDate(cal.get(Calendar.YEAR), Integer.valueOf(birthCode.substring(2, 4)), Integer.valueOf(birthCode.substring(4, 6)))) {
+				return false;
+			}
+		} else {
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * 验证10位身份编码是否合法
+	 * 
+	 * @param idCard
+	 *            身份编码
+	 * @return 身份证信息数组
+	 *         <p>
+	 *         [0] - 台湾、澳门、香港 [1] - 性别(男M,女F,未知N) [2] - 是否合法(合法true,不合法false)
+	 *         若不是身份证件号码则返回null
+	 *         </p>
+	 */
+	public static String[] validateIdCard10(String idCard) {
+		String[] info = new String[3];
+		String card = idCard.replaceAll("[\\(|\\)]", "");
+		if (card.length() != 8 && card.length() != 9 && idCard.length() != 10) {
+			return null;
+		}
+		if (idCard.matches("^[a-zA-Z][0-9]{9}{1}")) { // 台湾
+			info[0] = "台湾";
+			System.out.println("11111");
+			String char2 = idCard.substring(1, 2);
+			if (char2.equals("1")) {
+				info[1] = "M";
+				System.out.println("MMMMMMM");
+			} else if (char2.equals("2")) {
+				info[1] = "F";
+				System.out.println("FFFFFFF");
+			} else {
+				info[1] = "N";
+				info[2] = "false";
+				System.out.println("NNNN");
+				return info;
+			}
+			info[2] = validateTWCard(idCard) ? "true" : "false";
+		} else if (idCard.matches("^[1|5|7][0-9]{6}\\(?[0-9A-Z]\\)?{1}")) { // 澳门
+			info[0] = "澳门";
+			info[1] = "N";
+		} else if (idCard.matches("^[A-Z]{1,2}[0-9]{6}\\(?[0-9A]\\)?{1}")) { // 香港
+			info[0] = "香港";
+			info[1] = "N";
+			info[2] = validateHKCard(idCard) ? "true" : "false";
+		} else {
+			return null;
+		}
+		return info;
+	}
+
+	/**
+	 * 验证台湾身份证号码
+	 * 
+	 * @param idCard
+	 *            身份证号码
+	 * @return 验证码是否符合
+	 */
+	public static boolean validateTWCard(String idCard) {
+		String start = idCard.substring(0, 1);
+		String mid = idCard.substring(1, 9);
+		String end = idCard.substring(9, 10);
+		Integer iStart = twFirstCode.get(start);
+		Integer sum = iStart / 10 + (iStart % 10) * 9;
+		char[] chars = mid.toCharArray();
+		Integer iflag = 8;
+		for (char c : chars) {
+			sum = sum + Integer.valueOf(c + "") * iflag;
+			iflag--;
+		}
+		return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.valueOf(end) ? true : false;
+	}
+
+	/**
+	 * 验证香港身份证号码(存在Bug,部份特殊身份证无法检查)
+	 * <p>
+	 * 身份证前2位为英文字符,如果只出现一个英文字符则表示第一位是空格,对应数字58 前2位英文字符A-Z分别对应数字10-35
+	 * 最后一位校验码为0-9的数字加上字符"A","A"代表10
+	 * </p>
+	 * <p>
+	 * 将身份证号码全部转换为数字,分别对应乘9-1相加的总和,整除11则证件号码有效
+	 * </p>
+	 * 
+	 * @param idCard
+	 *            身份证号码
+	 * @return 验证码是否符合
+	 */
+	public static boolean validateHKCard(String idCard) {
+		String card = idCard.replaceAll("[\\(|\\)]", "");
+		Integer sum = 0;
+		if (card.length() == 9) {
+			sum = (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 9
+					+ (Integer.valueOf(card.substring(1, 2).toUpperCase().toCharArray()[0]) - 55) * 8;
+			card = card.substring(1, 9);
+		} else {
+			sum = 522 + (Integer.valueOf(card.substring(0, 1).toUpperCase().toCharArray()[0]) - 55) * 8;
+		}
+		String mid = card.substring(1, 7);
+		String end = card.substring(7, 8);
+		char[] chars = mid.toCharArray();
+		Integer iflag = 7;
+		for (char c : chars) {
+			sum = sum + Integer.valueOf(c + "") * iflag;
+			iflag--;
+		}
+		if (end.toUpperCase().equals("A")) {
+			sum = sum + 10;
+		} else {
+			sum = sum + Integer.valueOf(end);
+		}
+		return (sum % 11 == 0) ? true : false;
+	}
+
+	/**
+	 * 将字符数组转换成数字数组
+	 * 
+	 * @param ca
+	 *            字符数组
+	 * @return 数字数组
+	 */
+	private static int[] converCharToInt(char[] ca) {
+		int len = ca.length;
+		int[] iArr = new int[len];
+		try {
+			for (int i = 0; i < len; i++) {
+				iArr[i] = Integer.parseInt(String.valueOf(ca[i]));
+			}
+		} catch (NumberFormatException e) {
+			e.printStackTrace();
+		}
+		return iArr;
+	}
+
+	/**
+	 * 将身份证的每位和对应位的加权因子相乘之后,再得到和值
+	 * 
+	 * @param iArr
+	 * @return 身份证编码。
+	 */
+	private static int getPowerSum(int[] iArr) {
+		int iSum = 0;
+		if (power.length == iArr.length) {
+			for (int i = 0; i < iArr.length; i++) {
+				for (int j = 0; j < power.length; j++) {
+					if (i == j) {
+						iSum = iSum + iArr[i] * power[j];
+					}
+				}
+			}
+		}
+		return iSum;
+	}
+
+	/**
+	 * 将power和值与11取模获得余数进行校验码判断
+	 * 
+	 * @param iSum
+	 * @return 校验位
+	 */
+	private static String getCheckCode18(int iSum) {
+		String sCode = "";
+		switch (iSum % 11) {
+		case 10:
+			sCode = "2";
+			break;
+		case 9:
+			sCode = "3";
+			break;
+		case 8:
+			sCode = "4";
+			break;
+		case 7:
+			sCode = "5";
+			break;
+		case 6:
+			sCode = "6";
+			break;
+		case 5:
+			sCode = "7";
+			break;
+		case 4:
+			sCode = "8";
+			break;
+		case 3:
+			sCode = "9";
+			break;
+		case 2:
+			sCode = "x";
+			break;
+		case 1:
+			sCode = "0";
+			break;
+		case 0:
+			sCode = "1";
+			break;
+		}
+		return sCode;
+	}
+
+	/**
+	 * 根据身份编号获取年龄
+	 * 
+	 * @param idCard
+	 *            身份编号
+	 * @return 年龄
+	 */
+	public static int getAgeByIdCard(String idCard) {
+		int iAge = 0;
+		if (idCard.length() == CHINA_ID_MIN_LENGTH) {
+			idCard = conver15CardTo18(idCard);
+		}
+		String year = idCard.substring(6, 10);
+		Calendar cal = Calendar.getInstance();
+		int iCurrYear = cal.get(Calendar.YEAR);
+		iAge = iCurrYear - Integer.valueOf(year);
+		return iAge;
+	}
+
+	/**
+	 * 根据身份编号获取生日
+	 * 
+	 * @param idCard
+	 *            身份编号
+	 * @return 生日(yyyyMMdd)
+	 */
+//	public static Date getBirthByIdCard(String idCard) {
+//		Integer len = idCard.length();
+//		if (len < CHINA_ID_MIN_LENGTH) {
+//			return null;
+//		} else if (len == CHINA_ID_MIN_LENGTH) {
+//			idCard = conver15CardTo18(idCard);
+//		}
+//		
+//		return DateHelper.par(idCard.substring(6, 14),DateHelper.ShortTimeStringWithoutSplit);
+//	}
+
+	/**
+	 * 根据身份编号获取生日年
+	 * 
+	 * @param idCard
+	 *            身份编号
+	 * @return 生日(yyyy)
+	 */
+	public static Short getYearByIdCard(String idCard) {
+		Integer len = idCard.length();
+		if (len < CHINA_ID_MIN_LENGTH) {
+			return null;
+		} else if (len == CHINA_ID_MIN_LENGTH) {
+			idCard = conver15CardTo18(idCard);
+		}
+		return Short.valueOf(idCard.substring(6, 10));
+	}
+
+	/**
+	 * 根据身份编号获取生日月
+	 * 
+	 * @param idCard
+	 *            身份编号
+	 * @return 生日(MM)
+	 */
+	public static Short getMonthByIdCard(String idCard) {
+		Integer len = idCard.length();
+		if (len < CHINA_ID_MIN_LENGTH) {
+			return null;
+		} else if (len == CHINA_ID_MIN_LENGTH) {
+			idCard = conver15CardTo18(idCard);
+		}
+		return Short.valueOf(idCard.substring(10, 12));
+	}
+
+	/**
+	 * 根据身份编号获取生日天
+	 * 
+	 * @param idCard
+	 *            身份编号
+	 * @return 生日(dd)
+	 */
+	public static Short getDateByIdCard(String idCard) {
+		Integer len = idCard.length();
+		if (len < CHINA_ID_MIN_LENGTH) {
+			return null;
+		} else if (len == CHINA_ID_MIN_LENGTH) {
+			idCard = conver15CardTo18(idCard);
+		}
+		return Short.valueOf(idCard.substring(12, 14));
+	}
+
+	/**
+	 * 根据身份编号获取性别
+	 * 
+	 * @param idCard
+	 *            身份编号
+	 * @return 性别(M-男,F-女,N-未知)
+	 */
+	public static String getGenderByIdCard(String idCard) {
+		String sGender = "男";
+		if (idCard.length() == CHINA_ID_MIN_LENGTH) {
+			idCard = conver15CardTo18(idCard);
+		}
+		String sCardNum = idCard.substring(16, 17);
+		if (Integer.parseInt(sCardNum) % 2 != 0) {
+			sGender = "男";
+		} else {
+			sGender = "女";
+		}
+		return sGender;
+	}
+
+	/**
+	 * 根据身份编号获取户籍省份
+	 * 
+	 * @param idCard
+	 *            身份编码
+	 * @return 省级编码。
+	 */
+	public static String getProvinceByIdCard(String idCard) {
+		int len = idCard.length();
+		//String sProvince = null;
+		String sProvinNum = "";
+		if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) {
+			sProvinNum = idCard.substring(0, 2);
+		}
+		//sProvince = cityCodes.get(sProvinNum);
+		return sProvinNum;
+	}
+
+	/**
+	 * 数字验证
+	 * 
+	 * @param val
+	 * @return 提取的数字。
+	 */
+	public static boolean isNum(String val) {
+		return val == null || "".equals(val) ? false : val.matches("^[0-9]*{1}");
+	}
+
+	/**
+	 * 验证小于当前日期 是否有效
+	 * 
+	 * @param iYear
+	 *            待验证日期(年)
+	 * @param iMonth
+	 *            待验证日期(月 1-12)
+	 * @param iDate
+	 *            待验证日期(日)
+	 * @return 是否有效
+	 */
+	public static boolean valiDate(int iYear, int iMonth, int iDate) {
+		Calendar cal = Calendar.getInstance();
+		int year = cal.get(Calendar.YEAR);
+		int datePerMonth;
+		if (iYear < MIN || iYear >= year) {
+			return false;
+		}
+		if (iMonth < 1 || iMonth > 12) {
+			return false;
+		}
+		switch (iMonth) {
+		case 4:
+		case 6:
+		case 9:
+		case 11:
+			datePerMonth = 30;
+			break;
+		case 2:
+			boolean dm = ((iYear % 4 == 0 && iYear % 100 != 0) || (iYear % 400 == 0)) && (iYear > MIN && iYear < year);
+			datePerMonth = dm ? 29 : 28;
+			break;
+		default:
+			datePerMonth = 31;
+		}
+		return (iDate >= 1) && (iDate <= datePerMonth);
+	}
+
+	/**
+	 * 根据身份证号,自动获取对应的星座
+	 * 
+	 * @param idCard
+	 *            身份证号码
+	 * @return 星座
+	 */
+	public static String getConstellationById(String idCard) {
+		if (!validateCard(idCard))
+			return "";
+		int month = getMonthByIdCard(idCard);
+		int day = getDateByIdCard(idCard);
+		String strValue = "";
+
+		if ((month == 1 && day >= 20) || (month == 2 && day <= 18)) {
+			strValue = "水瓶座";
+		} else if ((month == 2 && day >= 19) || (month == 3 && day <= 20)) {
+			strValue = "双鱼座";
+		} else if ((month == 3 && day > 20) || (month == 4 && day <= 19)) {
+			strValue = "白羊座";
+		} else if ((month == 4 && day >= 20) || (month == 5 && day <= 20)) {
+			strValue = "金牛座";
+		} else if ((month == 5 && day >= 21) || (month == 6 && day <= 21)) {
+			strValue = "双子座";
+		} else if ((month == 6 && day > 21) || (month == 7 && day <= 22)) {
+			strValue = "巨蟹座";
+		} else if ((month == 7 && day > 22) || (month == 8 && day <= 22)) {
+			strValue = "狮子座";
+		} else if ((month == 8 && day >= 23) || (month == 9 && day <= 22)) {
+			strValue = "处女座";
+		} else if ((month == 9 && day >= 23) || (month == 10 && day <= 23)) {
+			strValue = "天秤座";
+		} else if ((month == 10 && day > 23) || (month == 11 && day <= 22)) {
+			strValue = "天蝎座";
+		} else if ((month == 11 && day > 22) || (month == 12 && day <= 21)) {
+			strValue = "射手座";
+		} else if ((month == 12 && day > 21) || (month == 1 && day <= 19)) {
+			strValue = "魔羯座";
+		}
+
+		return strValue;
+	}
+
+	/**
+	 * 根据身份证号,自动获取对应的生肖
+	 * 
+	 * @param idCard
+	 *            身份证号码
+	 * @return 生肖
+	 */
+	public static String getZodiacById(String idCard) { // 根据身份证号,自动返回对应的生肖
+		if (!validateCard(idCard))
+			return "";
+
+		String sSX[] = { "猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗" };
+		int year = getYearByIdCard(idCard);
+		int end = 3;
+		int x = (year - end) % 12;
+
+		String retValue = "";
+		retValue = sSX[x];
+
+		return retValue;
+	}
+
+	/**
+	 * 根据身份证号,自动获取对应的天干地支
+	 * 
+	 * @param idCard
+	 *            身份证号码
+	 * @return 天干地支
+	 */
+	public static String getChineseEraById(String idCard) { // 根据身份证号,自动返回对应的生肖
+		if (!validateCard(idCard))
+			return "";
+
+		String sTG[] = { "癸", "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "任" };
+		String sDZ[] = { "亥", "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌" };
+
+		int year = getYearByIdCard(idCard);
+		int i = (year - 3) % 10;
+		int j = (year - 3) % 12;
+
+		String retValue = "";
+		retValue = sTG[i] + sDZ[j];
+
+		return retValue;
+	}
+}

+ 151 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/control/util/ImgUploadConttrol.java

@@ -0,0 +1,151 @@
+package cn.hmsoft.ses.control.util;
+
+import java.io.BufferedReader;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.activation.MimetypesFileTypeMap;
+
+/**图片上传
+ * @author yang
+ *
+ */
+public class ImgUploadConttrol {
+	
+	/**
+	 * 上传图片
+	 * @param urlStr
+	 * @param textMap
+	 * @param fileMap
+	 * @param contentType 没有传入文件类型默认采用application/octet-stream
+	 * contentType非空采用filename匹配默认的图片类型
+	 * @return 返回response数据
+	 */
+	@SuppressWarnings("rawtypes")
+	public static String formUpload(String urlStr, Map<String, String> textMap,
+			Map<String, String> fileMap,String contentType) {
+		String res = "";
+		HttpURLConnection conn = null;
+		// boundary就是request头和上传文件内容的分隔符
+		String BOUNDARY = "---------------------------123821742118716"; 
+		try {
+			URL url = new URL(urlStr);
+			conn = (HttpURLConnection) url.openConnection();
+			conn.setConnectTimeout(5000);
+			conn.setReadTimeout(30000);
+			conn.setDoOutput(true);
+			conn.setDoInput(true);
+			conn.setUseCaches(false);
+			conn.setRequestMethod("POST");
+			conn.setRequestProperty("Connection", "Keep-Alive");
+			conn.setRequestProperty("User-Agent",
+					"Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");
+			conn.setRequestProperty("Content-Type",
+					"multipart/form-data; boundary=" + BOUNDARY);
+			OutputStream out = new DataOutputStream(conn.getOutputStream());
+			// text
+			if (textMap != null) {
+				StringBuffer strBuf = new StringBuffer();
+				Iterator iter = textMap.entrySet().iterator();
+				while (iter.hasNext()) {
+					Map.Entry entry = (Map.Entry) iter.next();
+					String inputName = (String) entry.getKey();
+					String inputValue = (String) entry.getValue();
+					if (inputValue == null) {
+						continue;
+					}
+					strBuf.append("\r\n").append("--").append(BOUNDARY)
+							.append("\r\n");
+					strBuf.append("Content-Disposition: form-data; name=\""
+							+ inputName + "\"\r\n\r\n");
+					strBuf.append(inputValue);
+					System.out.println(inputName+","+inputValue);
+				}
+				out.write(strBuf.toString().getBytes());
+			}
+			// file
+			if (fileMap != null) {
+				Iterator iter = fileMap.entrySet().iterator();
+				while (iter.hasNext()) {
+					Map.Entry entry = (Map.Entry) iter.next();
+					String inputName = (String) entry.getKey();
+					String inputValue = (String) entry.getValue();
+					if (inputValue == null) {
+						continue;
+					}
+					File file = new File(inputValue);
+					String filename = file.getName();
+					
+					//没有传入文件类型,同时根据文件获取不到类型,默认采用application/octet-stream
+					contentType = new MimetypesFileTypeMap().getContentType(file);
+					//contentType非空采用filename匹配默认的图片类型
+					if(!"".equals(contentType)){
+						if (filename.endsWith(".png")) {
+							contentType = "image/png"; 
+						}else if (filename.endsWith(".jpg") || filename.endsWith(".jpeg") || filename.endsWith(".jpe")) {
+							contentType = "image/jpeg";
+						}else if (filename.endsWith(".gif")) {
+							contentType = "image/gif";
+						}else if (filename.endsWith(".ico")) {
+							contentType = "image/image/x-icon";
+						}
+					}
+					if (contentType == null || "".equals(contentType)) {
+						contentType = "application/octet-stream";
+					}
+					StringBuffer strBuf = new StringBuffer();
+					strBuf.append("\r\n").append("--").append(BOUNDARY)
+							.append("\r\n");
+					strBuf.append("Content-Disposition: form-data; name=\""
+							+ inputName + "\"; filename=\"" + filename
+							+ "\"\r\n");
+					System.out.println(inputName+","+filename);
+					
+					strBuf.append("Content-Type:" + contentType + "\r\n\r\n");
+					out.write(strBuf.toString().getBytes());
+					DataInputStream in = new DataInputStream(
+							new FileInputStream(file));
+					int bytes = 0;
+					byte[] bufferOut = new byte[1024];
+					while ((bytes = in.read(bufferOut)) != -1) {
+						out.write(bufferOut, 0, bytes);
+					}
+					in.close();
+				}
+			}
+			byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();
+			out.write(endData);
+			out.flush();
+			out.close();
+			// 读取返回数据
+			StringBuffer strBuf = new StringBuffer();
+			BufferedReader reader = new BufferedReader(new InputStreamReader(
+					conn.getInputStream()));
+			String line = null;
+			while ((line = reader.readLine()) != null) {
+				strBuf.append(line).append("\n");
+			}
+			res = strBuf.toString();
+			reader.close();
+			reader = null;
+		} catch (Exception e) {
+			System.out.println("发送POST请求出错。" + urlStr);
+			e.printStackTrace();
+		} finally {
+			if (conn != null) {
+				conn.disconnect();
+				conn = null;
+			}
+		}
+		return res;
+	}
+
+}

+ 48 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByApplyAuditDao.java

@@ -0,0 +1,48 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByApplyAudit;
+
+/**
+ * 毕业审核表 数据库处理-考生端.
+ * 
+ * @author: zhanqiang
+ * @date: 2019-03-14 13:39:19
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByApplyAuditDao extends PlatformDaoSupport<ByApplyAudit> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from by_apply_audit ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+
+	public List<ByApplyAudit> authList(Integer applyId) {
+		String sql = "select op.optr_name,au.* from by_apply_audit au left join frame_optr op on op.optr_id=au.user_id where au.apply_id=? order by au.auth_time";
+		return this.listBySql(sql, applyId);
+	}
+}

+ 159 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByApplyDao.java

@@ -0,0 +1,159 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.model.by.ByApply;
+import cn.hmsoft.ses.util.AesUtil;
+
+/**
+ * 毕业申请表 数据库处理-考生端.
+ * 
+ * @author: zhanqiang
+ * @date: 2019-03-14 13:39:18
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByApplyDao extends PlatformDaoSupport<ByApply> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param stdId 
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(Integer stdId, String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select                                                                                  		");
+		sql.append("	   FUN_DECRYPTION(reg.std_mobile_en, '").append(SysConst.getAppConfig().getcKey()).append("') telephone,FUN_DECRYPTION(reg.std_address_en, '").append(SysConst.getAppConfig().getcKey()).append("') address,reg.political_status political, 		");
+		sql.append("	   reg.std_birth birthday,reg.std_sex sex,reg.std_nation nation,reg.photo_url,      		");
+		sql.append("       FUN_DECRYPTION(reg.cert_no_en, '").append(SysConst.getAppConfig().getcKey()).append("') cert_no,reg.ticket_no,reg.std_name,reg.std_occupation professional,m.major_name,     ");
+		sql.append("	   m.major_code,o.org_code,o.org_name,p.*  													");
+		sql.append(" from by_apply p                                                                        		");
+		sql.append("    left join std_reg_info reg on reg.id=p.std_id                                       		");
+		sql.append("    left join pl_major m on m.id=p.major_id                                             		");
+		sql.append("    left join cf_organization o on o.id=p.school_id                                 		    ");
+		sql.append(" where 1=1																						");
+		if (stdId != null) {
+			sql.append(" and p.std_id=").append(stdId);
+		}
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString());
+		} else {
+			String cert_no_en = AesUtil.Encrypt(query);
+			String value = generateLikeParamter(query);
+			sql.append(" and (reg.std_name like ? or reg.ticket_no like ? or reg.cert_no_en = ?)");
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql.toString(), value, value, cert_no_en);		
+		}
+	}
+
+
+
+	public ByApply getDetail(Integer id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select                                                                                  		");
+		sql.append("       FUN_DECRYPTION(reg.cert_no_en, '").append(SysConst.getAppConfig().getcKey()).append("') cert_no,reg.std_name,reg.std_occupation professional,m.major_name,     				");
+		sql.append("	   reg.photo_url,m.major_code,o.org_code,o.org_name,p.*  									");
+		sql.append(" from by_apply p                                                                        		");
+		sql.append("    left join std_reg_info reg on reg.id=p.std_id                                       		");
+		sql.append("    left join pl_major m on m.id=p.major_id                                             		");
+		sql.append("    left join cf_organization o on o.id=p.school_id                                 		    ");
+		sql.append(" where p.id=?																				    ");
+		return this.findBySql(sql.toString(), id);
+	}
+
+	public List<ByApply> listAll(Integer std_id,Integer exam_time_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select   reg.photo_path,                                                                               		");
+		sql.append("       reg.photo_url,FUN_DECRYPTION(reg.cert_no_en, '").append(SysConst.getAppConfig().getcKey()).append("') cert_no,reg.ticket_no,reg.std_name,reg.std_occupation professional,     ");
+		sql.append("	   m.major_level||'' major_level,m.major_code || '-' || m.major_name||'-'||fd.dict_text as major_name,fd.dict_text as major_level,o.org_code || '-' ||o.org_name as school_name,decode(p.std_source,1,ot.org_name,3,o.org_name,nvl(ot.org_name,o.org_name)) org_name, ");
+		sql.append("	   (case  when p.exam_time_id = ? then '' when p.exam_time_id <> ? and p.status=5 then '' else '已过期' end) time_out,");
+		sql.append("	   (select d.dict_text from frame_dict d where d.dict_name='ByStatus' and d.dict_value=p.status) status_text, ");
+		sql.append("	   (select t.exam_year||'年'||decode(t.exam_month,4,'6月',10,'12月',t.exam_month||'月') from pl_exam_time t where t.id=p.exam_time_id) year_code, ");
+		sql.append("	   p.*  													");
+		sql.append(" from by_apply p                                                                        		");
+		sql.append("    left join std_reg_info reg on reg.id=p.std_id                                       		");
+		sql.append("    left join pl_major m on m.id=p.major_id                                             		");
+		sql.append("    left join cf_organization o on o.id=p.school_id                                 		    ");
+		sql.append("    left join cf_organization ot on ot.id=p.order_org_id                                 		    ");
+		sql.append("    left join frame_dict fd  on  fd.dict_value = m.major_level and fd.dict_name = 'MajorLevel'");
+		sql.append(" where std_id = ? order by p.apply_date desc ");
+		
+		return this.listBySql(sql.toString(), exam_time_id,exam_time_id,std_id);
+	}
+	
+	public List<ByApply> listAll(Integer std_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select                                                                                  		");
+		sql.append("       reg.photo_url,FUN_DECRYPTION(reg.cert_no_en, '").append(SysConst.getAppConfig().getcKey()).append("') cert_no,reg.ticket_no,reg.std_name,reg.std_occupation professional,     ");
+		sql.append("	   m.major_code || '-' || m.major_name||'-'||fd.dict_text as major_name,fd.dict_text as major_level,o.org_code || '-' ||o.org_name as school_name,decode(p.std_source,1,ot.org_name,3,o.org_name,nvl(ot.org_name,o.org_name)) org_name, ");
+		sql.append("	  tc.by_date,");
+		sql.append("	   p.id,p.std_id,p.enrol_id,p.major_id,p.by_time_config_id,p.ticket_no,p.apply_date,p.std_source,p.commend,p.skill,p.apply_type,p.school_id,p.city_org_id,p.file_path,p.is_passed,p.status,p.is_auth_back,p.remark,p.std_sex,p.native_prov,p.native_city,p.nation,p.political,p.pre_edu,p.work_unit,p.address,p.post_code,p.diaplma_no,p.telephone,p.std_birth,p.final_auth_a,p.final_auth_b,p.org_id,p.exam_time_id,p.is_xuexin_pass,p.is_firstauth_pass,p.order_org_id,p.by_file, ");
+		sql.append("	   nvl(p.by_photo,reg.photo_url) by_photo,nvl(p.by_photo_path,reg.photo_path) by_photo_path,nvl(p.by_photo_id,reg.photo_id) by_photo_id ");
+		sql.append(" from by_apply p                                                                        		");
+		sql.append("    left join std_reg_info reg on reg.id=p.std_id                                       		");
+		sql.append("    left join pl_major m on m.id=p.major_id                                             		");
+		sql.append("    left join cf_organization o on o.id=p.school_id                                 		    ");
+		sql.append("    left join cf_organization ot on ot.id=p.order_org_id                                 		    ");
+		sql.append("    left join by_time_config tc on tc.id=p.by_time_config_id                                 		    ");
+		sql.append("    left join frame_dict fd  on  fd.dict_value = m.major_level and fd.dict_name = 'MajorLevel'");
+		sql.append(" where p.std_id = ? ");
+		
+		return this.listBySql(sql.toString(),std_id);
+	}
+	
+	
+	public List<ByApply> queryDoubleDiaplmaNo(String diaplma_no,Integer id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from by_apply a where a.diaplma_no=? ");
+		
+		if(null != id){
+			sql.append(" and a.id<>").append(id);
+		}
+		
+		return this.listBySql(sql.toString(), diaplma_no);
+	}
+
+
+
+	public Map<String, Object> getCountryCityMap(String enrol_county_city, String belong_city_id) {
+		String sql = " select  (select city_name from cf_city where city_code = ?) as city_name, (select COUNTRY_NAME from cf_county where country_code = ? and city_code = ?) as country_name from dual";
+		List<Map<String, Object>> listMapBySql = this.listMapBySql(sql, enrol_county_city,belong_city_id,enrol_county_city);
+		if (listMapBySql.size() > 0) {
+			return listMapBySql.get(0);
+		}else{
+			return new HashMap<String, Object>();
+		}
+	}
+	
+	public ByApply queryByApplyByDiaplmaNo(String diaplma_no) {
+		String sql = "select a.* from by_apply a where a.diaplma_no=? ";
+		return this.findBySql(sql, diaplma_no);
+	}
+	
+	public void addByApplyLogByApplyId(Integer by_apply_id) {	
+		StringBuffer sql = new StringBuffer();
+		sql.append("insert into  by_apply_log  select * from  by_apply a where a.id=?");
+		this.updateBySql(sql.toString(),by_apply_id);
+	}
+	
+	public List<ByApply> queryByApplyByStd(Integer std_id,Integer exam_time_id) {
+		String sql = "select a.* from by_apply a where a.std_id=? and a.exam_time_id=?";
+		return this.listBySql(sql.toString(), std_id,exam_time_id);
+	}
+}

+ 60 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByBlackListDao.java

@@ -0,0 +1,60 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByBlackList;
+
+/**
+ * 毕业黑名单 数据库处理.
+ * 
+ * @author: zhanqiang
+ * @date: 2019-03-14 13:39:19
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByBlackListDao extends PlatformDaoSupport<ByBlackList> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from by_black_list ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			String value = generateLikeParamter(query);
+			sql += " and (std_name like ? or cert_no like ? or ticket_no like ? )";
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", value, value, value);		
+		}
+	}
+
+	public void unlock(Integer id) {
+		String sql = "update by_black_list set status=0 where id=?";
+		this.updateBySql(sql, id);
+	}
+
+	public List<ByBlackList> findByBlackLists(Integer stdId, String certNo) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from by_black_list ");
+		sql.append(" where std_id=? 			");
+		if (StringHelper.isNotEmpty(certNo)) {
+			sql.append(" and cert_no='").append(stdId).append("'");
+		}
+		return this.listBySql(sql.toString(), stdId);
+	}
+}

+ 61 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByCertificateDao.java

@@ -0,0 +1,61 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.ses.data.model.by.ByCertificate;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ *  数据库处理.
+ * 
+ * @author: shudonghui
+ * @date: 2020-04-01 20:53:58
+ * @version: 1.0
+ * @email: shudonghui@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByCertificateDao extends PlatformDaoSupport<ByCertificate> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param std_id 
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(Integer std_id) {
+		StringBuffer sql=new StringBuffer();
+		sql.append("select p.year_code,t.id,t.cert_no,t.std_name,t.ticket_no ,t.diaplma_no ,t.status,t.std_source, t.by_date,");
+		sql.append("t.major major_name,t.school school_name,t.remark,t.by_photo,t.major_level ");
+		sql.append("from by_certificate t ");
+		sql.append("left join pl_exam_time p on p.id=t.exam_time_id");
+		//sql.append("left join std_reg_info i on i.id=t.std_id ");
+		//sql.append("left join by_apply app on app.id=t.app_id ");
+		//sql.append("left join pl_major p on p.id=t.major_id ");
+//		sql.append("left join cf_organization school on school.id=t.school_id ");
+//		sql.append("left join cf_organization org on org.id=t.org_id ");
+		sql.append(" where 1=1																						");
+		
+		if (std_id != null) {
+			sql.append(" and t.std_id=").append(std_id);
+		}
+		
+		sql.append(" order by t.apply_date desc ");
+		return this.pageMapBySql(null, 0, Integer.MAX_VALUE, sql.toString());
+	}
+
+	public List<ByCertificate> findByStdAndTime(Integer std_id, Integer exam_time_id) {
+		StringBuffer sql=new StringBuffer();
+		sql.append("select t.* ");
+		sql.append("from by_certificate t ");
+		sql.append(" where t.std_id=? and 	exam_time_id=?");
+		
+		return this.listBySql(sql.toString(), std_id,exam_time_id);
+	}
+}

+ 87 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByCourseReplDetailDao.java

@@ -0,0 +1,87 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByCourseReplDetail;
+
+/**
+ * 课程顶替详情表 数据库处理.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:11
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByCourseReplDetailDao extends PlatformDaoSupport<ByCourseReplDetail> {
+
+	/**
+	 * 分页查询课程顶替计划管理
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(" select d.id,                                                                   ");
+		sb.append("          d.major_id,                                                           ");
+		sb.append("          d.repl_course_names,                                                  ");
+		sb.append("          d.old_course_names,                                                   ");
+		sb.append("          m.year,                                                               ");
+		sb.append("          m.major_code,                                                         ");
+		sb.append("          m.major_name,                                                         ");
+		sb.append("          m.major_level,                                                        ");
+		sb.append("          m.total_credits,                                                      ");
+		sb.append("          r.remark                                                              ");
+		sb.append("     from by_course_repl_detail d, by_course_repl_rule r, pl_major m            ");
+		sb.append("    where d.major_id = m.id                                                     ");
+		sb.append("      and d.rule_id = r.id                                                      ");
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sb.toString());
+		} else {
+			String value = this.generateLikeParamter(query);
+			sb.append(
+					" and (m.major_code like ? or m.major_name like ? or d.old_course_names like ? or d.repl_course_names like ?)");
+			return this.pageMapBySql(queryOrder, start, limit, sb.toString(), value, value, value, value);
+		}
+	}
+	
+	
+	/**
+	 * 新增课程顶替详情-判断是否已经存在
+	 */
+	public ByCourseReplDetail findCourseReplDetail(ByCourseReplDetail detail) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("  select *                                                 ");
+		sb.append("    from by_course_repl_detail d                           ");
+		sb.append("   where d.major_id = ?                                    ");
+		sb.append("     and d.repl_course_ids = ?                             ");
+		sb.append("     and d.repl_course_names = ?                           ");
+		sb.append("     and d.old_course_ids = ?                              ");
+		sb.append("     and d.old_course_names = ?                            ");
+		sb.append("     and d.rule_id = ?                                     ");
+		sb.append("     and d.is_all = ?                                      ");
+		sb.append("     and d.status = ?                                      ");
+		return this.findBySql(sb.toString(), detail.getMajor_id(), detail.getRepl_course_ids(),
+				detail.getRepl_course_names(), detail.getOld_course_ids(), detail.getOld_course_names(),
+				detail.getRule_id(), detail.getIs_all(), detail.getStatus());
+	}
+
+
+	/**
+	 * @param major_id:专业ID
+	 *  通过专业ID查询顶替规则
+	 */
+	public List<ByCourseReplDetail> listCourseReplDetail(Integer major_id) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("   select d.*, r.remark                                        ");
+		sb.append("     from by_course_repl_detail d, by_course_repl_rule r       ");
+		sb.append("    where d.rule_id = r.id                                     ");
+		sb.append("    		 and d.major_id = ?                                   ");
+		return this.listBySql(sb.toString(), major_id);
+	}
+}

+ 100 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByCourseReplRecordDao.java

@@ -0,0 +1,100 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByCourseReplRecord;
+
+/**
+ * 考生课程顶替记录表 数据库处理.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:12
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByCourseReplRecordDao extends PlatformDaoSupport<ByCourseReplRecord> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from by_course_repl_record ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+	
+	public List<Map<String,Object>> queryByScore(Integer by_apply_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select b.id,b.course_id,");
+		sql.append("        b.course_nature,");
+		sql.append("        (select d.dict_text from frame_dict d where d.dict_name='CourseNature' and d.dict_value=b.course_nature) course_nature_name,");
+		sql.append("        b.course_score,");
+		sql.append("        decode(b.score_type,6,b.course_code||'('||b.old_course_code||')',7,b.course_code||'('||b.old_course_code||')',8,b.course_code||'('||b.old_course_code||')',b.old_course_code) course_code,");
+		sql.append("        b.course_code course_code_temp,");
+		sql.append("        b.course_name,");
+		sql.append("        b.score origin_score,");
+		sql.append("        b.score_id detail_id,");
+		sql.append("        b.id byscore_id,");
+		sql.append("        b.score final_score,");
+		sql.append("        decode(b.score, null, '0', '1') is_passed,");
+		sql.append("        b.score_source,");
+		sql.append("        b.score_type,");
+		sql.append("        b.asso_ticket_no,");
+		sql.append("        b.old_course_id,b.old_course_code,");
+		sql.append("        (select o.org_name from cf_organization o where o.id=b.school_id) org_name,");
+		sql.append("        (select m.major_code||'-'||m.major_name from pl_major m where m.id=b.major_id) major_name,b.std_reg_id,b.major_id");
+		sql.append("   from by_score b");
+		sql.append("  where b.by_apply_id = ?");
+		sql.append("  order by b.course_nature, b.old_course_code,b.course_code,b.score desc");
+		return this.listMapBySql(sql.toString(), by_apply_id);
+	}
+	
+	public List<Map<String, Object>> byReplScoreList(Integer stdRegId, String oldCoureIds) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select                                                             ");
+		sql.append("    base.*,pc.course_code,pc.course_name,(select d.dict_text from frame_dict d where d.dict_name='ScoreSource' and d.dict_value=base.score_source) score_source_name                            ");
+		sql.append("from (                                                             ");
+		sql.append("    select d.year_code,                                             ");
+		sql.append("      d.id,d.course_id,d.final_score,d.score_source,1 cjfrom       ");
+		sql.append("    from kj_unified_score_detail d                                 ");
+		sql.append("    where d.status=1 and d.std_reg_id=? and d.final_score >=60     ");
+		sql.append("          and d.score_source not in (2)                            ");
+		sql.append("                                                                   ");
+		sql.append("    union                                                          ");
+		sql.append("                                                                   ");
+		sql.append("    select  c.year_code,                                            ");
+		sql.append("      c.id,c.course_id,c.score final_score,c.score_source,0 cjfrom ");
+		sql.append("    from kj_college_score_detail c                                 ");
+		sql.append("    where c.status=3 and c.std_reg_id=? and c.score >=60           ");
+		sql.append("          and (c.score_source in (7,8,9) or c.score_type in (0,3)) ");
+		sql.append(") base                                                             ");
+		sql.append("left join pl_course pc on pc.id=base.course_id                     ");
+		sql.append("where course_id in (" + oldCoureIds + ")                           ");
+		return this.listMapBySql(sql.toString(), stdRegId, stdRegId);
+	}
+	
+	public List<Map<String, Object>> byReplOldCourseList(Integer majorId, Integer courseId) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select a.*,b.remark rule_remark from by_course_repl_detail a,by_course_repl_rule b where a.rule_id=b.id and a.major_id=? and a.repl_course_ids=? and a.status=1 order by a.rule_id,a.old_course_names");
+		return this.listMapBySql(sql.toString(), majorId, courseId);
+	}
+}

+ 46 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByCourseReplRuleDao.java

@@ -0,0 +1,46 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByCourseReplRule;
+
+/**
+ * 课程顶替规则表 定义课程的顶替规则,如:老1门课程 整体 顶替 新一门课程 数据库处理.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:11
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByCourseReplRuleDao extends PlatformDaoSupport<ByCourseReplRule> {
+
+
+	/**
+	 *  重复判断
+	 */
+	public ByCourseReplRule findCourseReplRule(ByCourseReplRule rule) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("  select *                            ");
+		sb.append("    from by_course_repl_rule          ");
+		sb.append("   where old_course_num = ?           ");
+		sb.append("     and old_course_rule = ?          ");
+		sb.append("     and rule_num = ?                 ");
+		sb.append("     and repl_course_num = ?          ");
+		sb.append("     and repl_course_rule = ?         ");
+		sb.append("     and repl_num = ?                 ");
+		return this.findBySql(sb.toString(), rule.getOld_course_num(), rule.getOld_course_rule(), rule.getRule_num(),
+				rule.getRepl_course_num(), rule.getRepl_course_rule(), rule.getRepl_num());
+	}
+	
+	/**
+	 *  根据选择的课程数目,查询顶替规则
+	 */
+	public List<ByCourseReplRule> listCourseReplRule(Integer old_num, Integer repl_num) {
+		String sql = "select * from by_course_repl_rule where old_course_num=? and repl_course_num= ?";
+		return this.listBySql(sql, old_num, repl_num);
+	}
+}

+ 77 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByDiaplmaDao.java

@@ -0,0 +1,77 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import java.util.List;
+import java.util.Map;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.model.by.ByDiaplma;
+import cn.hmsoft.ses.util.AesUtil;
+
+/**
+ * 毕业证书表 数据库处理-考生端..
+ * 
+ * @author: zhanqiang
+ * @date: 2019-03-18 18:12:52
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByDiaplmaDao extends PlatformDaoSupport<ByDiaplma> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer exam_time_id, Integer school_id, Integer major_id, Integer std_source, 
+			Integer start, Integer limit, QueryOrder queryOrder) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select                                                  ");
+		sql.append("       a.status by_status,reg.ticket_no,reg.std_name,   ");
+		sql.append("       FUN_DECRYPTION(reg.cert_no_en, '").append(SysConst.getAppConfig().getcKey()).append("') cert_no,m.major_code,m.major_name            ");
+		sql.append(" from by_diaplma d                                      ");
+		sql.append(" left join by_apply a on a.id=d.apply_id                ");
+		sql.append(" left join by_time_config c on c.id=a.by_time_config_id ");
+		sql.append(" left join std_reg_info reg on reg.id=d.std_id          ");
+		sql.append(" left join pl_major m on m.id=a.major_id                ");
+		sql.append(" where 1=1                                              ");
+		if (school_id != null) {
+			sql.append(" and a.school_id=").append(school_id);
+		}
+		if (major_id != null) {
+			sql.append(" and a.major_id=").append(major_id);
+		}
+		if (std_source != null) {
+			sql.append(" and a.std_source=").append(std_source);
+		}
+		if (exam_time_id != null) {
+			sql.append(" and c.exam_time_id=").append(exam_time_id);
+		}
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString());
+		} else {
+			String value = generateLikeParamter(query);
+			String cert_no_en = AesUtil.Encrypt(value);
+			sql.append(" and (reg.std_name like ? or reg.ticket_no like ? or reg.cert_no_en = ?)");
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql.toString(), value, value, cert_no_en);
+		}
+	}
+
+	public int isGraded(String diaplmano) {
+		String sql = "select count(1) from by_diaplma where diaplma_no=?";
+		return this.findObject(Integer.class, sql, diaplmano);
+	}
+
+
+
+}

+ 49 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByPaperApplyAuditDao.java

@@ -0,0 +1,49 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByApplyAudit;
+import cn.hmsoft.ses.data.model.by.ByPaperApplyAudit;
+
+/**
+ * 毕业论文答辩审核表 数据库处理-考生端.
+ * 
+ * @author: zhanqiang
+ * @date: 2019-03-14 13:39:19
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByPaperApplyAuditDao extends PlatformDaoSupport<ByPaperApplyAudit> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from by_apply_audit ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+
+	public List<ByPaperApplyAudit> authList(Integer applyId) {
+		String sql = "select op.optr_name,au.* from by_paper_apply_audit au left join frame_optr op on op.optr_id=au.user_id where au.apply_id=? order by au.auth_time";
+		return this.listBySql(sql, applyId);
+	}
+}

+ 163 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByPaperApplyDao.java

@@ -0,0 +1,163 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.constants.SysConst;
+import cn.hmsoft.ses.data.model.by.ByPaperApply;
+import cn.hmsoft.ses.data.model.mk.MkCertEduApply;
+import cn.hmsoft.ses.data.model.pl.PlStdRecord;
+import cn.hmsoft.ses.util.AesUtil;
+import org.springframework.stereotype.Repository;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 毕业申请表 数据库处理-考生端.
+ * 
+ * @author: zhanqiang
+ * @date: 2019-03-14 13:39:18
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByPaperApplyDao extends PlatformDaoSupport<ByPaperApply> {
+	
+	public List<ByPaperApply> listAll(Integer std_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select                                                                                  		");
+		sql.append("       pt.year_code,reg.photo_url,FUN_DECRYPTION(reg.cert_no_en, '").append(SysConst.getAppConfig().getcKey()).append("') cert_no,reg.ticket_no,reg.std_name,reg.std_occupation professional,     ");
+		sql.append("	   m.major_code || '-' || m.major_name as major_name,fd.dict_text as major_level,o.org_code || '-' ||o.org_name as school_name,pd.dict_text as status_text,p.*  													");
+		sql.append(" from by_paper_apply p                                                                        		");
+		sql.append("    left join std_reg_info reg on reg.id=p.std_id                                       		");
+		sql.append("    left join pl_major m on m.id=p.major_id                                             		");
+		sql.append("    left join pl_exam_time pt on pt.id=p.exam_time_id                                ");
+		sql.append("    left join cf_organization o on o.id=p.school_id                                 		    ");
+		sql.append("    left join frame_dict fd  on  fd.dict_value = m.major_level and fd.dict_name = 'MajorLevel'");
+		sql.append("    left join frame_dict pd  on  pd.dict_value = p.status and pd.dict_name = 'PaperApplyStatus' ");
+		sql.append(" where std_id = ? order by p.apply_date desc ");
+		
+		return this.listBySql(sql.toString(), std_id);
+	}
+	
+	
+	
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param stdId 
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(Integer stdId, String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select                                                                                  		");
+		sql.append("	   FUN_DECRYPTION(reg.std_mobile_en, '").append(SysConst.getAppConfig().getcKey()).append("') telephone,FUN_DECRYPTION(reg.std_address_en, '").append(SysConst.getAppConfig().getcKey()).append("') address,reg.political_status political, 		");
+		sql.append("	   reg.std_birth birthday,reg.std_sex sex,reg.std_nation nation,reg.photo_url,      		");
+		sql.append("       FUN_DECRYPTION(reg.cert_no_en, '").append(SysConst.getAppConfig().getcKey()).append("') cert_no,reg.ticket_no,reg.std_name,reg.std_occupation professional,m.major_name,     ");
+		sql.append("	   m.major_code,o.org_code,o.org_name,p.*  													");
+		sql.append(" from by_apply p                                                                        		");
+		sql.append("    left join std_reg_info reg on reg.id=p.std_id                                       		");
+		sql.append("    left join pl_major m on m.id=p.major_id                                             		");
+		sql.append("    left join cf_organization o on o.id=p.school_id                                 		    ");
+		sql.append(" where 1=1																						");
+		if (stdId != null) {
+			sql.append(" and p.std_id=").append(stdId);
+		}
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql.toString());
+		} else {
+			String value = generateLikeParamter(query);
+			String cert_no_en = AesUtil.Encrypt(value);
+			sql.append(" and (reg.std_name like ? or reg.ticket_no like ? or reg.cert_no_en = ?)");
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql.toString(), value, value, cert_no_en);		
+		}
+	}
+
+
+
+	public ByPaperApply getDetail(Integer id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select                                                                                  		");
+		sql.append("       FUN_DECRYPTION(reg.cert_no_en, '").append(SysConst.getAppConfig().getcKey()).append("') cert_no,reg.std_name,reg.std_occupation professional,m.major_name,     				");
+		sql.append("	   reg.photo_url,m.major_code,o.org_code,o.org_name,p.*  									");
+		sql.append(" from by_apply p                                                                        		");
+		sql.append("    left join std_reg_info reg on reg.id=p.std_id                                       		");
+		sql.append("    left join pl_major m on m.id=p.major_id                                             		");
+		sql.append("    left join cf_organization o on o.id=p.school_id                                 		    ");
+		sql.append(" where p.id=?																				    ");
+		return this.findBySql(sql.toString(), id);
+	}
+
+	
+
+
+
+	public Map<String, Object> getCountryCityMap(String enrol_county_city, String belong_city_id) {
+		String sql = " select  (select city_name from cf_city where city_code = ?) as city_name, (select COUNTRY_NAME from cf_county where country_code = ? and city_code = ?) as country_name from dual";
+		List<Map<String, Object>> listMapBySql = this.listMapBySql(sql, enrol_county_city,belong_city_id,enrol_county_city);
+		if (listMapBySql.size() > 0) {
+			return listMapBySql.get(0);
+		}else{
+			return new HashMap<String, Object>();
+		}
+	}
+	
+	
+	public PlStdRecord queryPlStdRecordByStd(Integer std_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select a.*,o.org_name from pl_std_record a,cf_organization o where o.id=a.school_id and a.status=3 and a.school_id<>1258 and a.std_reg_id=? order by a.year_code");
+		return this.findBySql(PlStdRecord.class,sql.toString(), std_id);
+	}
+	
+	public MkCertEduApply queryScoreCountByStd(Integer major_id,Integer std_id) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("select (select count(1) ");
+		sb.append("from pl_major m, pl_major_course mc ");
+		sb.append("where mc.major_id = m.id ");
+		sb.append("and mc.course_nature <>4 ");
+		sb.append("and m.id = ?) course_count, ");
+		sb.append("select count(1) from ( ");
+		sb.append("select distinct d.course_id from  ");
+		sb.append("kj_unified_score_detail d, pl_major m, pl_major_course mc ");
+		sb.append("where mc.major_id = m.id ");
+		sb.append("and mc.course_id = d.course_id ");
+		sb.append("and d.score_source = 1 ");
+		sb.append("and d.final_score >= 60 ");
+		sb.append("and d.status in(1,2) ");
+		sb.append("and m.id=? ");
+		sb.append("and d.std_reg_id=? ");
+		sb.append("union ");
+		sb.append("select distinct d.course_id from  ");
+		sb.append("kj_college_score_detail d, pl_major m, pl_major_course mc ");
+		sb.append("where mc.major_id = m.id ");
+		sb.append("and mc.course_id = d.course_id ");
+		sb.append("and d.score_source in (7,8,9) ");
+		sb.append("and d.score >= 60 ");
+		sb.append("and m.id=? ");
+		sb.append("and d.std_reg_id=? ");
+		sb.append("union ");
+		sb.append("select distinct d.course_id from  ");
+		sb.append("kj_college_score_detail d, pl_major m, pl_major_course mc ");
+		sb.append("where mc.major_id = m.id ");
+		sb.append("and mc.course_id = d.course_id ");
+		sb.append("and d.score_type in (0,3) ");
+		sb.append("and d.status=3 ");
+		sb.append("and (d.score>=60 or (d.score>=0 and d.score in(select fd.dict_value from frame_dict fd where fd.dict_name in('ScoreLevel','score_flag')))) ");
+		sb.append("and m.id=? ");
+		sb.append("and d.std_reg_id=? ");
+		sb.append(") score_count ");
+		sb.append("from dual ");
+		
+		return this.findBySql(MkCertEduApply.class,sb.toString(),major_id,std_id,major_id,major_id,major_id,major_id);
+	}
+}

+ 49 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByPaperDao.java

@@ -0,0 +1,49 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByPaper;
+
+/**
+ * 毕业论文 数据库处理.
+ * 
+ * @author: zhanqiang
+ * @date: 2019-04-11 16:28:47
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByPaperDao extends PlatformDaoSupport<ByPaper> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from by_paper ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+
+	public List<ByPaper> findByPapers(Integer major_id, Integer std_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from by_paper where major_id=? and std_reg_id=?");
+		return this.listBySql(sql.toString(), major_id, std_id);
+	}
+}

+ 307 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByScoreDao.java

@@ -0,0 +1,307 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.data.model.by.ByScore;
+
+@Repository
+public class ByScoreDao extends PlatformDaoSupport<ByScore> {
+	
+	public void addByScoreFromeUnifiedScore(ByScore byScore){
+		StringBuffer sql = new StringBuffer();
+		sql.append("insert into BY_SCORE");
+		sql.append("(");
+		sql.append("  id             ,");
+		sql.append("  by_apply_id    ,");
+		sql.append("  std_reg_id     ,");
+		sql.append("  year_code       ,");
+		sql.append("  major_id       ,");
+		sql.append("  course_id      ,");
+		sql.append("  course_code    ,");
+		sql.append("  course_name    ,");
+		sql.append("  course_nature    ,");
+		sql.append("  course_score    ,");
+		sql.append("  score          ,");
+		sql.append("  score_type     ,");
+		sql.append("  score_source   ,");
+		sql.append("  status         ,");
+		sql.append("  SCORE_ID       ,");
+		sql.append("  school_id      ,");
+		sql.append("  paper_title    ,");
+		sql.append("  old_course_id      ,");
+		sql.append("  old_course_code    ,");
+		sql.append("  asso_ticket_no ,");
+		sql.append("  create_oper    ,");
+		sql.append("  create_date    ");
+		sql.append(")");
+		sql.append("select ");
+		sql.append(" SEQ_BY_SCORE.nextval  id,");
+		sql.append("  ? by_apply_id    ,");
+		sql.append("  ? std_reg_id     ,");
+		sql.append("  d.year_code       ,");
+		sql.append("  d.major_id       ,");
+		sql.append("  d.course_id      ,");
+		sql.append("  c.course_code   ,");
+		sql.append("  c.course_name    ,");
+		sql.append("  (select course_nature from pl_major_course mc where mc.major_id=? and mc.course_id=c.id and rownum=1)course_nature    ,");
+		sql.append("  c.course_score    ,");
+		sql.append("  decode(d.score_source,5,'免考',d.final_score) score,");
+		sql.append("  5 score_type    ,");
+		sql.append("  d.score_source   ,");
+		sql.append("  1 status         ,");
+		sql.append("  d.id SCORE_ID       ,");
+		sql.append("  null school_id     ,");
+		sql.append("  '' paper_title    ,");
+		sql.append("  d.course_id old_course_id     ,");
+		sql.append("  c.course_code old_course_code  ,");
+		sql.append("  '' asso_ticket_no ,");
+		sql.append("  ? create_oper    ,");
+		sql.append("  sysdate     ");
+		sql.append("from kj_unified_score_detail d,pl_course c where c.id=d.course_id and d.std_reg_id=? and d.status in(1,2) and d.final_score>=60 ");
+		sql.append(" and exists (select * from pl_major_course mc,by_apply b where b.major_id=mc.major_id and mc.course_id=c.id and b.id=?) "); 
+		
+		this.updateBySql(sql.toString(),byScore.getBy_apply_id(),byScore.getStd_reg_id(),byScore.getMajor_id(),byScore.getStd_reg_id(),byScore.getStd_reg_id(),byScore.getBy_apply_id());
+	}
+	
+	public void addByScoreFromeCollegeScore(ByScore byScore){
+		StringBuffer sql = new StringBuffer();
+
+		sql.append("insert into BY_SCORE");
+		sql.append("(");
+		sql.append("  id             ,");
+		sql.append("  by_apply_id    ,");
+		sql.append("  std_reg_id     ,");
+		sql.append("  year_code       ,");
+		sql.append("  major_id       ,");
+		sql.append("  course_id      ,");
+		sql.append("  course_code    ,");
+		sql.append("  course_name    ,");
+		sql.append("  course_nature    ,");
+		sql.append("  course_score    ,");
+		sql.append("  score          ,");
+		sql.append("  score_type     ,");
+		sql.append("  score_source   ,");
+		sql.append("  status         ,");
+		sql.append("  SCORE_ID       ,");
+		sql.append("  school_id      ,");
+		sql.append("  paper_title    ,");
+		sql.append("  old_course_id      ,");
+		sql.append("  old_course_code    ,");
+		sql.append("  asso_ticket_no ,");
+		sql.append("  create_oper    ,");
+		sql.append("  create_date    ");
+		sql.append(")");
+		sql.append("select ");
+		sql.append(" SEQ_BY_SCORE.nextval  id           ,");
+		sql.append("  ? by_apply_id    ,");
+		sql.append("  ? std_reg_id     ,");
+		sql.append("  b.year_code       ,");
+		sql.append("  b.major_id       ,");
+		sql.append("  b.course_id      ,");
+		sql.append("  decode(b.score_type,4,nvl((select c.course_code from pl_major_course mc,pl_course c where c.id=mc.course_id and mc.major_id=? and mc.course_nature=4 and rownum=1),'08738'),(select course_code from pl_course c where c.id=b.course_id)) course_code   ,");
+		sql.append("  decode(b.score_type,4,nvl((select c.course_name from pl_major_course mc,pl_course c where c.id=mc.course_id and mc.major_id=? and mc.course_nature=4 and rownum=1),'毕业论文并答辩'),(select course_name from pl_course c where c.id=b.course_id)) course_name   ,");
+		sql.append("  decode(b.score_type,4,4,(select course_nature from pl_major_course mc where mc.major_id=? and mc.course_id=b.course_id and rownum=1)) course_nature   ,");
+		sql.append("  decode(b.score_type,4,nvl((select c.course_score from pl_major_course mc,pl_course c where c.id=mc.course_id and mc.major_id=? and mc.course_nature=4 and rownum=1),'0.00'),(select course_score from pl_course c where c.id=b.course_id)) course_score   ,");
+		sql.append("  b.score        ,");
+		sql.append("  b.score_type    ,");
+		sql.append("  b.score_source   ,");
+		sql.append("  1 status         ,");
+		sql.append("  b.SCORE_ID       ,");
+		sql.append("  b.school_id     ,");
+		sql.append("  b.paper_title    ,");
+		sql.append("  b.course_id old_course_id     ,");
+		sql.append("  decode(b.score_type,4,nvl((select c.course_code from pl_major_course mc,pl_course c where c.id=mc.course_id and mc.major_id=? and mc.course_nature=4 and rownum=1),'08738'),(select course_code from pl_course c where c.id=b.course_id)) old_course_code   ,");
+		sql.append("  '' asso_ticket_no ,");
+		sql.append("  ? create_oper    ,");
+		sql.append("  sysdate     ");
+		sql.append("from ");
+		sql.append("(");
+		sql.append(" select ");
+		sql.append("  d.year_code       ,");
+		sql.append("  d.major_id       ,");
+		sql.append("  d.course_id      ,");
+		sql.append("  ''||round(d.score) score         ,");
+		sql.append("  d.score_type    ,");
+		sql.append("  d.score_source   ,");
+		sql.append("  d.id SCORE_ID       ,");
+		sql.append("  d.school_id     ,");
+		sql.append("  '' paper_title    ");
+		sql.append(" from kj_college_score_detail d where d.std_reg_id=? and d.score_source in (7,8,9) and d.score>=60");
+		sql.append(" and exists (select * from pl_major_course mc,by_apply app where app.major_id=mc.major_id and mc.course_id=d.course_id and app.id=?) "); 
+		sql.append(" union all ");
+		sql.append(" select ");
+		sql.append("  d.year_code       ,");
+		sql.append("  d.major_id       ,");
+		sql.append("  d.course_id      ,");
+		sql.append("  ''||nvl((select fd.dict_text from frame_dict fd where fd.dict_name in('ScoreLevel','score_flag') and fd.dict_value=d.score and rownum=1),round(d.score)) score         ,");
+		sql.append("  d.score_type    ,");
+		sql.append("  d.score_source   ,");
+		sql.append("  d.id SCORE_ID       ,");
+		sql.append("  d.school_id     ,");
+		sql.append("  '' paper_title  ");
+		sql.append("from kj_college_score_detail d where d.std_reg_id=? and d.score_source=0 and d.score_type in(0,3) and d.status=3 and (d.score>=60 or (d.score>=0 and d.score in(select fd.dict_value from frame_dict fd where fd.dict_name in('ScoreLevel','score_flag'))))");
+		sql.append(" and exists (select * from pl_major_course mc,by_apply app where app.major_id=mc.major_id and mc.course_id=d.course_id and app.id=?) "); 
+		sql.append(" union all ");
+		sql.append(" select");
+		sql.append("  d.year_code       ,");
+		sql.append("  d.major_id       ,");
+		sql.append("  d.course_id      ,");
+		sql.append("  ''||nvl((select fd.dict_text from frame_dict fd where fd.dict_name in('PaperScoreLevel','score_flag') and fd.dict_value=d.score and rownum=1),round(d.score)) score         ,");
+		sql.append("  d.score_type    ,");
+		sql.append("  d.score_source   ,");
+		sql.append("  d.id SCORE_ID       ,");
+		sql.append("  d.school_id     ,");
+		sql.append("  d.paper_title  ");
+		sql.append("from kj_college_score_detail d where d.std_reg_id=? and d.score_source =0 and d.score_type=4 and d.status=3 and (d.score>=60 or (d.score in(1,2,3,4,201,202,203,204)))");
+		sql.append("  and exists (select * from pl_major m where (m.id = ? or m.id in (select n.old_major_id from pl_major_old_new n where n.new_major_id=?)) and m.id=d.major_id and m.major_level=1)    ");
+		sql.append(") b"); 
+		
+		this.updateBySql(sql.toString(),byScore.getBy_apply_id(),byScore.getStd_reg_id(),byScore.getMajor_id(),byScore.getMajor_id(),byScore.getMajor_id(),byScore.getMajor_id(),byScore.getMajor_id(),byScore.getStd_reg_id(),byScore.getStd_reg_id(),byScore.getBy_apply_id(),byScore.getStd_reg_id(),byScore.getBy_apply_id(),byScore.getStd_reg_id(),byScore.getMajor_id(),byScore.getMajor_id());
+	}
+	
+	public void addByScoreForMajorCourse(ByScore byScore){
+		StringBuffer sql = new StringBuffer();
+		sql.append("insert into BY_SCORE");
+		sql.append("    (");
+		sql.append("      id             ,");
+		sql.append("      by_apply_id    ,");
+		sql.append("      std_reg_id     ,");
+		sql.append("      year_code       ,");
+		sql.append("      major_id       ,");
+		sql.append("      course_id      ,");
+		sql.append("      course_code    ,");
+		sql.append("      course_name    ,");
+		sql.append("      course_nature    ,");
+		sql.append("      course_score    ,");
+		sql.append("      score          ,");
+		sql.append("      score_type     ,");
+		sql.append("      score_source   ,");
+		sql.append("      status         ,");
+		sql.append("      SCORE_ID       ,");
+		sql.append("      school_id      ,");
+		sql.append("      paper_title    ,");
+		sql.append("      old_course_id ,");
+		sql.append("      old_course_code ,");
+		sql.append("      asso_ticket_no ,");
+		sql.append("      create_oper    ,");
+		sql.append("      create_date    ");
+		sql.append("    )");
+		sql.append("    select ");
+		sql.append("     SEQ_BY_SCORE.nextval  id,");
+		sql.append("      ? by_apply_id    ,");
+		sql.append("      ? std_reg_id     ,");
+		sql.append("      ? year_code       ,");
+		sql.append("      mc.major_id       ,");
+		sql.append("      c.id course_id      ,");
+		sql.append("      c.course_code   ,");
+		sql.append("      c.course_name    ,");
+		sql.append("      mc.course_nature    ,");
+		sql.append("      c.course_score    ,");
+		sql.append("      '' score,");
+		sql.append("      '' score_type    ,");
+		sql.append("      '' score_source   ,");
+		sql.append("      1 status         ,");
+		sql.append("      '' SCORE_ID       ,");
+		sql.append("      '' school_id     ,");
+		sql.append("      '' paper_title    ,");
+		sql.append("      c.id   old_course_id    ,");
+		sql.append("      c.course_code old_course_code  ,");
+		sql.append("      '' asso_ticket_no ,");
+		sql.append("      ? create_oper    ,");
+		sql.append("      sysdate     ");
+		sql.append("      from pl_major_course mc, pl_course c");
+		sql.append("      where mc.course_id = c.id");
+		sql.append("      and mc.major_id = ?");
+		sql.append("      and not exists (select * from BY_SCORE b  where b.old_course_code=c.course_code and b.by_apply_id=?)  ");  
+		
+		this.updateBySql(sql.toString(),byScore.getBy_apply_id(),byScore.getStd_reg_id(),byScore.getYear_code(),byScore.getStd_reg_id(),byScore.getMajor_id(),byScore.getBy_apply_id());
+	}
+	
+	public void deleteByScoreByApplyId(Integer byApplyId){
+		this.delete("by_apply_id", byApplyId);
+	}
+	
+	public void deleteByScoreLogByApplyId(Integer by_apply_id) {	
+		StringBuffer sql = new StringBuffer();
+		sql.append("delete from by_score_log b where b.by_apply_id=?");
+		this.updateBySql(sql.toString(),by_apply_id);
+	}
+	
+	public void addByScoreLogByApplyId(Integer by_apply_id) {	
+		StringBuffer sql = new StringBuffer();
+		sql.append("insert into  by_score_log  select * from  by_score a where a.by_apply_id=?");
+		this.updateBySql(sql.toString(),by_apply_id);
+	}
+	
+	public void deleteByScore(Integer by_apply_id,Integer course_id) {	
+		StringBuffer sql = new StringBuffer();
+		sql.append("delete from by_score b where b.by_apply_id=? and b.course_id=?");
+		this.updateBySql(sql.toString(),by_apply_id,course_id);
+	}
+	
+	
+	/**
+	 * 删除重复成绩,保留最大成绩(最大成绩有可能有多条记录)
+	 * @param by_apply_id
+	 */
+	public void distinctByScore(Integer by_apply_id) {	
+		StringBuffer sql = new StringBuffer();
+		sql.append("DELETE from by_score b WHERE b.status=1 and b.by_apply_id=? and (b.old_course_code) IN ( SELECT s.old_course_code FROM by_score s where s.status=1 and s.by_apply_id=? GROUP BY old_course_code HAVING COUNT(1) > 1) AND (b.old_course_code,b.score) NOT IN (SELECT bs.old_course_code,max(bs.score) FROM by_score bs where bs.status=1 and bs.by_apply_id=? GROUP BY bs.old_course_code HAVING COUNT(1) > 1)");
+		this.updateBySql(sql.toString(),by_apply_id,by_apply_id,by_apply_id);
+	}
+	
+	/**
+	 * 最大成绩有可能有多条记录时,删除重复成绩,保留统考成绩
+	 * @param by_apply_id
+	 */
+	public void distinctByScoreForUnified(Integer by_apply_id) {	
+		StringBuffer sql = new StringBuffer();
+		sql.append("DELETE from by_score b WHERE b.status=1 and b.score_type<>5 and b.by_apply_id=? and (b.old_course_code) IN ( SELECT s.old_course_code FROM by_score s where s.status=1 and s.by_apply_id=? GROUP BY old_course_code HAVING COUNT(1) > 1) and exists (select * from by_score bs where bs.status=1 and bs.by_apply_id=? and bs.score_type=5 and bs.course_id=b.course_id)");
+		this.updateBySql(sql.toString(),by_apply_id,by_apply_id,by_apply_id);
+	}
+	
+	/**
+	 * 最大成绩有可能有多条记录时,且不包括统考成绩,删除重复成绩,保留一条成绩
+	 * @param by_apply_id
+	 */
+	public void distinctByScoreOneLeft(Integer by_apply_id) {	
+		StringBuffer sql = new StringBuffer();
+		sql.append("DELETE from by_score b WHERE b.status=1 and b.by_apply_id=? and (b.old_course_code) IN ( SELECT s.old_course_code FROM by_score s where s.status=1 and s.by_apply_id=? GROUP BY old_course_code HAVING COUNT(1) > 1) AND ROWID NOT IN ( SELECT MIN(ROWID) FROM by_score s where s.status=1 and s.by_apply_id=? GROUP BY old_course_code HAVING COUNT(1) > 1)");
+		this.updateBySql(sql.toString(),by_apply_id,by_apply_id,by_apply_id);
+	}
+	
+	
+	public List<Map<String,Object>> queryByScore(Integer by_apply_id, Integer major_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select b.id,b.course_id,");
+		sql.append("        b.course_nature,");
+		sql.append("        b.course_score,");
+		sql.append("        decode(b.score_type,6,b.course_code||'('||b.old_course_code||')',7,b.course_code||'('||b.old_course_code||')',8,b.course_code||'('||b.old_course_code||')',b.old_course_code) course_code,");
+		sql.append("        b.course_code course_code_temp,");
+		sql.append("        b.course_name,");
+		sql.append("        b.score origin_score,");
+		sql.append("        b.score_id detail_id,");
+		sql.append("        b.id byscore_id,");
+		sql.append("        b.score final_score,");
+		sql.append("        decode(b.score, null, '0', '1') is_passed,");
+		sql.append("        b.score_source,");
+		sql.append("        b.score_type,");
+		sql.append("        b.asso_ticket_no,");
+		sql.append("        b.old_course_id,b.old_course_code,");
+		sql.append("        (select o.org_name from cf_organization o where o.id=b.school_id) org_name,");
+		sql.append("        (select m.major_code||'-'||m.major_name from pl_major m where m.id=b.major_id) major_name,");
+		sql.append("        decode((select count(1) from by_turn_out_score o where o.score_id=b.score_id and exists (select * from by_turn_out_apply ap where ap.id=o.apply_id and ap.status=6)),0,'','成绩已转出') remark ");
+		sql.append("   from by_score b");
+		sql.append("  where b.by_apply_id = ?");
+		sql.append("  order by decode(b.course_nature,1,1,2,2,3,3,4,5,5,4), b.old_course_code,b.course_code,b.score desc");
+		return this.listMapBySql(sql.toString(), by_apply_id);
+	}
+	
+}

+ 58 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTimeConfigDao.java

@@ -0,0 +1,58 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByTimeConfig;
+
+/**
+ * 毕业时间配置表 数据库处理.
+ * 
+ * @author: zhanqiang
+ * @date: 2019-03-14 13:39:18
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByTimeConfigDao extends PlatformDaoSupport<ByTimeConfig> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from by_time_config ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+
+	public ByTimeConfig get(Integer exam_time_id, Integer student_type) {
+		String sql = "select * from by_time_config where exam_time_id=? and student_type=?";
+		return this.findBySql(sql, exam_time_id, student_type);
+	}
+	
+	public ByTimeConfig getDataBaseTime() {
+		String sql = "select sysdate apply_start_time,sysdate by_date from dual";
+		return this.findBySql(sql);
+	}
+	
+	public List<ByTimeConfig> queryByTimeExamTimeId(Integer exam_time_id) {
+		String sql = "select a.*,(case when sysdate>=a.apply_start_time and sysdate<=a.apply_end_time then 'green' else 'black' end) color,t.exam_year||'年'||decode(t.exam_month, 4,'06',10,'12',t.exam_month)||'月' year_code from by_time_config a,pl_exam_time t where t.id=a.exam_time_id and a.student_type=1 and a.exam_time_id=?";
+		return this.listBySql(sql, exam_time_id);
+	}
+}

+ 89 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTurnInApplyDao.java

@@ -0,0 +1,89 @@
+package cn.hmsoft.ses.data.dao.by;
+
+
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.constants.ByConst.TurnTimeType;
+import cn.hmsoft.ses.data.model.by.ByTurnInApply;
+
+/**
+ * 外省考生转入表 参照了湖北的表:EG_T_KSZK 数据库处理.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:15
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByTurnInApplyDao extends PlatformDaoSupport<ByTurnInApply> {
+
+
+	/**
+	 * @param std_reg_id:考生ID
+	 * @return 返回
+	 */
+	public List<ByTurnInApply> listTurninApply(Integer std_reg_id) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("  select a.*,                                                ");
+		sb.append("         p.province_name,                                     ");
+		sb.append("         t.year || case                                       ");
+		sb.append("           when t.time = ? then                               ");
+		sb.append("            '上半年'                                          ");
+		sb.append("           when t.time = ? then                               ");
+		sb.append("            '下半年'                                          ");
+		sb.append("           else                                               ");
+		sb.append("            ''                                                ");
+		sb.append("         end year_time                                        ");
+		sb.append("    from by_turn_in_apply a                                   ");
+		sb.append("    left join frame_region_province p                         ");
+		sb.append("      on a.zk_out_ssdm = p.province_id                        ");
+		sb.append("    left join by_turn_time_config t                           ");
+		sb.append("      on a.time_config_id = t.id                              ");
+		sb.append("      where a.std_reg_id = ?                                  ");
+		sb.append("      order by t.year desc, t.time desc                       ");
+		return this.listBySql(sb.toString(), TurnTimeType.FIRST_HALF_YEAR.ordinal(),
+				TurnTimeType.SECOND_HALF_YEAR.ordinal(), std_reg_id);
+	}
+
+	/**
+	 * @param apply
+	 * @return 申请之前,先判断准考信息是否存在
+	 */
+	public ByTurnInApply findTurnInApply(ByTurnInApply apply) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("  select *                          ");
+		sb.append("    from by_turn_in_apply t         ");
+		sb.append("   where t.ks_xm = ?                ");
+		sb.append("     and t.ks_sfz = ?               ");
+		sb.append("     and t.zk_in_zkz = ?            ");
+		sb.append("     and t.ks_zkz = ?               ");
+		return this.findBySql(sb.toString(), apply.getKs_xm(), apply.getKs_sfz(), apply.getZk_in_zkz(),
+				apply.getKs_zkz());
+	}
+	
+	/**
+	 * @param apply
+	 * @return 申请之前,先判断准考信息是否存在
+	 */
+	public ByTurnInApply findTurnInApplyBySfz(ByTurnInApply apply) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("  select t.* from by_turn_in_apply t where t.ks_sfz=? order by t.time_config_id desc  ");
+		
+		return this.findBySql(sb.toString(), apply.getKs_sfz());
+	}
+
+		/**
+	 * @param in_ticket_no:省外转省内,外省准考证号
+	 * @return  查询
+	 */
+	public List<Map<String,Object>>  listTurnInOld(String in_ticket_no) {
+		StringBuffer sb = new StringBuffer();
+		sb.append(" select z.* from gxzk.kj_zhuankaozhuanru z  where z.zhunkaozhenghao = ?");
+		sb.append("   order by z.shoudaoshijian  desc                                     ");
+		return this.listMapBySql(sb.toString(), in_ticket_no);
+	}
+}

+ 67 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTurnInScoreDao.java

@@ -0,0 +1,67 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByTurnInScore;
+
+/**
+ * 外省考生转入成绩表 湖北表:EG_T_KSCJ 数据库处理.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:15
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByTurnInScoreDao extends PlatformDaoSupport<ByTurnInScore> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from by_turn_in_score ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+
+	public List<ByTurnInScore> listTurnInScore(String out_ticket_no, Integer time_config_id) {
+		String sql = "select * from by_turn_in_score t where t.ks_zkz = ? and t.time_config_id = ?";
+		return this.listBySql(sql, out_ticket_no, time_config_id);
+	}
+	
+	
+	/**
+	 * @param std_reg_id:考生ID
+	 * @return  查找转入在1年之内的成绩
+	 */
+	public List<ByTurnInScore> listTurnInScore(Integer std_reg_id) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("  select sc.kc_dm, sc.kc_mc, sc.bk_cj                            ");
+		sb.append("    from by_turn_in_apply app, by_turn_in_score sc               ");
+		sb.append("   where app.ks_zkz = sc.ks_zkz                                  ");
+		sb.append("     and app.std_reg_id = ?                                      ");
+		sb.append("     and sysdate <= ADD_MONTHS(app.turn_in_time, 12)             ");
+		return this.listBySql(sb.toString(), std_reg_id);
+	}
+	
+	
+	
+	
+}

+ 131 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTurnOutApplyDao.java

@@ -0,0 +1,131 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.constants.ByConst.TurnTimeType;
+import cn.hmsoft.ses.data.model.by.ByTurnOutApply;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 本省考生转考申请表 省内转省外---kj_zhuanchushengqing 数据库处理.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:13
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByTurnOutApplyDao extends PlatformDaoSupport<ByTurnOutApply> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from by_turn_out_apply ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+
+	/**
+	 * @param std_reg_id:考生ID
+	 * @return 返回考生申请转考列表
+	 */
+	public List<ByTurnOutApply> listTurnoutApply(Integer std_reg_id) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("  select o.*,                                          ");
+		//sb.append("         m.major_name,                                 ");
+		sb.append("         p.province_name,                              ");
+		sb.append("         t.year || case                                ");
+		sb.append("           when t.time = ? then                        ");
+		sb.append("            '上半年'                                   ");
+		sb.append("           when t.time = ? then                        ");
+		sb.append("            '下半年'                                   ");
+		sb.append("           else                                        ");
+		sb.append("            ''                                         ");
+		sb.append("         end batch,                                     ");
+		sb.append("         (select count(1) from by_turn_out_score a where a.apply_id=o.id)||'' score_count ");
+		sb.append("    from by_turn_out_apply o                           ");
+		sb.append("    left join pl_major m                               ");
+		sb.append("      on o.major_id = m.id                             ");
+		sb.append("    left join frame_region_province p                  ");
+		sb.append("      on o.in_prov_code = p.province_id                ");
+		sb.append("    left join by_turn_time_config t                    ");
+		sb.append("      on o.time_config_id = t.id                       ");
+		sb.append("   where o.std_reg_id = ?                              ");
+		sb.append("   order by  o.apply_time desc                           ");
+		return this.listBySql(sb.toString(), TurnTimeType.FIRST_HALF_YEAR.ordinal(),
+				TurnTimeType.SECOND_HALF_YEAR.ordinal(), std_reg_id);
+	}
+	
+	/**
+	 * @param apply
+	 * @return 重复判断:只要申请过,就不在让其重新申请
+	 */
+	public ByTurnOutApply findTurnOutApply(ByTurnOutApply apply, Integer time_config_id) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("  select *                         ");
+		sb.append("    from by_turn_out_apply         ");
+		sb.append("   where   std_reg_id = ?          ");
+		sb.append("     and time_config_id = ?        ");
+//		sb.append("     and major_id = ?              ");
+//		sb.append("     and in_prov_code = ?          ");
+		return this.findBySql(sb.toString(),  apply.getStd_reg_id(), time_config_id);
+	}
+	
+	/**
+	 * @param apply
+	 * @return 重复判断:只要历史批次成功转出外省,就不在让其重新申请
+	 */
+	public ByTurnOutApply findTurnOutApplyForTrunOut(ByTurnOutApply apply) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("  select *                         ");
+		sb.append("    from by_turn_out_apply         ");
+		sb.append("   where   std_reg_id = ?          ");
+		sb.append("     and status = 6        ");
+//		sb.append("     and major_id = ?              ");
+//		sb.append("     and in_prov_code = ?          ");
+		return this.findBySql(sb.toString(),  apply.getStd_reg_id());
+	}
+	
+	public void addTurnOutScore(ByTurnOutApply apply){
+		StringBuffer sb = new StringBuffer();
+		sb.append("insert into by_turn_out_score(id,std_reg_id,ticket_no,major_id,course_id,course_code,score,time_config_id,exam_date,score_id,apply_id)");
+		sb.append("  select SEQ_by_turn_out_score.Nextval id,");
+		sb.append("         r.id std_reg_id,");
+		sb.append("         r.ticket_no, ? major_id,");
+		sb.append("         c.id course_id,");
+		sb.append("         c.course_code,");
+		sb.append("         s.final_score,");
+		sb.append("         ? time_config_id,");
+		sb.append("         s.year_code,s.id score_id,? apply_id");
+		sb.append("    from kj_unified_score_detail s, std_reg_info r, pl_course c");
+		sb.append("   where s.std_reg_id = r.id");
+		sb.append("     and s.course_id = c.id");
+		sb.append("     and s.final_score >= 60");
+		sb.append("     and s.final_score <= 100");
+		sb.append("     and s.score_source != 5");
+		sb.append("     and s.std_reg_id = ?");
+		sb.append("     and (s.status is null or s.status != 2)");
+		sb.append("     and not exists (select * from by_turn_out_apply ba, by_turn_out_score bs where ba.id=bs.apply_id and ba.status=6 and ba.std_reg_id=r.id and bs.score_id=s.id)");
+		this.updateBySql(sb.toString(),apply.getMajor_id(),apply.getTime_config_id(),apply.getId(),apply.getStd_reg_id());
+	}
+	public void deleteTurnOutScore(ByTurnOutApply apply){
+		this.updateBySql("delete from by_turn_out_score a where a.std_reg_id=? and a.time_config_id=?",apply.getStd_reg_id(),apply.getTime_config_id());
+	}
+	
+	public ByTurnOutApply getDataBaseTime() {
+		String sql = "select sysdate apply_time from dual";
+		return this.findBySql(sql);
+	}
+	
+}

+ 40 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTurnOutScoreDao.java

@@ -0,0 +1,40 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByTrunOutScore;
+
+/**
+ * 本省考生转出成绩表 记录本省考生转出的统考成绩 数据库处理.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:14
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByTurnOutScoreDao extends PlatformDaoSupport<ByTrunOutScore> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from by_trun_out_score ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+}

+ 45 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTurnTimeConfigDao.java

@@ -0,0 +1,45 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import java.time.LocalDate;
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByTurnTimeConfig;
+
+/**
+ * 转考时间配置表 数据库处理.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-01-07 16:16:13
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByTurnTimeConfigDao extends PlatformDaoSupport<ByTurnTimeConfig> {
+
+	/**
+	 * @param turn_type:转考类型
+	 * @param time:时间类型(上半年和下半年)
+	 * @param status:状态(启用、禁用)
+	 * @return
+	 */
+	public ByTurnTimeConfig findTimeConfig(Integer turn_type, Integer time, Integer status) {
+		String sql = "select * from by_turn_time_config where year = ? and time = ? and type = ? and status = ? ";
+		return this.findBySql(sql, LocalDate.now().getYear(), time, turn_type, status);
+	}
+	
+	public List<ByTurnTimeConfig> queryTurnTimeByYear(String year,Integer time) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("select a.*,(case when sysdate>=a.start_time and sysdate<=a.end_time then 'green' else 'black' end) color from by_turn_time_config a where a.status=1 and a.year=? and time=? order by decode(a.type,2,1,4,2,3,3,5,5)");
+		
+		return this.listBySql(sb.toString(), year,time);
+	}
+	
+	public ByTurnTimeConfig getDataBaseTime() {
+		String sql = "select sysdate start_time from dual";
+		return this.findBySql(sql);
+	}
+
+}

+ 84 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByTurnTimePlaceDao.java

@@ -0,0 +1,84 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByTurnTimePlace;
+
+/**
+ * 转考递交材料地点设置 考生转考递交材料的地点和时间设置 数据库处理.
+ * 
+ * @author: haoguanghui
+ * @date: 2019-03-12 20:10:29
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class ByTurnTimePlaceDao extends PlatformDaoSupport<ByTurnTimePlace> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from by_turn_time_place ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+
+	/**
+	 * @param org_id:机构ID
+	 * @param type:转考类型
+	 * @return 根据机构ID查询递交材料信息
+	 */
+	public ByTurnTimePlace findTurntimePlace(Integer org_id, Integer type) {
+		String sql = "select * from by_turn_time_place where org_id = ? and type = ? ";
+		return this.findBySql(sql, org_id, type);
+	}
+
+	/**
+	 * @param type:转考类型
+	 * @param org_type:机构类型
+	 * @return 根据转考类型 和  机构类型 查询机构递交材料列表
+	 */
+	public List<ByTurnTimePlace> listTurnTimePlace(Integer type, Integer org_type) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("  select c.org_name, p.*                               ");
+		sb.append("    from by_turn_time_place p, cf_organization c       ");
+		sb.append("   where p.org_id = c.id                               ");
+		sb.append("     and p.type = ?                                    ");
+		sb.append("     and c.org_type = ?                                ");
+		return this.listBySql(sb.toString(), type, org_type);
+	}
+	
+	/**
+	 * @param type:转考类型
+	 * @param school_id:考生报考的主考学校
+	 * @return 根据转考类型 和  机构类型 查询机构递交材料列表
+	 */
+	public List<ByTurnTimePlace> listTurnTimePlaceBySchool(Integer type, Integer school_id) {
+		StringBuffer sb = new StringBuffer();
+		sb.append("  select c.org_name, p.*                               ");
+		sb.append("    from by_turn_time_place p, cf_organization c       ");
+		sb.append("   where p.org_id = c.id                               ");
+		sb.append("     and p.type = ?                                    ");
+		sb.append("     and p.org_id = ?                                  ");
+		return this.listBySql(sb.toString(), type, school_id);
+	}
+	
+}

+ 38 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByXueXinDao.java

@@ -0,0 +1,38 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByXueXin;
+import cn.hmsoft.ses.data.model.pl.PlStdRecord;
+
+@Repository
+public class ByXueXinDao extends PlatformDaoSupport<ByXueXin> {
+
+	public List<ByXueXin> queryByXueXinByStdRegId(Integer std_reg_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from BY_xuexin b where b.std_reg_id=? order by b.create_date desc");
+		return this.listBySql(sql.toString(), std_reg_id);
+	}
+	
+	public ByXueXin queryByXueXinByBizSerialNum(String bizSerialNum){
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from BY_xuexin b where b.bizSerialNum=?");
+		return this.findBySql(sql.toString(), bizSerialNum);
+	}
+	
+	public ByXueXin queryEdu(Integer std_reg_id,String type){
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from by_xuexin x where x.std_reg_id=? and x.xuexin_type=? and x.status='认证成功' and x.create_date>=sysdate-90 order by x.create_date desc");
+		return this.findBySql(sql.toString(), std_reg_id,type);
+	}
+	
+	public ByXueXin queryEduForBy(Integer std_reg_id){
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from by_xuexin x where x.std_reg_id=? and x.xuexin_type='学历' and x.status='认证成功' order by x.create_date desc");
+		return this.findBySql(sql.toString(), std_reg_id);
+	}
+	
+}

+ 32 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/ByXueXinLogDao.java

@@ -0,0 +1,32 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.ByXueXinLog;
+
+@Repository
+public class ByXueXinLogDao extends PlatformDaoSupport<ByXueXinLog> {
+
+	public List<ByXueXinLog> queryByXueXinByStdRegId(Integer std_reg_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from BY_xuexin_log b where b.std_reg_id=? order by b.create_date desc");
+		return this.listBySql(sql.toString(), std_reg_id);
+	}
+
+	public ByXueXinLog queryByXueXinByBizSerialNum(String bizSerialNum) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select * from BY_xuexin_log b where b.bizSerialNum=?");
+		return this.findBySql(sql.toString(), bizSerialNum);
+	}
+
+	public ByXueXinLog queryEdu(Integer std_reg_id, String type) {
+		StringBuilder sql = new StringBuilder();
+		sql.append(
+				"select * from BY_xuexin_log x where x.std_reg_id=? and x.xuexin_type=? and x.status='认证成功' and x.create_date>=sysdate-90 order by x.create_date desc");
+		return this.findBySql(sql.toString(), std_reg_id, type);
+	}
+
+}

+ 249 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/by/PaperScoreDao.java

@@ -0,0 +1,249 @@
+package cn.hmsoft.ses.data.dao.by;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.by.PaperScore;
+
+@Repository
+public class PaperScoreDao extends PlatformDaoSupport<PaperScore> {
+
+	public void addByScoreFromeUnifiedScore(PaperScore paperScore) {
+		StringBuffer sql = new StringBuffer();
+		sql.append("insert into PAPER_SCORE");
+		sql.append("(");
+		sql.append("  id             ,");
+		sql.append("  paper_apply_id    ,");
+		sql.append("  std_reg_id     ,");
+		sql.append("  year_code       ,");
+		sql.append("  major_id       ,");
+		sql.append("  course_id      ,");
+		sql.append("  course_code    ,");
+		sql.append("  course_name    ,");
+		sql.append("  course_nature    ,");
+		sql.append("  course_score    ,");
+		sql.append("  score          ,");
+		sql.append("  score_type     ,");
+		sql.append("  score_source   ,");
+		sql.append("  status         ,");
+		sql.append("  SCORE_ID       ,");
+		sql.append("  school_id      ,");
+		sql.append("  paper_title    ,");
+		sql.append("  old_course_id      ,");
+		sql.append("  old_course_code    ,");
+		sql.append("  asso_ticket_no ,");
+		sql.append("  create_oper    ,");
+		sql.append("  create_date    ");
+		sql.append(")");
+		sql.append("select ");
+		sql.append(" SEQ_PAPER_SCORE.nextval  id,");
+		sql.append("  ? paper_apply_id    ,");
+		sql.append("  ? std_reg_id     ,");
+		sql.append("  d.year_code       ,");
+		sql.append("  d.major_id       ,");
+		sql.append("  d.course_id      ,");
+		sql.append("  c.course_code   ,");
+		sql.append("  c.course_name    ,");
+		sql.append(
+				"  (select course_nature from pl_major_course mc where mc.major_id=? and mc.course_id=c.id and rownum=1)course_nature    ,");
+		sql.append("  c.course_score    ,");
+		sql.append("  decode(d.score_source,5,'免考',d.final_score) score,");
+		sql.append("  5 score_type    ,");
+		sql.append("  d.score_source   ,");
+		sql.append("  1 status         ,");
+		sql.append("  d.id SCORE_ID       ,");
+		sql.append("  null school_id     ,");
+		sql.append("  '' paper_title    ,");
+		sql.append("  d.course_id old_course_id     ,");
+		sql.append("  c.course_code old_course_code  ,");
+		sql.append("  '' asso_ticket_no ,");
+		sql.append("  ? create_oper    ,");
+		sql.append("  sysdate     ");
+		sql.append(
+				"from kj_unified_score_detail d,pl_course c where c.id=d.course_id and d.std_reg_id=? and d.status in(1,2) and d.final_score>=60 ");
+		sql.append(
+				" and exists (select * from pl_major_course mc,by_paper_apply b where b.major_id=mc.major_id and mc.course_id=c.id and b.id=?) ");
+
+		this.updateBySql(sql.toString(), paperScore.getPaper_apply_id(), paperScore.getStd_reg_id(),
+				paperScore.getMajor_id(), paperScore.getStd_reg_id(), paperScore.getStd_reg_id(),
+				paperScore.getPaper_apply_id());
+	}
+
+	public void addByScoreFromeCollegeScore(PaperScore paperScore) {
+		StringBuffer sql = new StringBuffer();
+
+		sql.append("insert into PAPER_SCORE");
+		sql.append("(");
+		sql.append("  id             ,");
+		sql.append("  paper_apply_id    ,");
+		sql.append("  std_reg_id     ,");
+		sql.append("  year_code       ,");
+		sql.append("  major_id       ,");
+		sql.append("  course_id      ,");
+		sql.append("  course_code    ,");
+		sql.append("  course_name    ,");
+		sql.append("  course_nature    ,");
+		sql.append("  course_score    ,");
+		sql.append("  score          ,");
+		sql.append("  score_type     ,");
+		sql.append("  score_source   ,");
+		sql.append("  status         ,");
+		sql.append("  SCORE_ID       ,");
+		sql.append("  school_id      ,");
+		sql.append("  paper_title    ,");
+		sql.append("  old_course_id      ,");
+		sql.append("  old_course_code    ,");
+		sql.append("  asso_ticket_no ,");
+		sql.append("  create_oper    ,");
+		sql.append("  create_date    ");
+		sql.append(")");
+		sql.append("select ");
+		sql.append(" SEQ_PAPER_SCORE.nextval  id           ,");
+		sql.append("  ? paper_apply_id    ,");
+		sql.append("  ? std_reg_id     ,");
+		sql.append("  b.year_code       ,");
+		sql.append("  b.major_id       ,");
+		sql.append("  b.course_id      ,");
+		sql.append(
+				"  decode(b.score_type,4,nvl((select c.course_code from pl_major_course mc,pl_course c where c.id=mc.course_id and mc.major_id=? and mc.course_nature=4 and rownum=1),'08738'),(select course_code from pl_course c where c.id=b.course_id)) course_code   ,");
+		sql.append(
+				"  decode(b.score_type,4,nvl((select c.course_name from pl_major_course mc,pl_course c where c.id=mc.course_id and mc.major_id=? and mc.course_nature=4 and rownum=1),'毕业论文并答辩'),(select course_name from pl_course c where c.id=b.course_id)) course_name   ,");
+		sql.append(
+				"  decode(b.score_type,4,4,(select course_nature from pl_major_course mc where mc.major_id=? and mc.course_id=b.course_id and rownum=1)) course_nature   ,");
+		sql.append(
+				"  decode(b.score_type,4,nvl((select c.course_score from pl_major_course mc,pl_course c where c.id=mc.course_id and mc.major_id=? and mc.course_nature=4 and rownum=1),'0.00'),(select course_score from pl_course c where c.id=b.course_id)) course_score   ,");
+		sql.append("  b.score        ,");
+		sql.append("  b.score_type    ,");
+		sql.append("  b.score_source   ,");
+		sql.append("  1 status         ,");
+		sql.append("  b.SCORE_ID       ,");
+		sql.append("  b.school_id     ,");
+		sql.append("  b.paper_title    ,");
+		sql.append("  b.course_id old_course_id     ,");
+		sql.append(
+				"  decode(b.score_type,4,nvl((select c.course_code from pl_major_course mc,pl_course c where c.id=mc.course_id and mc.major_id=? and mc.course_nature=4 and rownum=1),'08738'),(select course_code from pl_course c where c.id=b.course_id)) old_course_code   ,");
+		sql.append("  '' asso_ticket_no ,");
+		sql.append("  ? create_oper    ,");
+		sql.append("  sysdate     ");
+		sql.append("from ");
+		sql.append("(");
+		sql.append(" select ");
+		sql.append("  d.year_code       ,");
+		sql.append("  d.major_id       ,");
+		sql.append("  d.course_id      ,");
+		sql.append("  ''||round(d.score) score         ,");
+		sql.append("  d.score_type    ,");
+		sql.append("  d.score_source   ,");
+		sql.append("  d.id SCORE_ID       ,");
+		sql.append("  d.school_id     ,");
+		sql.append("  '' paper_title    ");
+		sql.append(
+				" from kj_college_score_detail d where d.std_reg_id=? and d.score_source in (7,8,9) and d.score>=60");
+		sql.append(
+				" and exists (select * from pl_major_course mc,by_paper_apply app where app.major_id=mc.major_id and mc.course_id=d.course_id and app.id=?) ");
+		sql.append(" union all ");
+		sql.append(" select ");
+		sql.append("  d.year_code       ,");
+		sql.append("  d.major_id       ,");
+		sql.append("  d.course_id      ,");
+		sql.append(
+				"  ''||nvl((select fd.dict_text from frame_dict fd where fd.dict_name in('ScoreLevel','score_flag') and fd.dict_value=d.score and rownum=1),round(d.score)) score         ,");
+		sql.append("  d.score_type    ,");
+		sql.append("  d.score_source   ,");
+		sql.append("  d.id SCORE_ID       ,");
+		sql.append("  d.school_id     ,");
+		sql.append("  '' paper_title  ");
+		sql.append(
+				"from kj_college_score_detail d where d.std_reg_id=? and d.score_source=0 and d.score_type in(0,3) and d.status=3 and (d.score>=60 or (d.score>=0 and d.score in(select fd.dict_value from frame_dict fd where fd.dict_name in('ScoreLevel','score_flag'))))");
+		sql.append(
+				" and exists (select * from pl_major_course mc,by_paper_apply app where app.major_id=mc.major_id and mc.course_id=d.course_id and app.id=?) ");
+		sql.append(" union all ");
+		sql.append(" select");
+		sql.append("  d.year_code       ,");
+		sql.append("  d.major_id       ,");
+		sql.append("  d.course_id      ,");
+		sql.append(
+				"  ''||nvl((select fd.dict_text from frame_dict fd where fd.dict_name in('PaperScoreLevel','score_flag') and fd.dict_value=d.score and rownum=1),round(d.score)) score         ,");
+		sql.append("  d.score_type    ,");
+		sql.append("  d.score_source   ,");
+		sql.append("  d.id SCORE_ID       ,");
+		sql.append("  d.school_id     ,");
+		sql.append("  d.paper_title  ");
+		sql.append(
+				"from kj_college_score_detail d where d.std_reg_id=? and d.score_source =0 and d.score_type=4 and d.status=3 and (d.score>=60 or (d.score in(1,2,3,4,201,202,203,204)))");
+		sql.append("  and exists (select * from pl_major m where m.id=? and m.major_level=1)    ");
+		sql.append(") b");
+
+		this.updateBySql(sql.toString(), paperScore.getPaper_apply_id(), paperScore.getStd_reg_id(),
+				paperScore.getMajor_id(), paperScore.getMajor_id(), paperScore.getMajor_id(), paperScore.getMajor_id(),
+				paperScore.getMajor_id(), paperScore.getStd_reg_id(), paperScore.getStd_reg_id(),
+				paperScore.getPaper_apply_id(), paperScore.getStd_reg_id(), paperScore.getPaper_apply_id(),
+				paperScore.getStd_reg_id(), paperScore.getMajor_id());
+	}
+
+	public void addByScoreForMajorCourse(PaperScore paperScore) {
+		StringBuffer sql = new StringBuffer();
+		sql.append("insert into PAPER_SCORE");
+		sql.append("    (");
+		sql.append("      id             ,");
+		sql.append("      paper_apply_id    ,");
+		sql.append("      std_reg_id     ,");
+		sql.append("      year_code       ,");
+		sql.append("      major_id       ,");
+		sql.append("      course_id      ,");
+		sql.append("      course_code    ,");
+		sql.append("      course_name    ,");
+		sql.append("      course_nature    ,");
+		sql.append("      course_score    ,");
+		sql.append("      score          ,");
+		sql.append("      score_type     ,");
+		sql.append("      score_source   ,");
+		sql.append("      status         ,");
+		sql.append("      SCORE_ID       ,");
+		sql.append("      school_id      ,");
+		sql.append("      paper_title    ,");
+		sql.append("      old_course_id ,");
+		sql.append("      old_course_code ,");
+		sql.append("      asso_ticket_no ,");
+		sql.append("      create_oper    ,");
+		sql.append("      create_date    ");
+		sql.append("    )");
+		sql.append("    select ");
+		sql.append("     SEQ_PAPER_SCORE.nextval  id,");
+		sql.append("      ? paper_apply_id    ,");
+		sql.append("      ? std_reg_id     ,");
+		sql.append("      ? year_code       ,");
+		sql.append("      mc.major_id       ,");
+		sql.append("      c.id course_id      ,");
+		sql.append("      c.course_code   ,");
+		sql.append("      c.course_name    ,");
+		sql.append("      mc.course_nature    ,");
+		sql.append("      c.course_score    ,");
+		sql.append("      '' score,");
+		sql.append("      '' score_type    ,");
+		sql.append("      '' score_source   ,");
+		sql.append("      1 status         ,");
+		sql.append("      '' SCORE_ID       ,");
+		sql.append("      '' school_id     ,");
+		sql.append("      '' paper_title    ,");
+		sql.append("      c.id   old_course_id    ,");
+		sql.append("      c.course_code old_course_code  ,");
+		sql.append("      '' asso_ticket_no ,");
+		sql.append("      ? create_oper    ,");
+		sql.append("      sysdate     ");
+		sql.append("      from pl_major_course mc, pl_course c");
+		sql.append("      where mc.course_id = c.id");
+		sql.append("      and mc.major_id = ?");
+		sql.append(
+				"      and not exists (select * from PAPER_SCORE b  where b.old_course_code=c.course_code and b.paper_apply_id=?)  ");
+
+		this.updateBySql(sql.toString(), paperScore.getPaper_apply_id(), paperScore.getStd_reg_id(),
+				paperScore.getYear_code(), paperScore.getStd_reg_id(), paperScore.getMajor_id(),
+				paperScore.getPaper_apply_id());
+	}
+
+	public void deleteByScoreByApplyId(Integer byApplyId) {
+		this.delete("paper_apply_id", byApplyId);
+	}
+
+}

+ 42 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/cf/CfCityDao.java

@@ -0,0 +1,42 @@
+package cn.hmsoft.ses.data.dao.cf;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.data.model.cf.CfCity;
+
+/**
+ * 地市字典表 老系统表数据中对应的地市代号 数据库处理.
+ * 
+ * @author: haoguanghui
+ * @date: 2018-12-15 16:32:01
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class CfCityDao extends PlatformDaoSupport<CfCity> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from cf_city ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+	
+	public List<CfCity> listCity() {
+		String sql = "select * from cf_city ";
+		return this.listBySql(sql);
+	}
+}

+ 40 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/cf/CfFeeScaleDao.java

@@ -0,0 +1,40 @@
+package cn.hmsoft.ses.data.dao.cf;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.cf.CfFeeScale;
+
+/**
+ * 收费标准 指定每个类型收费的金额 数据库处理.
+ * 
+ * @author: haoguanghui
+ * @date: 2018-11-15 16:28:26
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class CfFeeScaleDao extends PlatformDaoSupport<CfFeeScale> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from cf_fee_scale where 1=1 ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			String value = generateLikeParamter(query);
+			sql += " and (fee_item_code like ? or fee_item_name like ?)";
+			return this.pageMapBySql(queryOrder, start, limit, sql, value, value);
+		}
+	}
+
+	public CfFeeScale getFeeScale(String fee_item_code) {
+		String sql = "select * from cf_fee_scale where fee_item_code= ? ";
+		return this.findBySql(sql, fee_item_code);
+	}
+}

+ 71 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/cf/CfOperateTimeDao.java

@@ -0,0 +1,71 @@
+package cn.hmsoft.ses.data.dao.cf;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.data.model.cf.CfOperateTime;
+
+/**
+ *  数据库处理.
+ * 
+ * @author: 
+ * @date: 2018-11-13 17:30:39
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class CfOperateTimeDao extends PlatformDaoSupport<CfOperateTime> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from CF_OPERATE_TIME ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+
+	public List<CfOperateTime> getOperateTimeByType(Integer oper_type, Integer exam_time_id) {
+		String sql = "select * from cf_operate_time where oper_type=? and exam_time_id= ? ";
+		return this.listBySql(sql, oper_type, exam_time_id);
+	}
+
+	public List<CfOperateTime> listOperateTime(Integer org_type, Integer exam_time_id) {
+		String sql = "select * from cf_operate_time where oper_type = ? and exam_time_id = ? and sysdate>=start_time and sysdate<=end_time ";
+		return this.listBySql(sql, org_type, exam_time_id);
+	}
+	
+	public List<CfOperateTime> listOperateTimeForYearCode(Integer org_type, String year_code) {
+		String sql = " select f.*,to_char(t.exam_year) exam_year,to_char(t.exam_month) exam_month from CF_OPERATE_TIME f,pl_exam_time t where t.id=f.exam_time_id and f.oper_type=? and t.year_code=? and sysdate>=f.start_time and sysdate<=f.end_time ";
+		return this.listBySql(sql, org_type, year_code);
+	}
+	
+	public List<CfOperateTime> listOperateTimeByOperType(Integer oper_type) {
+		String sql = "select f.*,to_char(t.exam_year) exam_year,to_char(t.exam_month) exam_month from CF_OPERATE_TIME f,pl_exam_time t where t.id=f.exam_time_id and f.oper_type=? and sysdate>=f.start_time and sysdate<=f.end_time order by t.year_code desc ";
+		return this.listBySql(sql, oper_type);
+	}
+	
+	public List<CfOperateTime> queryOperateTimeByTypeByExamTimeId(Integer exam_time_id) {
+		String sql = "select a.*,d.dict_text oper_type_name,to_char(t.year_code) year_code,t.exam_year||'年'||t.exam_month||'月' exam_year,(case when sysdate>=a.start_time and sysdate<=a.end_time then 'green' else 'black' end) color,t.exam_year || '年' || decode(t.exam_month,'4','上半年','10','下半年', t.exam_month || '月') exam_month from cf_operate_time a,frame_dict d,pl_exam_time t where t.id=a.exam_time_id and d.dict_value=a.oper_type and d.dict_name='OPER_TYPE' and a.oper_type in(1,23,24) and a.exam_time_id=? order by d.dict_order ";
+		
+		return this.listBySql(sql, exam_time_id);
+	}
+
+	
+}

+ 49 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/cf/CfOrganizationDao.java

@@ -0,0 +1,49 @@
+package cn.hmsoft.ses.data.dao.cf;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.cf.CfOrganization;
+
+/**
+ * 机构表 包括:主考学校、助学机构、区考办、市考办、省考办 数据库处理.
+ * 
+ * @author: haoguanghui
+ * @date: 2018-10-18 14:13:22
+ * @version: 1.0
+ * @email: hgh@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class CfOrganizationDao extends PlatformDaoSupport<CfOrganization> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager pageCfOrganization(String query, Integer start, Integer limit, String order, String type) {
+		String sql = "select * from cf_organization ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(generateQueryOrder(order, type), start, limit, sql);
+		} else {
+			return this.pageMapBySql(generateQueryOrder(order, type), start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+	
+	public List<CfOrganization> examAreaList(String orgType) {
+		String sql = "select a.*, a.org_code||' | '||a.org_name full_name from cf_organization a where org_type=? order by org_code asc";
+		return this.listBySql(sql,orgType);
+	}
+	
+	
+}

+ 91 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/gxzk/CjJigechengjiOldDao.java

@@ -0,0 +1,91 @@
+package cn.hmsoft.ses.data.dao.gxzk;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Repository;
+import org.springframework.util.StringUtils;
+
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+import cn.hmsoft.ses.data.model.gxzk.CjJigechengjiOld;
+
+/**
+ *  数据库处理.
+ * 
+ * @author: yangwei
+ * @date: 2019-06-05 10:52:59
+ * @version: 1.0
+ * @email: yangwei@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class CjJigechengjiOldDao extends PlatformDaoSupport<CjJigechengjiOld> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from gxzk.cj_jigechengji_old ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));		
+		}
+	}
+	
+	public List<CjJigechengjiOld> listAll(String zhunkaozhenghao){
+		String sql = " select * from gxzk.cj_jigechengji_old where zhunkaozhenghao = ?";
+		return this.listBySql(sql, zhunkaozhenghao);
+		
+	}
+	public Pager pageCjJigechengjiOld(String query, Integer start, Integer limit, QueryOrder queryOrder,CjJigechengjiOld vo) {
+//		, s.kechengdaihao, s.chengji, s.nian, s.yue 
+		StringBuilder sql = new StringBuilder(" select t.*,r.status,ri.status std_status from (select distinct s.kaohao, s.zhunkaozhenghao, s.xingming, s.zhuanyedaihao from gxzk.cj_jigechengji_old s where 1=1  ");
+		List<Object> paraList = new ArrayList<Object>();
+		
+		if (!StringUtils.isEmpty(vo.getKaohao())) {
+			sql.append(" and s.kaohao = ?");
+			paraList.add(vo.getKaohao());
+		}
+		if (!StringUtils.isEmpty(vo.getZhunkaozhenghao())) {
+			sql.append(" and s.zhunkaozhenghao = ?");
+			paraList.add(vo.getZhunkaozhenghao());
+		}
+		if (!StringUtils.isEmpty(vo.getXingming())) {
+			sql.append(" and s.xingming = ?");
+			paraList.add(vo.getXingming());
+		}
+		sql.append(" ) t  left join hz_std_old_new r on t.zhunkaozhenghao = r.zhunkaozhenghao left join std_reg_info ri on ri.id = r.std_id ");
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(generateQueryOrder(null, null), start, limit, sql.toString(), paraList.toArray());
+		} else {
+			String value = generateLikeParamter(query);
+			sql.append(" where (t.zhunkaozhenghao like ? or t.xingming like ? or t.zhuanyedaihao like ?)");
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql.toString(), value, value, value);	
+		}
+		
+	}
+	
+	public CjJigechengjiOld checkOldTicketNo(String kaohao){
+		String sql = " select t.* from gxzk.cj_jigechengji_old t  where trim(t.kaohao) = ? or trim(t.jiukaohao) = ? ";
+		return this.findBySql(sql, kaohao,kaohao);
+	}
+
+	public List<Map<String, Object>> existScore(Integer std_id) {
+		String sql = " select 1 from kj_unified_score_detail where std_reg_id = ? union select 1 from kj_college_score_detail where std_reg_id = ? ";
+		return this.listMapBySql(sql, std_id,std_id);
+		
+	}
+}

+ 60 - 0
ses-enrol/src/main/java/cn/hmsoft/ses/data/dao/kj/KjByInputScoreDao.java

@@ -0,0 +1,60 @@
+package cn.hmsoft.ses.data.dao.kj;
+
+import cn.hmsoft.jdbc.entity.Pager;
+import cn.hmsoft.helper.StringHelper;
+import cn.hmsoft.jdbc.entity.QueryOrder;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.stereotype.Repository;
+import cn.hmsoft.jdbc.core.PlatformDaoSupport;
+import cn.hmsoft.ses.data.model.kj.KjByInputScore;
+
+/**
+ * 毕业手工录入成绩 数据库处理.
+ * 
+ * @author: zhanqiang
+ * @date: 2019-05-28 22:14:43
+ * @version: 1.0
+ * @email: zhanqiang@qmth.com.cn
+ * @Company: www.hmsoft.cn
+ */
+@Repository
+public class KjByInputScoreDao extends PlatformDaoSupport<KjByInputScore> {
+
+	/**
+	 * 构建QueryOrder(order,type)过滤.
+	 * @param query
+	 * @param start
+	 * @param limit
+	 * @param order
+	 * @param type
+	 * @return
+	 */
+	public Pager page(String query, Integer start, Integer limit, QueryOrder queryOrder) {
+		String sql = "select * from kj_by_input_score ";
+		if (StringHelper.isEmpty(query)) {
+			return this.pageMapBySql(queryOrder, start, limit, sql);
+		} else {
+			return this.pageMapBySql(queryOrder, start, limit,
+					sql + "where 1 like ?", generateLikeParamter(query));
+		}
+	}
+
+	public List<Map<String, Object>> getInputScoreList(Integer apply_id, Integer major_id,
+			Integer std_id) {
+		StringBuilder sql = new StringBuilder();
+		sql.append("select i.course_code,i.course_name,i.final_score origin_score,i.final_score, ");
+		sql.append("       Case when i.final_score>=60 then '合格'                                ");
+		sql.append("            when i.final_score<60  then '不合格'                               ");
+		sql.append("       Else '不合格' End is_passed,                                            ");
+		sql.append("	   i.use_type,											     		     ");
+		sql.append("	   i.score_source,i.old_course_id								         ");
+		sql.append("from kj_by_input_score i													 ");
+		sql.append("where i.by_apply_id=? and i.major_id=? and i.std_reg_id=?					 ");
+		return this.listMapBySql(sql.toString(), apply_id, major_id, std_id);
+	}
+
+}

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä