Explorar o código

已限时已完成考试不允许首页弹框改造导致的首页登录失败问题修复

xiexh hai 5 días
pai
achega
9c4911a363

+ 29 - 0
ibps-provider-root/modules/provider-platform-default/src/main/java/com/lc/ibps/common/provider/DesktopFacadeProvider.java

@@ -9,6 +9,7 @@ import com.lc.ibps.api.base.query.QueryOP;
 import com.lc.ibps.base.core.constants.StringPool;
 import com.lc.ibps.base.core.exception.BaseException;
 import com.lc.ibps.base.core.monitor.StopWatchUtil;
+import com.lc.ibps.base.core.util.AppUtil;
 import com.lc.ibps.base.core.util.BeanUtils;
 import com.lc.ibps.base.core.util.I18nUtil;
 import com.lc.ibps.base.core.util.string.StringUtil;
@@ -18,6 +19,7 @@ import com.lc.ibps.base.db.model.DefaultQueryFilter;
 import com.lc.ibps.base.db.mybatis.domain.DefaultPage;
 import com.lc.ibps.base.db.tenant.utils.TenantUtil;
 import com.lc.ibps.base.framework.id.UniqueIdUtil;
+import com.lc.ibps.base.framework.table.ICommonDao;
 import com.lc.ibps.base.saas.context.TenantContext;
 import com.lc.ibps.base.web.context.ContextUtil;
 import com.lc.ibps.base.web.context.RequestContext;
@@ -51,6 +53,7 @@ import com.lc.ibps.org.party.persistence.entity.*;
 import com.lc.ibps.org.party.repository.*;
 import com.lc.ibps.org.spi.SpiUserService;
 import com.lc.ibps.org.spi.SpiUserServiceUtil;
+import com.lc.ibps.platform.service.DesktopFacadeService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -58,12 +61,14 @@ import net.sf.json.JSONObject;
 import org.slf4j.event.Level;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 桌面管理数据展示门面实现类
@@ -102,6 +107,8 @@ public class DesktopFacadeProvider extends GenericProvider implements IDesktopFa
 	private InnerMessageRepository innerMessageRepository;
 	@Autowired
 	private PartyUserNavigateRepository userNavigateRepository;
+	@Autowired
+	private ICommonDao<?> commonDao;
 	@Resource
 	private PartyEntityRepository partyEntityRepository;
 
@@ -244,11 +251,30 @@ public class DesktopFacadeProvider extends GenericProvider implements IDesktopFa
 		try {
 			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 			String currentDate = sdf.format(new Date());
+			DesktopFacadeService desktopFacadeService = AppUtil.getBean(DesktopFacadeService.class);
 			List<PartyUserCalendarPo> calendarPoList = calendarRepository.findByUserId(ContextUtil.getCurrentUserId());
+			//收集dataSourceId
+			List<String> dataSourceIds = calendarPoList.stream()
+					.filter(bean -> StringUtil.isNotBlank(bean.getDataSourceId()))
+					.map(PartyUserCalendarPo::getDataSourceId)
+					.collect(Collectors.toList());
+			//批量查询考试记录(一次SQL搞定)
+			Map<String, Map<String,Object>> records = desktopFacadeService.batchQueryExamInfo(dataSourceIds);
+			//从考试记录获取dataSourceId计算出对应的考试弹窗标志
+			Map<String, String> examStatusMap = desktopFacadeService.chargeExamPassingFlag(records);
 			for (PartyUserCalendarPo bean : calendarPoList){
 				if (BeanUtils.isEmpty(bean.getMarkDate()) || !bean.getMarkDate().equals(currentDate)){
 					bean.setPopUp(1);// 标记为弹窗提醒
 				}
+				// 检查考试通过状态
+				if (StringUtil.isNotBlank(bean.getDataSourceId())) {
+					String uniqueKey = bean.getDataSourceId() + "_" + ContextUtil.getCurrentUserId();
+					String flag = examStatusMap.get(uniqueKey);
+					if ("pass".equals(flag)) {
+						//logger.warn("已限制时间考试{}, id{},已通过取消弹窗提醒", bean.getTitle(), bean.getDataSourceId());
+						bean.setPopUp(0);
+					}
+				}
 			}
 			result.setData(calendarPoList);
 		} catch (Exception e) {
@@ -710,6 +736,9 @@ public class DesktopFacadeProvider extends GenericProvider implements IDesktopFa
 				queryFilter.addFilter("TYPE_", diDian, QueryOP.EQUAL);
 			}
 			List<NewsPo> list = newsRepository.query(queryFilter);
+			if(!isSuper && newsRepository.isTableExists("t_ggfwb")){
+				list = newsRepository.getScopeNews(list);
+			}
 			result.setData(list);
 //			queryFilter.setPage(null);
 //			int totalCount = newsRepository.query(queryFilter).size();

+ 101 - 2
ibps-provider-root/modules/provider-platform-default/src/main/java/com/lc/ibps/platform/service/DesktopFacadeService.java

