You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
weaver-develop/src/com/engine/forstarsecond/service/impl/ExamineRankingServiceImpl.java

127 lines
4.9 KiB
Java

3 months ago
package com.engine.forstarsecond.service.impl;
import com.engine.core.impl.Service;
import com.engine.forstarsecond.entity.ExamineRanking;
3 months ago
import com.engine.forstarsecond.service.ExamineRankingService;
import weaver.conn.RecordSet;
import weaver.general.Util;
3 months ago
import java.util.ArrayList;
import java.util.List;
3 months ago
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.stream.Collectors;
3 months ago
/**
* @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<String, Object> params) {
3 months ago
String type = Util.null2String(params.get("type"));
String khqj = Util.null2String(params.get("khqj"));
String khnd = Util.null2String(params.get("khnd"));
3 months ago
List<ExamineRanking> examineRankings;
if ("1".equals(type)) {
examineRankings = calculateWorkers(khqj);
}else {
examineRankings = calculateWorkersByYear(khnd);
}
return examineRankings.size();
}
@Override
public List<ExamineRanking> calculateWorkers(String khqj) {
RecordSet rs = new RecordSet();
List<ExamineRanking> examineRankings = new ArrayList<>();
rs.executeQuery("select id,ydzhdf,ssks,bmmc from uf_hr_ydjxkhpj_data where khqj = ?",khqj);
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<ExamineRanking> calculateWorkersByYear(String year) {
RecordSet rs = new RecordSet();
List<ExamineRanking> examineRankings = new ArrayList<>();
rs.executeQuery("select id,ndzhdf,ssks,bmmc from uf_hr_jxkhndpjb where khnd = ?",year);
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<ExamineRanking> dataList,
Function<ExamineRanking, Integer> groupKeyGetter, // 分组字段的 Getter
BiConsumer<ExamineRanking, String> rankFieldSetter // 排名结果的 Setter直接使用 BiConsumer
) {
// 1. 按分组字段(如 ssks 或 bmmc分组
Map<Integer, List<ExamineRanking>> 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);
}
});
3 months ago
}
}