yangdamao 2 years ago
parent
commit
ed4a0a4b39
100 changed files with 3824 additions and 0 deletions
  1. BIN
      zhongzheng-admin-data/.mvn/wrapper/maven-wrapper.jar
  2. 2 0
      zhongzheng-admin-data/.mvn/wrapper/maven-wrapper.properties
  3. BIN
      zhongzheng-admin-data/src/main/resources/config/1342013901/apiclient_cert.p12
  4. BIN
      zhongzheng-admin-data/src/main/resources/config/1637492608/apiclient_cert.p12
  5. BIN
      zhongzheng-admin-data/src/main/resources/config/1640084970/apiclient_cert.p12
  6. 7 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/CommonController.java
  7. BIN
      zhongzheng-admin/src/main/resources/zhiyuan1689758857592/【建筑】2023年二建黄金卷(二)(1).docx
  8. BIN
      zhongzheng-admin/src/main/resources/zhiyuan1690785560230/法规——黄金卷.zip
  9. 111 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/TopSysRole.java
  10. 46 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/JavaMailUtils.java
  11. 138 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/bank/DCCryptor.java
  12. 169 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/bank/DCHelper.java
  13. 61 0
      zhongzheng-common/src/main/java/com/zhongzheng/common/utils/bank/GENKey.java
  14. BIN
      zhongzheng-common/src/main/resources/static/001.png
  15. BIN
      zhongzheng-common/src/main/resources/static/0020.jpg
  16. BIN
      zhongzheng-common/src/main/resources/static/0024.jpg
  17. BIN
      zhongzheng-common/src/main/resources/static/0030.jpg
  18. BIN
      zhongzheng-common/src/main/resources/static/00312.jpg
  19. BIN
      zhongzheng-common/src/main/resources/static/0033.jpg
  20. BIN
      zhongzheng-common/src/main/resources/static/004.jpg
  21. BIN
      zhongzheng-common/src/main/resources/static/005.jpg
  22. BIN
      zhongzheng-common/src/main/resources/static/0051.jpg
  23. BIN
      zhongzheng-common/src/main/resources/static/006.jpg
  24. BIN
      zhongzheng-common/src/main/resources/static/2323.jpg
  25. 82 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineInnerInterceptor.java
  26. 120 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/FindInSetExpression.java
  27. 137 0
      zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserLoginKeyServiceImpl.java
  28. 46 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/bo/QuestionOtherAddBo.java
  29. 52 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/bo/QuestionOtherEditBo.java
  30. 49 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/bo/QuestionOtherQueryBo.java
  31. 41 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/domain/QuestionOld.java
  32. 36 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/domain/QuestionOldChild.java
  33. 28 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/domain/QuestionOldOptions.java
  34. 48 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/domain/QuestionOther.java
  35. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/mapper/QuestionOtherMapper.java
  36. 55 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionOtherService.java
  37. 305 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionOtherServiceImpl.java
  38. 27 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionChildTopicVo.java
  39. 20 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionChildVo.java
  40. 28 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionDetailVo.java
  41. 25 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionVo.java
  42. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionDetailVo.java
  43. 27 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionInfoVo.java
  44. 51 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionOtherVo.java
  45. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/ExternalQuestionBo.java
  46. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/QuestionOpenBo.java
  47. 25 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/ReplenishExamBo.java
  48. 38 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/ExternalQuestionVo.java
  49. 28 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/ReplenishExamVo.java
  50. 47 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdExamRoomBo.java
  51. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdExamRoomUpdateBo.java
  52. 66 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdUserSubscribeBo.java
  53. 23 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyDetailBo.java
  54. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyResultBo.java
  55. 51 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyResultExportBo.java
  56. 118 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyRoomQueryBo.java
  57. 39 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySendmailBo.java
  58. 54 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySubscribeBo.java
  59. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyUserImportBo.java
  60. 19 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamBeforeKnowBo.java
  61. 24 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/SubscribeInfoBo.java
  62. 32 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/UpdateStudentImageBo.java
  63. 30 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamApplyDetailVo.java
  64. 57 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamApplyPlaceVo.java
  65. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamApplyUserDetailVo.java
  66. 19 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamBeforeKnowVo.java
  67. 26 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamSessionVo.java
  68. 30 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/AlikeGoodsBo.java
  69. 38 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsFirstChoiceAddBo.java
  70. 25 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsHandoutsCopyTenantBo.java
  71. 33 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsNodeCopyTenantBo.java
  72. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsQuestionRelExamAddBo.java
  73. 53 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsQuestionRelExamEditBo.java
  74. 57 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsQuestionRelExamQueryBo.java
  75. 19 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionChapterJsonBo.java
  76. 24 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionContentJsonBo.java
  77. 19 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionDetailJsonBo.java
  78. 17 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionJsonBo.java
  79. 19 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionModuleJsonBo.java
  80. 33 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionOpenImportBo.java
  81. 45 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/GoodsQuestionRel.java
  82. 47 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/GoodsQuestionRelExam.java
  83. 41 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/QuestionMerchant.java
  84. 15 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsQuestionRelExamMapper.java
  85. 13 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsQuestionRelMapper.java
  86. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/QuestionMerchantMapper.java
  87. 55 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsQuestionRelExamService.java
  88. 22 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsQuestionRelService.java
  89. 15 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IQuestionMerchantService.java
  90. 202 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsQuestionRelExamServiceImpl.java
  91. 18 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsQuestionRelServiceImpl.java
  92. 18 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/QuestionMerchantServiceImpl.java
  93. 51 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsQuestionRelExamVo.java
  94. 19 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsSectionNumVo.java
  95. 16 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/QuestionOpenImportVo.java
  96. 25 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/UserNewGoodsVo.java
  97. 53 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/UserOrderGoodsListVo.java
  98. 31 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeDecryptQueryBo.java
  99. 39 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClientPostAddBo.java
  100. 44 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/CreateSameClassBo.java

BIN
zhongzheng-admin-data/.mvn/wrapper/maven-wrapper.jar


+ 2 - 0
zhongzheng-admin-data/.mvn/wrapper/maven-wrapper.properties

@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.3/apache-maven-3.9.3-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar

BIN
zhongzheng-admin-data/src/main/resources/config/1342013901/apiclient_cert.p12


BIN
zhongzheng-admin-data/src/main/resources/config/1637492608/apiclient_cert.p12


BIN
zhongzheng-admin-data/src/main/resources/config/1640084970/apiclient_cert.p12


+ 7 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/CommonController.java

@@ -12,6 +12,7 @@ import com.zhongzheng.common.utils.file.FileUploadUtils;
 import com.zhongzheng.common.utils.file.FileUtils;
 import com.zhongzheng.framework.config.ServerConfig;
 import com.zhongzheng.modules.alioss.bo.FileHandleBo;
+import com.zhongzheng.modules.user.bo.UserDownloadBo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -198,4 +199,10 @@ public class CommonController extends BaseController {
         }
     }
 
+    @PostMapping("/common/user/data/download")
+    public AjaxResult userDateDownload(@RequestBody UserDownloadBo bo){
+
+        return AjaxResult.success();
+    }
+
 }

BIN
zhongzheng-admin/src/main/resources/zhiyuan1689758857592/【建筑】2023年二建黄金卷(二)(1).docx


BIN
zhongzheng-admin/src/main/resources/zhiyuan1690785560230/法规——黄金卷.zip


+ 111 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/TopSysRole.java

@@ -0,0 +1,111 @@
+package com.zhongzheng.common.core.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.springframework.beans.factory.annotation.Value;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 角色信息对象 top_sys_role
+ *
+ * @author ruoyi
+ * @date 2023-03-10
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("top_sys_role")
+public class TopSysRole implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** 角色ID */
+    @TableId(value = "role_id")
+    private Long roleId;
+    /** 角色名称 */
+    private String roleName;
+    /** 角色权限字符串 */
+    private String roleKey;
+    /** 显示顺序 */
+    private Long roleSort;
+    /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限) */
+    @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限")
+    private String dataScope;
+
+    @Value("true")
+    /** 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */
+    private boolean menuCheckStrictly;
+
+    @Value("true")
+    /** 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) */
+    private boolean deptCheckStrictly;
+    /** 角色状态(1正常 0停用) */
+    private String status;
+    /** 删除标志(0代表存在 2代表删除) */
+    @TableLogic
+    private String delFlag;
+    /** 创建者 */
+    @TableField(fill = FieldFill.INSERT)
+    private String createBy;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+    /** 更新者 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateBy;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+    /** 备注 */
+    private String remark;
+    /**
+     * 请求参数
+     */
+    @TableField(exist = false)
+    private Map<String, Object> params = new HashMap<>();
+
+    /** 用户是否存在此角色标识 默认不存在 */
+    @TableField(exist = false)
+    private boolean flag = false;
+
+    /** 菜单组 */
+    @ApiModelProperty(value ="菜单数组")
+    @TableField(exist = false)
+    private Long[] menuIds;
+
+
+
+    /** 部门组(数据权限) */
+    @TableField(exist = false)
+    private Long[] deptIds;
+
+    @TableField(exist = false)
+    private List<String> statusArray;
+    /** 业务层次ID */
+    @TableField(exist = false)
+    private List<Long> businessIds;
+
+    public TopSysRole(Long roleId)
+    {
+        this.roleId = roleId;
+    }
+
+    public boolean isAdmin()
+    {
+        return isAdmin(this.roleId);
+    }
+
+    public static boolean isAdmin(Long roleId)
+    {
+        return roleId != null && 1L == roleId;
+    }
+}

+ 46 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/JavaMailUtils.java

@@ -0,0 +1,46 @@
+package com.zhongzheng.common.utils;
+
+
+import javax.mail.Authenticator;
+import javax.mail.PasswordAuthentication;
+import javax.mail.Session;
+import java.util.Properties;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月19日 10:11
+ */
+public class JavaMailUtils {
+
+    public static Session createsession(String postAccount,String postPassword,String STMPserver,String post) {
+        // SMTP服务器地址
+        String smtp = STMPserver;
+
+        // 邮箱账号和密码(授权密码)
+        String userName = postAccount;
+        String password = postPassword;
+
+        // SMTP服务器的连接信息
+        Properties props = new Properties();
+        props.put("mail.smtp.host", smtp); // SMTP主机号
+        props.put("mail.smtp.port", post); // 主机端口号
+        props.put("mail.smtp.auth", "true"); // 是否需要认证
+        props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
+        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
+
+        // 创建Session
+        // 参数1:SMTP服务器的连接信息
+        // 参数2:用户认证对象(Authenticator接口的匿名实现类)
+        Session session = Session.getInstance(props, new Authenticator() {
+            @Override
+            protected PasswordAuthentication getPasswordAuthentication() {
+                return new PasswordAuthentication(userName, password);
+            }
+        });
+
+        // 开启调试模式
+        session.setDebug(true);
+
+        return session;
+    }
+}

+ 138 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/bank/DCCryptor.java

