package com.engine.forstarsecond.service.impl; import com.engine.core.impl.Service; import com.engine.forstarsecond.entity.ExamineRanking; import com.engine.forstarsecond.service.ExamineRankingService; import weaver.conn.RecordSet; import weaver.general.Util; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.function.BiConsumer; import java.util.function.Function; import java.util.stream.Collectors; /** * @Author liang.cheng * @Date 2025/4/27 10:04 * @Description: TODO * @Version 1.0 */ public class ExamineRankingServiceImpl extends Service implements ExamineRankingService { @Override public int examineRanking(Map params) { String type = Util.null2String(params.get("type")); String khqj = Util.null2String(params.get("khqj")); String khnd = Util.null2String(params.get("khnd")); String yglb = Util.null2String(params.get("yglb")); List examineRankings; if ("1".equals(type)) { examineRankings = calculateWorkers(khqj,yglb); }else { examineRankings = calculateWorkersByYear(khnd,yglb); } return examineRankings.size(); } @Override public List calculateWorkers(String khqj,String yglb) { RecordSet rs = new RecordSet(); List examineRankings = new ArrayList<>(); rs.executeQuery("select id,ydzhdf,ssks,bmmc from uf_hr_ydjxkhpj_data where khqj = ? and yglb = ?",khqj,yglb); while (rs.next()) { examineRankings.add(ExamineRanking.builder() .id(Util.getIntValue(rs.getString("id"))) .df(Util.getDoubleValue(rs.getString("ydzhdf"))) .ssks(Util.getIntValue(rs.getString("ssks"))) .bmmc(Util.getIntValue(rs.getString("bmmc"))) .build()); } // 分别处理 ssks → kspm 和 bmmc → bmpm 的排名 calculateRank(examineRankings, ExamineRanking::getSsks, ExamineRanking::setKspm); calculateRank(examineRankings, ExamineRanking::getBmmc, ExamineRanking::setBmpm); examineRankings.forEach(examine -> rs.executeUpdate("update uf_hr_ydjxkhpj_data set bmpm = ?,kspm = ? where id = ?",examine.getBmpm(),examine.getKspm(),examine.getId())); return examineRankings; } @Override public List calculateWorkersByYear(String year,String yglb) { RecordSet rs = new RecordSet(); List examineRankings = new ArrayList<>(); rs.executeQuery("select id,ndzhdf,ssks,bmmc from uf_hr_jxkhndpjb where khnd = ? and yglb = ?",year,yglb); while (rs.next()) { examineRankings.add(ExamineRanking.builder() .id(Util.getIntValue(rs.getString("id"))) .df(Util.getDoubleValue(rs.getString("ndzhdf"))) .ssks(Util.getIntValue(rs.getString("ssks"))) .bmmc(Util.getIntValue(rs.getString("bmmc"))) .build()); } // 分别处理 ssks → kspm 和 bmmc → bmpm 的排名 calculateRank(examineRankings, ExamineRanking::getSsks, ExamineRanking::setKspm); calculateRank(examineRankings, ExamineRanking::getBmmc, ExamineRanking::setBmpm); examineRankings.forEach(examine -> rs.executeUpdate("update uf_hr_jxkhndpjb set bmpm = ?,kspm = ? where id = ?",examine.getBmpm(),examine.getKspm(),examine.getId())); return examineRankings; } /** * 通用排名计算方法 * @param dataList * @param groupKeyGetter * @param rankFieldSetter */ private void calculateRank( List dataList, Function groupKeyGetter, // 分组字段的 Getter BiConsumer rankFieldSetter // 排名结果的 Setter(直接使用 BiConsumer) ) { // 1. 按分组字段(如 ssks 或 bmmc)分组 Map> groupedData = dataList.stream() .collect(Collectors.groupingBy(groupKeyGetter)); // 2. 处理每个分组 groupedData.forEach((groupKey, groupList) -> { // 按 ydzhdf 降序排序 groupList.sort((a, b) -> Double.compare(b.getDf(), a.getDf())); int groupSize = groupList.size(); if (groupSize == 0){ return; } // 动态计算排名 double previousScore = groupList.get(0).getDf(); int currentRank = 1; rankFieldSetter.accept(groupList.get(0), currentRank + "/" + groupSize); for (int i = 1; i < groupSize; i++) { ExamineRanking current = groupList.get(i); if (Math.abs(current.getDf() - previousScore) > 1e-6) { currentRank = i + 1; previousScore = current.getDf(); } rankFieldSetter.accept(current, currentRank + "/" + groupSize); } }); } }