|
|
|
@ -90,11 +90,12 @@ public class CompController extends JeecgController<Comp, ICompService> { |
|
|
|
|
//角色编码 管理员&教务处 可以看到所有,其它用户可见到所属自己数据
|
|
|
|
|
Map<String, String> efficientRoleMap = new LinkedHashMap<>(); |
|
|
|
|
efficientRoleMap.put("admin", "admin"); |
|
|
|
|
/*efficientRoleMap.put("committee", "committee");*/ |
|
|
|
|
efficientRoleMap.put("xs", "xs"); |
|
|
|
|
efficientRoleMap.put("superAdmin", "superAdmin"); |
|
|
|
|
if (efficientRoleMap.containsValue(roleMap.get("admin")) |
|
|
|
|
||efficientRoleMap.containsValue(roleMap.get("committee")) |
|
|
|
|
||efficientRoleMap.containsValue(roleMap.get("superAdmin"))) { |
|
|
|
|
||efficientRoleMap.containsValue(roleMap.get("superAdmin")) |
|
|
|
|
||efficientRoleMap.containsValue(roleMap.get("xs"))) { |
|
|
|
|
} else { |
|
|
|
|
comp.setCompAdmin(loginUser.getUsername()); |
|
|
|
|
} |
|
|
|
@ -195,71 +196,66 @@ public class CompController extends JeecgController<Comp, ICompService> { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*--------------------------王家东添加开始============================*/ |
|
|
|
|
//获取比赛类型comptyp就是类型的分数
|
|
|
|
|
Double comptypeweight = compTypeService.getById(comp.getCompTypeId()).getScore(); |
|
|
|
|
int comptyp = (int) Math.round(comptypeweight); |
|
|
|
|
//开始获取
|
|
|
|
|
/*comp.setCompweight(csort);*/ |
|
|
|
|
List<String> stringNumbers = compTypeService.getALL(); |
|
|
|
|
// 将字符串数字转换为整数并进行排序
|
|
|
|
|
List<Integer> intNumbers = convertAndSort(stringNumbers); |
|
|
|
|
//获取到的上下限
|
|
|
|
|
int result = processInput(intNumbers, comptyp); |
|
|
|
|
//开始获取个数
|
|
|
|
|
int geshu = compTypeService.getgeshu(comp.getCompTypeId()); |
|
|
|
|
|
|
|
|
|
//开始计算中间值
|
|
|
|
|
int b = result / geshu; |
|
|
|
|
//开始获取逆向排名
|
|
|
|
|
int position = findPosition(intNumbers,comptyp); |
|
|
|
|
//计算全职
|
|
|
|
|
int wei = (intNumbers.size()-position +1) * b+comptyp; |
|
|
|
|
comp.setCompweight(wei); |
|
|
|
|
|
|
|
|
|
//开始获取同一类型比赛的个数
|
|
|
|
|
int compcount = compTypeService.getgeshu(comp.getCompTypeId())+1; |
|
|
|
|
//开始获取上下限
|
|
|
|
|
int lowdown = (int) (compTypeService.getById(comp.getCompTypeId()).getScore() - compTypeService.getById(comp.getCompTypeId()).getScorel()); |
|
|
|
|
//开始计算差值
|
|
|
|
|
float b = (float) lowdown / compcount; |
|
|
|
|
//用于查询全部的数据
|
|
|
|
|
List<String> parlint = compService.getallscore(comp.getCompTypeId()); |
|
|
|
|
//开始获取排名的倒叙
|
|
|
|
|
int rank = insertAndRank(parlint, String.valueOf(comp.getCompOrder())); |
|
|
|
|
System.out.println(parlint); |
|
|
|
|
int score = (int) (( rank+1) * b + compTypeService.getById(comp.getCompTypeId()).getScorel()); |
|
|
|
|
comp.setCompweight(score); |
|
|
|
|
|
|
|
|
|
//开始计算同类型其他比赛
|
|
|
|
|
List<Comp> compList = compService.getAllCompByType(comp.getCompTypeId()); |
|
|
|
|
if (compList.size()>0){ |
|
|
|
|
for (int i=0;i<compList.size();i++){ |
|
|
|
|
System.out.println(compList.get(i).getCompOrder()); |
|
|
|
|
int rankold = insertAndRank(parlint, String.valueOf(compList.get(i).getCompOrder())); |
|
|
|
|
int scoreold = (int) (( rankold+1) * b + compTypeService.getById(comp.getCompTypeId()).getScorel()); |
|
|
|
|
compService.updatedate(compList.get(i).getId(),scoreold); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
/*--------------------------王家东添加开始============================*/ |
|
|
|
|
compService.save(comp); |
|
|
|
|
return Result.OK("添加成功!"); |
|
|
|
|
} |
|
|
|
|
private static int findPosition(List<Integer> intList, int inputNumber) { |
|
|
|
|
// 使用二分查找或简单遍历找到输入数字的位置(索引从0开始)
|
|
|
|
|
int position = Collections.binarySearch(intList, inputNumber); |
|
|
|
|
|
|
|
|
|
// 如果binarySearch返回负数,说明输入的数字不在列表中,我们需要找到它应该插入的位置(取反然后减1)
|
|
|
|
|
if (position < 0) { |
|
|
|
|
position = -position - 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 根据位置计算并返回相应的位数
|
|
|
|
|
// 如果最大返回1,最小返回列表长度
|
|
|
|
|
return (position == 0) ? 1 : (intList.size() - position + 1); |
|
|
|
|
} |
|
|
|
|
//这个是获取倒叙的方法
|
|
|
|
|
public static int insertAndRank(List<String> list, String newValue) { |
|
|
|
|
// 插入新值
|
|
|
|
|
list.add(newValue); |
|
|
|
|
|
|
|
|
|
// 排序(如果有需要,这里已经是插入后的状态,但我们为了验证再次排序)
|
|
|
|
|
Collections.sort(list, Collections.reverseOrder()); |
|
|
|
|
|
|
|
|
|
private static List<Integer> convertAndSort(List<String> stringNumbers) { |
|
|
|
|
List<Integer> intNumbers = new ArrayList<>(); |
|
|
|
|
for (String s : stringNumbers) { |
|
|
|
|
intNumbers.add(Integer.parseInt(String.valueOf((int)Double.parseDouble(s)))); |
|
|
|
|
} |
|
|
|
|
Collections.sort(intNumbers, Collections.reverseOrder()); // 从大到小排序
|
|
|
|
|
return intNumbers; |
|
|
|
|
} |
|
|
|
|
// 排名计算
|
|
|
|
|
int rank = 1; |
|
|
|
|
int currentRankCount = 1; |
|
|
|
|
String lastValue = list.get(0); // 获取最大值
|
|
|
|
|
|
|
|
|
|
private static int processInput(List<Integer> intNumbers, int inputNumber) { |
|
|
|
|
// 查找输入的数字在列表中的位置
|
|
|
|
|
int index = intNumbers.indexOf(inputNumber); |
|
|
|
|
if (index != -1) { // 如果找到了
|
|
|
|
|
// 如果是最大的一个数字,用100减去这个数
|
|
|
|
|
if (index == 0) { |
|
|
|
|
return 100 - inputNumber; |
|
|
|
|
for (int i = 1; i <= list.size(); i++) { |
|
|
|
|
if (i < list.size() && list.get(i).equals(lastValue)) { |
|
|
|
|
// 如果当前值与上一个值相同,则增加并列排名计数
|
|
|
|
|
currentRankCount++; |
|
|
|
|
} else { |
|
|
|
|
// 如果不是最大的一个数字,用它前面的那个数字减去这个数
|
|
|
|
|
return intNumbers.get(index - 1) - inputNumber; |
|
|
|
|
// 值改变了,更新排名和当前排名计数
|
|
|
|
|
if (lastValue.equals(newValue)) { |
|
|
|
|
// 如果新值在遍历过程中被找到,则返回其排名
|
|
|
|
|
return rank; |
|
|
|
|
} |
|
|
|
|
rank += currentRankCount; |
|
|
|
|
currentRankCount = 1; |
|
|
|
|
lastValue = i < list.size() ? list.get(i) : null; // 更新为下一个值(如果有的话)
|
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
// 输入的数字不在列表中
|
|
|
|
|
System.out.println("输入的数字不在列表中。"); |
|
|
|
|
return -1; // 或者可以抛出异常
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 理论上不会到达这里,除非列表为空或新值大于列表中所有值
|
|
|
|
|
return rank; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|