@@ -0,0 +1,138 @@
+package com.zhongzheng.common.utils.bank;
+
+import org.bouncycastle.asn1.*;
+import org.bouncycastle.crypto.params.ECDomainParameters;
+import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
+import org.bouncycastle.crypto.params.ECPublicKeyParameters;
+import org.bouncycastle.crypto.params.ParametersWithID;
+import org.bouncycastle.crypto.signers.SM2Signer;
+import org.bouncycastle.jce.ECNamedCurveTable;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.jce.spec.ECParameterSpec;
+import org.bouncycastle.math.ec.ECPoint;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.ByteArrayInputStream;
+import java.math.BigInteger;
+import java.security.Security;
+import java.util.Enumeration;
+
+/**
+ * 示例代码,仅供参考
+ */
+public class DCCryptor {
+
+    static {
+        Security.addProvider(new BouncyCastleProvider());
+    }
+
+    public static byte[] CMBSM4EncryptWithCBC(byte key[], byte iv[], byte input[]) throws Exception {
+        if (key == null || iv == null || input == null) {
+            throw new Exception("CMBSM4EncryptWithCBC 非法输入");
+        }
+        return CMBSM4Crypt(key, iv, input, 1);
+    }
+
+    public static byte[] CMBSM4DecryptWithCBC(byte key[], byte iv[], byte input[]) throws Exception {
+        if (key == null || iv == null || input == null) {
+            throw new Exception("CMBSM4DecryptWithCBC 非法输入");
+        }
+        return CMBSM4Crypt(key, iv, input, 2);
+    }
+
+    public static byte[] CMBSM2SignWithSM3(byte[] id, byte privkey[], byte msg[]) throws Exception {
+        if (privkey == null || msg == null) {
+            throw new Exception("CMBSM2SignWithSM3 input error");
+        }
+        ECPrivateKeyParameters privateKey = encodePrivateKey(privkey);
+        SM2Signer signer = new SM2Signer();
+        ParametersWithID parameters = new ParametersWithID(privateKey, id);
+        signer.init(true, parameters);
+        signer.update(msg, 0, msg.length);
+        return decodeDERSignature(signer.generateSignature());
+    }
+
+    public static boolean CMBSM2VerifyWithSM3(byte[] id, byte pubkey[], byte msg[], byte signature[]) throws Exception {
+
+        if (pubkey == null || msg == null || signature == null) {
+            throw new Exception("CMBSM2VerifyWithSM3 input error");
+        }
+        ECPublicKeyParameters publicKey = encodePublicKey(pubkey);
+        SM2Signer signer = new SM2Signer();
+        ParametersWithID parameters = new ParametersWithID(publicKey, id);
+        signer.init(false, parameters);
+        signer.update(msg, 0, msg.length);
+        return signer.verifySignature(encodeDERSignature(signature));
+    }
+
+    private static byte[] CMBSM4Crypt(byte key[], byte iv[], byte input[], int mode) throws Exception {
+        SecretKeySpec spec = new SecretKeySpec(key, "SM4");
+        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
+        Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS7Padding", BouncyCastleProvider.PROVIDER_NAME);
+        cipher.init(mode, spec, ivParameterSpec);
+        return cipher.doFinal(input);
+    }
+
+    private static ECPrivateKeyParameters encodePrivateKey(byte[] value) {
+        BigInteger d = new BigInteger(1, value);
+        ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1");
+        ECDomainParameters ecParameters = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed());
+        return new ECPrivateKeyParameters(d, ecParameters);
+    }
+
+    public static ECPublicKeyParameters encodePublicKey(byte[] value) {
+        byte[] x = new byte[32];
+        byte[] y = new byte[32];
+        System.arraycopy(value, 1, x, 0, 32);
+        System.arraycopy(value, 33, y, 0, 32);
+        BigInteger X = new BigInteger(1, x);
+        BigInteger Y = new BigInteger(1, y);
+        ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1");
+        ECPoint Q = spec.getCurve().createPoint(X, Y);
+        ECDomainParameters ecParameters = new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed());
+        return new ECPublicKeyParameters(Q, ecParameters);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static byte[] decodeDERSignature(byte[] signature) throws Exception {
+        ASN1InputStream stream = new ASN1InputStream(new ByteArrayInputStream(signature));
+        ASN1Sequence primitive = (ASN1Sequence) stream.readObject();
+        Enumeration<ASN1Integer> enumeration = primitive.getObjects();
+        BigInteger R = enumeration.nextElement().getValue();
+        BigInteger S = enumeration.nextElement().getValue();
+        byte[] bytes = new byte[64];
+        byte[] r = format(R.toByteArray());
+        byte[] s = format(S.toByteArray());
+        System.arraycopy(r, 0, bytes, 0, 32);
+        System.arraycopy(s, 0, bytes, 32, 32);
+        return bytes;
+    }
+
+    private static byte[] encodeDERSignature(byte[] signature) throws Exception {
+        byte[] r = new byte[32];
+        byte[] s = new byte[32];
+        System.arraycopy(signature, 0, r, 0, 32);
+        System.arraycopy(signature, 32, s, 0, 32);
+        ASN1EncodableVector vector = new ASN1EncodableVector();
+        vector.add(new ASN1Integer(new BigInteger(1, r)));
+        vector.add(new ASN1Integer(new BigInteger(1, s)));
+        return (new DERSequence(vector)).getEncoded();
+    }
+
+    private static byte[] format(byte[] value) {
+        if (value.length == 32) {
+            return value;
+        } else {
+            byte[] bytes = new byte[32];
+            if (value.length > 32) {
+                System.arraycopy(value, value.length - 32, bytes, 0, 32);
+            } else {
+                System.arraycopy(value, 0, bytes, 32 - value.length, value.length);
+            }
+            return bytes;
+        }
+    }
+
+}

+ 169 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/bank/DCHelper.java

@@ -0,0 +1,169 @@
+package com.zhongzheng.common.utils.bank;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+
+import javax.net.ssl.*;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.KeyStore;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 示例代码,仅供参考
+ * 本示例中用到的(HttpUrlConnection)存在不遵循RFC协议的重试机制,请在启动参数中将sun.net.http.retryPost参数设置为false,禁用重发。
+ */
+public class DCHelper {
+
+    public static String serialJsonOrdered(JsonObject json) throws Exception {
+        StringBuilder appender = new StringBuilder();
+        appender.append("{");
+        Iterator<String> keys = new TreeSet<>(json.keySet()).iterator();
+        boolean isFirstEle = true;
+        while (keys.hasNext()) {
+            if (!isFirstEle) {
+                appender.append(",");
+            }
+            String key = keys.next();
+            Object val = json.get(key);
+            if (val instanceof JsonObject) {
+                appender.append("\"").append(key).append("\":");
+                appender.append(serialJsonOrdered((JsonObject) val));
+            } else if (val instanceof JsonArray) {
+                JsonArray jarray = (JsonArray) val;
+                appender.append("\"").append(key).append("\":[");
+                boolean isFirstArrEle = true;
+                for (int i = 0; i < jarray.size(); i++) {
+                    if (!isFirstArrEle) {
+                        appender.append(",");
+                    }
+                    Object obj = jarray.get(i);
+                    if (obj instanceof JsonObject) {
+                        appender.append(serialJsonOrdered((JsonObject) obj));
+                    } else {
+                        appender.append(obj.toString());
+                    }
+                    isFirstArrEle = false;
+                }
+                appender.append("]");
+            } else {
+                String value = val.toString();
+                appender.append("\"").append(key).append("\":").append(value);
+            }
+            isFirstEle = false;
+        }
+        appender.append("}");
+        return appender.toString();
+    }
+
+    public static String getTime() {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+        return dateFormat.format(new Date());
+    }
+
+    public static String doPostForm(String httpUrl, Map<String, String> param) throws Exception {
+        HttpURLConnection connection = null;
+        InputStream is = null;
+        OutputStream os = null;
+        BufferedReader br = null;
+        String result = null;
+        try {
+            URL url = new URL(httpUrl);
+            SSLContext sslcontext;
+            sslcontext = SSLContext.getInstance("SSL");
+            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+            tmf.init((KeyStore) null);
+            X509TrustManager defaultTm = null;
+            for (TrustManager tm : tmf.getTrustManagers()) {
+                if (tm instanceof X509TrustManager) {
+                    defaultTm = (X509TrustManager) tm;
+                    break;
+                }
+            }
+            sslcontext.init(null, new TrustManager[] { defaultTm }, new java.security.SecureRandom());
+            HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
+
+            connection = (HttpURLConnection) url.openConnection();
+            connection.setRequestMethod("POST");
+            connection.setConnectTimeout(15000);
+            connection.setReadTimeout(60000);
+            connection.setInstanceFollowRedirects(true);
+
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+
+            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+            os = connection.getOutputStream();
+            os.write(createLinkString(param).getBytes());
+            if (connection.getResponseCode() != 200) {
+                is = connection.getErrorStream();
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuilder sbf = new StringBuilder();
+                String temp = null;
+                while ((temp = br.readLine()) != null) {
+                    sbf.append(temp);
+                    sbf.append("\r\n");
+                }
+                result = sbf.toString();
+            } else {
+                is = connection.getInputStream();
+                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+                StringBuilder sbf = new StringBuilder();
+                String temp = null;
+                boolean firstLine = true;
+                while ((temp = br.readLine()) != null) {
+                    if (!firstLine) {
+                        firstLine = false;
+                        sbf.append("\r\n");
+                    }
+                    sbf.append(temp);
+                }
+                result = sbf.toString();
+            }
+        } finally {
+            if (null != br) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != os) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != is) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            connection.disconnect();
+        }
+        return result;
+    }
+
+    private static String createLinkString(Map<String, String> params) throws Exception {
+        ArrayList<String> keys = new ArrayList<>(params.keySet());
+        Collections.sort(keys);
+
+        StringBuilder prestr = new StringBuilder();
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = params.get(key);
+            if (i == keys.size() - 1) {
+                prestr.append(key).append("=").append(value);
+            } else {
+                prestr.append(key).append("=").append(value).append("&");
+            }
+        }
+        return prestr.toString();
+    }
+
+}

+ 61 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/bank/GENKey.java

@@ -0,0 +1,61 @@
+package com.zhongzheng.common.utils.bank;
+
+import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
+import org.bouncycastle.crypto.params.ECDomainParameters;
+import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
+import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
+import org.bouncycastle.crypto.params.ECPublicKeyParameters;
+import org.bouncycastle.jce.ECNamedCurveTable;
+import org.bouncycastle.jce.spec.ECParameterSpec;
+import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
+
+import java.math.BigInteger;
+import java.security.SecureRandom;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+
+public class GENKey {
+
+    private static ECDomainParameters getECDomainParameters() {
+        ECParameterSpec spec = ECNamedCurveTable.getParameterSpec("sm2p256v1");
+        return new ECDomainParameters(spec.getCurve(), spec.getG(), spec.getN(), spec.getH(), spec.getSeed());
+    }
+
+
+    /**
+     * 生成国密密钥对
+     *
+     * @return
+     */
+    public static Map<String, byte[]> CMBSM2KeyGen() {
+        ECDomainParameters domainParameters = getECDomainParameters();
+        ECKeyPairGenerator generator = new ECKeyPairGenerator();
+        ECKeyGenerationParameters parameters = new ECKeyGenerationParameters(domainParameters, new SecureRandom());
+        generator.init(parameters);
+        AsymmetricCipherKeyPair keyPair = generator.generateKeyPair();
+        ECPublicKeyParameters publicKeyParameters = (ECPublicKeyParameters) keyPair.getPublic();
+        ECPrivateKeyParameters privateKeyParameters = (ECPrivateKeyParameters) keyPair.getPrivate();
+        Map<String, byte[]> map = new HashMap<>();
+        map.put("publickey", publicKeyParameters.getQ().getEncoded(false));
+        map.put("privatekey", format(privateKeyParameters.getD().toByteArray()));
+        return map;
+    }
+
+    private static byte[] format(byte[] value) {
+        if (value.length == 32) {
+            return value;
+        }
+        byte bytes[] = new byte[32];
+        if (value.length > 32) {
+            System.arraycopy(value, value.length - 32, bytes, 0, 32);
+        } else {
+            System.arraycopy(value, 0, bytes, 32 - value.length, value.length);
+        }
+        return bytes;
+    }
+
+}

BIN
zhongzheng-common/src/main/resources/static/001.png


BIN
zhongzheng-common/src/main/resources/static/0020.jpg


BIN
zhongzheng-common/src/main/resources/static/0024.jpg


BIN
zhongzheng-common/src/main/resources/static/0030.jpg


BIN
zhongzheng-common/src/main/resources/static/00312.jpg


BIN
zhongzheng-common/src/main/resources/static/0033.jpg


BIN
zhongzheng-common/src/main/resources/static/004.jpg


BIN
zhongzheng-common/src/main/resources/static/005.jpg


BIN
zhongzheng-common/src/main/resources/static/0051.jpg


BIN
zhongzheng-common/src/main/resources/static/006.jpg


BIN
zhongzheng-common/src/main/resources/static/2323.jpg


+ 82 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineInnerInterceptor.java

