package com.engine.forstarsecond.service.impl; import com.engine.core.impl.Service; import com.engine.forstarsecond.entity.ExamineRanking; import com.engine.forstarsecond.entity.FamilyWorkUnit; import com.engine.forstarsecond.service.ExamineRankingService; import lombok.SneakyThrows; import weaver.conn.RecordSet; import weaver.conn.RecordSetDataSource; import weaver.general.Util; import weaver.hrm.resource.ResourceComInfo; import java.util.ArrayList; import java.util.HashMap; 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; } @SneakyThrows @Override public Map resourceImage(String billid) { RecordSet rs = new RecordSet(); Map result = new HashMap<>(); rs.executeQuery("select ryid from uf_hr_employee where id = ?",billid); rs.next(); String ryid = Util.null2String(rs.getString("ryid")); result.put("id",ryid); result.put("url",new ResourceComInfo().getMessagerUrls(ryid)); return result; } @Override public List workUnits() { RecordSetDataSource rst = new weaver.conn.RecordSetDataSource(); List unitList = new ArrayList<>(); rst.executeQueryWithDatasource("select VndName from V_OA_BPVnd","psxt"); while (rst.next()) { unitList.add(Util.null2String(rst.getString("VndName").trim())); } return unitList; } @Override public Map> familyWorkUnit(Map params) { RecordSet rs = new RecordSet(); String type = Util.null2String(params.get("type")); //1 正式员工台账 String tableName = "1".equals(type) ? "uf_jcl_rzgl_dt3" : "uf_jcl_wbrzgl_dt3"; List familyWorkUnits = new ArrayList<>(); rs.executeQuery("select mainid,gzdw from "+tableName); while (rs.next()) { familyWorkUnits.add(FamilyWorkUnit.builder() .id(Util.null2String(rs.getString("mainid"))) .unit(Util.null2String(rs.getString("gzdw"))) .build()); } return familyWorkUnits.stream() .collect(Collectors.groupingBy( FamilyWorkUnit::getId, Collectors.mapping( FamilyWorkUnit::getUnit, Collectors.toList() ) )); } /** * 通用排名计算方法 * @param dataList * @param groupKeyGetter * @param rankFieldSetter */ private void calculateRank( List dataList, Function groupKeyGetter, BiConsumer rankFieldSetter ) { // 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); } }); } }