浏览代码

Merge remote-tracking branch 'origin/dev_v3.4.2' into dev_v3.4.2

wangliang 8 月之前
父节点
当前提交
aef3e12d69

+ 45 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/StudentNumberConfigDto.java

@@ -0,0 +1,45 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @Description: 学号配置dto
+ * @Author: CaoZixuan
+ * @Date: 2024-10-10
+ */
+public class StudentNumberConfigDto {
+    @ApiModelProperty("学号位数")
+    private Integer digit;
+
+    @ApiModelProperty("是否包含字母")
+    private Boolean containsLetter;
+
+    @ApiModelProperty("字母映射关系")
+    private List<StudentNumberLetterRelationShipDto> relationList;
+
+    public Integer getDigit() {
+        return digit;
+    }
+
+    public void setDigit(Integer digit) {
+        this.digit = digit;
+    }
+
+    public Boolean getContainsLetter() {
+        return containsLetter;
+    }
+
+    public void setContainsLetter(Boolean containsLetter) {
+        this.containsLetter = containsLetter;
+    }
+
+    public List<StudentNumberLetterRelationShipDto> getRelationList() {
+        return relationList;
+    }
+
+    public void setRelationList(List<StudentNumberLetterRelationShipDto> relationList) {
+        this.relationList = relationList;
+    }
+}

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

@@ -0,0 +1,32 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 序号配置字母映射关系dto
+ * @Author: CaoZixuan
+ * @Date: 2024-10-10
+ */
+public class StudentNumberLetterRelationShipDto {
+    @ApiModelProperty("字母所在列")
+    private Integer columnIndex;
+
+    @ApiModelProperty("字母数组")
+    private String[] letters;
+
+    public Integer getColumnIndex() {
+        return columnIndex;
+    }
+
+    public void setColumnIndex(Integer columnIndex) {
+        this.columnIndex = columnIndex;
+    }
+
+    public String[] getLetters() {
+        return letters;
+    }
+
+    public void setLetters(String[] letters) {
+        this.letters = letters;
+    }
+}

+ 11 - 0
distributed-print-business/src/main/resources/db/log/脚本-caozx.sql → distributed-print-business/src/main/resources/db/log/czx.sql

@@ -18,3 +18,14 @@ INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, e
 INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3062', '课程大纲-审核报告保存', '/api/admin/obe/course_outline/audit/save', 'URL', '3000', '9', 'AUTH', '1', '1', '1');
 INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, related, enable, default_auth, front_display) VALUES ('3063', '审核', 'Audit', 'LINK', '3000', '8', 'AUTH', '3060,3062', '1', '0', '1');
 INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, related, enable, default_auth, front_display) VALUES ('3064', '审核&合理性', 'AuditAndRationality', 'LINK', '3000', '9', 'AUTH', '3061,3062', '1', '0', '1');
+
+-- 2024-10-11
+ALTER TABLE sys_config
+    CHANGE COLUMN config_value config_value MEDIUMTEXT NULL COMMENT '参数键值' ;
+
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3070', '学号配置保存', '/api/admin/set/student_number_config/save', 'URL', '508', '17', 'AUTH', '1', '0', '1');
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3071', '学号配置查询', '/api/admin/set/student_number_config/select', 'URL', '508', '18', 'AUTH', '1', '0', '1');
+
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3072', '查询学号字母映射关系', '/api/scan/config/student_number_letter_relation', 'URL', '970', '40', 'AUTH', '1', '1', '1');
+UPDATE sys_privilege SET related = '971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1007,1009,1010,1148,3072' WHERE (id = '970');
+UPDATE sys_privilege SET related = '971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1007,1009,1010,1148,3072' WHERE (id = '1006');

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

@@ -1,8 +1,11 @@
 package com.qmth.distributed.print.api;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.backup.MySQLDatabaseBackup;