@@ -0,0 +1,82 @@
+package com.zhongzheng.framework.mybatisplus;
+
+import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
+import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.Parenthesis;
+import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
+import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
+import net.sf.jsqlparser.expression.operators.relational.InExpression;
+import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
+import net.sf.jsqlparser.schema.Column;
+import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.delete.Delete;
+import net.sf.jsqlparser.statement.insert.Insert;
+import net.sf.jsqlparser.statement.select.SelectBody;
+import net.sf.jsqlparser.statement.update.Update;
+import org.springframework.stereotype.Component;
+
+
+public class CustomTenantLineInnerInterceptor extends TenantLineInnerInterceptor {
+    private TenantLineHandler tenantLineHandler;
+    public CustomTenantLineInnerInterceptor(TenantLineHandler tenantLineHandler) {
+        super(tenantLineHandler);
+        this.tenantLineHandler = tenantLineHandler;
+    }
+
+
+    @Override
+    protected Expression builderExpression(Expression currentExpression, Table table) {
+        Column aliasColumn = this.getAliasColumn(table);
+        boolean presenceOfField=true;
+        if(!this.tenantLineHandler.ignoreTable(table.getName())) {
+            FindInSetExpression findInSetExpression = new FindInSetExpression();
+            findInSetExpression.setLeftExpression(getTenantLineHandler().getTenantId());
+            findInSetExpression.setRightExpression(aliasColumn);
+            if (currentExpression == null) {
+                return findInSetExpression;
+            } else {
+                return currentExpression instanceof OrExpression ? new AndExpression(new Parenthesis(currentExpression), findInSetExpression) : new AndExpression(currentExpression, findInSetExpression);
+            }
+        }else{
+            return currentExpression;
+        }
+
+    }
+
+    @Override
+    protected void processInsert(Insert insert, int index, String sql, Object obj) {
+        super.processInsert(insert,index,sql,obj);
+    }
+
+    @Override
+    protected void processUpdate(Update update, int index, String sql, Object obj) {
+        Table table = update.getTable();
+        if (!this.tenantLineHandler.ignoreTable(table.getName())) {
+            Column aliasColumn = this.getAliasColumn(table);
+            FindInSetExpression findInSetExpression = new FindInSetExpression();
+            findInSetExpression.setLeftExpression(getTenantLineHandler().getTenantId());
+            findInSetExpression.setRightExpression(aliasColumn);
+            Expression where = update.getWhere() instanceof OrExpression ? new AndExpression(new Parenthesis(update.getWhere()), findInSetExpression) : new AndExpression(update.getWhere(), findInSetExpression);
+            update.setWhere(where);
+        }
+    }
+
+    @Override
+    protected void processDelete(Delete delete, int index, String sql, Object obj) {
+        Table table = delete.getTable();
+        if (!this.tenantLineHandler.ignoreTable(table.getName())) {
+            Column aliasColumn = this.getAliasColumn(table);
+            FindInSetExpression findInSetExpression = new FindInSetExpression();
+            findInSetExpression.setLeftExpression(getTenantLineHandler().getTenantId());
+            findInSetExpression.setRightExpression(aliasColumn);
+            Expression where = delete.getWhere() instanceof OrExpression ? new AndExpression(new Parenthesis(delete.getWhere()), findInSetExpression) : new AndExpression(delete.getWhere(), findInSetExpression);
+            delete.setWhere(where);
+        }
+    }
+
+    @Override
+    protected void processInsertSelect(SelectBody selectBody) {
+        super.processInsertSelect(selectBody);
+    }
+}

+ 120 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/FindInSetExpression.java

@@ -0,0 +1,120 @@
+package com.zhongzheng.framework.mybatisplus;
+
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.ExpressionVisitor;
+import net.sf.jsqlparser.expression.operators.relational.ItemsList;
+import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
+import net.sf.jsqlparser.expression.operators.relational.SupportsOldOracleJoinSyntax;
+import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
+
+public class FindInSetExpression extends ASTNodeAccessImpl implements Expression {
+    private Expression leftExpression;
+    private ItemsList leftItemsList;
+    private ItemsList rightItemsList;
+    private boolean not = false;
+    private Expression rightExpression;
+    private MultiExpressionList multiExpressionList;
+    private int oldOracleJoinSyntax = 0;
+
+    public FindInSetExpression() {
+    }
+
+    public FindInSetExpression(Expression leftExpression, ItemsList itemsList) {
+        this.setLeftExpression(leftExpression);
+        this.setRightItemsList(itemsList);
+    }
+
+    public void setOldOracleJoinSyntax(int oldOracleJoinSyntax) {
+        this.oldOracleJoinSyntax = oldOracleJoinSyntax;
+        if (oldOracleJoinSyntax < 0 || oldOracleJoinSyntax > 1) {
+            throw new IllegalArgumentException("unexpected join type for oracle found with IN (type=" + oldOracleJoinSyntax + ")");
+        }
+    }
+
+    public int getOldOracleJoinSyntax() {
+        return this.oldOracleJoinSyntax;
+    }
+
+    public ItemsList getRightItemsList() {
+        return this.rightItemsList;
+    }
+
+    public Expression getLeftExpression() {
+        return this.leftExpression;
+    }
+
+    public final void setRightItemsList(ItemsList list) {
+        this.rightItemsList = list;
+    }
+
+    public final void setLeftExpression(Expression expression) {
+        this.leftExpression = expression;
+    }
+
+    public boolean isNot() {
+        return this.not;
+    }
+
+    public void setNot(boolean b) {
+        this.not = b;
+    }
+
+    public ItemsList getLeftItemsList() {
+        return this.leftItemsList;
+    }
+
+    public void setLeftItemsList(ItemsList leftItemsList) {
+        this.leftItemsList = leftItemsList;
+    }
+
+    public Expression getRightExpression() {
+        return this.rightExpression;
+    }
+
+    public void setRightExpression(Expression rightExpression) {
+        this.rightExpression = rightExpression;
+    }
+
+
+
+    private String getLeftExpressionString() {
+        return this.leftExpression + (this.oldOracleJoinSyntax == 1 ? "(+)" : "");
+    }
+
+    public String toString() {
+        StringBuilder statementBuilder = new StringBuilder();
+
+        statementBuilder.append("FIND_IN_SET ");
+        statementBuilder.append("(");
+        statementBuilder.append(this.getLeftExpressionString());
+        statementBuilder.append(",");
+        statementBuilder.append(this.rightExpression);
+        statementBuilder.append(")");
+
+        return statementBuilder.toString();
+    }
+
+    public int getOraclePriorPosition() {
+        return 0;
+    }
+
+    public void setOraclePriorPosition(int priorPosition) {
+        if (priorPosition != 0) {
+            throw new IllegalArgumentException("unexpected prior for oracle found");
+        }
+    }
+
+    public MultiExpressionList getMultiExpressionList() {
+        return this.multiExpressionList;
+    }
+
+    public void setMultiExpressionList(MultiExpressionList multiExpressionList) {
+        this.multiExpressionList = multiExpressionList;
+    }
+
+    @Override
+    public void accept(ExpressionVisitor expressionVisitor) {
+
+    }
+}
+

+ 137 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserLoginKeyServiceImpl.java

