Forráskód Böngészése

3.0.0-考试管理

xiaof 3 éve
szülő
commit
22e663aaf3
28 módosított fájl, 1307 hozzáadás és 50 törlés
  1. 23 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/BasicExamDto.java
  2. 32 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/BasicPrintConfigDto.java
  3. 15 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ClientLoginParam.java
  4. 27 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/LoginTypeEnum.java
  5. 1 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/TemplateTypeEnum.java
  6. 25 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicExamMapper.java
  7. 21 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicPrintConfigMapper.java
  8. 2 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamCardMapper.java
  9. 62 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicExamService.java
  10. 23 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicPrintConfigService.java
  11. 3 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardService.java
  12. 135 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamServiceImpl.java
  13. 127 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicPrintConfigServiceImpl.java
  14. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java
  15. 48 0
      distributed-print-business/src/main/resources/mapper/BasicExamMapper.xml
  16. 50 0
      distributed-print-business/src/main/resources/mapper/BasicPrintConfigMapper.xml
  17. 26 0
      distributed-print-business/src/main/resources/mapper/ExamCardMapper.xml
  18. 113 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicExamController.java
  19. 82 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicPrintConfigController.java
  20. 16 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamCardController.java
  21. 95 44
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java
  22. 106 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicExam.java
  23. 176 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicPrintConfig.java
  24. 38 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/ExamCategoryEnum.java
  25. 38 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/ExamModelEnum.java
  26. 7 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysOrgService.java
  27. 7 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysOrgServiceImpl.java
  28. 0 4
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java

+ 23 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/BasicExamDto.java

@@ -0,0 +1,23 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.teachcloud.common.entity.BasicExam;
+import com.qmth.teachcloud.common.entity.BasicPrintConfig;
+import com.qmth.teachcloud.common.entity.SysOrg;
+
+import java.util.List;
+
+/**
+ * @Date: 2022/2/11.
+ */
+public class BasicExamDto extends BasicExam {
+
+    private String semesterName;
+
+    public String getSemesterName() {
+        return semesterName;
+    }
+
+    public void setSemesterName(String semesterName) {
+        this.semesterName = semesterName;
+    }
+}

+ 32 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/BasicPrintConfigDto.java

@@ -0,0 +1,32 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import com.qmth.teachcloud.common.entity.BasicPrintConfig;
+import com.qmth.teachcloud.common.entity.SysOrg;
+
+import java.util.List;
+
+/**
+ * @Date: 2022/2/11.
+ */
+public class BasicPrintConfigDto extends BasicPrintConfig {
+
+    private String orgNames;
+
+    private List<SysOrg> orgs;
+
+    public String getOrgNames() {
+        return orgNames;
+    }
+
+    public void setOrgNames(String orgNames) {
+        this.orgNames = orgNames;
+    }
+
+    public List<SysOrg> getOrgs() {
+        return orgs;
+    }
+
+    public void setOrgs(List<SysOrg> orgs) {
+        this.orgs = orgs;
+    }
+}

+ 15 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ClientLoginParam.java

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.bean.params;
 
+import com.qmth.distributed.print.business.enums.LoginTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 import org.hibernate.validator.constraints.Length;
 