+import com.qmth.distributed.print.business.bean.dto.StudentNumberConfigDto;
+import com.qmth.distributed.print.business.bean.dto.StudentNumberLetterRelationShipDto;
 import com.qmth.distributed.print.business.bean.params.SysAdminSetParam;
 import com.qmth.distributed.print.business.bean.result.CustomPrivilegeResult;
 import com.qmth.distributed.print.business.bean.result.SysAdminSetResult;
@@ -241,6 +244,85 @@ public class SysAdminSetController {
         return ResultUtil.ok(true);
     }
 
+    @ApiOperation(value = "学号配置查询")
+    @ApiResponses({@ApiResponse(code = 200, message = "学号配置查询", response = SysAdminSetResult.class)})
+    @RequestMapping(value = "/student_number_config/select", method = RequestMethod.POST)
+    public Result sysadminStudentNumberConfigSelect(@ApiParam(value = "学校id ", required = true) @RequestParam Long schoolId) {
+        List<SysConfigResult> resultList = new ArrayList<>();
+        // 试卷规格
+        SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.STUDENT_NUMBER_ALLOCATION);
+
+        SysConfigResult sysConfigResult;
+        if (Objects.nonNull(sysConfig)) {
+            sysConfigResult = new SysConfigResult(sysConfig);
+            StudentNumberConfigDto studentNumberConfigDto = JSON.parseObject(sysConfig.getConfigValue(), StudentNumberConfigDto.class);
+            sysConfigResult.setValue(studentNumberConfigDto);
+        } else {
+            StudentNumberConfigDto studentNumberConfigDto = new StudentNumberConfigDto();
+            studentNumberConfigDto.setDigit(0);
+            studentNumberConfigDto.setContainsLetter(false);
+            sysConfigResult = new SysConfigResult(null, SystemConstant.STUDENT_NUMBER_ALLOCATION, "学号配置",
+                    studentNumberConfigDto, 1);
+        }
+        resultList.add(sysConfigResult);
+        SysAdminSetResult sysAdminSetResult = new SysAdminSetResult(schoolId);
+        sysAdminSetResult.setResult(resultList);
+        return ResultUtil.ok(sysAdminSetResult);
+    }
+
+    @ApiOperation(value = "学号配置保存")
+    @ApiResponses({@ApiResponse(code = 200, message = "学号配置保存信息", response = ResultUtil.class)})
+    @RequestMapping(value = "/student_number_config/save", method = RequestMethod.POST)
+    @Transactional
+    public Result sysadminStudentNumberConfigSave(@Valid @RequestBody SysAdminSetParam sysAdminSetParam, BindingResult bindingResult) {
+        if (bindingResult.hasErrors()) {
+            return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
+        }
+        Optional.ofNullable(sysAdminSetParam.getParam()).orElseThrow(() -> ExceptionResultEnum.PARAMS_ERROR.exception("学号配置不能为空"));
+
+        List<SysConfigResult> sysConfigResultList = sysAdminSetParam.getParam();
+        List<SysConfig> sysConfigList = new ArrayList<>();
+        for (SysConfigResult s : sysConfigResultList) {
+            StudentNumberConfigDto studentNumberConfigDto = JSON.parseObject(JSON.toJSONString(s.getValue()), StudentNumberConfigDto.class);
+            Integer digit = studentNumberConfigDto.getDigit();
+            Boolean containsLetter = studentNumberConfigDto.getContainsLetter();
+            List<StudentNumberLetterRelationShipDto> relationList = studentNumberConfigDto.getRelationList();
+            if (containsLetter && CollectionUtils.isEmpty(relationList)) {
+                throw ExceptionResultEnum.ERROR.exception("学号配置中,包含字母时,必须配置字母对应关系");
+            }
+            for (StudentNumberLetterRelationShipDto studentNumberLetterRelationShipDto : relationList) {
+                Integer columnIndex = studentNumberLetterRelationShipDto.getColumnIndex();
+                if (columnIndex > digit) {
+                    throw ExceptionResultEnum.ERROR.exception(String.format("第[%s]列,字母所在列不能超过学号位数", columnIndex));
+                }
+                String[] letters = studentNumberLetterRelationShipDto.getLetters();
+                int x = letters.length;
+                if (x > 10) {
+                    throw ExceptionResultEnum.ERROR.exception(String.format("第[%s]列,字母对应关系中,字母个数不能超过10", columnIndex));
+                }
+                int y = (int) Arrays.stream(letters).distinct().count();
+                if (x != y) {
+                    throw ExceptionResultEnum.ERROR.exception(String.format("第[%s]列,字母对应关系中,字母不能重复", columnIndex));
+                }
+                for (String letter : letters) {
+                    // 正则判断必须是大写字母
+                    if (!letter.matches("[A-Z]")) {
+                        throw ExceptionResultEnum.ERROR.exception(String.format("第[%s]列,字母对应关系中,[%s]必须为大写字母", columnIndex, letter));
+                    }
+                }
+            }
+
+            SysConfig sysConfig = new SysConfig(sysAdminSetParam.getSchoolId(), s, true);
+            sysConfigList.add(sysConfig);
+        }
+        sysConfigService.saveOrUpdateBatch(sysConfigList);
+
+        for (SysConfigResult s : sysConfigResultList) {
+            commonCacheService.updateSysConfigCache(sysAdminSetParam.getSchoolId(), s.getCode());
+        }
+        return ResultUtil.ok(true);
+    }
+
     @ApiOperation(value = "用户验证查询")
     @ApiResponses({@ApiResponse(code = 200, message = "用户验证信息", response = SysAdminSetResult.class)})
     @RequestMapping(value = "/user/select", method = RequestMethod.POST)