@@ -0,0 +1,137 @@
+package com.zhongzheng.framework.web.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
+import com.zhongzheng.common.core.redis.RedisCache;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.user.bo.UserLoginKeyAddBo;
+import com.zhongzheng.modules.user.bo.UserLoginKeyEditBo;
+import com.zhongzheng.modules.user.bo.UserLoginKeyQueryBo;
+import com.zhongzheng.modules.user.domain.UserLoginKey;
+import com.zhongzheng.modules.user.mapper.UserLoginKeyMapper;
+import com.zhongzheng.modules.user.service.IUserLoginKeyService;
+import com.zhongzheng.modules.user.vo.UserLoginKeyVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 用户登录KEYService业务层处理
+ *
+ * @author hjl
+ * @date 2023-06-14
+ */
+@Service
+public class UserLoginKeyServiceImpl extends ServiceImpl<UserLoginKeyMapper, UserLoginKey> implements IUserLoginKeyService {
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @Override
+    public UserLoginKeyVo queryById(Long id){
+        UserLoginKey db = this.baseMapper.selectById(id);
+        return BeanUtil.toBean(db, UserLoginKeyVo.class);
+    }
+
+    @Override
+    public Boolean queryByUserKey(String userKey) {
+        UserLoginKey loginKey = getOne(new LambdaQueryWrapper<UserLoginKey>()
+                .eq(UserLoginKey::getUserKey, userKey).last("limit 1"));
+        if(Validator.isNotEmpty(loginKey)&&loginKey.getStatus()==0){
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public List<UserLoginKeyVo> queryList(UserLoginKeyQueryBo bo) {
+        LambdaQueryWrapper<UserLoginKey> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getUserId() != null, UserLoginKey::getUserId, bo.getUserId());
+        lqw.eq(StrUtil.isNotBlank(bo.getUserKey()), UserLoginKey::getUserKey, bo.getUserKey());
+        lqw.eq(bo.getStatus() != null, UserLoginKey::getStatus, bo.getStatus());
+        lqw.eq(StrUtil.isNotBlank(bo.getIp()), UserLoginKey::getIp, bo.getIp());
+        lqw.eq(StrUtil.isNotBlank(bo.getBrowser()), UserLoginKey::getBrowser, bo.getBrowser());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<UserLoginKeyVo> entity2Vo(Collection<UserLoginKey> collection) {
+        List<UserLoginKeyVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, UserLoginKeyVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<UserLoginKey> page = (Page<UserLoginKey>)collection;
+            Page<UserLoginKeyVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(UserLoginKeyAddBo bo) {
+        UserLoginKey add = BeanUtil.toBean(bo, UserLoginKey.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        return this.save(add);
+    }
+
+    @Override
+    public Boolean updateByEditBo(UserLoginKeyEditBo bo) {
+        UserLoginKey update = BeanUtil.toBean(bo, UserLoginKey.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(UserLoginKey entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+
+    @Override
+    public Boolean offline(UserLoginKeyEditBo bo) {
+        if(Validator.isEmpty(bo.getUserId())||Validator.isEmpty(bo.getUserKey())){
+            throw new CustomException("参数错误");
+        }
+        LambdaUpdateWrapper<UserLoginKey> objectLambdaUpdateWrapper = Wrappers.lambdaUpdate();
+        objectLambdaUpdateWrapper.eq(UserLoginKey::getUserId, bo.getUserId());
+        objectLambdaUpdateWrapper.ne(UserLoginKey::getUserKey, bo.getUserKey());
+        objectLambdaUpdateWrapper.set(UserLoginKey::getStatus, 0);
+        this.update(null, objectLambdaUpdateWrapper);
+        String key = "LockAppAction_"+"bank"+"-"+bo.getUserId();
+        String key2 = "LockAppAction_"+"jxjy"+"-"+bo.getUserId();
+        redisCache.deleteObject(key);
+        redisCache.deleteObject(key2);
+        return true;
+    }
+}

+ 46 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/bo/QuestionOtherAddBo.java

@@ -0,0 +1,46 @@
+package com.zhongzheng.modules.bank.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 第三方题库添加对象 question_other
+ *
+ * @author ruoyi
+ * @date 2023-08-03
+ */
+@Data
+@ApiModel("第三方题库添加对象")
+public class QuestionOtherAddBo {
+
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /** 专业 */
+    @ApiModelProperty("专业")
+    private String majorname;
+    /**  状态 1正常 0关闭 */
+    @ApiModelProperty(" 状态 1正常 0关闭")
+    private Integer status;
+    /** 创建时间 */
+    @ApiModelProperty("创建时间")
+    private Long createTime;
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private String jsonStr;
+    /** 1 山东题库 */
+    @ApiModelProperty("1 山东题库")
+    private Integer fromPlat;
+    /** 试卷ID */
+    @ApiModelProperty("试卷ID")
+    private Long examId;
+    private Long relExamId;
+}

+ 52 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/bo/QuestionOtherEditBo.java

@@ -0,0 +1,52 @@
+package com.zhongzheng.modules.bank.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 第三方题库编辑对象 question_other
+ *
+ * @author ruoyi
+ * @date 2023-08-03
+ */
+@Data
+@ApiModel("第三方题库编辑对象")
+public class QuestionOtherEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long id;
+
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    /** 专业 */
+    @ApiModelProperty("专业")
+    private String majorname;
+
+    /**  状态 1正常 0关闭 */
+    @ApiModelProperty(" 状态 1正常 0关闭")
+    private Integer status;
+
+    /** 更新时间 */
+    @ApiModelProperty("更新时间")
+    private Long updateTime;
+
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private String jsonStr;
+
+    /** 1 山东题库 */
+    @ApiModelProperty("1 山东题库")
+    private Integer fromPlat;
+
+    /** 试卷ID */
+    @ApiModelProperty("试卷ID")
+    private Long examId;
+}

+ 49 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/bo/QuestionOtherQueryBo.java

@@ -0,0 +1,49 @@
+package com.zhongzheng.modules.bank.bo;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 第三方题库分页查询对象 question_other
+ *
+ * @author ruoyi
+ * @date 2023-08-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("第三方题库分页查询对象")
+public class QuestionOtherQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 用户ID */
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 专业 */
+	@ApiModelProperty("专业")
+	private String majorname;
+	/**  状态 1正常 0关闭 */
+	@ApiModelProperty(" 状态 1正常 0关闭")
+	private Integer status;
+	/** $column.columnComment */
+	@ApiModelProperty("$column.columnComment")
+	private String jsonStr;
+	/** 1 山东题库 */
+	@ApiModelProperty("1 山东题库")
+	private Integer fromPlat;
+}

+ 41 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/domain/QuestionOld.java

@@ -0,0 +1,41 @@
+package com.zhongzheng.modules.bank.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 题库题目对象 question
+ *
+ * @author hjl
+ * @date 2021-10-22
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class QuestionOld implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    private String title;
+
+    private Integer scenetype;
+
+    private Integer quiztype;
+
+    private Long SdQid;
+
+    private String analysis;
+
+    private List<QuestionOldOptions> options;
+
+    private List<QuestionOldChild> childlist;
+
+}

+ 36 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/domain/QuestionOldChild.java

@@ -0,0 +1,36 @@
+package com.zhongzheng.modules.bank.domain;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 题库题目对象 question
+ *
+ * @author hjl
+ * @date 2021-10-22
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class QuestionOldChild implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    private String title;
+
+    private Integer scenetype;
+
+    private Integer quiztype;
+
+    private Long SdQid;
+
+    private String analysis;
+
+    private List<QuestionOldOptions> options;
+
+
+}

+ 28 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/domain/QuestionOldOptions.java

@@ -0,0 +1,28 @@
+package com.zhongzheng.modules.bank.domain;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 题库题目对象 question
+ *
+ * @author hjl
+ * @date 2021-10-22
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class QuestionOldOptions implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    private String serialnum;
+
+    private Boolean isanswer;
+
+    private String optiontitle;
+
+}

+ 48 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/domain/QuestionOther.java

@@ -0,0 +1,48 @@
+package com.zhongzheng.modules.bank.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 第三方题库对象 question_other
+ *
+ * @author ruoyi
+ * @date 2023-08-03
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("question_other")
+public class QuestionOther implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** 用户ID */
+    private Long userId;
+    /** 专业 */
+    private String majorname;
+    /**  状态 1正常 0关闭 */
+    private Integer status;
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** $column.columnComment */
+    private String jsonStr;
+    /** 1 山东题库 */
+    private Integer fromPlat;
+    /** 试卷ID */
+    private Long examId;
+    private Long relExamId;
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/mapper/QuestionOtherMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.bank.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.bank.domain.QuestionOther;
+
+/**
+ * 第三方题库Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-08-03
+ */
+public interface QuestionOtherMapper extends BaseMapper<QuestionOther> {
+
+}

+ 55 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionOtherService.java

@@ -0,0 +1,55 @@
+package com.zhongzheng.modules.bank.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.bank.bo.QuestionOtherAddBo;
+import com.zhongzheng.modules.bank.bo.QuestionOtherEditBo;
+import com.zhongzheng.modules.bank.bo.QuestionOtherQueryBo;
+import com.zhongzheng.modules.bank.domain.QuestionOther;
+import com.zhongzheng.modules.bank.vo.QuestionOtherVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 第三方题库Service接口
+ *
+ * @author ruoyi
+ * @date 2023-08-03
+ */
+public interface IQuestionOtherService extends IService<QuestionOther> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	QuestionOtherVo queryById(Long id);
+
+	Long queryByUserMajor(Long userId,String majorname,Long relExamId);
+
+	/**
+	 * 查询列表
+	 */
+	List<QuestionOtherVo> queryList(QuestionOtherQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入第三方题库
+	 * @param bo 第三方题库新增业务对象
+	 * @return
+	 */
+	Long insertByAddBo(QuestionOtherAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改第三方题库
+	 * @param bo 第三方题库编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(QuestionOtherEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 305 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionOtherServiceImpl.java

@@ -0,0 +1,305 @@
+package com.zhongzheng.modules.bank.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.modules.bank.bo.*;
+import com.zhongzheng.modules.bank.domain.QuestionOld;
+import com.zhongzheng.modules.bank.domain.QuestionOldChild;
+import com.zhongzheng.modules.bank.domain.QuestionOldOptions;
+import com.zhongzheng.modules.bank.domain.QuestionOther;
+import com.zhongzheng.modules.bank.mapper.QuestionOtherMapper;
+import com.zhongzheng.modules.bank.service.IExamService;
+import com.zhongzheng.modules.bank.service.IQuestionOtherService;
+import com.zhongzheng.modules.bank.service.IQuestionService;
+import com.zhongzheng.modules.bank.vo.ExamVo;
+import com.zhongzheng.modules.bank.vo.QuestionOtherVo;
+import com.zhongzheng.modules.course.service.ICourseMenuExamService;
+import com.zhongzheng.modules.order.domain.OrderGoods;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.Page;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 第三方题库Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-08-03
+ */
+@Service
+public class QuestionOtherServiceImpl extends ServiceImpl<QuestionOtherMapper, QuestionOther> implements IQuestionOtherService {
+
+    @Autowired
+    private IQuestionService iQuestionService;
+
+    @Autowired
+    private IExamService iExamService;
+
+    @Override
+    public QuestionOtherVo queryById(Long id){
+        QuestionOther db = this.baseMapper.selectById(id);
+        JSONObject jsonObject = (JSONObject) JSONObject.parse(db.getJsonStr());
+        List<QuestionOld> qList = JSONArray.parseArray(String.valueOf(jsonObject.get("data")),QuestionOld.class);
+        if (!db.getJsonStr().contains("\"msg\":\"获取成功\"")) {
+            throw new CustomException("同步请求错误");
+        }
+        int i = 1;
+        List<ExamQuestionAddBo> qIdList = new ArrayList<>();
+        for(QuestionOld old : qList){
+            QuestionAddBo childAddBo = new QuestionAddBo();
+            String importNo = ServletUtils.getEncoded("IMPORT");
+            childAddBo.setStatus(1);
+            childAddBo.setContent(old.getTitle());
+            childAddBo.setSdQid(old.getSdQid());
+            childAddBo.setImportNo(importNo);
+            childAddBo.setCreateTime(DateUtils.getNowTime());
+            childAddBo.setCreateBy("admin");
+            childAddBo.setPublishStatus(1);
+            if(old.getQuiztype()==1){
+                childAddBo.setType(1);
+            }
+            else if(old.getQuiztype()==2){
+                childAddBo.setType(2);
+            }
+            else if(old.getQuiztype()==4){
+                childAddBo.setType(3);
+            }
+            else if(old.getQuiztype()==5){
+                childAddBo.setType(4);
+            }
+
+            if(old.getQuiztype()<3){
+                childAddBo.setAnalysisContent(old.getAnalysis());
+                String answerQuestion="";
+                List<QuestionChildAddBo> optionsList = new ArrayList<>();
+                for(QuestionOldOptions options : old.getOptions()){
+                    QuestionChildAddBo addBo = new QuestionChildAddBo();
+                    addBo.setContent(options.getOptiontitle());
+                    addBo.setOptionsId(dealOptions(options.getSerialnum()));
+                    if(options.getIsanswer()){
+                        answerQuestion+=options.getSerialnum();
+                    }
+                    optionsList.add(addBo);
+                }
+                childAddBo.setOptionsList(optionsList);
+                childAddBo.setAnswerQuestion(dealImportAnswer(answerQuestion));
+            }
+            else if(old.getQuiztype()==4){
+                childAddBo.setAnalysisContent(old.getAnalysis());
+                String answerQuestion="";
+                for(QuestionOldOptions options : old.getOptions()){
+                    if(options.getIsanswer()){
+                        if(options.getSerialnum().equals("A")){
+                            answerQuestion = "1";
+                        }else{
+                            answerQuestion = "0";
+                        }
+                    }
+                }
+                childAddBo.setAnswerQuestion(answerQuestion);
+            }
+            else if(old.getQuiztype()==5){
+                List<QuestionChildAddBo> optionsList = new ArrayList<>();
+                for(QuestionOldChild oldChild :old.getChildlist()){
+                    QuestionChildAddBo addBo = new QuestionChildAddBo();
+                    addBo.setContent(oldChild.getTitle());
+                    if(oldChild.getQuiztype()==1){
+                        addBo.setType(1);
+                    }
+                    else if(oldChild.getQuiztype()==2){
+                        addBo.setType(2);
+                    }
+                    else if(oldChild.getQuiztype()==4){
+                        addBo.setType(3);
+                    }
+                    addBo.setAnalysisContent(oldChild.getAnalysis());
+                    if(oldChild.getQuiztype()<3){
+                        String answerQuestion="";
+                        List<QuestionOptionsAddBo> optionsItemList = new ArrayList<>();
+                        for(QuestionOldOptions options : oldChild.getOptions()){
+                            QuestionOptionsAddBo addChildBo = new QuestionOptionsAddBo();
+                            addChildBo.setContent(options.getOptiontitle());
+                            addChildBo.setOptionsId(dealOptions(options.getSerialnum()));
+                            if(options.getIsanswer()){
+                                answerQuestion+=options.getSerialnum();
+                            }
+                            optionsItemList.add(addChildBo);
+                        }
+                        addBo.setOptionsList(optionsItemList);
+                        addBo.setAnswerQuestion(dealImportAnswer(answerQuestion));
+                    }
+                    else if(oldChild.getQuiztype()==4){
+                        String answerQuestion="";
+                        for(QuestionOldOptions options : oldChild.getOptions()){
+                            if(options.getIsanswer()){
+                                if(options.getSerialnum().equals("A")){
+                                    answerQuestion = "1";
+                                }else{
+                                    answerQuestion = "0";
+                                }
+                            }
+                        }
+                        addBo.setAnswerQuestion(answerQuestion);
+                    }
+                    optionsList.add(addBo);
+                }
+                childAddBo.setOptionsList(optionsList);
+            }
+            childAddBo.setFromPlat(2);
+            Long qId = iQuestionService.insertByAddBoImportBackId(childAddBo,i);
+            ExamQuestionAddBo questionAddBo = new ExamQuestionAddBo();
+            questionAddBo.setQuestionId(qId);
+            questionAddBo.setSort(i);
+            qIdList.add(questionAddBo);
+            i++;
+        }
+        ExamAddBo examAddBo = new ExamAddBo();
+        examAddBo.setExamName("七大员新考试卷");
+        examAddBo.setDoType(1);
+        examAddBo.setStatus(1);
+        examAddBo.setPublishStatus(1L);
+        examAddBo.setQuestionList(qIdList);
+        ExamVo examVo = iExamService.insertByAddBo(examAddBo);
+        QuestionOtherEditBo editBo = new QuestionOtherEditBo();
+        editBo.setId(id);
+        editBo.setExamId(examVo.getExamId());
+        updateByEditBo(editBo);
+        return BeanUtil.toBean(db, QuestionOtherVo.class);
+    }
+
+    @Override
+    public Long queryByUserMajor(Long userId, String majorname,Long relExamId) {
+        QuestionOther questionOther = getOne(new LambdaQueryWrapper<QuestionOther>()
+                .eq(QuestionOther::getUserId, userId).eq(QuestionOther::getMajorname, majorname).eq(QuestionOther::getRelExamId, relExamId)
+                .eq(QuestionOther::getStatus, 1));
+        if(Validator.isNotEmpty(questionOther)){
+            return questionOther.getExamId();
+        }
+        iExamService.getShanDongExam(userId,majorname, relExamId);
+        questionOther = getOne(new LambdaQueryWrapper<QuestionOther>()
+                .eq(QuestionOther::getUserId, userId).eq(QuestionOther::getMajorname, majorname).eq(QuestionOther::getRelExamId, relExamId)
+                .eq(QuestionOther::getStatus, 1));
+        if(Validator.isNotEmpty(questionOther)){
+            return questionOther.getExamId();
+        }
+        return null;
+    }
+
+    private Long dealOptions(String v) {
+        if ("A".equals(v)) {
+           return 1L;
+        } else if ("B".equals(v)) {
+            return 2L;
+        } else if ("C".equals(v)) {
+            return 3L;
+        } else if ("D".equals(v)) {
+            return 4L;
+        } else if ("E".equals(v)) {
+            return 5L;
+        } else if ("F".equals(v)) {
+            return 6L;
+        }
+        return 99L;
+    }
+
+    private String dealImportAnswer(String Answer) {
+        String[] itemArray = Answer.split("");
+        List<String> list = new ArrayList<>();
+        for (String v : itemArray) {
+            if ("A".equals(v)) {
+                list.add("1");
+            } else if ("B".equals(v)) {
+                list.add("2");
+            } else if ("C".equals(v)) {
+                list.add("3");
+            } else if ("D".equals(v)) {
+                list.add("4");
+            } else if ("E".equals(v)) {
+                list.add("5");
+            } else if ("F".equals(v)) {
+                list.add("6");
+            }
+        }
+        return String.join(",", list);
+    }
+
+    @Override
+    public List<QuestionOtherVo> queryList(QuestionOtherQueryBo bo) {
+        LambdaQueryWrapper<QuestionOther> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getUserId() != null, QuestionOther::getUserId, bo.getUserId());
+        lqw.like(StrUtil.isNotBlank(bo.getMajorname()), QuestionOther::getMajorname, bo.getMajorname());
+        lqw.eq(bo.getStatus() != null, QuestionOther::getStatus, bo.getStatus());
+        lqw.eq(StrUtil.isNotBlank(bo.getJsonStr()), QuestionOther::getJsonStr, bo.getJsonStr());
+        lqw.eq(bo.getFromPlat() != null, QuestionOther::getFromPlat, bo.getFromPlat());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<QuestionOtherVo> entity2Vo(Collection<QuestionOther> collection) {
+        List<QuestionOtherVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, QuestionOtherVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<QuestionOther> page = (Page<QuestionOther>)collection;
+            Page<QuestionOtherVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Long insertByAddBo(QuestionOtherAddBo bo) {
+        QuestionOther add = BeanUtil.toBean(bo, QuestionOther.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        this.save(add);
+        return add.getId();
+    }
+
+    @Override
+    public Boolean updateByEditBo(QuestionOtherEditBo bo) {
+        QuestionOther update = BeanUtil.toBean(bo, QuestionOther.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(QuestionOther entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+}

+ 27 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionChildTopicVo.java

@@ -0,0 +1,27 @@
+package com.zhongzheng.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年12月06日 16:28
+ */
+@Data
+public class ExternalQuestionChildTopicVo implements Serializable {
+
+    private Long measureId;
+
+    private String title;
+
+    private Integer topicType;
+
+    private String description;
+
+    private Integer sortNumber;
+
+    private List<ExternalQuestionChildVo> childList;
+
+}

+ 20 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionChildVo.java

@@ -0,0 +1,20 @@
+package com.zhongzheng.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年12月06日 16:28
+ */
+@Data
+public class ExternalQuestionChildVo implements Serializable {
+
+    private Long topicOptionId;
+
+    private String optionTitle;
+
+    private Boolean isAnswer;
+
+}

+ 28 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionDetailVo.java

@@ -0,0 +1,28 @@
+package com.zhongzheng.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年12月06日 16:28
+ */
+@Data
+public class ExternalQuestionDetailVo implements Serializable {
+
+    private Long topicId;
+
+    private String title;
+
+    private Integer topicType;
+
+    private String description;
+
+    private Integer sortNumber;
+
+    private List<ExternalQuestionChildVo> childList;
+
+    private List<ExternalQuestionChildTopicVo> childTopicLict;
+}

+ 25 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/ExternalQuestionVo.java

@@ -0,0 +1,25 @@
+package com.zhongzheng.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年12月06日 16:28
+ */
+@Data
+public class ExternalQuestionVo implements Serializable {
+
+    private Long measureModelId;
+
+    private String name;
+
+    private Long parentId;
+
+    private Boolean isTopic;
+
+    private Integer sortNumber;
+
+    private String topicNoteTypeNum;
+}

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionDetailVo.java

@@ -0,0 +1,22 @@
+package com.zhongzheng.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 第三方题库视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-08-03
+ */
+@Data
+public class QuestionDetailVo implements Serializable {
+
+	private String content;
+
+	private String imgUrl;
+
+	private Integer optionsId;
+}

+ 27 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionInfoVo.java

@@ -0,0 +1,27 @@
+package com.zhongzheng.modules.bank.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 第三方题库视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-08-03
+ */
+@Data
+public class QuestionInfoVo implements Serializable {
+
+	private String analysisContent;
+
+	private String answerQuestion;
+
+	private String content;
+
+	private Integer type;
+
+	private List<QuestionDetailVo> optionsList;
+}

+ 51 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionOtherVo.java

@@ -0,0 +1,51 @@
+package com.zhongzheng.modules.bank.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 第三方题库视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-08-03
+ */
+@Data
+@ApiModel("第三方题库视图对象")
+public class QuestionOtherVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long id;
+
+	/** 用户ID */
+	@Excel(name = "用户ID")
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 专业 */
+	@Excel(name = "专业")
+	@ApiModelProperty("专业")
+	private String majorname;
+	/**  状态 1正常 0关闭 */
+	@Excel(name = " 状态 1正常 0关闭")
+	@ApiModelProperty(" 状态 1正常 0关闭")
+	private Integer status;
+	/** $column.columnComment */
+	@Excel(name = " 状态 1正常 0关闭")
+	@ApiModelProperty("$column.columnComment")
+	private String jsonStr;
+	/** 1 山东题库 */
+	@Excel(name = "1 山东题库")
+	@ApiModelProperty("1 山东题库")
+	private Integer fromPlat;
+	/** 试卷ID */
+	@Excel(name = "试卷ID")
+	@ApiModelProperty("试卷ID")
+	private Long examId;
+}

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/ExternalQuestionBo.java

@@ -0,0 +1,26 @@
+package com.zhongzheng.modules.course.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年09月12日 8:52
+ */
+@Data
+public class ExternalQuestionBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    private Long tenantId;
+
+}

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/QuestionOpenBo.java

@@ -0,0 +1,22 @@
+package com.zhongzheng.modules.course.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年09月13日 17:45
+ */
+@Data
+public class QuestionOpenBo implements Serializable {
+
+    private Long goodsId;
+
+    private List<Long> userSubscribeIds;
+
+    private Long createSysUserId;
+
+    private String createBy;
+}

+ 25 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/bo/ReplenishExamBo.java

@@ -0,0 +1,25 @@
+package com.zhongzheng.modules.course.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年09月20日 9:05
+ */
+@Data
+public class ReplenishExamBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    private Long tenantId;
+}

+ 38 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/ExternalQuestionVo.java

@@ -0,0 +1,38 @@
+package com.zhongzheng.modules.course.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年09月12日 8:52
+ */
+@Data
+public class ExternalQuestionVo implements Serializable {
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("商家ID")
+    private Long merchantId;
+
+    @ApiModelProperty("商品名称")
+    private String goodsName;
+
+    @ApiModelProperty("商家名称")
+    private String merchantName;
+
+    @ApiModelProperty("做题次数")
+    private Integer doNum;
+
+    @ApiModelProperty("商品价格")
+    private BigDecimal goodsPrice;
+
+    @ApiModelProperty("封面地址")
+    private String coverUrl;
+
+}

+ 28 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/ReplenishExamVo.java

@@ -0,0 +1,28 @@
+package com.zhongzheng.modules.course.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author yangdamao
+ * @date 2023年09月12日 8:52
+ */
+@Data
+public class ReplenishExamVo implements Serializable {
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("商品名称")
+    private String goodsName;
+
+    @ApiModelProperty("商品价格")
+    private BigDecimal goodsPrice;
+
+    @ApiModelProperty("封面地址")
+    private String coverUrl;
+
+}

+ 47 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdExamRoomBo.java

@@ -0,0 +1,47 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月11日 16:53
+ */
+@Data
+public class CdExamRoomBo implements Serializable {
+
+    @ApiModelProperty("标识ID")
+    private Long signId;
+
+    @ApiModelProperty("考场类型:1普通场 2专场")
+    private Integer examType;
+
+    @ApiModelProperty("考试日期")
+    private Long examTime;
+
+    @ApiModelProperty("考试开始时间段")
+    private String examStartTime;
+
+    @ApiModelProperty("考试结束时间段")
+    private String examEndTime;
+
+    @ApiModelProperty("考试地点名称")
+    private String examSite;
+
+    @ApiModelProperty("考场人数")
+    private Integer examNum;
+
+    @ApiModelProperty("已约人数")
+    private Integer scheduledNum;
+
+    @ApiModelProperty("数据来源:1新系统 2旧系统 ")
+    private Integer dataFrom;
+
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+    @ApiModelProperty("类型:1七大员新考")
+    private Integer type;
+
+}

+ 45 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdExamRoomUpdateBo.java

@@ -0,0 +1,45 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月11日 16:53
+ */
+@Data
+public class CdExamRoomUpdateBo implements Serializable {
+
+    @ApiModelProperty("标识ID")
+    private Long signId;
+
+    @ApiModelProperty("考场类型:1普通场 2专场")
+    private Integer examType;
+
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+
+    @ApiModelProperty("考试日期")
+    private Long examTime;
+
+    @ApiModelProperty("考试开始时间段")
+    private String examStartTime;
+
+    @ApiModelProperty("考试结束时间段")
+    private String examEndTime;
+
+    @ApiModelProperty("考场人数")
+    private Integer examNum;
+
+    @ApiModelProperty("已约人数")
+    private Integer scheduledNum;
+
+    @ApiModelProperty("数据来源:1新系统 2旧系统 ")
+    private Integer dataFrom;
+
+    @ApiModelProperty("考试地点名称")
+    private String examSite;
+
+}

+ 66 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/CdUserSubscribeBo.java

@@ -0,0 +1,66 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月17日 8:59
+ */
+@Data
+public class CdUserSubscribeBo implements Serializable {
+
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /** 用户姓名 */
+    @ApiModelProperty("用户姓名")
+    private String userName;
+    /** 用户身份证 */
+    @ApiModelProperty("用户身份证")
+    private String userCard;
+    /** 用户手机号码 */
+    @ApiModelProperty("用户手机号码")
+    private String userPhone;
+    /** 商品名称 */
+    @ApiModelProperty("商品名称")
+    private String goodsName;
+    /** 订单商品ID */
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+    /** 业务层次名称 */
+    @ApiModelProperty("业务层次名称")
+    private String businessName;
+    @ApiModelProperty("专业")
+    private String major;
+    /** 考试次数 */
+    @ApiModelProperty("考试次数")
+    private Integer examNum;
+    /** 补考次数 */
+    @ApiModelProperty("补考次数")
+    private Integer replenishExamNum;
+    /** 刷题次数 */
+    @ApiModelProperty("刷题次数")
+    private Integer doQuestionNum;
+    /** 题库商家名称 */
+    @ApiModelProperty("题库商家名称")
+    private String questionMerchant;
+    /** 机构Id */
+    @ApiModelProperty("机构Id")
+    private Long tenantId;
+    @ApiModelProperty("数据来源:1新系统 2旧系统")
+    private Integer dataFrom;
+    @ApiModelProperty("类型:1七大员新考")
+    private Integer type;
+    /** 公司名称 */
+    @ApiModelProperty("公司名称")
+    private String companyName;
+    @ApiModelProperty("旧企业ID")
+    private String oldCompanyId;
+    @ApiModelProperty("旧机构ID")
+    private String oldInstitutionId;
+    @ApiModelProperty("旧客户ID")
+    private String oldCustomerId;
+}

+ 23 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyDetailBo.java

@@ -0,0 +1,23 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月26日 15:13
+ */
+@Data
+public class ExamApplyDetailBo implements Serializable {
+
+    @ApiModelProperty("考试开始日期")
+    private Long examStartTime;
+    @ApiModelProperty("考试结束日期")
+    private Long examEndTime;
+    @ApiModelProperty("考点开始时间")
+    private String startTime;
+    @ApiModelProperty("考点结束时间")
+    private String endTime;
+}

+ 45 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyResultBo.java

@@ -0,0 +1,45 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月20日 11:22
+ */
+@Data
+public class ExamApplyResultBo implements Serializable {
+
+    @ApiModelProperty("考生姓名")
+    private String userName;
+
+    @ApiModelProperty("考生身份证号")
+    private String idCard;
+
+    @ApiModelProperty("联系方式")
+    private String telphone;
+
+    @ApiModelProperty("岗位名称")
+    private String majorName;
+
+    @ApiModelProperty("考试状态:0 待登记 1正常 2缺考 3作弊 4替考")
+    private Integer applyStatus;
+
+    @ApiModelProperty("成绩")
+    private Long score;
+
+    @ApiModelProperty("证书编码")
+    private String certificateCode;
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+}

+ 51 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyResultExportBo.java

@@ -0,0 +1,51 @@
+package com.zhongzheng.modules.exam.bo;
+
+import com.zhongzheng.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月20日 11:22
+ */
+@Data
+public class ExamApplyResultExportBo implements Serializable {
+
+    @Excel(name = "序号")
+    private String index;
+
+    @Excel(name = "考生姓名")
+    private String userName;
+
+    @Excel(name = "考生身份证号")
+    private String idCard;
+
+    @Excel(name = "联系方式")
+    private String telphone;
+
+    @Excel(name = "岗位名称")
+    private String majorName;
+
+    @Excel(name = "考试状态")
+    private String applyStatus;
+
+    @Excel(name = "考试成绩")
+    private String score;
+
+    @Excel(name = "成绩审核状态")
+    private String scoreCheck;
+
+    @Excel(name = "成绩审核时间")
+    private String scoreCheckTime;
+
+    @Excel(name = "工作单位")
+    private String companyName;
+
+    @Excel(name = "证书编码")
+    private String certificateCode;
+
+
+}

+ 118 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyRoomQueryBo.java

@@ -0,0 +1,118 @@
+package com.zhongzheng.modules.exam.bo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.zhongzheng.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * 考试安排分页查询对象 exam_apply
+ *
+ * @author ruoyi
+ * @date 2021-12-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("考试安排分页查询对象")
+public class ExamApplyRoomQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 考试Id */
+	@ApiModelProperty("考试Id")
+	private Long applyId;
+	/** 考试封面 */
+	@ApiModelProperty("考试封面")
+	private String applyUrl;
+	/** 考试标题 */
+	@ApiModelProperty("考试标题")
+	private String applyName;
+	/** 考试简介 */
+	@ApiModelProperty("考试简介")
+	private String applyIntroduce;
+	/** 1非补考学员 2补考学员 3都有 */
+	@ApiModelProperty("1非补考学员 2补考学员")
+	private Integer applyStatus;
+	/** 开始日期 */
+	@ApiModelProperty("开始日期")
+	private String applyStartTime;
+	/** 结束日期 */
+	@ApiModelProperty("结束日期")
+	private String applyEndTime;
+	/** 1 启用 0未启用 -1删除 2已过期 */
+	@ApiModelProperty("1 启用 0未启用 -1删除 2已过期")
+	private List<Integer> status;
+
+	/** 商品类型 1视频2题库 3补考 4前培  */
+	@ApiModelProperty("商品类型 1视频2题库 3补考 4前培 ")
+	private Integer goodsType;
+
+	/** 教育类型id */
+	@ApiModelProperty("教育类型id")
+	private Long educationTypeId;
+
+	/** 教育类型id */
+	@ApiModelProperty("1考试地点 2考培地点 ")
+	private Long addressStatus;
+
+	/** 业务层次id */
+	@ApiModelProperty("业务层次id")
+	private Long businessId;
+
+	/** 项目ID */
+	@ApiModelProperty("项目ID")
+	private Long projectId;
+
+	/** 用户ID */
+	@ApiModelProperty("用户ID")
+	private Long userId;
+
+	/** 商品Id */
+	@ApiModelProperty("商品Id")
+	private Long goodsId;
+
+	/** 班级ID */
+	@ApiModelProperty("班级ID")
+	private Long gradeId;
+
+	/** 考试地点 */
+	@Excel(name = "*考试地点")
+	private String applySiteAddress;
+
+	@ApiModelProperty("考试开始时间")
+	private Long startTime;
+
+	@ApiModelProperty("考试 结束时间")
+	private Long endTime;
+
+	@ApiModelProperty("考试地址Id")
+	private Long applySiteId;
+
+	@ApiModelProperty("考试日期")
+	private Long examTime;
+
+	@ApiModelProperty("订单商品ID")
+	private Long orderGoodsId;
+
+	@ApiModelProperty("关键词")
+	private String searchKey;
+
+	@ApiModelProperty("数据IDs")
+	private List<Long> ids;
+}

+ 39 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySendmailBo.java

@@ -0,0 +1,39 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 考试安排添加对象 exam_apply
+ *
+ * @author ruoyi
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("考试安排添加对象")
+public class ExamApplySendmailBo {
+
+    @ApiModelProperty("ids")
+    private List<Long> ids;
+
+    @ApiModelProperty("邮件标题")
+    private String mailName;
+
+    @ApiModelProperty("发送人地址")
+    private List<String> mailAttrList;
+
+    @ApiModelProperty("附件地址")
+    private String mailUrl;
+
+    @ApiModelProperty("附件标题")
+    private String mailUrlName;
+
+    @ApiModelProperty("内容")
+    private String mailText;
+
+
+}

+ 54 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplySubscribeBo.java

@@ -0,0 +1,54 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月20日 11:22
+ */
+@Data
+public class ExamApplySubscribeBo implements Serializable {
+
+    @ApiModelProperty("考生身份证号")
+    private String idCard;
+
+    @ApiModelProperty("联系方式")
+    private String telphone;
+
+    @ApiModelProperty("标识ID")
+    private Long signId;
+
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+
+    @ApiModelProperty("学员类型:1非补考 2补考")
+    private Integer studentType;
+
+    @ApiModelProperty("专业名称")
+    private String majorName;
+
+    @ApiModelProperty("考试日期")
+    private Long applyTime;
+
+    @ApiModelProperty("考试开始时间段")
+    private String applyStartTime;
+
+    @ApiModelProperty("考试结束时间段")
+    private String applyEndTime;
+
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+}

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamApplyUserImportBo.java

@@ -0,0 +1,26 @@
+package com.zhongzheng.modules.exam.bo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 考试安排添加对象 exam_apply
+ *
+ * @author ruoyi
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("考试安排添加对象")
+public class ExamApplyUserImportBo implements Serializable {
+
+    @Excel(name = "姓名")
+    private String userName;
+
+    @Excel(name = "身份证号")
+    private String idCard;
+
+}

+ 19 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/ExamBeforeKnowBo.java

@@ -0,0 +1,19 @@
+package com.zhongzheng.modules.exam.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月05日 10:49
+ */
+@Data
+public class ExamBeforeKnowBo implements Serializable {
+
+    private String key;
+
+    private String value;
+
+    private String type;
+}

+ 24 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/SubscribeInfoBo.java

@@ -0,0 +1,24 @@
+package com.zhongzheng.modules.exam.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年10月11日 11:40
+ */
+@Data
+public class SubscribeInfoBo implements Serializable {
+
+    private Long userId;
+
+    private Long applyTime;
+
+    private String applyStartTime;
+
+    private String applyEndTime;
+
+    private String major;
+
+}

+ 32 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/bo/UpdateStudentImageBo.java

@@ -0,0 +1,32 @@
+package com.zhongzheng.modules.exam.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月18日 14:25
+ */
+@Data
+public class UpdateStudentImageBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("图片地址")
+    private String imageUrl;
+
+    @ApiModelProperty("学员身份证")
+    private String idCard;
+
+    @ApiModelProperty("旋转角度")
+    private Integer degree;
+}

+ 30 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamApplyDetailVo.java

@@ -0,0 +1,30 @@
+package com.zhongzheng.modules.exam.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月26日 15:13
+ */
+@Data
+public class ExamApplyDetailVo implements Serializable {
+    private Long applyId;
+    private Long siteId;
+    @ApiModelProperty("考试日期")
+    private Long examTime;
+    @ApiModelProperty("考场名称")
+    private String siteName;
+    @ApiModelProperty("考试名称")
+    private String applyName;
+    @ApiModelProperty("开始时间")
+    private String startTime;
+    @ApiModelProperty("结束时间")
+    private String endTime;
+    @ApiModelProperty("学员信息")
+    private List<ExamApplyUserDetailVo> userDetailVos;
+
+}

+ 57 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamApplyPlaceVo.java

@@ -0,0 +1,57 @@
+package com.zhongzheng.modules.exam.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 考试安排视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2021-12-07
+ */
+@Data
+@ApiModel("考场返回对象")
+public class ExamApplyPlaceVo {
+	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long id;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long applyId;
+
+	@ApiModelProperty("考试日期")
+	private Long applyDate;
+
+	@ApiModelProperty("考试地点ID")
+	private Long applySiteId;
+
+	@ApiModelProperty("考试时间段")
+	private String applyTime;
+
+	private String siteTime;
+
+	@ApiModelProperty("报名开始时间")
+	private Long applyStartTime;
+
+	@ApiModelProperty("报名结束时间")
+	private Long applyEndTime;
+
+	@ApiModelProperty("已报人数")
+	private Integer people;
+
+	@ApiModelProperty("可报人数")
+	private Long mayNum;
+
+	@ApiModelProperty("1非补考学员 2补考学员 ")
+	private String applyStatus;
+
+	@ApiModelProperty("考场性质:1普通场,2专场")
+	private Integer applyNature;
+
+	@ApiModelProperty("是否发送邮件:0未发送 1已发送")
+	private Integer sendmail;
+}

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamApplyUserDetailVo.java

@@ -0,0 +1,22 @@
+package com.zhongzheng.modules.exam.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年06月26日 15:13
+ */
+@Data
+public class ExamApplyUserDetailVo implements Serializable {
+    @ApiModelProperty("学员姓名")
+    private String userName;
+    @ApiModelProperty("座位号")
+    private Integer seatNum;
+    @ApiModelProperty("身份证")
+    private String idCard;
+    @ApiModelProperty("头像")
+    private String imageUrl;
+}

+ 19 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamBeforeKnowVo.java

@@ -0,0 +1,19 @@
+package com.zhongzheng.modules.exam.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月05日 10:49
+ */
+@Data
+public class ExamBeforeKnowVo implements Serializable {
+
+    private String key;
+
+    private String value;
+
+    private String type;
+}

+ 26 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/exam/vo/ExamSessionVo.java

@@ -0,0 +1,26 @@
+package com.zhongzheng.modules.exam.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年07月04日 14:51
+ */
+@Data
+public class ExamSessionVo implements Serializable {
+
+    @ApiModelProperty("考场场次")
+    private String examSession;
+
+    @ApiModelProperty("考试日期")
+    private Long examTime;
+
+    @ApiModelProperty("考点开始时间")
+    private String examStartTime;
+
+    @ApiModelProperty("考点结束时间")
+    private String examEndTime;
+}

+ 30 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/AlikeGoodsBo.java

@@ -0,0 +1,30 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年02月08日 11:23
+ */
+@Data
+public class AlikeGoodsBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+
+}

+ 38 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsFirstChoiceAddBo.java

@@ -0,0 +1,38 @@
+package com.zhongzheng.modules.goods.bo;
+
+import com.zhongzheng.modules.course.bo.CourseMenuAddBo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 商品添加对象 goods
+ *
+ * @author hjl
+ * @date 2021-10-12
+ */
+@Data
+@ApiModel("商品添加对象")
+public class GoodsFirstChoiceAddBo {
+
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    @ApiModelProperty("订单商品ID")
+    private Long orderGoodsId;
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+    @ApiModelProperty("课程ID")
+    private Long courseId;
+
+    @ApiModelProperty("班级ID")
+    private Long gradeId;
+
+    @ApiModelProperty("章列表ID")
+    private List<Long> chapterIdList;
+}

+ 25 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsHandoutsCopyTenantBo.java

@@ -0,0 +1,25 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2022年12月28日 9:28
+ */
+@Data
+public class GoodsHandoutsCopyTenantBo implements Serializable {
+
+    @ApiModelProperty("机构ID")
+    private List<Long> tenantId;
+
+    @ApiModelProperty("讲义ID")
+    private Long handoutsId;
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+
+}

+ 33 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsNodeCopyTenantBo.java

@@ -0,0 +1,33 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2022年12月28日 9:28
+ */
+@Data
+public class GoodsNodeCopyTenantBo implements Serializable {
+
+    @ApiModelProperty("机构ID")
+    private List<Long> tenantId;
+
+    @ApiModelProperty("商品ID")
+    private Long goodsId;
+    @ApiModelProperty("课程ID")
+    private Long courseId;
+    @ApiModelProperty("模块ID")
+    private Long modelId;
+    @ApiModelProperty("章ID")
+    private Long chapterId;
+    @ApiModelProperty("节ID")
+    private Long sectionId;
+
+    @ApiModelProperty("类型:1课程 2模块 3章 4节")
+    private Integer type;
+
+}

+ 45 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsQuestionRelExamAddBo.java

@@ -0,0 +1,45 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 三方题库试卷记录添加对象 goods_question_rel_exam
+ *
+ * @author ruoyi
+ * @date 2023-08-14
+ */
+@Data
+@ApiModel("三方题库试卷记录添加对象")
+public class GoodsQuestionRelExamAddBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long relId;
+    /** 获取第三方试卷ID */
+    @ApiModelProperty("获取第三方试卷ID")
+    private Long examId;
+    /** 学员预约ID */
+    @ApiModelProperty("学员预约ID")
+    private Long userSubscribeId;
+    /** 状态 1正常 0关闭 */
+    @ApiModelProperty("状态 1正常 0关闭")
+    private Integer status;
+    /** 添加时间 */
+    @ApiModelProperty("添加时间")
+    private Long createTime;
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+    /** 过期时间 */
+    @ApiModelProperty("过期时间")
+    private Long expTime;
+}

+ 53 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsQuestionRelExamEditBo.java

@@ -0,0 +1,53 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+
+
+/**
+ * 三方题库试卷记录编辑对象 goods_question_rel_exam
+ *
+ * @author ruoyi
+ * @date 2023-08-14
+ */
+@Data
+@ApiModel("三方题库试卷记录编辑对象")
+public class GoodsQuestionRelExamEditBo {
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long id;
+
+    /** $column.columnComment */
+    @ApiModelProperty("$column.columnComment")
+    private Long relId;
+
+    /** 获取第三方试卷ID */
+    @ApiModelProperty("获取第三方试卷ID")
+    private Long examId;
+
+    /** 学员预约ID */
+    @ApiModelProperty("学员预约ID")
+    private Long userSubscribeId;
+
+    /** 状态 1正常 0关闭 */
+    @ApiModelProperty("状态 1正常 0关闭")
+    private Integer status;
+
+    /** 修改时间 */
+    @ApiModelProperty("修改时间")
+    private Long updateTime;
+
+
+    /** 用户ID */
+    @ApiModelProperty("用户ID")
+    private Long userId;
+
+    /** 过期时间 */
+    @ApiModelProperty("过期时间")
+    private Long expTime;
+
+}

+ 57 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/GoodsQuestionRelExamQueryBo.java

@@ -0,0 +1,57 @@
+package com.zhongzheng.modules.goods.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.HashMap;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+
+/**
+ * 三方题库试卷记录分页查询对象 goods_question_rel_exam
+ *
+ * @author ruoyi
+ * @date 2023-08-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("三方题库试卷记录分页查询对象")
+public class GoodsQuestionRelExamQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** $column.columnComment */
+	@ApiModelProperty("$column.columnComment")
+	private Long relId;
+	/** 获取第三方试卷ID */
+	@ApiModelProperty("获取第三方试卷ID")
+	private Long examId;
+	/** 学员预约ID */
+	@ApiModelProperty("学员预约ID")
+	private Long userSubscribeId;
+	/** 状态 1正常 0关闭 */
+	@ApiModelProperty("状态 1正常 0关闭")
+	private Integer status;
+	/** 用户ID */
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 过期时间 */
+	@ApiModelProperty("过期时间")
+	private Long expTime;
+}

+ 19 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionChapterJsonBo.java

@@ -0,0 +1,19 @@
+package com.zhongzheng.modules.goods.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年11月28日 9:22
+ */
+@Data
+public class QuestionChapterJsonBo implements Serializable {
+
+    private String 章序号;
+
+    private String 章名;
+
+    private QuestionDetailJsonBo 章内容;
+}

+ 24 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionContentJsonBo.java

@@ -0,0 +1,24 @@
+package com.zhongzheng.modules.goods.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年11月28日 9:22
+ */
+@Data
+public class QuestionContentJsonBo implements Serializable {
+
+    private String 题目序号;
+
+    private String 标题;
+
+    private List<String> 选项;
+
+    private String 答案;
+
+    private String 解析;
+}

+ 19 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionDetailJsonBo.java

@@ -0,0 +1,19 @@
+package com.zhongzheng.modules.goods.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年11月28日 9:22
+ */
+@Data
+public class QuestionDetailJsonBo implements Serializable {
+
+    private String 题目类型;
+
+    private String 题目类型序号;
+
+    private QuestionContentJsonBo 题目内容;
+}

+ 17 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionJsonBo.java

@@ -0,0 +1,17 @@
+package com.zhongzheng.modules.goods.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年11月28日 9:22
+ */
+@Data
+public class QuestionJsonBo implements Serializable {
+
+    private String 书标题;
+
+    private QuestionModuleJsonBo 书内容;
+}

+ 19 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionModuleJsonBo.java

@@ -0,0 +1,19 @@
+package com.zhongzheng.modules.goods.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年11月28日 9:22
+ */
+@Data
+public class QuestionModuleJsonBo implements Serializable {
+
+    private String 模块序号;
+
+    private String 模块名;
+
+    private QuestionChapterJsonBo 模块内容;
+}

+ 33 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/bo/QuestionOpenImportBo.java

@@ -0,0 +1,33 @@
+package com.zhongzheng.modules.goods.bo;
+
+import com.zhongzheng.common.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年09月07日 18:01
+ */
+@Data
+public class QuestionOpenImportBo implements Serializable {
+
+    @Excel(name = "*姓名")
+    private String userName;
+
+    @Excel(name = "*身份证号" )
+    private String idCard;
+
+    @Excel(name = "*报考专业")
+    private String applyMajor;
+
+    @Excel(name = "是否已开通")
+    private String openStatus;
+
+    @Excel(name = "是否发送短信")
+    private String sendStatus;
+
+    @Excel(name = "*题库商家")
+    private String merchant;
+
+}

+ 45 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/GoodsQuestionRel.java

@@ -0,0 +1,45 @@
+package com.zhongzheng.modules.goods.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 【请填写功能名称】对象 goods_spec
+ *
+ * @author ruoyi
+ * @date 2022-09-29
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("goods_question_rel")
+public class GoodsQuestionRel implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    @TableId(value = "id")
+    private Long id;
+    /** 订单商品ID */
+    private Long orderGoodsId;
+    /** 题库商品ID */
+    private Long questionGoodsId;
+    /** 题库订单商品ID */
+    private Long qsOrderGoodsId;
+    /** 做题次数 */
+    private Long questionDoNum;
+    /** 1有效 0无效 */
+    private Integer status;
+    /** 创建时间 */
+    private Long createTime;
+    /** 更新时间 */
+    private Long updateTime;
+    private Long tenantId;
+
+}

+ 47 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/GoodsQuestionRelExam.java

@@ -0,0 +1,47 @@
+package com.zhongzheng.modules.goods.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.zhongzheng.common.annotation.Excel;
+
+/**
+ * 三方题库试卷记录对象 goods_question_rel_exam
+ *
+ * @author ruoyi
+ * @date 2023-08-14
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("goods_question_rel_exam")
+public class GoodsQuestionRelExam implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    /** $column.columnComment */
+    @TableId(value = "id")
+    private Long id;
+    /** $column.columnComment */
+    private Long relId;
+    /** 获取第三方试卷ID */
+    private Long examId;
+    /** 学员预约ID */
+    private Long userSubscribeId;
+    /** 状态 1正常 0关闭 */
+    private Integer status;
+    /** 添加时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Long createTime;
+    /** 修改时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateTime;
+    /** 用户ID */
+    private Long userId;
+    /** 过期时间 */
+    private Long expTime;
+}