@@ -15,12 +16,12 @@ import javax.validation.constraints.NotBlank;
 public class ClientLoginParam {
 
     @ApiModelProperty(value = "登录名")
-    @NotBlank(message = "请输入登录名")
+//    @NotBlank(message = "请输入登录名")
     @Length(message = "登录名不能超过{max}个字符", max = 50)
     private String loginName;
 
     @ApiModelProperty(value = "密码")
-    @NotBlank(message = "请输入密码")
+//    @NotBlank(message = "请输入密码")
     @Length(message = "密码不能少于{min}位", min = 6)
     @Length(message = "密码不能超过{max}位", max = 30)
     private String password;
@@ -28,6 +29,10 @@ public class ClientLoginParam {
     @ApiModelProperty(value = "学校code")
     private String schoolCode;
 
+    @ApiModelProperty(value = "登录类型")
+    @NotBlank(message = "登录参数错误")
+    private String type;
+
     public String getLoginName() {
         return loginName;
     }
@@ -51,4 +56,12 @@ public class ClientLoginParam {
     public void setSchoolCode(String schoolCode) {
         this.schoolCode = schoolCode;
     }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
 }

+ 27 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/LoginTypeEnum.java

@@ -0,0 +1,27 @@
+package com.qmth.distributed.print.business.enums;
+
+import com.qmth.teachcloud.common.enums.EnumResult;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 通用模板类型
+ * @Date: 2021/3/23.
+ */
+public enum LoginTypeEnum {
+
+    ACCOUNT("账号登录"),
+    PHONE("手机验证码登录");
+
+    LoginTypeEnum(String desc) {
+        this.desc = desc;
+    }
+
+    private String desc;
+
+    public String getDesc() {
+        return desc;
+    }
+
+}

+ 1 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/TemplateTypeEnum.java

@@ -15,6 +15,7 @@ public enum TemplateTypeEnum {
     GENERIC("通卡模板"),
     VARIABLE("变量印品模板"),
     ORDINARY("普通印品模板"),
+    PRINT_CONFIG("印品配置"),
     CARD_RULE("题卡规则");
 
     TemplateTypeEnum(String desc) {

+ 25 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicExamMapper.java

@@ -0,0 +1,25 @@
+package com.qmth.distributed.print.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.distributed.print.business.bean.dto.BasicExamDto;
+import com.qmth.teachcloud.common.entity.BasicExam;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 考试字典表 Mapper 接口
+ * </p>
+ */
+public interface BasicExamMapper extends BaseMapper<BasicExam> {
+
+    /**
+     * 考试分页查询
+     *
+     * @param iPage    分页参数
+     * @param schoolId 学校id
+     * @return 分页结果
+     */
+    IPage<BasicExamDto> findBasicExamPage(@Param("objectPage") Page<Object> objectPage, @Param("schoolId") Long schoolId, @Param("semesterId") Boolean semesterId, @Param("enable") Boolean enable, @Param("o") Object o);
+}

+ 21 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/BasicPrintConfigMapper.java

@@ -0,0 +1,21 @@
+package com.qmth.distributed.print.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.distributed.print.business.bean.dto.BasicPrintConfigDto;
+import com.qmth.teachcloud.common.entity.BasicPrintConfig;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 印品配置 Mapper 接口
+ * </p>
+ *
+ * @author xf
+ * @since 2022-02-10
+ */
+public interface BasicPrintConfigMapper extends BaseMapper<BasicPrintConfig> {
+
+    IPage<BasicPrintConfigDto> listPage(@Param("page") Page<BasicPrintConfigDto> page, @Param("schoolId") Long schoolId, @Param("examId") Long examId, @Param("enable") Boolean enable, @Param("createStartTime") Long createStartTime, @Param("createEndTime") Long createEndTime);
+}

+ 2 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamCardMapper.java

@@ -33,4 +33,6 @@ public interface ExamCardMapper extends BaseMapper<ExamCard> {
     CardDetailDto getCardDetailBySelect(Long cardId);
 
     List<SyncExamCardDto> listSyncCardByCourseCodeAndPaperNumber(@Param("schoolId") Long schoolId, @Param("courseCode") String courseCode, @Param("paperNumber") String paperNumber);
+
+    IPage<ExamCard> listPage(@Param("page") Page<ExamCard> page, @Param("schoolId") Long schoolId, @Param("enable") Boolean enable, @Param("createStartTime") Long createStartTime, @Param("createEndTime") Long createEndTime, @Param("courseCode") String courseCode, @Param("type") String type);
 }

+ 62 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicExamService.java

@@ -0,0 +1,62 @@
+package com.qmth.distributed.print.business.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.bean.dto.BasicExamDto;
+import com.qmth.teachcloud.common.entity.BasicExam;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 考试表 服务类
+ * </p>
+ */
+public interface BasicExamService extends IService<BasicExam> {
+
+    /**
+     * 考试编辑
+     *
+     * @param basicExam 编辑参数
+     * @return 编辑后该学期id
+     */
+    BasicExam saveBasicExam(BasicExam basicExam) throws IllegalAccessException;
+
+    /**
+     * 考试删除
+     *
+     * @param id 考试主键
+     * @return 是否删除成功
+     */
+    boolean deleteBasicExamById(Long id);
+
+    /**
+     * 查询学期
+     *
+     * @param inUsed 是否当前使用考试
+     */
+    List<BasicExam> query(Boolean inUsed);
+
+    /**
+     * 设置当前使用考试
+     *
+     * @param id 考试ID
+     */
+    boolean setInUsed(Long id);
+
+    /**
+     * 分页查询
+     *
+     * @param semesterId 学期ID
+     * @param enable     是否启用
+     * @param pageNumber 分页参数
+     * @param pageSize   分页参数
+     */
+    IPage<BasicExamDto> basicExamPage(Boolean semesterId, Boolean enable, Integer pageNumber, Integer pageSize);
+
+    /**
+     * 启用/禁用
+     *
+     */
+    boolean enable(Long id, Boolean enable);
+}

+ 23 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/BasicPrintConfigService.java

@@ -0,0 +1,23 @@
+package com.qmth.distributed.print.business.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.bean.dto.BasicPrintConfigDto;
+import com.qmth.teachcloud.common.entity.BasicPrintConfig;
+import com.sun.org.apache.xpath.internal.operations.Bool;
+
+/**
+ * <p>
+ * 印品配置 服务类
+ * </p>
+ *
+ * @author xf
+ * @since 2021-03-23
+ */
+public interface BasicPrintConfigService extends IService<BasicPrintConfig> {
+    IPage<BasicPrintConfigDto> listPage(Long examId, Boolean enable, Long createStartTime, Long createEndTime, Integer pageNumber, Integer pageSize);
+
+    boolean enable(Long id, Boolean enable);
+
+    boolean savePrintConfig(BasicPrintConfig basicPrintConfig);
+}

+ 3 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardService.java

@@ -7,6 +7,7 @@ import com.qmth.distributed.print.business.bean.dto.CardDetailDto;
 import com.qmth.distributed.print.business.bean.dto.SyncExamCardDto;
 import com.qmth.distributed.print.business.bean.params.ExamCardParams;
 import com.qmth.distributed.print.business.entity.ExamCard;
+import com.qmth.distributed.print.business.enums.CardTypeEnum;
 import com.qmth.teachcloud.common.bean.params.ArraysParams;
 
 import javax.servlet.http.HttpServletResponse;
@@ -39,4 +40,6 @@ public interface ExamCardService extends IService<ExamCard> {
     void downloadFiles(HttpServletResponse response, ArraysParams arraysParams) throws Exception;
 
     List<SyncExamCardDto> listSyncCardByCourseCodeAndPaperNumber(Long schoolId, String courseCode, String paperNumber);
+
+    IPage<ExamCard> listPage(Boolean enable, Long createStartTime, Long createEndTime, String courseCode, String type, Integer pageNumber, Integer pageSize);
 }

+ 135 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamServiceImpl.java

@@ -0,0 +1,135 @@
+package com.qmth.distributed.print.business.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.bean.dto.BasicExamDto;
+import com.qmth.distributed.print.business.entity.ExamPrintPlan;
+import com.qmth.distributed.print.business.mapper.BasicExamMapper;
+import com.qmth.distributed.print.business.service.BasicExamService;
+import com.qmth.distributed.print.business.service.ExamPrintPlanService;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicExam;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 考试 服务实现类
+ * </p>
+ */
+@Service
+public class BasicExamServiceImpl extends ServiceImpl<BasicExamMapper, BasicExam> implements BasicExamService {
+    @Resource
+    ExamPrintPlanService examPrintPlanService;
+
+    @Transactional
+    @Override
+    public BasicExam saveBasicExam(BasicExam basicExam) throws IllegalAccessException {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        Long id = basicExam.getId();
+        Long schoolId = sysUser.getSchoolId();
+
+        BasicExam checkName = this.getOne(new QueryWrapper<BasicExam>().lambda()
+                .eq(BasicExam::getSchoolId, schoolId)
+                .eq(BasicExam::getSemesterId, basicExam.getSemesterId())
+                .eq(BasicExam::getName, basicExam.getName())
+                .eq(BasicExam::getEnable, true));
+        // 校验考试名称唯一性
+        if (Objects.nonNull(checkName) && !checkName.getId().equals(id)) {
+            throw ExceptionResultEnum.ERROR.exception("考试名称【" + basicExam.getName() + "】已存在");
+        }
+        if (SystemConstant.longNotNull(id)) {
+            // 编辑
+            BasicExam old = this.getById(id);
+            this.update(new UpdateWrapper<BasicExam>().lambda()
+                    .eq(BasicExam::getId, id)
+                    .set(BasicExam::getSemesterId, basicExam.getSemesterId())
+                    .set(BasicExam::getName, basicExam.getName())
+                    .set(BasicExam::getCategory, basicExam.getCategory())
+                    .set(BasicExam::getExamModel, basicExam.getExamModel())
+                    .set(BasicExam::getCreateId, sysUser.getId())
+                    .set(BasicExam::getCreateTime, System.currentTimeMillis()));
+        } else {
+            // 新增
+            basicExam.setId(SystemConstant.getDbUuid());
+            basicExam.setSchoolId(schoolId);
+            basicExam.setUpdateId(sysUser.getId());
+            basicExam.setUpdateTime(System.currentTimeMillis());
+            this.save(basicExam);
+        }
+        return basicExam;
+    }
+
+    @Transactional
+    @Override
+    public boolean deleteBasicExamById(Long id) {
+        // todo 学期改为考试ID
+        List<ExamPrintPlan> examPrintPlanList = examPrintPlanService.list(new QueryWrapper<ExamPrintPlan>().lambda().eq(ExamPrintPlan::getSemesterId, id));
+        if (examPrintPlanList.size() > 0) {
+            throw ExceptionResultEnum.ERROR.exception("考试已被绑定,不能删除");
+        }
+        return this.removeById(id);
+    }
+
+    @Override
+    public List<BasicExam> query(Boolean inUsed) {
+        Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
+        QueryWrapper<BasicExam> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(BasicExam::getSchoolId, schoolId).eq(BasicExam::getEnable, true);
+        if (Objects.nonNull(inUsed)) {
+            queryWrapper.lambda().eq(BasicExam::getInUsed, inUsed);
+        }
+        return this.list(queryWrapper);
+    }
+
+    @Transactional
+    @Override
+    public boolean setInUsed(Long id) {
+        BasicExam exam = this.getById(id);
+        // 只能设置一个当前使用考试
+        if (!exam.getInUsed()) {
+            QueryWrapper<BasicExam> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(BasicExam::getSchoolId, exam.getSchoolId())
+                    .eq(BasicExam::getSemesterId, exam.getSemesterId());
+            List<BasicExam> list = this.list(queryWrapper);
+            if (!CollectionUtils.isEmpty(list)) {
+                list = list.stream().map(m -> {
+                    m.setInUsed(false);
+                    return m;
+                }).collect(Collectors.toList());
+                this.updateBatchById(list);
+            }
+        }
+        exam.setInUsed(!exam.getInUsed());
+        return this.updateById(exam);
+    }
+
+    @Override
+    public IPage<BasicExamDto> basicExamPage(Boolean semesterId, Boolean enable, Integer pageNumber, Integer pageSize) {
+        Long schoolId = SystemConstant.convertIdToLong(ServletUtil.getRequestHeaderSchoolId().toString());
+        return this.baseMapper.findBasicExamPage(new Page<>(pageNumber, pageSize), schoolId, semesterId, enable, null);
+    }
+
+    /**
+     * 启用/禁用
+     *
+     */
+    @Override
+    public boolean enable(Long id, Boolean enable) {
+        UpdateWrapper<BasicExam> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(BasicExam::getEnable, enable).eq(BasicExam::getId, id);
+        return this.update(updateWrapper);
+    }
+}

+ 127 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicPrintConfigServiceImpl.java

@@ -0,0 +1,127 @@
+package com.qmth.distributed.print.business.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.bean.dto.BasicPrintConfigDto;
+import com.qmth.teachcloud.common.entity.BasicPrintConfig;
+import com.qmth.distributed.print.business.entity.BasicTemplateOrg;
+import com.qmth.distributed.print.business.enums.TemplateTypeEnum;
+import com.qmth.distributed.print.business.mapper.BasicPrintConfigMapper;
+import com.qmth.distributed.print.business.service.BasicPrintConfigService;
+import com.qmth.distributed.print.business.service.BasicTemplateOrgService;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysOrg;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.service.SysOrgService;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 印品配置 服务实现类
+ * </p>
+ *
+ * @author xf
+ * @since 2022-02-10
+ */
+@Service
+public class BasicPrintConfigServiceImpl extends ServiceImpl<BasicPrintConfigMapper, BasicPrintConfig> implements BasicPrintConfigService {
+
+    @Resource
+    private BasicTemplateOrgService basicTemplateOrgService;
+
+    @Resource
+    private SysOrgService sysOrgService;
+
+    @Override
+    public IPage<BasicPrintConfigDto> listPage(Long examId, Boolean enable, Long createStartTime, Long createEndTime, Integer pageNumber, Integer pageSize) {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        Page<BasicPrintConfigDto> page = new Page<>(pageNumber, pageSize);
+        IPage<BasicPrintConfigDto> printConfigDtoIPage = this.baseMapper.listPage(page, schoolId, examId, enable, createStartTime, createEndTime);
+        if (printConfigDtoIPage.getRecords().size() > 0) {
+            printConfigDtoIPage.getRecords().forEach(m -> {
+                //查询适用学院
+                List<SysOrg> sysOrgs = basicTemplateOrgService.listByTypeAndTemplateId(TemplateTypeEnum.PRINT_CONFIG.name(), Long.valueOf(m.getId()));
+                if(sysOrgs!=null && sysOrgs.size() > 0){
+                    String orgNames = sysOrgs.stream().map(SysOrg::getName).collect(Collectors.joining(","));
+                    m.setOrgNames(orgNames);
+                }
+                m.setOrgs(sysOrgs);
+            });
+        }
+        return printConfigDtoIPage;
+    }
+
+    @Override
+    public boolean enable(Long id, Boolean enable) {
+        UpdateWrapper<BasicPrintConfig> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().set(BasicPrintConfig::getEnable, enable).eq(BasicPrintConfig::getId, id);
+        return this.update(updateWrapper);
+    }
+
+    @Transactional
+    @Override
+    public boolean savePrintConfig(BasicPrintConfig basicPrintConfig) {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        basicPrintConfig.setSchoolId(schoolId);
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+
+        boolean isSuccess;
+        // 新增
+        if (Objects.isNull(basicPrintConfig.getId())) {
+            // 一个学院只能对应一个印品配置方案
+            Long[] orgIds = basicPrintConfig.getOrgIds();
+            QueryWrapper<BasicTemplateOrg> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(BasicTemplateOrg::getType, TemplateTypeEnum.PRINT_CONFIG)
+                    .in(BasicTemplateOrg::getOrgId, orgIds);
+            List<BasicTemplateOrg> basicTemplateOrgList = basicTemplateOrgService.list(queryWrapper);
+            if (basicTemplateOrgList != null && basicTemplateOrgList.size() > 0) {
+//                List<Long> useOrgIds = basicTemplateOrgList.stream().map(BasicTemplateOrg::getOrgId).collect(Collectors.toList());
+//                List<SysOrg> sysOrgList = sysOrgService.findByOrgIds(useOrgIds);
+                throw ExceptionResultEnum.ERROR.exception("有"+basicTemplateOrgList.size()+"个机构已经设置了印品,不能重复设置");
+            }
+
+            basicPrintConfig.setId(SystemConstant.getDbUuid());
+            basicPrintConfig.setCreateId(sysUser.getId());
+            basicPrintConfig.setCreateTime(System.currentTimeMillis());
+            isSuccess = this.save(basicPrintConfig);
+        }
+        // 修改
+        else {
+            // 一个学院只能对应一个印品配置方案
+            Long[] orgIds = basicPrintConfig.getOrgIds();
+            QueryWrapper<BasicTemplateOrg> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(BasicTemplateOrg::getType, TemplateTypeEnum.PRINT_CONFIG)
+                    .in(BasicTemplateOrg::getOrgId, orgIds).ne(BasicTemplateOrg::getRuleId, basicPrintConfig.getId());
+            List<BasicTemplateOrg> basicTemplateOrgList = basicTemplateOrgService.list(queryWrapper);
+            if (basicTemplateOrgList != null && basicTemplateOrgList.size() > 0) {
+//                List<Long> useOrgIds = basicTemplateOrgList.stream().map(BasicTemplateOrg::getOrgId).collect(Collectors.toList());
+//                List<SysOrg> sysOrgList = sysOrgService.findByOrgIds(useOrgIds);
+                throw ExceptionResultEnum.ERROR.exception("有"+basicTemplateOrgList.size()+"个机构已经设置了印品,不能重复设置");
+            }
+
+            basicPrintConfig.setUpdateId(sysUser.getId());
+            basicPrintConfig.setUpdateTime(System.currentTimeMillis());
+
+            //删除权限
+            basicTemplateOrgService.removeByRuleId(basicPrintConfig.getId());
+            isSuccess = this.updateById(basicPrintConfig);
+
+        }
+
+        // 新增权限
+        basicTemplateOrgService.saveBatch(schoolId, TemplateTypeEnum.PRINT_CONFIG, basicPrintConfig.getId(), basicPrintConfig.getOrgIds(), basicPrintConfig.getCreateId());
+
+        return isSuccess;
+    }
+}

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.bean.dto.BasicPrintConfigDto;
 import com.qmth.distributed.print.business.bean.dto.CardCustDto;
 import com.qmth.distributed.print.business.bean.dto.CardDetailDto;
 import com.qmth.distributed.print.business.bean.dto.SyncExamCardDto;
@@ -262,6 +263,14 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
         return this.baseMapper.listSyncCardByCourseCodeAndPaperNumber(schoolId, courseCode, paperNumber);
     }
 
+    @Override
+    public IPage<ExamCard> listPage(Boolean enable, Long createStartTime, Long createEndTime, String courseCode, String type, Integer pageNumber, Integer pageSize) {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        Page<ExamCard> page = new Page<>(pageNumber, pageSize);
+        IPage<ExamCard> examCardIPage = this.baseMapper.listPage(page, schoolId, enable, createStartTime, createEndTime, courseCode, type);
+        return null;
+    }
+
     /**
      * 数据验证
      *

+ 48 - 0
distributed-print-business/src/main/resources/mapper/BasicExamMapper.xml

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.qmth.distributed.print.business.mapper.BasicExamMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qmth.teachcloud.common.entity.BasicExam">
+        <result column="id" property="id" />
+        <result column="school_id" property="schoolId" />
+        <result column="semester_id" property="semesterId" />
+        <result column="name" property="name" />
+        <result column="category" property="category" />
+        <result column="exam_model" property="examModel" />
+        <result column="enable" property="enable" />
+        <result column="create_id" property="createId" />
+        <result column="create_time" property="createTime" />
+        <result column="update_id" property="updateId" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+
+    <select id="findBasicExamPage" resultType="com.qmth.distributed.print.business.bean.dto.BasicExamDto">
+        SELECT
+            a.id,
+            a.school_id schoolId,
+            a.semester_id semesterId,
+            b.NAME semesterName,
+            a.NAME,
+            a.category,
+            a.exam_model examModel,
+            a.ENABLE,
+            a.create_id createId,
+            a.create_time createTime,
+            a.update_id updateId,
+            a.update_time updateTime
+        FROM
+            basic_exam a
+        LEFT JOIN basic_semester b ON a.semester_id = b.id
+        <where>
+            a.school_id = #{schoolId}
+            <if test="semesterId != null and semesterId != ''">
+                and a.semester_id = #{semesterId}
+            </if>
+            <if test="enable != null and enable != ''">
+                and a.enable = #{enable}
+            </if>
+        </where>
+    </select>
+</mapper>

+ 50 - 0
distributed-print-business/src/main/resources/mapper/BasicPrintConfigMapper.xml

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.qmth.distributed.print.business.mapper.BasicPrintConfigMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qmth.teachcloud.common.entity.BasicPrintConfig">
+        <result column="id" property="id" />
+        <result column="school_id" property="schoolId" />
+        <result column="enable" property="enable" />
+        <result column="card_rule_id" property="cardRuleId" />
+        <result column="print_content" property="printContent" />
+        <result column="backup_method" property="backupMethod" />
+        <result column="backup_count" property="backupCount" />
+        <result column="draw_rule" property="drawRule" />
+        <result column="variable_content" property="variableContent" />
+        <result column="ordinary_content" property="ordinaryContent" />
+        <result column="create_id" property="createId" />
+        <result column="create_time" property="createTime" />
+        <result column="update_id" property="updateId" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, school_id, enable, card_rule_id, print_content, backup_method, backup_count, draw_rule, variable_content, ordinary_content, create_id, create_time, update_id, update_time
+    </sql>
+
+    <select id="listPage" resultType="com.qmth.distributed.print.business.bean.dto.BasicPrintConfigDto">
+        select
+        <include refid="Base_Column_List"></include>
+        from basic_print_config
+        <where>
+            <if test="schoolId != null and schoolId != ''">
+                and school_id = #{schoolId}
+            </if>
+            <if test="examId != null and examId != ''">
+                and exam_id = #{examId}
+            </if>
+            <if test="enable != null">
+                and enable = #{enable}
+            </if>
+            <if test="createStartTime != null and createStartTime != ''">
+                and create_time &gt;= #{createStartTime}
+            </if>
+            <if test="createEndTime != null and createEndTime != ''">
+                and create_time &lt;= #{createEndTime}
+            </if>
+        </where>
+    </select>
+</mapper>

+ 26 - 0
distributed-print-business/src/main/resources/mapper/ExamCardMapper.xml

@@ -6,14 +6,19 @@
     <resultMap id="BaseResultMap" type="com.qmth.distributed.print.business.entity.ExamCard">
         <result column="id" property="id"/>
         <result column="school_id" property="schoolId"/>
+        <result column="org_id" property="orgId"/>
         <result column="course_code" property="courseCode"/>
         <result column="course_name" property="courseName"/>
         <result column="title" property="title"/>
         <result column="make_method" property="makeMethod"/>
+        <result column="status" property="status"/>
         <result column="create_id" property="createId"/>
         <result column="create_time" property="createTime"/>
         <result column="update_id" property="updateId"/>
         <result column="update_time" property="updateTime"/>
+        <result column="type" property="type"/>
+        <result column="template_id" property="templateId"/>
+        <result column="sync_status" property="syncStatus"/>
     </resultMap>
 
     <!-- 通用查询结果列 -->
@@ -180,4 +185,25 @@
                 AND c.status = 'SUBMIT'
                 AND c.make_method != 'SELECT'
     </select>
+    <select id="listPage" resultMap="BaseResultMap">
+        select * from exam_card
+        <where>
+            school_id = #{schoolId}
+            <if test="enable != null and enable != ''">
+                and enable = #{enable}
+            </if>
+            <if test="createStartTime != null and createStartTime != ''">
+                and create_time &gt;= #{createStartTime}
+            </if>
+            <if test="createEndTime != null and createEndTime != ''">
+                and create_time &lt;= #{createEndTime}
+            </if>
+            <if test="type != null and type != ''">
+                and type = #{type}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                and course_code = #{courseCode}
+            </if>
+        </where>
+    </select>
 </mapper>

+ 113 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/BasicExamController.java

@@ -0,0 +1,113 @@
+package com.qmth.distributed.print.api;
+
+
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicExam;
+import com.qmth.distributed.print.business.service.BasicExamService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import io.swagger.annotations.*;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+/**
+ * <p>
+ * 考试管理 前端控制器
+ * </p>
+ */
+@Api(tags = "考试管理controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.basic}/exam")
+public class BasicExamController {
+    @Resource
+    private BasicExamService basicExamService;
+
+    /**
+     * 考试分页查询
+     *
+     * @param semesterId 学期ID
+     * @param enable     是否启用
+     * @param pageNumber 分页参数
+     * @param pageSize   分页参数
+     */
+    @ApiOperation(value = "考试管理-查询")
+    @RequestMapping(value = "/page", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result pageExam(@RequestParam(value = "semesterId", required = false) Boolean semesterId,
+                           @RequestParam(value = "enable", required = false) Boolean enable,
+                           @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                           @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(basicExamService.basicExamPage(semesterId, enable, pageNumber, pageSize));
+    }
+
+    /**
+     * 模糊查询
+     *
+     * @param inUsed 1:只查询当前使用的学期  0:只查询不是当前使用的学期  null:查询所有
+     */
+    @ApiOperation(value = "考试模糊查询")
+    @RequestMapping(value = "/query", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    public Result query(@RequestParam(value = "inUsed", required = false) Boolean inUsed) {
+        return ResultUtil.ok(basicExamService.query(inUsed));
+    }
+
+    /**
+     * 新增、编辑
+     *
+     * @param basicExam 考试entity
+     */
+    @ApiOperation(value = "考试管理-新增/编辑")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = EditResult.class)})
+    public Result saveBasicExam(@Valid @RequestBody BasicExam basicExam, BindingResult bindingResult) throws IllegalAccessException {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        return ResultUtil.ok(basicExamService.saveBasicExam(basicExam));
+    }
+
+    /**
+     * 启用/禁用
+     *
+     * @param basicExam 参数
+     */
+    @ApiOperation(value = "启用/禁用")
+    @RequestMapping(value = "/enable", method = RequestMethod.POST)
+    public Result enable(@ApiParam(value = "考试id", required = true) @RequestParam Long id,
+                         @ApiParam(value = "启用/禁用", required = true) @RequestParam Boolean enable) {
+        boolean isSuccess = basicExamService.enable(id, enable);
+        return ResultUtil.ok(isSuccess);
+    }
+
+    /**
+     * 考试删除
+     *
+     * @param id 考试ID
+     */
+    @ApiOperation(value = "考试管理-删除(逻辑)")
+    @RequestMapping(value = "/delete", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
+    public Result deleteBasicSemester(@ApiParam(value = "考试id", required = true) @RequestParam String id) {
+        return ResultUtil.ok(basicExamService.deleteBasicExamById(SystemConstant.convertIdToLong(id)));
+    }
+
+    /**
+     * 设置为当前使用考试
+     *
+     * @param id 考试ID
+     */
+    @ApiOperation(value = "考试管理-设置为当前使用考试")
+    @RequestMapping(value = "/set_in_used", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = EditResult.class)})
+    public Result saveBasicExam(@RequestParam("id") Long id) {
+        return ResultUtil.ok(basicExamService.setInUsed(id));
+    }
+}

+ 82 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/BasicPrintConfigController.java

@@ -0,0 +1,82 @@
+package com.qmth.distributed.print.api;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.dto.BasicPrintConfigDto;
+import com.qmth.teachcloud.common.entity.BasicPrintConfig;
+import com.qmth.distributed.print.business.service.BasicPrintConfigService;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+
+/**
+ * <p>
+ * 印品配置 前端控制器
+ * </p>
+ *
+ * @author xf
+ * @since 2022-02-10
+ */
+@Api(tags = "印品配置Controller")
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.basic}/print_config")
+@Validated
+public class BasicPrintConfigController {
+
+    @Resource
+    private BasicPrintConfigService basicPrintConfigService;
+
+    /**
+     *  分页查询
+     * @param enable 启用/禁用
+     * @param createStartTime 创建开始时间
+     * @param createEndTime 创建结束时间
+     * @param pageNumber 分页页码
+     * @param pageSize 分页数量
+     */
+    @ApiOperation(value = "分页查询")
+    @RequestMapping(value = "/page", method = RequestMethod.POST)
+    public Result list(@RequestParam(value = "examId", required = false) Long examId,
+                       @RequestParam(value = "enable", required = false) Boolean enable,
+                       @RequestParam(value = "createStartTime", required = false) Long createStartTime,
+                       @RequestParam(value = "createEndTime", required = false) Long createEndTime,
+                       @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        IPage<BasicPrintConfigDto> printConfigDtoIPage = basicPrintConfigService.listPage(examId, enable, createStartTime, createEndTime, pageNumber, pageSize);
+        return ResultUtil.ok(printConfigDtoIPage);
+    }
+
+    /**
+     * 新增/修改
+     *
+     * @param basicPrintConfig 参数
+     */
+    @ApiOperation(value = "新增/修改")
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
+    public Result save(@RequestBody BasicPrintConfig basicPrintConfig) {
+        boolean isSuccess = basicPrintConfigService.savePrintConfig(basicPrintConfig);
+        return ResultUtil.ok(isSuccess);
+    }
+
+    /**
+     * 启用/禁用
+     *
+     */
+    @ApiOperation(value = "启用/禁用")
+    @RequestMapping(value = "/enable", method = RequestMethod.POST)
+    public Result enable(@RequestParam(value = "id", required = false) Long id,
+                         @RequestParam(value = "enable", required = false) Boolean enable) {
+        boolean isSuccess = basicPrintConfigService.enable(id, enable);
+        return ResultUtil.ok(isSuccess);
+    }
+}
+

