From 3402a6cdef63a87cf046a8bbfdc2898bb842c93f Mon Sep 17 00:00:00 2001
From: kongzy <kongzy>
Date: 星期六, 12 十月 2024 14:09:47 +0800
Subject: [PATCH] 新增学时证书
---
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThQuestionBank.java | 40 ++
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/utils/ValidatorUtils.java | 54 ++++
exam-system/src/main/resources/mapper/institutionaccess/ThCertMapper.xml | 27 ++
update.sql | 53 ++++
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThQuestionBankReqDTO.java | 52 +++
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/TripartiteInterfaceController.java | 14 +
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCert.java | 74 ++++++
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThCertServiceImpl.java | 60 +++++
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThCertMapper.java | 18 +
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThCertService.java | 41 +++
ruoyi-common/src/main/java/com/ruoyi/common/constant/ResultConstants.java | 1
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudytAuthReqDTO.java | 6
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThCertQuery.java | 20 +
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/TripartiteInterfaceServiceImpl.java | 142 ++++++++---
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCourseChapter.java | 3
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudyAuth.java | 6
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThCertController.java | 24 ++
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/TripartiteInterfaceService.java | 8
exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThCertReqDTO.java | 50 ++++
ruoyi-admin/src/main/resources/application-dev.yml | 4
20 files changed, 636 insertions(+), 61 deletions(-)
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThCertController.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThCertController.java
new file mode 100644
index 0000000..4bab197
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/ThCertController.java
@@ -0,0 +1,24 @@
+package com.gkhy.exam.institutionalaccess.controller;
+
+import com.gkhy.exam.institutionalaccess.model.query.ThCertQuery;
+import com.gkhy.exam.institutionalaccess.model.query.ThQuestionBankQuery;
+import com.gkhy.exam.institutionalaccess.service.ThCertService;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/th/cert")
+public class ThCertController extends BaseController {
+ @Autowired
+ private ThCertService certService;
+
+ @GetMapping("/page")
+ public TableDataInfo page(ThCertQuery query) {
+ startPage();
+ return getDataTable(this.certService.listByPage(query));
+ }
+}
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/TripartiteInterfaceController.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/TripartiteInterfaceController.java
index 1fe9fcb..88cc6e3 100644
--- a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/TripartiteInterfaceController.java
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/controller/TripartiteInterfaceController.java
@@ -31,7 +31,7 @@
@PostMapping("/question/bank")
@RepeatedClick
- public AjaxResult receiveQuestionBank(@RequestBody JSONObject jsonObject){
+ public AjaxResult receiveQuestionBank(@RequestBody JSONObject jsonObject) throws Exception {
return success(tripartiteInterfaceService.receiveQuestionBank(jsonObject));
}
@PostMapping("/course")
@@ -78,6 +78,18 @@
}
/**
+ * 学时证书推送
+ * @param jsonObject
+ * @return
+ */
+ @RepeatedClick
+ @PostMapping("/certs")
+ public AjaxResult receiveCerts(@RequestBody JSONObject jsonObject) throws Exception {
+ return tripartiteInterfaceService.receiveCerts(jsonObject);
+ }
+
+
+ /**
* 题库组卷
* @param args
*/
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCert.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCert.java
new file mode 100644
index 0000000..46740ec
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCert.java
@@ -0,0 +1,74 @@
+package com.gkhy.exam.institutionalaccess.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import nonapi.io.github.classgraph.json.Id;
+
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+
+@ApiModel("学时证书")
+@Data
+@TableName("th_cert")
+public class ThCert {
+ @Id
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ @ApiModelProperty("学时证书唯一标识")
+ private String uuid;
+
+ @ApiModelProperty("学员姓名")
+ private String name;
+
+ @ApiModelProperty("学员身份证号")
+ private String idcard;
+
+ @ApiModelProperty("批次标识")
+ private String batchUuid;
+
+ @ApiModelProperty("所属机构社会统一信用代码")
+ private String trainOrgName;
+
+ @ApiModelProperty("证书生成时间")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalTime certTime;
+
+ @ApiModelProperty("证书链接")
+ private String certUrl;
+
+ @ApiModelProperty("机构d")
+ private Long institutionId;
+
+ @ApiModelProperty("机构名称")
+ private String institutionName;
+
+ @ApiModelProperty("删除标识")
+ private Byte delFlag;
+
+ /** 创建者 */
+ private String createBy;
+
+ /** 创建时间 */
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime createTime;
+
+ /** 更新者 */
+ private String updateBy;
+
+ /** 更新时间 */
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private LocalDateTime updateTime;
+
+
+ @ApiModelProperty("批次名称")
+ @TableField(exist = false)
+ private String batchName;
+}
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCourseChapter.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCourseChapter.java
index 9f8718d..fd865f3 100644
--- a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCourseChapter.java
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThCourseChapter.java
@@ -29,6 +29,9 @@
private Long institutionId;
private String courseUuid;
+ //讲师
+ private String teacher;
+
//删除标志(0代表存在 2代表删除)
private Byte delFlag;
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThQuestionBank.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThQuestionBank.java
index 11e0eab..cf2e0e4 100644
--- a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThQuestionBank.java
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThQuestionBank.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
@@ -15,16 +16,39 @@
@Id
@TableId(type = IdType.AUTO)
private Long id;
+
+ @ApiModelProperty("题库uuid")
private String uuid;
- private Long institutionId;;
+
+ @ApiModelProperty("题库名称")
+ private String name;
+
+ @ApiModelProperty("机构id")
+ private Long institutionId;
+
+ @ApiModelProperty("机构名称")
private String institutionName;
- private int lastMonthCount;
- private int addCount;
- private int reduceCount;
- private BigDecimal brushRate;
- private BigDecimal assemblyRate;
- private String url;
- private String month;
+
+ @ApiModelProperty("题库题目总数")
+ private Integer totalCount;
+
+ @ApiModelProperty("单选题数量")
+ private Integer singleCount;
+
+ @ApiModelProperty("多选题数量")
+ private Integer multiCount;
+
+ @ApiModelProperty("判断题数量")
+ private Integer judgeCount;
+
+ @ApiModelProperty("简答题数量")
+ private Integer easyCount;
+
+ @ApiModelProperty("混合题数量")
+ private Integer mixCount;
+
+ @ApiModelProperty("其他数量")
+ private Integer otherCount;
//删除标志(0代表存在 2代表删除)
private Byte delFlag;
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudyAuth.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudyAuth.java
index 4a53bba..afff850 100644
--- a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudyAuth.java
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/entity/ThStudyAuth.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import nonapi.io.github.classgraph.json.Id;
@@ -25,4 +26,9 @@
private Byte faceType;
private String studyDetailUuid;
private String authVideo;
+
+ @ApiModelProperty("认证ip")
+ private String ip;
+ @ApiModelProperty("认证mac地址")
+ private String mac;
}
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThCertMapper.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThCertMapper.java
new file mode 100644
index 0000000..ab373e7
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/mapper/ThCertMapper.java
@@ -0,0 +1,18 @@
+package com.gkhy.exam.institutionalaccess.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gkhy.exam.institutionalaccess.entity.ThCert;
+import com.gkhy.exam.institutionalaccess.model.query.ThCertQuery;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface ThCertMapper extends BaseMapper<ThCert> {
+ /**
+ * 分页查询课时
+ * @param query
+ * @return
+ */
+ List<ThCert> listByPage(ThCertQuery query);
+}
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThCertQuery.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThCertQuery.java
new file mode 100644
index 0000000..53a8f87
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/query/ThCertQuery.java
@@ -0,0 +1,20 @@
+package com.gkhy.exam.institutionalaccess.model.query;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class ThCertQuery {
+ private String institutionName;
+
+ //证书生成开始时间
+ private LocalDateTime startTime;
+
+ //证书生成结束时间
+ private LocalDateTime endTime;
+
+ //机构代码
+ private String trainOrgName;
+
+}
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThCertReqDTO.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThCertReqDTO.java
new file mode 100644
index 0000000..596c32f
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThCertReqDTO.java
@@ -0,0 +1,50 @@
+package com.gkhy.exam.institutionalaccess.model.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Pattern;
+import java.time.LocalTime;
+
+
+@ApiModel("学时证书")
+@Data
+public class ThCertReqDTO {
+ @ApiModelProperty("学时证书唯一标识")
+ @NotBlank(message = "学时证书唯一标识不能为空")
+ @Pattern(regexp = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",message = "uuid格式不正确")
+ private String uuid;
+
+ @ApiModelProperty("学员姓名")
+ @NotBlank(message = "学员姓名不能为空")
+ private String name;
+
+ @ApiModelProperty("学员身份证号")
+ @NotBlank(message = "学员身份证号不能为空")
+ @Length(min = 18, max = 18, message = "身份证号能为18位")
+ private String idcard;
+
+ @ApiModelProperty("批次标识")
+ @NotBlank(message = "批次标识不能为空")
+ @Pattern(regexp = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",message = "批次标识格式不正确")
+ private String batchUuid;
+
+ @ApiModelProperty("所属机构社会统一信用代码")
+ @NotBlank(message = "机构社会统一信用代码不能为空")
+ private String trainOrgName;
+
+ @ApiModelProperty("证书生成时间")
+ @NotEmpty(message = "证书生成时间不能为空")
+ private LocalTime certTime;
+
+ @ApiModelProperty("证书链接")
+ @NotBlank(message = "证书链接不能为空")
+ private String certUrl;
+
+ @ApiModelProperty("删除标识")
+ private Byte delFlag;
+}
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThQuestionBankReqDTO.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThQuestionBankReqDTO.java
index 1197183..9bbeb95 100644
--- a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThQuestionBankReqDTO.java
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThQuestionBankReqDTO.java
@@ -1,20 +1,58 @@
package com.gkhy.exam.institutionalaccess.model.req;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Pattern;
import java.math.BigDecimal;
@Data
public class ThQuestionBankReqDTO {
+ @ApiModelProperty("题库uuid")
+ @NotBlank(message = "题库唯一标识不能为空")
+ @Pattern(regexp = "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",message = "uuid格式不正确")
private String uuid;
- private Integer lastMonthCount;
- private Integer addCount;
- private Integer reduceCount;
- private BigDecimal brushRate;
- private BigDecimal assemblyRate;
- private String url;
- private String month;
+
+ @NotBlank(message = "题库名称不能为空")
+ @ApiModelProperty("题库名称")
+ private String name;
+
+ @NotEmpty(message = "题库题目总数不能为空")
+ @Min(value = 0,message = "题库题目总数格式不正确")
+ @ApiModelProperty("题库题目总数")
+ private Integer totalCount;
+
+ @NotEmpty(message = "单选题数量不能为空")
+ @Min(value = 0,message = "单选题数量格式不正确")
+ @ApiModelProperty("单选题数量")
+ private Integer singleCount;
+
+ @NotEmpty(message = "多选题数量不能为空")
+ @Min(value = 0,message = "多选题数量格式不正确")
+ @ApiModelProperty("多选题数量")
+ private Integer multiCount;
+
+ @NotEmpty(message = "判断题数量不能为空")
+ @Min(value = 0,message = "判读题数量格式不正确")
+ @ApiModelProperty("判断题数量")
+ private Integer judgeCount;
+
+ @NotEmpty(message = "简答题数量不能为空")
+ @Min(value = 0,message = "简答题数量格式不正确")
+ @ApiModelProperty("简答题数量")
+ private Integer easyCount;
+
+ @ApiModelProperty("混合题数量")
+ private Integer mixCount;
+
+ @ApiModelProperty("其他题目数量")
+ private Integer otherCount;
+
+
//删除标志(0代表存在 2代表删除)
private Byte delFlag;
}
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudytAuthReqDTO.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudytAuthReqDTO.java
index 3e0595a..96e77f8 100644
--- a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudytAuthReqDTO.java
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/model/req/ThStudytAuthReqDTO.java
@@ -1,6 +1,7 @@
package com.gkhy.exam.institutionalaccess.model.req;
import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@@ -14,4 +15,9 @@
private LocalDateTime authTime;
private Byte faceType;
private String authVideo;
+
+ @ApiModelProperty("认证ip")
+ private String ip;
+ @ApiModelProperty("认证mac地址")
+ private String mac;
}
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThCertService.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThCertService.java
new file mode 100644
index 0000000..56420e2
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/ThCertService.java
@@ -0,0 +1,41 @@
+package com.gkhy.exam.institutionalaccess.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.exam.institutionalaccess.entity.ThCert;
+import com.gkhy.exam.institutionalaccess.entity.ThQuestionBank;
+import com.gkhy.exam.institutionalaccess.model.query.ThCertQuery;
+import com.gkhy.exam.institutionalaccess.model.query.ThQuestionBankQuery;
+
+import java.util.List;
+
+public interface ThCertService extends IService<ThCert> {
+ /**
+ * 根据uuid查询学时证书
+ * @param uuid
+ * @return
+ */
+ ThCert getCertByUuid(String uuid);
+
+ /**
+ * 分页查询学时证书
+ * @param query
+ * @return
+ */
+ List<ThCert> listByPage(ThCertQuery query);
+
+ /**
+ * 更新学时证书
+ * @param certList
+ * @return
+ */
+ Integer updateBatch(List<ThCert> certList);
+
+ /**
+ * 批量新增学时证书
+ * @param certList
+ * @return
+ */
+ Integer insertBatch(List<ThCert> certList);
+
+}
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/TripartiteInterfaceService.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/TripartiteInterfaceService.java
index d2ab937..84c21bc 100644
--- a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/TripartiteInterfaceService.java
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/TripartiteInterfaceService.java
@@ -5,7 +5,7 @@
import com.ruoyi.common.core.domain.AjaxResult;
public interface TripartiteInterfaceService {
- boolean receiveQuestionBank(JSONObject jsonObject);
+ boolean receiveQuestionBank(JSONObject jsonObject) throws Exception;
AjaxResult receiveCourse(JSONObject jsonObject);
@@ -23,4 +23,10 @@
AjaxResult receiveBatchEnd(JSONObject jsonObject);
+ /**
+ * 学时证书推送
+ * @param jsonObject
+ * @return
+ */
+ AjaxResult receiveCerts(JSONObject jsonObject) throws Exception;
}
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThCertServiceImpl.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThCertServiceImpl.java
new file mode 100644
index 0000000..2f0f0d9
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/ThCertServiceImpl.java
@@ -0,0 +1,60 @@
+package com.gkhy.exam.institutionalaccess.service.serviceImpl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.exam.institutionalaccess.entity.ThCert;
+import com.gkhy.exam.institutionalaccess.entity.ThQuestionBank;
+import com.gkhy.exam.institutionalaccess.mapper.ThCertMapper;
+import com.gkhy.exam.institutionalaccess.model.query.ThCertQuery;
+import com.gkhy.exam.institutionalaccess.service.ThCertService;
+import com.ruoyi.common.constant.ResultConstants;
+import com.ruoyi.common.enums.coalmineEnums.DeleteStatusEnum;
+import com.ruoyi.common.exception.BusinessException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service("ThCertService")
+public class ThCertServiceImpl extends ServiceImpl<ThCertMapper, ThCert> implements ThCertService {
+ @Autowired
+ private ThCertMapper certMapper;
+ @Override
+ public ThCert getCertByUuid(String uuid) {
+ return getOne(Wrappers.<ThCert>lambdaQuery()
+ .eq(true,ThCert::getUuid,uuid)
+ .last(" limit 1"));
+ }
+
+ @Override
+ public List<ThCert> listByPage(ThCertQuery query) {
+ List<ThCert> certs = certMapper.listByPage(query);
+ return certs;
+ }
+
+
+ @Transactional
+ @Override
+ public Integer updateBatch(List<ThCert> certList) {
+ boolean b= updateBatchById(certList);
+ if(b){
+ return certList.size();
+ }else{
+ throw new BusinessException(this.getClass(), ResultConstants.BUSINESS_ERROR,"学时证书更新失败");
+ }
+ }
+
+ @Transactional
+ @Override
+ public Integer insertBatch(List<ThCert> certList) {
+ boolean b = saveBatch(certList);
+ if(b){
+ return certList.size();
+ }else{
+ throw new BusinessException(this.getClass(), ResultConstants.BUSINESS_ERROR,"学时证书新增失败");
+ }
+ }
+
+}
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/TripartiteInterfaceServiceImpl.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/TripartiteInterfaceServiceImpl.java
index 4db8897..9bb6b63 100644
--- a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/TripartiteInterfaceServiceImpl.java
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/service/serviceImpl/TripartiteInterfaceServiceImpl.java
@@ -3,6 +3,7 @@
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.gkhy.exam.institutionalaccess.entity.*;
@@ -11,6 +12,7 @@
import com.gkhy.exam.institutionalaccess.model.resp.ThErrorDataRespDTO;
import com.gkhy.exam.institutionalaccess.model.vo.ThCourseChapterVO;
import com.gkhy.exam.institutionalaccess.service.*;
+import com.gkhy.exam.institutionalaccess.utils.ValidatorUtils;
import com.ruoyi.common.constant.ResultConstants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.InstitutionUser;
@@ -63,9 +65,11 @@
private ThBatchCourseChapterService batchCourseChapterService;
@Autowired
private ThSubjectTypeService subjectTypeService;
+ @Autowired
+ private ThCertService certService;
@Override
- public boolean receiveQuestionBank(JSONObject jsonObject) {
+ public boolean receiveQuestionBank(JSONObject jsonObject) throws Exception {
InstitutionUser institutionUser = ThreeInContextHolder.getContext();
String data = jsonObject.getString("data");
@@ -90,8 +94,11 @@
}
- //参数校验
- validateQuestion(questionBankReqDTO);
+ String valdateMessage=ValidatorUtils.validateFast(questionBankReqDTO);
+ if(!StringUtils.isEmpty(valdateMessage)){
+ throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,valdateMessage);
+ }
+
//根据uuid查询数据
ThQuestionBank qb = questionBankService.getQuestionInfoByUuid(questionBankReqDTO.getUuid());
boolean i = true;
@@ -102,19 +109,18 @@
qb.setUuid(questionBankReqDTO.getUuid());
qb.setInstitutionId(institutionUser.getId());
qb.setInstitutionName(institutionUser.getInstitutionalName());
- qb.setCreateTime(LocalDateTime.now());
- qb.setUpdateTime(LocalDateTime.now());
qb.setCreateBy(institutionUser.getInstitutionalName());
qb.setUpdateBy(institutionUser.getInstitutionalName());
- //qb.setDelFlag(DeleteStatusEnum.NO.getStatus());
i = questionBankService.save(qb);
}else {
//修改
BeanUtils.copyProperties(questionBankReqDTO, qb);
+ qb.setUpdateBy(institutionUser.getInstitutionalName());
i = questionBankService.updateById(qb);
}
return i;
}
+
@Transactional
@Override
public AjaxResult receiveCourse(JSONObject jsonObject) {
@@ -1848,6 +1854,94 @@
return AjaxResult.success();
}
+ @Override
+ public AjaxResult receiveCerts(JSONObject jsonObject) throws Exception {
+ InstitutionUser institutionUser = ThreeInContextHolder.getContext();
+ String data = jsonObject.getString("data");
+ if(StringUtils.isEmpty(data)){
+ throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
+ }
+ //解密
+ String decrypt = "";
+ try {
+ decrypt = AESUtils.decrypt(data);
+ }catch (Exception e){
+ throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL);
+ }
+ //反序列化
+ List<ThCertReqDTO> thCertReqDTOs = null;
+ try {
+ thCertReqDTOs = JSONObject.parseObject(decrypt, new TypeReference<List<ThCertReqDTO>>() {});
+ }catch (Exception e){
+ logger.error("学时证书反序列化失败!");
+ throw new BusinessException(this.getClass(), ResultConstants.SERIALIZE_ERROR);
+ }
+ if(thCertReqDTOs.isEmpty() ||thCertReqDTOs.size()>50){
+ throw new BusinessException(this.getClass(), ResultConstants.RECORD_OVER_MAX);
+ }
+
+ //错误
+ List<ThErrorDataRespDTO> errorDataRespDTOS = new ArrayList<>();
+ List<ThCertReqDTO> saveCertReqDTOList = new ArrayList<>();
+ List<String> batchUuidList=thCertReqDTOs.stream().map(ThCertReqDTO::getBatchUuid).filter(batchUuid -> !StringUtils.isEmpty(batchUuid)).distinct().collect(Collectors.toList());
+ //获取批次
+ List<ThBatch> batchList = batchService.getByUuids(batchUuidList);
+
+ for(ThCertReqDTO thCertReqDTO : thCertReqDTOs){
+ String validateMessage=ValidatorUtils.validateFast(thCertReqDTO);
+ if(!StringUtils.isEmpty(validateMessage)){
+ errorDataRespDTOS.add(new ThErrorDataRespDTO(thCertReqDTO.getUuid(),validateMessage));
+ continue;
+ }
+ List<ThBatch> collect = batchList.stream().filter(batchCourse -> batchCourse.getUuid().equals(thCertReqDTO.getBatchUuid())).collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(collect)) {
+ errorDataRespDTOS.add(new ThErrorDataRespDTO(thCertReqDTO.getUuid(), "批次(班级)不存在,请先添加批次(班级)"));
+ continue;
+ }
+ saveCertReqDTOList.add(thCertReqDTO);
+ }
+
+ List<ThCert> saveCertList = new ArrayList<>();
+ List<ThCert> updateCertList = new ArrayList<>();
+ for (ThCertReqDTO thCertReqDTO : saveCertReqDTOList) {
+ ThCert cert=certService.getCertByUuid(thCertReqDTO.getUuid());
+ if (cert!=null) {
+ //修改
+ BeanUtils.copyProperties(thCertReqDTO, cert);
+ cert.setUpdateBy(institutionUser.getInstitutionalName());
+ cert.setUpdateTime(LocalDateTime.now());
+ cert.setInstitutionId(institutionUser.getId());
+ cert.setInstitutionName(institutionUser.getInstitutionalName());
+ updateCertList.add(cert);
+ } else {
+ //新增
+ cert = new ThCert();
+ BeanUtils.copyProperties(thCertReqDTO, cert);
+ cert.setId(IdUtil.getSnowflake(0, 0).nextId());
+ cert.setUpdateBy(institutionUser.getInstitutionalName());
+ cert.setUpdateTime(LocalDateTime.now());
+ cert.setCreateBy(institutionUser.getInstitutionalName());
+ cert.setCreateTime(LocalDateTime.now());
+ cert.setInstitutionId(institutionUser.getId());
+ cert.setInstitutionName(institutionUser.getInstitutionalName());
+ cert.setDelFlag(DeleteStatusEnum.NO.getStatus());
+ saveCertList.add(cert);
+ }
+ }
+ //课时证书表新增
+ if(!saveCertList.isEmpty()){
+ certService.insertBatch(saveCertList);
+ }
+ //课时证书表更新
+ if(!updateCertList.isEmpty()) {
+ certService.updateBatch(updateCertList);
+ }
+ return AjaxResult.success(errorDataRespDTOS);
+ }
+
+ private void validate(){
+
+ }
private void validateStudyDetail(ThStudyDetailReqDTO studentDetailReqDTO) {
@@ -2075,43 +2169,7 @@
}
- /**
- * 校验题库组卷数据
- * @param questionBankReqDTO
- */
- private void validateQuestion(ThQuestionBankReqDTO questionBankReqDTO){
- if(questionBankReqDTO == null){
- throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_ERROR);
- }
- if(StringUtils.isEmpty(questionBankReqDTO.getUuid()) || !UUID.checkIsUuid(questionBankReqDTO.getUuid())){
- throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"题库组卷uuid不符合规范");
- }
- if(StringUtils.isEmpty(questionBankReqDTO.getUrl())){
- throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"题库组卷预览路径不可为空");
- }
- if(questionBankReqDTO.getLastMonthCount() == null){
- throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"上月题库总题目数不可为空");
- }
- if(questionBankReqDTO.getAddCount() == null){
- throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"新增题目数不可为空");
- }
- if(questionBankReqDTO.getReduceCount() == null){
- throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"减少题目数不可为空");
- }
- if(questionBankReqDTO.getBrushRate() == null){
- throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"刷题应用率不可为空");
- }
- if(questionBankReqDTO.getAssemblyRate() == null){
- throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"组卷应用率不可为空");
- }
- if(questionBankReqDTO.getMonth() == null){
- throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"年月不可为空");
- }
- if(questionBankReqDTO.getDelFlag() == null || DeleteStatusEnum.getDeleteStatusEnum(questionBankReqDTO.getDelFlag()) == null ){
- throw new BusinessException(this.getClass(), ResultConstants.THREE_INSTITUTION_PARAMM_NULL,"删除标识不符合规范");
- }
- }
private String generateSerialNum() {
Long count = studyDetailService.getCount();
String strCount = count.toString();
diff --git a/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/utils/ValidatorUtils.java b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/utils/ValidatorUtils.java
new file mode 100644
index 0000000..9e79a55
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/institutionalaccess/utils/ValidatorUtils.java
@@ -0,0 +1,54 @@
+package com.gkhy.exam.institutionalaccess.utils;
+
+import org.hibernate.validator.HibernateValidator;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+public class ValidatorUtils {
+
+ private static Validator validatorFast= Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();
+ private static Validator validatorAll= Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory().getValidator();
+
+ /**
+ * 校验遇到第一个不合法的字段直接返回不合法信息,后续字段不再校验
+ * @param domain
+ * @return
+ * @param <T>
+ * @throws Exception
+ */
+ public static <T> String validateFast(T domain) throws Exception{
+ Set<ConstraintViolation<T>> validateResult=validatorFast.validate(domain);
+ if(!validateResult.isEmpty()){
+ return validateResult.iterator().next().getPropertyPath()+":"+validateResult.iterator().next().getMessage();
+ }
+ return "";
+ }
+
+ /**
+ * 校验所有字段并返回不合法字段信息
+ * @param domain
+ * @return
+ * @param <T>
+ * @throws Exception
+ */
+ public static <T> List<String> validateAll(T domain) throws Exception{
+ List<String> messages=new ArrayList<>();
+ Set<ConstraintViolation<T>> validateResult=validatorAll.validate(domain);
+ if(!validateResult.isEmpty()){
+ Iterator<ConstraintViolation<T>> it=validateResult.iterator();
+ while (it.hasNext()){
+ ConstraintViolation<T> cv=it.next();
+ messages.add(cv.getPropertyPath()+":"+cv.getMessage());
+ }
+ }
+ return messages;
+ }
+
+
+}
diff --git a/exam-system/src/main/resources/mapper/institutionaccess/ThCertMapper.xml b/exam-system/src/main/resources/mapper/institutionaccess/ThCertMapper.xml
new file mode 100644
index 0000000..23e8467
--- /dev/null
+++ b/exam-system/src/main/resources/mapper/institutionaccess/ThCertMapper.xml
@@ -0,0 +1,27 @@
+<?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.gkhy.exam.institutionalaccess.mapper.ThCertMapper">
+
+ <select id="listByPage" resultType="com.gkhy.exam.institutionalaccess.entity.ThCert"
+ parameterType="com.gkhy.exam.institutionalaccess.model.query.ThCertQuery">
+ select a.*,b.batch_name from th_cert a
+ left join th_batch b on a.batch_uuid=b.uuid
+ <where>
+ and a.del_flag=0
+ <if test="institutionName!=null and institutionName!=''">
+ and a.institution_name =#{institutionName}
+ </if>
+ <if test="startTime!=null and startTime!=''">
+ and a.cert_ime >= #{startTime}
+ </if>
+ <if test="endTime!=null and endTime!=''">
+ and a.cert_ime <= #{endTime}
+ </if>
+ <if test="trainOrgName!=null and trainOrgName!=''">
+ and a.train_org_name =#{trainOrgName}
+ </if>
+ </where>
+ order by a.create_time desc
+ </select>
+</mapper>
+
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 2fd873e..c028c4b 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -24,9 +24,9 @@
druid:
# 主库数据源
master:
- url: jdbc:mysql://localhost:3306/swspkmas?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
+ url: jdbc:mysql://192.168.2.16:7006/swspkmas?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
- password: root
+ password: 2farwL3yPXfbH2AP
# 从库数据源
slave:
# 从数据源开关/默认关闭
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/ResultConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/ResultConstants.java
index b043cfa..6147017 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/ResultConstants.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/ResultConstants.java
@@ -64,6 +64,7 @@
BATCH_STUDENT_IS_NOT_EXIST(1014,"该学生培训信息不存在"),
BATCH_IS_OPEN_NO_DELETE(1015,"批次(班级)已开班或已结束,不可删除"),
THREE_INSTITUTION_OTHER_ERROR(1016,"业务错误"),
+ RECORD_OVER_MAX(1017,"数据条目量超过最大值"),
;
diff --git a/update.sql b/update.sql
new file mode 100644
index 0000000..0587aa5
--- /dev/null
+++ b/update.sql
@@ -0,0 +1,53 @@
+ALTER TABLE `swspkmas`.`th_study_auth`
+ADD COLUMN `ip` varchar(30) NULL,
+ADD COLUMN `max` varchar(40) NULL;
+
+CREATE TABLE `swspkmas`.`tr_cert` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`uuid` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+`name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+`idcard` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+`institution_id` bigint NOT NULL,
+`institution_name` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+`batch_uuid` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+`del_flag` tinyint NOT NULL DEFAULT 0,
+`train_org_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+`cert_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+`cert_time` datetime NOT NULL,
+`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+`create_by` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+`update_by` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+PRIMARY KEY (`id`) USING BTREE,
+UNIQUE INDEX `index_uuid`(`uuid`) USING BTREE,
+INDEX `index_idcard`(`idcard`) USING BTREE,
+INDEX `index_batchuuid`(`batch_uuid`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
+
+
+ALTER TABLE `swspkmas`.`th_course_chapter`
+ADD COLUMN `teacher` varchar(50) NULL COMMENT '讲师';
+
+
+drop table if exists `swspkmas`.`th_question_bank`;
+CREATE TABLE `swspkmas`.`th_question_bank` (
+`id` bigint NOT NULL AUTO_INCREMENT,
+`uuid` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+`institution_id` bigint NOT NULL,
+`institution_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+`total_count` int NOT NULL COMMENT '题库题目总数量',
+`single_count` int NOT NULL COMMENT '单选题题目数量',
+`multi_count` int NOT NULL COMMENT '多选题题目数量',
+`judge_count` int NOT NULL COMMENT '判断题题目数量',
+`easy_count` int NOT NULL COMMENT '简答题题目数量',
+`mix_count` int NOT NULL COMMENT '混合题题目数量',
+`other_count` int NOT NULL COMMENT '其他数量',
+`del_flag` tinyint NOT NULL DEFAULT 0,
+`create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP,
+`create_by` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+`update_by` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
+`update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+PRIMARY KEY (`id`) USING BTREE,
+UNIQUE INDEX `index_uuid`(`uuid`) USING BTREE,
+INDEX `index_institution_id`(`institution_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
--
Gitblit v1.9.2