+ 41 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/domain/QuestionMerchant.java

@@ -0,0 +1,41 @@
+package com.zhongzheng.modules.goods.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 【请填写功能名称】对象 goods_spec
+ *
+ * @author ruoyi
+ * @date 2022-09-29
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("question_merchant")
+public class QuestionMerchant implements Serializable {
+
+private static final long serialVersionUID=1L;
+
+    @TableId(value = "merchant_id")
+    private Long merchantId;
+    /** 题库商家名称 */
+    private String merchantName;
+    /** 做题次数 */
+    private Long doNum;
+    /** 1有效 0无效 */
+    private Integer status;
+    /** 创建时间 */
+    private Long createTime;
+    /** 更新时间 */
+    private Long updateTime;
+    private Long tenantId;
+    /**  是否默认商家标记:1是 0否 */
+    private Integer sign;
+
+}

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsQuestionRelExamMapper.java

@@ -0,0 +1,15 @@
+package com.zhongzheng.modules.goods.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.goods.domain.GoodsQuestionRelExam;
+
+/**
+ * 三方题库试卷记录Mapper接口
+ *
+ * @author ruoyi
+ * @date 2023-08-14
+ */
+public interface GoodsQuestionRelExamMapper extends BaseMapper<GoodsQuestionRelExam> {
+
+}