+ 16 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamCardController.java

@@ -3,10 +3,12 @@ package com.qmth.distributed.print.api;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.dto.BasicPrintConfigDto;
 import com.qmth.distributed.print.business.bean.dto.CardCustDto;
 import com.qmth.distributed.print.business.bean.dto.CardDetailDto;
 import com.qmth.distributed.print.business.bean.params.ExamCardParams;
 import com.qmth.distributed.print.business.entity.ExamCard;
+import com.qmth.distributed.print.business.enums.CardTypeEnum;
 import com.qmth.distributed.print.business.service.ExamCardService;
 import com.qmth.teachcloud.common.bean.params.ArraysParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -40,6 +42,20 @@ public class ExamCardController {
     @Autowired
     private ExamCardService examCardService;
 
+
+    @ApiOperation(value = "分页查询")
+    @RequestMapping(value = "/page", method = RequestMethod.POST)
+    public Result page(@RequestParam(value = "enable", required = false) Boolean enable,
+                       @RequestParam(value = "createStartTime", required = false) Long createStartTime,
+                       @RequestParam(value = "createEndTime", required = false) Long createEndTime,
+                       @RequestParam(value = "courseCode", required = false) String courseCode,
+                       @RequestParam(value = "type", required = false) String type,
+                       @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+                       @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        IPage<ExamCard> examCardIPage = examCardService.listPage(enable, createStartTime, createEndTime, courseCode, type, pageNumber, pageSize);
+        return ResultUtil.ok(examCardIPage);
+    }
+
     /**
      * 新建
      *

+ 95 - 44
distributed-print/src/main/java/com/qmth/distributed/print/api/SysController.java

@@ -11,6 +11,7 @@ import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.entity.ExamPrintPlan;
 import com.qmth.distributed.print.business.entity.TBSyncTask;
 import com.qmth.distributed.print.business.enums.DictionaryEnum;
+import com.qmth.distributed.print.business.enums.LoginTypeEnum;
 import com.qmth.distributed.print.business.service.BasicVerifyCodeService;
 import com.qmth.distributed.print.business.service.ExamPrintPlanService;
 import com.qmth.distributed.print.business.service.PrintCommonService;
@@ -138,15 +139,72 @@ public class SysController {
             }
         }
         QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
-        wrapper.lambda().eq(SysUser::getLoginName, login.getLoginName());
-        if (!login.getSchoolCode().equalsIgnoreCase(SystemConstant.ADMIN_CODE)) {
+        if (Objects.nonNull(basicSchool)) {
             wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId());
         }
-        List<SysUser> userList = sysUserService.list(wrapper);
-        //用户不存在
-        if (Objects.isNull(userList) || userList.size() == 0) {
-            throw ExceptionResultEnum.USER_NO_DATA.exception();
+        // 账号密码登录
+        List<SysUser> userList = null;
+        if (LoginTypeEnum.ACCOUNT.name().equals(login.getType())) {
+            String loginName = login.getLoginName();
+            String password = login.getPassword();
+            // 非空校验
+            if (StringUtils.isBlank(loginName)) {
+                throw ExceptionResultEnum.ERROR.exception("用户名不能为空");
+            }
+            if (StringUtils.isBlank(password)) {
+                throw ExceptionResultEnum.ERROR.exception("密码不能为空");
+            }
+            wrapper.lambda().eq(SysUser::getLoginName, loginName);
+            userList = sysUserService.list(wrapper);
+
+            //用户不存在
+            if (userList == null || userList.isEmpty()) {
+                throw ExceptionResultEnum.ERROR.exception("用户不存在");
+            }
+            if (userList.size() > 1) {
+                throw ExceptionResultEnum.ERROR.exception("查出多个用户");
+            }
+
+            SysUser sysUser = userList.get(0);
+            if (!sysUser.getEnable()) {
+                throw ExceptionResultEnum.ERROR.exception("用户被禁用");
+            }
+
+            if (!password.equals(userList.get(0).getPassword())) {
+                throw ExceptionResultEnum.ERROR.exception("密码错误");
+            }
+        } else if (LoginTypeEnum.PHONE.name().equals(login.getType())) {
+            String mobileNumber = login.getMobileNumber();
+            String code = login.getCode();
+            // 非空校验
+            if (StringUtils.isBlank(mobileNumber)) {
+                throw ExceptionResultEnum.ERROR.exception("手机号不能为空");
+            }
+            if (StringUtils.isBlank(code)) {
+                throw ExceptionResultEnum.ERROR.exception("验证码不能为空");
+            }
+            wrapper.lambda().eq(SysUser::getMobileNumber, mobileNumber);
+            userList = sysUserService.list(wrapper);
+
+            //用户不存在
+            if (userList == null || userList.isEmpty()) {
+                throw ExceptionResultEnum.ERROR.exception("用户不存在");
+            }
+            if (userList.size() > 1) {
+                throw ExceptionResultEnum.ERROR.exception("查出多个用户");
+            }
+            SysUser sysUser = userList.get(0);
+            // 校验验证码
+            sysUserService.checkSmsCode(sysUser.getId(), sysUser.getMobileNumber(), code);
+
+            // 如果不是共用验证码再过期
+            if (!dictionaryConfig.smsDomain().getSmsNormalCode().equals(login.getCode())) {
+                sysUserService.expiredVerifyCode(sysUser.getId(), sysUser.getMobileNumber());
+            }
+        } else {
+            throw ExceptionResultEnum.ERROR.exception("登录参数错误");
         }
+
         if (login.getSchoolCode().equalsIgnoreCase(SystemConstant.ADMIN_CODE)) {
             userList.forEach(o -> {
                 AuthBean authBean = teachcloudCommonService.getUserAuth(o.getId());
@@ -157,21 +215,9 @@ public class SysController {
                 }
             });
         }
-        if (userList.size() > 1) {
-            throw ExceptionResultEnum.ERROR.exception("查询的用户有多条");
-        }
         SysUser sysUser = userList.get(0);
-        if (Objects.nonNull(sysUser.getSchoolId()) && sysUser.getSchoolId().longValue() != basicSchool.getId().longValue()) {
-            throw ExceptionResultEnum.ERROR.exception("用户学校不匹配");
-        }
-        // 校验验证码
-        sysUserService.checkSmsCode(sysUser.getId(), sysUser.getMobileNumber(), login.getCode());
         LoginResult loginResult = teachcloudCommonService.login(login.getPassword(), sysUser, AppSourceEnum.SYSTEM);
 
-        // 如果不是共用验证码再过期
-        if (!dictionaryConfig.smsDomain().getSmsNormalCode().equals(login.getCode())) {
-            sysUserService.expiredVerifyCode(sysUser.getId(), sysUser.getMobileNumber());
-        }
         return ResultUtil.ok(loginResult);
     }
 
@@ -199,8 +245,10 @@ public class SysController {
     @RequestMapping(value = "/get_verify_code", method = RequestMethod.POST)
     @Aac(auth = BOOL.FALSE)
     public Result getVerifyCode(@RequestBody LoginParam loginParam) {
-        String loginName = loginParam.getLoginName();
-        String password = loginParam.getPassword();
+        String mobileNumber = loginParam.getMobileNumber();
+        if (StringUtils.isBlank(mobileNumber)) {
+            throw ExceptionResultEnum.ERROR.exception("手机号不能为空");
+        }
         QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
         if (StringUtils.isNotBlank(loginParam.getSchoolCode())) {
             BasicSchool basicSchool = commonCacheService.schoolCache(loginParam.getSchoolCode());
@@ -208,29 +256,32 @@ public class SysController {
                 wrapper.lambda().eq(SysUser::getSchoolId, basicSchool.getId());
             }
         }
-        wrapper.lambda().eq(SysUser::getLoginName, loginName);
-        SysUser user = sysUserService.getOne(wrapper);
+        wrapper.lambda().eq(SysUser::getMobileNumber, mobileNumber);
+        List<SysUser> userList = sysUserService.list(wrapper);
+
         //用户不存在
-        if (Objects.isNull(user)) {
-            throw ExceptionResultEnum.ERROR.exception("用户不存在");
+        if (userList == null || userList.isEmpty()) {
+            throw ExceptionResultEnum.ERROR.exception("手机号不存在");
         }
-        if (!password.equals(user.getPassword())) {
-            throw ExceptionResultEnum.ERROR.exception("密码错误");
+        if (userList.size() > 1) {
+            throw ExceptionResultEnum.ERROR.exception("查出多个用户");
         }
-        String mobileNumber = loginParam.getMobileNumber();
-        if (!SystemConstant.strNotNull(mobileNumber)) {
-            mobileNumber = user.getMobileNumber();
+        SysUser sysUser = userList.get(0);
+
+        if (!sysUser.getEnable()) {
+            throw ExceptionResultEnum.ERROR.exception("手机号被禁用");
         }
+
         if (SystemConstant.strNotNull(mobileNumber)) {
-            basicVerifyCodeService.sendVeirfyCode(mobileNumber, user.getId());
+            basicVerifyCodeService.sendVeirfyCode(mobileNumber, sysUser.getId());
         }
-        int pwdCount = user.getPwdCount();
-        List<SysRole> sysRoleList = sysUserRoleService.listRoleByUserId(user.getId());
+        int pwdCount = sysUser.getPwdCount();
+        List<SysRole> sysRoleList = sysUserRoleService.listRoleByUserId(sysUser.getId());
         if (sysRoleList.stream().map(SysRole::getType).collect(Collectors.toSet()).contains(RoleTypeEnum.ADMIN)) {
-            mobileNumber = user.getLoginName() + "(特权用户)";
+            mobileNumber = sysUser.getLoginName() + "(特权用户)";
             pwdCount = 1;
         }
-        UserLoginCheckResult userLoginCheckResult = new UserLoginCheckResult(user.getId(), mobileNumber, pwdCount);
+        UserLoginCheckResult userLoginCheckResult = new UserLoginCheckResult(sysUser.getId(), mobileNumber, pwdCount);
         return ResultUtil.ok(userLoginCheckResult, "");
     }
 
@@ -287,8 +338,8 @@ public class SysController {
     @Transactional
     @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
     public Result fileExamPaperUpload(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
-                             @ApiParam(value = "上传文件类型", required = true) @RequestParam UploadFileEnum type) {
-        Map<String,EditResult> resultMap = new HashMap<>();
+                                      @ApiParam(value = "上传文件类型", required = true) @RequestParam UploadFileEnum type) {
+        Map<String, EditResult> resultMap = new HashMap<>();
         BasicAttachment basicOriginalAttachment = null;
         BasicAttachment basicTranslateAttachment = null;
         EditResult original = new EditResult();
@@ -298,7 +349,7 @@ public class SysController {
         try {
             pdfOriginalFile = FileUtil.multipartFileToFile(file);
             PageSizeEnum pageSizeEnum = PdfUtil.getPdfFormat(pdfOriginalFile);
-            switch (pageSizeEnum){
+            switch (pageSizeEnum) {
                 case A3:
                     basicOriginalAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type);
                     if (Objects.isNull(basicOriginalAttachment)) {
@@ -308,7 +359,7 @@ public class SysController {
                     original.setUrl(teachcloudCommonService.filePreview(basicOriginalAttachment.getPath()));
                     original.setPages(basicOriginalAttachment.getPages());
 
-                    BeanUtils.copyProperties(original,translate);
+                    BeanUtils.copyProperties(original, translate);
                     break;
                 case A4:
                     basicOriginalAttachment = printCommonService.saveAttachment(file, ServletUtil.getRequestMd5(), type);
@@ -322,10 +373,10 @@ public class SysController {
                     String destUrl = SystemConstant.PDF_TEMP_FILES_DIR + File.separator + file.getOriginalFilename();
                     localTempFile = new File(destUrl);
                     OutputStream out = new FileOutputStream(localTempFile);
-                    PdfUtil.concatPDFs(new FileInputStream(pdfOriginalFile),out,false);
+                    PdfUtil.concatPDFs(new FileInputStream(pdfOriginalFile), out, false);
                     // File转换成MutipartFile
                     FileInputStream inputStream = new FileInputStream(localTempFile);
-                    MultipartFile multipartFile = new MockMultipartFile(localTempFile.getName(),localTempFile.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);
+                    MultipartFile multipartFile = new MockMultipartFile(localTempFile.getName(), localTempFile.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);
                     basicTranslateAttachment = printCommonService.saveAttachment(multipartFile, DigestUtils.md5Hex(multipartFile.getBytes()), type);
                     translate.setId(basicTranslateAttachment.getId());
                     translate.setUrl(teachcloudCommonService.filePreview(basicTranslateAttachment.getPath()));
@@ -334,8 +385,8 @@ public class SysController {
                 default:
                     throw ExceptionResultEnum.ERROR.exception("请上传A4或A3格式的试卷文件");
             }
-            resultMap.put("original",original);
-            resultMap.put("translate",translate);
+            resultMap.put("original", original);
+            resultMap.put("translate", translate);
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
             if (Objects.nonNull(basicOriginalAttachment)) {
@@ -350,10 +401,10 @@ public class SysController {
                 ResultUtil.error(e.getMessage());
             }
         } finally {
-            if (Objects.nonNull(localTempFile)){
+            if (Objects.nonNull(localTempFile)) {
                 FileUtil.deleteFile(localTempFile);
             }
-            if (Objects.nonNull(pdfOriginalFile)){
+            if (Objects.nonNull(pdfOriginalFile)) {
                 FileUtil.deleteFile(pdfOriginalFile);
             }
         }

+ 106 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicExam.java

@@ -0,0 +1,106 @@
+package com.qmth.teachcloud.common.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.base.BaseEntity;
+import com.qmth.teachcloud.common.enums.ExamCategoryEnum;
+import com.qmth.teachcloud.common.enums.ExamModelEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * 考试表
+ */
+@ApiModel(value = "BasicExam对象", description = "考试表")
+public class BasicExam extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("school_id")
+    private Long schoolId;
+
+    @ApiModelProperty(value = "学期ID")
+    @TableField("semester_id")
+    private String semesterId;
+
+    @ApiModelProperty(value = "考试名称")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty(value = "考试类型")
+    @TableField("category")
+    private ExamCategoryEnum category;
+
+    @ApiModelProperty(value = "业务模式")
+    @TableField("exam_model")
+    private ExamModelEnum examModel;
+
+    @ApiModelProperty(value = "启用/禁用")
+    @TableField("enable")
+    private Boolean enable;
+
+    @ApiModelProperty(value = "是否当前使用")
+    @TableField("in_used")
+    private Boolean inUsed;
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getSemesterId() {
+        return semesterId;
+    }
+
+    public void setSemesterId(String semesterId) {
+        this.semesterId = semesterId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public ExamCategoryEnum getCategory() {
+        return category;
+    }
+
+    public void setCategory(ExamCategoryEnum category) {
+        this.category = category;
+    }
+
+    public ExamModelEnum getExamModel() {
+        return examModel;
+    }
+
+    public void setExamModel(ExamModelEnum examModel) {
+        this.examModel = examModel;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Boolean getInUsed() {
+        return inUsed;
+    }
+
+    public void setInUsed(Boolean inUsed) {
+        this.inUsed = inUsed;
+    }
+}

+ 176 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/BasicPrintConfig.java

@@ -0,0 +1,176 @@
+package com.qmth.teachcloud.common.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.base.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 印品
+ * </p>
+ *
+ * @author xf
+ * @since 2021-03-23
+ */
+@TableName("basic_print_config")
+public class BasicPrintConfig extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("school_id")
+    private Long schoolId;
+
+    @ApiModelProperty(value = "考试id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("exam_id")
+    private Long examId;
+
+    /**
+     * 1启用/0禁用
+     */
+    @TableField("enable")
+    private Boolean enable;
+
+    /**
+     * 题卡规则(-1代表通卡)
+     */
+    @ApiModelProperty(value = "题卡规则ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField("card_rule_id")
+    private Long cardRuleId;
+
+    /**
+     * 试卷、题卡
+     */
+    @TableField("print_content")
+    private String printContent;
+
+    /**
+     * 试卷题卡备份方式(ROOM按考场)
+     */
+    @TableField("backup_method")
+    private String backupMethod;
+
+    /**
+     * 试卷题卡备份数量
+     */
+    @TableField("backup_count")
+    private Integer backupCount;
+
+    /**
+     * 抽卷规则(ONE只抽一次,CIRCLE循环抽取)
+     */
+    @TableField("draw_rule")
+    private String drawRule;
+
+    /**
+     * 变量印品参数json
+     */
+    @TableField("variable_content")
+    private String variableContent;
+
+    /**
+     * 普通印品参数json
+     */
+    @TableField("ordinary_content")
+    private String ordinaryContent;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(exist = false)
+    private Long[] orgIds;
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Long getCardRuleId() {
+        return cardRuleId;
+    }
+
+    public void setCardRuleId(Long cardRuleId) {
+        this.cardRuleId = cardRuleId;
+    }
+
+    public String getPrintContent() {
+        return printContent;
+    }
+
+    public void setPrintContent(String printContent) {
+        this.printContent = printContent;
+    }
+
+    public String getBackupMethod() {
+        return backupMethod;
+    }
+
+    public void setBackupMethod(String backupMethod) {
+        this.backupMethod = backupMethod;
+    }
+
+    public Integer getBackupCount() {
+        return backupCount;
+    }
+
+    public void setBackupCount(Integer backupCount) {
+        this.backupCount = backupCount;
+    }
+
+    public String getDrawRule() {
+        return drawRule;
+    }
+
+    public void setDrawRule(String drawRule) {
+        this.drawRule = drawRule;
+    }
+
+    public String getVariableContent() {
+        return variableContent;
+    }
+
+    public void setVariableContent(String variableContent) {
+        this.variableContent = variableContent;
+    }
+
+    public String getOrdinaryContent() {
+        return ordinaryContent;
+    }
+
+    public void setOrdinaryContent(String ordinaryContent) {
+        this.ordinaryContent = ordinaryContent;
+    }
+
+    public Long[] getOrgIds() {
+        return orgIds;
+    }
+
+    public void setOrgIds(Long[] orgIds) {
+        this.orgIds = orgIds;
+    }
+}

+ 38 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/ExamCategoryEnum.java

@@ -0,0 +1,38 @@
+package com.qmth.teachcloud.common.enums;
+
+import java.util.Objects;
+
+/**
+ * 考试类型
+ */
+public enum ExamCategoryEnum {
+
+    ONLINE("线上考试"),
+
+    OFFLINE("线下考试");
+
+    private String desc;
+
+    private ExamCategoryEnum(String desc) {
+        this.desc = desc;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToName(String value) {
+        for (ExamCategoryEnum e : ExamCategoryEnum.values()) {
+            if (Objects.equals(value.trim(), e.getDesc())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+}

+ 38 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/ExamModelEnum.java

@@ -0,0 +1,38 @@
+package com.qmth.teachcloud.common.enums;
+
+import java.util.Objects;
+
+/**
+ * 考试业务模式
+ */
+public enum ExamModelEnum {
+
+    MODEL1("电子交卷环节需要提交考务数据"),
+    MODEL2("电子交卷环节不需要提交考务数据,只输入印刷份数即可"),
+    MODEL3("电子交卷环节不需要提交考务数据");
+
+    private String desc;
+
+    private ExamModelEnum(String desc) {
+        this.desc = desc;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param value
+     * @return
+     */
+    public static String convertToName(String value) {
+        for (ExamModelEnum e : ExamModelEnum.values()) {
+            if (Objects.equals(value.trim(), e.getDesc())) {
+                return e.name();
+            }
+        }
+        return null;
+    }
+}

+ 7 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysOrgService.java

@@ -127,4 +127,11 @@ public interface SysOrgService extends IService<SysOrg> {
      * @return 机构id集合
      */
     Set<Long> findDeepOrgIdListByOrgIdList(List<Long> orgIdList);
+
+    /**
+     *  根据ID查询
+     * @param useOrgIds id集合
+     * @return list
+     */
+    List<SysOrg> findByOrgIds(List<Long> useOrgIds);
 }

+ 7 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysOrgServiceImpl.java

@@ -359,6 +359,13 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
         return finishedIdSet;
     }
 
+    @Override
+    public List<SysOrg> findByOrgIds(List<Long> useOrgIds) {
+        QueryWrapper<SysOrg> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().in(SysOrg::getId, useOrgIds);
+        return this.list(queryWrapper);
+    }
+
     /**
      * 根据子机构id深度优先搜索其父机构们
      *

+ 0 - 4
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java

@@ -908,10 +908,6 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
      */
     @Override
     public LoginResult login(String password, SysUser sysUser, AppSourceEnum appSource) throws NoSuchAlgorithmException {
-        //密码不正确
-        if (!Objects.equals(password, sysUser.getPassword())) {
-            throw ExceptionResultEnum.PASSWORD_ERROR.exception();
-        }
         //停用
         if (!sysUser.getEnable()) {
             throw ExceptionResultEnum.USER_ENABLE.exception();