Parcourir la source

Merge remote-tracking branch 'refs/remotes/origin/hotfixes_v5.0.3_20240710_updates' into dev_v5.0.4

deason il y a 11 mois
Parent
commit
6aee67895b

+ 14 - 10
examcloud-core-oe-admin-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/admin/api/controller/ExamAuditController.java

@@ -13,6 +13,8 @@ import java.util.Set;
 
 import javax.servlet.http.HttpServletResponse;
 
+import cn.com.qmth.examcloud.api.commons.security.bean.UserDataRule;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordIllegallyService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -35,7 +37,6 @@ import cn.com.qmth.examcloud.core.oe.admin.dao.ExamRecordDataRepo;
 import cn.com.qmth.examcloud.core.oe.admin.dao.IllegallyTypeRepo;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordDataEntity;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.IllegallyTypeEntity;
-import cn.com.qmth.examcloud.core.oe.admin.dao.enums.AuditStatus;
 import cn.com.qmth.examcloud.core.oe.admin.dao.enums.SelectType;
 import cn.com.qmth.examcloud.core.oe.admin.service.AsyncExportService;
 import cn.com.qmth.examcloud.core.oe.admin.service.ExamAuditService;
@@ -71,6 +72,9 @@ public class ExamAuditController extends ControllerSupport {
     @Autowired
     private ExamAuditService examAuditService;
 
+    @Autowired
+    private ExamRecordIllegallyService examRecordIllegallyService;
+
     @Autowired
     private ExamRecordDataRepo examRecordDataRepo;
 
@@ -110,11 +114,11 @@ public class ExamAuditController extends ControllerSupport {
     @PostMapping("/discipline/list")
     @ApiOperation(value = "查询“违纪名单”列表(分页)")
     public Page<ExamAuditInfo> getExamAuditUnPassList(@RequestBody ExamAuditQuery query) {
-        query.setStatus(AuditStatus.UN_PASS.name());
         User user = getAccessUser();
-        query.setRootOrgId(user.getRootOrgId());
-        UserDataRules uds=new UserDataRules(getUserDataRule(DataRuleType.ORG), getUserDataRule(DataRuleType.COURSE));
-        Page<ExamAuditInfo> examAuditList = examAuditService.getExamAuditList(uds,query);
+        UserDataRule courseRule = super.getUserDataRule(DataRuleType.COURSE);
+        UserDataRule orgRule = super.getUserDataRule(DataRuleType.ORG);
+
+        Page<ExamAuditInfo> examAuditList = examRecordIllegallyService.getExamRecordIllegallyList(query, courseRule, orgRule);
 
         examAuditList.getContent().forEach(p -> {
             p.setIdentityNumber(IdentityNumberHelper.conceal(user.getRootOrgId(), p.getIdentityNumber()));
@@ -128,12 +132,12 @@ public class ExamAuditController extends ControllerSupport {
     public void exportExamAuditUnPassList(@RequestParam String query, HttpServletResponse response) throws Exception {
         ExamAuditQuery newQuery = new JsonMapper().parseJson(query, ExamAuditQuery.class);
         Check.isNull(newQuery, "请求参数不能为空!");
-        Check.isNull(newQuery.getExamId(), "请先选择考试批次!");
-
-        newQuery.setStatus(AuditStatus.UN_PASS.name());
         newQuery.setSelectType(SelectType.EXPORT);
-        UserDataRules uds=new UserDataRules(getUserDataRule(DataRuleType.ORG), getUserDataRule(DataRuleType.COURSE));
-        Page<ExamAuditInfo> page = examAuditService.getExamAuditList(uds,newQuery);
+
+        UserDataRule courseRule = super.getUserDataRule(DataRuleType.COURSE);
+        UserDataRule orgRule = super.getUserDataRule(DataRuleType.ORG);
+
+        Page<ExamAuditInfo> page = examRecordIllegallyService.getExamRecordIllegallyList(newQuery, courseRule, orgRule);
         List<ExamAuditExcel> list = ExamAuditEntityConvert.ofExcel(page);
         ExportUtils.exportEXCEL("违纪名单列表", ExamAuditExcel.class, list, response);
     }

+ 19 - 30
examcloud-core-oe-admin-base/src/main/java/cn/com/qmth/examcloud/core/oe/admin/base/jpa/SqlWrapper.java

@@ -10,10 +10,7 @@ package cn.com.qmth.examcloud.core.oe.admin.base.jpa;
 import java.util.Collection;
 
 /**
- * 原生SQL包装类
- *
- * @author: QMTH
- * @since: 2018/8/28
+ * 常用SQL包装类
  */
 public class SqlWrapper {
 
@@ -39,10 +36,6 @@ public class SqlWrapper {
 
     private static final String LEFT_JOIN = " LEFT JOIN ";
 
-    private static final String UNION_ALL = " UNION ALL ";
-
-    private static final String UNION = " UNION ";
-
     private static final String ON = " ON ";
 
     private static final String AS = " AS ";
@@ -69,8 +62,6 @@ public class SqlWrapper {
 
     private static final String DESC = " DESC ";
 
-    private static final String HAVING = " HAVING ";
-
     private StringBuilder sql = new StringBuilder();
 
     public SqlWrapper select() {
@@ -144,11 +135,6 @@ public class SqlWrapper {
         return this;
     }
 
-    public SqlWrapper having() {
-        sql.append(HAVING);
-        return this;
-    }
-
     public SqlWrapper or() {
         sql.append(OR);
         return this;
@@ -164,13 +150,8 @@ public class SqlWrapper {
         return this;
     }
 
-    public SqlWrapper like(String fieldName, Number value) {
-        sql.append(fieldName).append(LIKE).append("'%").append(value).append("%'");
-        return this;
-    }
-
     public SqlWrapper eq(String fieldName, Number value) {
-        sql.append(fieldName).append(" = ").append("'").append(value).append("'");
+        sql.append(fieldName).append(" = ").append(value);
         return this;
     }
 
@@ -185,7 +166,7 @@ public class SqlWrapper {
     }
 
     public SqlWrapper notEq(String fieldName, Number value) {
-        sql.append(fieldName).append(" != ").append("'").append(value).append("'");
+        sql.append(fieldName).append(" != ").append(value);
         return this;
     }
 
@@ -195,7 +176,7 @@ public class SqlWrapper {
     }
 
     public SqlWrapper gt(String fieldName, Number value) {
-        sql.append(fieldName).append(" > ").append("'").append(value).append("'");
+        sql.append(fieldName).append(" > ").append(value);
         return this;
     }
 
@@ -205,7 +186,7 @@ public class SqlWrapper {
     }
 
     public SqlWrapper gte(String fieldName, Number value) {
-        sql.append(fieldName).append(" >= ").append("'").append(value).append("'");
+        sql.append(fieldName).append(" >= ").append(value);
         return this;
     }
 
@@ -215,7 +196,7 @@ public class SqlWrapper {
     }
 
     public SqlWrapper lt(String fieldName, Number value) {
-        sql.append(fieldName).append(" < ").append("'").append(value).append("'");
+        sql.append(fieldName).append(" < ").append(value);
         return this;
     }
 
@@ -225,7 +206,7 @@ public class SqlWrapper {
     }
 
     public SqlWrapper lte(String fieldName, Number value) {
-        sql.append(fieldName).append(" <= ").append("'").append(value).append("'");
+        sql.append(fieldName).append(" <= ").append(value);
         return this;
     }
 
@@ -282,21 +263,29 @@ public class SqlWrapper {
     }
 
     private String spilt(Collection<?> values) {
-        if (values == null || values.size() == 0) {
+        if (values == null || values.isEmpty()) {
             throw new IllegalArgumentException("Values must be not empty.");
         }
-        int index = 0, total = values.size();
+
         StringBuilder str = new StringBuilder();
+
+        int index = 0, total = values.size();
         for (Object value : values) {
-            if (!(value instanceof CharSequence || value instanceof Number)) {
+            if (value instanceof Number) {
+                str.append(value);
+            } else if (value instanceof CharSequence) {
+                str.append("'").append(value).append("'");
+            } else {
                 throw new IllegalArgumentException("Values must be charSequence or number.");
             }
-            str.append(value.toString());
+
             if (index < (total - 1)) {
                 str.append(",");
             }
+
             index++;
         }
+
         return str.toString();
     }
 

+ 12 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/ExamRecordIllegallyService.java

@@ -0,0 +1,12 @@
+package cn.com.qmth.examcloud.core.oe.admin.service;
+
+import cn.com.qmth.examcloud.api.commons.security.bean.UserDataRule;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit.ExamAuditInfo;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit.ExamAuditQuery;
+import org.springframework.data.domain.Page;
+
+public interface ExamRecordIllegallyService {
+
+    Page<ExamAuditInfo> getExamRecordIllegallyList(ExamAuditQuery query, UserDataRule courseRule, UserDataRule orgRule);
+
+}

+ 190 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamRecordIllegallyServiceImpl.java

@@ -0,0 +1,190 @@
+package cn.com.qmth.examcloud.core.oe.admin.service.impl;
+
+import cn.com.qmth.examcloud.api.commons.security.bean.UserDataRule;
+import cn.com.qmth.examcloud.core.oe.admin.base.jpa.SpecUtils;
+import cn.com.qmth.examcloud.core.oe.admin.base.utils.Check;
+import cn.com.qmth.examcloud.core.oe.admin.dao.enums.CourseLevel;
+import cn.com.qmth.examcloud.core.oe.admin.dao.enums.SelectType;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordIllegallyService;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit.ExamAuditInfo;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit.ExamAuditQuery;
+import cn.com.qmth.examcloud.support.cache.CacheHelper;
+import cn.com.qmth.examcloud.support.cache.bean.CourseCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.OrgCacheBean;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Pageable;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ExamRecordIllegallyServiceImpl implements ExamRecordIllegallyService {
+
+    private static final Logger log = LoggerFactory.getLogger(ExamRecordIllegallyServiceImpl.class);
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @Override
+    public Page<ExamAuditInfo> getExamRecordIllegallyList(ExamAuditQuery query, UserDataRule courseRule,
+            UserDataRule orgRule) {
+        Check.isNull(query, "请求参数不能为空!");
+        Check.isNull(query.getExamId(), "请先选择考试!");
+
+        Pageable pageable = SpecUtils.buildPageable(query.getPageNo(), query.getPageSize());
+        if (courseRule.assertEmptyQueryResult() || orgRule.assertEmptyQueryResult()) {
+            return Page.empty(pageable);
+        }
+
+        int offset = (query.getPageNo() - 1) * query.getPageSize();
+        String countSql = this.queryExamRecordIllegallyListSql(query, true, courseRule, orgRule);
+        String querySql = this.queryExamRecordIllegallyListSql(query, false, courseRule, orgRule);
+        String pageSql = querySql + " limit " + offset + "," + query.getPageSize();
+
+        if (SelectType.EXPORT == query.getSelectType()) {
+            // 仅导出结果
+            List<ExamAuditInfo> list = jdbcTemplate.query(querySql, new BeanPropertyRowMapper(ExamAuditInfo.class));
+            // 填充其它信息
+            this.fillOtherInfo(list, query.getExamId());
+            return new PageImpl<>(list, pageable, list.size());
+        }
+
+        Long totalElements = jdbcTemplate.queryForObject(countSql, Long.class);
+        if (totalElements == null || totalElements == 0) {
+            return Page.empty(pageable);
+        }
+
+        List<ExamAuditInfo> list = jdbcTemplate.query(pageSql, new BeanPropertyRowMapper(ExamAuditInfo.class));
+        if (CollectionUtils.isEmpty(list)) {
+            return Page.empty(pageable);
+        }
+
+        // 填充其它信息
+        this.fillOtherInfo(list, query.getExamId());
+
+        return new PageImpl<>(list, pageable, totalElements);
+    }
+
+    private void fillOtherInfo(List<ExamAuditInfo> list, Long examId) {
+        ExamSettingsCacheBean exam = CacheHelper.getExamSettings(examId);
+        for (ExamAuditInfo info : list) {
+            // 考试名称
+            info.setExamName(exam.getName());
+
+            // 学习中心名称
+            OrgCacheBean org = CacheHelper.getOrg(info.getOrgId());
+            info.setOrgName(org.getName());
+
+            // 课程信息
+            CourseCacheBean course = CacheHelper.getCourse(info.getCourseId());
+            info.setCourseCode(course.getCode());
+            info.setCourseName(course.getName());
+            info.setCourseLevel(CourseLevel.getCourseLevel(course.getLevel()).getTitle());
+        }
+    }
+
+    private String queryExamRecordIllegallyListSql(ExamAuditQuery query, boolean isCount, UserDataRule courseRule,
+            UserDataRule orgRule) {
+        StringBuilder sql = new StringBuilder();
+        if (isCount) {
+            sql.append(" select count(1)");
+        } else {
+            sql.append(" select rd.id AS examRecordDataId,rd.exam_id,rd.exam_type,");
+            sql.append(" rd.course_id,rd.org_id,rd.exam_stage_id,rd.student_id,");
+            sql.append(" rd.exam_student_id,rd.student_code,rd.student_name,rd.identity_number,");
+            sql.append(" rd.start_time AS paperStartTime,rd.end_time AS paperSubmitTime,rd.exam_order,");
+            sql.append(" rd.face_total_count,rd.face_success_count,rd.face_failed_count,");
+            sql.append(" rd.face_success_percent,rd.face_stranger_count,rd.face_verify_result,");
+            sql.append(" rd.switch_screen_count,sco.objective_score,a.id,a.status,ill.name AS discipline_type,");
+            sql.append(" a.discipline_detail,a.audit_user_name,a.update_time AS paperAuditTime,");
+            sql.append(" (select GROUP_CONCAT(DISTINCT pr.source_ip) from ec_oe_exam_process_record pr")
+                    .append(" where pr.exam_record_data_id = rd.id) ip");
+        }
+
+        sql.append(" from ec_oe_exam_record_data rd ");
+        sql.append(" left join ec_oe_exam_audit a on a.exam_record_data_id = rd.id");
+        sql.append(" left join ec_oe_illegally_type ill on ill.code = a.discipline_type")
+                .append(" and (ill.root_org_id = -1 or ill.root_org_id = rd.root_org_id)");
+        sql.append(" left join ec_oe_exam_score sco on sco.exam_record_data_id = rd.id");
+
+        sql.append(" where rd.exam_id = ").append(query.getExamId());
+        sql.append(" and rd.exam_record_status != 'EXAM_INVALID'");
+        sql.append(" and exists (");
+        sql.append(" select aa.exam_record_data_id from ec_oe_exam_audit aa");
+        sql.append(" where aa.exam_record_data_id = rd.id and aa.status = 'UN_PASS'");
+        if (StringUtils.isNotBlank(query.getDisciplineType())) {
+            sql.append(" and aa.discipline_type = '").append(query.getDisciplineType()).append("'");
+        }
+        sql.append(" )");
+
+        if (courseRule.assertNeedQueryRefIds()) {
+            // 限定课程数据权限范围
+            if (query.getCourseId() != null) {
+                if (courseRule.getRefIds().contains(query.getCourseId())) {
+                    sql.append(" and rd.course_id = ").append(query.getCourseId());
+                } else {
+                    // 不在数据权限范围内,无效查询
+                    sql.append(" and rd.course_id = -1");
+                }
+            } else {
+                sql.append(" and rd.course_id in (").append(StringUtils.join(courseRule.getRefIds(), ",")).append(")");
+            }
+        } else {
+            // 未限定数据权限
+            if (query.getCourseId() != null) {
+                sql.append(" and rd.course_id = ").append(query.getCourseId());
+            }
+        }
+
+        if (orgRule.assertNeedQueryRefIds()) {
+            // 限定机构数据权限范围
+            if (query.getOrgId() != null) {
+                if (orgRule.getRefIds().contains(query.getOrgId())) {
+                    sql.append(" and rd.org_id = ").append(query.getOrgId());
+                } else {
+                    // 不在数据权限范围内,无效查询
+                    sql.append(" and rd.org_id = -1");
+                }
+            } else {
+                sql.append(" and rd.org_id in (").append(StringUtils.join(orgRule.getRefIds(), ",")).append(")");
+            }
+        } else {
+            // 未限定数据权限
+            if (query.getOrgId() != null) {
+                sql.append(" and rd.org_id = ").append(query.getOrgId());
+            }
+        }
+
+        if (query.getExamStageId() != null) {
+            sql.append(" and rd.exam_stage_id = ").append(query.getExamStageId());
+        }
+        if (StringUtils.isNotBlank(query.getCourseLevel())) {
+            sql.append(" and rd.course_level = '").append(query.getCourseLevel()).append("'");
+        }
+        if (StringUtils.isNotBlank(query.getIdentityNumber())) {
+            sql.append(" and rd.identity_number like '").append(query.getIdentityNumber()).append("%'");
+        }
+        if (StringUtils.isNotBlank(query.getStudentCode())) {
+            sql.append(" and rd.student_code like '").append(query.getStudentCode()).append("%'");
+        }
+        if (StringUtils.isNotBlank(query.getStudentName())) {
+            sql.append(" and rd.student_name like '").append(query.getStudentName()).append("%'");
+        }
+
+        if (!isCount) {
+            sql.append(" order by rd.update_time desc");
+        }
+
+        return sql.toString();
+    }
+
+}

+ 1 - 1
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/pushscore/cup/CupExamScorePushServiceImpl.java

@@ -110,7 +110,7 @@ public class CupExamScorePushServiceImpl implements ExamScorePushService {
                     .setParameter("loginId", "bjsy")
                     .setParameter("password", "1111")
                     .setParameter("examRemark", examScorePushInfo.getExamName())
-                    .setParameter("examStuRemark", "recruit")
+                    .setParameter("examStuRemark", "studying")
                     .setParameter("scoreJsonStr", scoreStr)//通过查询参数的方式传递
                     .build();
             HttpPost httpPost = new HttpPost(uri);