+ 13 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/GoodsQuestionRelMapper.java

@@ -0,0 +1,13 @@
+package com.zhongzheng.modules.goods.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.goods.domain.GoodsQuestionRel;
+
+/**
+ *
+ *
+ * @author
+ * @date 2021-10-28
+ */
+public interface GoodsQuestionRelMapper extends BaseMapper<GoodsQuestionRel> {
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/mapper/QuestionMerchantMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.goods.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.goods.domain.GoodsQuestionRel;
+import com.zhongzheng.modules.goods.domain.QuestionMerchant;
+
+/**
+ *
+ *
+ * @author
+ * @date 2021-10-28
+ */
+public interface QuestionMerchantMapper extends BaseMapper<QuestionMerchant> {
+}

+ 55 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsQuestionRelExamService.java

@@ -0,0 +1,55 @@
+package com.zhongzheng.modules.goods.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.goods.bo.GoodsQuestionRelExamAddBo;
+import com.zhongzheng.modules.goods.bo.GoodsQuestionRelExamEditBo;
+import com.zhongzheng.modules.goods.bo.GoodsQuestionRelExamQueryBo;
+import com.zhongzheng.modules.goods.domain.GoodsQuestionRelExam;
+import com.zhongzheng.modules.goods.vo.GoodsQuestionRelExamVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 三方题库试卷记录Service接口
+ *
+ * @author ruoyi
+ * @date 2023-08-14
+ */
+public interface IGoodsQuestionRelExamService extends IService<GoodsQuestionRelExam> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	GoodsQuestionRelExamVo queryById(Long id);
+
+	/**
+	 * 查询列表
+	 */
+	List<GoodsQuestionRelExamVo> queryList(GoodsQuestionRelExamQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入三方题库试卷记录
+	 * @param bo 三方题库试卷记录新增业务对象
+	 * @return
+	 */
+	Boolean insertByAddBo(GoodsQuestionRelExamAddBo bo);
+
+	GoodsQuestionRelExamVo makeExam(GoodsQuestionRelExamAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改三方题库试卷记录
+	 * @param bo 三方题库试卷记录编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(GoodsQuestionRelExamEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 22 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IGoodsQuestionRelService.java

@@ -0,0 +1,22 @@
+package com.zhongzheng.modules.goods.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.goods.bo.GoodsAttachedAddBo;
+import com.zhongzheng.modules.goods.bo.GoodsAttachedEditBo;
+import com.zhongzheng.modules.goods.bo.GoodsAttachedQueryBo;
+import com.zhongzheng.modules.goods.domain.GoodsAttached;
+import com.zhongzheng.modules.goods.domain.GoodsQuestionRel;
+import com.zhongzheng.modules.goods.vo.GoodsAttachedVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 商品附加产品Service接口
+ *
+ * @author  hjl
+ * @date 2021-10-28
+ */
+public interface IGoodsQuestionRelService extends IService<GoodsQuestionRel> {
+
+}

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/IQuestionMerchantService.java

@@ -0,0 +1,15 @@
+package com.zhongzheng.modules.goods.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.goods.domain.GoodsQuestionRel;
+import com.zhongzheng.modules.goods.domain.QuestionMerchant;
+
+/**
+ * 商品附加产品Service接口
+ *
+ * @author  hjl
+ * @date 2021-10-28
+ */
+public interface IQuestionMerchantService extends IService<QuestionMerchant> {
+
+}

+ 202 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsQuestionRelExamServiceImpl.java

@@ -0,0 +1,202 @@
+package com.zhongzheng.modules.goods.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.modules.bank.service.IQuestionOtherService;
+import com.zhongzheng.modules.course.domain.CourseTopic;
+import com.zhongzheng.modules.course.domain.Major;
+import com.zhongzheng.modules.course.service.IMajorService;
+import com.zhongzheng.modules.goods.bo.GoodsQuestionRelExamAddBo;
+import com.zhongzheng.modules.goods.bo.GoodsQuestionRelExamEditBo;
+import com.zhongzheng.modules.goods.bo.GoodsQuestionRelExamQueryBo;
+import com.zhongzheng.modules.goods.domain.Goods;
+import com.zhongzheng.modules.goods.domain.GoodsQuestionRel;
+import com.zhongzheng.modules.goods.domain.GoodsQuestionRelExam;
+import com.zhongzheng.modules.goods.mapper.GoodsQuestionRelExamMapper;
+import com.zhongzheng.modules.goods.service.IGoodsCourseService;
+import com.zhongzheng.modules.goods.service.IGoodsQuestionRelExamService;
+import com.zhongzheng.modules.goods.service.IGoodsQuestionRelService;
+import com.zhongzheng.modules.goods.service.IGoodsService;
+import com.zhongzheng.modules.goods.vo.GoodsQuestionRelExamVo;
+import com.zhongzheng.modules.order.domain.OrderGoods;
+import com.zhongzheng.modules.order.service.IOrderGoodsService;
+import com.zhongzheng.modules.user.domain.UserSubscribe;
+import com.zhongzheng.modules.user.service.IUserSubscribeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.Page;
+import org.springframework.transaction.annotation.Transactional;
+
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 三方题库试卷记录Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-08-14
+ */
+@Service
+public class GoodsQuestionRelExamServiceImpl extends ServiceImpl<GoodsQuestionRelExamMapper, GoodsQuestionRelExam> implements IGoodsQuestionRelExamService {
+
+    @Autowired
+    private IGoodsQuestionRelService iGoodsQuestionRelService;
+
+    @Autowired
+    private IOrderGoodsService iOrderGoodsService;
+
+    @Autowired
+    private IGoodsService iGoodsService;
+
+    @Autowired
+    private IMajorService iMajorService;
+
+    @Autowired
+    private IQuestionOtherService iQuestionOtherService;
+
+    @Autowired
+    private IUserSubscribeService iUserSubscribeService;
+
+    @Override
+    public GoodsQuestionRelExamVo queryById(Long id){
+        GoodsQuestionRelExam db = this.baseMapper.selectById(id);
+        return BeanUtil.toBean(db, GoodsQuestionRelExamVo.class);
+    }
+
+    @Override
+    public List<GoodsQuestionRelExamVo> queryList(GoodsQuestionRelExamQueryBo bo) {
+        LambdaQueryWrapper<GoodsQuestionRelExam> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getRelId() != null, GoodsQuestionRelExam::getRelId, bo.getRelId());
+        lqw.eq(bo.getExamId() != null, GoodsQuestionRelExam::getExamId, bo.getExamId());
+        lqw.eq(bo.getUserSubscribeId() != null, GoodsQuestionRelExam::getUserSubscribeId, bo.getUserSubscribeId());
+        lqw.eq(bo.getStatus() != null, GoodsQuestionRelExam::getStatus, bo.getStatus());
+        lqw.eq(bo.getUserId() != null, GoodsQuestionRelExam::getUserId, bo.getUserId());
+        lqw.eq(bo.getExpTime() != null, GoodsQuestionRelExam::getExpTime, bo.getExpTime());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<GoodsQuestionRelExamVo> entity2Vo(Collection<GoodsQuestionRelExam> collection) {
+        List<GoodsQuestionRelExamVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, GoodsQuestionRelExamVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<GoodsQuestionRelExam> page = (Page<GoodsQuestionRelExam>)collection;
+            Page<GoodsQuestionRelExamVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    public Boolean insertByAddBo(GoodsQuestionRelExamAddBo bo) {
+        GoodsQuestionRelExam add = BeanUtil.toBean(bo, GoodsQuestionRelExam.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        return this.save(add);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public GoodsQuestionRelExamVo makeExam(GoodsQuestionRelExamAddBo bo) {
+        if(Validator.isEmpty(bo.getRelId())){
+            throw new CustomException("参数缺失");
+        }
+        GoodsQuestionRelExam detail = getOne(new LambdaQueryWrapper<GoodsQuestionRelExam>()
+                .eq(GoodsQuestionRelExam::getRelId, bo.getRelId()).eq(GoodsQuestionRelExam::getUserId, bo.getUserId()).eq(GoodsQuestionRelExam::getStatus, 1)
+                .ge(GoodsQuestionRelExam::getExpTime, DateUtils.getNowTime()).last("limit 1"));
+        if(Validator.isNotEmpty(detail)){
+            return BeanUtil.toBean(detail,GoodsQuestionRelExamVo.class);
+        }
+        GoodsQuestionRelExam add = BeanUtil.toBean(bo, GoodsQuestionRelExam.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+
+        GoodsQuestionRel questionRel = iGoodsQuestionRelService.getOne(new LambdaQueryWrapper<GoodsQuestionRel>()
+                .eq(GoodsQuestionRel::getId, bo.getRelId()).eq(GoodsQuestionRel::getStatus, 1));
+        if(Validator.isEmpty(questionRel)){
+            throw new CustomException("该题库商品无法访问");
+        }
+        OrderGoods qsOrderGoods = iOrderGoodsService.getOne(new LambdaQueryWrapper<OrderGoods>()
+                .eq(OrderGoods::getOrderGoodsId, questionRel.getQsOrderGoodsId()));
+        if(Validator.isEmpty(qsOrderGoods)||Validator.isEmpty(qsOrderGoods.getServiceEndTime())||qsOrderGoods.getServiceEndTime()<DateUtils.getNowTime()||qsOrderGoods.getServiceStartTime()>DateUtils.getNowTime()){
+            throw new CustomException("未在服务期内无法访问");
+        }
+        if(questionRel.getQuestionDoNum()<1){
+            throw new CustomException("该题库商品试卷可用次数不足");
+        }
+        UserSubscribe userSubscribe = iUserSubscribeService.getOne(new LambdaQueryWrapper<UserSubscribe>()
+                .eq(UserSubscribe::getUserId, bo.getUserId()).eq(UserSubscribe::getOrderGoodsId, questionRel.getOrderGoodsId())
+                .eq(UserSubscribe::getExamStatus, 0).orderByDesc(UserSubscribe::getSubscribeId).last("limit 1"));
+        if(Validator.isEmpty(userSubscribe)){
+            throw new CustomException("预约数据不存在");
+        }
+        OrderGoods orderGoods = iOrderGoodsService.getOne(new LambdaQueryWrapper<OrderGoods>()
+                .eq(OrderGoods::getOrderGoodsId, questionRel.getOrderGoodsId()));
+        Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>()
+                .eq(Goods::getGoodsId, orderGoods.getGoodsId()));
+        if(Validator.isEmpty(goods.getMajorId())){
+            throw new CustomException("商品专业不存在");
+        }
+        Major major = iMajorService.getOne(new LambdaQueryWrapper<Major>()
+                .eq(Major::getId, goods.getMajorId()));
+        questionRel.setQuestionDoNum(questionRel.getQuestionDoNum()-1);
+        questionRel.setUpdateTime(DateUtils.getNowTime());
+        iGoodsQuestionRelService.updateById(questionRel);
+        add.setExpTime(qsOrderGoods.getServiceEndTime());
+    //    add.setExamId(examId);
+        add.setStatus(1);
+        add.setUserSubscribeId(userSubscribe.getSubscribeId());
+        this.save(add);
+        Long examId = iQuestionOtherService.queryByUserMajor(bo.getUserId(),major.getCategoryName(),add.getId());
+        if(Validator.isEmpty(examId)){
+            throw new CustomException("试卷获取失败");
+        }
+        add.setExamId(examId);
+        updateById(add);
+        return BeanUtil.toBean(add,GoodsQuestionRelExamVo.class);
+    }
+
+    @Override
+    public Boolean updateByEditBo(GoodsQuestionRelExamEditBo bo) {
+        GoodsQuestionRelExam update = BeanUtil.toBean(bo, GoodsQuestionRelExam.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(GoodsQuestionRelExam entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+}

+ 18 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/GoodsQuestionRelServiceImpl.java

@@ -0,0 +1,18 @@
+package com.zhongzheng.modules.goods.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.goods.domain.GoodsQuestionRel;
+import com.zhongzheng.modules.goods.mapper.GoodsQuestionRelMapper;
+import com.zhongzheng.modules.goods.service.IGoodsQuestionRelService;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ *
+ * @author  hjl
+ * @date 2021-10-28
+ */
+@Service
+public class GoodsQuestionRelServiceImpl extends ServiceImpl<GoodsQuestionRelMapper, GoodsQuestionRel> implements IGoodsQuestionRelService {
+
+}

+ 18 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/service/impl/QuestionMerchantServiceImpl.java

@@ -0,0 +1,18 @@
+package com.zhongzheng.modules.goods.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.goods.domain.QuestionMerchant;
+import com.zhongzheng.modules.goods.mapper.QuestionMerchantMapper;
+import com.zhongzheng.modules.goods.service.IQuestionMerchantService;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ *
+ * @author  hjl
+ * @date 2021-10-28
+ */
+@Service
+public class QuestionMerchantServiceImpl extends ServiceImpl<QuestionMerchantMapper, QuestionMerchant> implements IQuestionMerchantService {
+
+}

+ 51 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsQuestionRelExamVo.java

@@ -0,0 +1,51 @@
+package com.zhongzheng.modules.goods.vo;
+
+import com.zhongzheng.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 三方题库试卷记录视图对象 mall_package
+ *
+ * @author ruoyi
+ * @date 2023-08-14
+ */
+@Data
+@ApiModel("三方题库试卷记录视图对象")
+public class GoodsQuestionRelExamVo {
+	private static final long serialVersionUID = 1L;
+
+	/** $pkColumn.columnComment */
+	@ApiModelProperty("$pkColumn.columnComment")
+	private Long id;
+
+	/** $column.columnComment */
+	@Excel(name = "${comment}" , readConverterExp = "$column.readConverterExp()")
+	@ApiModelProperty("$column.columnComment")
+	private Long relId;
+	/** 获取第三方试卷ID */
+	@Excel(name = "获取第三方试卷ID")
+	@ApiModelProperty("获取第三方试卷ID")
+	private Long examId;
+	/** 学员预约ID */
+	@Excel(name = "学员预约ID")
+	@ApiModelProperty("学员预约ID")
+	private Long userSubscribeId;
+	/** 状态 1正常 0关闭 */
+	@Excel(name = "状态 1正常 0关闭")
+	@ApiModelProperty("状态 1正常 0关闭")
+	private Integer status;
+	/** 用户ID */
+	@Excel(name = "用户ID")
+	@ApiModelProperty("用户ID")
+	private Long userId;
+	/** 过期时间 */
+	@Excel(name = "过期时间")
+	@ApiModelProperty("过期时间")
+	private Long expTime;
+}

+ 19 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/GoodsSectionNumVo.java

@@ -0,0 +1,19 @@
+package com.zhongzheng.modules.goods.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年08月31日 16:19
+ */
+@Data
+public class GoodsSectionNumVo implements Serializable {
+
+    private Long sectionNum;
+
+    private Long recordNum;
+
+    private Long studyStatus;
+}

+ 16 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/QuestionOpenImportVo.java

@@ -0,0 +1,16 @@
+package com.zhongzheng.modules.goods.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年09月07日 17:53
+ */
+@Data
+public class QuestionOpenImportVo implements Serializable {
+
+    private List<String> errorMsgList;
+}

+ 25 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/UserNewGoodsVo.java

@@ -0,0 +1,25 @@
+package com.zhongzheng.modules.goods.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2023年11月08日 9:04
+ */
+@Data
+public class UserNewGoodsVo implements Serializable {
+
+    @ApiModelProperty("课程名称")
+    private List<String> goodsNames;
+
+    @ApiModelProperty("H5跳转路径")
+    private String h5Url;
+
+    @ApiModelProperty("pc跳转路径")
+    private String pcUrl;
+
+}

+ 53 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/goods/vo/UserOrderGoodsListVo.java

@@ -0,0 +1,53 @@
+package com.zhongzheng.modules.goods.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author yangdamao
+ * @date 2022年12月22日 9:35
+ */
+@Data
+public class UserOrderGoodsListVo implements Serializable {
+
+    @ApiModelProperty("商品Id")
+    private Long goodsId;
+
+    @ApiModelProperty("订单ID")
+    private Long orderId;
+
+    @ApiModelProperty("订单商品Id")
+    private Long orderGoodsId;
+
+    @ApiModelProperty("班级ID")
+    private Long gradeId;
+
+    @ApiModelProperty("课程类型")
+    private Integer courseType;
+
+    @ApiModelProperty("课程名称")
+    private String categoryName;
+
+    @ApiModelProperty("课程类型名称")
+    private String platformName;
+
+    @ApiModelProperty("专业名称")
+    private String majorName;
+
+    @ApiModelProperty("机构id")
+    private Long tenantId;
+
+    @ApiModelProperty("课程图片地址,已带域名")
+    private String imageUrl;
+
+    @ApiModelProperty("H5跳转路径")
+    private String h5Url;
+
+    @ApiModelProperty("pc跳转路径")
+    private String pcUrl;
+
+
+}

+ 31 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClassGradeDecryptQueryBo.java

@@ -0,0 +1,31 @@
+package com.zhongzheng.modules.grade.bo;
+
+import com.zhongzheng.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * 班级分页查询对象 class_grade
+ *
+ * @author ruoyi
+ * @date 2021-11-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("班级分页查询对象")
+public class ClassGradeDecryptQueryBo extends BaseEntity {
+
+	private String data;
+
+	private String tenantId;
+
+	private String bh;
+
+	private String idnum;
+
+	private String token;
+}

+ 39 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/ClientPostAddBo.java

@@ -0,0 +1,39 @@
+package com.zhongzheng.modules.grade.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+
+/**
+ * 班级添加对象 class_grade
+ *
+ * @author ruoyi
+ * @date 2021-11-10
+ */
+@Data
+@ApiModel("班级添加对象")
+public class ClientPostAddBo {
+
+    @ApiModelProperty("请求文本")
+    @NotBlank(message = "请求文本")
+    private String content;
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("请求文本")
+    @NotBlank(message = "请求文本")
+    private String token;
+
+    @ApiModelProperty("url")
+    @NotBlank(message = "url")
+    private String url;
+}

+ 44 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/CreateSameClassBo.java

@@ -0,0 +1,44 @@
+package com.zhongzheng.modules.grade.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @author yangdamao
+ * @date 2023年02月10日 8:50
+ */
+@Data
+public class CreateSameClassBo implements Serializable {
+
+    @ApiModelProperty("当前时间戳")
+    @NotBlank(message = "当前时间戳不能为空")
+    private Long stamp;
+
+    @ApiModelProperty("签名")
+    @NotBlank(message = "签名不能为空")
+    private String sign;
+
+    @ApiModelProperty("班级编号")
+    private String classNo;
+
+    @ApiModelProperty("班级名称")
+    private String categoryName;
+
+    @ApiModelProperty("开班状态 0未开班(预报名) 1开班")
+    private Integer openclassState;
+
+    @ApiModelProperty("班级有效开始时间")
+    private String beginTime;
+
+    @ApiModelProperty("班级有效结束时间")
+    private String endTime;
+
+    @ApiModelProperty("5二建继教 ,  8二造继教")
+    private Integer platformId;
+
+    @ApiModelProperty("专业名称")
+    private String majorName;
+}

Some files were not shown because too many files changed in this diff