浏览代码

加入数据对接模块

wangliang 1 周之前
父节点
当前提交
5e69db3e4e
共有 28 个文件被更改,包括 1655 次插入4 次删除
  1. 2 2
      data-docking/src/main/java/com/qmth/data/docking/DataDockingApplication.java
  2. 66 0
      data-docking/src/main/java/com/qmth/data/docking/api/DataDockingController.java
  3. 88 0
      data-docking/src/main/java/com/qmth/data/docking/aspect/ApiCasControllerAspect.java
  4. 66 0
      data-docking/src/main/java/com/qmth/data/docking/bean/result/ZufeCourseResult.java
  5. 235 0
      data-docking/src/main/java/com/qmth/data/docking/bean/result/ZufeExamResult.java
  6. 81 0
      data-docking/src/main/java/com/qmth/data/docking/bean/result/ZufeLoginResult.java
  7. 77 0
      data-docking/src/main/java/com/qmth/data/docking/config/SwaggerConfig.java
  8. 156 0
      data-docking/src/main/java/com/qmth/data/docking/entity/TSToken.java
  9. 107 0
      data-docking/src/main/java/com/qmth/data/docking/entity/YjxtKcxx.java
  10. 263 0
      data-docking/src/main/java/com/qmth/data/docking/entity/YjxtKsxx.java
  11. 16 0
      data-docking/src/main/java/com/qmth/data/docking/mapper/TSTokenMapper.java
  12. 16 0
      data-docking/src/main/java/com/qmth/data/docking/mapper/YjxtKcxxMapper.java
  13. 16 0
      data-docking/src/main/java/com/qmth/data/docking/mapper/YjxtKsxxMapper.java
  14. 23 0
      data-docking/src/main/java/com/qmth/data/docking/service/TSTokenService.java
  15. 16 0
      data-docking/src/main/java/com/qmth/data/docking/service/YjxtKcxxService.java
  16. 16 0
      data-docking/src/main/java/com/qmth/data/docking/service/YjxtKsxxService.java
  17. 33 0
      data-docking/src/main/java/com/qmth/data/docking/service/impl/TSTokenServiceImpl.java
  18. 20 0
      data-docking/src/main/java/com/qmth/data/docking/service/impl/YjxtKcxxServiceImpl.java
  19. 20 0
      data-docking/src/main/java/com/qmth/data/docking/service/impl/YjxtKsxxServiceImpl.java
  20. 31 0
      data-docking/src/main/java/com/qmth/data/docking/start/StartRunning.java
  21. 16 0
      data-docking/src/main/java/com/qmth/data/docking/util/zufe/Constants.java
  22. 203 0
      data-docking/src/main/java/com/qmth/data/docking/util/zufe/ZufeDataDockingUtil.java
  23. 2 2
      data-docking/src/main/resources/application.properties
  24. 5 0
      data-docking/src/main/resources/mapper/TSTokenMapper.xml
  25. 5 0
      data-docking/src/main/resources/mapper/YjxtKcxxMapper.xml
  26. 5 0
      data-docking/src/main/resources/mapper/YjxtKsxxMapper.xml
  27. 14 0
      teachcloud-exchange-common/src/main/java/com/qmth/teachcloud/exchange/common/contant/SystemConstant.java
  28. 57 0
      teachcloud-exchange-common/src/main/java/com/qmth/teachcloud/exchange/common/enums/FieldUniqueEnum.java

+ 2 - 2
data-docking/src/main/java/com/qmth/data/docking/DataDockingApplication.java

@@ -10,9 +10,9 @@ import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @SpringBootApplication(scanBasePackages = "com.qmth.*", exclude = {SecurityAutoConfiguration.class})
-@MapperScan({"com.qmth.teachcloud.exchange.common.mapper"})
+@MapperScan({"com.qmth.teachcloud.exchange.common.mapper", "com.qmth.data.docking.mapper"})
 //主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中,做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中
-@EntityScan(basePackages = {"com.qmth.teachcloud.exchange.common.entity"})
+@EntityScan(basePackages = {"com.qmth.teachcloud.exchange.common.entity", "com.qmth.data.docking.entity"})
 //用来扫描和发现指定包及其子包中的Entity定义
 @EnableTransactionManagement // spring开启事务支持
 @EnableAsync // 开启异步任务

+ 66 - 0
data-docking/src/main/java/com/qmth/data/docking/api/DataDockingController.java