@@ -1,8 +1,14 @@
 package com.lc.ibps.platform.service;
 
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
+import com.lc.ibps.base.framework.table.ICommonDao;
+import com.lc.ibps.base.web.context.ContextUtil;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -17,7 +23,9 @@ public class DesktopFacadeService {
 
 	@Autowired
 	private IDesktopFacadeService desktopFacadeService;
-	
+	@Autowired
+	private ICommonDao<?> commonDao;
+
 	/**
 	 * 个人信息
 	 * 
@@ -198,5 +206,96 @@ public class DesktopFacadeService {
 		}
 		return null;
 	}
-	
+	/**
+	 * 使用参数化查询,防止 SQL 注入
+	 * 查询考试记录
+	 */
+	public Map<String, Map<String, Object>> batchQueryExamInfo(List<String> dataSourceIds) {
+		Map<String, Map<String, Object>> resultMap = new HashMap<>();
+
+		if (dataSourceIds == null || dataSourceIds.isEmpty()) {
+			return resultMap;
+		}
+		List<String> distinctIds = dataSourceIds.stream().distinct().collect(Collectors.toList());
+		int batchSize = 500;
+		for (int i = 0; i < distinctIds.size(); i += batchSize) {
+			int end = Math.min(i + batchSize, distinctIds.size());
+			List<String> batchIds = distinctIds.subList(i, end);
+			// 使用命名参数格式 #{p0}, #{p1}, #{p2}...
+			StringBuilder sqlBuilder = new StringBuilder("SELECT * FROM v_examination WHERE examId IN (");
+			for (int j = 0; j < batchIds.size(); j++) {
+				if (j > 0) {
+					sqlBuilder.append(",");
+				}
+				sqlBuilder.append("#{p").append(j).append("}");
+			}
+			sqlBuilder.append(")");
+
+			List<Map<String, Object>> records = (List<Map<String, Object>>) commonDao.query(sqlBuilder.toString(), batchIds.toArray());
+			for (Map<String, Object> record : records) {
+				String uniqueKey = record.get("examId") + "_" + record.get("examinee");
+				resultMap.put(uniqueKey, record);
+			}
+		}
+		return resultMap;
+	}
+
+	public String chargeExamPassingStatus(Map<String, Object> record) {
+		//List<Map<String,Object>> list = desktopFacadeDao.selectExamViewInfo(dataSourceId);
+		//String sql = " select * from v_examination where examId ='"+dataSourceId+"' limit 1;";
+		//Map<String,Object> record = commonDao.queryOne(sql);
+		if (record == null || record.isEmpty()) {
+			return "empt";//未发布考试或者非考试弹窗
+		}
+		String flag ="NotExaminedStatus";//考试已发布但是未考试完成状态
+		// 获取字段
+		Object limitDateObj =record.get("limitDate");
+		String examState = (String) record.get("examState");
+		String paperState = (String) record.get("paperState");
+		// 检查条件
+		if (limitDateObj != null && !limitDateObj.toString().isEmpty() && "已发布".equals(examState) && "已完成".equals(paperState)) {
+			// 获取字段值
+			Object totalScoreObj = record.get("totalScore");
+			Object qualifiedRadioObj = record.get("qualifiedRadio");
+			if (totalScoreObj == null || qualifiedRadioObj == null
+					|| "".equals(totalScoreObj) || "".equals(qualifiedRadioObj)) {
+				// 关键字段缺失,返回未完成状态
+				return "NotExaminedStatus";
+			}
+
+			double totalScore = Double.parseDouble(record.get("totalScore").toString());
+			double qualifiedRadio = Double.parseDouble(record.get("qualifiedRadio").toString());
+			String scoringType = (String) record.get("scoringType");
+			Number curScore = null;
+			if ("平均分".equals(scoringType)) {
+				curScore = (Number) record.get("averageScore");
+			} else if ("最高分".equals(scoringType)) {
+				curScore = (Number) record.get("maxScore");
+			} else if ("最近得分".equals(scoringType)) {
+				curScore = (Number) record.get("recentScore");
+			}
+			if (curScore != null) {
+				double passScore = totalScore * qualifiedRadio / 100.0;
+				return curScore.doubleValue() >= passScore?flag="pass":"failure";//pass 考试已通过
+			}
+		}
+		return flag;
+	}
+
+	public Map<String, String> chargeExamPassingFlag(Map<String, Map<String, Object>> records) {
+		Map<String, String> examStatusMap = new HashMap<>();
+		if (records == null || records.isEmpty()) {
+			return examStatusMap;
+		}
+		for (Map.Entry<String, Map<String, Object>> entry : records.entrySet()) {
+			String examId = entry.getKey();
+			Map<String, Object> record = entry.getValue();
+			// 使用 examId + examinee 作为唯一key
+			//String examinee = record.get("examinee") != null ? record.get("examinee").toString() : "";
+			//String uniqueKey = examId + "_" + examinee;
+			String status = chargeExamPassingStatus(record);
+			examStatusMap.put(examId, status);
+		}
+		return examStatusMap;
+	}
 }