xiatian 2 лет назад
Родитель
Сommit
05239f45a1

+ 4 - 4
db/init.sql

@@ -54,8 +54,7 @@ CREATE TABLE `mps_exam` (
   `code` varchar(255) COLLATE utf8_bin DEFAULT NULL,
   `school_id` bigint NOT NULL,
   PRIMARY KEY (`id`),
-  UNIQUE KEY `IDX_EXAM_01` (`school_id`,`name`),
-  UNIQUE KEY `IDX_EXAM_02` (`school_id`,`code`)
+  UNIQUE KEY `IDX_EXAM_01` (`school_id`,`code`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
 
 -- ----------------------------
@@ -224,11 +223,12 @@ CREATE TABLE `mps_school` (
   `enable` bit(1) NOT NULL,
   `name` varchar(255) COLLATE utf8_bin NOT NULL,
   `code` varchar(255) COLLATE utf8_bin NOT NULL,
+  `access_key` varchar(255) COLLATE utf8_bin DEFAULT NULL,
+  `access_secret` varchar(255) COLLATE utf8_bin DEFAULT NULL,
   `region` varchar(255) COLLATE utf8_bin DEFAULT NULL,
   `telephone` varchar(255) COLLATE utf8_bin DEFAULT NULL,
   PRIMARY KEY (`id`),
-  UNIQUE KEY `IDX_SCHOOL_01` (`name`),
-  UNIQUE KEY `IDX_SCHOOL_02` (`code`)
+  UNIQUE KEY `IDX_SCHOOL_01` (`code`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
 
 -- ----------------------------

+ 11 - 0
src/main/java/cn/com/qmth/mps/controller/ExamController.java

@@ -1,5 +1,7 @@
 package cn.com.qmth.mps.controller;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -10,6 +12,7 @@ import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.core.collection.PageResult;
 
+import cn.com.qmth.mps.service.ExamService;
 import cn.com.qmth.mps.vo.exam.ExamDomain;
 import cn.com.qmth.mps.vo.exam.ExamQuery;
 import cn.com.qmth.mps.vo.exam.ExamVo;
@@ -21,6 +24,8 @@ import io.swagger.annotations.ApiOperation;
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/exam")
 @Aac(strict = BOOL.FALSE, auth = BOOL.TRUE)
 public class ExamController extends BaseController {
+	@Autowired
+	private ExamService examService;
 
     @ApiOperation(value = "新增/修改")
     @RequestMapping(value = "save", method = RequestMethod.POST)
@@ -45,4 +50,10 @@ public class ExamController extends BaseController {
         return null;
     }
     
+    @ApiOperation(value = "同步")
+    @PostMapping("sync")
+    public void sync(@RequestParam Long schoolId) {
+    	examService.syncExam(schoolId,getAccessUser());
+    }
+    
 }

+ 19 - 0
src/main/java/cn/com/qmth/mps/entity/SchoolEntity.java

@@ -17,6 +17,8 @@ public class SchoolEntity extends AuditingEntity {
 	
 	private String region;
 	
+	private String accessKey;
+	private String accessSecret;
 
 	public String getName() {
 		return name;
@@ -66,4 +68,21 @@ public class SchoolEntity extends AuditingEntity {
 		this.code = code;
 	}
 
+	public String getAccessKey() {
+		return accessKey;
+	}
+
+	public void setAccessKey(String accessKey) {
+		this.accessKey = accessKey;
+	}
+
+	public String getAccessSecret() {
+		return accessSecret;
+	}
+
+	public void setAccessSecret(String accessSecret) {
+		this.accessSecret = accessSecret;
+	}
+
+	
 }

+ 3 - 0
src/main/java/cn/com/qmth/mps/service/ExamService.java

@@ -2,8 +2,11 @@ package cn.com.qmth.mps.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import cn.com.qmth.mps.bean.User;
 import cn.com.qmth.mps.entity.ExamEntity;
 
 public interface ExamService  extends IService<ExamEntity> {
 
+	void syncExam(Long schoolId, User accessUser);
+
 }

+ 3 - 3
src/main/java/cn/com/qmth/mps/service/impl/AuthServiceImpl.java

@@ -148,7 +148,7 @@ public class AuthServiceImpl implements AuthorizationService<User>, AuthService
 			params.put("grant_type", "client_credential");
 			String ret;
 			try {
-				ret = HttpUtil.httpActionGet("https://api.weixin.qq.com/cgi-bin/token", null, params);
+				ret = HttpUtil.httpsActionGet("https://api.weixin.qq.com/cgi-bin/token", null, params);
 			} catch (Exception e) {
 				throw new StatusException("获取失败", e);
 			}
@@ -213,7 +213,7 @@ public class AuthServiceImpl implements AuthorizationService<User>, AuthService
 		params.put("grant_type", "authorization_code");
 		String ret;
 		try {
-			ret = HttpUtil.httpActionGet("https://api.weixin.qq.com/sns/jscode2session", null, params);
+			ret = HttpUtil.httpsActionGet("https://api.weixin.qq.com/sns/jscode2session", null, params);
 		} catch (Exception e) {
 			throw new StatusException("登录失败", e);
 		}
@@ -262,7 +262,7 @@ public class AuthServiceImpl implements AuthorizationService<User>, AuthService
 		params.put("code", phoneCode);
 		String ret;
 		try {
-			ret = HttpUtil.httpActionPost("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token="
+			ret = HttpUtil.httpsActionPost("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token="
 					+ wxappAccessTokenService.getWxappAccessToken().getAccessToken(), null, params);
 		} catch (Exception e) {
 			throw new StatusException("登录失败", e);

+ 77 - 0
src/main/java/cn/com/qmth/mps/service/impl/ExamServiceImpl.java

@@ -1,15 +1,92 @@
 package cn.com.qmth.mps.service.impl;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.boot.core.exception.StatusException;
+import com.qmth.boot.tools.signature.SignatureEntity;
+import com.qmth.boot.tools.signature.SignatureType;
 
+import cn.com.qmth.mps.bean.User;
 import cn.com.qmth.mps.dao.ExamDao;
 import cn.com.qmth.mps.entity.ExamEntity;
+import cn.com.qmth.mps.entity.SchoolEntity;
+import cn.com.qmth.mps.enums.ExamStatus;
+import cn.com.qmth.mps.enums.Role;
 import cn.com.qmth.mps.service.ExamService;
+import cn.com.qmth.mps.service.SchoolService;
+import cn.com.qmth.mps.util.HttpUtil;
 
 @Service
 public class ExamServiceImpl extends ServiceImpl<ExamDao, ExamEntity> implements ExamService {
+	@Value("${markingcloud.server}")
+	private String markingcloudServer;
+	@Autowired
+	private SchoolService schoolService;
 
+	@Transactional
+	@Override
+	public void syncExam(Long schoolId, User user) {
+		if (!user.getRole().equals(Role.SUPER_ADMIN) && !user.getSchoolId().equals(schoolId)) {
+			throw new StatusException("非法操作");
+		}
+		SchoolEntity school = schoolService.getById(schoolId);
+		if (school == null) {
+			throw new StatusException("未找到学校");
+		}
+		if (StringUtils.isBlank(school.getAccessKey()) || StringUtils.isBlank(school.getAccessSecret())) {
+			throw new StatusException("该学校不是同步数据,无法同步考试");
+		}
+		int pageNumber = 1;
+		int pageSize = 100;
+		String uri="/api/exams";
+		for (;;) {
+			long time = System.currentTimeMillis();
+			String signature = SignatureEntity.build(SignatureType.SECRET, "POST", uri, time, school.getAccessKey(),
+					school.getAccessSecret());
+			Map<String, String> heads = new HashMap<>();
+			heads.put("Authorization", signature.toString());
+			heads.put("time", String.valueOf(time));
+			Map<String, Object> params = new HashMap<>();
+			params.put("pageNumber", pageNumber);
+			params.put("pageSize", pageSize);
+			String str = HttpUtil.actionPostForm(markingcloudServer+uri, heads, params);
+			JSONArray examArray = JSONArray.parseArray(str);
+			for (int i = 0; i < examArray.size(); i++) {
+				ExamEntity exam = JSONObject.parseObject(examArray.getString(i), ExamEntity.class);
+				ExamEntity old=findByCode(schoolId, String.valueOf(exam.getId()));
+				if(old==null) {
+					exam.setSchoolId(schoolId);
+					exam.setCode(String.valueOf(exam.getId()));
+					exam.setId(null);
+					exam.setExamStatus(ExamStatus.EDIT);
+					this.save(exam);
+				}
+			}
+			if (examArray.size() != pageSize) {
+				break;
+			}
+			pageNumber++;
+		}
+	}
+	
+	private ExamEntity findByCode(Long schoolId,String code) {
+		QueryWrapper<ExamEntity> wrapper = new QueryWrapper<>();
+		LambdaQueryWrapper<ExamEntity> lw = wrapper.lambda();
+		lw.eq(ExamEntity::getSchoolId, schoolId);
+		lw.eq(ExamEntity::getCode, code);
+		return this.getOne(wrapper);
+	}
 
 }

+ 18 - 13
src/main/java/cn/com/qmth/mps/service/impl/SchoolServiceImpl.java

@@ -42,7 +42,7 @@ public class SchoolServiceImpl extends ServiceImpl<SchoolDao, SchoolEntity> impl
 	private String accessSecret;
 	@Value("${wxapp-url}")
 	private String wxappUrl;
-	
+
 	@Transactional
 	@Override
 	public void syncSchool(User user) {
@@ -59,13 +59,17 @@ public class SchoolServiceImpl extends ServiceImpl<SchoolDao, SchoolEntity> impl
 		}
 	}
 
-	private void addSchoolForSync(User user, SchoolEntity org) {
-		if (this.findSchoolByCode(org.getCode()) != null) {
-			return;
+	private void addSchoolForSync(User user, SchoolEntity school) {
+		SchoolEntity old = this.findSchoolByCode(school.getCode());
+		if (old != null) {
+			old.setAccessKey(school.getAccessKey());
+			old.setAccessSecret(school.getAccessSecret());
+			this.updateById(old);
+		} else {
+			school.setId(null);
+			school.setEnable(true);
+			this.save(school);
 		}
-		org.setId(null);
-		org.setEnable(true);
-		this.save(org);
 	}
 
 	private SchoolEntity findSchoolByCode(String code) {
@@ -114,13 +118,14 @@ public class SchoolServiceImpl extends ServiceImpl<SchoolDao, SchoolEntity> impl
 
 	@Override
 	public PageResult<SchoolVo> page(SchoolQuery query, User user) {
-		Long schoolId=null;
+		Long schoolId = null;
 		if (!user.getRole().equals(Role.SUPER_ADMIN)) {
-			schoolId=user.getSchoolId();
+			schoolId = user.getSchoolId();
 		}
-		IPage<SchoolVo> iPage = this.baseMapper.page(new Page<SchoolVo>(query.getPageNumber(), query.getPageSize()), query,schoolId);
-		if(CollectionUtils.isNotEmpty(iPage.getRecords())) {
-			for(SchoolVo vo:iPage.getRecords()) {
+		IPage<SchoolVo> iPage = this.baseMapper.page(new Page<SchoolVo>(query.getPageNumber(), query.getPageSize()),
+				query, schoolId);
+		if (CollectionUtils.isNotEmpty(iPage.getRecords())) {
+			for (SchoolVo vo : iPage.getRecords()) {
 				vo.setQrCode(wxappUrl);
 			}
 		}
@@ -136,7 +141,7 @@ public class SchoolServiceImpl extends ServiceImpl<SchoolDao, SchoolEntity> impl
 		if (ue == null) {
 			throw new StatusException("未找到学校");
 		}
-		SchoolVo vo=new SchoolVo();
+		SchoolVo vo = new SchoolVo();
 		BeanUtils.copyProperties(ue, vo);
 		vo.setQrCode(wxappUrl);
 		return vo;

+ 2 - 2
src/main/java/cn/com/qmth/mps/util/AuthorizationCreateUtil.java

@@ -12,8 +12,8 @@ public class AuthorizationCreateUtil {
     public static void main(String[] args) {
     	long time = System.currentTimeMillis();
     	String identity="SUPER_ADMIN_1";//登录后user属性
-    	String token="ffffffffb49ddd0affffffffc5e74516";//登录后user属性
-    	String url="/api/paper/import-course";//请求路径
+    	String token="ffffffffbb53efadffffffffd5066d0b";//登录后user属性
+    	String url="/api/exam/sync";//请求路径
     	String s = SignatureEntity.build(SignatureType.TOKEN, "post", url, time, identity, token);
     	System.out.println("time:"+time);
     	System.out.println("Authorization:"+s);

+ 152 - 4
src/main/java/cn/com/qmth/mps/util/HttpUtil.java

@@ -31,8 +31,156 @@ public class HttpUtil {
 	private static final String APPLICATION_FORM= "application/x-www-form-urlencoded;charset=utf-8";
 	
 	private static final String APPLICATION_JSON = "application/json;charset=utf-8";
+	
+	public static String actionPostForm(String uri, Map<String, String> heads, Map<String, Object> params) {
+		if(uri.toLowerCase().startsWith("https")) {
+			return httpsActionPostForm(uri, heads, params);
+		}else {
+			return httpActionPostForm(uri, heads, params);
+		}
+	}
+	public static String httpActionPostForm(String uri, Map<String, String> heads, Map<String, Object> params) {
+		String result = null;
+		HttpURLConnection conn = null;
+		OutputStream os = null;
+		InputStream is = null;
+
+		try {
+			// 获取链接
+			URL url = new URL(uri);
+			conn = (HttpURLConnection) url.openConnection();
+
+			conn.setRequestMethod("POST");
+			conn.setRequestProperty(CONTENT_TYPE, APPLICATION_JSON);
+			// 初始化
+			// 获取SSLSocketFactory对象
+
+			conn.setUseCaches(false);
+			conn.setDoOutput(true);
+
+			// 设置额外的参数
+			if (heads != null && !heads.isEmpty()) {
+
+				for (Map.Entry<String, String> head : heads.entrySet()) {
+					conn.setRequestProperty(head.getKey(), head.getValue());
+				}
+			}
+			// 创建链接
+			conn.connect();
+			if (params != null) {
+				StringBuilder sb = new StringBuilder();
+				for (Map.Entry<String, Object> data : params.entrySet()) {
+					sb.append(data.getKey()).append("=").append(data.getValue()).append("&");
+				}
+				os = conn.getOutputStream();
+				os.write(sb.toString().getBytes());
+				os.flush();
+			}
+			result = getResult(conn);
+		} catch (Exception e) {
+			throw new StatusException("服务器访问失败", e);
+		} finally {
+			try {
+				if (os != null) {
+					os.close();
+					os = null;
+				}
+				if (is != null) {
+					is.close();
+					is = null;
+				}
+			} catch (IOException e) {
+			}
+
+			if (conn != null) {
+				conn.disconnect();
+				conn = null;
+			}
+		}
+
+		return result;
+	}
+	public static String httpsActionPostForm(String uri, Map<String, String> heads, Map<String, Object> params) {
+		String result = null;
+		HttpsURLConnection conn = null;
+		OutputStream os = null;
+		InputStream is = null;
+
+		try {
+			// 获取链接
+			URL url = new URL(uri);
+			conn = (HttpsURLConnection) url.openConnection();
 
-	public static String httpActionPost(String uri, Map<String, String> heads, Map<String, String> params) {
+			conn.setRequestMethod("POST");
+			conn.setRequestProperty(CONTENT_TYPE, APPLICATION_JSON);
+			// ssl
+			SSLContext context = SSLContext.getInstance("SSL", "SunJSSE");
+			TrustManager[] tm = new TrustManager[] { new X509TrustManager() {
+
+				@Override
+				public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+				}
+
+				@Override
+				public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+				}
+
+				@Override
+				public X509Certificate[] getAcceptedIssuers() {
+					return null;
+				}
+			} };
+			// 初始化
+			context.init(null, tm, new java.security.SecureRandom());
+			// 获取SSLSocketFactory对象
+			SSLSocketFactory ssf = context.getSocketFactory();
+			conn.setSSLSocketFactory(ssf);
+			conn.setUseCaches(false);
+			conn.setDoOutput(true);
+
+			// 设置额外的参数
+			if (heads != null && !heads.isEmpty()) {
+
+				for (Map.Entry<String, String> head : heads.entrySet()) {
+					conn.setRequestProperty(head.getKey(), head.getValue());
+				}
+			}
+			// 创建链接
+			conn.connect();
+			if (params != null) {
+				StringBuilder sb = new StringBuilder();
+				for (Map.Entry<String, Object> data : params.entrySet()) {
+					sb.append(data.getKey()).append("=").append(data.getValue()).append("&");
+				}
+				os = conn.getOutputStream();
+				os.write(sb.toString().getBytes());
+				os.flush();
+			}
+			result = getResult(conn);
+		} catch (Exception e) {
+			throw new StatusException("服务器访问失败", e);
+		} finally {
+			try {
+				if (os != null) {
+					os.close();
+					os = null;
+				}
+				if (is != null) {
+					is.close();
+					is = null;
+				}
+			} catch (IOException e) {
+			}
+
+			if (conn != null) {
+				conn.disconnect();
+				conn = null;
+			}
+		}
+
+		return result;
+	}
+	public static String httpsActionPost(String uri, Map<String, String> heads, Map<String, String> params) {
 		String result = null;
 		HttpsURLConnection conn = null;
 		OutputStream os = null;
@@ -88,7 +236,7 @@ public class HttpUtil {
 			}
 			result = getResult(conn);
 		} catch (Exception e) {
-			throw new StatusException("授权服务器访问失败", e);
+			throw new StatusException("服务器访问失败", e);
 		} finally {
 			try {
 				if (os != null) {
@@ -117,7 +265,7 @@ public class HttpUtil {
 	 * @return
 	 * @throws Exception
 	 */
-	public static String httpActionGet(String uri, Map<String, String> heads, Map<String, String> params) {
+	public static String httpsActionGet(String uri, Map<String, String> heads, Map<String, String> params) {
 		String result = null;
 		HttpsURLConnection conn = null;
 		OutputStream os = null;
@@ -176,7 +324,7 @@ public class HttpUtil {
 
 			result = getResult(conn);
 		} catch (Exception e) {
-			throw new StatusException("授权服务器访问失败", e);
+			throw new StatusException("服务器访问失败", e);
 		} finally {
 			try {
 				if (os != null) {

+ 2 - 6
src/main/java/cn/com/qmth/mps/util/SolarHttpUtil.java

@@ -234,12 +234,8 @@ public class SolarHttpUtil {
 			String str = this.httpAction(null, datas);
 			JSONArray orgArray = JSONArray.parseArray(str);
 			for (int i = 0; i < orgArray.size(); i++) {
-				JSONObject orgOb = orgArray.getJSONObject(i);
-				SchoolEntity org = new SchoolEntity();
-				org.setCode(orgOb.getString("code"));
-				org.setName(orgOb.getString("name"));
-				org.setEnable(true);
-				orgs.add(org);
+				SchoolEntity school = JSONObject.parseObject(orgArray.getString(i), SchoolEntity.class);
+				orgs.add(school);
 			}
 			if (orgArray.size() != pageSize) {
 				break;