@@ -0,0 +1,66 @@
+package com.qmth.data.docking.api;
+
+
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.data.docking.bean.result.ZufeCourseResult;
+import com.qmth.data.docking.bean.result.ZufeExamResult;
+import com.qmth.data.docking.entity.TSToken;
+import com.qmth.data.docking.util.zufe.ZufeDataDockingUtil;
+import com.qmth.teachcloud.exchange.common.contant.SystemConstant;
+import com.qmth.teachcloud.exchange.common.util.Result;
+import com.qmth.teachcloud.exchange.common.util.ResultUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+
+/**
+ * <p>
+ * 数据同步接口 前端控制器
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-09
+ */
+@Api(tags = "数据同步接口Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_DATA_DOCKING)
+@Validated
+public class DataDockingController {
+
+    @Resource
+    ZufeDataDockingUtil zufeDataDockingUtil;
+
+    @ApiOperation(value = "登录")
+    @RequestMapping(value = "/login", method = RequestMethod.GET)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回数据", response = TSToken.class)})
+    @Aac(auth = false)
+    public Result login(@ApiParam(value = "key", required = true) @RequestParam String key,
+                        @ApiParam(value = "secret", required = true) @RequestParam String secret) throws IOException {
+        return ResultUtil.ok(zufeDataDockingUtil.login(key, secret));
+    }
+
+    @ApiOperation(value = "课程")
+    @RequestMapping(value = "/course", method = RequestMethod.GET)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回数据", response = ZufeCourseResult.class)})
+    @Aac(auth = false)
+    public Result course(@ApiParam(value = "access_token", required = true) @RequestParam String accessToken) throws IOException {
+        zufeDataDockingUtil.course(accessToken);
+        return ResultUtil.ok(true);
+    }
+
+    @ApiOperation(value = "考试")
+    @RequestMapping(value = "/exam", method = RequestMethod.GET)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回数据", response = ZufeExamResult.class)})
+    @Aac(auth = false)
+    public Result exam(@ApiParam(value = "access_token", required = true) @RequestParam String accessToken) throws IOException {
+        zufeDataDockingUtil.exam(accessToken);
+        return ResultUtil.ok(true);
+    }
+}

+ 88 - 0
data-docking/src/main/java/com/qmth/data/docking/aspect/ApiCasControllerAspect.java

@@ -0,0 +1,88 @@
+package com.qmth.data.docking.aspect;
+
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.teachcloud.exchange.common.contant.SystemConstant;
+import com.qmth.teachcloud.exchange.common.util.JacksonUtil;
+import com.qmth.teachcloud.exchange.common.util.ResultUtil;
+import com.qmth.teachcloud.exchange.common.util.ServletUtil;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.BeanPropertyBindingResult;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * @Description: api aspect
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/5/12
+ */
+@Aspect
+@Component
+public class ApiCasControllerAspect {
+    private final static Logger log = LoggerFactory.getLogger(ApiCasControllerAspect.class);
+
+    /**
+     * api切入点
+     */
+    @Pointcut("execution(public * com.qmth.data.docking.api.*.*(..))")
+    public void apiAspect() {
+    }
+
+    /**
+     * 后台环绕切入
+     *
+     * @param joinPoint
+     * @return
+     * @throws Throwable
+     */
+    @Around(value = "apiAspect()")
+    public Object aroundApiPoint(ProceedingJoinPoint joinPoint) throws Throwable {
+        long start = System.currentTimeMillis();
+        StringJoiner stringJoiner = new StringJoiner("");
+        try {
+            MethodSignature msig = (MethodSignature) joinPoint.getSignature();
+            String className = msig.getDeclaringTypeName();
+            String methodName = msig.getName();
+            Object[] args = joinPoint.getArgs();
+            String[] paramsName = msig.getParameterNames();
+            HttpServletRequest request = ServletUtil.getRequest();
+            stringJoiner.add("============请求地址============:").add(request.getServletPath()).add("\r\n");
+            stringJoiner.add("============类============:").add(className).add("\r\n");
+            stringJoiner.add("============方法============:").add(methodName).add("\r\n");
+            if (Objects.nonNull(args) && args.length > 0) {
+                for (int i = 0; i < args.length; i++) {
+                    if (Objects.nonNull(args[i]) && (args[i] instanceof HttpServletRequest || args[i] instanceof HttpServletResponse || args[i] instanceof CommonsMultipartFile || args[i] instanceof MultipartFile || args[i] instanceof BeanPropertyBindingResult)) {
+                        continue;
+                    } else {
+                        stringJoiner.add("参数key:").add(JacksonUtil.parseJson(paramsName[i])).add(",参数value:").add(JacksonUtil.parseJson(args[i])).add("\r\n");
+                    }
+                }
+            }
+            return joinPoint.proceed();
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (e instanceof ApiException) {
+                return ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                return ResultUtil.error(e.getMessage());
+            }
+        } finally {
+            long end = System.currentTimeMillis();
+            stringJoiner.add("============耗时============:").add((end - start) / 1000 + "").add("秒");
+            log.info("request:{}", stringJoiner.toString());
+        }
+    }
+}

+ 66 - 0
data-docking/src/main/java/com/qmth/data/docking/bean/result/ZufeCourseResult.java

@@ -0,0 +1,66 @@
+package com.qmth.data.docking.bean.result;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * @Description: 浙财课程result
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2025/6/10
+ */
+public class ZufeCourseResult implements Serializable {
+
+    @ApiModelProperty(value = "KCH")
+    private String KCH;
+
+    @ApiModelProperty(value = "KCMC")
+    private String KCMC;
+
+    @ApiModelProperty(value = "KKXY")
+    private String KKXY;
+
+    public String getKCH() {
+        return KCH;
+    }
+
+    public void setKCH(String KCH) {
+        this.KCH = KCH;
+    }
+
+    public String getKCMC() {
+        return KCMC;
+    }
+
+    public void setKCMC(String KCMC) {
+        this.KCMC = KCMC;
+    }
+
+    public String getKKXY() {
+        return KKXY;
+    }
+
+    public void setKKXY(String KKXY) {
+        this.KKXY = KKXY;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        ZufeCourseResult that = (ZufeCourseResult) o;
+        return Objects.equals(KCH, that.KCH) && Objects.equals(KCMC, that.KCMC) && Objects.equals(KKXY, that.KKXY);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(KCH, KCMC, KKXY);
+    }
+}

+ 235 - 0
data-docking/src/main/java/com/qmth/data/docking/bean/result/ZufeExamResult.java

@@ -0,0 +1,235 @@
+package com.qmth.data.docking.bean.result;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 浙财考试result
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2025/6/10
+ */
+public class ZufeExamResult implements Serializable {
+
+    @ApiModelProperty(value = "KSMCDM")
+    private String KSMCDM;
+
+    @ApiModelProperty(value = "KSMC")
+    private String KSMC;
+
+    @ApiModelProperty(value = "KCMC")
+    private String KCMC;
+
+    @ApiModelProperty(value = "XH")
+    private String XH;
+
+    @ApiModelProperty(value = "XM")
+    private String XM;
+
+    @ApiModelProperty(value = "JXBBH")
+    private String JXBBH;
+
+    @ApiModelProperty(value = "JXBMC")
+    private String JXBMC;
+
+    @ApiModelProperty(value = "XNM")
+    private String XNM;
+
+    @ApiModelProperty(value = "XQM")
+    private String XQM;
+
+    @ApiModelProperty(value = "SJBH")
+    private String SJBH;
+
+    @ApiModelProperty(value = "SJMC")
+    private String SJMC;
+
+    @ApiModelProperty(value = "KSBZ")
+    private String KSBZ;
+
+    @ApiModelProperty(value = "JSXM")
+    private String JSXM;
+
+    @ApiModelProperty(value = "KSKSSJ")
+    private String KSKSSJ;
+
+    @ApiModelProperty(value = "KSJSSJ")
+    private String KSJSSJ;
+
+    @ApiModelProperty(value = "ZJKJS")
+    private String ZJKJS;
+
+    @ApiModelProperty(value = "FJKJS")
+    private String FJKJS;
+
+    @ApiModelProperty(value = "KSDD")
+    private String KSDD;
+
+    @ApiModelProperty(value = "KCH")
+    private String KCH;
+
+    @ApiModelProperty(value = "JGH")
+    private String JGH;
+
+    public String getKSMCDM() {
+        return KSMCDM;
+    }
+
+    public void setKSMCDM(String KSMCDM) {
+        this.KSMCDM = KSMCDM;
+    }
+
+    public String getKSMC() {
+        return KSMC;
+    }
+
+    public void setKSMC(String KSMC) {
+        this.KSMC = KSMC;
+    }
+
+    public String getKCMC() {
+        return KCMC;
+    }
+
+    public void setKCMC(String KCMC) {
+        this.KCMC = KCMC;
+    }
+
+    public String getXH() {
+        return XH;
+    }
+
+    public void setXH(String XH) {
+        this.XH = XH;
+    }
+
+    public String getXM() {
+        return XM;
+    }
+
+    public void setXM(String XM) {
+        this.XM = XM;
+    }
+
+    public String getJXBBH() {
+        return JXBBH;
+    }
+
+    public void setJXBBH(String JXBBH) {
+        this.JXBBH = JXBBH;
+    }
+
+    public String getJXBMC() {
+        return JXBMC;
+    }
+
+    public void setJXBMC(String JXBMC) {
+        this.JXBMC = JXBMC;
+    }
+
+    public String getXNM() {
+        return XNM;
+    }
+
+    public void setXNM(String XNM) {
+        this.XNM = XNM;
+    }
+
+    public String getXQM() {
+        return XQM;
+    }
+
+    public void setXQM(String XQM) {
+        this.XQM = XQM;
+    }
+
+    public String getSJBH() {
+        return SJBH;
+    }
+
+    public void setSJBH(String SJBH) {
+        this.SJBH = SJBH;
+    }
+
+    public String getSJMC() {
+        return SJMC;
+    }
+
+    public void setSJMC(String SJMC) {
+        this.SJMC = SJMC;
+    }
+
+    public String getKSBZ() {
+        return KSBZ;
+    }
+
+    public void setKSBZ(String KSBZ) {
+        this.KSBZ = KSBZ;
+    }
+
+    public String getJSXM() {
+        return JSXM;
+    }
+
+    public void setJSXM(String JSXM) {
+        this.JSXM = JSXM;
+    }
+
+    public String getKSKSSJ() {
+        return KSKSSJ;
+    }
+
+    public void setKSKSSJ(String KSKSSJ) {
+        this.KSKSSJ = KSKSSJ;
+    }
+
+    public String getKSJSSJ() {
+        return KSJSSJ;
+    }
+
+    public void setKSJSSJ(String KSJSSJ) {
+        this.KSJSSJ = KSJSSJ;
+    }
+
+    public String getZJKJS() {
+        return ZJKJS;
+    }
+
+    public void setZJKJS(String ZJKJS) {
+        this.ZJKJS = ZJKJS;
+    }
+
+    public String getFJKJS() {
+        return FJKJS;
+    }
+
+    public void setFJKJS(String FJKJS) {
+        this.FJKJS = FJKJS;
+    }
+
+    public String getKSDD() {
+        return KSDD;
+    }
+
+    public void setKSDD(String KSDD) {
+        this.KSDD = KSDD;
+    }
+
+    public String getKCH() {
+        return KCH;
+    }
+
+    public void setKCH(String KCH) {
+        this.KCH = KCH;
+    }
+
+    public String getJGH() {
+        return JGH;
+    }
+
+    public void setJGH(String JGH) {
+        this.JGH = JGH;
+    }
+}

+ 81 - 0
data-docking/src/main/java/com/qmth/data/docking/bean/result/ZufeLoginResult.java

@@ -0,0 +1,81 @@
+package com.qmth.data.docking.bean.result;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 浙财登录result
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2025/6/10
+ */
+public class ZufeLoginResult implements Serializable {
+
+    @ApiModelProperty(value = "token")
+    private String access_token;
+
+    @ApiModelProperty(value = "token_type")
+    private String token_type;
+
+    @ApiModelProperty(value = "refresh_token")
+    private String refresh_token;
+
+    @ApiModelProperty(value = "expires_in")
+    private Integer expires_in;
+
+    @ApiModelProperty(value = "scope")
+    private String scope;
+
+    @ApiModelProperty(value = "license")
+    private String license;
+
+    public String getAccess_token() {
+        return access_token;
+    }
+
+    public void setAccess_token(String access_token) {
+        this.access_token = access_token;
+    }
+
+    public String getToken_type() {
+        return token_type;
+    }
+
+    public void setToken_type(String token_type) {
+        this.token_type = token_type;
+    }
+
+    public String getRefresh_token() {
+        return refresh_token;
+    }
+
+    public void setRefresh_token(String refresh_token) {
+        this.refresh_token = refresh_token;
+    }
+
+    public Integer getExpires_in() {
+        return expires_in;
+    }
+
+    public void setExpires_in(Integer expires_in) {
+        this.expires_in = expires_in;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+
+    public String getLicense() {
+        return license;
+    }
+
+    public void setLicense(String license) {
+        this.license = license;
+    }
+}

+ 77 - 0
data-docking/src/main/java/com/qmth/data/docking/config/SwaggerConfig.java

@@ -0,0 +1,77 @@
+package com.qmth.data.docking.config;
+
+import com.google.common.base.Predicates;
+import com.qmth.teachcloud.exchange.common.contant.SystemConstant;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Parameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: swagger配置类
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/9/21
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+
+    @Bean
+    public Docket createRestApi() {
+        ParameterBuilder tokenPar = new ParameterBuilder();
+        ParameterBuilder tokenPar1 = new ParameterBuilder();
+        ParameterBuilder tokenPar2 = new ParameterBuilder();
+        ParameterBuilder tokenPar3 = new ParameterBuilder();
+        ParameterBuilder tokenPar4 = new ParameterBuilder();
+        ParameterBuilder tokenPar5 = new ParameterBuilder();
+        List<Parameter> pars = new ArrayList<>();
+        tokenPar.name(SystemConstant.HEADER_PLATFORM).description("平台").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+        tokenPar1.name(SystemConstant.HEADER_DEVICE_ID).description("设备id").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+        tokenPar2.name(SystemConstant.HEADER_AUTHORIZATION).description("鉴权token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+        tokenPar3.name(SystemConstant.HEADER_TIME).description("时间戳").modelRef(new ModelRef("long")).parameterType("header").required(false).build();
+        tokenPar4.name(SystemConstant.MD5.toLowerCase()).description("md5").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+        tokenPar5.name(SystemConstant.SCHOOL_ID).description("学校id").modelRef(new ModelRef("long")).parameterType("header").required(false).build();
+        pars.add(tokenPar.build());
+        pars.add(tokenPar1.build());
+        pars.add(tokenPar2.build());
+        pars.add(tokenPar3.build());
+        pars.add(tokenPar4.build());
+        pars.add(tokenPar5.build());
+
+        return new Docket(DocumentationType.SWAGGER_2)
+                .groupName("data-docking")
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.qmth"))
+//                .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.any())
+                // 不显示错误的接口地址
+                .paths(Predicates.not(PathSelectors.regex("/error.*")))// 错误路径不监控
+                .build()
+                .globalOperationParameters(pars)
+                .apiInfo(apiInfo());
+    }
+
+    private ApiInfo apiInfo() {
+        ApiInfo apiInfo = new ApiInfo(
+                "快捷登录系统-数据同步 - api",
+                "Some custom description of API.",
+                "API TOS",
+                "Terms of service",
+                "myeaddress@company.com",
+                "License of API",
+                "API license URL");
+        return apiInfo;
+    }
+}

+ 156 - 0
data-docking/src/main/java/com/qmth/data/docking/entity/TSToken.java

@@ -0,0 +1,156 @@
+package com.qmth.data.docking.entity;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.data.docking.bean.result.ZufeLoginResult;
+import com.qmth.teachcloud.exchange.common.contant.SystemConstant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * token表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-10
+ */
+@ApiModel(value = "TSToken对象", description = "token表")
+public class TSToken implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @ApiModelProperty(value = "学校编码")
+    private String code;
+
+    @ApiModelProperty(value = "token")
+    private String accessToken;
+
+    @ApiModelProperty(value = "token类型")
+    private String tokenType;
+
+    @ApiModelProperty(value = "刷新token")
+    private String refreshToken;
+
+    @ApiModelProperty(value = "有效时间")
+    private Integer expiresIn;
+
+    @ApiModelProperty(value = "范围")
+    private String scope;
+
+    @ApiModelProperty(value = "许可证")
+    private String license;
+
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    private Long updateTime;
+
+    public TSToken() {
+
+    }
+
+    public TSToken(ZufeLoginResult zufeLoginResult, String code) {
+        this.id = SystemConstant.getDbUuid();
+        this.code = code;
+        this.accessToken = zufeLoginResult.getAccess_token();
+        this.tokenType = zufeLoginResult.getToken_type();
+        this.refreshToken = zufeLoginResult.getRefresh_token();
+        this.expiresIn = zufeLoginResult.getExpires_in();
+        this.scope = zufeLoginResult.getScope();
+        this.license = zufeLoginResult.getLicense();
+        this.createTime = System.currentTimeMillis();
+    }
+
+    public void updateTime(Long id) {
+        this.id = id;
+        this.updateTime = System.currentTimeMillis();
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    public void setAccessToken(String accessToken) {
+        this.accessToken = accessToken;
+    }
+
+    public String getTokenType() {
+        return tokenType;
+    }
+
+    public void setTokenType(String tokenType) {
+        this.tokenType = tokenType;
+    }
+
+    public String getRefreshToken() {
+        return refreshToken;
+    }
+
+    public void setRefreshToken(String refreshToken) {
+        this.refreshToken = refreshToken;
+    }
+
+    public Integer getExpiresIn() {
+        return expiresIn;
+    }
+
+    public void setExpiresIn(Integer expiresIn) {
+        this.expiresIn = expiresIn;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+
+    public String getLicense() {
+        return license;
+    }
+
+    public void setLicense(String license) {
+        this.license = license;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+}

+ 107 - 0
data-docking/src/main/java/com/qmth/data/docking/entity/YjxtKcxx.java

@@ -0,0 +1,107 @@
+package com.qmth.data.docking.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.data.docking.bean.result.ZufeCourseResult;
+import com.qmth.teachcloud.exchange.common.contant.SystemConstant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 浙财课程信息表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-09
+ */
+@TableName("YJXT_KCXX")
+@ApiModel(value = "YjxtKcxx对象", description = "课程信息表")
+public class YjxtKcxx implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @ApiModelProperty(value = "课程代码")
+    private String code;
+
+    @ApiModelProperty(value = "课程名称")
+    private String name;
+
+    @ApiModelProperty(value = "机构名称(二级学院)")
+    @TableField("collegeName")
+    private String collegeName;
+
+    public YjxtKcxx() {
+
+    }
+
+    public YjxtKcxx(ZufeCourseResult zufeCourseResult) {
+        this.id = SystemConstant.getDbUuid();
+        this.code = zufeCourseResult.getKCH();
+        this.name = zufeCourseResult.getKCMC();
+        this.collegeName = zufeCourseResult.getKKXY();
+    }
+
+    public void updateData(YjxtKcxx yjxtKcxx) {
+        this.name = yjxtKcxx.getName();
+        this.collegeName = yjxtKcxx.getCollegeName();
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCollegeName() {
+        return collegeName;
+    }
+
+    public void setCollegeName(String collegeName) {
+        this.collegeName = collegeName;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        YjxtKcxx yjxtKcxx = (YjxtKcxx) o;
+        return Objects.equals(code, yjxtKcxx.code) && Objects.equals(name, yjxtKcxx.name) && Objects.equals(collegeName, yjxtKcxx.collegeName);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(code, name, collegeName);
+    }
+}

+ 263 - 0
data-docking/src/main/java/com/qmth/data/docking/entity/YjxtKsxx.java

@@ -0,0 +1,263 @@
+package com.qmth.data.docking.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 考生数据
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-09
+ */
+@TableName("YJXT_KSXX")
+@ApiModel(value = "YjxtKsxx对象", description = "考生数据表")
+public class YjxtKsxx implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @ApiModelProperty(value = "学年名")
+    private String xnm;
+
+    @ApiModelProperty(value = "学期名")
+    private String xqm;
+
+    @ApiModelProperty(value = "课程编号")
+    @TableField("courseCode")
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    @TableField("courseName")
+    private String courseName;
+
+    @ApiModelProperty(value = "课程开课学院")
+    @TableField("courseCollegeName")
+    private String courseCollegeName;
+
+    @ApiModelProperty(value = "试卷编号")
+    @TableField("paperNumber")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "姓名")
+    @TableField("studentName")
+    private String studentName;
+
+    @ApiModelProperty(value = "学号")
+    @TableField("studentCode")
+    private String studentCode;
+
+    @ApiModelProperty(value = "座位号")
+    @TableField("siteNumber")
+    private String siteNumber;
+
+    @ApiModelProperty(value = "学生学院")
+    @TableField("studentCollegeName")
+    private String studentCollegeName;
+
+    @ApiModelProperty(value = "专业")
+    @TableField("majorName")
+    private String majorName;
+
+    @ApiModelProperty(value = "教学班")
+    @TableField("teachClassName")
+    private String teachClassName;
+
+    @ApiModelProperty(value = "行政班")
+    @TableField("className")
+    private String className;
+
+    @ApiModelProperty(value = "考试日期")
+    @TableField("examDate")
+    private String examDate;
+
+    @ApiModelProperty(value = "考试时间")
+    @TableField("examTime")
+    private String examTime;
+
+    @ApiModelProperty(value = "考点")
+    @TableField("examPlace")
+    private String examPlace;
+
+    @ApiModelProperty(value = "考场")
+    @TableField("examRoom")
+    private String examRoom;
+
+    @ApiModelProperty(value = "命题老师工号")
+    @TableField("teacherCode")
+    private String teacherCode;
+
+    @ApiModelProperty(value = "命题老师姓名")
+    @TableField("teacherName")
+    private String teacherName;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getXnm() {
+        return xnm;
+    }
+
+    public void setXnm(String xnm) {
+        this.xnm = xnm;
+    }
+
+    public String getXqm() {
+        return xqm;
+    }
+
+    public void setXqm(String xqm) {
+        this.xqm = xqm;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public String getCourseCollegeName() {
+        return courseCollegeName;
+    }
+
+    public void setCourseCollegeName(String courseCollegeName) {
+        this.courseCollegeName = courseCollegeName;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getSiteNumber() {
+        return siteNumber;
+    }
+
+    public void setSiteNumber(String siteNumber) {
+        this.siteNumber = siteNumber;
+    }
+
+    public String getStudentCollegeName() {
+        return studentCollegeName;
+    }
+
+    public void setStudentCollegeName(String studentCollegeName) {
+        this.studentCollegeName = studentCollegeName;
+    }
+
+    public String getMajorName() {
+        return majorName;
+    }
+
+    public void setMajorName(String majorName) {
+        this.majorName = majorName;
+    }
+
+    public String getTeachClassName() {
+        return teachClassName;
+    }
+
+    public void setTeachClassName(String teachClassName) {
+        this.teachClassName = teachClassName;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getExamDate() {
+        return examDate;
+    }
+
+    public void setExamDate(String examDate) {
+        this.examDate = examDate;
+    }
+
+    public String getExamTime() {
+        return examTime;
+    }
+
+    public void setExamTime(String examTime) {
+        this.examTime = examTime;
+    }
+
+    public String getExamPlace() {
+        return examPlace;
+    }
+
+    public void setExamPlace(String examPlace) {
+        this.examPlace = examPlace;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getTeacherCode() {
+        return teacherCode;
+    }
+
+    public void setTeacherCode(String teacherCode) {
+        this.teacherCode = teacherCode;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+}

+ 16 - 0
data-docking/src/main/java/com/qmth/data/docking/mapper/TSTokenMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.data.docking.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.data.docking.entity.TSToken;
+
+/**
+ * <p>
+ * token表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-10
+ */
+public interface TSTokenMapper extends BaseMapper<TSToken> {
+
+}

+ 16 - 0
data-docking/src/main/java/com/qmth/data/docking/mapper/YjxtKcxxMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.data.docking.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.data.docking.entity.YjxtKcxx;
+
+/**
+ * <p>
+ * 课程信息表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-09
+ */
+public interface YjxtKcxxMapper extends BaseMapper<YjxtKcxx> {
+
+}

+ 16 - 0
data-docking/src/main/java/com/qmth/data/docking/mapper/YjxtKsxxMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.data.docking.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.data.docking.entity.YjxtKsxx;
+
+/**
+ * <p>
+ * 考生数据表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-09
+ */
+public interface YjxtKsxxMapper extends BaseMapper<YjxtKsxx> {
+
+}

+ 23 - 0
data-docking/src/main/java/com/qmth/data/docking/service/TSTokenService.java

@@ -0,0 +1,23 @@
+package com.qmth.data.docking.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.data.docking.entity.TSToken;
+
+/**
+ * <p>
+ * token表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-10
+ */
+public interface TSTokenService extends IService<TSToken> {
+
+    /**
+     * 根据学校编码查找token
+     *
+     * @param code
+     * @return
+     */
+    public TSToken findByCode(String code);
+}

+ 16 - 0
data-docking/src/main/java/com/qmth/data/docking/service/YjxtKcxxService.java

@@ -0,0 +1,16 @@
+package com.qmth.data.docking.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.data.docking.entity.YjxtKcxx;
+
+/**
+ * <p>
+ * 课程信息表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-09
+ */
+public interface YjxtKcxxService extends IService<YjxtKcxx> {
+
+}

+ 16 - 0
data-docking/src/main/java/com/qmth/data/docking/service/YjxtKsxxService.java

@@ -0,0 +1,16 @@
+package com.qmth.data.docking.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.data.docking.entity.YjxtKsxx;
+
+/**
+ * <p>
+ * 考生数据表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-09
+ */
+public interface YjxtKsxxService extends IService<YjxtKsxx> {
+
+}

+ 33 - 0
data-docking/src/main/java/com/qmth/data/docking/service/impl/TSTokenServiceImpl.java

@@ -0,0 +1,33 @@
+package com.qmth.data.docking.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.data.docking.entity.TSToken;
+import com.qmth.data.docking.mapper.TSTokenMapper;
+import com.qmth.data.docking.service.TSTokenService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * token表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-10
+ */
+@Service
+public class TSTokenServiceImpl extends ServiceImpl<TSTokenMapper, TSToken> implements TSTokenService {
+
+    /**
+     * 根据学校编码查找token
+     *
+     * @param code
+     * @return
+     */
+    @Override
+    public TSToken findByCode(String code) {
+        QueryWrapper<TSToken> tsTokenQueryWrapper = new QueryWrapper<>();
+        tsTokenQueryWrapper.lambda().eq(TSToken::getCode, code).orderByDesc(TSToken::getCreateTime).last("limit 1");
+        return this.getOne(tsTokenQueryWrapper);
+    }
+}

+ 20 - 0
data-docking/src/main/java/com/qmth/data/docking/service/impl/YjxtKcxxServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qmth.data.docking.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.data.docking.entity.YjxtKcxx;
+import com.qmth.data.docking.mapper.YjxtKcxxMapper;
+import com.qmth.data.docking.service.YjxtKcxxService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 课程信息表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-09
+ */
+@Service
+public class YjxtKcxxServiceImpl extends ServiceImpl<YjxtKcxxMapper, YjxtKcxx> implements YjxtKcxxService {
+
+}

+ 20 - 0
data-docking/src/main/java/com/qmth/data/docking/service/impl/YjxtKsxxServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qmth.data.docking.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.data.docking.entity.YjxtKsxx;
+import com.qmth.data.docking.mapper.YjxtKsxxMapper;
+import com.qmth.data.docking.service.YjxtKsxxService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 考生数据表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2025-06-09
+ */
+@Service
+public class YjxtKsxxServiceImpl extends ServiceImpl<YjxtKsxxMapper, YjxtKsxx> implements YjxtKsxxService {
+
+}

+ 31 - 0
data-docking/src/main/java/com/qmth/data/docking/start/StartRunning.java

@@ -0,0 +1,31 @@
+package com.qmth.data.docking.start;
+
+import com.qmth.teachcloud.exchange.common.service.AuthInfoService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * @Description: 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/3
+ */
+@Component
+public class StartRunning implements CommandLineRunner {
+    private final static Logger log = LoggerFactory.getLogger(StartRunning.class);
+
+    @Resource
+    AuthInfoService authInfoService;
+
+    @Override
+    public void run(String... args) throws Exception {
+        log.info("服务器启动时执行 start");
+        authInfoService.appInfoInit();
+        log.info("服务器启动时执行 end");
+    }
+}

+ 16 - 0
data-docking/src/main/java/com/qmth/data/docking/util/zufe/Constants.java

@@ -0,0 +1,16 @@
+package com.qmth.data.docking.util.zufe;
+
+public interface Constants {
+
+    // 数据同步根地址
+    String CAS_BASE_PATH = "https://dct.zufe.edu.cn";
+
+    // 数据同步登录地址
+    String LOGIN_API_PATH = CAS_BASE_PATH + "/open_api/authentication/get_access_token";
+
+    // 数据同步课程地址
+    String COURSE_API_PATH = CAS_BASE_PATH + "/open_api/customization/tgxjxbzkskcxx/full";
+
+    // 数据同步考试地址
+    String EXAM_API_URI = CAS_BASE_PATH + "/open_api/customization/tgxjxbkskssjxx/full";
+}

文件差异内容过多而无法显示
+ 203 - 0
data-docking/src/main/java/com/qmth/data/docking/util/zufe/ZufeDataDockingUtil.java


+ 2 - 2
data-docking/src/main/resources/application.properties

@@ -12,7 +12,7 @@ spring.application.name=data-docking
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=exchange-v1.0.0
+db.name=data-docking
 db.username=root
 db.password=123456789
 
@@ -44,4 +44,4 @@ spring.jackson.time-zone=GMT+8
 com.qmth.logging.root-level=info
 com.qmth.logging.file-path=/Users/king/Downloads/data-docking.log
 
-com.qmth.solar.license=/Users/king/Downloads/app.lic
+com.qmth.solar.license=/Users/king/Downloads/zufe-\u77E5\u5B66\u77E5\u8003-241031.lic

+ 5 - 0
data-docking/src/main/resources/mapper/TSTokenMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.data.docking.mapper.TSTokenMapper">
+
+</mapper>

+ 5 - 0
data-docking/src/main/resources/mapper/YjxtKcxxMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.data.docking.mapper.YjxtKcxxMapper">
+
+</mapper>

+ 5 - 0
data-docking/src/main/resources/mapper/YjxtKsxxMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.data.docking.mapper.YjxtKsxxMapper">
+
+</mapper>

+ 14 - 0
teachcloud-exchange-common/src/main/java/com/qmth/teachcloud/exchange/common/contant/SystemConstant.java

@@ -38,6 +38,7 @@ public class SystemConstant {
     public static final String PREFIX_URL_GDPU_GET_BACK_LOG = "/getbacklog";
     public static final String PREFIX_URL_GDPU_MQ = "/open/mq";
     public static final String PREFIX_URL_ADMIN = "/admin";
+    public static final String PREFIX_URL_DATA_DOCKING = "/data/docking";
 
     /**
      * 系统常量
@@ -90,6 +91,19 @@ public class SystemConstant {
     public static final String SIGN = "sign";
     public static final String LOG_ERROR = "请求出错:{}";
 
+    /**
+     * 数据同步
+     */
+    public static final String KEY = "key";
+    public static final String SECRET = "secret";
+    public static final String ACCESS_TOKEN = "access_token";
+    public static final String PAGE = "page";
+    public static final String PER_PAGE = "per_page";
+    public static final String MAX_PAGE = "max_page";
+    public static final String TOTAL = "total";
+    public static final int MIN_QUERY_SIZE = 1;
+    public static final int MAX_QUERY_SIZE = 500;
+
     /**
      * http设置
      */

+ 57 - 0
teachcloud-exchange-common/src/main/java/com/qmth/teachcloud/exchange/common/enums/FieldUniqueEnum.java

@@ -0,0 +1,57 @@
+package com.qmth.teachcloud.exchange.common.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 唯一约束字段转换
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/13
+ */
+public enum FieldUniqueEnum {
+
+    t_s_token_unique("学校编码"),
+
+    YJXT_KCXX_UNIQUE("课程编码");
+
+    private String title;
+
+    private FieldUniqueEnum(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToName(String value) {
+        for (FieldUniqueEnum e : FieldUniqueEnum.values()) {
+            if (Objects.equals(value.trim(), e.getTitle())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 状态转换 toTitle
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToTitle(String value) {
+        for (FieldUniqueEnum e : FieldUniqueEnum.values()) {
+            if (value.trim().contains(e.name())) {
+                return e.getTitle();
+            }
+        }
+        return null;
+    }
+}

部分文件因为文件数量过多而无法显示