+ 40 - 5
distributed-print/src/main/java/com/qmth/distributed/print/api/client/ScanController.java

@@ -1,10 +1,12 @@
 package com.qmth.distributed.print.api.client;
 
-
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.core.enums.Platform;
+import com.qmth.distributed.print.business.bean.dto.StudentNumberConfigDto;
+import com.qmth.distributed.print.business.bean.dto.StudentNumberLetterRelationShipDto;
 import com.qmth.distributed.print.business.bean.params.ClientLoginParam;
 import com.qmth.distributed.print.business.service.ClientService;
 import com.qmth.teachcloud.common.bean.auth.ExpireTimeBean;
@@ -12,6 +14,7 @@ import com.qmth.teachcloud.common.bean.result.LoginClientResult;
 import com.qmth.teachcloud.common.bean.result.LoginResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicSchool;
+import com.qmth.teachcloud.common.entity.SysConfig;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.TBSession;
 import com.qmth.teachcloud.common.enums.AppSourceEnum;
@@ -35,6 +38,8 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
@@ -54,12 +59,16 @@ public class ScanController {
 
     @Resource
     private TeachcloudCommonService teachcloudCommonService;
+
     @Resource
     private CommonCacheService commonCacheService;
+
     @Resource
     private ClientService clientService;
+
     @Resource
     private SysUserService sysUserService;
+
     @Resource
     private RedisUtil redisUtil;
 
@@ -70,9 +79,10 @@ public class ScanController {
      */
     @ApiOperation(value = "登录")
     @PostMapping("/login")
-    @ApiResponses({@ApiResponse(code = 200, message = "用户信息", response = LoginResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "用户信息", response = LoginResult.class) })
     @Aac(auth = false)
-    public Result login(@ApiParam(value = "用户信息", required = true) @Valid @RequestBody ClientLoginParam login, BindingResult bindingResult) throws NoSuchAlgorithmException {
+    public Result login(@ApiParam(value = "用户信息", required = true) @Valid @RequestBody ClientLoginParam login,
+            BindingResult bindingResult) throws NoSuchAlgorithmException {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
@@ -89,7 +99,8 @@ public class ScanController {
         }
         // 是否有打印端和扫描端权限
         Set<String> roles = clientService.getRoleByUserId(sysUser.getId());
-        if(CollectionUtils.isEmpty(roles) || (!roles.contains(RoleTypeEnum.PRINT.name()) && !roles.contains(RoleTypeEnum.SCANNER.name()))){
+        if (CollectionUtils.isEmpty(roles) || (!roles.contains(RoleTypeEnum.PRINT.name()) && !roles.contains(
+                RoleTypeEnum.SCANNER.name()))) {
             throw ExceptionResultEnum.ERROR.exception("没有客户端登录权限");
         }
 
@@ -98,6 +109,15 @@ public class ScanController {
         loginClientResult.setRoleList(roles);
         loginClientResult.setCanAddCard(sysUser.getAllowManualCard());
         loginClientResult.setCanScanCourse(sysUser.getAllowCourseScan());
+        boolean canUserLetter = false;
+        SysConfig sysConfig = commonCacheService.addSysConfigCache(basicSchool.getId(), SystemConstant.STUDENT_NUMBER_ALLOCATION);
+        if (Objects.nonNull(sysConfig)) {
+            StudentNumberConfigDto studentNumberConfigDto = JSON.parseObject(sysConfig.getConfigValue(),
+                    StudentNumberConfigDto.class);
+            canUserLetter = studentNumberConfigDto.getContainsLetter();
+        }
+        loginClientResult.setCanUseLetter(canUserLetter);
+
         return ResultUtil.ok(loginClientResult);
     }
 
@@ -106,7 +126,7 @@ public class ScanController {
     @PostMapping("server/status")
     public Result status(HttpServletRequest request) {
         ApiStatusVo vo = new ApiStatusVo();
-//        vo.setFileUriPrefix(fileUriPrefix);
+        //        vo.setFileUriPrefix(fileUriPrefix);
         vo.setVersion(SystemConstant.VERSION_VALUE);
         vo.setTime(System.currentTimeMillis());
         return ResultUtil.ok(vo);
@@ -123,4 +143,19 @@ public class ScanController {
         vo.setActiveTime(System.currentTimeMillis());
         return ResultUtil.ok(vo);
     }
+
+    @ApiOperation(value = "查询学号字母映射关系")
+    @PostMapping("config/student_number_letter_relation")
+    public Result findStudentNumberLetterRelation() {
+        List<StudentNumberLetterRelationShipDto> result = new ArrayList<>();
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        Long schoolId = sysUser.getSchoolId();
+        SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.STUDENT_NUMBER_ALLOCATION);
+        if (Objects.nonNull(sysConfig)) {
+            StudentNumberConfigDto studentNumberConfigDto = JSON.parseObject(sysConfig.getConfigValue(),
+                    StudentNumberConfigDto.class);
+            result = studentNumberConfigDto.getRelationList();
+        }
+        return ResultUtil.ok(result);
+    }
 }

+ 36 - 0
distributed-print/src/test/java/com/qmth/distributed/print/ServiceTest.java

@@ -3,11 +3,15 @@ package com.qmth.distributed.print;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.distributed.print.business.bean.dto.StudentNumberConfigDto;
+import com.qmth.distributed.print.business.bean.dto.StudentNumberLetterRelationShipDto;
 import com.qmth.distributed.print.business.bean.dto.examObject.ExamObjectDto;
+import com.qmth.distributed.print.business.bean.params.SysAdminSetParam;
 import com.qmth.distributed.print.business.entity.ExamPrintPlan;
 import com.qmth.distributed.print.business.entity.ExamStudent;
 import com.qmth.distributed.print.business.mapper.ExamStudentMapper;
 import com.qmth.distributed.print.business.service.*;
+import com.qmth.teachcloud.common.bean.result.SysConfigResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.BasicPrintConfig;
@@ -21,6 +25,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -71,6 +76,37 @@ public class ServiceTest {
 
     }
 
+    @Test
+    public void x() {
+        SysAdminSetParam sysAdminSetParam = new SysAdminSetParam();
+        sysAdminSetParam.setSchoolId(1L);
+
+        List<SysConfigResult> params = new ArrayList<>();
+        SysConfigResult param = new SysConfigResult();
+        param.setCode("student.number.allocation");
+        param.setName("学号配置");
+        StudentNumberConfigDto dto = new StudentNumberConfigDto();
+
+        List<StudentNumberLetterRelationShipDto> relationList = new ArrayList<>();
+        StudentNumberLetterRelationShipDto d1 = new StudentNumberLetterRelationShipDto();
+        d1.setColumnIndex(1);
+        d1.setLetters(new String[]{"A","B","C","D"});
+        relationList.add(d1);
+
+        StudentNumberLetterRelationShipDto d2 = new StudentNumberLetterRelationShipDto();
+        d2.setColumnIndex(2);
+        d2.setLetters(new String[]{"X","Y","Z"});
+        relationList.add(d2);
+
+        dto.setDigit(12);
+        dto.setContainsLetter(true);
+        dto.setRelationList(relationList);
+        param.setValue(dto);
+        params.add(param);
+        sysAdminSetParam.setParam(params);
+        System.out.println(JSON.toJSONString(sysAdminSetParam));
+    }
+
     @Test
     public void readExcelTest() {
         examDetailService.findExaminationFields(101L);

+ 10 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/LoginClientResult.java

@@ -74,6 +74,8 @@ public class LoginClientResult implements Serializable {
     private Boolean canAddCard;
     @ApiModelProperty(name = "是否允许识别课程条码")
     private Boolean canScanCourse;
+    @ApiModelProperty(name = "是否允许学号使用字母")
+    private Boolean canUseLetter;
 
     public String getReturnUrl() {
         return returnUrl;
@@ -239,6 +241,14 @@ public class LoginClientResult implements Serializable {
         this.canScanCourse = canScanCourse;
     }
 
+    public Boolean getCanUseLetter() {
+        return canUseLetter;
+    }
+
+    public void setCanUseLetter(Boolean canUseLetter) {
+        this.canUseLetter = canUseLetter;
+    }
+
     public class SchoolNativeBean implements Serializable {
 
         @ApiModelProperty(value = "id")

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

@@ -220,6 +220,7 @@ public class SystemConstant {
     public static final String TEACHCLOUD_EXCHANGE_HOST_URL = "teachcloud.exchange.host.url";
     public static final String PDF_SIZE_LIST = "pdf.size.list";
     public static final String CARD_SIZE_LIST = "card.size.list";
+    public static final String STUDENT_NUMBER_ALLOCATION = "student.number.allocation";
 
     /**
      * 系统常量

+ 21 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysConfig.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.common.entity;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -96,6 +97,26 @@ public class SysConfig extends BaseEntity implements Serializable {
         setCreateTime(System.currentTimeMillis());
     }
 
+    public SysConfig(Long schoolId, SysConfigResult sysConfigResult, boolean jsonValue) {
+        if (Objects.isNull(sysConfigResult.getId())) {
+            setId(SystemConstant.getDbUuid());
+        } else {
+            setId(sysConfigResult.getId());
+        }
+        this.schoolId = schoolId;
+        this.configKey = sysConfigResult.getCode();
+        this.configName = sysConfigResult.getName();
+        if (jsonValue) {
+            this.configValue = JSON.toJSONString(sysConfigResult.getValue());
+        } else {
+            this.configValue = String.valueOf(sysConfigResult.getValue());
+        }
+        this.enable = sysConfigResult.getEnable();
+        this.sort = sysConfigResult.getSort();
+        setCreateId(1L);
+        setCreateTime(System.currentTimeMillis());
+    }
+
     public SysConfig(Long schoolId, String configKey, String configName, String configValue) {
         setId(SystemConstant.getDbUuid());
         this.schoolId = schoolId;